|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Проблема с динамичным массивом
Возникла проблема. Пишу в коде:
SetLength(Directory[IDToNum(DirID)].Files, 3); writeln('Files: ', length(Directory[IDToNum(DirID)].Files)); Directory[IDToNum(DirID)].Files[1] := TFile.Create(Name); Directory[IDToNum(DirID)].Files[2] := TFile.Create(Name); Directory[IDToNum(DirID)].Files[3] := TFile.Create(Name); Создается массив в 3 элемента, ну все как и должно быть. Пишу код, для добавления 1 элемента в конец массива: SetLength(Directory[IDToNum(DirID)].Files, length(Directory[IDToNum(DirID)].Files) + 1); {увеличиваю размер динамичного массива на 1} writeln('Files: ', length(Directory[IDToNum(DirID)].Files)); {вывод размера массива} n := length(Directory[IDToNum(DirID)].Files); {номер максимального элемента массива} Directory[IDToNum(DirID)].Files[n] := TFile.Create(Name); {создание крайнего элемента массива} Вылетает прога. Обычно такое бывает при обращении к несуществующему элементу массива. Кто поопытнее, может подскажете в чем дело, что я пишу не так? |
#2
|
|||
|
|||
Если мне не изменяет память, в SetLength увеличивать на 2 надо а не на один.
|
#3
|
|||
|
|||
Цитата:
|
#4
|
|||
|
|||
Там я не максимальный, а последний элемент ищу. Чтобы при массиве в 5 элементов, запись шла именно в пятый. С +2 вместо +1 не помогло...
PS. Первый элемент создает нормально. Ошибка при попытке создания последующих. Последний раз редактировалось Igornv, 26.10.2008 в 11:45. |
#5
|
|||
|
|||
Элементы динамического массива нумеруются с НУЛЯ!!!
Т.е. если у тебя 3 элемента в массиве от их номера будут 0, 1 и 2, следовательно последний элемент массива это n-1, где n-длина массива |
#6
|
|||
|
|||
Я тебе прочто говорю
Цитата:
З.Ы. да +2 это я напутал. |
#7
|
|||
|
|||
Цитата:
А High() возвращает именно последний элемент? Мне нужно чтобы функция возвратила именно тот, что появился крайним справа после увеличения размера массива на 1. Как это сделать? |
#8
|
|||
|
|||
Цитата:
Именно это High() и делает Low() - делает все с точностью наооборот. |
#9
|
|||
|
|||
Проблема решена. Дело было в кривом скрипте вывода массива.
|
#10
|
|||
|
|||
Цитата:
Попробуй так. Код:
Directory[IDToNum(DirID)].Files[n-1] := TFile.Create(Name); {создание крайнего элемента массива} т.к. динамические массивы нумеруются с 0 а не с 1. т.е. если у тебя 3 элемента (1, 2, 3) то в массиве это будет так (0,1,2). Програмист приходит на стрельбище. Стреляет. Прапор смотрит на мешень и говорит Прапор: вы не попали ни один раз. Программист: Пули вылетели, проблемы у вас. |