Dynamisches Array

mactoolz
2008-04-04
2008-04-11
  • mactoolz - 2008-04-04

    Hallo zusammen und guten Morgen,

    besteht die Möglichkeit ein dynamisches Array zur Laufzeit initialisieren zu können. ???

    MacToolz

     
  • mwatermann - 2008-04-04

    eigene funktion schreiben und array mit sizeof entsprechend selbst belegen? oder soll es wirklich zu beginn des starts sein? dann brauchst du dafür vllt. einen extra initialisierungsschritt.

     
  • mactoolz - 2008-04-04

    Hi,

    wie meinst du eine eigene Funktion schreiben.

    Was soll diese denn genau machen ???

    MacToolz

     
  • hugo - 2008-04-04

    Ja mit einschränkungen läst sich das machen.

    schau dir den source code in der oscat library an

    der baustein _array_init macht genau das für beliebig größe eindimensionale real arrays

    du findest die lib unter w www.oscat.de w

     
  • mactoolz - 2008-04-04

    Hi,

    sorry vielleicht habe ich mich ein wenig falsch ausgedrückt.

    Ich meine die Array größe, sprich die Anzahl der Felder, das meinte ich mit dynamisch.

    Nicht das man das array mit einem bestimtmen Wert vorbelegt.

    MacToolz

     
  • hugo - 2008-04-04

    ja genau davon spreche ich auch,

    die routine sollte nur ein example sein

    sie funktioniert für dynamische arrays also für jede beliebige größe ohne änderung

     
  • mactoolz - 2008-04-07

    Hi,

    sorry, ich glaube ich steh auf dem Schlauch. Diese Funktion macht doch nichts anderes als mir ein Array mit irgend welchen Werten vorbelegen.

    Diese Funktion generiert mir aber nicht zur Laufzeit mal ein Array von 10 Feldern oder mal zu 20 Felder, wie schon eräwahnt zur Laufzeit.

    So wie ich das Array gerade brauche.

    Das gibt leider CoDeSys leider nicht her.

    Das Array muss explizit eine Feldgröße haben.

    MacToolz

     
  • hugo - 2008-04-07

    würdest du dir die funktion mal ansehen dann würdest du erkennen das sie eben geanu einmal 10 einmal 20 oder beliebig viele felder zur laufzeit macht.

    die funktion wird aufgerufen mit funktion(adr(xarray),sizeof(xarray)).

    die funktionen adr und sizeof ermitteln zur laufzeit den pointer auf das array und sizeof die größe des arrays.

    in der funktion ist dann zwar ein pointer auf ein dummy array[0..32000] defniert, aber das ist nur nötig damit der compiler das ganze akzeptiert.

    zur laufzeit wird je nach größe des durch adr und sizeof übergebene array eben nur dieses array befüllt egal ob es 12 bytes oder 12000 bytes sind.

    ich nutze diese funktionen dauernd mit beliebiger array größe zur laufzeit.

    ciao, ich gebs jetzt auf

     
  • Anonymous - 2008-04-08

    Originally created by: Bernhard Werner

    Ihr redet tatsächlich aneinander vorbei.

    Es gibt kein "new" in CoDeSys, die Syntax bietet erstmal nicht die Möglichkeit zur Laufzeit ein Array zu erzeugen.

    Wenn es die Steuerung unterstützt dann gibt es jedoch in der SysLibMem.lib die Funktion SysMemAlloc. Mit dieser Funktion kann man ein Stück Speicher allozieren und einen Pointer drauflegen, zum Beispiel so:

    parr: POINTER TO ARRAY [0..100] OF INT;
    

    der Pointer zeigt deswegen auf ein Array damit man damit monitoren kann, das Array kann auch grösser sein als der zu allozierende Speicher.

    parr := SysMemAlloc(size * SIZEOF(parr^[0]));
    

    jetzt zeigt parr auf ein unitialisiertes Stück Speicher der gewünschten Grösse.

    WICHTIG: der Speicher muss wieder freigegeben werden wenn er nicht mehr benutzt wird!

    SysMemFree(parr, size * SIZEOF(parr^[0]));
    
        parr := 0;
    

    Im Einzelfall kann das ziemlich kompliziert sein.

    Bernhard Werner

     
  • mactoolz - 2008-04-11

    Hi,

    wunderbar, genau das wollte ich wissen.

    Mir war bis jetzt schon klar, ohne das in Frage oder als Kritik zu sehen, wenn man Speicher allokiert, das man diesen auch natürlich nach nicht mehr Verwendung frei gibt.

    Danke

    MacToolz

     

Log in to post a comment.