Speicherverwaltung allgemein ...

mactoolz
2010-12-27
2011-02-02
  • mactoolz - 2010-12-27

    Hallo zusammen,

    ich denke ich werde mal ein neues Thema eröffnen.

    Ich schlage mich die ganze Zeit mit der Speicherverwaltung rum. Rumschlagen sieht bei mir so aus das
    ich gerade mit den Zeiger im CoDeSys V2.3 experimentiere. Wie ich schon erfahren habe
    gibt es keinen New Operator oder typenlose Zeiger, gut so weit.

    1.
    Was ich gerade nicht verstehe ist was ich mit der Methode SysMemAlloc in CoDeSys erreiche.
    Ich frage deswegen weil, ich festgestellt habe dass es eigentlich egal ist wann ich Speicher allokiere,
    so wie es aussieht wird eh Speicher in CoDeSys reserviert sobald Variabeln in einem FB deklariert sind.

    2.
    Dann ist mir noch aufgefallen das für eine leere FB Instanz grundsätzlich immer ein Byte als Speicher reseriert wird. Warum ???

    3.
    Was passiert mit dem Speicher wenn in einem FB lokale Variabeln als Typ Zeiger auf eine Struktur beinhaltet ???

    pntExpKonv:POINTER TO Struktur

    Ist nach dem kompalieren für die gesamte Struktur schon Speicher reserviert worden oder nur für den Zeiger?
    Die Struktur besitzt mehrere Stringvariabeln von einer Länge mit 255 Zeichen, Bools etc.
    Ich habe zwar den test gemacht und über SizeOf mir die Größe ausgeben lassen aber diese stimmt meiner Meinung nach nicht.
    SizeOf liefert mir eine FB Größe von 40Bytes.

    4.
    Was geschieht hier mit der Speicherrervierung wenn ich diesen Typ irgendwo deklariere ???

    TYPE tType_FB : POINTER TO ARRAY[0..9] OF FB_ExpKonv;
    END_TYPE

    Eigentlich sollten doch eine Größe von 4Byte je Zeiger als Speicher reserviert werden.
    Wird die SysMemAlloc Methode aufgerufen sollten doch mit einem SizeOf von FB erst dann Speicher der Größe vom FB reserviert werden.
    Dem ist meiner Meinung nach nicht so, der Speicher ist schon vor dem Speicher allokieren reserviert.

    dwDword := SIZEOF(tType^);

    pntTemp := SysMemAlloc(SIZEOF(tType));

    5.
    Dann kommt noch dazu das ich in meinem FB VarInOut Variabeln deklariert habe,
    über das SizeOf werden nur diese Variabeln als Speichergröße zurück gegeben
    aber nicht mein Pointer auf eine Struktur.

    Warum das aufeinmal ??? Wo ist der Speicher denn hin.

    pntExpKonv:POINTER TO _;

    Fragen über Fragen wer blickt hier noch durch, wer kann da helfen.

    mfg

    MacToolz

     
  • franzhoepfinger - 2011-01-07

    geh mal auf den FTP Server von 3S und schau dir das Beispiel über verkettete Listen an.

    Gruß,
    Franz

     
  • RolandWagner

    RolandWagner - 2011-01-10

    Hallo,

    nur gleich zur "Vorwarnung" : das Beispiel mit den verketteten Listen erfordert CoDeSys V3. Da ist die Objektorientierung jetzt implementiert...

     
  • mactoolz - 2011-01-28

    Hallo zusammen,

    verkette Listen sind mir schin zum Teil ein Begriff.

    Das beantwortet aber nicht wie CoDeSys mit Speicherreservierung von FBs etc umgeht.

    Ich befinde mich immer noch in der CoDeSys V.2.3.

    Für mich ist immer noch unklar wann und wie groß der Speicher für einen FB ist.

    MacToolz

     
  • Erik Böhm - 2011-02-01

    Mahlzeit

    Warum willst, bzw musst du das eigentlich wissen ?
    Ich programmiere schon seit Jahren jeden (Arbeits)Tag mit Codesys und habe mir über diese Thema noch gar nie Gedanken machen müssen...
    Es ist nicht wie in diversen Hochsprachen, das man sich um Belegung, bzw Freigabe des verwendeten Speichers kümmern muss.
    Ich lass das alles CoDeSys machen.

    Gruß
    Erik

     
  • Erik Böhm - 2011-02-01

    Hallo nochmal

    Ich versuche mal auf die einzelnen Punkte zu antworten, soweit ich das verstehe.

    1. Stimmt.

    2. Keine Ahnung.

    3. Ich würde sagen, der Zeiger belegt wie immer 4Byte. Die Größe der Struktur ist hier ja noch völlig unmassgeblich.

    4. So weit ich das verstehe, erzeugst du einen Pointer auf ARRAY[0..9] OF FB_ExpKonv. Diese 10 Instanzen sind ja aber schon irgendwo deklariert, oder ?
      Sonst macht ein Pointer auf deiese ja keinen Sinn. Wenn sie aber schon deklariert sind, dann belegen sie auch Speicher.
      Wofür soll denn das SysMemAlloc dann noch gut sein ?

    5. VarInOut sind ja auch nichts anderes als Pointer auf irgendwas. Belegen also jeweils 4 Byte.

    Ich habe aber den Compiler auch nicht geschrieben, deshalb: Keine Garantie auf Richtigkeit dieser Aussagen.

    Gruß
    Erik

     
  • franzhoepfinger - 2011-02-02

    Roland Wagner hat geschrieben:
    Hallo,
    nur gleich zur "Vorwarnung" : das Beispiel mit den verketteten Listen erfordert CoDeSys V3. Da ist die Objektorientierung jetzt implementiert...

    ich meinte das: Projects\CoDeSysV2.3\Other\DynamicList

    dort wird auch intensiv "SysMemAlloc" geschossen ....

     

Log in to post a comment.