Текущий архив: 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