Форум: "Основная";
Текущий архив: 2002.12.12;
Скачать: [xml.tar.bz2];
ВнизAccess violation при использовании массива Найти похожие ветки
← →
Sirius (2002-11-30 22:22) [0]Hi All. У меня проблемка следующего характера. При использовании массива объявленного как:
var s : array of string;
и исплнении строки
s[ii]:=Table1.Fields[0].AsString;
выскакивает Access violation, но если написать
var s : array [1..100000] of string;
то ошибки нет, но значиние в 100000 меня не устраивает. Подскажите как убрать эти грабли с дороги.
← →
Palladin (2002-11-30 23:09) [1]скорее всего ты вышел за рамки массива s.
← →
Sirius (2002-11-30 23:13) [2]Так прикол в том, что ошибка вылетает при ПЕРВОМ обращении к
s[ii]:=Table1.Fields[0].AsString;
← →
Sirius (2002-11-30 23:15) [3]Уточняю, хотелось бы использовать var s : array of string; без ограничений.
← →
Palladin (2002-11-30 23:25) [4]А ты его инициализируешь??
SetLength(s,<скока тебе надо>);
← →
TTCustomDelphiMaster (2002-11-30 23:34) [5]SetLength пробовали использовать?
← →
Sirius (2002-11-30 23:40) [6]Нет, я не знаю сколько мне надо будет (может 100, а может 1*10^10), просто в массив спихиваю весь перечень таблицы, а потом на основании этого делаю что-то типа фильтра по заданным условиям. фрагмент кода:
var s : array of string;
i : array of real;
ii : integer;
begin
ii:=0;
with SALDO_ do
begin
while Not EOF do
begin
ii:=ii+1;
s[ii]:=saldo_.Fields[0].AsString;
i[ii]:=0;
next
end;
end;
← →
Sirius (2002-11-30 23:49) [7]
> SetLength пробовали использовать?
Уже попробовал, так же выдает access violation, но по другому адресу
SetLength(s,100000);
← →
Palladin (2002-11-30 23:53) [8]есть два способа
если поддерживается свойство saldo_.RecordCount
то просто делаем так
SetLength(s,saldo_.RecordCount)
если же не поддерживается то придется делать так:
SetLength(s,1);
with SALDO_ do
begin
while Not EOF do
begin
ii:=ii+1;
s[ii]:=saldo_.Fields[0].AsString;
i[ii]:=0;
if Not EOF then SetLength(s,high(s)+2);
next
end;
end;
← →
TTCustomDelphiMaster (2002-11-30 23:55) [9]
var s : array of string;
i : array of real;
ii : integer;
begin
ii:=0;
with SALDO_ do
begin
while Not EOF do
begin
if ii >= Length(s) then
SetLength(s, Length(s) + 100);
ii:=ii+1;
s[ii]:=saldo_.Fields[0].AsString;
i[ii]:=0;
next
end;
end;
← →
Palladin (2002-11-30 23:57) [10]а... ну да... второй вариант у TTCustomDelphiMaster лучше гораздо...
← →
TTCustomDelphiMaster (2002-12-01 00:06) [11]Для массива i нужно тоже размер задавать.
А если размер все таки известен то лучше задать его сразу см.
> Palladin © (30.11.02 23:53)
> есть два способа
> если поддерживается свойство saldo_.RecordCount
> то просто делаем так
> SetLength(s,saldo_.RecordCount)
← →
Sirius (2002-12-01 08:00) [12]Не работает. Так же выдает ошибку при первом обращении к массиву
> var s : array of string;
> i : array of real;
> ii : integer;
> begin
> ii:=0;
> with SALDO_ do
> begin
> while Not EOF do
> begin
> if ii >= Length(s) then
> SetLength(s, Length(s) + 100);
> ii:=ii+1;
> s[ii]:=saldo_.Fields[0].AsString;
> i[ii]:=0;
> next
> end;
> end;
Не работает. Так же выдает ошибку при первом обращении к массиву.
Но если i[ii]:=0 закоментировать, то работает до ii=100, и выдает Access violation на том же адресе что и с самого начала.
если ii:=ii+1; разместить перед if ii >= Length(s) then SetLength(s, Length(s) + 100); то while Not EOF do не действует, прогу циклит и она подвисает.
> Для массива i нужно тоже размер задавать.
> А если размер все таки известен то лучше задать его сразу
> см.
Зачез отдельно задавать, он же равен ii.
Так в том то и весь фокус что неизвестно заранее.
Ладно, фиг с ним, БОЛЬШОЕ СПАСИБО тем, кто мне попытался помочь, оставлю пока 100.000 а там еще подумаю. Еще раз спасибо.
← →
Alexander S. (2002-12-01 11:32) [13]Вот так правильно. Второй массив не инициализировал, вот и глючит.
var
s : array of string;
i : array of real;
a : integer;
begin
a:=0;
saldo_.First;
while not saldo_.Eof do
begin
SetLength(s,a+1);
SetLength(i,a+1); //второй массив забыли инициализировать
s[a]:= saldo_.Fields[0].AsString;
i[a]:=0;
inc(a);
saldo_.Next;
end;
end;
← →
Sonder (2002-12-01 14:56) [14]
procedure TForm1.Button1Click(Sender: TObject);
var
s : array of string;
i: integer;
begin
Table1.First;
while not Table1.Eof do
begin
setlength(s, Table1.RecNo);
s[high(s)] := Table1.Fields[0].AsString;
Table1.Next;
end;
for i := 0 to high(s) do
begin
ListBox1.Items.Add(s[i]);
end;
end;
← →
maratFromTomsk (2002-12-02 11:47) [15]а почему ты не используешь TStringList, TList или TObjectList
там ведь все проблемы решены
к тому же довольно эффективно
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.12.12;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.004 c