Автор |
Сообщение |
30.10.2017 09:59:45
Тема: Re:Вопросы по C-MPA
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Михаил Бугаенко:
Индивидуальные задания->проектирование цифровых систем->непростая арифметика->корректное время
Вроде подставляю в винтере все тестовые значения и все нормально работает, результаты правильные, в hlccad валится вроде как самый первый тест, не могу понять проблему, подскажите, пожалуйста
ссылка - http://dl.gsu.by/task.jsp?nid=1676647&cid=1061
Исправлена задержка в тестах.
|
14.09.2018 10:24:19
Тема: Re:Вопросы по C-MPA
|
Никита Коротчиков
Темы: 3
Сообщений: 43
Мой профиль
|
Где-то видел на форуме, что в C-MPA поддерживается директива #define.
Она работает только для определения констант?
Т.е., я не могу написать что-то подобное:
#define max(a, b) (((a) < (b)) ? (a) : (b)) ?
|
14.09.2018 13:20:13
Тема: Re:Вопросы по C-MPA
|
Михаил Долинский
(Online)
Темы: 2072
Сообщений: 49883
Мой профиль
|
А давай ты сначала сам найдёшь то место, где видел.
И если вопрос останется - повторишь.
Михаил Долинский:
1. Микропрограммирование на С-МПА, генерация схем по микропрограммам. Разбор решений контрольной номер 1.
Примеры задач с решениями
Как работать с битами в С(С-МПА) - Антоненко Александр, ПМ-41, 13 февраля 2009
Синтезируемые конструкции С-МПА
Простейшие параллели Паскаль - С
Вопросы и ответы по С-МПА
Компилятор языка CMPDL
Учебник по работе с компилятором CMPDL + WInter
Учебник по построению схем MPA в HLCCAD
|
14.09.2018 13:28:32
Тема: Re:Вопросы по C-MPA
|
Никита Коротчиков
Темы: 3
Сообщений: 43
Мой профиль
|
Михаил Долинский:
А давай ты сначала сам найдёшь то место, где видел.
И если вопрос останется - повторишь.
Михаил Долинский:
1. Микропрограммирование на С-МПА, генерация схем по микропрограммам. Разбор решений контрольной номер 1.
Примеры задач с решениями
Как работать с битами в С(С-МПА) - Антоненко Александр, ПМ-41, 13 февраля 2009
Синтезируемые конструкции С-МПА
Простейшие параллели Паскаль - С
Вопросы и ответы по С-МПА
Компилятор языка CMPDL
Учебник по работе с компилятором CMPDL + WInter
Учебник по построению схем MPA в HLCCAD
Игорь Коршунов:
Демонстрационная программа показывающая конструкции языка С-МПА, которые можно использовать для синтеза HLCCAD-схем:
/*
Особености програмирования на CMPDL:
- для удобства работы контакты лучше объявлять как
глобальные переменные
- программа никогда не завершается
после завершения функция main начинает выполняться сначала
Поэтому неправильно использовать выходной контакт для промежуточных
вычислений
Поддерживается:
- целые знаковые/беззнаковые типы произвольной размерности
- входные/выходные контакты
- арифметические (* / + -)и логические ( & | ^ ~) выражения ~
- операторы:
for
if
while
do .. while
switch
- функции
- директивы препроцессора
#define
#ifdef
#elseif
#endif
int x = -1; // размерность по умолчанию 32 бита
unsigned __bits(8) z = 0x5; // шестнадцатеричная константа
unsigned __bits(8) y = 05; // восьмеричная константа - префикс буква 'O'
// входные контакты
unsigned __in __bits(16) A;
unsigned __in __bits(16) B;
// выходной контакт
unsigned __out __bits(16) O;
// функция
unsigned __bits(16) foo(unsigned __bits(16) p1, unsigned __bits(16) p2)
{
return (p1 + p2) * (p1 + p2);
}
// функция main
void main()
{
// вызов функции
unsigned __bits(16) t = foo(A, B);
unsigned __bits(8) i;
// цикл for
for (i = 0; i < 5; i++)
{
if (i == 3) continue;
t *= A;
if (t > A * 10) break;
}
// цикл do .. while
do
{
t /= 2;
if (t == 3 * A) break;
} while (t > 10);
// цикл while
while(t < 10)
{
t += A - B + 1;
}
unsigned __bits(8) a = (A + B) / 5;
// оператор switch
switch(a)
{
case 0:
t -= 5;
break;
case 1:
t += A * B;
break;
case 2:
t = 100;
default:
t--;
}
// оператор ветвления if else
if (A + B > t && t != 6) t = -t;
else if (A + B == t || t < A) t -= A;
else
{
t &= A | B;
t = ~t;
}
// в конце результат подаем на выходной контакт
O = t;
}
|
14.09.2018 13:33:03
Тема: Re:Вопросы по C-MPA
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Никита Коротчиков:
Где-то видел на форуме, что в C-MPA поддерживается директива #define.
Она работает только для определения констант?
Т.е., я не могу написать что-то подобное:
#define max(a, b) (((a) < (b)) ? (a) : (b)) ?
Так нельзя.
|
22.09.2018 12:57:05
Тема: Re:Вопросы по C-MPA
|
Никита Коротчиков
Темы: 3
Сообщений: 43
Мой профиль
|
unsigned __in __bits(8) In = 143;
unsigned __out __bits(4) Out;
void main() {
unsigned __bits(8) n = In;
unsigned __bits(4) k = 0;
unsigned __bits(4) t = 0;
for (unsigned __bits(4) i = 0; i < 8; i++) {
if (i % 2 == 0 && (1 & (n >> i))) {
k |= 1 << t; // здесь
t++;
}
}
Out = k;
}
Вылетает exception EAccessViolation in module MPA.dll at 000259B0. Access violation at address 064C59B0 in module 'MPA.dll'. Read of address 065EFFFF.
UPDATE: скачал отсюда http://dl.gsu.by/NForum/posts/topicshow/1298.dl?&page=1 - код заработал
|
06.10.2018 19:37:40
Тема: Re:Вопросы по C-MPA
|
Александр Ковальчук
Темы: 0
Сообщений: 19
Мой профиль
|
Странная вещь.
http://dl.gsu.by/task.jsp?nid=1759006&cid=1099
Экзамен\Индивидуальные задания\Сконвертированные задания на программирование по схеме\Логические элементы\4 - "Программа по схеме 84266"
Ломается при отправке на втором тесте. Хотя локально правильно выполняются все тесты.
unsigned __in __bits(8) A;
unsigned __in __bits(8) B;
unsigned __out __bits(8) C;
void main()
{
C |= ((A >> 0) ^ (B >> 0)) << 0;
C |= ((A >> 1) ^ (B >> 1)) << 1;
C |= ((A >> 2) ^ (B >> 2)) << 2;
C |= ((A >> 3) ^ (B >> 3)) << 3;
C |= ((A >> 4) ^ (B >> 4)) << 4;
C |= ((A >> 5) ^ (B >> 5)) << 5;
C |= ((A >> 6) ^ (B >> 6)) << 6;
C |= ((A >> 7) ^ (B >> 7)) << 7;
}
|
06.10.2018 23:09:08
Тема: Re:Вопросы по C-MPA
|
Никита Коротчиков
Темы: 3
Сообщений: 43
Мой профиль
|
Александр Ковальчук:
Странная вещь.
http://dl.gsu.by/task.jsp?nid=1759006&cid=1099
Экзамен\Индивидуальные задания\Сконвертированные задания на программирование по схеме\Логические элементы\4 - "Программа по схеме 84266"
Ломается при отправке на втором тесте. Хотя локально правильно выполняются все тесты.
unsigned __in __bits(8) A;
unsigned __in __bits(8) B;
unsigned __out __bits(8) C;
void main()
{
C |= ((A >> 0) ^ (B >> 0)) << 0;
C |= ((A >> 1) ^ (B >> 1)) << 1;
C |= ((A >> 2) ^ (B >> 2)) << 2;
C |= ((A >> 3) ^ (B >> 3)) << 3;
C |= ((A >> 4) ^ (B >> 4)) << 4;
C |= ((A >> 5) ^ (B >> 5)) << 5;
C |= ((A >> 6) ^ (B >> 6)) << 6;
C |= ((A >> 7) ^ (B >> 7)) << 7;
}
Нельзя out контакт изменять больше одного раза. Т. е., нужно заводить отдельную переменную, где делать все вычисления, а в конце заносить в out.
unsigned __in __bits(8) A;
unsigned __in __bits(8) B;
unsigned __out __bits(8) C;
void main() {
unsigned __bits(8) a = A;
unsigned __bits(8) b = B;
unsigned __bits(8) c = 0;
c |= ((a >> 0) ^ (b >> 0)) << 0;
c |= ((a >> 1) ^ (b >> 1)) << 1;
c |= ((a >> 2) ^ (b >> 2)) << 2;
c |= ((a >> 3) ^ (b >> 3)) << 3;
c |= ((a >> 4) ^ (b >> 4)) << 4;
c |= ((a >> 5) ^ (b >> 5)) << 5;
c |= ((a >> 6) ^ (b >> 6)) << 6;
c |= ((a >> 7) ^ (b >> 7)) << 7;
C = c;
}
И лучше заносить все in-ы в локальные переменные.
|
11.10.2018 22:10:51
Тема: Re:Вопросы по C-MPA
|
Александр Ковальчук
Темы: 0
Сообщений: 19
Мой профиль
|
Никита Коротчиков:
Нельзя out контакт изменять больше одного раза. Т. е., нужно заводить отдельную переменную, где делать все вычисления, а в конце заносить в out.
И лучше заносить все in-ы в локальные переменные.
Я понял, спасибо. А есть ещё что-то странное с извлечением значений битов из чисел.
Экзамен\Индивидуальные задания\Сконвертированные задания на программирование\Логические элементы\6 - "Ключи и ящики"
http://dl.gsu.by/task.jsp?nid=1759783&cid=1099
В этой задаче при получении битов из первого и второго числа в цикле, когда i = 2, In0 >> 2 должно равняться 1 и In1 >> 2 должно равняться тоже 1. При отладке выяснилось, что In0 >> 2 равно 1, но In1 >> 2 равно 0. Хотя в этой позиции в двух числах одинаковые значения битов и равны единице.
unsigned __in __bits(8) in_0 = 11100100;
unsigned __in __bits(8) in_1 = 00000100;
unsigned __out __bits(1) out_0;
void main()
{
unsigned __bits(8) In0 = in_0;
unsigned __bits(8) In1 = in_1;
unsigned __bits(1) f = 0;
unsigned __bits(1) a;
unsigned __bits(1) b;
for(int i = 0; i < 8; i++) {
a = (In0 >> i);
b = (In1 >> i);
if (a == b & a == 1) {
f = 1;
break;
}
}
out_0 = f;
}
|
12.10.2018 08:39:38
Тема: Re:Вопросы по C-MPA
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Александр Ковальчук:
В этой задаче при получении битов из первого и второго числа в цикле, когда i = 2, In0 >> 2 должно равняться 1 и In1 >> 2 должно равняться тоже 1. При отладке выяснилось, что In0 >> 2 равно 1, но In1 >> 2 равно 0. Хотя в этой позиции в двух числах одинаковые значения битов и равны единице.
unsigned __in __bits(8) in_0 = 11100100;
unsigned __in __bits(8) in_1 = 00000100;
unsigned __out __bits(1) out_0;
void main()
{
unsigned __bits(8) In0 = in_0;
unsigned __bits(8) In1 = in_1;
unsigned __bits(1) f = 0;
unsigned __bits(1) a;
unsigned __bits(1) b;
for(int i = 0; i < 8; i++) {
a = (In0 >> i);
b = (In1 >> i);
if (a == b & a == 1) {
f = 1;
break;
}
}
out_0 = f;
}
В Си если число начинается на ноль, то оно записано в 8-ричной системе, т.е. в твоем примере in_1 = 64 и в нем нет 1 во втором бите. В отладчике можно посмотреть чему равняются значения переменных.
in_0 = 11100100;
Компилятор Си воспринимает это число как десятичное.
В Си нет возможности записать число в двоичной системе. В таких случаях используют 16-ричную систему, т.к. легко перевести в двоичную и обратно.
in_0 = 0xE4;
|
20.10.2018 13:57:00
Тема: Re:Вопросы по C-MPA
|
Сергей Щукин
Темы: 0
Сообщений: 7
Мой профиль
|
http://dl.gsu.by/task.jsp?nid=1768088&cid=1099
Не проходит тесты, если переменные объявлять как int, нужно писать unsigned.
|
20.10.2018 14:30:25
Тема: Re:Вопросы по C-MPA
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Условие:
На входе - IN дано 6-и разрядное число. Определить делится ли это число на 2,3,4,5. Если делится, то на соответствующий выход подавать 1, иначе - 0.
Решение:
int __in __bits(6) IN;
int __out __bits(1) TWO;
int __out __bits(1) THREE;
int __out __bits(1) FOUR;
int __out __bits(1) FIVE;
void main() {
int __bits(6) k = IN;
if(k % 2 == 0) {
TWO = 1;
} else {
TWO = 0;
}
if(k % 3 == 0) {
THREE = 1;
} else {
THREE = 0;
}
if(k % 4 == 0) {
FOUR = 1;
} else {
FOUR = 0;
}
if(k % 5 == 0) {
FIVE = 1;
} else {
FIVE = 0;
}
}
Сергей Щукин:
http://dl.gsu.by/task.jsp?nid=1768088&cid=1099
Не проходит тесты, если переменные объявлять как int, нужно писать unsigned.
|
27.10.2018 10:28:49
Тема: Re:Вопросы по C-MPA
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Для тех у кого проблемы с отображением русских букв можно включить в WInter поддержку английского языка. Для этого нужно скачать файл языка: English.lng (ссылка работает только из сети ГГУ) и скопировать его в папку \WINTER\bin\Languages\.
Или можно попробовать настроить отображение русского языка в ОС. Пример как это сделать в Windows 10:
1. Откройте панель управления, для этого можно начать набирать "Панель управления" или "Control Panel" в поиске на панели задач.
2. Убедитесь, что в поле "Просмотр" (View by) установлено "Значки" (Icons) и выберите пункт "Региональные стандарты" (Region).
3. На вкладке "Дополнительно" (Administrative) в разделе "Язык программ, не поддерживающих Юникод" (Language for non-Unicode programs) нажмите по кнопке "Изменить язык системы" (Change system locale).
4. Выберите русский язык, нажмите "Ок" и подтвердите перезагрузку компьютера.
|
09.11.2018 22:05:09
Тема: Re:Вопросы по C-MPA
|
Александр Ковальчук
Темы: 0
Сообщений: 19
Мой профиль
|
Экзамен\Индивидуальные задания\Сконвертированные задания на программирование\Простые устройства с памятью\2 - "Арифметика"
http://dl.gsu.by/task.jsp?nid=1760013&cid=1099
На сервере не проходит тест 7, хотя у меня локально проходит все тесты и вовремя. Что бы это могло быть?
int __in __bits(2) A;
int __in __bits(2) B;
int __in __bits(2) C;
int __out __bits(8) RES;
int __bits(8) k;
void main() {
unsigned __bits(2) mya = A;
unsigned __bits(2) myb = B;
unsigned __bits(2) myc = C;
if (mya * myb < myc + 1) {
k = 0;
} else if (mya * myb > myc + 1) {
k = mya * myb - myc;
}
RES = k;
}
|
10.11.2018 08:07:25
Тема: Re:Вопросы по C-MPA
|
Михаил Долинский
(Online)
Темы: 2072
Сообщений: 49883
Мой профиль
|
А ты всё по пунктам проверил здесь
В том числе:
"Решение проходит в отладчике, но не проходит тестирование":
Возьмите с DL и подключите тесты!
Скорей всего, Вы совершили одну из следующих ошибок:
1. НЕсоответствие названия выходной переменной условию задачи.
2. НЕсоответствие размерности элементов массива условиям задачи.
http://dl.gsu.by/NForum/posts/topicshow/46.dl?postid=44129#44129
http://dl.gsu.by/NForum/posts/topicshow/46.dl?postid=45926#45926
3. Неверный тип переменных (использовался int вместо unsigned)
http://dl.gsu.by/NForum/posts/topicshow/1792.dl?postid=46192#46192
4. Неинициализированная переменная
http://dl.gsu.by/NForum/posts/topicshow/46.dl?postid=55874#55874
"Решение проходит в Winter-е, но не проходит в HLCCAD":
1. Возьмите тесты из HLCCAD и подключите в Winter - прогоните программу на них.
2. Подключите тесты к сгенерированному проекту в HLCCAD - прогоните схему на них
Это позволит Вам диагностировать ситуацию:
Перечень возможных причин ситуации
1. Время, установленное в тесте для HLCCAD, недостаточно для выполнения Вашей микропрограммы.
- по истории изменения значений во время моделирования можно установить, в какое время на выходах Вашей схемы появляются правильные значения. И сравнить его со временем контроля этих же значений в тесте.
Если возможно оптимизировать программу, сделайте это
http://dl.gsu.by/NForum/posts/topicshow/46.dl?postid=46215#46215
Если Вы считаете невозможным написать программу, работающую быстрее - сообщите нам
(в теме "Ошибка в установке задачи - 201х")
или Вам подскажут как это сделать
или время на тест будет увеличено
2. В программе используются не синтезируемые (на текущий момент) конструкции:
- массивы
об этом выдается ПРЕДУПРЕЖДЕНИЕ во время синтеза - будьте внимательны!
Синтезируемые конструкции
3. В программе используются конструкции, которые требуют для обработки (генерации схемы) существенно больше времени, чем СЕЙЧАС отводится:
- сдвиг на переменное число разрядов
такие ситуации описываются в форуме, возможно в скором будущем они также будут протоколироваться во время синтеза
http://dl/NForum/posts/topicshow/46.dl?postid=3761#3761
4. Неоднократное занесение значений на выходные контакты. Изменение значений на входных контактах.
http://dl/NForum/posts/topicshow/46.dl?postid=224#224
http://dl/NForum/posts/topicshow/46.dl?postid=1937#1937
http://dl/NForum/posts/topicshow/46.dl?postid=3550#3550
http://dl/NForum/posts/topicshow/46.dl?postid=34228#34228
http://dl/NForum/posts/topicshow/46.dl?postid=44944#44944
http://dl/NForum/posts/topicshow/46.dl?postid=77048#77048
5. Асинхронная работа с входными контактами
http://dl/NForum/posts/topicshow/46.dl?postid=3646#3646
6. Ошибка в тестах
- если Вы это обнаружите и докажете, мы исправим
7. Ошибка в Вашей программе
Да, бывает и такое
Пользуйтесь отладчиком и режимами автоматического прогона ВСЕХ тестов!
|
|