Wichtige Fragen zum programmieren mit PureBasic

Anfängerfragen zum Programmieren mit PureBasic.
Shamos
Beiträge: 32
Registriert: 12.11.2014 09:44

Wichtige Fragen zum programmieren mit PureBasic

Beitrag von Shamos »

Hallo Gemeinde,

bevor ich auf das eigentliche Thema eingehe möchte ich zunächst erst einmal ein paar Wissenswerte Infos über mich preis geben.
Ich habe angefangen mit dem Programmieren als 8-Bit CPU's mit 64k RAM DAS non-plus-ultra waren, und mir damals das programmieren
beigebracht in den sprachen Basic und ASM. Später bin ich dann umgeschwenkt auf Pascal und C und habe in den darauffolgenden Jahren
viel Perl und PHP-Projekte in Verbindung mit SQL-DB's realisiert. Das alles ist nun 10 Jahre und sehr viel länger her. Daher bin ich mit
Sicherheit etwas eingerostet und so möge man mir so manchen dümmlichen Fehler/Frage aufgrund meiner nicht mehr vorhandenen
Praxis/Routine als auch in meiner Unkenntnis zu PureBasic, das ich erst wenige Tage kenne, vergeben.


Ich habe aktuell noch so einige Experimente mit der DemoVersion von PB am Start. Leider finde ich manche Informationen
in der dabei befindlichen Offline-Hilfe(CHM) Nicht
weshalb ich mich nun hier an die Community wende, in der Hoffnung das mir,
und künftigen anderen PB-Interessierten die das gleiche Problem haben, auf diese Weise die benötigten Infos zukommen.
Daher habe ich folgenden kleinen Fragenkatalog verfasst:

Falls möglich einfach ein Code-Beispiel das auf das wesentliche Bezug nimmt, in die Antwort einfügen, hilft meist mehr als 100 Worte

1) Wie definiere/deklariere ich eigene Konstanten in meinen PB Programmen?

2) Wie definiere/deklariere ich ein Array vom Datentyp einer zuvor selbst definierten Struktur?
Das unten stehende Code Beispiel wird vom Compiler mit der Meldung "Unbrauchbarer Code am Ende der Zeile"
bei der ersten Dim Anweisung abgebrochen. Das gleiche passiert wenn ich diese Zeile auskommentiere und
die darunterliegende Dim Zeile von der Kommentierung befreie.

Code: Alles auswählen

MaxClientConnections = 10

Structure struct_Client
	ID.i
	IP.s
	Port.s
EndStructure

Dim Client(MaxClientConnections-1).struct_Client
; Dim Client(MaxClientConnections-1) as struct_Client
3) Wie finde heraus, welche DATENTYPEN von Funktionen/Prozeduren in Parametern, als auch, von deren Rückgabewerte verwendet werden?
Ist Beispielsweise eine ClientID aus den Netzwerkfunktionen ein Pointer, ein Handle, Quad oder integer?

4) Wie und inwieweit funktioniert bzw. realisiert man in PB das TypeCasting?
Beispielsweise kann ich in einem Code $FF schreiben doch funktioniert ein Dec($FF) beispielsweise nicht.
Ebensowenig ein binvar = !1001

5) Wo finde ich in der Hilfe eine Übersicht ALLER Datentypen, nicht nur diverse Integer und String, Char etc. sondern auch Pointer und Konstanten wie #CR #LF #SPACE und deren Zuweisungen?


6) Wie Definiere/Deklariere ich einen Pointer bzw. wie verwende ich diese?
z.B: In einer Struktur als eines der Elemente innerhalb der Struktur?

Wie setze ich z.B. das nachfolgende CodeBeispiel (sinnesgemäß) korrekt in PB um?

Code: Alles auswählen

*pointera
*pointerb
adrpointera.i
adrpointerb.i
adrpointera = adress of *pointera
adrpointerb = adress of *pointerb


