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

Вниз

Проблема с динамическими массивами   Найти похожие ветки 

 
Neket   (2006-10-05 12:57) [0]

Имеется заполненый массив MASS в котором колличество элементов равно Count (Count=High(Mass)). Когда я вывожу в Мемо1 данные из массива то все выводится нормално, но при попытки добавления нового элемента следующим образом :
Count:=Count+1;
SetLength(Mass, Count);
Mass[Count]:="$--------------------$";

Он начинает матерится и ругается на память. Подскажите гдк ошибка.
P.S.
Причем Вначале, т.е перед выводом в Мемо1 я заполняю массим таким обазом:
Count:=0
............
Count:=Count+1;
SetLength(Mass, Count);
Mass[count-1]:=s;
...........
Count:=Count-1;
for i:=0 to Count do Memo1.Lines.Add(Mass[i]);
Count:=Count+1;
SetLength(Mass, Count);
Mass[Count]:="$--------------------$"; // И вот здесть он начинает ругаться. Такое ощущение что SetLength не сработал.


 
Kolan ©   (2006-10-05 12:59) [1]


> Count=High(Mass)

Это не верно Количество равно High(Mass) + 1. Тк нумерация идет с 0.

Добавляй так:

SetLength(Mass, Length(Mass) + 1);

И вообще выбрось этот Count у тебя в сегда под рукой High, Low и Length.


 
Kolan ©   (2006-10-05 13:00) [2]


> SetLength(Mass, Length(Mass) + 1);

Кстати лучьше не по 1 добавлять а сразу побольше, тк добавление - довольно долгая вещь.


 
Думкин ©   (2006-10-05 13:05) [3]


> Mass[Count-1]:="$--------------------$";


 
Kolan ©   (2006-10-05 13:07) [4]


> Думкин ©   (05.10.06 13:05) [3]
>
>
> > Mass[Count-1]:="$--------------------$";
>


Я ж говорю лучьше так:

Mass[High(Mass)]:="$--------------------$";

В жизни не оПшибешься :)


 
@!!ex ©   (2006-10-05 13:35) [5]

Вот что бывает, когда в школах и ВУЗах учат инициализировать массивы не с 0, а с 1.... :((


 
Kolan ©   (2006-10-05 13:39) [6]


> инициализировать массивы не с 0, а с 1.

Какая разница с чего начинать, главное понимать что делаешь.


 
@!!ex ©   (2006-10-05 13:41) [7]


> Какая разница с чего начинать, главное понимать что делаешь.

Согласен.
Но сколько раз натыкался, что народ закончивший ВУЗы с такой же фигней попадались, потому что привыкли, что Count соответствует последнему эллементу массива.
А использование массива с 1, вообще ничем не оправданно.


 
Kolan ©   (2006-10-05 13:44) [8]


> А использование массива с 1, вообще ничем не оправданно.

String :)

Какая разница в принципе. Хоть со 100.
for I := Low(Arr) to High(Arr)
и пофиг с чего начинать :)

Хотя я тоже всегда с 0 деляю...


 
Думкин ©   (2006-10-05 13:45) [9]

> @!!ex ©   (05.10.06 13:35) [5]
> Вот что бывает, когда в школах и ВУЗах учат инициализировать
> массивы не с 0, а с 1.... :((

В Х++ это стандарт языка. И причем тут ВУЗы?


 
Kolan ©   (2006-10-05 13:46) [10]


> И причем тут ВУЗы?

Лично меня учили так:

Arr: array[1..20] of Integer;

Сейчас я написал бы:

Arr: array[0..19] of Integer;


 
Neket   (2006-10-05 13:56) [11]

Ды я сам если бы это был обычный массив то с 0 объявил его, но здесь чегото запутался. Спасибо за помощь.


 
han_malign ©   (2006-10-05 14:22) [12]


> Вот что бывает, когда в школах и ВУЗах учат инициализировать массивы не с 0, а с 1.... :((

- а наоборот - милениумные "войны" начинаются...
Важно помнить, что [1 - это Номер, а [0 - это Смещение, но и то и другое имеет право быть, в зависимости от конкретного применения.


 
Думкин ©   (2006-10-05 14:36) [13]

> Kolan ©   (05.10.06 13:46) [10]

Это скорее к религии, но если у меня массив идет как вектор столбец, то мне удобнее начинать нумерацию с 1.


 
Kolan ©   (2006-10-05 14:42) [14]


> Думкин ©   (05.10.06 14:36) [13]


Массив с нуля я не по религии начинаю, а после того как обжогся вот на чем:

procedure TForm1.FormCreate(Sender: TObject);
var
 Arr: array[1..3] of Integer;
begin
 Arr[1] := 1;
 Arr[2] := 2;
 Arr[3] := 3;
 PrintFirstElement(Arr);
end;

procedure TForm1.PrintFirstElement(Arr: array of Integer);
begin
 ShowMessage(IntToStr(Arr[1]));
end;


Не смотря на то что Arr с 1 внутри PrintFirstElement нумерация будет с 0 :(


 
Sapersky   (2006-10-05 14:46) [15]

Я ж говорю лучьше так:
Mass[High(Mass)]:="$--------------------$";
В жизни не оПшибешься :)


High для дин. массивов - вызов функции (фактически даже двух). В принципе, очень простых и коротких, но...



Страницы: 1 вся ветка

Текущий архив: 2006.10.22;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.051 c
3-1156418446
Виталий Юрьевич
2006-08-24 15:20
2006.10.22
ADO_TABLE и DBGRID - проблема с отображением информации


2-1159784197
Димыч
2006-10-02 14:16
2006.10.22
Процессорное время


6-1148981930
alexa14
2006-05-30 13:38
2006.10.22
Проблема с ServerSocket


15-1159393229
Yegorchic
2006-09-28 01:40
2006.10.22
Power Point и звук в презентации


2-1159905689
Лиля
2006-10-04 00:01
2006.10.22
Как закодировать?