C/C++ zu PB: Reference, Dereference, Pointer, By Reference?

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: C/C++ zu PB: Reference, Dereference, Pointer, By Referen

Beitrag von Regenduft »

auser hat geschrieben:Eine Struktur die genau ein Feld hat finde ich ziemlich fail. Funktioniert schon aber ich finde das ist ein unschöner Workaround.
Wieso denn? Die PB-Standardstrukturen "Long", "Quad" und Co sind doch auch nichts anderes... Nur, dass Sie nicht im Code definiert werden müssen. Oder entgeht mir da ein Detail?
auser hat geschrieben:Strings gibt's schon eine Lösung. Musste halt Pieksen und Popeln ;) ...und dabei aufpassen daß du keinen Overflow produzierst
Stimmt, da war ich etwas zu "absolut" in meiner Ausdrucksweise. Eine Stärke von PureBasic gegenüber C ist ja, dass man sich beim normalen Umgang mit String um nichts einen Kopf machen muss. Sobald Zeiger ins Spiel kommen wird's kritisch... Besonders auch, weil die Adresse von festen Stringvariablen (z.B. foo${123}) nie #Null ist, während flexible Stringvariablen (z.B. foo$) nach der Definition erstmal die Adresse #Null besitzen, ausser man weist ihnen direkt einen Leerstring zu:

Code: Alles auswählen

EnableExplicit
EnableASM

;{ AddressOfString(String, Destination)
  CompilerSelect #PB_Compiler_Processor
  CompilerCase #PB_Processor_x64
    Macro AddressOfString(String, Destination)
      LEA rax, String : MOV Destination, rax
    EndMacro
  CompilerCase #PB_Processor_x86
    Macro AddressOfString(String, Destination)
      LEA eax, String : MOV Destination, eax
    EndMacro
  CompilerDefault
    CompilerError "Processor <> x64 And Processor <> x86"
  CompilerEndSelect
;}

Define a$
Define b$ = #NUL$
Define c${1}
Define d${1} = #NUL$

Define a, b, c, d

AddressOfString(a$, a)
AddressOfString(b$, b)
AddressOfString(c$, c)
AddressOfString(d$, d)

Debug @a$
Debug a
Debug ""
Debug @b$
Debug b
Debug ""
Debug @c$
Debug c
Debug ""
Debug @d$
Debug d
Das "ByRef" für Strings wurde so weit ich weiß schon oft als Feature gewünscht, wird aber wohl leider nicht umgesetzt, obwohl es Dank der Stringbase die PB verwendet doch eigentlich nicht gerade unmöglich sein dürfte... Schade...

Nebenbei: Ist schon interessant mal über den Tellerrand hinauszuschauen und PB mit anderen Sprachen zu vergleichen!
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
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

Re: C/C++ zu PB: Reference, Dereference, Pointer, By Referen

Beitrag von ts-soft »

Ich verstehe nicht, was gegen Strukturen mit einem Feld zu sagen ist?
Und Strings By Reference geht doch auch, wenn man Strukturen verwendet:

Code: Alles auswählen

Procedure Test(*test1.String, *test2.string)
  Debug *test1\s
  Debug *test2\s
  
  *test1\s = "Hallo Welt"
  *test2\s = "Die Geschwindigkeit nicht auf kosten der Sicherheit erhöhen!"
EndProcedure

Define.String a, b

a\s = "Hello World"

Test(@a, @b)

Debug a\s
Debug b\s
Und so gibts auch keine Probleme mit dem Stringmanager oder über den Speicher hinaus zu poken.
Peek und Poke nutze ich eher selten.

Gruß
Thomas
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
auser
Beiträge: 58
Registriert: 17.05.2011 10:56

Re: C/C++ zu PB: Reference, Dereference, Pointer, By Referen

Beitrag von auser »

ts-soft hat geschrieben:Ich verstehe nicht, was gegen Strukturen mit einem Feld zu sagen ist?
Ich muss im Vergleich zu C++ ebenso wie bei den ganzen Peek und Poke Geschichten immer bei jeder Verwendung ein typspezifisches Anhängsel mitschleppen und das nicht nur im Header oder der Funktionsdefinition sondern überall. Struktur sollte eine Zusammenfügung sein. Ein Feld ist aber keine Zusammenfügung. Und darum ist das für mich schlicht ein Workaround für das fehlen von Typen.

