39 / 2 / 1
Регистрация: 24.11.2012
Сообщений: 246
1

Как создать record внутри которого есть динамический массив с record-ами?

27.12.2015, 20:06. Показов 3217. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Упрощу код, чтоб не писать полные record-ы:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
type
  TSec = record
    vSize : DWord;
    vAddr : DWord;
    rSize : DWord;
    rAddr : DWord;
    Flag : DWord;
  end;
  TArrOfSec = Array Of TSec;
  TPeInf = record
    BaseOfCode : DWord;
    Flag : Word;
    NumberOfSection : Word;
    Sections : TArrOfSec;
  end;
var
  filePE : TPeInf;
begin
  NumberOfSection:= $7;
  SetLength(filePE.Sections, NumberOfSection); //вот тут ошибка,"E2197 Constant object cannot be passed as var parametr
Ясно, что память под запись уже выделена, а я пытаюсь ее увеличить. Но как вообще создавать record с переменным размером?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.12.2015, 20:06
Ответы с готовыми решениями:

Создать массив потоков -- Record, object or class type required
Всем привет! Такая вот проблема, имеется массив из десяти объектов класса потока. ... ...

Голосовалка, ошибка: Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record.
Вопросы по голосовалке с ответами, из базы вытаскиваются, при нажатии на ГОЛОСОВАТЬ результаты...

Ошибка Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record
Большое спасибо всем кто хоть что-нибудь подскажет или наведёт на нужную мысль!! Короче...

ADODB.Field error '80020009' Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record.
Выдается следующая ошибка : === ADODB.Field error '80020009' Either BOF or EOF is True, or...

23
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
27.12.2015, 20:09 2
Цитата Сообщение от Kuzya69 Посмотреть сообщение
как вообще создавать record с переменным размером?
С чего бы он переменный ?
Как он был равен SizeOf(TPeInf), так им и останется, вне зависимости от того вызывал ты SetLength или не вызывал.

Размер записи вычисляется на стадии компиляции, а не в ранрайм
0
39 / 2 / 1
Регистрация: 24.11.2012
Сообщений: 246
27.12.2015, 20:11  [ТС] 3
Ну и как быть в моем случае?
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
27.12.2015, 20:16 4
а что тебя смущает ?
0
39 / 2 / 1
Регистрация: 24.11.2012
Сообщений: 246
27.12.2015, 20:17  [ТС] 5
Не компилируется, я же в коде написал ошибку.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
27.12.2015, 20:20 6
а чем собссно не угодили списки ?
0
39 / 2 / 1
Регистрация: 24.11.2012
Сообщений: 246
27.12.2015, 20:22  [ТС] 7
Просто так что-ли вопросы задаете? Вас мои ответы не интересуют? Или я не понимаю ваших вопросов?
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
27.12.2015, 20:29 8
У меня нет такой ошибки - все нормально компиляется.
0
39 / 2 / 1
Регистрация: 24.11.2012
Сообщений: 246
27.12.2015, 20:31  [ТС] 9
Спасибо, пойду косяк в коде искать. Видимо где-то в передачах в функцию, потерял свойство var этого массива.
Просто тут я код упростил. А у меня там посложнее, этот рекорд передается туда-сюда.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
27.12.2015, 20:40 10
Цитата Сообщение от Kuzya69 Посмотреть сообщение
этот рекорд передается туда-сюда
потому и поинтересовался почему бы не использовать объекты, а не записи

объекты всегда представлены указателями
0
39 / 2 / 1
Регистрация: 24.11.2012
Сообщений: 246
27.12.2015, 20:44  [ТС] 11
Просто внешний рекорд я заполняю в два захода с помощью CopyMemory прямо из открытого файла (а там во внешнем, побольше будет переменных, чем я написал). А у объекта не известно, как в памяти выстроятся адреса переменных. У записей они точно идут друг за другом.
PS
Нашел, сам был виноват, для красоты скобки лишние поставил.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
27.12.2015, 20:47 12
Цитата Сообщение от Kuzya69 Посмотреть сообщение
внешний рекорд я заполняю в два захода с помощью CopyMemory прямо из открытого файла
Надеюсь поле Sections при этом не затрагивается ?

