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 doubleRe: 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
EndStructureCode: 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
EndStructureCode: 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 iCode: 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 zuweisenCode: Alles auswählen
*Tempzeiger.Flexibler_Zeiger  = *Speicheranfang            ; temporären flexiblen Zeiger auf den Anfang setzenCode: Alles auswählen
For i = 0 To Simzaehler_A - 1                             ; Eigenschaften A in Speicherblock schreiben
      *Tempzeiger\Eigenschaften_A[i] = Eigenschaften_A(i)
Next iCode: 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
EndIflg 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