IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

 
 Ответить  Открыть новую тему 
> Динамические массивы структур
сообщение
Сообщение #1


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Добрый день!

у меня вопрос, как узнать высоту динамического массива записей?

пытался так, однако возникает ошибка...

Код
type
     r = record
            i1,i2:integer;
     end;

     PDynArray = ^TDynArray;
     TDynArray = array[1..1] of r;

var
   a:PDynArray;
   i:integer;

begin
     writeln(high(a));
end.
может надо произвести разименование?



заранее благодарен.



--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
может надо произвести разименование?
Формально - надо, фактически - не поможет... Ты не получишь ничего, кроме 1. У тебя массив описан статически как [1 .. 1]? Вот его верхняя граница и будет возвращаться через High...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(volvo @ 24.11.2007 17:00) *
Ты не получишь ничего, кроме 1.
пока не выделю помять..(?)
хорошо, описываем как
TDynArray = array[0..1] of r;
запрашиваем
writeln(high(1));
зы
мне надо матрицу с двумя строками и динамическим количеством столбцов.

Сообщение отредактировано: compiler -


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата
пока не выделю помять..(?)
Нет, вообще... Даже если сделаешь так:
begin
getmem(a, 20*sizeof®);
writeln(high(a^));
end.
- все равно получишь 1, хотя размер - то равен 20...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(volvo @ 24.11.2007 17:22) *
Нет, вообще... Даже если сделаешь так:
begin
getmem(a, 20*sizeof®);
writeln(high(a^));
end.
- все равно получишь 1, хотя размер - то равен 20...
хорошо, тогда как поступать

high(a^[1]) ?



--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Повторяю: при использовании средств TP невозможно получить размер динамически выделенного массива (если только при выделении памяти не запоминать размер), поскольку:

Цитата(TP Help)
function High(X)
Returns the highest value in the range of the argument.

Remarks:
Result type is X, or the index type of X.
X is either a type identifier or a variable reference. The type denoted by X, or the type of the variable denoted by X, must be one of the following types.

Array type: the highest value within the range of the index type of the array
Понимаешь, в чем дело? Описывать-то тебе массив (для объявления указателя на него) придется либо [1 .. 1], либо [1 .. maxint div sizeof( R )], иначе смысл - то какой в динамическом массиве, если все известно на этапе компиляции? А вот как только ты описал этот массив, High сразу же будет возвращать конечное значение интервала, задающего индексы. Все, круг замкнулся...

Выход - одни из двух: либо (как я написал выше) использовать TP и запоминать размер выделяемого массива (кстати, вполне логично, его ж надо потом еще корректно удалить), либо 32-битный компилятор + SetLength, тогда размер (корректный) возвращается функцией Length.

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


что ж, спасибо.. будем заводить еще одну переменную поскольку задание необходимммо решить именно на ТП...



--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 16:35
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name