ReturnProcedure mehr als einmal nutzen...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Tsuki-Namida
Beiträge: 633
Registriert: 17.11.2005 13:27
Kontaktdaten:

ReturnProcedure mehr als einmal nutzen...

Beitrag von Tsuki-Namida »

Hallo... ich möchte eine txt datei auslesen über eine dll okay beim testen habe ich nur eine procedure gemacht...

in der txt datei sind mehere werte die ich brauche nur wenn "Returnprocedure" komnmt springe ich aus der schleife und bekomme nur den ersten wert zurück.... ich brauche aber mehere werte die anzahl der werte kann später der benutzer selber bestimmen... deshalb muss ich in der schleife bleiben...

hier ist die procedure...

Code: Alles auswählen

Procedure.s Add_Listen()
  If OpenFile(0,"Stream.wr3")
  CallDebugger
    While Eof(0) = 0
      temp$ = ReadString(0)
      If FindString(temp$,"Name: ",0)
        AddList$ = RemoveString(temp$,"Name: ")
        ProcedureReturn AddList$
      EndIf
    Wend
  EndIf
EndProcedure
ich hoffe das mir jemand helfen kann...
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> .. deshalb muss ich in der schleife bleiben...
Warum rufste die Procedure nicht immer wieder auf, bis ein Endezeichen
zurückkommt? (siehe auch statische Variablen)

Oder übergibst eine Liste, wo Du die neuen Werte anfügst?

Dein Beispiel ist leider sehr nixsagend, so das ich Dir da nichts basteln kann.

Das öffnen und schließen kannste auch in eine andere Procedure verlegen,
so das Du bei jedem Aufruf weiterlesen kannst.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Tsuki-Namida
Beiträge: 633
Registriert: 17.11.2005 13:27
Kontaktdaten:

Beitrag von Tsuki-Namida »

okay... ich habe jetzt ein zeichen "EOF" an letzter position der datei geschrieben.... ich komme nun wieder in die txt datei rein nur ich bekomme nur die ersten 2 werte.....

Code: Alles auswählen

Procedure.s Add_Listen(EOFWert.s)
  If OpenFile(0,"Stream.wr3")
  CallDebugger
    While Eof(0) = 0
    temp$ = ReadString(0)
      If FindString(temp$,"Name: ",0)
        AddList$ = RemoveString(temp$,"Name: ")
        If AddList$ <> EOFWert.s
          CloseFile(0)
          ProcedureReturn AddList$
        EndIf
      ElseIf FindString(temp$,"EOF",0)
        ProcedureReturn "EOF"
      EndIf
      Wend
    EndIf
EndProcedure
Repeat
  Add$ = Add_Listen(Add$)
  If FindString(Add$, "EOF",0)
    Listkomplet = 1
  Else
    Debug Add$
  EndIf
Until Listkomplet = 1
kann man das ggf. auch anderst machen? und wenn ja wie??
Bild
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

Wie wäre es mit einer Liste/einem Array, welches BYREF übergeben wird?
Ich habe (mal wieder) kein PB hier, kann auch nicht eben schnell in der Hilfe nachschauen.

Ist jetzt nur ein flüchtiger Ansatz- für PB umcoden muss es jemand Anders ;)

Eine Art Beispiel für PowerBASIC:
Ich bekomme damit im Array "WinList()" alle Handles von Fenstern zurück, die Childs sind, des Parent-Windows. In der Reihenfolge der Z-Order.

Code: Alles auswählen

FUNCTION GetAllWinHdl(BYREF WinList() AS DWORD, hParent AS DWORD) AS LONG
   REDIM WinList(0)   
      LOCAL CurrentHWND, MostTopDlg AS DWORD
      LOCAL lWinCount AS LONG
      CurrentHWND = GetTopWindow(hParent)
      DO
          WinList(lWinCount) = CurrentHWND
          INCR lWinCount
          REDIM PRESERVE WinList(lWinCount)
         CurrentHWND = GetNextWindow(CurrentHWND, %GW_HWNDNEXT)
      LOOP WHILE CurrentHWND <> 0
      
      FUNCTION = lWinCount
END FUNCTION
Dann hättest du in einem Array (oder in Pure warscheinlich eine Linked List) mit alles Einträgen, die du sonst per Procedure-Return zurückgegeben hättest. Und anstatt dann ein spezielles Ergebnis zurückgeben zu lassen, lässt du einfach die Abzahl der gefunden Items zurückgeben. (so wie in meinem Beispiel)

Gr33tz
Tafkadasom2k5
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
Tsuki-Namida
Beiträge: 633
Registriert: 17.11.2005 13:27
Kontaktdaten:

Beitrag von Tsuki-Namida »

aber wenn ich wie in deinem beispiel eine Winlist mache... ist die dann doch nur in der dll verfügbar.. und nicht in der exe wo ich es dann aber brauche... in der procedure wäre das ja keinthema....aber es soll ja halt in einer dll rein kommen...
Bild
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

das Konzept von Tafkadasom2k5 in der PureBasic-Variante:

Code: Alles auswählen

Procedure Add_Listen(myLinkedList.s())
  Protected FF.l
  Protected temp$
  FF = OpenFile(#PB_Any,"Stream.wr3")
  If FF
    While Eof(FF) = 0
      temp$ = ReadString(FF)
      If FindString(temp$,"Name: ",1)
        AddElement(myLinkedList())
        myLinkedList() = RemoveString(temp$,"Name: ") 
      EndIf
    Wend
    CloseFile(FF)
  EndIf
EndProcedure

NewList myLL.s()

Add_Listen(myLL())

ForEach myLL()
  Debug myLL()
Next
in Add_Listen() durchsuchst Du die gesamte Datei und trägst die Treffer in
eine LinkedList ein, die Du als Parameter beim Prozedur-Aufruf übergeben
hast.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Tsuki-Namida
Beiträge: 633
Registriert: 17.11.2005 13:27
Kontaktdaten:

Beitrag von Tsuki-Namida »

danke kiffi... aber kann ich das dennoch nicht in einer dll nutzen.... oder doch?
Bild
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

Doch.
In diesem Fall wird die Linked-List BYREF übergeben. Dasbedeutet, dass nicht eine neue LL erstellt wird, sondern lediglich ein Pointer zum Original übergeben wird. Das heißt, die DLL schreibt jetzt in den Speicher, der ursprünglich fürt die erste LL gedacht war rein.

Irgendwie verständlich? :? :oops: :mrgreen:
Sonst versuch ichs gleich nochmal mit mehr Zeit und einem kleinen Beispiel

Gr33tz
Tafkadasom2k5
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
Tsuki-Namida
Beiträge: 633
Registriert: 17.11.2005 13:27
Kontaktdaten:

Beitrag von Tsuki-Namida »

oaky danke.. werde es sofort testen :)
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Kiffi modifiziert :mrgreen:

Code: Alles auswählen

ProcedureDLL Add_Listen(*myLinkedList.s())
  Protected FF.l
  Protected temp$
  
  FF = OpenFile(#PB_Any,"Stream.wr3")
  If FF
    While Eof(FF) = 0
      temp$ = ReadString(FF)
      If FindString(temp$,"Name: ",1)
        AddElement(*myLinkedList())
        *myLinkedList() = RemoveString(temp$,"Name: ")
      EndIf
    Wend
    CloseFile(FF)
  EndIf
EndProcedure

NewList myLL.s()

Add_Listen(@myLL())

ForEach myLL()
  Debug myLL()
Next
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten