Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.12;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.021 c
14-36410
saxon
2002-11-22 13:20
2002.12.12
Зарегистрироваться?


14-36328
ИгорЁК
2002-11-19 22:57
2002.12.12
Delphi


1-36215
Dber
2002-11-30 16:15
2002.12.12
Нормальный Report


3-35982
Hiqwer
2002-11-20 19:43
2002.12.12
Oracle. Компоненты DOA. Где TimeOut?


1-36193
olmal
2002-12-04 11:10
2002.12.12
Как отображать секунды прошедщие с нажатия клавиши до 10 секунд ?