Seite 1 von 1

Verständnisproblem Strukturenzeigerübergabe an Prozedur

Verfasst: 16.05.2009 14:18
von WPö
Hallo, Gemeinde!
Habe wieder ein Verständnisproblemchen mit Zeigern und Strukturen. Es sollen diverse Strukturen per Prozedur verändert werden. Damit ich nicht mehrere Prozeduren brauche für verschiedene Kombinationen zu verarbeitender Strukturen, übergebe ich einfach deren Zeiger an die Prozedur:

Code: Alles auswählen

;Initialisierung, Definitionen usw.

Structure GapStruct  ;Die Lücken in den Dateien werden hierin aufgenommen.
  Start.l
  Stop.l
EndStructure
Global Dim Datei1Gap.GapStruct(200)
Global Dim Datei2Gap.GapStruct(200)
Global Dim Temp1Gap.GapStruct(200)
Global Dim Temp2Gap.GapStruct(200)
Global Dim Temp3Gap.GapStruct(200)
Global Datei1GapNr, Datei2GapNr, Temp1GapNr, Temp2GapNr, Temp3GapNr
Declare.l NegiereGap(*Gap1.GapStruct, Gap1Nr.l, *Gap2.GapStruct, Beginn.l, Ende.l)

;----------------
;Hauptprogramm

Temp1GapNr = NegiereGap(@Datei1Gap(), Datei1GapNr, @Temp1Gap(), i*9500*1024, (i+1)*9500*1024)
;bla bla...
Temp2GapNr = NegiereGap(@Datei2Gap(), Datei2GapNr, @Temp2Gap(), i*9500*1024, (i+1)*9500*1024)
;bla bla
Temp1GapNr = NegiereGap(@Temp2Gap(), Temp2GapNr, @Temp1Gap(), i*9500*1024, (i+1)*9500*1024)

;----------------
;Unterprogramme

;Erwarte sortierte Strukturen!
;In Gap1() stehen Bereichsdefinitionen von fehlenden Daten irgendeiner Datei.
;In Gap2(), was hier erstellt wird, werden Bereichsdefinitionen jener Datei geschrieben,
;die Daten enthalten, aber nur einen Bereich von Beginn bis Ende umfassend.
Procedure.l NegiereGap(*Gap1.GapStruct, Gap1Nr.l, *Gap2.GapStruct, Beginn.l, Ende.l)
  Gap2Nr.l = 0
  For i.l=-1 To Gap1Nr
    If i=-1     : Db=0         : Else : Db=*Gap1(i-1)\Stop : EndIf
    If i=Gap1Nr : De=$7fffffff : Else : De=*Gap1(i)\Start  : EndIf
    If Db<Ende And De>Beginn
      If Db<Beginn : *Gap2(Gap2Nr)\Start=Beginn : Else : *Gap2(Gap2Nr)\Start=Db : EndIf
      If De>Ende   : *Gap2(Gap2Nr)\Stop=Ende    : Else : *Gap2(Gap2Nr)\Stop=De  : EndIf
      Gap2Nr + 1
    EndIf
  Next i
  ProcedureReturn Gap2Nr		;Rückgabe der Größe der erstellten Struktur
EndProcedure
Leider kommt es damit zu einem Fehler "*Gap1() ist keine Funktion (...), Makro, Array oder LinkedList." in der Zeile mit "if i=-1". Ich verwende PB 4.3 Demo. Tausche ich die einleitende Zeile der Procedure gegen

Code: Alles auswählen