Цитата Сообщение от Kuzya69 Посмотреть сообщение
у объекта не известно, как в памяти выстроятся адреса переменных. У записей они точно идут друг за другом
Объект по сути - та же запись.
0
39 / 2 / 1
Регистрация: 24.11.2012
Сообщений: 246
27.12.2015, 20:51  [ТС] 13
Цитата Сообщение от mss Посмотреть сообщение
Надеюсь поле Sections при этом не затрагивается ?
Ну естественно, для Sections, пока только пишется код.
Цитата Сообщение от mss Посмотреть сообщение
Объект по сути - та же запись.
Не стал разбираться. С рекордами точно уверен, потому-что долго их в дизассемблере гонял, чтоб убедиться. Кстати вместо record я использую packed record, чтоб не было выравнивания.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
27.12.2015, 20:55 14
Цитата Сообщение от Kuzya69 Посмотреть сообщение
С рекордами точно уверен
Ну и с объектами все точно так же - смещения полей соответствуют порядку их объявления

Добавлено через 59 секунд
Цитата Сообщение от Kuzya69 Посмотреть сообщение
вместо record я использую packed record, чтоб не было выравнивания
И это правильно.
0
39 / 2 / 1
Регистрация: 24.11.2012
Сообщений: 246
27.12.2015, 21:03  [ТС] 15
Цитата Сообщение от mss Посмотреть сообщение
Ну и с объектами все точно так же - смещения полей соответствуют порядку их объявления
А если объект сложный, как вот я объявляю? Между первым элементом массива и последним элементом внешней записи, не будет никаких служебных байт? Или то-же самое, но между последним элеменом массива и следующим элементом внешней записи?

Добавлено через 2 минуты
А стоп, затупил. Прошу прощения. Тут-же не массив а указатель на него.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
27.12.2015, 21:07 16
Цитата Сообщение от Kuzya69 Посмотреть сообщение
Тут-же не массив а указатель на него
Именно так.
А размер указателя всегда одинаков для выбранной платформы.
0
39 / 2 / 1
Регистрация: 24.11.2012
Сообщений: 246
27.12.2015, 21:10  [ТС] 17
Цитата Сообщение от mss Посмотреть сообщение
размер указателя всегда одинаков для выбранной платформы.
Тоесть, если я буду использовать свою программу на 64-х битной ОС, то указатель изменит размерность на QWord? Даже если программа будет 32-х битная.
Или все-же прокладка wow64, оставит DWord?
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
27.12.2015, 21:13 18
Цитата Сообщение от Kuzya69 Посмотреть сообщение
Или все-же прокладка wow64, оставит DWord?
Компилятор не знает ни о каких "прокладках".
Ему сказали что приложение должно работать в 32-битном окружении - он строит код на базе 32-битных указателей.
Скажут про 64-битное - будет опираться на 64-битные.
0
39 / 2 / 1
Регистрация: 24.11.2012
Сообщений: 246
27.12.2015, 21:16  [ТС] 19
Понятно, значит под словом "платформа" подразумевалось "платформа компилятора", а не "платформа ОС".
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
27.12.2015, 21:20 20
Платформа компилятора однозначно связана с целевой ОС-платформой.
dcc64 генерит код для 64-битной ОС-платформы, dcc32 - для 32-битной
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.12.2015, 21:20
Помогаю со студенческими работами здесь

Послать/принять динамический Record через сокеты
Здравствуйте! Мне нужна Ваша помощь. Я не могу понять, как передать динамическую структур через...

Массив: Как заполнить массив, и как добраться до элемента массива record'ов?
Как заполнить массив, и как добраться до элемента массива record'ов? type myrec = record ...

Record: определить марку вина, которого больше всего на складе
Дан текстовый файл vine.txt, лежащий в корневом каталоге. Файл построен следующим образом: в каждой...

Копирование из RECORD в RECORD
Всем привет. Пытаюсь разобраться. Есть переменная типа записи, в нее нужно скопировать ячейку...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru