Seite 11 von 18

Re: Hinweise + Vorschläge f. bessere Befehls-Beschreibungen

Verfasst: 25.10.2010 16:31
von Nino
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

Re: Hinweise + Vorschläge f. bessere Befehls-Beschreibungen

Verfasst: 17.04.2011 23:53
von Shephard
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) :

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

Verfasst: 18.04.2011 03:07
von TomS
@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:

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)

Re: Hinweise + Vorschläge f. bessere Befehls-Beschreibungen

Verfasst: 13.05.2011 19:17
von Mok
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

Verfasst: 13.05.2011 20:15
von Nino
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)
Ich meine, es sollte jedem Assembler-Programmierer klar sein, dass das passieren kann.

Re: Hinweise + Vorschläge f. bessere Befehls-Beschreibungen

Verfasst: 18.09.2011 13:42
von ullmann
Vorschlag eines komplexen Beispieles für die Kapitel Memory, Strukturen und Zeiger:

enthalten: Strukturen

Code: Alles auswählen

Structure Eigenschaft_A
  Eigenschaft_A1.a
  Eigenschaft_A2.a
EndStructure
enthalten: Strukturen in Strukturen

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
enthalten: überlagerte Strukturen

Code: Alles auswählen

Structure Flexibler_Zeiger
  StructureUnion     
enthalten: undefinierte Arrays in Strukturen

Code: Alles auswählen

Eigenschaften_A.Eigenschaft_A[0] 
enthalten: Zeiger in Strukturen

Code: Alles auswählen

Structure Simulationsobjekt
  Eigenschaft_SO.a                                             ; eine nichtdynamische Eigenschaft
  *Speicher_SO                                                 ; Speicherblockzeiger für dynamische Eigenschaften
EndStructure
enthalten: strukturierte Arrays

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
enthalten: Zeigerarithmetik mit SizeOf()

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)
enthalten: AllocateMemory()

Code: Alles auswählen

*Speicheranfang = AllocateMemory(Bedarf)
enthalten: Syntax: Zeiger in Arrays ohne " * "

Code: Alles auswählen

 Simulationsobjekte(a)\Speicher_SO = *Speicheranfang        ; Speicherblock dem Simulationsobjekt zuweisen
enthalten: temporäre flexible Zeiger

Code: Alles auswählen

*Tempzeiger.Flexibler_Zeiger  = *Speicheranfang            ; temporären flexiblen Zeiger auf den Anfang setzen
enthalten: komplette Strukturen in den Speicherblock schreiben

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
enthalten: Werkzeug Speicheranzeige und Funktion MemorySize()

Code: Alles auswählen

ShowMemoryViewer(Simulationsobjekte(a)\Speicher_SO, MemorySize(Simulationsobjekte(a)\Speicher_SO))
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.

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
Rainer Ullmann

Edit: String-Hinweis ergänzt.

Re: Hinweise + Vorschläge f. bessere Befehls-Beschreibungen

Verfasst: 30.01.2012 18:33
von CSHW89
Bin grad über was gestolpert, was man villeicht in der Hilfe genauer erklären sollte:

Code: Alles auswählen

If ExaminePreferenceKeys()
  While NextPreferenceKey()
    PreferenceGroup("Change") ; VERURSACHT FEHLER!
  Wend
EndIf
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

Re: Hinweise + Vorschläge f. bessere Befehls-Beschreibungen

Verfasst: 30.01.2012 19:09
von ts-soft
@CSHW89
Das da dann ein Fehler kommt ist doch eigentlich klar wie Klosbrühe :wink:

Re: Hinweise + Vorschläge f. bessere Befehls-Beschreibungen

Verfasst: 30.01.2012 19:33
von CSHW89
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

Re: Hinweise + Vorschläge f. bessere Befehls-Beschreibungen

Verfasst: 31.01.2012 09:04
von Nino
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