7) Wie fange ich ein CTRL+C in PB-Programmen ab?
... damit ein (vorzeitiger) Programmabbruch durch den Benutzer nicht ohne die Kontrolle
des Programms möglich ist, dieses aber weiter laufen kann, also die abgefangene Tastenkombination STRG+C
auch anderweitig mit einer Funktion belegt werden oder schlichtweg Ignorieren kann?
Windows 8.1 x64 | PureBasic 5.31 x64 | Dell Inspiron 3847 | i5-4440 3.1Ghz | 8GB DDR3 | Nvidia Geforce 625
TKRoth
Beiträge: 32
Registriert: 24.02.2012 15:34
Wohnort: Hamburg
Kontaktdaten:

Re: Wichtige Fragen zum programmieren mit PureBasic

Beitrag von TKRoth »

Ich versuche es Mal 8)

1.:
#Konstantename = Wert
z.B.:
#PureBasic = "Klasse Sprache"

2.:
Global Dim Client.Struct_Client(MaxClientConnections-1)

3.:
Steht in der Hilfe.

4.:
Du kannst es einfach so Schreiben.
Also: Var=$FF

5.:
In der PureBasic-IDE unter Werkzeuge/Strukturverzeichnis findest du alle vordefinierten Strukturen und Konstanten.

6.:
Global *PointerA

*PointerA=@Variable
*PointerA=?Prozedur/Programmlabel

7.:
Programmabbruch z.B. durch Strg+C muss man erst selbst definieren. Z.B. mit AddKeyboardShortcut.
AddKeyboardShortcut(#Win,#PB_Shortcut_Control|#PB_Shortcut_C,#Menu_Quit)
#Win ist ein vorher definiertes Programmfenster
#PB_Shortcut_* sind vordefinierte Konstanten welche mit '|' Oder-verknüpft werden
#Menu_Quit ist ein definierter Menu-Punkt zum beenden des Programms. Kann auch jeder andere Menu-Aufruf sein
Computer werden benötigt um Probleme zu lösen die man ohne Computer nicht hätte.
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: Wichtige Fragen zum programmieren mit PureBasic

Beitrag von ts-soft »

Ein bissel viel, für alle Themen, jedenfalls wenn es halbwegs Komplett sein soll.

Zu 1.
Konstanten definieren:

Code: Alles auswählen

#Bla = 100
Als erstes kommt immer ein Raute und danach der Name, nach den selben Konventionen, wie auch Variablen:
Beginnend mit Unterstrich oder Buchstabe, danach alphanumerisch aus: 0-9, a-z, A-Z sowie _

Einmal zugeordnete Werte können nicht geändert werden. Automatische Nummerierung erreichen wird durch:

Code: Alles auswählen

Enumeration [Name] [<Konstante> [Step <Konstante>]]
  #Konstante1
  #Konstante2
  #Konstante3 = 100
  #Konstaten4
  ...
EndEnumeration

Debug #PB_Compiler_EnumerationValue
Weitere Erläuterungen in der Hilfe :wink:

Zu 2:

Code: Alles auswählen

MaxClientConnections = 10

Structure struct_Client
   ID.i
   IP.s
   Port.s
EndStructure

Dim Client.struct_Client(MaxClientConnections-1)
; Dim Client(MaxClientConnections-1) as struct_Client
Zu 3.
Rückgabewerte stehen in der Hilfe. Ein Handle wird hiernach als Pointer oder Integer zurückgegeben.
Das ist "Standard".
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
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Wichtige Fragen zum programmieren mit PureBasic

Beitrag von Derren »

Wurde ja schon einiges beantwortet
Shamos hat geschrieben:4) Wie und inwieweit funktioniert bzw. realisiert man in PB das TypeCasting?
Beispielsweise kann ich in einem Code $FF schreiben doch funktioniert ein Dec($FF) beispielsweise nicht.
Ebensowenig ein binvar = !1001
Dec() ist keine Funktion in PB^^ Musst schon die richtige Funktion nehmen (Val()) und dann auch in der Hilfe nachschauen. Da steht nämlich wie ts-soft schon deine Frage 3 beantwortet hat, dass du einen String übergeben musst

Code: Alles auswählen

Debug Val("$FF")

;binvar geht deswegen nicht, weil Binärzahlen in Pb mit % anfangen
binvar = %1001
Shamos hat geschrieben: Wie setze ich z.B. das nachfolgende CodeBeispiel (sinnesgemäß) korrekt in PB um?
So:

Code: Alles auswählen

Define *pointera
Define *pointerb
Define adrpointera.i
Define adrpointerb.i
adrpointera = @*pointera
adrpointerb = @*pointerb
Zumindest glaube ich, dass es das ist was du machen willst. Also einen Pointer auf den Pointer. Denn der Pointer an sich zeigt ja schon auf eine Speicheradresse (in dem Beispiel 0). Wenn du nur die Speicheradresse in eine andere Variable packen willst kannst du das einfach so machen.

Code: Alles auswählen

Define *pointerA
Define *pointerB
Define zahl

*pointerB = *pointerA 
;oder
zahl = *pointerA
Signatur und so
Shamos
Beiträge: 32
Registriert: 12.11.2014 09:44

Re: Wichtige Fragen zum programmieren mit PureBasic

Beitrag von Shamos »

Erst mal vielen Dank, für die viele und schnelle Hilfe von euch :)

Zu (2) Wie definiere/deklariere ich ein Array vom Datentyp einer zuvor selbst definierten Struktur?

Ich hab die Definition nun so eingefügt und die nimmt der Compiler nun ohne weiteres an, aber :D
Wenn ich dann eine Abfrage habe wie z.B: -- If Client.ID(i) <> 0 -- meckert der Compiler
mit der Meldung, das er die struktur nicht gefunden hat. Ändere ich diese Zeile ab in -- If Client(i).ID <> 0
meckert der Compiler auch, Meldung "Unbrauchbarer Code am ende der Zeile".

Beim letzten kann ich das ja verstehen, nur wieso beim ersten Beispiel?
Er hat doch die Struktur mit dem Element ID zugewiesen bekommen?!?!?


Zu (7) Wie fange ich ein CTRL+C in PB-Programmen ab?
Ähm ja, also das mit AddKeyboardShortcut(#Win,#PB_Shortcut_Control|#PB_Shortcut_C,#Menu_Quit) zu realisieren
wird mir vermutlich nicht viel nutzen, da es sich bei dem "Fenster" um eine Konsole handelt oder kann ich das auch irgendwie als #Win angeben?

Abgesehen davon wie schalte ich die Konsole eigentlich in den FullScreen-Modus(ein/aus)?
Windows 8.1 x64 | PureBasic 5.31 x64 | Dell Inspiron 3847 | i5-4440 3.1Ghz | 8GB DDR3 | Nvidia Geforce 625
TKRoth
Beiträge: 32
Registriert: 24.02.2012 15:34
Wohnort: Hamburg
Kontaktdaten:

Re: Wichtige Fragen zum programmieren mit PureBasic

Beitrag von TKRoth »

Zu 2.:
if Client(i)\ID=...
Wenn du in der IDE das '\' eingibst, zeigt dir eine Toolbox schon die möglichen Variablen der Struktur.
Computer werden benötigt um Probleme zu lösen die man ohne Computer nicht hätte.
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: Wichtige Fragen zum programmieren mit PureBasic

Beitrag von ts-soft »

zu 2)

Code: Alles auswählen

For i = 0 To 9
  If Client(i)\ID <> 0
    ; Rülps mal
  EndIf
Next 
Also member erreicht man mit \ und nicht punkt, dieser ist ja bereits belegt.

Zu 7)
Bei AddKeyboardShortCut(0, #PB_Shortcut_Control|#PB_Shortcut_C, 0)
handelt es sich um einen Shortcut für Windows und hat nichts mit einer Console zu tun.
Normalerweise wird diese ShortCuts für Copy genutzt und nicht für das Abbrechen, dafür
ist eher ESC vorgesehen.

ShortCuts der jeweiligen Console ist OS Abhängig und mit der jeweiligen API zu händeln.

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
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Re: Wichtige Fragen zum programmieren mit PureBasic

Beitrag von Shardik »

ts-soft hat geschrieben:ShortCuts der jeweiligen Console ist OS Abhängig und mit der jeweiligen API zu händeln.
Ein Beispiel, wie man einen ConsoleHandler einrichtet und u.a. <Ctrl>+<C> in einer (Windows-)Konsole entdeckt, stammt übrigens von Thomas höchstselbst: :wink:
http://www.purebasic.fr/german/viewtopi ... 26&start=2
Shamos
Beiträge: 32
Registriert: 12.11.2014 09:44

Re: Wichtige Fragen zum programmieren mit PureBasic

Beitrag von Shamos »

Ich bedanke mich auch bei dir für deine Anwort @Shardik.

Vermutlich gibt es die Funktion "SetConsoleCtrlHandler_" nicht in der Demoversion,
zumindest meckert der Compiler das es diese Funktion nicht gibt, oder in der
DemoVersion nicht verfügbar ist. Ebenso ist diese Funktion auch in der Hilfe nicht zu finden.

Des weiteren meckert der Compiler auch wegen der Allen Events in dem von Dir
benannten Programmbeispiel: #CTRL_C_EVENT, #CTRL_CLOSE_EVENT,
#CTRL_BREAK_EVENT, #CTRL_LOGOFF_EVENT, #CTRL_SHUTDOWN_EVENT
das es diese nicht geben würde, was hoffentlich nur daran liegt
das ich aktuell die DEMOversion von PB am Start habe.

Was mir in dem Zusammenhang auch gerade noch auffällt ist,
das irgendwie Funktionen oder Variablen zum ermitteln der Fenstergröße
der Konsole fehlen, also wieviele Zeilen und Spalten die Konsole hat.
Windows 8.1 x64 | PureBasic 5.31 x64 | Dell Inspiron 3847 | i5-4440 3.1Ghz | 8GB DDR3 | Nvidia Geforce 625
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Wichtige Fragen zum programmieren mit PureBasic

Beitrag von Derren »

Shamos hat geschrieben:Ich bedanke mich auch bei dir für deine Anwort @Shardik.

Vermutlich gibt es die Funktion "SetConsoleCtrlHandler_" nicht in der Demoversion
Die Funktionen mit einem Unterstrich "Funktion_()" sind API-Funktionen des Betriebssystems. Diese werden in der Tat in der Demo Version nicht direkt unterstützt.
Du könntest aber die jeweilige Windows-Bibliothek einbinden und die Funktion manuell importieren. Ich glaube das geht auch in der Demo.

Da es eben eine Windows-Funktion ist und keine PB-Funktion steht sie logischerweise auch nicht in der PB-Hilfe, sondern in der MSDN (Microsoft Developer Network) http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Selbiges gilt auch für die genannten Konstanten. Das sind auch Konstanten von Windows selbst, die in der Vollversion von PB ohne das manuelle einbinden von Windows-Bibliotheken verfügbar sind. Das nenn ich Service :)
Shamos hat geschrieben:Was mir in dem Zusammenhang auch gerade noch auffällt ist,
das irgendwie Funktionen oder Variablen zum ermitteln der Fenstergröße
der Konsole fehlen, also wieviele Zeilen und Spalten die Konsole hat.
Da es in PB keine Funktionen zum ändern der Konsolengröße gibt kannst du diese Werte als Konstant betrachten. (B=80 - H=25) Windows selbst bietet aber glaube ich Befehle zur Änderung und auch zur Ermittlung dieser Werte an. Aber halt nur in der Vollversion, oder wenn du die entsprechende Bibliothek selbst einbindest.
Signatur und so
Antworten