Текущий архив: 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]Удалено модератором
← →
Геро (2006-03-16 18:49) [41]
> Cash ©
Детский сад находится в другом месте.
← →
Kerk © (2006-03-16 18:55) [42]Cash © (16.03.06 18:47) [39]
Из-за таких как ты слово "студент" и ассоциируется у многих работодателей с "полный придурок".
← →
DiamondShark © (2006-03-16 19:02) [43]Он не студент, он кащенит.
← →
Джо © (2006-03-16 19:04) [44]> [43] DiamondShark © (16.03.06 19:02)
> Он не студент, он кащенит.
Ой, а что это такое? Раз уж тема загажена, хоть новое слово для себя узнаю :)
← →
DiamondShark © (2006-03-16 19:07) [45]http://ru.wikipedia.org/wiki/%D0%9A%D0%B0%D1%89%D0%B5%D0%BD%D0%B8%D1%82%D1%8B
← →
Джо © (2006-03-16 19:08) [46]> [45] DiamondShark © (16.03.06 19:07)
О, спасибо! Заодно и "шушканчика" для себя прояснил :)
← →
Джо © (2006-03-16 19:08) [47]тьфу, шушпанчика.
← →
Cash © (2006-03-16 19:11) [48]Я просто не люблю спрорить.
И для отбивания такого желания у остальных применяю психоанализ.
Товарищи Джо и McSimm, уверяю, я еще не последние меры принял!
Раз уж была придирка и выход на спор, на то, чего я не люблю,
пришлось между вами обоими распределить мои негативные эмоции.
Реверсивная тяга, которая ваше желание превратила в ваши же обиды
по средствам одного трансмиттера.
И из за чего? Из за одной процедурки! Не велика ли цена?
← →
Геро (2006-03-16 19:15) [49]
> Cash © (16.03.06 19:11)
Что куришь, поделись с остальными.
← →
Джо © (2006-03-16 19:16) [50]> [48] Cash © (16.03.06 19:11)
> Я просто не люблю спрорить.
> И для отбивания такого желания у остальных применяю психоанализ.
Дружище, видимо вы профан не только в Делфи.
← →
Cash © (2006-03-16 19:19) [51]Геро (16.03.06 19:15) [49]:
:)))
То же, что и все! :)))
У меня за стенкой чуваки бывает бурбулятором балуются, дак и не грех
компашку поддержать! :)))
← →
Геро (2006-03-16 19:22) [52]
> Cash © (16.03.06 19:19)
А, тогда вопросов нет. Только не надо после «баловства» в форум лезть. Лучше прогуляться, попить, покушать. Легче станет.
← →
Cash © (2006-03-16 19:23) [53]Джо © (16.03.06 19:16) [50]:
Ты тоже не выдержал испытания, твоя голова тоже над моим камином! :)))
Да, чтоб товарищь grisme не потерял линк,
Все разумные ответы расположены до поста [8], дальше было только
разводилово. :)
← →
Cash © (2006-03-16 19:24) [54]Геро (16.03.06 19:22) [52]:
Заметано! :)))
← →
Джо © (2006-03-16 19:25) [55]> [53] Cash © (16.03.06 19:23)
А пост [7] что делает среди "разумных ответов"?
← →
Cash © (2006-03-16 19:28) [56]Джо © (16.03.06 19:25) [55]:
Найди и покажи мне хоть одно слово поперек всех предыдущих постов.
(ЗЫ: а откуда ты знаешь, что я не пустил тебя по второму кругу? :))))
← →
Джо © (2006-03-16 19:36) [57]> [56] Cash © (16.03.06 19:28)
> Джо © (16.03.06 19:25) [55]:
> Найди и покажи мне хоть одно слово поперек всех предыдущих
> постов.
> (ЗЫ: а откуда ты знаешь, что я не пустил тебя по второму
> кругу? :))))
Я не знаю, о каких "кругах" ты говоришь. Пока вижу перед собой шута.
← →
Kerk © (2006-03-16 19:42) [58]Джо © (16.03.06 19:36) [57]
Пока вижу перед собой шута.
Ну да. Просто клоун.
← →
Cash © (2006-03-16 19:43) [59]ЛОЛ!
Вот и настоящий кащенит нашелся!
Совет, не цапайся больше с психо-физиологами.
(а ведь психоанализ это всего лишь хобби!)
Cash out.
← →
Джо © (2006-03-16 19:45) [60]Завидую людям, пишут бред и не комплексуют.
← →
Kerk © (2006-03-16 19:49) [61]Cash © (16.03.06 19:43) [59]
Во. Растешь в моих глазах. Ты не просто клоун, ты хороший клоун. LOL.
> Совет, не цапайся больше с психо-физиологами.
Может ты еще и ксенобиолог? :)))))))))
← →
Anatoly Podgoretsky © (2006-03-16 21:45) [62]Kerk © (16.03.06 19:49) [61]
Не трожь Алиску
Страницы: 1 2 вся ветка
Текущий архив: 2006.04.09;
Скачать: CL | DM;
Память: 0.61 MB
Время: 0.013 c