Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.005 c
14-36368
WD
2002-11-20 16:47
2002.12.12
Как откыть базу проги


1-36261
iNew
2002-12-02 06:59
2002.12.12
Есть строка содержащая ФИО, причем кол-во пробелов между


1-36184
Lord Warlock
2002-12-02 10:06
2002.12.12
Acad2000


14-36341
RV
2002-11-20 12:00
2002.12.12
Ура! Мне отпуск, наконец, подписали!


1-36242
Маришка
2002-12-02 08:44
2002.12.12
Вопрос





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский