14:39

Delphi 7.

Здравствуйте,не подскажете с чем связана следующая ошибка при
запуске программы:
Мне,кажется,это ошибка имеет отношение к динамическому массиву,так как если его не использовать программа у меня работает.
Заранее спасибо.

Комментарии
27.02.2010 в 15:13

Я знаю, что я гений, но мне от этого ничуть не легче.
скорее всего обращение к элементу за границами массива. без кода понять не возможно.
27.02.2010 в 15:14

mikluho вот код:
Program Binar;
{$APPTYPE CONSOLE}
uses
SysUtils;
Var
y,z,s:integer;
k,i,x:byte;

Mas_x: array of byte;
label M;
begin
M:writeln('Input the number');
readln(z);
If (z<0) or (z>10000) then
begin
writeln('ERROR!');
goto M;
end;
s:=z;


For i:=0 to (s div 2) do
begin
y:=z div 2;
x:=z mod 2;
Mas_x[i]:=x;
z:=y;
k:=i;

If (z<2) then
begin
break;
end;
end;
write(S,' [10] = ');
Mas_x[k+1]:=z;
for i:=k+1 downto 1 do
begin
write(Mas_x[i]);
end;
write(' [2]');
readln;

{ TODO -oUser -cConsole Main : Insert code here }
end.
27.02.2010 в 15:15

Пау-чок
Если кратко - ты попытался записать что-то по нулевому адресу (кажется, в дельфи он обзывается nil). При использовании динамических массивов эта ошибка обычно возникает либо при попытке записать что-то в ячейку массива, которая лежит за пределами выделенной для него памяти. Вообще, может быть довольно много причин. Точнее без кода выделения памяти и обращения к массиву сказать не смогу.
27.02.2010 в 15:16

Насколько я правильно помню в динамическом массиве нумерация начинается с 0.
27.02.2010 в 15:25

Я знаю, что я гений, но мне от этого ничуть не легче.
вот только надо было его ещё и инициализировать (кажется так: SetLength(Mas_x, (s div 2)+1) )....
27.02.2010 в 15:28

Пау-чок
nvse
память под Mas_x нигде не выделяется. Попытайся поставить

GetMem (@Mas_x, z*sizeof(byte));


после s:=z
27.02.2010 в 15:32

O большое спасибо,всё заработало.Только,наверное,@ лишний символ.
27.02.2010 в 15:33

Я знаю, что я гений, но мне от этого ничуть не легче.
O, а не правильнее будет использовать предусмотренный способ выделения памяти?
27.02.2010 в 15:33

Я знаю, что я гений, но мне от этого ничуть не легче.
nvse, да, и освобождать память тоже надо...
27.02.2010 в 15:41

mikluho спасибо,вашим способом тоже работает.
27.02.2010 в 17:56

Пау-чок
mikluho Конечно, правильнее. Просто я последний раз, когда я имел дело с делфи, это была Delphi 3 и 2002'й год. Помнится, там SetLength'а не было, потому в памяти и остался способ с getMem.
27.02.2010 в 19:16

I'm not dead... yet.
я в последний раз работал с дельфей года четыре назад... но, насколько помню, там массивы отличались от сишных тем, что в начале массива шла длина. то есть если объявить array of byte и сделать ему SetLength(10), то реально он будет занимать не 10, а 14 байт. и выделять соответственно под него тоже надо больше (если пользоваться getmem). то есть в сишном массиве &array и &array[0] указывают на один и тот же байт, а в дельфийском между адресами @array и @array[0] будет разница в 4 байта. По крайней мере, для строк точно так было. Это я к тому, что GetMem (@Mas_x, z*sizeof(byte)); по идее может работать некорректно о_О Честно говоря, лень ставить дельфи и экспериментировать)
27.02.2010 в 22:20

Пау-чок
Just-a-Shadow Вот из-за подобных нюансов я предпочёл в своё время слезть с делфи =)