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.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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:POINTERTOARRAY[0..100]OFINT;
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo zusammen und guten Morgen,
besteht die Möglichkeit ein dynamisches Array zur Laufzeit initialisieren zu können. ???
MacToolz
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.
Hi,
wie meinst du eine eigene Funktion schreiben.
Was soll diese denn genau machen ???
MacToolz
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
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
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
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
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
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:
der Pointer zeigt deswegen auf ein Array damit man damit monitoren kann, das Array kann auch grösser sein als der zu allozierende Speicher.
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!
Im Einzelfall kann das ziemlich kompliziert sein.
Bernhard Werner
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