Hinweise + Vorschläge f. bessere Befehls-Beschreibungen etc.

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

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

Beitrag 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
Shephard
Beiträge: 1
Registriert: 17.04.2011 23:16

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

Beitrag 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
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

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

Beitrag 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)
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: Hinweise + Vorschläge f. bessere Befehls-Beschreibungen

Beitrag 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)
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
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

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

Beitrag 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.
ullmann
Beiträge: 205
Registriert: 28.10.2005 07:21

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

Beitrag 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.
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

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

Beitrag 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
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
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: Hinweise + Vorschläge f. bessere Befehls-Beschreibungen

Beitrag von ts-soft »

@CSHW89
Das da dann ein Fehler kommt ist doch eigentlich klar wie Klosbrühe :wink:
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
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

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

Beitrag 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
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

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

Beitrag 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
Antworten