Здравствуйте,не подскажете с чем связана следующая ошибка при запуске программы: Мне,кажется,это ошибка имеет отношение к динамическому массиву,так как если его не использовать программа у меня работает. Заранее спасибо.
Если кратко - ты попытался записать что-то по нулевому адресу (кажется, в дельфи он обзывается nil). При использовании динамических массивов эта ошибка обычно возникает либо при попытке записать что-то в ячейку массива, которая лежит за пределами выделенной для него памяти. Вообще, может быть довольно много причин. Точнее без кода выделения памяти и обращения к массиву сказать не смогу.
mikluho Конечно, правильнее. Просто я последний раз, когда я имел дело с делфи, это была Delphi 3 и 2002'й год. Помнится, там SetLength'а не было, потому в памяти и остался способ с getMem.
я в последний раз работал с дельфей года четыре назад... но, насколько помню, там массивы отличались от сишных тем, что в начале массива шла длина. то есть если объявить array of byte и сделать ему SetLength(10), то реально он будет занимать не 10, а 14 байт. и выделять соответственно под него тоже надо больше (если пользоваться getmem). то есть в сишном массиве &array и &array[0] указывают на один и тот же байт, а в дельфийском между адресами @array и @array[0] будет разница в 4 байта. По крайней мере, для строк точно так было. Это я к тому, что GetMem (@Mas_x, z*sizeof(byte)); по идее может работать некорректно о_О Честно говоря, лень ставить дельфи и экспериментировать)
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.
память под Mas_x нигде не выделяется. Попытайся поставить
после s:=z