IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> 1)многострочные комментарии 2)переполнение регистра, C
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 151
Пол: Мужской
Реальное имя: иван

Репутация: -  0  +


Задание было такое:написать интерпритатор логических инструкций например(and x,y)где x y регистры.С этим я без особых проблем справился.Затруднения возникли в 2х местах.1)инструкции должны считываться из файле.в
файле разрешены однострочные комментарии(выделяются символом #) и многострочные(выделяются {})с чтением могострочных комментариев и возникла проблема тк коментарий внутри может содержать символы { }например{xxxxxxx}aaaaa}более менее рабочий вариант
	if(c=='{') incomment=1;
if(!isspace©&&!incomment&&c!=EOF) *ic++=c;
if(c=='}')
incomment=0;
но } проигнорироваать не удается и она при дальнейшем чтении приписывается к команде идущей после коментария }in x почему не гнорируется я понимаю но как исправить не знаю помогите. и 2) инструкция in x используется для ввода с клавиатуры число в регистр х в 7ой системе та вот если я ввиду слишком большое число как понять что произойдет переполнение регистра в 32бита?
int inx(void)
{
x=0;
er=0;
count=0;
do
{
count++;
if(er==1)Error(4,"");
else if(er==2)Error(5,"");
else if(er==3)Error(6,wbuf);
else if(er==4)exit(Error(7,wbuf));
er=0;
printf("%c=",ar1);
gets(wbuf);
if(!wbuf)er=1;
else if(strlen(wbuf)>12)er=2;
else
{
wb=wbuf-1;
while(*++wb)
{
if(*wb<'0'||*wb>'6')
{
system("cls");
er=3;
break;
}
x=x*7+(*wb-'0');
if(ltoa(x)>ltoa){er=4;break;}
}
}

system("cls");
if(count>3)exit(Error(8,""));
}
while(er);
R1=x;
fprintf(ft," %c=%d\n",ar1,x);
fprintf(fo,"%c=%d\n",ar1,x);
x=0;
return 0;
}
вот ф.я для in x.
Прикрепляю полностью всю программу


Прикрепленные файлы
Прикрепленный файл  Rar_archive.rar ( 2.45 килобайт ) Кол-во скачиваний: 167
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Цитата
тк коментарий внутри может содержать символы { }


так сказано в задании ?

Добавлено через 2 мин.
честно говоря бред получается, вот смотри:


{ тут начинается комментарий1
а тут по идее
заканчивается}
and x,y # операция
{а тут комментарий №2}


Если многострочные комментарии могут сожедрать символы '{' и '}' , весь выделенный текст можно считать комментарием.

Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Цитата
более менее рабочий вариант
Вот просто рабочий вариант:
...
if(c=='{') incomment+=1;
if(!isspace©&&!incomment&&c!=EOF) *ic++=c;
if(c=='}') {
incomment-=1;
continue; /* читаем следующий символ */
}
...


Добавлено через 1 мин.
Цитата
Если многострочные комментарии могут сожедрать символы '{' и '}' , весь выделенный текст можно считать комментарием.
Нельзя - там неправильная вложенность...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Бывалый
***

Группа: Пользователи
Сообщений: 151
Пол: Мужской
Реальное имя: иван

Репутация: -  0  +


С комментариями вроде разобрался,а вот по поводу переполнения как определить что вводимое число слишком большое?При вводе число помещается в строку соответственно число может быть любой длинны,а вот потом оно переводится в чиловой тип.так как мне перед переводом определить что число слишком большое?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Минимум два варианта:
1. Определить в процессе перевода.
2. Сначала перевести в число заведомо избыточной разрядности, пранализировать, после чего привести к нужной разрядности.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Бывалый
***

Группа: Пользователи
Сообщений: 151
Пол: Мужской
Реальное имя: иван

Репутация: -  0  +


Цитата(andriano @ 10.04.2008 8:09) *

Минимум два варианта:
1. Определить в процессе перевода.
2. Сначала перевести в число заведомо избыточной разрядности, пранализировать, после чего привести к нужной разрядности.

А можно так?:поскольку у меня регистр 32бита это будет число типа long так можноли взять предельное значение этого типа перегнать его в строку и эту строку сравнивать со строкой которую я ввожу с клавиатуры?если введенная строка больше то произойдет переполнение выйдет ли из этого ченить?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Зависит от того, какой ты напишешь алгоритм сравнения строк.

PS. Но я бы использовал тип extended. А строки длиннее 19 символов - рубил на корню.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 0:19
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name