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

Вниз

Память и указатели   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.027 c
6-1088472470
Глеб
2004-06-29 05:27
2004.10.03
Как мне узнать IP-адрес компьютера в сети, зная его имя?


3-1094193006
R.O.O.T
2004-09-03 10:30
2004.10.03
DBGrid - получение данных


14-1094824005
chver
2004-09-10 17:46
2004.10.03
Работа


10-1017741770
Олег Лаукарт
2002-04-02 14:02
2004.10.03
передача параметров в XML виде


4-1092994681
eli
2004-08-20 13:38
2004.10.03
Как узнать раскладку клавиатуры