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

Вниз

Динамический массив   Найти похожие ветки 

 
grisme ©   (2006-03-16 17:14) [0]

Возник вопрос. Почему при попытке записать в, хех, динамическую матрицу возникает AV? Вот код:
var
Bits:array of array of array [0..2] of GLUByte;
...
begin
  SetLength(Bits,SizeOf(GLUByte)*MX*MY);
  bits[0][0][0]:=<число>; //вот тут
end;
Может нельзя так делать(а то я вот обнаглел так :)?Или альтернатива есть?:) Подскажите плиз!


 
Джо ©   (2006-03-16 17:17) [1]

SetLength (Bits, Длина_первого_дин_массива,Длина_второго_дин_массива);


 
Fredericco ©   (2006-03-16 17:18) [2]

SetLength(Bits,1);
SetLength(Bits[0],1);
SetLength(Bits[0][0],1);

bits[0][0][0]:=<число>; // по идее не должно быть


 
grisme ©   (2006-03-16 17:23) [3]

Спасибо за ответы. Протестил - ошибка все возникает..:(


 
Fredericco ©   (2006-03-16 17:25) [4]

В моем посте третий SetLength - лишний.


 
Джо ©   (2006-03-16 17:26) [5]

> [3] grisme ©   (16.03.06 17:23)
> Спасибо за ответы. Протестил - ошибка все возникает..:(

Значит, у тебя ошибка в коде.
---
Можешь описать обычными словами то, что ты имел в виду в объявлении
array of array of array [0..2] of GLUByte;
?


 
grisme ©   (2006-03-16 17:29) [6]

Спасибо всем, Fredericco © - особенно. Впервые столкнулся с дин. матрицей. Не знал, что так надо...:) Спасибо всем ОГРОМНОЕ - так сразу - много ответов :)


 
Cash ©   (2006-03-16 17:32) [7]

grisme ©:
На русском ваш код звучит как:
Begin
 Выделить память под Bits размером с (MX*MX)*(длина в байтах для GLUByte) ячеек.
 Обратиться к [(MX*MX)*(длина в байтах для GLUByte)+1] ячейке Bits.
end;

Ну конечно же AV будет вылезать! память то там не размечена.
А еще удобно под дебагером эти штуки смотреть. Там всегда скажут,
где прога криво сработала.

Я бы советовал сделать так:
чтобы не путаться в том месте, где у нас ранжированный массив, а где
динамический.

Type
 TGLUByteVec = array [0..2] of GLUByte;
 TGLUByteMap = array of array of TGLUByteVec;
var
 Bits: TGLUByteMap;
begin
 Finalize(Bits);
 SetLength(Bits,MX,MY);
 Bits[0,0,0]:=anydigit;
end;


 
Джо ©   (2006-03-16 17:35) [8]

[7] Cash ©  
> Finalize(Bits);

А это зачем?


 
Cash ©   (2006-03-16 17:40) [9]

Джо ©   (16.03.06 17:35) [8]:
Если этот код надо вызывать несколько раз,
к примеру для разных MX и MY, то Bits надо сначала
финализировать, то есть освободить занимаемую им память.

После SetLength финализация может быть проведена только так,
иначе типа некорректно.


 
McSimm ©   (2006-03-16 17:42) [10]


> После SetLength финализация может быть проведена только
> так,
> иначе типа некорректно.
>

Что-то странное для меня в ваших словах... можно подробнее или источник ?


 
Джо ©   (2006-03-16 17:46) [11]

> [9] Cash ©   (16.03.06 17:40)

Динамические массивы финализируются автоматически. Даже если бы это было не так, ваше finalize локальной переменной все-равно было бы бессмысленным.


 
Cash ©   (2006-03-16 17:49) [12]

Из справки Delphi:

Uninitializes a dynamically allocated variable.

Unit

System

Category

dynamic allocation routines

Delphi syntax:

procedure Finalize( var V [; Count: Integer] );

Description

Finalize should be used only in Delphi code where a dynamically allocated variable is deallocated by other means than the Dispose procedure. Dynamic arrays can never be deallocated using the Dispose procedure, but can be freed by passing them to Finalize.

For global variables, local variables, objects, and dynamic variables deallocated using Dispose, the compiler generates code that finalizes all long strings, variants, and interfaces contained by the variable when the instance is destroyed.

