Форум: "Основная";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];
ВнизПамять и указатели Найти похожие ветки
← →
TUser © (2004-09-10 16:10) [0]Как будет размещена в памяти такая структура
PLock = ^TLock;
TLock = record
Next:PLock;
FirstFound:PFound; // Это некий указатель, неважно какой
StrandsAndLoops:array [0..5] of TStrandOrLoop;
Num:integer;
end;
где
TStrandOrLoop = record
Chain:char;
S, E:integer;
Sequence:string;
end;
Создаю это дело через New, вроде бы все должно работать. И все работает, но на таком вот участке кода получаю AV
var pl1,pl:PLock;
for i:=0 to 5 do begin
pl1^.StrandsAndLoops[i].Chain:=pl^.StrandsAndLoops[i].Chain;
pl1^.StrandsAndLoops[i].S:=pl^.StrandsAndLoops[i].S;
pl1^.StrandsAndLoops[i].E:=pl^.StrandsAndLoops[i].E;
pl1^.StrandsAndLoops[i].Sequence:=pl^.StrandsAndLoops[i].Sequence;
end;
Аналогично будет AV, если написать
for i:=0 to 5 do
pl1^.StrandsAndLoops[i]:=pl^.StrandsAndLoops[i];
Ctrl-F7 на pl^ показывает полную ерунду, которая никак не соотвествует тем значениям, которые присвоены этому pl. То, что изначально они присвоены правильно - в этом я точно уверен. Но складывается впечатление, что в этом месте pl указывает совсем непонятно куда, где лежит какая-то лажа.
В чем тут может быть дело.
PS. Понимаю, что трудно ответить на такой вопрос, не перекопав исходники всего проекта, но вдруг ...
← →
Digitman © (2004-09-10 16:14) [1]
> И все работает
а что, собссно, работает-то ? New() ?
← →
Ega23 © (2004-09-10 16:17) [2]New и pl и pl1 должно быть.
← →
TUser © (2004-09-10 16:18) [3]New работает. А вот когда я начинаю переписывать ин-цию из одного рекорда в другой, то получаю av. Хотя, повторюсь, данные точно загружены и память выделена. Это точно.
Т.е. указатель указывает куда-то куда ему хочется, а не куда я сказал.
Собственно главный вопрос, в котором я начал сомневаться - есть ли какие-нибудь особенности хранения такой записи в памяти. Учитывая, что там массив (статический) и строки. Хотя, раньше я с такими штуками работал, особых проблем не помню.
← →
TUser © (2004-09-10 16:18) [4]Да, new для всех есть.
← →
Digitman © (2004-09-10 16:21) [5]
> New работает
и для pl и для pl1 вызвана она ? или облажался и не заметил ?
← →
TUser © (2004-09-10 16:23) [6]См. [4]
← →
Digitman © (2004-09-10 16:28) [7]
> TUser © (10.09.04 16:23) [6]
а по-моему ты горбатого лепишь) ... что-то здесь не так как ты изложил ...
← →
Ega23 © (2004-09-10 16:36) [8]Если всё так, как ты говоришь, то должно работать.
Давай весь код.
← →
TUser © (2004-09-10 18:19) [9]
> Давай весь код.
Зачем? 3-4 десятка страниц, где память в одном месте выделяется, а через 25 страниц используется? Вряд ли ко-то добровольно будет это читать.
Просто начали одолевать меня сомнения - нет ли чего-то такого чего я не знаю, что мешает правильной работе с такими рекордами. Но, видимо, нет. Так что всем спасибо.
← →
Arm79 (2004-09-10 21:09) [10]TStrandOrLoop = record
Chain:char;
S, E:integer;
Sequence:string; - ShortString
end;
← →
Mim1 © (2004-09-10 21:57) [11]
> [10] Arm79 (10.09.04 21:09)
Ну ну.
← →
wnew © (2004-09-10 22:18) [12]Mim1 © (10.09.04 21:57) [11]
Обоснуйте, что значит "Ну ну".
По моему Arm79 (10.09.04 21:09)[10] правильно считает.
← →
Mim1 © (2004-09-13 10:14) [13]
> [12] wnew © (10.09.04 22:18)
А по моему нет, проблемма со string, shortstring из другой оперы. Использование string (ansistring) в динамичесих массивах, списках и подобных вещах у меня проблемм не вызывает. Единственное ограничение которое приходит мне в голову, это то что надо память выделять при помощи new, и освобождать при помощи dispose.
← →
PVOzerski © (2004-09-13 10:22) [14]Копаться лень мне... Навскидку: попробуй после new забить нулями StrandsAndLoops (или StrandsAndLoops[0].Sequence, ... , StrandsAndLoops[5].Sequence) через FillChar.
← →
evvcom © (2004-09-13 10:51) [15]
> Ctrl-F7 на pl^ показывает полную ерунду, которая никак не
> соотвествует тем значениям, которые присвоены этому pl
Помести pl^ по Ctrl-F5 и прошагай от присвоения до AV. Где-нибудь и заметишь изменение pl^. А так что еще предложить? Не анализировать же действительно нам 3-4 листа кода без отладчика!
← →
PVOzerski © (2004-09-13 10:57) [16]Я сейчас приведенный код в D3 прогнал - никакого AV. Правда, сделал FirstFound:pointer; но это явно не при чем.
← →
Arm79 (2004-09-13 11:48) [17]Mim1 © (13.09.04 10:14) [13]
Вообще то именно это я и имел в виду. Если использовать динамическое выделение памяти, то надо не забыть использовать его и для string. А использование ShortString позволяет избежать этого. Вот и все, собственно говоря.
PS Я лично стараюсь использовать не New/Dispose, а GetMem(AllocMem)/FreeMem
← →
TUser © (2004-09-13 11:54) [18]О! Все обсуждаете. Всем спасибо.
Баг я в субботу нашел, и жил он совсем не здесь.
← →
Mim1 © (2004-09-14 17:25) [19]
> [17] Arm79 (13.09.04 11:48)
> Если использовать динамическое выделение памяти, то надо
> не забыть использовать его и для string.
Не всегда.
> Я лично стараюсь использовать не New/Dispose, а GetMem(AllocMem)/FreeMem
Вот из зря, первые ничуть не лучше чем вторые, они просто разные.
Вот изза того что вы исполдьзуете getmem вам и приходится использовать shortstring в одних местая перерасходуя память а в других ограничивая размер строки и подобные вещи (типа pchar).
К стати вам про GetMem delphi не говорит всякими, варнингами, например что этого в дот нет не будет?
> [18] TUser © (13.09.04 11:54)
> О! Все обсуждаете.
В споре рождается истина. :) Или в вине. :)
← →
Arm79 (2004-09-14 22:47) [20]Mim1 © (14.09.04 17:25) [19]
Нет, мне Delphi ничего по этому поводу не говорит.
Про Дот.Нет не спорю, может так оно и есть, не работал.
Мне не приходиться использовать ShortString - я сам определяю степень допустимости его применения. Никаких ограничений по этому поводу у меня нет. Иногда использую в DLL. И я никогда не слышал о том, что размер Pchar надо ограничивать. Наверное, мало знаю.
Про string согласен, не всегда надо выделять под него вручную память, но при записи в файл, по моему, это делать просто необходимо.
Ин вино веритас!!! :-))
Это все мое субъективное мнение. Буду рад, если кто поправит.
← →
Mim1 © (2004-09-15 15:05) [21]:)
И так, разбор полетов.
1) не понимаю зачем вы DLL и файлы вспомнили, да это смежные темы, но к текущему обсуждению отношения не имеет.
2) вы меня не внимательно читали, или просто не поняли.
а) при работе с shortstring имееться ограничение на макс размер и перерерсаход памяти в общем случае.
б) при работе с pchar на размер ограничений нет кроме тех что вы придумаете сами, однако для работы с нми надо самостоятельно выделять память.
По сравнению с string эти два типа данных ИМХО проигрывают, однако вым приходится их использовать если вы брезгуете использованием new и dispose.
На сем предлагаю закончить обсуждение.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.038 c