Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Access violation при использовании массива [D6, WinXP]


Sirius ©   (2002-11-30 22:22:00) 

Hi All. У меня проблемка следующего характера. При использовании массива объявленного как:
var s : array of string;
и исплнении строки
s[ii]:=Table1.Fields[0].AsString;
выскакивает Access violation, но если написать
var s : array [1..100000] of string;
то ошибки нет, но значиние в 100000 меня не устраивает. Подскажите как убрать эти грабли с дороги.


maratFromTomsk   (2002-12-02 11:47:00) [1]

а почему ты не используешь TStringList, TList или TObjectList
там ведь все проблемы решены
к тому же довольно эффективно


Sonder   (2002-12-01 14:56:00) [2]

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;


Alexander S.   (2002-12-01 11:32:00) [3]

Вот так правильно. Второй массив не инициализировал, вот и глючит.

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;


Sirius   (2002-12-01 08:00:00) [4]

Не работает. Так же выдает ошибку при первом обращении к массиву


> 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 а там еще подумаю. Еще раз спасибо.


TTCustomDelphiMaster   (2002-12-01 00:06:00) [5]

Для массива i нужно тоже размер задавать.
А если размер все таки известен то лучше задать его сразу см.

> Palladin © (30.11.02 23:53)
> есть два способа
> если поддерживается свойство saldo_.RecordCount
> то просто делаем так
> SetLength(s,saldo_.RecordCount)


Palladin   (2002-11-30 23:57:00) [6]

а... ну да... второй вариант у TTCustomDelphiMaster лучше гораздо...


TTCustomDelphiMaster   (2002-11-30 23:55:00) [7]


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:53:00) [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;


Sirius   (2002-11-30 23:49:00) [9]


> SetLength пробовали использовать?

Уже попробовал, так же выдает access violation, но по другому адресу
SetLength(s,100000);


Sirius   (2002-11-30 23:40:00) [10]

Нет, я не знаю сколько мне надо будет (может 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;


TTCustomDelphiMaster   (2002-11-30 23:34:00) [11]

SetLength пробовали использовать?


Palladin   (2002-11-30 23:25:00) [12]

А ты его инициализируешь??
SetLength(s,<скока тебе надо>);


Sirius   (2002-11-30 23:15:00) [13]

Уточняю, хотелось бы использовать var s : array of string; без ограничений.


Sirius   (2002-11-30 23:13:00) [14]

Так прикол в том, что ошибка вылетает при ПЕРВОМ обращении к
s[ii]:=Table1.Fields[0].AsString;


Palladin   (2002-11-30 23:09:00) [15]

скорее всего ты вышел за рамки массива s.


Наверх

Титульная страница Поиск, карта сайта Написать письмо