If a dynamic variable meets the following two conditions, a call to Finalize is required to finalize the variable before it can be deallocated.

The variable is deallocated by other means than the Dispose standard procedure (for example using FreeMem).
The variable contains long strings, variants, or interfaces, not all of which are empty or Unassigned.

Finalize simply sets all long strings to empty and all variants and interfaces to Unassigned, thus properly releasing any memory that was referenced by the long strings and variants.

In cases where several variables are deallocated in a contiguous memory block such as a dynamically allocated array of strings, the additional Count parameter can be specified to finalize all variables in one operation.

If the variable specified in a call to Finalize contains no long strings, variants, or interfaces, the compiler eliminates the call and generates no code for it.


А из моих лекций по ООП становится ясно, что:
1) без освобождения происходит утечка памяти
2) освобождать можно еще и так (Bits:=nil), это тоже верно
3) освобождать можно с помощью freemem или Dispose, но это не всегда катит и неправильно!


 
Джо ©   (2006-03-16 17:57) [13]

[12] Cash ©   (16.03.06 17:49)
> If the variable specified in a call to Finalize contains
> no long strings, variants, or interfaces, the compiler eliminates
> the call and generates no code for it.

Читать и думать.


 
McSimm ©   (2006-03-16 18:00) [14]


> 1) без освобождения происходит утечка памяти
> 2) освобождать можно еще и так (Bits:=nil), это тоже верно
> 3) освобождать можно с помощью freemem или Dispose, но это
> не всегда катит и неправильно!

1) освобождение происходит автоматически, но не в начале процедуры, как у вас, а в конце, как правильно
2) попробуйте
3) можно и нужно. после getmem и new.


 
DiamondShark ©   (2006-03-16 18:03) [15]


> А из моих лекций по ООП становится ясно, что:

А из описания соответствующих типов и окна CPU становится ясно, что если процедура содержит локальные переменные с управляемым временем жизни (длинные строки, дин.массивы, варианты и интерфейсы), то компилятор генерит аналог такого кода:

AutoVar := <empty>;
try
 <procedure body>
finally
 Finalize(AutoVar)
end;


 
grisme ©   (2006-03-16 18:06) [16]

А все-таки интересно, почему такая ошибка? Вроде, элементы в памяти расположены последовательно и я дал длинну массиву, равную объему "псевдо-куба", занимаемого 3D-матрицей...:( т.е.
SetLength(Bits,SizeOf(GLUByte)*MX*MY); Глубину не указал, т.к. она уже выделяется при загрузке, иначе можно было бы домножить на 3.:) Или как?


 
Cash ©   (2006-03-16 18:09) [17]

Ох... и чего мне везет на спорунов.... :)))
Споруны - это такие люди, которые либо уже весь мир задрали, либо
весь мир уже задрал их, потаму, что они его уже задрали. :)))

В вашей линии рассуждений прослеживается крайне узкий диапазон
примеров и, как следствие, наличие огромного рога, каторым вы  и
уперлись во всего в одну процедурку. :)))

ЗЫ: с психо-физиологом - программистом иногда бывает очень сложно! :)))
(я то уже все увидел, а вы оба еще нет, т. е. у меня есть большой дробовик
для двух носорогов!) :)))))))


 
DiamondShark ©   (2006-03-16 18:10) [18]


> А все-таки интересно, почему такая ошибка?

А ведь наводящий вопрос уже был: сказать по-русски, что означает такое объявление типа.


 
Romkin ©   (2006-03-16 18:11) [19]

Не так. Сделав длину первого измерения, ты разметил пространство для массива указателей на подмассивы :)))
Не инициализировав их.


 
Джо ©   (2006-03-16 18:11) [20]

> [17] Cash ©   (16.03.06 18:09)

"Спорун" как раз ты, в данном случае. Ибо высказал соображения весьма спорного характера.


 
Cash ©   (2006-03-16 18:14) [21]

Джо ©   (16.03.06 18:11) [20]:
Чему равна локальная переменная типа TGLUByteMap сразу после begin-а?


 
grisme ©   (2006-03-16 18:17) [22]

Romkin ©   (16.03.06 18:11) [19]
Ясно, спасибо за разъяснение...:)

2All: Не серчайте, господа, все мы учимся - "Век живи - век учись".;) Да и казалось бы мелочи не знал - теперь уяснил.


 
Джо ©   (2006-03-16 18:23) [23]

