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

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

array of string


Doom_2 ©   (2007-04-22 10:39:00) 

Столь простой вопрос, но не могу разобраться:
Как правильно создать и заполнить динамический массив
array of string?


Kolan   (2007-04-22 16:10:00) [1]

> Когда завершается цикл? Никогда!

Я думаю это псевдо код…


Asail   (2007-04-22 14:40:00) [2]


> А что тут может не работать?

Когда завершается цикл? Никогда! Т.е. на падении при r=10, т.к. размер массива не меняется (всегда = 10), возникнет исключение (Invalid Pointer Operation), при котором вывалится не только цикл, но и ф-я его вызвавшая...
ЭТОТ код корректно работать не может!!!


Kolan   (2007-04-22 13:03:00) [3]

> Ни фига себе…

А что тут может не работать?


Asail   (2007-04-22 11:59:00) [4]


> r:=0;
> while i=1 do begin
> SetLength(Massiv, 10);
> Massiv[r]:='C:\';
> r:=r+1;
> end;


У тебя ЭТО работает??? Ни фига себе...


Kolan   (2007-04-22 11:22:00) [5]

> Можно менять длину массива в цикле?

Меняй на здоровье, но только повторяю лучьше минимизировать кол-во вызовов SetLength,
Постараться предугодать сколько надо, а лишние потом удалить уменьшив массив…


Doom_2   (2007-04-22 11:20:00) [6]

Всё - понял!
Огромное спасибо!


Doom_2   (2007-04-22 11:19:00) [7]

Можно менять длину массива в цикле?

r:=0;
while i=1 do begin
SetLength(Massiv, 10);
Massiv[r]:='C:\';
r:=r+1;
end;


Kolan   (2007-04-22 11:18:00) [8]

> Но я и выбрал динамический массив, что не знаю его длину!

Еще раз.
Вот ты объявил массив:
Arr: array of string

Но Arr[0] := ''; приведет к исключению, тк память еше не выделена.
Ты должен выделить ее с помошью SetLength.

Правильно длинну ты незнаешь, но когда-то же узнаешь… Вот тогджа и выдельшь память.

Твой пример:
r:=0;
while i=1 do
begin
SetLength(Massiv, Length(Massiv)+1);
 Massiv[r]:='C:\'; — ошибка!
 r:=r+1;
end;


Но учьти, что выделять память так — модленно, лучьше делать это большими порциями.

А вообще не парься и используй TStrings:

var
 Strings: TStrings;
 I: Integer;
begin
 Strings := TString List.Create;
 try
   for I := 1 to 100 do
     Strings.Add('C:\');
 finally
   Strings.Free;
end;


Sholah_Weras   (2007-04-22 11:14:00) [9]

Ты длину устанавливаешь у массива Arr, а не у Massiv.

Вместо SetLength(Arr, 10) пиши SetLength(Massiv, 10).


Doom_2   (2007-04-22 11:12:00) [10]

Ну как же:

Arr[I] := IntToStr(I);

Arr: array of string
I: Integer;

Конкретная срока - конкретное значение... Нет?


Doom_2   (2007-04-22 11:09:00) [11]

Значит - SetLength(Arr, 10);
Но я и выбрал динамический массив, что не знаю его длину!
Примерно так:
r:=0;
while i=1 do begin
Massiv[r]:='C:\'; - ошибка!
r:=r+1;
...


Kolan   (2007-04-22 11:05:00) [12]

> Я делаю по книге:

Хде ты выделил под строки место?


Doom_2   (2007-04-22 11:04:00) [13]

Я делаю по книге:

var Massiv: array of string;
....
Massiv[1]:='C:\'; - ошибка!


Kolan   (2007-04-22 11:03:00) [14]

> Как правильно создать

var
 Arr: array of string
 I: Integer;
begin
 SetLength(Arr, 10);
 for I := Low(Arr) to High(Arr) do
   Arr[I] := IntToStr(I);
end;


PS
 Используй лучше TStrings(TStringList)


Sholah_Weras   (2007-04-22 11:02:00) [15]

Doom_2

Вкратце:

1) Объяви массив.
Mass_of_String: array of String;

2) В нужном месте задай длину этого массива.

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetLength(Mass_os_String,10);
end;


3) Чтобы заполнить нужный элемент массива, нужно обратиться к этому элементу.

procedure TForm1.Button2Click(Sender: TObject);
begin
  Mass_os_String[2] := 'Что-то';
end;


sniknik   (2007-04-22 10:52:00) [16]

у меня другой вопрос не менее простой но гораздо интереснее...
а как можно создать и заполнить неправильно???!!! сколько не пытаюсь ничего не выходит.


Наверх

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