Автор |
Сообщение |
26.10.2006 11:36:35
Тема: Re:Вопросы по C-MPA
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Вот некоторые ошибки:
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
Тема: Re:Вопросы по C-MPA
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Модификаторы __in, __out имеют значение только при автоматическом построении схемы по МПА-программе.
При написании программ для задач на программирование их можно не указывать.
|
07.02.2008 09:30:22
Тема: Re:Вопросы по C-MPA
|
Михаил Долинский
Темы: 2072
Сообщений: 49881
Мой профиль
|
Почему-то возникли проблемы с этим кодом. Не работает сравнение 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
Тема: Re:Вопросы по C-MPA
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Возможно ошибка в этой строчке:
{OUT_0=IN_0+!IN_1;}
Наверное имелось в виду
{OUT_0 = IN_0 + ~IN_1;}
|
15.03.2008 14:56:34
Тема: Re:Вопросы по C-MPA
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Я считаю,что мое решение в 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
Тема: Re:Вопросы по C-MPA
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
При проектировании следует использовать знаковые целочисленные типы только тогда, когда они действительно нужны. В остальных случаях предпочтительно использование беззнаковых типов (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
Тема: Некоторые оптимизации при конвертировании C-MPA -> HLCCAD
|
Александр Моисеенко
Темы: 0
Сообщений: 3
Мой профиль
|
Задача 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
Тема: Re:Вопросы по C-MPA
|
Михаил Долинский
Темы: 2072
Сообщений: 49881
Мой профиль
|
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
Тема: Re:Вопросы по C-MPA
|
Михаил Долинский
Темы: 2072
Сообщений: 49881
Мой профиль
|
Саша Громыко написал
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
Тема: Re:Вопросы по C-MPA
|
Слава Коноплев
Темы: 1
Сообщений: 15
Мой профиль
|
Зачет\Индивидуальные задания\Проектирование цифровых устройств\Вычислить выражение\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
Тема: Re:Вопросы по C-MPA
|
Александр Громыко
Темы: 0
Сообщений: 12
Мой профиль
|
В задаче "Зачет\Контроль практики\Проектирование\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
Тема: Re:Вопросы по C-MPA
|
Александр Гладченко
Темы: 1
Сообщений: 26
Мой профиль
|
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
Тема: Re:Вопросы по C-MPA
|
Слава Коноплев
Темы: 1
Сообщений: 15
Мой профиль
|
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
Тема: Re:Вопросы по C-MPA
|
Александр Гладченко
Темы: 1
Сообщений: 26
Мой профиль
|
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
Тема: Re:Вопросы по C-MPA
|
Михаил Долинский
Темы: 2072
Сообщений: 49881
Мой профиль
|
В последнем случае ошибка известная
На выходной контакт (переменная out_0) значение нужно подавать только один раз. В программе Саши Гладченко это не так, и поэтому на выходе схемы все время появляются разные значения ...
|
|