> [21] Cash ©   (16.03.06 18:14)
> Джо ©   (16.03.06 18:11) [20]:
> Чему равна локальная переменная типа TGLUByteMap сразу после
> begin-а?

Предполагаю, что в ней будет храниться нулевая ссылка, т.е, nil.


 
Cash ©   (2006-03-16 18:25) [24]

Джо ©   (16.03.06 18:23) [23]:
Чему равна глобальная переменная этого типа сразу после бегина?


 
McSimm ©   (2006-03-16 18:28) [25]

а где там глобальная переменная ?


 
Cash ©   (2006-03-16 18:29) [26]

McSimm ©   (16.03.06 18:28) [25]:
А забей на "где там".... или не знаешь? :D


 
McSimm ©   (2006-03-16 18:29) [27]

впрочем - неважно.


 
Джо ©   (2006-03-16 18:29) [28]

> [24] Cash ©   (16.03.06 18:25)
> Джо ©   (16.03.06 18:23) [23]:
> Чему равна глобальная переменная этого типа сразу после
> бегина?

В какой момент времени исполнения?


 
Cash ©   (2006-03-16 18:33) [29]

Джо ©   (16.03.06 18:29) [28]:

> Cash ©   (16.03.06 18:25) [24]
> Джо ©   (16.03.06 18:23) [23]:
> Чему равна глобальная переменная этого типа сразу после
> бегина?


Еще раз, сразу после бегина!!!

(чуишь... бОООльшой дробовик, один уже сбёх...)
:)))


 
Джо ©   (2006-03-16 18:35) [30]

> [29] Cash ©   (16.03.06 18:33)
> Еще раз, сразу после бегина!!!

Еще раз: В какой момент времени исполнения?


 
McSimm ©   (2006-03-16 18:36) [31]


> Cash ©   (16.03.06 18:33) [29]

у меня нет на глупости времени.


 
Cash ©   (2006-03-16 18:37) [32]

Джо ©   (16.03.06 18:35) [30]:
Без разницы!
Не знаешь, так и говори!
(и тогда.... люблю коллекционировать головы носорогов)! :)))


 
Cash ©   (2006-03-16 18:38) [33]

McSimm ©   (16.03.06 18:36) [31]:
А у меня есть?
Я всего лишь бедный охотник! :)))


 
McSimm ©   (2006-03-16 18:39) [34]

сразу после бегина переменная принимает разные значения в разные моменты времени исполнения.


 
McSimm ©   (2006-03-16 18:39) [35]

но и это абсолютно неважно.


 
Cash ©   (2006-03-16 18:40) [36]

McSimm ©   (16.03.06 18:39) [34]:
Не верно! Это не точный ответ, выходящий за рамки вопроса!
(одна голова уже срублена!) :)))


 
McSimm ©   (2006-03-16 18:41) [37]


> Cash ©   (16.03.06 18:38) [33]

вместо чтобы выпендриваться (уж извините) попробовали бы разобраться в той каше, что у вас получилась от смеси невнимательного чтения документации и уроков ООП


 
Cash ©   (2006-03-16 18:44) [38]

McSimm ©   (16.03.06 18:41) [37]:
:D :D :D :D :D :D :D :D :D :D :D :D
Чую... кое что! Насквозь вижу! :D


 
Cash ©   (2006-03-16 18:47) [39]

McSimm ©   (16.03.06 18:41) [37]:
Я без смущения могу объяснить.... если!
Если вы оба этого попросите, но, думаю, вы знаете что это будет означать!
:)))))


 
V°   (2006-03-16 18:47) [40]

Удалено модератором



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

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

Наверх




Память: 0.55 MB
Время: 0.015 c
1-1141745031
Кефир87
2006-03-07 18:23
2006.04.09
Минимизация НЕ главной формы


15-1142247003
Pearled
2006-03-13 13:50
2006.04.09
Помогите найти книгу "Системное программное обеспечение"


1-1141736802
aleshap
2006-03-07 16:06
2006.04.09
Помогите вернуть курсор......


15-1142488998
Ega23
2006-03-16 09:03
2006.04.09
С Днём рождения! 16 марта


2-1143458664
VAZMan
2006-03-27 15:24
2006.04.09
Record





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский