Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2011, 01:58   #1
Олвин
Экспериментатор
Форумчанин
 
Аватар для Олвин
 
Регистрация: 16.04.2008
Сообщений: 218
По умолчанию Работа с динамическими массивами типа record

Создал динамический массив такого типа:

Код:
type
  TNeedList = record
                Len, Num : cardinal;
              end;
var
  NeedList : array of TNeedList;
После этого задавал длину с помощью SetLength. При выходе из процедуры в которой объявлен массив программа вылетает с ошибкой Invalid pointer operation. Попытка сделать SetLength(NeedList, 0) ничего не меняет, а SetLength(NeedList, 1) даёт Access violation.

PS Вручную создавать связанный список лень =)
Для создания сложных вещей не нужны сложные интерфейсы. (с) Линус Торвальдс
Олвин вне форума Ответить с цитированием
Старый 12.07.2011, 02:41   #2
Ghost of Night
Форумчанин
 
Аватар для Ghost of Night
 
Регистрация: 08.08.2010
Сообщений: 371
По умолчанию

Может дело не в массиве?
Хакинг - не преступление, а способ выживания.

Последний раз редактировалось Ghost of Night; 12.07.2011 в 02:48.
Ghost of Night вне форума Ответить с цитированием
Старый 12.07.2011, 04:18   #3
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Дело не в этом массиве. У вас порча стека. Вы затираете переменную NeedList.

В программе есть статические массивы? Опция Range Check включена? Используются низкоуровневые процедуры типа Move, FillChar, ZeroMemory? Идёт работа с указателями?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 12.07.2011, 09:14   #4
Олвин
Экспериментатор
Форумчанин
 
Аватар для Олвин
 
Регистрация: 16.04.2008
Сообщений: 218
По умолчанию

Статических нет, есть еще один динамический. С указателями и низкоуровневыми процедурами не работаю.

Включил Range Check и понял, что дурак.. Ведь SetLength(NeedList, 100) дает NeedList[0..99], а не NeedList[1..100]. Вечером проверю - отпишусь.

UPD: всё верно, благодарю =)
Для создания сложных вещей не нужны сложные интерфейсы. (с) Линус Торвальдс

Последний раз редактировалось Олвин; 13.07.2011 в 02:08.
Олвин вне форума Ответить с цитированием
Старый 13.07.2011, 12:39   #5
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Так тоже будет работать создает список массивов память ячейкам вы ваделяете по мере надобности
Код:
type
  TNeedList = record
                Len, Num : cardinal;
              end;
var
  NeedList : array of TNeedList;
begin
SetLength(NeedList, 1);
NeedList[0].Len:=1;
SetLength(NeedList, 2);
NeedList[1].Len:=2;
showmessage(inttostr(NeedList[0].Len));
showmessage(inttostr(NeedList[1].Len));
//Это уничтожает весь моссив
SetLength(NeedList, 0);
Либо так но масив ограничен и сразу занимает память на 100 ячеек, это удобно когда мало параметров в массиве
Код:
type
  TNeedList = record
                Len, Num : cardinal;
              end;
var
  NeedList : array[0..99] of TNeedList; 
begin
NeedList[0].Len:=1;
NeedList[1].Len:=2;
showmessage(inttostr(NeedList[0].Len));
showmessage(inttostr(NeedList[1].Len));

Последний раз редактировалось Aliens_wolfs; 13.07.2011 в 12:48.
Aliens_wolfs вне форума Ответить с цитированием
Старый 13.07.2011, 20:51   #6
Олвин
Экспериментатор
Форумчанин
 
Аватар для Олвин
 
Регистрация: 16.04.2008
Сообщений: 218
По умолчанию

Aliens_wolfs, у меня почти так и есть. Только память выделяется один раз, но заранее неизвестно на сколько элементов. Вопрос в другом был - был выход за границы допустимого диапазона, поэтому при завершении процедуры вылетала ошибка. (видимо из-за автоматической очистки памяти)
Для создания сложных вещей не нужны сложные интерфейсы. (с) Линус Торвальдс
Олвин вне форума Ответить с цитированием
Старый 13.07.2011, 21:31   #7
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Ошибка вылетала когда записывали информацию в массив или когда читали с массива информацию?
Aliens_wolfs вне форума Ответить с цитированием
Старый 14.07.2011, 01:05   #8
Олвин
Экспериментатор
Форумчанин
 
Аватар для Олвин
 
Регистрация: 16.04.2008
Сообщений: 218
По умолчанию

Да всё, ошибки нет) А вылетала она (казалось - мистика) перед end-ом процедуры, в которой объявлен массив. Ну потом я включил Range Check и она (хотя уже другая) стала вылетать при записи элемента.
Для создания сложных вещей не нужны сложные интерфейсы. (с) Линус Торвальдс
Олвин вне форума Ответить с цитированием
Старый 14.07.2011, 01:13   #9
Ghost of Night
Форумчанин
 
Аватар для Ghost of Night
 
Регистрация: 08.08.2010
Сообщений: 371
По умолчанию

Цитата:
был выход за границы допустимого диапазона
Либо ставьте проверку, либо расширяйте границы.
Хакинг - не преступление, а способ выживания.
Ghost of Night вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с динамическими массивами San4o Общие вопросы Delphi 5 13.09.2009 21:15
Задача с динамическими массивами _grusha_ Помощь студентам 2 22.04.2009 19:46
Проблема с динамическими массивами Arassir Помощь студентам 2 11.11.2008 00:15