Und Strings By Reference geht doch auch, wenn man Strukturen verwendet:
Oh gut zu wissen. Ich bin mal davon ausgegangen Regenduft hätte es getestet bevor er schrieb das ging nicht. Wobei ich sagen muss daß ich denke daß Strings (mal davon abgesehen daß hier schon wieder so 'ne Ein-Feld-"Struktur" vergenusszweigelt werden muss) in PB eigentlich recht gut gelöst und man kann recht schnell alles machen was man braucht.
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: C/C++ zu PB: Reference, Dereference, Pointer, By Referen

Beitrag von Regenduft »

Oh mann! "Define.String" statt "Define.s"! Und schon klappts mit der "ByRef" Parameterübergabe! So einfach kann's sein! 1000 Dank an ts-soft für den Tipp! :allright:

PS: Ich glaube ab heute werde ich kein "normalen" Strings mehr nutzen (zumindest im Hauptprogramm). :D
Zuletzt geändert von Regenduft am 21.10.2013 19:13, insgesamt 1-mal geändert.
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
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

Re: C/C++ zu PB: Reference, Dereference, Pointer, By Referen

Beitrag von ts-soft »

auser hat geschrieben:Ich muss im Vergleich zu C++ ebenso wie bei den ganzen Peek und Poke Geschichten immer bei jeder Verwendung ein typspezifisches Anhängsel mitschleppen und das nicht nur im Header oder der Funktionsdefinition sondern überall. Struktur sollte eine Zusammenfügung sein. Ein Feld ist aber keine Zusammenfügung. Und darum ist das für mich schlicht ein Workaround für das fehlen von Typen.
Für mich alle mal besser als für jeden Typ erst seine Bedeutung im Header zu suchen. Jeder Pubs hat nen eigenen Typ, wie z.B.
jedes Handle unter Windows einen h??? Typ hat usw.
Int ist mal dies mal das, wie man darin einen Vorteil sehen kann, werde ich wohl nie verstehen :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
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: C/C++ zu PB: Reference, Dereference, Pointer, By Referen

Beitrag von Regenduft »

ts-soft hat geschrieben:Für mich alle mal besser als für jeden Typ erst seine Bedeutung im Header zu suchen.
Sehe ich genauso. Ich mag auch immer direkt im Code zu sehen, auf was für einen Typ der Zeiger verweist. Aber Geschmäcker sind nun mal verschieden.
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: C/C++ zu PB: Reference, Dereference, Pointer, By Referen

Beitrag von NicTheQuick »

ts-soft hat geschrieben:Für mich alle mal besser als für jeden Typ erst seine Bedeutung im Header zu suchen. Jeder Pubs hat nen eigenen Typ, wie z.B.
jedes Handle unter Windows einen h??? Typ hat usw.
Int ist mal dies mal das, wie man darin einen Vorteil sehen kann, werde ich wohl nie verstehen :mrgreen:
Aber das ist doch das schöne. Diese Typedefs. Das bringt Typsicherheit. So kann man eine Funktion, die ein Handle für ein Fenster erwartet, nicht aus Versehen mit einem Handle von einem DirectX-Screen aufrufen. Beides mögen zwar eigentlich nur Pointer sein, aber verschiedenen Typs. Das ist praktisch die Vorstufe zur Objektorientierung.

Und normalerweise braucht man auch nicht die Bedeutung eines Typs im Header suchen. Bei der normalen Nutzung des Includes sollte das komplett egal sein, was da dahinter steckt. Nur wenn du unbedingt das ganze in eine andere Programmiersprache übersetzen willst, musst du eben selbst die Aufgaben des Precompilers und des Parsers übernehmen.

Ich sehe das jedenfalls sehr wohl als Vorteil. Ich mag's auch aus Prinzip nicht, wenn jemand in PB den Rückgabewert von 'AllocateMemory()' oder sogar 'OpenWindow()' einem Integer zuweist. Meiner Meinung nach sind das Pointer bzw. Handles, hinter denen eine gewisse Struktur steckt, und nicht einfach nur Zahlen. Aber da mag jeder seinen eigenen Geschmack entwickeln. Integer und Pointer haben ja zugesichert immer die selbe Größe.
Antworten