Gosub Fehler?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

Code: Alles auswählen

Structure rueckgabewerte

Wert1.l
Wert2.l

EndStructure

Global Wert.rueckgabewerte

Procedure Blablubb(x)

Wert\wert1=100*x

Wert\wert2=100+x
;usw
EndProcedure
na so...
völlig Anfängermässig gedacht.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Mit Pointern arbeiten ist eine gängige Methode worauf man nicht verzichten sollte.

Bei Parametertypen mit Struktur wird immer nur der Pointer in die Procedure übergeben.

P.S. So ist besser weil man dann mit der gleichen Funktion mehrere Datensätze bearbeiten kann

Code: Alles auswählen

Structure rueckgabewerte

Wert1.l
Wert2.l

EndStructure

Global Wert.rueckgabewerte

Procedure Blablubb(x, *daten.rueckgabewerte)

  With *daten
    \wert1=100*x
    \wert2=100+x
  EndWith

EndProcedure 
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

Naja nun... aber wenn man am Anfang steht ist man mit Sicherheit noch nicht so der Freund von Pointern...

mich hat das am Anfang immer verwirrt mit den Pointern und solange es ohne geht, warum nicht...?
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Gute beschreibung von freak unter Help -> Pointer Tutorial
http://freak.purearea.net/


Beispiel

Code: Alles auswählen

Structure rueckgabewerte

Wert1.l
Wert2.l

EndStructure

Global Dim Wert.rueckgabewerte(10)

Procedure Blablubb(x, *daten.rueckgabewerte)

  With *daten
    \wert1=100*x
    \wert2=100+x
  EndWith

EndProcedure 

For i = 0 To 9
  Blablubb(10+i, Wert(i))
Next

For i = 0 To 9
  With Wert(i)
    Debug \wert1
  EndWith
Next
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

Pointer sin n gute Sache, ich benutze sie auch zunehmen mehr, aber hat nur da wo es sinnvoll ist.

Gosub werde ich weiter hin vielfach benutze.
Für mich stellt Gosub:Return kein ersatz von einer Procedure dar sonder mehr eine Art Include, bedeutet, wenn ich ein Programmteil einfach nur "verschieben" will und auch nur speziell ein mal benutzen will, dann ist Gosub super.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

STARGATE ich stimme Dir zu. Gosub ist eine feine Sache solange man es nicht übertreibt.
Und EUCH die ihr GOSUB verteufelt, laßt euch gesagt sein, es gibt nichts schnelleres als ein GOSUB zur rechten Zeit.
Wers nicht glaubt möge das kleine Beispiel ausprobieren, da helfen auch keine Pointer oder Strukturen !

Code: Alles auswählen

xx=1000000

a=1234
b=5678
c=0

Global rueck.LONG

Structure rueckgabewerte 

Wert1.l 
Wert2.l
Rueck.l 

EndStructure 

Global Wert.rueckgabewerte 


Procedure rechnen(var1,var2)

 ProcedureReturn var1*var2

EndProcedure

Procedure rechnen2(var1,var2)

 rueck\l=var1*var2

EndProcedure

Procedure rechnen3()

 wert\rueck=wert\wert1*wert\wert2

EndProcedure


z1=GetTickCount_()
For j=1 To xx
  Gosub rechne
  ;mach irgendwas mit der Variable c
Next
z2=GetTickCount_()-z1


z1=GetTickCount_()
For j=1 To xx
  c=rechnen(a,b)
  ;mach irgendwas mit der Variable c
Next
z3=GetTickCount_()-z1


z1=GetTickCount_()
For j=1 To xx
  rechnen2(a,b)
  ;mach irgendwas mit der Variable c
Next
z4=GetTickCount_()-z1


z1=GetTickCount_()
wert\wert1=a
wert\wert2=b
For j=1 To xx
  rechnen3()
  ;mach irgendwas mit der Variable wert\rueck
Next
z5=GetTickCount_()-z1


MessageRequester("",Str(z2)+#LF$+Str(z3)+#LF$+Str(z4)+#LF$+Str(z5))

End

Rechne:

c=a*b

Return
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
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

hjbremer hat geschrieben:Und EUCH die ihr GOSUB verteufelt, laßt euch gesagt sein [...]
sorry, aber Dein 'Performance'-Beispiel reißt mich jetzt nicht so vom Hocker.
Da bleib ich doch lieber beim Gosub-Verteufeln ;-)

Grüße ... Kiffi
a²+b²=mc²
Antworten