Procedure.l NegiereGap(Array *Gap1.GapStruct, Gap1Nr.l, Array *Gap2.GapStruct, Beginn.l, Ende.l)
aus, meldet der Kompiler in dieser einen Syntax-Fehler. Ich hoffe, mich an alle Einzelheiten aus der Anleitung von FREAK gehalten zu haben (http://robsite.net/files/0000/0010/pb_pointer.zip). Leider fehlen hier Beispiele für die Übergabe der Zeiger zu ein- oder mehrdimensionalen Strukturen an Prozeduren. Ansonsten habe ich freilich die Suche bemüht, aber nichts wirklich Passendes gefunden.

Schubst mich bitte 'mal jemand von der Leitung, auf der ich gerade stehe? :oops: Danke!

Grüße - WPo

Verfasst: 16.05.2009 14:23
von Kaeru Gaman
innerhalb deiner Proc sind Gap1 und Gap2 keine Arrays.

du müsstest also pointer zu den Arrays übergeben, wenn es dir darum geht.

aber da du die sowieso Global hast, brauchst du die überhaupt nicht zu übergeben.

Verfasst: 16.05.2009 16:28
von WPö
Kaeru Gaman hat geschrieben:innerhalb deiner Proc sind Gap1 und Gap2 keine Arrays.
Schade. Dachte, damit ging's.
du müsstest also pointer zu den Arrays übergeben, wenn es dir darum geht.
Die übergebe ich doch mit z.B. @Datei1Gap während des Aufrufs.
aber da du die sowieso Global hast, brauchst du die überhaupt nicht zu übergeben.
Es geht ja darum, nicht die richtigen Namen verwenden zu müssen, sondern Platzhalter, Aliasnamen, denn sonst bräuchte ich in o.g. Beispiel drei sehr ähnliche Prozeduren.

Wie stell ich es denn jetzt am dümmsten an, diese eindimensionalen Strukturen von einer universellen Prozedur bearbeiten zu lassen?

Grüße - WPo

Verfasst: 16.05.2009 17:06
von hjbremer
ein Array ist ein Array, egal welchen Typ es hat. Ob Long String oder irgendeine Structur. Du brauchst keine Pointer !

kurze Demo:

Code: Alles auswählen

Structure GapStruct  ;Die Lücken in den Dateien werden hierin aufgenommen. 
  Start.l 
  Stop.l 
EndStructure 

Global Dim Datei1Gap.GapStruct(200) 
Global Dim Datei2Gap.GapStruct(200) 

Procedure test ( Array gap.GapStruct(1) )

 gap(0)\start = 10
 gap(0)\stop = 110

EndProcedure

test (Datei1Gap())
Debug Datei1Gap(0)\start 
Debug Datei1Gap(0)\stop 

test (Datei2Gap())
Debug Datei2Gap(0)\start 
Debug Datei2Gap(0)\stop 

Verfasst: 16.05.2009 17:43
von WPö
Ja!
Jawoll!
Hjbremer hat's! Danke!

Der Quelltext sieht nach einer kleinen Korrektur so aus:

Code: Alles auswählen

Temp1GapNr = NegiereGap(@Datei1Gap(), Datei1GapNr, @Temp1Gap(), 1*9500*1024, (1+1)*9500*1024)

Procedure.l NegiereGap(Array Gap1.GapStruct(1), Gap1Nr.l, Array Gap2.GapStruct(1), Beginn.l, Ende.l)
  Gap2Nr.l = 0
  For i.l=0 To Gap1Nr
    If i=0      : Db=0         : Else : Db=Gap1(i-1)\Stop : EndIf
    If i=Gap1Nr : De=$7fffffff : Else : De=Gap1(i)\Start  : EndIf
    If Db<Ende And De>Beginn
      If Db<Beginn : Gap2(Gap2Nr)\Start=Beginn : Else : Gap2(Gap2Nr)\Start=Db : EndIf
      If De>Ende   : Gap2(Gap2Nr)\Stop=Ende    : Else : Gap2(Gap2Nr)\Stop=De  : EndIf
      Gap2Nr + 1
    EndIf
  Next i
  ProcedureReturn Gap2Nr		;Rückgabe der Größe der erstellten Struktur
EndProcedure
Habe schon eine Version mit PeekL&PokeL erstellt und meine, die sieht extrem unelegant aus. Jetzt ist es doch viel besser.

DANKE!

Grüße - WPo

Verfasst: 17.05.2009 00:47
von Kaeru Gaman
du hast mich anscheinend komplett falsch verstanden.

Code: Alles auswählen

Declare.l NegiereGap(*Gap1.GapStruct, Gap1Nr.l, *Gap2.GapStruct, Beginn.l, Ende.l) 
DA machst du aus Gap1 und Gap2 strukturierte Varablen.
dann kannst du solange pointer auf dein Array übergeben, bis du schwarz wirst,
innerhalb deiner Proc werden Gap1 und Gap2 pointer auf einzelne Strukturen sein,
weil du sie durch deine Argumentenliste so definierst!

so wie HJ das vorgezeigt hat, kann man ein Array übergeben.