Diskussionen und Krempel (alt: Verbesserungen Doku v4)

Fragen und Bugreports zur PureBasic 4.0-Beta.
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

ullmann hat geschrieben: Bsp.
Meine Farbtiefe ist auf 16 Bit eingestellt.
In der Farbtabelle in der Hilfe ist $FFFFCC ein hellgelber Farbton.

Box(100,100,50,50,$FFFFCC) liefert jedoch eine hellblaue Box.
Damit sind die Farben in der Hilfe unbrauchbar.

Box(100,100,50,50,RGB($FF,$FF,$CC)) liefert die hellgelbe Box.
Es könnte also sein, dass die Farben in der Hilfe richtig sind, so dass der oben genannte Fehler ein Compiler-Fehler ist.
Nun, wenn du 16Bit Farbtiefe hast, aber deine Farbe als 24Bit übergibst sollte dich das Ergebnis doch nicht allzu sehr überraschen, oder? Sind ja schließlich 8 Bit zu viel ;)
Für diesen Fall gibt es ja auch, wie du ja auch schon bemerkt hast, die Funktion RGB welche unter jeder Farbtiefe einen halbwegs passenden Farbwert zurückgibt.
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

Der aus der Farbtabelle entnommene Wert kann nicht einfach als unveränderter Gesamt-Zahlenwert verwendet werden! Die 3 Einzelwerte RGB müssen folgendermassen zu einem Gesamtwert berechnet werden:
Gesamt = R*1+G*256+B*65536
Dann stimmen auch die Farben wieder!
@Andre: Im Beispiel für Box ist auch WindowOutput ohne Parameter!
Vielleicht wäre ein Hinweis auf die Umrechnung in der Farbtabelle auch nicht schlecht.

Gruss
Helle

P.S.: Wenn die Hex-Werte schon bekannt sind braucht man sie nur in der Reihenfolge BGR anzugeben (also aus FFFFCC wird CCFFFF) und alles ist auch wieder im Lot.
ullmann
Beiträge: 205
Registriert: 28.10.2005 07:21

Beitrag von ullmann »

@freedimension

Ich habe die Farbtiefe mal auf 32 bit umgestellt. Der "Fehler", besser der Effekt ist gleich: die hellblaue Box. Es liegt also nicht an der Farbtiefe.

@helle, @André

Die Umrechnung ist die Ursache, da finde ich es auch besser, wenn die Werte in der Farbtabelle gleich verwendbar geschrieben wären, also als BGR (im o.g. Bsp. CCFFFF) oder wenn wenigstens für die Umrechnung ein Hinweis und ein Beispiel in die Hilfe aufgenommen wird.

Gruß Rainer
In_Go
Beiträge: 20
Registriert: 06.02.2006 23:46
Wohnort: Eschau, Spessart

Beitrag von In_Go »

Hallo André

Ich habe mir mal die Mühe gemacht und alle möglichen Fälle der VariablenÜbergabe durch Zeiger zusammengestellt, und würde mich freuen wenn solches in die Dokumentation übernommen wird:

Code: Alles auswählen

;Beispiel für Syntax Variablenübergabe ByReference
; Art                               Declaration       Aufruf              Procedurekopf

;Array 1 Dimension                  Name(x(1))        Name(y(1))          Name(z(1))
;Array 2 Dimensionen                Name(x(2))        Name(y(2))          Name(z(2))
;Structurvariable                   Name(*x.struc)    Name(*y.struc)      Name(*z.struc)
;Array Strukturvariable 1 Dimension Name(x.struc(1))  Name(y.struc(1))    Name(z.struc(1))
;Array Strukturvariable 2 Dimension Name(x.struc(2))  Name(y.struc(2))    Name(z.struc(2))
;Liste                              Name(x())         Name(y())           Name(z())
;Structure Liste                    Name(x.struc())   Name(y())           Name(z.struc()) 


Dim EindimensionalArray.l(4) : EindimensionalArray.l(2)=2 : EindimensionalArray.l(3) = 3
Declare TauscheEindimensionalArray(a.l(1)) :TauscheEindimensionalArray(EindimensionalArray.l())
Debug "EindimensionalesArray Sollte 3,2 sein: "+Str(EindimensionalArray.l(2))+","+Str(EindimensionalArray.l(3))
Procedure TauscheEindimensionalArray(eindim.l(1))
  eindim.l(3)=2:eindim.l(2)=3
EndProcedure

Dim ZweidimensionalArray.l(4,4) : ZweidimensionalArray.l(2,2)=2 : ZweidimensionalArray.l(3,3) = 3
Declare TauscheZweidimensionalArray(a.l(2)) :TauscheZweidimensionalArray(ZweidimensionalArray.l())
Debug "ZweidimensionalesArray Sollte 3,2 sein: "+Str(ZweidimensionalArray.l(2,2))+","+Str(ZweidimensionalArray.l(3,3))
Procedure TauscheZweidimensionalArray(zweidim.l(2))
  zweidim.l(3,3)=2:zweidim.l(2,2)=3
EndProcedure

Structure mein
  zwei.l
  drei.l
EndStructure
StrVar.mein
StrVar.mein\zwei =2 :StrVar.mein\drei=3
Declare TauscheStrukturVariable(*sv.mein) :  TauscheStrukturVariable(StrVar.mein) 
Debug "StruktureVariable Sollte 3,2 sein: "+Str(StrVar.mein\zwei)+","+Str(StrVar.mein\drei)
Procedure TauscheStrukturvariable(*st.mein)
  *st.mein\drei =2 :*st.mein\zwei= 3
EndProcedure

Dim StrVarArray.mein(4)
StrVarArray.mein(2)\zwei =2 :StrVarArray.mein(3)\drei=3
Declare TauscheStrukturVariableArray(sv.mein(1)) 
  TauscheStrukturVariableArray(StrVarArray()) 
Debug "StruktureVariableArray Sollte 3,2 sein: "+Str(StrVarArray.mein(2)\zwei)+","+Str(StrVarArray.mein(3)\drei)
Procedure TauscheStrukturvariableArray(star.mein(1))
  star.mein(3)\drei =2 :star.mein(2)\zwei= 3
EndProcedure

Dim StrVarArrayZwei.mein(4,4)
StrVarArrayZwei.mein(2,2)\zwei =2 :StrVarArrayZwei.mein(3,3)\drei=3
Declare TauscheStrukturVariableArrayZwei(svz.mein(2)) 
TauscheStrukturVariableArrayZwei(StrVarArrayZwei()) 
Debug "StruktureVariableArrayZweidimensinal Sollte 3,2 sein: "+Str(StrVarArrayZwei.mein(2,2)\zwei)+","+Str(StrVarArrayZwei.mein(3,3)\drei)
Procedure TauscheStrukturvariableArrayZwei(starZ.mein(2))
  starZ.mein(3,3)\drei =2 :starZ.mein(2,2)\zwei= 3
EndProcedure


NewList Liste.l() 
AddElement(liste()) :AddElement(liste()):AddElement(liste()):AddElement(liste())
SelectElement(Liste(),2):liste()=2
SelectElement(Liste(),3):liste()=3
Declare TauscheLinkedListElement(lister()) :TauscheLinkedListElement(liste())
SelectElement(Liste(),2): zwei= Liste() :SelectElement(Liste(),3):drei=liste()
Debug "LinkedList Sollte 3,2 sein: "+Str(zwei)+","+Str(drei)

Procedure TauscheLinkedListElement(meinLL())
  SelectElement(meinLL(),2) :meinLL()=3
  SelectElement(meinLL(),3) :meinLL()=2
EndProcedure

NewList StrukturListe.mein() 
AddElement(StrukturListe()) :AddElement(StrukturListe()):AddElement(StrukturListe()) :AddElement(StrukturListe())
SelectElement(StrukturListe(),2):StrukturListe()\zwei=2
SelectElement(StrukturListe(),3):StrukturListe()\drei=3
Declare TauscheStrukturLinkedListElement(listeR.mein()) 
TauscheStrukturLinkedListElement(StrukturListe())
SelectElement(StrukturListe(),2) : zwei= StrukturListe()\zwei 
SelectElement(StrukturListe(),3) : drei= StrukturListe()\drei
Debug "Structure LinkedList Sollte 3,2 sein: "+Str(zwei)+","+Str(drei)

Procedure TauscheStrukturLinkedListElement(meinLL.mein())
  SelectElement(meinLL(),2) :meinLL()\zwei=3
  SelectElement(meinLL(),3) :meinLL()\drei=2
EndProcedure

;
Shit happens: Let's try to make things better!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@ullmann

daß der Rot-kanal im Win-standard der less-significant ist, sollte bekannt sein.

wenn man nicht weiß, daß der 24bit farbwert so berechnet wird, wie hier von Helle beschrieben,
sollte eben die RGB-funktion benutzen.

mit 16bit ist das nochmal ein anderer schnack, jedenfalls im screen,
siehe hierzu den exkurs von mir im Tutorial bereich des boards...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
ullmann
Beiträge: 205
Registriert: 28.10.2005 07:21

Beitrag von ullmann »

@Kaeru Gaman

Aber in der Hilfe steht über der Farbtabelle, dass man die Hex-Werte so wie sie sind direkt verwenden kann. Und das ist nicht korrekt. Man muss sie als RGB-Werte betrachten und "umdrehen". Für den Sinn dieser Tabelle, für eine Farbe schnell einen fertigen Hex-Wert zu haben, wäre es besser, wenn direkt verwendbare Hex-Werte unter den Farben stehen würden.

Gruß Rainer
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

@Andre
es wäre sehr schick, wenn bei allen befehlen stehen würde, welcher typ als ergebnis zurückgeliefert wird. (byte, long, quad...)

c ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Beitrag von uweb »

Einen habe ich noch :

So wie für menu ein Querverweis in Window und Gadgets sein sollte fehlen meiner Meinung nach noch die entsprechenden Links für
- SortArray
- SortList
- SortStructuredArray
- SortStructuredList
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

Punkt: Inline x86 ASM
Im 1.Beispiel

Code: Alles auswählen

 MOV ebx,l_myLabel
  ...
MyLabel:
muss bei l_mylabel alles kleingeschrieben werden!
Weshalb als Sprungmarken-Beispiel kein Sprung oder Call sondern ein MOV verwendet wird ist auch schwer nachzuvollziehen.
Im 3.Beispiel

Code: Alles auswählen

Procedure Test(*Pointer, Variable)
    ! MOV dword [p.p_Pointer], 20
    ! MOV dword [p.v_Variable], 30
    Debug *Pointer
    Debug Variable
EndProcedure
  
  Test(0, 0)
sollte die Prozedur nicht Test heissen. Funktioniert zwar bei ausgeschaltetem Inline-ASM, aber ASM-Befehle sollte man generell als verwendete Namen meiden.

Gruss
Helle

Beinahe vergessen:

Code: Alles auswählen

- Die verwendbaren Register sind: eax, edx und ecx. Alle anderen müssen immer reserviert bleiben.
Das suggeriert einem "Frischling", er kann nur diese 3 Register benutzen und die anderen sind tabu. Natürlich kann man auch mit ebp, ebx, edi und esi arbeiten! Die o.g. Aussage finde ich nicht sehr glücklich formuliert. Diese 3 Register sind zwar die, die bei PB-Funktions-Aufrufen (meist) verändert werden, aber für deren Sicherung hat der Progger selbst zu sorgen (wird er dann schon merken... :mrgreen: ). Dies hat doch aber nichts mit den anderen Registern zu tun!
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Beitrag von Sven »

MDIGadget()

Beim Verwenden von AddGadgetItem() mit diesem Gadget wird dabei ein neues PB Fenster erstellt. Alle Befehle der Window Library können zusammen mit diesem neuen Fenster verwendet werden (mit Ausnahme von StickyWindow()).

Das stimmt so nicht. GetActiveWindow() gibt nicht das aktive Child-Window, sondern das Hauptfenster zurück, zum Abfragen des aktiven Childs muß GetGadgetState() verwendet werden (wie es weiter unten steht), SetActiveWindow() wird ähnlich sein (hab ich nicht probiert).

Ist zwar funktionsbedingt sicher richtig, aber verwirrt, wenn alle anderen Child-Ereignisse als Windows-Ereignisse behandelt werden. Sollte also noch ein Hinweis darauf hin, vielleicht derart: (mit Ausnahme von GetActiveWindow(), SetActiveWindow() und StickyWindow())

Sven
Gesperrt