Mir ist dein Ziel jetzt nicht ganz klar, aber es ist doch nachvollziehbar, dass die Runtime auch wissen muss, wie viel sie aus dem speicher lesen soll, wenn du den Pointer verwendest. Ein Byte? Zwei? Oder doch lieber ein ganzes DWord?
Poste doch mal bitte, was du konkret machen möchtest, denn es gibt egtl. fast nichts, was man mit (geschickt eingesetzten) Zeigern nicht lösen könnte. Schlagwort: Byteaddressierung
Sprich mit
pt: POINTER TO BYTE := ADR(xy);
und pt := pt +1;
kann man den gesamten Speicher durchlaufen. Man sollte jedoch wissen, was man tut...
Gruß
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2008-04-03
Originally created by: Bernhard Werner
Hallo mactoolz,
darüber hat sich wirklich noch keiner beschwert.
Unsere Pointer sind sowieso nur ziemlich schwach getypt (darüber hat sich schon so mancher beschwert).
Das heisst jeder Pointer ist zu jedem anderen Pointer (und zu DWORD) typkompatibel, also wenn man einen anderen Typ braucht, genügt es einen Pointer mit dem benötigten Typ zu deklarieren und dem die Adresse zuzuweisen.
Ich weiss wirklich nicht, wozu man da einen typenlosen Pointer brauchen könnte. Erkläre dich genauer.
Bernhard Werner
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
In den älteren Versionen hat das meiner Meinung nach noch besser funktioniert, da konnte man einfach mit ADR() eine Anfangsadresse ermitteln (in ein DWORD) und mit dieser Adresse dann rechnen (also beispielsweise + x*4). Leider wurde das in den neueren Versionen geändert, jetzt meckert der Compiler beim gleichen Programm rum und verlangt immer einen Pointer_to-wasauchimmer.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo,
warum kann man nicht einen Typenlosen Zeiger deklarieren.
Wieso muss immer ein Typ bekannt gegeben werden, so macht doch fast der Zeiger keinen Sinn oder ???
MacToolz
Guten Morgen!
Mir ist dein Ziel jetzt nicht ganz klar, aber es ist doch nachvollziehbar, dass die Runtime auch wissen muss, wie viel sie aus dem speicher lesen soll, wenn du den Pointer verwendest. Ein Byte? Zwei? Oder doch lieber ein ganzes DWord?
Poste doch mal bitte, was du konkret machen möchtest, denn es gibt egtl. fast nichts, was man mit (geschickt eingesetzten) Zeigern nicht lösen könnte. Schlagwort: Byteaddressierung
Sprich mit
pt: POINTER TO BYTE := ADR(xy);
und pt := pt +1;
kann man den gesamten Speicher durchlaufen. Man sollte jedoch wissen, was man tut...
Gruß
Originally created by: Bernhard Werner
Hallo mactoolz,
darüber hat sich wirklich noch keiner beschwert.
Unsere Pointer sind sowieso nur ziemlich schwach getypt (darüber hat sich schon so mancher beschwert).
Das heisst jeder Pointer ist zu jedem anderen Pointer (und zu DWORD) typkompatibel, also wenn man einen anderen Typ braucht, genügt es einen Pointer mit dem benötigten Typ zu deklarieren und dem die Adresse zuzuweisen.
Ich weiss wirklich nicht, wozu man da einen typenlosen Pointer brauchen könnte. Erkläre dich genauer.
Bernhard Werner
Hallo,
ich kann gerade kein wirkliches Beispiel liefern, es ist mir nur aufgefallen.
Vielleicht könnte man es brauchen um ermitteln zu können welche größe ein Array hat und wieviele Eindimensionale Felder vorhanden sind.
Wenn ich jetzt mal weiter spinne, dann würde ich eine Funktion erstellen der ich einen Zeiger übergebe und die mir dann was zurück gibt.
Dazu müsste ich aber dann definitiv den Zeiger als Übergabe Parameter in der Funktion typisieren.
In C++ kann ich einen typenlosen Zeiger initialisieren, muss nur dann zur Laufzeit den speicher allokieren. Soweit ich das weis.
MacToolz
In den älteren Versionen hat das meiner Meinung nach noch besser funktioniert, da konnte man einfach mit ADR() eine Anfangsadresse ermitteln (in ein DWORD) und mit dieser Adresse dann rechnen (also beispielsweise + x*4). Leider wurde das in den neueren Versionen geändert, jetzt meckert der Compiler beim gleichen Programm rum und verlangt immer einen Pointer_to-wasauchimmer.
Hi,
so sieht es aus.
Tja, dann kann mam wohl auf die Version CoDeSys 3.0 warten.
Mactoolz
Hallo Jungs ich verstehe euer Problem nicht ganz, die typisierung des pointers ist ja keine einschränkund sondern schafft sicherheit.
ich benötige aber auch öfters pointer die verschiedene typen handeln können
das löse ich dann wie folgt:
beispiel ich will die bits aus einem real in ein dword legen.
pt1 : pointer to real;
pt2 : pointer to dword;
pt1 := adr(realvar);
pt2 := pt1;
dwvar := pt2^;
aber vorsicht du musst 100% wissen was du tust sonst crashed das system mit pointern.
wir verwenden pointer nur in kleinen abgeschlossenen funktionen die auch entsprechend getestet werden können niemals in einem anwendungsprogramm
schon hat man aus dem real ein dword gemacht.
weitere beispiele findest du im source der oscat lib unter w www.oscat.de w
Hi,
danke für die Infos.
Dein Ansatz ist schon richtig, wenn der Zeiger auf ein falschen Typ zeigt dann hast du ein großes Problem.
Kann mann hier eigentlich auch ein cast durchführen. ???
MacToolz
du brauchst nicht casten, den du kannst pointerwerte immer anderen pointern zuweisen, egal welcher pointer typ das ist.
ausserdem kannst du pointer wie dword verweden und den wertt des pointers auch einem dword zuweisen und umgekehrt