Author |
Message |
26.10.2006 11:36:35
Subject: Re:Вопросы по C-MPA
|
Igor Korshunov
Topics: 7
Messages: 2186
My Profile
|
Вот некоторые ошибки:
unsigned char t[12]=''; - строковой литерал должен быть заключен в двойные кавычки, т.е. правильно так:
unsigned char t[12]="";
t += in1[2]; - нельзя присваивать массиву, правильно так:
t[i] = in1[2];
for (i;i<11,in1[i]!='#',in2[i]!='#';i++) - пропущена инициализация, в условии продолжения цикла скорее всего ошибка, т.к. все три условия вычисляются, но в итоге используется только результат третьего сравнения. Прочитайте о том, как работает оператор ','.
|
06.04.2007 18:15:24
Subject: Re:Вопросы по C-MPA
|
Igor Korshunov
Topics: 7
Messages: 2186
My Profile
|
Модификаторы __in, __out имеют значение только при автоматическом построении схемы по МПА-программе.
При написании программ для задач на программирование их можно не указывать.
|
07.02.2008 09:30:22
Subject: Re:Вопросы по C-MPA
|
Mihail Dolinskiy
Topics: 1985
Messages: 47294
My Profile
|
Почему-то возникли проблемы с этим кодом. Не работает сравнение IN_0<IN_1. В IN_0 значение F4, а в IN_1 02.
int __in __bits(8) IN_0;
int __in __bits(8) IN_1;
int __out __bits(9) OUT_0;
void main()
{
if (IN_0==IN_1)
{OUT_0=IN_0+IN_1+1;}
else
{if (IN_0<IN_1)
{OUT_0=IN_0+!IN_1;}
else {OUT_0=!IN_0+IN_1;}
}
}
|
15.02.2008 08:59:31
Subject: Re:Вопросы по C-MPA
|
Igor Korshunov
Topics: 7
Messages: 2186
My Profile
|
Возможно ошибка в этой строчке:
{OUT_0=IN_0+!IN_1;}
Наверное имелось в виду
{OUT_0 = IN_0 + ~IN_1;}
|
15.03.2008 14:56:34
Subject: Re:Вопросы по C-MPA
|
Igor Korshunov
Topics: 7
Messages: 2186
My Profile
|
Я считаю,что мое решение в Winter правильное,а в HLCCAD оно не проходит все
тесты
unsigned __in __bits(2) IN_0;
unsigned __in __bits(2) IN_1;
unsigned __out __bits(5) OUT_0;
void main()
{
OUT_0=1;
if (IN_1==0) OUT_0=1;
else
{
for (int i=1;i<(IN_1+1);i++)
OUT_0=OUT_0*IN_0;
}
}
Нелья сохранять промежуточный результаты в выходную переменную (OUT_0), т.к. это приводит к тому, что на выходе устройства значение постоянно изменяется. Соответсвенно устройство функционирует неверно - поэтому в HLCCAD тесты не проходят.
|
27.03.2008 10:54:51
Subject: Re:Вопросы по C-MPA
|
Igor Korshunov
Topics: 7
Messages: 2186
My Profile
|
При проектировании следует использовать знаковые целочисленные типы только тогда, когда они действительно нужны. В остальных случаях предпочтительно использование беззнаковых типов (unsigned перед названием типа).
Пример неправильного использования знаковых типов:
int __in __bits(1) in_2;
int __in __bits(1) in_1;
int __in __bits(1) in_0;
int __out __bits(1) out_3;
int __out __bits(1) out_2;
int __out __bits(1) out_1;
int __out __bits(1) out_0;
|
19.04.2008 11:43:55
Subject: Некоторые оптимизации при конвертировании C-MPA -> HLCCAD
|
Aleksandr Moiseenko
Topics: 0
Messages: 3
My Profile
|
Задача http://dl/task.jsp?nid=197493&cid=549
Решение, prd файл которого не успевает скомпилироваться и занимает ~300kb (Ошибка: "Чекер снят по абсолютному времени (>127 sec)" DelTA3 at Nit3):
unsigned __in __bits(1) x1;
unsigned __in __bits(1) x2;
unsigned __in __bits(1) x3;
unsigned __in __bits(1) x4;
unsigned __out __bits(1) y1;
unsigned __out __bits(1) y2;
unsigned __out __bits(1) y3;
unsigned __out __bits(1) y4;
int p = 0;
void main() {
p = x1;
p = (p<<1) + x2;
p = (p<<1) + x3;
p = (p<<1) + x4;
if (p == 0) p = 0;
if (p == 1) p = 10;
if (p == 2) p = 1;
if (p == 3) p = 11;
if (p == 4) p = 3;
if (p == 5) p = 1;
if (p == 6) p = 8;
if (p == 7) p = 10;
if (p == 8) p = 3;
if (p == 9) p = 11;
if (p == 10) p = 1;
if (p == 11) p = 8;
if (p == 12) p = 2;
if (p == 13) p = 1;
if (p == 14) p = 10;
if (p == 15) p = 8;
y4 = p%2; p = p>>1;
y3 = p%2; p = p>>1;
y2 = p%2; p = p>>1;
y1 = p%2;
}
А теперь решение, которое проходит и prd весит всего лишь 100kb:
unsigned __in __bits(1) x1;
unsigned __in __bits(1) x2;
unsigned __in __bits(1) x3;
unsigned __in __bits(1) x4;
unsigned __out __bits(1) y1;
unsigned __out __bits(1) y2;
unsigned __out __bits(1) y3;
unsigned __out __bits(1) y4;
int p = 0;
void main() {
p = x1;
p = (p<<1) + x2;
p = (p<<1) + x3;
p = (p<<1) + x4;
switch (p) {
case 0: p = 0; break;
case 1: p = 10; break;
case 2: p = 1; break;
case 3: p = 11; break;
case 4: p = 3; break;
case 5: p = 1; break;
case 6: p = 8; break;
case 7: p = 10; break;
case 8: p = 3; break;
case 9: p = 11; break;
case 10: p = 1; break;
case 11: p = 8; break;
case 12: p = 2; break;
case 13: p = 1; break;
case 14: p = 10; break;
case 15: p = 8; break;
};
y4 = p; p >>= 1;
y3 = p; p >>= 1;
y2 = p; p >>= 1;
y1 = p;
}
Различие в том, что следует:
1. Если есть множество if-ов объединять их по возможности в единый switch;
2. Если нужен сдвиг на константу, то помнить, что p = p>>1, порождает больше кода для HLCCAD, т.к. требуется сделать сдвиг p>>1, а затем присвоение результата снова p. Поэтому нужно писать p >>= 1, эта операция производит просто сдвиг, без дополнительного присваивания;
3. Если нужно получить последний бит числа, то писать y4 = p, где y4 - однобитовая переменная, а p - многобитная, но не писать y4 = p%2;
4. Отказаться вообще от p%2, лучше писать (p & 1), т.к. эта операция порождает более компактное выходное устройство;
5. Помнить о приоритете операции >> и <<, т.к. можно ошибиться и написать p = p<<1 + x, а на самом деле оно означает p = p<<(1+x), т.к. приоритет '+' выше. В следствии этого можно "убить много времени" на поиск, почему программа не проходит по времени. Результатом тайм лимита на самом деле будет то, что сдвиг на переменную "очень дорогая операция" для генератора. Лучше сдвиг на константу всегда брать в скобки, т.е. писать p = (p<<1) + x.
|
06.02.2009 11:14:52
Subject: Re:Вопросы по C-MPA
|
Mihail Dolinskiy
Topics: 1985
Messages: 47294
My Profile
|
unsigned __in __bits(8) in_0;
unsigned __in __bits(8) in_1;
unsigned __out __bits(9) out_0;
void main() {
if (in_0 == in_1)
out_0=1+2*in_0;
else
if (in_0>in_1) out_0=in_1+(~in_0);
else out_0=in_0+(~in_1);
} Катя Калачева написала такое решение задачи 8. Антисумматор.
Нам показалось, что программа симулируется с ошибкой - обнуляется In_1 перед первым else
|
06.02.2009 11:15:48
Subject: Re:Вопросы по C-MPA
|
Mihail Dolinskiy
Topics: 1985
Messages: 47294
My Profile
|
Саша Громыко написал
unsigned __in __bits(1) x1;
unsigned __in __bits(1) x2;
unsigned __in __bits(1) x3;
unsigned __in __bits(1) x4;
unsigned __out __bits(1) y1;
unsigned __out __bits(1) y2;
unsigned __out __bits(1) y3;
unsigned __out __bits(1) y4;
void main() {
if (x1 == 0 && x2 == 0 && x3 == 0 && x4 == 0) { y1 = 0; y2 = 0; y3 = 0; y4 = 1; }
else if (x1 == 0 && x2 == 0 && x3 == 0 && x4 == 1) { y1 = 0; y2 = 0; y3 = 1; y4 = 0; }
else if (x1 == 0 && x2 == 0 && x3 == 1 && x4 == 0) { y1 = 0; y2 = 0; y3 = 1; y4 = 1; }
else if (x1 == 0 && x2 == 0 && x3 == 1 && x4 == 1) { y1 = 0; y2 = 1; y3 = 0; y4 = 0; }
else if (x1 == 0 && x2 == 1 && x3 == 0 && x4 == 0) { y1 = 0; y2 = 1; y3 = 0; y4 = 1; }
else if (x1 == 0 && x2 == 1 && x3 == 0 && x4 == 1) { y1 = 0; y2 = 1; y3 = 1; y4 = 0; }
else if (x1 == 0 && x2 == 1 && x3 == 1 && x4 == 0) { y1 = 0; y2 = 1; y3 = 1; y4 = 1; }
else if (x1 == 0 && x2 == 1 && x3 == 1 && x4 == 1) { y1 = 1; y2 = 0; y3 = 0; y4 = 0; }
else if (x1 == 1 && x2 == 0 && x3 == 0 && x4 == 0) { y1 = 1; y2 = 0; y3 = 0; y4 = 1; }
else if (x1 == 1 && x2 == 0 && x3 == 0 && x4 == 1) { y1 = 1; y2 = 0; y3 = 1; y4 = 0; }
else if (x1 == 1 && x2 == 0 && x3 == 1 && x4 == 0) { y1 = 1; y2 = 0; y3 = 1; y4 = 1; }
else if (x1 == 1 && x2 == 0 && x3 == 1 && x4 == 1) { y1 = 1; y2 = 1; y3 = 0; y4 = 0; }
else if (x1 == 1 && x2 == 1 && x3 == 0 && x4 == 0) { y1 = 1; y2 = 1; y3 = 0; y4 = 1; }
else if (x1 == 1 && x2 == 1 && x3 == 0 && x4 == 1) { y1 = 1; y2 = 1; y3 = 1; y4 = 0; }
else if (x1 == 1 && x2 == 1 && x3 == 1 && x4 == 0) { y1 = 1; y2 = 1; y3 = 1; y4 = 1; }
else if (x1 == 1 && x2 == 1 && x3 == 1 && x4 == 1) { y1 = 0; y2 = 0; y3 = 0; y4 = 0; }
}
При переводе такого решения в схему мне выдается запись в протоколе:
6.2 10:03 2. Котенок 0 / 100 Чекер снят по времени (>117 sec) Arifm2.prd DelTA3 at Nit3 HLCCAD project
На мой взгляд, такое решение по времени сниматься не может.
|
06.02.2009 11:22:43
Subject: Re:Вопросы по C-MPA
|
Slava Konoplev
Topics: 1
Messages: 15
My Profile
|
Зачет\Индивидуальные задания\Проектирование цифровых устройств\Вычислить выражение\6 - "Инкрементор на 3" 41247 Ходорич Дмитрий, ПОИТ-36, апрель 2006 Баллов: 300
В винтере все тесты проходят.
В HLCCAD'e проверить не смог. В половине случаев просто Программа не отвечает, в другой половине значения на выходе отличались от правильного ответа.
При проверке выдается ошибка.
unsigned __in __bits(4) IN_1;
unsigned __out __bits(4) OUT_1;
void main()
{
OUT_1 = IN_1+3;
}
Ошибка: Несовпадение OUT_1:0000=0011 [11 ps]
|
06.02.2009 12:00:43
Subject: Re:Вопросы по C-MPA
|
Aleksandr Gromyko
Topics: 0
Messages: 12
My Profile
|
В задаче "Зачет\Контроль практики\Проектирование\1\10 - "Сдвиг" 42659" я нашел странности.
Вот код который прошел при решении задачи:
unsigned __in __bits(8) A;
unsigned __in __bits(4) Y;
unsigned __out __bits(8) B;
void main() {
unsigned __bits(32) a1 = A;
unsigned __bits(32) a2 = A;
if ((Y & 1) == 1) {
B = a1 >> 1;
} else if ((Y & 2) == 2) {
B = a1 << 1;
} else if ((Y & 4) == 4) {
a2 <<= 7;
B = a2 | (a1 >> 1);
} else if ((Y & 8) == 8) {
a2 >>= 7;
B = a2 | (a1 << 1);
} else {
B = A;
}
}
Этот код был изначально(он не проходил):
unsigned __in __bits(8) A;
unsigned __in __bits(4) Y;
unsigned __out __bits(8) B;
void main() {
unsigned __bits(8) a1 = A;
unsigned __bits(8) a2 = A;
if ((Y & 1) == 1) {
B = a1 >> 1;
} else if ((Y & 2) == 2) {
B = a1 << 1;
} else if ((Y & 4) == 4) {
a2 <<= 7;
B = a2 | (a1 >> 1);
} else if ((Y & 8) == 8) {
a2 >>= 7;
B = a2 | (a1 << 1);
} else {
B = A;
}
}
Разницы заключается в том, что в первом коде объявил переменные по 32 бита unsigned __bits(32) a1 = A;
unsigned __bits(32) a2 = A;
, а во втором коде переменные были объявлены по 8 бит unsigned __bits(8) a1 = A;
unsigned __bits(8) a2 = A;
С идеологической точки зрения я не вижу тут ошибки все должно работать.
|
06.02.2009 13:02:29
Subject: Re:Вопросы по C-MPA
|
Aleksandr Gladchenko
Topics: 1
Messages: 26
My Profile
|
unsigned __in __bits(8) a;
unsigned __in __bits(8) b;
unsigned __in __bits(8) c;
unsigned __in __bits(8) d;
unsigned __out __bits(16) z;
unsigned __out __bits(8) s;
void main()
{
unsigned __bits(8) min=65535;
unsigned __bits(8) max=0;
unsigned __bits(8) a1=a;
unsigned __bits(8) b1=b;
unsigned __bits(8) c1=c;
unsigned __bits(8) d1=d;
unsigned __bits(8) n=0;
if (min>a1) min=a1; if (max<a1) max=a1;
if (min>b1) min=b1; if (max<b1) max=b1;
if (min>c1) min=c1; if (max<c1) max=c1;
if (min>d1) min=d1; if (max<d1) max=d1;
if (min==a1 && n==0) {a1=0; n=1;}
if (min==b1 && n==0) {b1=0; n=1;}
if (min==c1 && n==0) {c1=0; n=1;}
if (min==d1 && n==0) {d1=0; n=1;}
n=0;
if (max==a1 && n==0) {a1=0; n=1;}
if (max==b1 && n==0) {b1=0; n=1;}
if (max==c1 && n==0) {c1=0; n=1;}
if (max==d1 && n==0) {d1=0; n=1;}
z=min*max; s=a1+b1+c1+d1;
}
Написал слегка страшненький код но все же, он в винтере работает а при переходе в ХЛСКАД не работает.
Задача номер 56926
|
06.02.2009 13:07:35
Subject: Re:Вопросы по C-MPA
|
Slava Konoplev
Topics: 1
Messages: 15
My Profile
|
unsigned __bits(5) t;
unsigned __bits(3) c1=3;
...
void main()
{unsigned __bits(3) c2=3;
....
}
В винтере в списке переменных будут видны только t и с1. c2 не видно. При добавлении вручную окошко с переменной отображается, но изменение переменной там не отражаются. Также при наведении мышкой на переменную в процессе работы программы на с2 пишет неизвестный идентификатор. При переносе описания из функции в описание глобальных переменных, все становится нормально
|
06.02.2009 13:15:55
Subject: Re:Вопросы по C-MPA
|
Aleksandr Gladchenko
Topics: 1
Messages: 26
My Profile
|
unsigned __in __bits(8) in_0;
unsigned __in __bits(8) in_1;
unsigned __out __bits(8) out_0;
void main()
{
unsigned __bits(4) i=0;
unsigned __bits(1) x1=0;
unsigned __bits(1) x2=0;
out_0=0;
for(i=0;i<8;i++)
{
x1=in_0>>i; x2=in_1>>i;
if(x1==1 && x2==1) out_0++;
}
}
этот чудо-код проходит все тесты в винтере на задаче номер 39263.
в ХЛСКАДе естессно не работает)
|
07.02.2009 08:54:03
Subject: Re:Вопросы по C-MPA
|
Mihail Dolinskiy
Topics: 1985
Messages: 47294
My Profile
|
В последнем случае ошибка известная
На выходной контакт (переменная out_0) значение нужно подавать только один раз. В программе Саши Гладченко это не так, и поэтому на выходе схемы все время появляются разные значения ...
|
|