Страница 1 из 1

помогите найти ошибку

Добавлено: 11 дек 2006, 22:35
Тузякин
Когда я ввожу N от 1 и приблизительно до 150, далее либо прога вылетает, либо вместе с вылетом выдаёт ошибку: "Процессор обнаружил недопустимую инструкцию. CS:5b32 IP:9a4e OP:63 00 00 00 00 Для завершения работы приложения нажмите кнопку "Закрыть""
Скажите плиииз как с этим разобраться
alp=33 записано в константах
Процедура R выполняет чтение строки с номером pos из файла
Procedure Coding(NStr:integer);
var
mas,b_mas,mas1,b_mas1:string[66];
f:text;
str:string; {кодируемая строка}
pos:integer; {номер строки на которой остановились при кодировке}
N,k,i,j:integer;
M:integer; {число смещения}
begin
pos:=0;
writeln('Введите N');
readln(N);
if N<>0 then
begin
mas:='абвгдеёжзийклмнопрстуфхцчшщъыьэюя';
b_mas:='АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
M:=N-(N div alp)*alp; {число, на кот. смещаем буквы алфавита}
mas1:=mas;
b_mas1:=b_mas;
for i:=1 to n do
begin
mas1[alp+i]:=mas1;
b_mas1[alp+i]:=b_mas1;
end;
j:=1;
for i:=N to (alp+N) do
begin
mas1[j]:=mas1;
b_mas1[j]:=b_mas1;
inc(j,1);
end;
for i:=1 to NStr do
begin
str:=R(pos);
for j:=1 to length(str) do
begin
if (ord(str[j])>=128) and (ord(str[j])<=159) then
for k:=1 to alp do
if b_mas[k]=str[j] then
str[j]:=b_mas1[k];
if (ord(str[j])>=160) and (ord(str[j])<=175) and (k<>n)
or (ord(str[j])>=224) and (ord(str[j])<=239) and (k<>n) then
for k:=1 to alp do
if mas[k]=str[j] then
str[j]:=mas1[k];
end;
pos:=pos+1;
{$I-}
assign(f,outp);
reset(f);
if IOResult<>0 then
rewrite(f)
else
append(f);
writeln(f,str);
close(f);
{$I+}

end;
end
else
begin
writeln('N=0, текст не будет закодирован');
readln;
end;
end;

Re: помогите найти ошибку

Добавлено: 12 дек 2006, 03:01
Колядин Максим
_________________________________________________________
Цитата:
"Процедура R выполняет чтение строки с номером pos из файла'';
_________________________________________________________
Из какого файла?
Не уверен, но попробуй в паскале нажать (Options-->Compiler...-->"Compiler settings for" - all targets). Далее отметь всё крестиками и попробуй запустить.

Re: помогите найти ошибку

Добавлено: 12 дек 2006, 10:04
somewhere
Вообще компилятор обычно не генерит недопустимые инструкции, а это значит, что там где должен быть правильный код вдруг стал неправильный. Т.е. кто-то или что-то его поменяло - обычно это происходит при записи за пределы переменных. Вообще эта прога у меня работала нормально, хоть она ничего и не делала, но работала. Видимо дело в процедуре R которая читает из файла строку и записывает ее в стринг, в который она не помещается.

Re: помогите найти ошибку

Добавлено: 12 дек 2006, 13:49
Тузякин
function R(pos:integer):string;
var
i:integer;
f:text;
str:string;
begin
{$I-}
str:='';
assign(f,'text.txt');
reset(f);
for i:=1 to pos do
readln(f);
readln(f,str);
close(f);
{$I+}
R:=str;
end;

Re: помогите найти ошибку

Добавлено: 12 дек 2006, 13:54
Тузякин
эм...скажи пожалуйста, как она работала?
и какие исходные данные ты используешь?
я поставил writeln непосредственно перед эндом процедуры, и это сообщение было последним перед вылетом из проги

Re: помогите найти ошибку

Добавлено: 12 дек 2006, 14:15
somewhere
&quot писал(а):for i:=1 to pos do
readln(f);
readln(f,str);
Вот скажем, здесь, если я хочу зачитать 4 строку, то он прочтет 5-ую. Проще тогда уж так:

Код: Выделить всё

str := '';
for i:=1 to pos do if not eof(f) then readln(f, str);
И вообще Text.txt покажи
Если уж вообще тупик поставь бряк и выполняй пошагово, все ошибки найдешь сразу

Re: помогите найти ошибку

Добавлено: 12 дек 2006, 15:26
BBB

Код: Выделить всё

for i:=1 to n do
begin
mas1[alp+i]:=mas1[i];
b_mas1[alp+i]:=b_mas1[i];
end;
alp у нас 33, mas1 - string длиной 66.
Таким образом, если n (что в Паскале, как я понимаю, эквивалентно N) задано больше 33, то сумма alp+i будет больше 66, то есть, мы попадаем за пределы mas1.
То же самое и для b_mas1.

Re: помогите найти ошибку

Добавлено: 12 дек 2006, 21:30
Тузякин
вопрос: как может у меня выйти за границу массива?
Например:
N=2000
alp=33
div - целочисленное деление
2000-33*(2000/33)=2000-1980=20
M:=N-(N div alp)*alp
я хочу сказать, что M никогда не будет больше 33, т.к. оно принимает значения от0 до 32, вот

Re: помогите найти ошибку

Добавлено: 12 дек 2006, 22:34
Тузякин
ох...простите, правда...просто в процедуре надо вместо N в циклах, использовать М...
пасибки за совет с опциями компилятора, он таким образом ошибку выдал...и на самом деле был вылет за границы массива...в общем сори за невнимательность и респект всем, кто помогал(=