Hinweise + Vorschläge f. bessere Befehls-Beschreibungen etc.
Re: Hinweise + Vorschläge f. bessere Befehls-Beschreibungen
And, Or, XOr, Not
Wenn man einen dieser Operatoren in die IDE schreibt, den Cursor draufsetzt und F1 drückt, wäre es sinnig dass dann die passende Seite der Hilfe erscheint.
Grüße, Nino
Wenn man einen dieser Operatoren in die IDE schreibt, den Cursor draufsetzt und F1 drückt, wäre es sinnig dass dann die passende Seite der Hilfe erscheint.
Grüße, Nino
Re: Hinweise + Vorschläge f. bessere Befehls-Beschreibungen
Hi,
ich hab grad einen unschönen Fehler bei der Verwendung von OpenScreen() und OpenWindowedScreen() gefunden. Es verursacht die falsche Handhabung von double Variablen als float. Da es kein Problem von PureBasic, sondern wohl eins von DirectX ist, ist es kein Fall fürs Bug-Forum, aber man sollte evtl. in der Beschreibung dieser Befehle auf den Effekt und dessen Umgehung hinweisen.
Problembeschreibung:
http://www.purebasic.fr/english/viewtop ... =4&t=44975
Beispielcode; wenn die auskommentierten Zeilen aktiviert werden, funktioniert alles, wie's soll (aber keine Ahnung, was diese Befehle eigentlich bewirken) :
ich hab grad einen unschönen Fehler bei der Verwendung von OpenScreen() und OpenWindowedScreen() gefunden. Es verursacht die falsche Handhabung von double Variablen als float. Da es kein Problem von PureBasic, sondern wohl eins von DirectX ist, ist es kein Fall fürs Bug-Forum, aber man sollte evtl. in der Beschreibung dieser Befehle auf den Effekt und dessen Umgehung hinweisen.
Problembeschreibung:
http://www.purebasic.fr/english/viewtop ... =4&t=44975
Beispielcode; wenn die auskommentierten Zeilen aktiviert werden, funktioniert alles, wie's soll (aber keine Ahnung, was diese Befehle eigentlich bewirken) :
Code: Alles auswählen
;FPU_ControlWord.w
;!fstcw [v_FPU_ControlWord]
InitSprite()
double.d+0.1
Debug double
OpenWindow(0,1,1,1,1,"")
OpenWindowedScreen(WindowID(0),1,1,1,1,0,0,0)
;!fldcw [v_FPU_ControlWord]
double=0
double+0.1
Debug double
Re: Hinweise + Vorschläge f. bessere Befehls-Beschreibungen
@Shephard: Die DirectX-Befehle verändern anscheinend irgendeine Einstellung der FPU
Dieser Wert wird ausgelesen und nach den DirectX-Befehlen wieder zurückgeschrieben.
Im Prinzip sowas nur eben auf FPU-Ebene anstatt auf Dateisystem-Ebene:
Dieser Wert wird ausgelesen und nach den DirectX-Befehlen wieder zurückgeschrieben.
Im Prinzip sowas nur eben auf FPU-Ebene anstatt auf Dateisystem-Ebene:
Code: Alles auswählen
Procedure BoeseDirectXFunktion()
OpenFile(0, "C:\ImportantSettings.dat")
WriteWord(0, Random( SizeOf(word) ) )
CloseFile(0)
EndProcedure
Define FPU_ControlWord.w
ReadFile(0, "C:\ImportantSettings.dat")
FPU_ControlWord = ReadWord(0) ;!fstcw [v_FPU_ControlWord]
CloseFile(0)
BoeseDirectXFunktion() ;aka. InitSprite(), OpenScreen() etc...
OpenFile(0, "C:\ImportantSettings.dat")
WriteWord(0, FPU_ControlWord) ;!fldcw [v_FPU_ControlWord]
CloseFile(0)
- 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: Hinweise + Vorschläge f. bessere Befehls-Beschreibungen
Inline x86 ASM
Ich fänds gut, wenn irgendwo erwähnt wird, dass Schlüsselwörter wie Debug die CPU-Register verändern. (siehe http://www.purebasic.fr/german/viewtopi ... 58#p290358)
Ich fänds gut, wenn irgendwo erwähnt wird, dass Schlüsselwörter wie Debug die CPU-Register verändern. (siehe http://www.purebasic.fr/german/viewtopi ... 58#p290358)
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
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Re: Hinweise + Vorschläge f. bessere Befehls-Beschreibungen
Ich meine, es sollte jedem Assembler-Programmierer klar sein, dass das passieren kann.Mok hat geschrieben:Inline x86 ASM
Ich fänds gut, wenn irgendwo erwähnt wird, dass Schlüsselwörter wie Debug die CPU-Register verändern. (siehe http://www.purebasic.fr/german/viewtopi ... 58#p290358)
Re: Hinweise + Vorschläge f. bessere Befehls-Beschreibungen
Vorschlag eines komplexen Beispieles für die Kapitel Memory, Strukturen und Zeiger:
enthalten: Strukturenenthalten: Strukturen in Strukturen
enthalten: überlagerte Strukturen
enthalten: undefinierte Arrays in Strukturen
enthalten: Zeiger in Strukturen
enthalten: strukturierte Arrays
enthalten: Zeigerarithmetik mit SizeOf()
enthalten: AllocateMemory()
enthalten: Syntax: Zeiger in Arrays ohne " * "
enthalten: temporäre flexible Zeiger
enthalten: komplette Strukturen in den Speicherblock schreiben
enthalten: Werkzeug Speicheranzeige und Funktion MemorySize()
Das Beispiel ist von grundlegender Natur mit allgemeinem Nutzen. Es zeigt, wie Speicherblöcke einem Array zugewiesen werden und wie unterschiedliche Mengen von verschiedenen Strukturen in einen Speicherblock geschrieben werden. Einige der aufgeführten Elemente fehlen bisher in der Hilfe und ich musste mir vieles durch Ausprobieren selber aneignen. Danke auch an Stargate und die anderen, die mir diesbezüglich geholfen haben.
Rainer Ullmann
Edit: String-Hinweis ergänzt.
enthalten: Strukturen
Code: Alles auswählen
Structure Eigenschaft_A
Eigenschaft_A1.a
Eigenschaft_A2.a
EndStructure
Code: Alles auswählen
Structure C3
C3_1.a
C3_2.a
EndStructure
Structure Eigenschaft_C
Eigenschaft_C1.a
Eigenschaft_C2.a
Eigenschaft_C3.C3
Eigenschaft_C4.a
EndStructure
Code: Alles auswählen
Structure Flexibler_Zeiger
StructureUnion
Code: Alles auswählen
Eigenschaften_A.Eigenschaft_A[0]
Code: Alles auswählen
Structure Simulationsobjekt
Eigenschaft_SO.a ; eine nichtdynamische Eigenschaft
*Speicher_SO ; Speicherblockzeiger für dynamische Eigenschaften
EndStructure
Code: Alles auswählen
For i = 0 To Simzaehler_A - 1 ; Eigenschaften A mit Testdaten füllen
Eigenschaften_A(i)\Eigenschaft_A1 = 11 + Random(8)
Eigenschaften_A(i)\Eigenschaft_A2 = 11 + Random(8)
Next i
Code: Alles auswählen
Bedarf = SizeOf(Zaehler) + Simzaehler_A * SizeOf(Eigenschaft_A) ; Speicherbedarf berechnen
Bedarf + Simzaehler_B * SizeOf(Eigenschaft_B)
Bedarf + Simzaehler_C * SizeOf(Eigenschaft_C)
Code: Alles auswählen
*Speicheranfang = AllocateMemory(Bedarf)
Code: Alles auswählen
Simulationsobjekte(a)\Speicher_SO = *Speicheranfang ; Speicherblock dem Simulationsobjekt zuweisen
Code: Alles auswählen
*Tempzeiger.Flexibler_Zeiger = *Speicheranfang ; temporären flexiblen Zeiger auf den Anfang setzen
Code: Alles auswählen
For i = 0 To Simzaehler_A - 1 ; Eigenschaften A in Speicherblock schreiben
*Tempzeiger\Eigenschaften_A[i] = Eigenschaften_A(i)
Next i
Code: Alles auswählen
ShowMemoryViewer(Simulationsobjekte(a)\Speicher_SO, MemorySize(Simulationsobjekte(a)\Speicher_SO))
Code: Alles auswählen
; Dieses Beispiel zeigt die Erstellung von Speicherblöcken in Arrays und
; das Schreiben dynamischer Eigenschaften mit unterschiedlichen Strukturen in einen Speicherblock.
; Der Einsatz ist bei der Verwendung von vielen Objekten sinnvoll, weil dann Listen in Arrays
; extrem viel Speicherplatz benötigen würden.
; Aufbau eines Speicherblockes: Zähler A, Zähler B, Zähler C, x Eigenschaften A, y Eigenschaften B, z Eigenschaften C
; sollen Strings in den dynamischen Eigenschaften enthalten sein, so müssen das statische Strings sein
#Max_Objekte = 3
Structure Eigenschaft_A
Eigenschaft_A1.a
Eigenschaft_A2.a
EndStructure
Structure Eigenschaft_B
Eigenschaft_B1.a
Eigenschaft_B2.a
Eigenschaft_B3.a
EndStructure
Structure C3
C3_1.a
C3_2.a
EndStructure
Structure Eigenschaft_C
Eigenschaft_C1.a
Eigenschaft_C2.a
Eigenschaft_C3.C3
Eigenschaft_C4.a
EndStructure
Structure Zaehler
Zaehler_A.l
Zaehler_B.l
Zaehler_C.l
EndStructure
Structure Flexibler_Zeiger
StructureUnion ; überlagerte Zeigerstrukturen
Zaehler.Zaehler
Eigenschaften_A.Eigenschaft_A[0] ; undefinierte Arrays
Eigenschaften_B.Eigenschaft_B[0]
Eigenschaften_C.Eigenschaft_C[0]
EndStructureUnion
EndStructure
Structure Simulationsobjekt
Eigenschaft_SO.a ; eine nichtdynamische Eigenschaft
*Speicher_SO ; Speicherblockzeiger für dynamische Eigenschaften
EndStructure
Dim Simulationsobjekte.Simulationsobjekt(#Max_Objekte - 1) ; Simulationsobjekte
Define.l Simzaehler_A, Simzaehler_B, Simzaehler_C ; Zähler mit Typ Long definieren
Define.i Bedarf, Offset ; Bedarf und Offset mit Typ Integer definieren
For a = 0 To #Max_Objekte - 1
Simulationsobjekte(a)\Eigenschaft_SO = 1 + Random(8) ; eine nichtdynamische Eigenschaft des Simulationsobjektes, die direkt im Array gespeichert wird
Simzaehler_A = Random(2) + 2 ; Anzahl Eigenschaften A: 2 bis 4 diese dynamischen Eigenschaften müssen in den Speicherblock
Simzaehler_B = Random(2) + 2 ; Anzahl Eigenschaften B: 2 bis 4
Simzaehler_C = Random(2) + 2 ; Anzahl Eigenschaften C: 2 bis 4
Dim Eigenschaften_A.Eigenschaft_A(Simzaehler_A - 1) ; Eigenschaften anlegen
Dim Eigenschaften_B.Eigenschaft_B(Simzaehler_B - 1)
Dim Eigenschaften_C.Eigenschaft_C(Simzaehler_C - 1)
For i = 0 To Simzaehler_A - 1 ; Eigenschaften A mit Testdaten füllen
Eigenschaften_A(i)\Eigenschaft_A1 = 11 + Random(8)
Eigenschaften_A(i)\Eigenschaft_A2 = 11 + Random(8)
Next i
For i = 0 To Simzaehler_B - 1 ; Eigenschaften B mit Testdaten füllen
Eigenschaften_B(i)\Eigenschaft_B1 = 21 + Random(8)
Eigenschaften_B(i)\Eigenschaft_B2 = 21 + Random(8)
Eigenschaften_B(i)\Eigenschaft_B3 = 21 + Random(8)
Next i
For i = 0 To Simzaehler_C - 1 ; Eigenschaften C mit Testdaten füllen
Eigenschaften_C(i)\Eigenschaft_C1 = 31 + Random(8)
Eigenschaften_C(i)\Eigenschaft_C2 = 31 + Random(8)
Eigenschaften_C(i)\Eigenschaft_C3\C3_1 = 41 + Random(8)
Eigenschaften_C(i)\Eigenschaft_C3\C3_2 = 41 + Random(8)
Eigenschaften_C(i)\Eigenschaft_C4 = 51 + Random(8)
Next i
Bedarf = SizeOf(Zaehler) + Simzaehler_A * SizeOf(Eigenschaft_A) ; Speicherbedarf berechnen
Bedarf + Simzaehler_B * SizeOf(Eigenschaft_B)
Bedarf + Simzaehler_C * SizeOf(Eigenschaft_C)
*Speicheranfang = AllocateMemory(Bedarf)
If *Speicheranfang
Simulationsobjekte(a)\Speicher_SO = *Speicheranfang ; Speicherblock dem Simulationsobjekt zuweisen
*Tempzeiger.Flexibler_Zeiger = *Speicheranfang ; temporären flexiblen Zeiger auf den Anfang setzen
*Tempzeiger\Zaehler\Zaehler_A = Simzaehler_A ; Eigenschaftenzähler A, B, C in Speicherblock schreiben
*Tempzeiger\Zaehler\Zaehler_B = Simzaehler_B
*Tempzeiger\Zaehler\Zaehler_C = Simzaehler_C
Offset = SizeOf(Zaehler) ; Zeigerverschiebung ermitteln
*Tempzeiger = *Speicheranfang + Offset ; Zeiger weiterrücken
For i = 0 To Simzaehler_A - 1 ; Eigenschaften A in Speicherblock schreiben
*Tempzeiger\Eigenschaften_A[i] = Eigenschaften_A(i)
Next i
Offset + Simzaehler_A * SizeOf(Eigenschaft_A) ; Offset erhöhen
*Tempzeiger = *Speicheranfang + Offset ; Zeiger weiterrücken
For i = 0 To Simzaehler_B - 1 ; Eigenschaften B in Speicherblock schreiben
*Tempzeiger\Eigenschaften_B[i] = Eigenschaften_B(i)
Next i
Offset + Simzaehler_B * SizeOf(Eigenschaft_B) ; Offset erhöhen
*Tempzeiger = *Speicheranfang + Offset ; Zeiger weiterrücken
For i = 0 To Simzaehler_C -1 ; Eigenschaften C in Speicherblock schreiben
*Tempzeiger\Eigenschaften_C[i] = Eigenschaften_C(i)
Next i
EndIf
Next a
MessageRequester("Hinweis", "Bitte nutzen Sie in den folgenden Speicheranzeigen die Byte-Tabelle und ziehen Sie das Fenster ausreichend groß.")
For a = 0 To #Max_Objekte - 1
If Simulationsobjekte(a)\Speicher_SO
ShowMemoryViewer(Simulationsobjekte(a)\Speicher_SO, MemorySize(Simulationsobjekte(a)\Speicher_SO))
If a < #Max_Objekte - 1
MessageRequester("Weiter", "Weiter gehts.")
EndIf
Else
MessageRequester("Fehler", "Speicherblock konnte nicht angelegt werden.")
EndIf
Next a
Edit: String-Hinweis ergänzt.
Re: Hinweise + Vorschläge f. bessere Befehls-Beschreibungen
Bin grad über was gestolpert, was man villeicht in der Hilfe genauer erklären sollte:
Die PreferenceGroup in einem ExaminePreferenceKeys()-Block ändern, ist nicht gut! Hatte extra vorher in der Hilfe nachgeguckt, und dachte mir, dass die aktuelle Gruppe beim Aufruf von ExaminePreferenceKeys wichtig ist, nicht auch danach.
lg kevin
Code: Alles auswählen
If ExaminePreferenceKeys()
While NextPreferenceKey()
PreferenceGroup("Change") ; VERURSACHT FEHLER!
Wend
EndIf
lg kevin
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
- 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: Hinweise + Vorschläge f. bessere Befehls-Beschreibungen
@CSHW89
Das da dann ein Fehler kommt ist doch eigentlich klar wie Klosbrühe
Das da dann ein Fehler kommt ist doch eigentlich klar wie Klosbrühe
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.
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Re: Hinweise + Vorschläge f. bessere Befehls-Beschreibungen
Ja findest du? Ich nämlich nicht. Ich finde, es hängt stark von der internen Verarbeitung von Preferences und diesen beiden Befehlen zusammen. Warum sollte ExaminePreferenceKeys() nicht in einer Variable speichert, welche Gruppe grad aktuell ist, und NextPreferenceKey() diese dann benutzen. Nach meiner Erfahrung mit Examine/Next-Befehlen kann man eine solche Sequence nicht von außen "kaputt machen". Hier aber schon. Naja ich finde nur, man sollte es erwähnen.
lg kevin
lg kevin
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Re: Hinweise + Vorschläge f. bessere Befehls-Beschreibungen
Es ist unmöglich in der Hilfe alles zu erwähnen, was man nicht machen soll.
Dass keine weiteren Schlüssel der aktuellen Gruppe mehr gelesen werden können, wenn die aktuelle Gruppe sich ändert, finde ich nicht sooo überraschend.
Grüße, Nino
Dass keine weiteren Schlüssel der aktuellen Gruppe mehr gelesen werden können, wenn die aktuelle Gruppe sich ändert, finde ich nicht sooo überraschend.
Grüße, Nino