Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.043 c
6-1090492324
Duk
2004-07-22 14:32
2004.10.03
Как с п-ю TMemoryStream переслать текст от ServerSocket к ClienSo


3-1094586493
sherbacov
2004-09-07 23:48
2004.10.03
протоколирование БД


14-1095349300
DimOn2
2004-09-16 19:41
2004.10.03
Вкладка


1-1095343895
M-Alex
2004-09-16 18:11
2004.10.03
Командная строка


1-1095657753
prorok2
2004-09-20 09:22
2004.10.03
Форма и сообщения системы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский