Verständnisproblem Strukturenzeigerübergabe an Prozedur

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Verständnisproblem Strukturenzeigerübergabe an Prozedur

Beitrag 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
Ich glaube nur der Statistik, die ich selbst gefälscht habe!
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Beitrag 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
Ich glaube nur der Statistik, die ich selbst gefälscht habe!
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag 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 
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Beitrag 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
Ich glaube nur der Statistik, die ich selbst gefälscht habe!
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten