Diskussion über Frequently Asked Questions

Hier kannst du häufig gestellte Fragen/Antworten und Tutorials lesen und schreiben.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Diskussion über Frequently Asked Questions

Beitrag von Mok »

N'Tag! Da ich jetzt auch Kaerus Meinung teile, dass eine "very ultimate FAQ" nichts schlechtes wäre, hab ich mich mal inspirieren lassen und die gefragten Fragen gesammelt, die ich am öftesten und interessantesten fand. Ich werde wenn ich wieder etwas mehr Zeit habe auch die bis jetzt geschriebenen FAQ-Threads in diesem Subforum verliken, weil wir wollen das Rad ja kein zweites Mal erfinden.

Frage: Warum sollte ich vor Beginn des eigentlichen Programmes immer SetCurrentDirectory(GetPathPart(GetProgramFilename())) machen?
Antwort: Mit der o.g. Befehlsfolge setzt man den aktiven Pfad auf den Ort der Executable. Wenn ihr also LoadSound(0,"test.wav") aufruft, wird im Programmordner nach der test.wav gesucht. Aber wozu das ganze? Das ganze könnte man vergessen, wenn
  • Das Programm durch doppelklick im Explorer gestartet wurde
  • Das Programm per Verknüpfung ausgeführt wird, in der "Ausführen in..." angegeben ist
  • Bei RunProgram() der 3. Parameter angegeben wurde.
Da dies nicht immer der Fall ist geht man besser auf Nummer Sicher und fügt die o.g. Zeile am Anfang des Codes ein.

F: Was ist der Unterschied zwischen IncludePath und SetCurrentDirectory()?
A: Alle Include-Funktionen sind Compilerfunktionen und alle Befehle sind Laufzeitbefehle. Was heißt das? Das heißt im Endeffekt, dass IncludePath nur für Include-Funktionen vorgesehen ist, und SetCurrentDirectory() für LaufzeitBefehle à la LoadXY().

F: Gibt es eine Hilfe für die WinAPI?
A: Ja! Sie liegt noch im (ur)alten Format .HLP vor und kann nur noch über das Windows SDK geladen werden. In der IDE kann man dann, wenn sich der Cursor über einem API-Befehl befindet, eine Tastenkombination drücken, die die Hilfe aufruft. Dazu braucht man jetzt leider ein extra Tool: LaunchWindowsSDK. (Früher ging's auch ohne, die Schuld daran hat das WinSDK)

F: Gibt es einen PureBasic-Decompiler?
A: Nein! Und sowas wird es dank Multi-Pass Compilierung auch nie geben. Zwar kann man den durch 2-Pass-Compilierung entstandenen Assemblercode disassemblieren, aber den originalen PB-Code bekommt man keinesfalls, da den PureBasic-Befehlen durch den Optimierungsvorgang während dem Compilen keine eindeutigen ASM-Codegruppen zugeordnet sind. Wenn ihr das nicht versteht ist es auch egal: Enteder das, was ihr wollt, ist OpenSource oder ihr müsst halt selber coden!

F: Gibt es einen Befehl, der verbietet undeklarierte Variablen zu benutzen?
A: Ja, dieser nennt sich EnableExplicit und sollte ausnahmslos bei jedem Projekt, das z. B. nicht eine OGRE-Demo ist, benutzt werden.

F: Muss ein Sprite, aus dem ich einen 3DSprite machen will unbedingt 16*16, 32*32, 64*64, 128*128 oder 256*256 sein?
A: Müssen nicht, es wird aber empfohlen. Extrem unpassende Verhältnisse (243x722) funzen auf NVidia-Karten jedenfalls besser als auf ATI-Karten. Außerdem funktionieren 3D-Funktionen mit 2^x * 2^y oder gar (2^n)² wesentlich schneller. Falls ihr aber eine Textur oder sonstwas habt, das zwingend in einem anderen Format sein muss, könntet ihr einen Schwedenrand (schwarzer Rand rundum das Sprite) machen, sofern nicht schon eine andere Farbe für TransparentSprite vorgesehen ist. Wenn schon, müsst ihr entweder langsame Grafik oder verzerrte Bilder in Kauf nehmen.

F: Wie finde ich das Windows-Verzeichnis/Temp-Verzeichnis?
A: Windows und Linux besitzen sog. Umgebungsvariablen. %windir% zeigt auf {Buchstabe}\Windows und %tmp% auf das temporäre Verzeichnis (meist C:\Users\<Name>\AppData\Local\Temp). PB bietet aber auch einen Befehl namens GetTemporaryDirectory() an, der den Namen des Temp-Verzeichnisses liefert.

F: Kann man zufällige Fließkommazahlen erzeugen?
A: Dafür gibt es keine native Funktion. STARGÅTE hat aber mal ein Makro dafür geschrieben: Klick!

F: Wenn ich F5 drücke bekomme ich folgende Fehlermeldung: Die Quellcodedatei oder das Projekt wird bereits von der IDE debuggt usw.
A: Das Programm läuft noch, die Runtime wurde aber vom Debugger angehalten. Also auf den Totenkopf klicken und danach sorgfältig nach Fehlern suchen (Arrayüberlauf, StackOverflow usw.)

F: Ich will eine DLL linken (= EXE daraus machen), bekomme aber einen PureBasic Assembler error. Was mache ich falsch?
A: DLLs und statische Libs mögen anscheinend keine Static-Variablen. Also alles was Static ist am besten zu Protected machen.

F: Ich habe eine GUI mit dem VisualDesigner erstellt und bekomme in der IDE aber eine Warnung wegen CreateGadgetList() ist das weiter schlimm?
A: Schlimm ist es nicht, CreateGadgetList() hat seit v4.00 aber keine Funktion mehr und kann getrost gelöscht werden.

F: Ich will ein 3D-Spiel machen! Welche Engine soll ich nehmen?
A: OGRE ist seit v4.00 in PureBasic mit dabei, allerdings gibt es einen Haufen anderer Engines auch, die einen PureBasic-Wrapper haben. X0r hat dazu mal einen seperaten Thread gemacht: Klick!. Im Großen und Ganzen ist es die Entscheidung des Programmierers, es gibt einfach keine perfekte Engine. Ich persönlich bevorzuge N3xt-D, eine weiterentwickelte Irrlicht-Engine.

F: Ich habe Code aus einer veralteten PureBasic-Version. Muss ich alles neu schreiben?
A: Nein, jemand hat dafür ein eigenes Tool entwickelt, das ich dank der verwurschtelten Forum-SuFu nicht finde >_<

F: Gibt es Gadgets für den Screen?
A: Nicht nativ, aber SGX von #NULL ist eine starke Lösung: Klick!

F: Kann man iin PureBasic auch Bildschirmschoner schreiben?
A: Da ein Bildschirmschoner nichts anderes ist als eine EXE im SCR-Format, ist es möglich, jedoch sollten per ProgramParameter() folgende Parameter abgefragt werden:
  • /c - Zeigt das "Einstellungen"-Fenster
  • /p <WindowID> - Zeigt den Schoner als 'Child' von <WindowID>. Nicht wirklich nötig.
  • /s - Führt den Schonder aus
Für den Abbruch beim Drücken einer Taste oder beom Bewegen der Maus muss man selber sorgen. Aber hier einmal das wichtigste für die Abfragen:

Code: Alles auswählen

InitMouse() : InitKeyboard()
MX = MouseX()
MY = MouseY()
Exit = #False

Repeat
  ExamineMouse() : ExamineKeyboard()
  If (MouseX() <> MX) Or (MouseY <> MY) Or KeyboardPushed(#PB_All) Or MouseButton(#PB_MouseButton_Left) Or MouseButton(#PB_MouseButton_Middle) Or MouseButton(#PB_MouseButton_Right)
    Exit = #True
  EndIf
Until Exit = #True
F: Gibt es einen Unterschied zwischen Microsofts INI- und PureBasics PREFS-Dateien?
A: Der einzige sichtbare Unterschied sind die Kommentarzeilen: Für PB ist es ein ";" und für Windows ein "#". Desweiteren kann man mit der API nur INIs lesen.

F: Ich möchte eine MP3-Datei abspielen. Geht das in PB?
A: Nur über einen Umweg durch die Movie-Lib: Statt die Datei als Sound zu laden, müsst ihr sie einfach als Movie laden und nachher auch abspielen. Meine Empfehlung: Nutzt OGG-Vorbis Sounddateien! Das Qualität/Größen-Verhältnis ist besser und ihr braucht auch nur UseOGGSoundDecoder() statt einer eigenen Lib.

F: Was hat es mit dem "InlineASM-Unterstützung einschalten" im Compiler-Menü auf sich?
A: Wenn man den Punkt aktiviert, ist es auch möglich NAsm (Netwide Assembler) zu programmieren (viele PB-Befehle wurden auch damit geschrieben). Der Vorteil ist eine ziemlich hohe Geschwindigkeit beim Compiliervorgang, allerdings sind Assemblersprachen wieder eine andere Ebene und deshalb hat das Forum wenig damit zu tun.

F: Was ist so schlimm an Threads?
A: Threads bedeuten ein hohes Risiko für die Programmstabilität. Threads gehören zu einem der letzten Kapitel, die ein PB-Programmierer lernen sollte. Um mit Threads sauber arbeiten zu können muss vor dem Programmieren genau überlegt werden, was benötigt wird und wie das Programm funktionieren soll. Fehlerhaftes nutzen von Threads führt in jedem Fall zur instabilität eines Programms und damit meistens undefinierten Fehlern!

F: Gibt es in PureBasic bool'sche Variablen?
A: Nein. #True und #False sind in PureBasic nur Integerzahlen mit den Konstanten: #True = 1 und #False = 0.

Frage: Darf man mit Logischen Ausdrücken rechnen?
Antwort: Offiziell nicht!
Logische Ausdrücke haben in PureBasic entwerder das Ergebnis 0 wenn der Ausdruck falsch ist, oder nicht 0.
Die Annahme das Wahr immer gleich 1 ist (was in PureBasic also #True) ist, muss nicht immer zutreffen.
Logischen Ausdrücke sollte immer in einem If Block stehen, und erst in der Fallunterscheidung, dann einer Variablen ein Wert zugeordnet werden.
Links: Operator NOT, #True is only 1, not all True, Vergleichs-Ausdruck liefert keinen boolschen Wert

Anmerkungen:
  • So, das war's jetzt erstmal. Wenn noch jemandem was einfällt kann er's ja drunterschreiben und ich oder ein Admin/Mod editiern's dann dazu.
  • Wenn jemand Wünsche, Anregungen, Beschwerden oder sonstwas bezüglich des Threads hat, bitte ein eigenes Thema eröffnen oder mir eine PN schicken, weil der Thread sonst unübersichtlich wird.
  • Wär auch schön, wenn jemand den Thread sticky macht, oder löscht, falls zu viel relevanzloses Zeuchs drin steht.
  • Evtl. auf die Index-Seite verlinken, damit's jeder Neuling gleich ins Auge sticht
ToDo:
  • Linkliste für andere FAQ-Threads
  • Evtl. themenbasiertes Inhaltsverzeichnis, falls noch mehr Fragen reinkommen
---------------------------

MfG, Mok

____________________________________________________________________________

Titel geändert.
Nutzt diesen Thread um euch sinnvoll abzusprechen und euer Team zu bilden.
den endgültigen FAG-Thread der dann sticky gemacht wird, kann euer Team dann neu anfangen.
- Kaeru
Zuletzt geändert von Mok am 09.04.2010 18:05, insgesamt 1-mal geändert.
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Frequently Asked Questions

Beitrag von STARGÅTE »

Bevor jetzt alle hier diskutieren, solltest du besser gleich noch n Thema erstellen:
Diskussion - Frequently Asked Questions

und die MODs verschieben dann das hier!

----

Zum Thema:
So, ist das sehr unübersichtlich, denn eh man seine Frage gefunden hat vergehen Jahre ...
Vllt sollte man im ersten Beitrag nur Fragen zu stehen haben (Alphabetisch geordnet)

und jede Frage zu einem Beitrag verlinken der darunter kommt.
Das mag zwar für mini-Antworten zu viel sein, ist aber dafür um so übersichtlicher
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
DarkDragon
Beiträge: 6267
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Frequently Asked Questions

Beitrag von DarkDragon »

Hallo,

Tolle Idee. Ich würde allerdings die Abstände größer machen zwischen den Fragen, da ich z.B. in der Zeile mit dem Keks-Smiley etwas verwirrt werde, oder eben so wie STARGATE es vorgeschlagen hat: im ersten Posting nur Fragen und Links, die zu den einzelnen Beiträgen springen. Außerdem geht bei MessageRequestern auch Strg + C und Strg + V. Dann wäre der Text lesbar und man müsste kein Bild mehr laden.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Little John

Re: Frequently Asked Questions

Beitrag von Little John »

Mok hat geschrieben:Frage: Warum sollte ich vor Beginn des eigentlichen Programmes immer SetCurrentDirectory(GetPathPart(GetProgramFilename())) machen?
Antwort: Mit der o.g. Befehlsfolge setzt man den aktiven Pfad auf den Ort der Executable. Wenn ihr also LoadSound(0,"test.wav") aufruft, wird im Programmordner nach der test.wav gesucht. Aber wozu das ganze? Das ganze könnte man vergessen, wenn
  • Das Programm durch doppelklick im Explorer gestartet wurde
  • Das Programm per Verknüpfung ausgeführt wird, in der "Ausführen in..." angegeben ist
  • Bei RunProgram() der 3. Parameter angegeben wurde.
Da dies nicht immer der Fall ist geht man besser auf Nummer Sicher und fügt die o.g. Zeile am Anfang des Codes ein.
Es ist keinesfalls nötig vor Beginn des eigentlichen Programmes immer SetCurrentDirectory(GetPathPart(ProgramFilename())) auszuführen. Z.B. brauche ich das nie!
Zum einen will man vielleich gar nicht auf Dateien im Programmverzeichnis zugreifen sondern z.B. auf Dateien im Verzeichnis %APPDATA%, zum anderen kennt man das Programmverzeichnis sowieso schon, es ist nämlich GetPathPart(ProgramFilename()). Es ist mitnichten erforderlich, das mit SetCurrentDirectory() als aktuelles Verzeichnis zu setzen.

Gruß, Little John
Zuletzt geändert von Little John am 09.04.2010 16:47, insgesamt 2-mal geändert.
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: Frequently Asked Questions

Beitrag von ts-soft »

Danke für die Arbeit, aber leider in dieser Form nicht besonders nützlich.

Total unübersichtlich.
Viele nicht ganz korrekte Aussagen
usw. (haben die anderen schon gesagt)

Vernünftig lösen läßt sich das ganze IMHO nur mit einem Wiki.
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
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Frequently Asked Questions

Beitrag von STARGÅTE »

Aber ein WIKI würde auch nicht "davor schützen" das immer wieder die ähnlichen Fragen gestellt werden.
Denn wenn einer die Suche nicht nutzen will, dann ist es egal wo er sie nicht nutzt ^^



Weitere FAQ:


Frage: Gibt es in PureBasic einen Variablen-Typ Boolean?
Antwort: Nein. True und False sind in PureBasic nur Integerzahlen mit den Konstanten: #True = 1 und #False = 0
_____________________________

Frage: Darf man mit Logischen Ausdrücken rechnen?
Antwort: Offiziell nicht!
Logische Ausdrücke haben in PureBasic entwerder das Ergebnis 0 wenn der Ausdruck falsch ist, oder nicht 0.
Die Annahme das Wahr immer gleich 1 ist (was in PureBasic also #True) ist, muss nicht immer zutreffen.
Logischen Ausdrücke sollte immer in einem If Block stehen, und erst in der Fallunterscheidung, dann einer Variablen ein Wert zugeordnet werden.

Links: Operator NOT, #True is only 1, not all True, Vergleichs-Ausdruck liefert keinen boolschen Wert



EDIT:

Was mir eben noch einfällt:
- Bei Antworten sollten imer genug weiterführende Links dazustehen!
- In den Antworten sollten Behauptungen oder Infos immer mit Quellenverweis stehen:
"Das ist Verboten!" STARGÅTE und dann auch den Link wo er es gesagt hat...
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
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: Frequently Asked Questions

Beitrag von helpy »

STARGÅTE hat geschrieben:Frage: Gibt es in PureBasic einen Variablen-Typ Boolean?
Antwort: Nein. True und False sind in PureBasic nur Integerzahlen mit den Konstanten: #True = 1 und #False = 0
Die Werte der Konstanten sind 1 und 0!

Zusätzliche Information: Ein Wert <> 0 (also auch -10, 1234, ... und nicht nur die Konstante #TRUE) wird in Abfragen (IF, While, Until) als WAHR gewertet!

Code: Alles auswählen

; Deshalb ist auch folgendes Möglich:
*mem = AllocateMemory( BlockSize )
    ; Speicher konnte nicht reserviert werden!
    ; ...
If Not *mem
EndIf
Windows 10
PB Last Final / (Sometimes testing Beta versions)
DarkDragon
Beiträge: 6267
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Frequently Asked Questions

Beitrag von DarkDragon »

Ah noch was:
F: Ich will eine DLL linken (= EXE daraus machen), bekomme aber folgenden Fehler:
Bild Was mache ich falsch?
A: DLLs und statische Libs mögen anscheinend keine Static-Variablen. Also alles was Shared ist am besten zu Protected machen.
Also wenn was static ist soll man shared zu protected machen? :lol:
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: Frequently Asked Questions

Beitrag von Mok »

DarkDragon hat geschrieben:Also wenn was static ist soll man shared zu protected machen? :lol:
Ähm... Kommentar folgt später :lol:
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Frequently Asked Questions

Beitrag von RSBasic »

@Mok
Also hier mein Senf...

Dein FAQ in dieser Form finde ich sehr unübersichtlich.
Ist zwar eine nette Idee, aber ich würds lieber auf einer extra Seite machen (vll. als Wiki oder am besten eine eigene Seite basteln).
Da kannst du all deine Fragen in Kategorien aufspalten.
Deine Fragen würde ich zuklappen, so dass man die Antworten aufklappen kann.
Und eine SuFu wär dann auch nicht schlecht.
Einige deiner Antworten müssen noch überarbeitet werden.
Einige sind entweder falsch oder unvollständig.

Aber ansonsten keine schlechte Idee.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Antworten