Массив записей (проблема с доступом) [Delphi]

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by mr. ZetRikS, 29 Mar 2010.

  1. mr. ZetRikS

    mr. ZetRikS New Member

    Joined:
    17 Jul 2009
    Messages:
    45
    Likes Received:
    2
    Reputations:
    0
    Вот собственно суть проблемы есть несколько типов:
    Code:
    //тип 1
    type
      TTMyType1 = Record
       isLinked: SmallInt; 
       ToT: string;
       ToC: Integer;
    end;
    
    //тип 2
    type
      PMyType2 = ^TMyType2;
      TMyType2 = record
       CNa: string;
       CTy: SmallInt;
       isa: SmallInt;
       Sa: TTMyType1;
    end;
    
    //тип 3
    type
      PMyType3 = ^TMyType3;
      TMyType3 = record
       ExName: string;
       ExParam: array [0..100] of PMyType2;
    end;
    
    Вот... далее создаём глобальную переменную типа массив PMyType3, и пытаемся поюзать...

    var
    qwerty: array [0..10] of PMyType3; //создали массив записей типа PMyType3

    и далее где угодно в программе пытаемся поюзать
    qwerty.ExName:= 'текст_значения';
    и так далее, но вот трабл, при таком обращении программка говорит Access violaton бла бла бла, в общем на сколько я понял, объект вроде как есть, но память под него не выделена, хотя он не динамичен, то есть размеры объявлены заранее...

    варианты решения проблемы?
    заранее спс...
     
  2. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Нужно выделять память с помощью процедуры New, и освобождать с помощью Dispose.
    То есть:
    Code:
    var
      test: PMyType3;
    begin
      New(test);
      test.ExName:= 'текст_значения';
      ...
      Dispose(test);
    end;
    По моему так должно быть, хотя точно не уверен.
     
    1 person likes this.
  3. maestro-ant

    maestro-ant New Member

    Joined:
    7 Jan 2007
    Messages:
    26
    Likes Received:
    4
    Reputations:
    6
    Chrome~
    Неправильно подсказываешь! Память у него уже выделена.

    mr. ZetRikS
    проблема в том что ты создаешь массив из указателей на указатели. и пытаешься к нему обратится на прямую.

    вот так объяви массив
    Code:
    qwerty: array [0..10] of TMyType3;
    и будет все гуд

    ЗЫ Пользуйтесь отладчиками
     
    #3 maestro-ant, 30 Mar 2010
    Last edited: 30 Mar 2010
    1 person likes this.
  4. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Да нет же, maestro-ant, это ты не умеешь правильно работать с динамической памятью.

    Посмотри, как правильно должно быть реализовано в данном случае:

     
    1 person likes this.
  5. mr. ZetRikS

    mr. ZetRikS New Member

    Joined:
    17 Jul 2009
    Messages:
    45
    Likes Received:
    2
    Reputations:
    0
    Так и есть, вопрос исчерпан...

    правд ещё косяк был, пришлось в типе 3 вместо PMyType2 использовать так же тип, а не указатель на него...

    Всегда так работал (за пять лет таких проблем не случалось), а тут подсказали мол лучше использовать указатели на тип... Для чего особо не понял, но вот собственно и парился пару дней, кстати с типом пробовал, но так как в типе 3 есть переменная ууказателя на тип, вот тут косяк и не увидел, только сейчас когда подсказали узрел...

    Спасибо что уделили время моей проблеме... поставил + обим...