Автор |
Сообщение |
21.02.2013 20:29:48
Тема: Re:Вопросы по C-MPA
|
Илья Щурок
Темы: 1
Сообщений: 66
Мой профиль
|
Арифметические операторы:
...
? (оператор выбора)
...
Синтаксис и назначение перечисленных операторов полностью аналогичен языку Си.
Хотелось бы узнать свою ошибку...
Допустим, задача http://dl.gsu.by/task.jsp?nid=1111727&cid=860.
Моё первое решение выглядело, как
unsigned __in __bits(4) X;
unsigned __out __bits(4) Y;
void main(){
int k = 0;
k = (X&1)?1:0 + (X&2)?1:0 + (X&4)?1:0 + (X&8)?1:0;
switch(k){
case 0 : Y = 0; break;
case 1 : Y = 1; break;
case 2 : Y = 3; break;
case 3 : Y = 7; break;
case 4 : Y = 15; break;
}
}
Оно не проходило никакие тесты и не лезло ни в какие рамки при ручной проверке сгенерированного .prd
Потом, подумав, я исправился на
unsigned __in __bits(4) X;
unsigned __out __bits(4) Y;
void main(){
int k = 0;
if (X&1) k++;
if (X&2) k++;
if (X&4) k++;
if (X&8) k++;
switch(k){
case 0 : Y = 0; break;
case 1 : Y = 1; break;
case 2 : Y = 3; break;
case 3 : Y = 7; break;
case 4 : Y = 15; break;
}
}
И это решение прошло все тесты!
Объясните, пожалуйста, в чём состоит моя ошибка использования оператора "?"
______________________
Жизнь - забытые следы чьей-то Глубины...
|
21.02.2013 20:31:43
Тема: Re:Вопросы по C-MPA
|
Василий Писпанен
Темы: 0
Сообщений: 76
Мой профиль
|
задача из среза
http://dl.gsu.by/task.jsp?nid=1111814&cid=860
решение
int mas[10];
int __in __bits(8) n;
int res[10];
void main(){
int __bits(16) i=0;
int __bits(16) k = 0;
for (; i<n; i++) {
if (mas[i]%3 == 0) {
res[k]=mas[i];
k++;
}
}
if (k == 0){
i=0;
for (; i<n; i++) {
res[i]=0;
}
}
} не проходит первый же тест, хотя в отладчике всё ок
|
22.02.2013 10:49:06
Тема: Re:Вопросы по C-MPA
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Михаил Долинский:
19.02.2013 20:53:16 19.02.2013 20:53:20 Поздняков Александр Архитектура вычислительных систем (М3/ПМ4) - 2013 1. Количество цифр 0 Внутренняя ошибка WChecker: не удается открыть report.txt 1.mpc DelTA3 at DLServer
19.02.2013 20:52:56 19.02.2013 20:52:58 Поздняков Александр Архитектура вычислительных систем (М3/ПМ4) - 2013 1. Количество цифр 0 Внутренняя ошибка WChecker: не удается открыть report.txt 1.mpc DelTA3 at DLServer
char __bits(100) in_str[100];
unsigned __out __bits(8) res;
void main(){
int i = 0;
int sum = 0;
char symbol = in_str[i];
while(symbol != '*'){
if(symbol > '0' && symbol < '9'){
sum++;
}
i++;
symbol = in_str[i];
}
res = sum;
} Это нехорошо, и я попросил Игоря Викторовича разобраться.
Неправильно объявлена строка.
Нужно char in_str[100];
|
22.02.2013 10:58:08
Тема: Re:Вопросы по C-MPA
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Илья Щурок:
Арифметические операторы:
...
? (оператор выбора)
...
Синтаксис и назначение перечисленных операторов полностью аналогичен языку Си.
Хотелось бы узнать свою ошибку...
Допустим, задача http://dl.gsu.by/task.jsp?nid=1111727&cid=860.
Моё первое решение выглядело, как
unsigned __in __bits(4) X;
unsigned __out __bits(4) Y;
void main(){
int k = 0;
k = (X&1)?1:0 + (X&2)?1:0 + (X&4)?1:0 + (X&8)?1:0;
switch(k){
case 0 : Y = 0; break;
case 1 : Y = 1; break;
case 2 : Y = 3; break;
case 3 : Y = 7; break;
case 4 : Y = 15; break;
}
}
Оно не проходило никакие тесты и не лезло ни в какие рамки при ручной проверке сгенерированного .prd
Потом, подумав, я исправился на
unsigned __in __bits(4) X;
unsigned __out __bits(4) Y;
void main(){
int k = 0;
if (X&1) k++;
if (X&2) k++;
if (X&4) k++;
if (X&8) k++;
switch(k){
case 0 : Y = 0; break;
case 1 : Y = 1; break;
case 2 : Y = 3; break;
case 3 : Y = 7; break;
case 4 : Y = 15; break;
}
}
И это решение прошло все тесты!
Объясните, пожалуйста, в чём состоит моя ошибка использования оператора "?"
Нужно учитывать приоритетность операторов. Правильно будет так:
k = (X&1?1:0) + (X&2?1:0) + (X&4?1:0) + (X&8?1:0);
Приоритеты можно посмотреть в Википедии.
|
22.02.2013 11:16:50
Тема: Re:Вопросы по C-MPA
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Василий Писпанен:
задача из среза
http://dl.gsu.by/task.jsp?nid=1111814&cid=860
решение
int mas[10];
int __in __bits(8) n;
int res[10];
void main(){
int __bits(16) i=0;
int __bits(16) k = 0;
for (; i<n; i++) {
if (mas[i]%3 == 0) {
res[k]=mas[i];
k++;
}
}
if (k == 0){
i=0;
for (; i<n; i++) {
res[i]=0;
}
}
} не проходит первый же тест, хотя в отладчике всё ок
При объявлении массива нужно обращать внимание на размерность его элементов. Чтобы элементы были по байту нужно объявлять так:
int __bits(8) mas[10];
int __bits(8) res[10];
|
04.03.2013 17:32:21
Тема: Re:Вопросы по C-MPA
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Примеры работы с битами.
1. Получить бит по номеру (например, биты 4, 6, 9):
unsigned __bits(32) X;
...
unsigned __bits(1) B4 = X >> 4;
unsigned __bits(1) B6 = X >> 6;
unsigned __bits(1) B9 = X >> 9;
2. Записать биты по номерам (например, биты 7, 16, 28):
unsigned __bits(32) X;
unsigned __bits(1) B7;
unsigned __bits(1) B16;
unsigned __bits(1) B28;
...
X |= B7 << 7;
X |= B16 << 16;
X |= B28 << 28;
|
14.03.2013 20:38:06
Тема: Re:Вопросы по C-MPA
|
Николай Тарасенко
Темы: 0
Сообщений: 36
Мой профиль
|
Во время написания среза возник такой вопрос:
задача - http://dl.gsu.by/task.jsp?nid=1114310&cid=860
код
char in_str[100];
char res[100];
void main()
{
char s1[26];
s1="qwertyuioplkjhgfdsazxcvbnm";
char s2[26];
s2="QWERTYUIOPLKJHGFDSAZXCVBNM";
char s3[100];
unsigned __bits(8) k=0;
for (int i=0;in_str[i]!='#';i++)
for (int j=0;j<26;j++)
if (in_str[i]==s1[j]){
s3[k]=s2[j];
k++;
}
res=s3;
}
получил - Внутренняя ошибка компилятора - Unsupported node type
В чём ошибка?
|
14.03.2013 20:43:29
Тема: Re:Вопросы по C-MPA
|
Николай Тарасенко
Темы: 0
Сообщений: 36
Мой профиль
|
Как я понял у меня происходила неправильная инициализация строки.
|
15.03.2013 10:43:27
Тема: Re:Вопросы по C-MPA
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Николай Тарасенко:
char s1[26];
s1="qwertyuioplkjhgfdsazxcvbnm";
char s2[26];
s2="QWERTYUIOPLKJHGFDSAZXCVBNM";
Правильно так:
char s1[27] = "qwertyuioplkjhgfdsazxcvbnm";
char s2[27] = "QWERTYUIOPLKJHGFDSAZXCVBNM";
Работает пока только с глобальными переменными (определять нужно до функции main().
|
16.03.2013 07:52:04
Тема: Re:Вопросы по C-MPA
|
Михаил Долинский
Темы: 2072
Сообщений: 49883
Мой профиль
|
Игорь Коршунов:
Елена Сапего:
На контрольном срезе возникла проблема с задачей http://dl.gsu.by/task.jsp?nid=1114262&cid=860
"Чекер снят по времени (>160 sec)"
В таких случаях следует как можно больше упростить условные выражения.
Например, такой код
if(i1>=0 && i1<=7) e1=0;
if(i1>=8 && i1<=15) e1=1;
if(i1>=16 && i1<=23) e1=2;
if(i1>=24 && i1<=31) e1=3;
лучше заменить на более простой вариант:
if (i1 >= 24) e1 = 3 ;
else if (i1 >= 16) e1 = 2;
else if (i1 >= 8) e1 = 1;
else e1 = 0;
|
16.03.2013 08:01:16
Тема: Re:Вопросы по C-MPA
|
Михаил Долинский
Темы: 2072
Сообщений: 49883
Мой профиль
|
Игорь Коршунов:
Максим Шурпо:
Так же у меня не проходят тесты по-моему коду.
int __in __bits(16) x= 121;
int __out __bits(8) Res;
void main(){
int __bits(16) s;
s = x%3;
if(s == 0){
Res = 1;
}else{
Res = 0;
}
}
Нужно убрать инициализацию входной переменной.
|
18.03.2013 14:40:51
Тема: Re:Вопросы по C-MPA
|
Михаил Долинский
Темы: 2072
Сообщений: 49883
Мой профиль
|
18.03.2013 14:39:15 18.03.2013 14:39:17 ДРАПЕЗА, Тарасенко Архитектура вычислительных систем (М3/ПМ4) - 2013 1. Команда BSWAB/Intel 80486 (микропрограммно) 0 Нужно сдавать файл BSWAB.PRD src.mpc DelTA3 at Nit4
int __in __bits(32) IN;
int __out __bits(32) OUT;
void main()
{
int __bits(32) r=0,m=0,l=1,n=0;
int i=0,k=IN;
//for( i=0;i<31;i++)
{
n=l<<i; // НА ЭТОЙ СТРОЧКЕ WINTER вылетает с
// ОШИБКОЙ Exception EAccessViolation in module
// MPA.dll at 000259BF.
m=k&(1);
r=r|(m<<31) ;
}
}
|
18.03.2013 16:39:26
Тема: Re:Вопросы по C-MPA
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Михаил Долинский:
18.03.2013 14:39:15 18.03.2013 14:39:17 ДРАПЕЗА, Тарасенко Архитектура вычислительных систем (М3/ПМ4) - 2013 1. Команда BSWAB/Intel 80486 (микропрограммно) 0 Нужно сдавать файл BSWAB.PRD src.mpc DelTA3 at Nit4
int __in __bits(32) IN;
int __out __bits(32) OUT;
void main()
{
int __bits(32) r=0,m=0,l=1,n=0;
int i=0,k=IN;
//for( i=0;i<31;i++)
{
n=l<<i; // НА ЭТОЙ СТРОЧКЕ WINTER вылетает с
// ОШИБКОЙ Exception EAccessViolation in module
// MPA.dll at 000259BF.
m=k&(1);
r=r|(m<<31) ;
}
}
Мне не удалось воспроизвести данную ошибку. Есть предположение, что использовалась старая версия WInter.
|
20.03.2013 19:46:50
Тема: Re:Вопросы по C-MPA
|
Илья Щурок
Темы: 1
Сообщений: 66
Мой профиль
|
Есть вопрос по самому С-МРА. У меня на конструкцию вида что_угодно<<0 ругается всякими нелестными словами. Так и должно быть? Просто, если исходить из С, С++ и иже с ними, данный оператор не должен делать ничего. А вот в С-МРА он, почему-то, не то, что ошибку не выдаёт, а ещё и ругается про критические ошибки доступа к памяти на уровне между компилятором и ОС, а потом благополучно вылетает. Ну, лично у меня.
______________________
Жизнь - забытые следы чьей-то Глубины...
|
22.03.2013 11:39:59
Тема: Re:Вопросы по C-MPA
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Илья Щурок:
У меня на конструкцию вида что_угодно<<0 ругается всякими нелестными словами.
В одной из старых версий mpa.dll была такая ошибка.
Возможно, тебе нужно обновить этот файл: E:\SPRL\WINTER\mdl\cpu\mpa.dll
|
|