Pointerarithmetik statische Variable offset

Anaconda55

Level-1
Beiträge
301
Reaktionspunkte
6
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich möchte gerne von einem Pointer + Offset = Zielpointer erstellen.

Ich habe es so versucht, hat jedoch nicht geklappt? (Siehe letzten Codeblock)

Code:
LAR1  P##T_RECV_Any; //Anfangsadresse des Ziel-Any-Pointers in AR1 legen
// Pointers in AR1 laden              
      L     B#16#10; // Syntax-ID in den Any-Pointer eintragen
      T     LB [AR1,P#0.0]; 

      L     B#16#2; // Bereichstyp BYTE laden                            
      T     LB [AR1,P#1.0]; // und im Any-Pointer ablegen

      L     20; // Anzahl der zu empfangenden Bytes/Worte eintragen
      T     LW [AR1,P#2.0]; 

      L     #BUFFER_DI; // Instanz-DB-Nummer eintragen
      T     LW [AR1,P#4.0]; 



      L     P##DataRecv; //Zielspeicher
      L     #ReceiveCount; // + Offset
      SLD   3; // in Pointerformat wandeln
      +D    ;
      T       LD [AR1,P#6.0]; // Zielpointer
 
Es fehlt noch der Speicherbereich, der im Byte 6 eingetragen werden muss.

In diesem Fall:
L B#16#85 // Instanzdatenbaustein
T LB[AR1,P#6.0]

Dieser Eintrag sollte in deinem Fall am Ende stehen, damit er nicht vom Doppelwort überschrieben wird.
 
Jetzt verstehe ich was du machen willst.

Möchtest du einen Pointer oder einen Any Pointer modifizieren?

Es scheint es soll ein Anypointer sein.
Ist es P#DataRecv?

Du lädst nur die Anfangsadresse von P#DataRecv.
Diesen musst du zuerst zerlegen um daraus den neuen Any Pointer zu bauen.

Poste mal den gesamten Code incl. Deklaration.
 
Ich will den Anypointer "T_RECV_Any" erstellen. Der Speicherbereich soll ein Pointer P#DataRecv + Offset "ReceiveCount" sein.

DataRecv : ARRAY [0 .. 100] OF BYTE ;
T_RECV_Any : ANY;


RECA: LAR1 P##T_RECV_Any; //Anfangsadresse des Ziel-Any-Pointers in AR1 legen
// Pointers in AR1 laden
L B#16#10; // Syntax-ID in den Any-Pointer eintragen
T LB [AR1,P#0.0];

L B#16#2; // Bereichstyp BYTE laden
T LB [AR1,P#1.0]; // und im Any-Pointer ablegen

L 20; // Anzahl der zu empfangenden Bytes/Worte eintragen
T LW [AR1,P#2.0];

L #BUFFER_DI; // Instanz-DB-Nummer eintragen
T LW [AR1,P#4.0];


L P##DataRecv;
L #ReceiveCount;
SLD 3; // in Pointerformat wandeln
+D ;
T LD [AR1,P#6.0];
 
Zuviel Werbung?
-> Hier kostenlos registrieren
so ???

Code:
FUNCTION "FC_AnyPointer" : VOID
TITLE =
VERSION : 0.1

VAR_INPUT
  DataRecv : POINTER ; 
  ReceiveCount : DWORD ; 
END_VAR
VAR_OUTPUT
  T_RECV_An : ANY ; 
END_VAR
VAR_TEMP
  DW_AR1 : DWORD ; 
  DW_AR2 : DWORD ; 
  W_DBNr : WORD ; 
  W_DINr : WORD ; 
  DB_Nummer : WORD ; 
  Adresse : DWORD ; 
END_VAR
BEGIN
NETWORK
TITLE =Save AR1, AR2, DBNr, DINr
      TAR1  ; 
      T     #DW_AR1; 
      TAR2  ; 
      T     #DW_AR2; 
      L     DBNO; 
      T     #W_DBNr; 
      L     DINO; 
      T     #W_DINr; 
NETWORK
TITLE =
// DataRecv zerlegen
      L     P##DataRecv; 
      LAR1  ; 
      L     W [AR1,P#0.0]; 
      T     #DB_Nummer; 
      L     D [AR1,P#2.0]; 
      T     #Adresse; 
// Any-Pointer erstellen
      L     P##T_RECV_An; 
      LAR1  ; 
      L     B#16#10; // Syntax-ID in den Any-Pointer eintragen
      T     B [AR1,P#0.0]; 
      L     B#16#2; // Bereichstyp BYTE laden 
      T     B [AR1,P#1.0]; // und im Any-Pointer ablegen
      L     20; // Anzahl der zu empfangenden Bytes/Worte eintragen
      T     W [AR1,P#2.0]; 
      L     #DB_Nummer; 
      T     W [AR1,P#4.0]; 
      L     #Adresse; 
      L     #ReceiveCount; 
      SLD   3; 
      +D    ; 
      T     D [AR1,P#6.0]; 
NETWORK
TITLE =Restore AR1, AR2, DBNr, DINr
      L     #DW_AR1; 
      LAR1  ; 
      L     #DW_AR2; 
      LAR2  ; 
      L     #W_DBNr; 
      AUF   DB [#W_DBNr]; 
      L     #W_DINr; 
      AUF   DI [#W_DINr]; 
END_FUNCTION

p.s. alles ungetestet
 
L #Adresse;
L #ReceiveCount;
SLD 3;
+D ;
T D [AR1,P#6.0];

So hab ich das ja auch? Bei mir funktioniert das so nicht!
Ich verwende das für AG_RECV und da stürzt mir immer die Verbindung ab, weil der CP nicht auf den Bereich schreiben kann...


Das hier muss doch die Zuordnung sein? Adresse + Offset, dieser ist 0 am Anfang. Er addiert also zum Pointer Adresse 0.
Oder geht das so mit dem Pointer nicht? Wie erhalte ich die Adresse?

L P##DataRecv;
L #ReceiveCount;
SLD 3; // in Pointerformat wandeln
+D ;
T D [AR1,P#6.0];
 
Zuletzt bearbeitet:
So hab ich das ja auch? Bei mir funktioniert das so nicht!
Ich verwende das für AG_RECV und da stürzt mir immer die Verbindung ab, weil der CP nicht auf den Bereich schreiben kann...


Das hier muss doch die Zuordnung sein? Adresse + Offset, dieser ist 0 am Anfang. Er addiert also zum Pointer Adresse 0.
Oder geht das so mit dem Pointer nicht? Wie erhalte ich die Adresse?

L P##DataRecv;
L #ReceiveCount;
SLD 3; // in Pointerformat wandeln
+D ;
T D [AR1,P#6.0];

Der Pointer P##DataRecv ist 3 Word lang. Du benötigst in diesem Fall aber die letzten beiden Wörter. Im ersten Wort steht die DB Adresse. In den beiden folgenden Wörtern der Speicherbereich und die Anfangsadresse.

Funktioniert das, was ich dir geschrieben habe?

Gruß
 
Zurück
Oben