Strukturie Prozedurrückgabe bei PureBasic

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
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 »

BlueHoschi hat geschrieben: @TS
bei dem PSDK-Launcher bekomme ich nur ein leeres Bild, was muß ich jetzt tun (bitte Fremder nimmst Du mich an die Hand und bringst mich zu Mami?). Also vielleicht mal ´ne Erklärung für Dummies... :freak:
PSDK oder MSDN bei MS downloaden und installieren. Einmal über
Startmenü aufrufen.

Den Launcher als IDE-Tool oder jaPBe-Tool konfigurieren, einzige empfehlenswerte Einstellung ist ein Shortcut z.B. Alt-F1

Ansonsten gehts automatisch, notfalls nochmal eintragen mit dem parameter
-config und dann nen Namespace aussuchen.

Steht alles in dem Thread, ansonsten zeigste das Bild der Mami, die macht
es dann :mrgreen:
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
BlueHoschi
Beiträge: 97
Registriert: 02.10.2007 07:19

Beitrag von BlueHoschi »

...hmpf...
Wer Dir Steine in den Weg legt, pflastert den vielleicht.

PB 5.21, Win 7 64 bit
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag von Leonhard »

Die Idee ist toll, hat aber einen Haken:

Wenn man jetzt die Daten dieser Struktur bearbeiten möchte, aber auch enen Zugriff auf den Pointer haben möchte (z.B. um den Pointer selbst zu beschreiben), so benötigt man 2 Pointer, was man in C mit ** machen kann, aber in PureBasic nicht möglich ist. Man müsste eine Pointer-Struktur extra für diese Struktur erstellen, was sehr nerfig ist.

Bsp:

Code: Alles auswählen

Structure MyStruct
  a.l
  b.l
  c.l
EndStructure
Structure p_MyStruct
  *p.MyStruct
EndStructure

Procedure SetVar(*m.p_MyStruct)
  If *m\p = 0 : *m\p = AllocateMemory(SizeOf(MyStruct)) : EndIf
  *m\p\a = 5
EndProcedure

; ------------ Beispiel --------------

Define *m.MyStruct
SetVar(@*m)
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag von milan1612 »

Wenn ich dich jetzt richtig verstanden hab (bin mir nich sicher) dann guck mal hier:

Code: Alles auswählen

Structure Struct
  X.l
  Y.l
EndStructure

Procedure ReturnProc()
  *id.Struct = AllocateMemory(SizeOf(Struct))
  *id\X = 5
  *id\Y = 10
  ProcedureReturn *id
EndProcedure

*ret.Struct = ReturnProc()
Debug *ret\X ;Auf die Elemente zugreifen
Debug *ret\Y
Debug *ret ;Und voila, hier ist der Pointer

FreeMemory(*ret)
*ret allein ist ein ganz normaler Pointer, *ret\X greift mithilfe der Structure-
Deklarierung auf den reservierten Speicher zu und gibt mir den dort gespeicherten Wert.
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
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 »

@milan1612
Deins sind keine Pointer auf Pointer
siehe **

Gruß
Thomas

// edit beispiel:

Code: Alles auswählen

text.s = "Hallo"
*pText = @text
*ppText = @*pText

Debug PeekS(PeekL(*ppText))
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
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag von milan1612 »

Ja schon klar, aber das braucht er ja auch nicht. Soweit ich jetzt verstanden hab
will er den "strukturierten" Pointer auch als normalen Pointer ansprechen und
ändern können. Und das zeigt ja mein obiges Beispiel. Hab ich das jetzt richtig verstanden?
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
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 »

> Hab ich das jetzt richtig verstanden?
Keine Ahnung, wird wohl so sein :wink:
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
Brügge
Beiträge: 359
Registriert: 28.05.2006 16:40
Wohnort: Rheine

Beitrag von Brügge »

hi coole sache mit der structure!!

aber wie kann ich einen array zurück geben?

kann man das auch mit pointer machen, oder gibt es da einen anderen trick?

vielen dank!

mfg!
Abgeschlossene games: No Name Game (NNG) Download-Link:
http://web56.login-1.loginserver.ch/eas ... 2125104111
Little John

Beitrag von Little John »

PB-Hilfe zu Prozeduren hat geschrieben:Um ein Array oder eine Linked List zurückzuliefern, kann ProcedureReturn nicht verwendet werden. Übergeben Sie zu diesem Zweck das Array oder die Linked List als Parameter an die Prozedur.
Gruß, Little John
Brügge
Beiträge: 359
Registriert: 28.05.2006 16:40
Wohnort: Rheine

Beitrag von Brügge »

habe gerade zumgetestet...

also gehen tut es ^^ aber nicht 100%ig

Code: Alles auswählen


procedure getarray()
  dim array.s(5)

  for i = 0 to 5
    array(i) = "test"+str(i)
    
  next i

  procedurereturn @array()

enprocedure


dim array2.s(5)

array2() = getarray()

for i = 0 to 5
  debug array2(i)
next i

bei mir kommt an arraystelle 1 immer ein falscher wert... der rest geht!
Abgeschlossene games: No Name Game (NNG) Download-Link:
http://web56.login-1.loginserver.ch/eas ... 2125104111
Antworten