[Logo] Форум DL
  [DL]  На главную страницу 
Индекс форума ->Учебный процесс ГГУ/СШ 27 ->Проектирование цифровых систем 1, 2, 3, ... 9, 10, 11, 12, 13, ... 24, 25, 26
Автор Сообщение
Илья Щурок

Темы: 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;
	}
}


И это решение прошло все тесты!
Объясните, пожалуйста, в чём состоит моя ошибка использования оператора "?"
______________________
Жизнь - забытые следы чьей-то Глубины...
Василий Писпанен

Темы: 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;
		}
	}
}
не проходит первый же тест, хотя в отладчике всё ок
Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль


Михаил Долинский:

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];
Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль


Илья Щурок:

Арифметические операторы:
...
? (оператор выбора)
...
Синтаксис и назначение перечисленных операторов полностью аналогичен языку Си.  


Хотелось бы узнать свою ошибку...
Допустим, задача 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);

Приоритеты можно посмотреть в Википедии.
Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль


Василий Писпанен:

задача из среза
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];
Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль
Примеры работы с битами.

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;
Николай Тарасенко

Темы: 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

В чём ошибка?
Николай Тарасенко

Темы: 0
Сообщений: 36

Мой профиль
Как я понял у меня происходила неправильная инициализация строки.
Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль


Николай Тарасенко:


char s1[26];
s1="qwertyuioplkjhgfdsazxcvbnm";
char s2[26];
s2="QWERTYUIOPLKJHGFDSAZXCVBNM";
 

Правильно так:
	char s1[27] = "qwertyuioplkjhgfdsazxcvbnm";
	char s2[27] = "QWERTYUIOPLKJHGFDSAZXCVBNM";

Работает пока только с глобальными переменными (определять нужно до функции main().
Михаил Долинский

Темы: 1984
Сообщений: 47256

Мой профиль


Игорь Коршунов:


Елена Сапего:

На контрольном срезе возникла проблема с задачей 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;
 
Михаил Долинский

Темы: 1984
Сообщений: 47256

Мой профиль


Игорь Коршунов:



Максим Шурпо:


Так же у меня не проходят тесты по-моему коду.
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;
}


Нужно убрать инициализацию входной переменной.
 
Михаил Долинский

Темы: 1984
Сообщений: 47256

Мой профиль
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)	  ;

	}

}

Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль


Михаил Долинский:

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.
Илья Щурок

Темы: 1
Сообщений: 66

Мой профиль
Есть вопрос по самому С-МРА. У меня на конструкцию вида что_угодно<<0 ругается всякими нелестными словами. Так и должно быть? Просто, если исходить из С, С++ и иже с ними, данный оператор не должен делать ничего. А вот в С-МРА он, почему-то, не то, что ошибку не выдаёт, а ещё и ругается про критические ошибки доступа к памяти на уровне между компилятором и ОС, а потом благополучно вылетает. Ну, лично у меня.
______________________
Жизнь - забытые следы чьей-то Глубины...
Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль


Илья Щурок:

У меня на конструкцию вида что_угодно<<0 ругается всякими нелестными словами. 

В одной из старых версий mpa.dll была такая ошибка.
Возможно, тебе нужно обновить этот файл: E:\SPRL\WINTER\mdl\cpu\mpa.dll
 
Индекс форума ->Учебный процесс ГГУ/СШ 27 ->Проектирование цифровых систем 1, 2, 3, ... 9, 10, 11, 12, 13, ... 24, 25, 26
Time:0,046