 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
LXNDR
Anmeldungsdatum: 16.08.2011 Beiträge: 5
|
Verfasst am: 16.08.2011, 13:58 Titel: Invalid assignment/conversion |
|
|
Hallo,
ich habe schon hier im Forum gesucht, bin aber nur auf den Thread gekommen, wo behauptet wird das dies ein Bug sei. Vielleicht ist es in meinem Fall aber was anderes. Ich hoffe mir kann jemand helfen, weil ich schon am Verzweifeln bin xD.
Und zwar ist mein Quellcode:
Code: |
Dim As Integer hoehe, breite, pointerHoehe, pointerBreite, zaehler, farbe
...
Do
Print "x: " & pointerHoehe & " y: " & pointerBreite
farbe = Hex(Point(pointerHoehe, pointerBreite))
Print farbe
If farbe = &H000000 Then
zaehler = zaehler + 1
Print "Schwarz erkannt"
EndIf
If farbe = &HFFFFFF Then
Print "Weiss erkannt"
EndIf
pointerBreite = pointerBreite + 1
If pointerBreite > breite Then
pointerBreite = 1
pointerHoehe = pointerHoehe + 1
EndIf
If pointerHoehe > hoehe Then
Exit Do
EndIf
Sleep 10
Loop
|
Der Fehler der Ausgegeben wird ist:
Code: |
error 159: Invalid assignment/conversion in 'farbe = Hex(Point(pointerHoehe, pointerBreite))'
|
Viele Grüße,
LXNDR |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 16.08.2011, 14:13 Titel: |
|
|
'farbe' ist ein Integer, während HEX einen String zurückgibt. Du kannst das HEX hier, soweit ich sehe, einfach weglassen; das &h macht schon das, was du willst. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
LXNDR
Anmeldungsdatum: 16.08.2011 Beiträge: 5
|
Verfasst am: 16.08.2011, 14:21 Titel: |
|
|
Hallo,
leider wird nur, wenn ich das HEX weg lasse immer: -1 unter der Variable farbe ausgegeben.  |
|
Nach oben |
|
 |
LXNDR
Anmeldungsdatum: 16.08.2011 Beiträge: 5
|
Verfasst am: 16.08.2011, 14:23 Titel: |
|
|
Ich habe eine Lösung gefunden. Einfach als String. |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 16.08.2011, 14:35 Titel: |
|
|
Hallo,
das Problem liegt daran, dass du für farbe einen vorzeichenbehafteten Integer benutzt. Schau dir mal dieses Beispiel an:
Code: | screenres 640, 480, 32
Line (0,0)-(639,479), &HFFFFFFFF, BF
Dim As Integer mitVorzeichen
Dim As UInteger ohneVorzeichen
mitVorzeichen = Point(100,100)
ohneVorzeichen = Point(100,100)
Print " mit Vorzeichen (Integer) -> " & mitVorzeichen
Print "ohne Vorzeichen (UInteger) -> " & ohneVorzeichen
sleep |
Hex und die Speicherung als String ist nicht notwendig. Was es mit der Hex-Funktion hier auf sich hat:
Code: | 'Die -1 wird im Folgenden als Integer-Literal interpretiert und zu UInt gecastet,
'da HEX nur mit nicht-negativen Argumenten arbeitet. Deshalb kann man hier auch
'die vorzeichenbehaftete Interpretation der 32 "Zahlbits" angeben, ohne dass es
'zu einem Fehler kommt.
Print "Hex(-1) = " & Hex(-1)
'...und noch ein Beispiel:
Print "Hex(-2) = " & Hex(-2)
sleep |
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 16.08.2011, 14:35 Titel: |
|
|
LXNDR hat Folgendes geschrieben: | leider wird nur, wenn ich das HEX weg lasse immer: -1 unter der Variable farbe ausgegeben.  |
Das ist auch völlig korrekt, wenn man die Farbe als vorzeichenbehaftete Ganzzahl darstellen möchte.
Edit: Seb war schneller... _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
LXNDR
Anmeldungsdatum: 16.08.2011 Beiträge: 5
|
Verfasst am: 16.08.2011, 14:45 Titel: |
|
|
Hallo,
ich kenne mich leider nicht gut mit Grafik aus, weil ich es selten benutze. Es funktioniert jetzt auch, leider nur träge langsam.
Das Programm soll aus BMP Dateien mit den Maßen 500 x 500 bis 1700 x 1700 Pixeln die schwarzen Pixel auszählen. Bei dieser Geschwindigkeit dauert es nur sehr lange, weil das Programm nacher bis zu 10000 Dateien nacheinander Überprüfen muss. Weiss vll. noch jmd. wie man das machen könnte?
VG LXNDR |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 16.08.2011, 14:51 Titel: |
|
|
Bei dieser Datenmenge musst du dich nicht wundern, wenn es langsam ist, einige Dinge aber zur Beschleunigung:
Zuerst alle PRINTs rauswerfen, das kostet Zeit. Dann nichts mit HEX, nichts mit POINT, was du brauchst sind Pointer, siehe Referenz im FreeBASIC-Portal. Für die Auswertung würde sich Inline ASM anbieten, wäre auch im Portal nachzulesen, allerdings etwas komplizierter. Und bei so vielen Schleifendurchgängen das SLEEP rauswerfen und die erhöhte CPU-Last in Kauf nehmen. |
|
Nach oben |
|
 |
LXNDR
Anmeldungsdatum: 16.08.2011 Beiträge: 5
|
Verfasst am: 16.08.2011, 14:52 Titel: |
|
|
Okay, ich versuche es mal mit Pointern. Mal gucken ob ich es schaffe xD weil ich habe wie gesagt noch nicht viel mit Grafik gemacht.
VG LXNDR |
|
Nach oben |
|
 |
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 16.08.2011, 20:41 Titel: |
|
|
MOD hat Folgendes geschrieben: | Für die Auswertung würde sich Inline ASM anbieten... |
ganz ehrlich: bevor du mit inline ASM in freebasic anfängst, bist du eventuell mit C oder C++ besser bedient. _________________ MFG
Flo
Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.
zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich. |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 16.08.2011, 21:10 Titel: |
|
|
Auswertungen mit C wären kein Stück performanter als mit FB, das größste Problem ist POINT. Das mit ASM war nur am Rande erwähnt. |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 16.08.2011, 21:10 Titel: |
|
|
Flo hat Folgendes geschrieben: | MOD hat Folgendes geschrieben: | Für die Auswertung würde sich Inline ASM anbieten... |
ganz ehrlich: bevor du mit inline ASM in freebasic anfängst, bist du eventuell mit C oder C++ besser bedient. |
Das Gerücht, dass C(++) "schneller" sei als andere Sprachen (!), hält sich zwar hartnäckig, ist aber einfach Quatsch. Sprachen besitzen schlichtweg keine Ausführungsgeschwindigkeit. (weiß nicht genau, ob du etwas in dieser Richtung andeuten wolltest) _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 16.08.2011, 22:25 Titel: |
|
|
Ich hab mal einen Beispielcode im NoPaste hochgeladen. Sicher noch optimierbar, aber es zeigt schon, wo es hingeht. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 16.08.2011, 22:47 Titel: |
|
|
In der Tat noch stark optimierbar.
1) Funktioniert nur bei Bildern, die kein Alignment benötigen
2) Die ganzen Additionen und Multipliaktionen werden unnötigerweise bei jedem Pixel aufgerufen. Sinnvoller ist es, einen Pointer durch das Array laufen zu lassen. Siehe hierzu auch diesen alten, aber nach wie vor gültigen Artikel ("DON'T CALCULATE THINGS YOU SHOULD ALREADY KNOW"). _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 18.08.2011, 18:25 Titel: |
|
|
Sebastian hat Folgendes geschrieben: | Flo hat Folgendes geschrieben: | MOD hat Folgendes geschrieben: | Für die Auswertung würde sich Inline ASM anbieten... |
ganz ehrlich: bevor du mit inline ASM in freebasic anfängst, bist du eventuell mit C oder C++ besser bedient. |
Das Gerücht, dass C(++) "schneller" sei als andere Sprachen (!), hält sich zwar hartnäckig, ist aber einfach Quatsch. Sprachen besitzen schlichtweg keine Ausführungsgeschwindigkeit. (weiß nicht genau, ob du etwas in dieser Richtung andeuten wolltest) |
das meinte ich nicht...
fakt ist, dass C und C++ zu den meistverwendeten sprachen gehören, und es daher anzunehmen ist, dass es auch viel besser optimierende compiler gibt (ich bin sicher, dass intel's c compiler schnellere binaries erzeugt als fbc , bei vergleichbarem code natürlich!)
und außerdem hat man bei C ein gesundes mittel zwischen maschinennähe und lesbarem code sowie portabilität _________________ MFG
Flo
Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.
zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 18.08.2011, 21:36 Titel: |
|
|
Flo hat Folgendes geschrieben: | und außerdem hat man bei C ein gesundes mittel zwischen maschinennähe und lesbarem code sowie portabilität |
warum las ich da erst "Nähmaschine"?  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 18.08.2011, 21:52 Titel: |
|
|
Intel C++ kostet ja auch 1.500 €... |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 22.08.2011, 14:27 Titel: |
|
|
Sorry für's 'Ausbuddeln' aber fand das Thema ganz interessant...
Das POINT recht langsam ist sollte ja mehr oder weniger jedem klar sein,
jedoch fand ichs noch interessanter das abgesehen von Voltas ASM lösung den ich im portal fand, MODs lösung trotz unnötig wiederholenden berechnungen verdammt schnell ist... hab alles versucht das ganze ohne diese wiederholenden rechnungen zu optimieren und trotzdem waren die ergebnisse allesamt langsamer...
Code: | Screen 19, 32
Dim As Any Ptr bild
bild = ImageCreate(800, 600)
BLoad "Test.bmp", bild
Function ImageCountPOINT (byval Image as any ptr, _
byval vonX as Integer , byval vonY as Integer, _
byval bisX as Integer , byval bisY as Integer) as Double
Dim POINTTimer as Double
Dim DummyCount as UInteger
POINTTimer = Timer
For y as Integer = vonY To bisY
For x as Integer = vonX To bisX
If Point(x, y, Image) = &hFF000000 Then
DummyCount += 1
EndIf
Next x
Next y
Return (Timer - POINTTimer)
End Function
Function ImageCountCPTR (byval Image as any ptr, _
byval vonX as Integer , byval vonY as Integer, _
byval bisX as Integer , byval bisY as Integer) as Double
Dim CPTRTimer as Double
Dim DummyCount as UInteger
CPTRTimer = Timer
Dim Buffer as UInteger Ptr = Image
Dim Pitch as UInteger = Buffer[4]
For y as Integer = vonY To bisY
For x as Integer = vonX To bisX
If *Buffer+(32+x*4+y*(Pitch)) = &hFF000000 Then
DummyCount += 1
EndIf
Next x
Next y
Return (Timer - CPTRTimer)
End Function
Function ImageCountASM (byval Image as any ptr, _
byval vonX as Integer , byval vonY as Integer, _
byval bisX as Integer , byval bisY as Integer) as Double
Dim UINTTimer as Double
Dim DummyCount as ULongINT
Dim x as Integer
Dim y as Integer
UINTTimer=Timer
x=((bisX-vonX)*(bisY-vonY)) 'Anzahl Farbpixel
y=Cast(Integer,Image)+32 'Startadresse
Asm
mov ebx, dword ptr [x] 'Anzahl Farbpixel
mov edx, dword ptr [y] 'Startadresse
Xor ecx, ecx 'Zähler=0
LLoop1:
mov eax, [edx] 'Farbpixel holen
And eax, &hffffff 'nur RGB
jnz LLoop2 'nicht 0, dann nicht zählen
inc ecx '+=1 Pixel schwarz
LLoop2:
add edx, 4 '+=4 Adresse
dec ebx '-=1 Pixel
jnz LLoop1
mov dword ptr [DummyCount], ecx
End Asm
Return (Timer - UINTTimer)
End Function
Function ImageCountMy (byval Image as any ptr, _
byval vonX as Integer , byval vonY as Integer, _
byval bisX as Integer , byval bisY as Integer) as Double
Dim MyTimer as Double
Dim DummyCount as UInteger
MyTimer = Timer
Dim Buffer as UInteger Ptr = Image
Dim Pitch as UInteger = Buffer[4]
Dim PAdr as UInteger PTR = Buffer+32+(vonX*4)+(vonY*Pitch)
Dim APos as UInteger PTR
For y as Integer = vonY To bisY
APos=PAdr
For x as Integer = vonX To bisX
If *APos = &hFF000000 Then
DummyCount += 1
EndIf
APos+=4
Next x
PAdr+=Pitch
Next y
Return (Timer - MyTimer)
End Function
for l as integer=0 to 4
Print "Erste Zeit:";
Print Using "#.#############";ImageCountPOINT(Bild,0,0,100,100)
sleep 5
Print "Zweite Zeit:";
Print Using "#.#############";ImageCountCPTR(Bild,0,0,100,100)
sleep 5
Print "Dritte Zeit:";
Print Using "#.#############";ImageCountASM(Bild,0,0,100,100)
sleep 5
Print "Vierte Zeit:";
Print Using "#.#############";ImageCountMy(Bild,0,0,100,100)
sleep 5
next l
ImageDestroy (Bild)
Sleep
|
_________________
 |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 22.08.2011, 15:05 Titel: |
|
|
ui.. nicht wirklich, ich glaube da könnte ein problem drin stecken
Code: | Point - Count: 9266 - Zeit: 0.0042773592726
CPTR - Count: 0 - Zeit: 0.0000910730275
ASM - Count: 9801 - Zeit: 0.0000835301696
MyPTR - Count: 9797 - Zeit: 0.0002396952688 |
So sieht das ganze schon bisschen anders aus, allerdings ist die ASM noch fehlerhaft, vermutlich wegen des Pitch, leider versteh ich ASM zu wenig und da einen solchen Sprung hinzuzufügen...
Code: | Screen 19, 24
Dim As Any Ptr bild
bild = ImageCreate(800, 600)
BLoad "Testblack.bmp", bild
SUB ImageCountPOINT (byval Image as any ptr, _
byval vonX as Integer , byval vonY as Integer, _
byval bisX as Integer , byval bisY as Integer)
Dim POINTTimer as Double
Dim DummyCount as UInteger
POINTTimer = Timer
For y as Integer = vonY To bisY
For x as Integer = vonX To bisX
If (Point(x, y, Image) AND &hFFFFFF) = 0 Then
DummyCount += 1
EndIf
Next x
Next y
Print "Count POINT: ";
Print Using "######";DummyCount;
Print " Zeit POINT: ";
Print Using "#.#############";(Timer - POINTTimer)
' Return (Timer - POINTTimer)
End SUB
SUB ImageCountCPTR (byval Image as any ptr, _
byval vonX as Integer , byval vonY as Integer, _
byval bisX as Integer , byval bisY as Integer)
Dim CPTRTimer as Double
Dim DummyCount as UInteger
CPTRTimer = Timer
Dim Buffer as UInteger Ptr = Image
Dim Pitch as UInteger = Buffer[4]
For y as Integer = vonY To bisY
For x as Integer = vonX To bisX
If (*cast(UInteger ptr,Image+(32+(x*4)+(y*Pitch))) AND &hFFFFFF)= 0 Then
DummyCount += 1
EndIf
Next x
Next y
Print "Count CPTR : ";
Print Using "######";DummyCount;
Print " Zeit CPTR : ";
Print Using "#.#############";(Timer - CPTRTimer)
'Return (Timer - CPTRTimer)
End SUB
SUB ImageCountASM (byval Image as any ptr, _
byval vonX as Integer , byval vonY as Integer, _
byval bisX as Integer , byval bisY as Integer)
Dim ASMTimer as Double
Dim DummyCount as UInteger
Dim Pitch as UInteger=*Cast(UInteger ptr,Image)+16
Dim x as Integer
Dim y as Integer
ASMTimer=Timer
x=((bisX-vonX)*(bisY-vonY)) 'Anzahl Farbpixel
y=Cast(Integer,Image)+32+(vonX*4)+(vonY*Pitch) 'Startadresse
Asm
mov ebx, dword ptr [x] 'Anzahl Farbpixel
mov edx, dword ptr [y] 'Startadresse
Xor ecx, ecx 'Zähler=0
LLoop1:
mov eax, [edx] 'Farbpixel holen
And eax, &hffffff 'nur RGB
jnz LLoop2 'nicht 0, dann nicht zählen
inc ecx '+=1 Pixel schwarz
LLoop2:
add edx, 4 '+=4 Adresse
dec ebx '-=1 Pixel
jnz LLoop1
mov dword ptr [DummyCount], ecx
End Asm
Print "Count ASM : ";
Print Using "######";DummyCount;
Print " Zeit ASM : ";
Print Using "#.#############";(Timer - ASMTimer)
'Return (Timer - ASMTimer)
End SUB
SUB ImageCountMy (byval Image as any ptr, _
byval vonX as Integer , byval vonY as Integer, _
byval bisX as Integer , byval bisY as Integer)
Dim MyTimer as Double
Dim DummyCount as UInteger
MyTimer = Timer
Dim Buffer as UInteger Ptr = Image
Dim Pitch as UInteger = Buffer[4]
Dim PAdr as Any PTR = Image+32+(vonX*4)+(vonY*Pitch)
Dim APos as Any PTR
For y as Integer = vonY To bisY
APos=PAdr
For x as Integer = vonX To bisX
If (*cast(UInteger PTR,APos) AND &hFFFFFF)= 0 Then
DummyCount += 1
EndIf
APos+=4
Next x
PAdr+=Pitch
Next y
Print "Count MyPTR: ";
Print Using "######";DummyCount;
Print " Zeit MyPTR: ";
Print Using "#.#############";(Timer - MyTimer)
'Return (Timer - MyTimer)
End SUB
ImageCountPOINT (Bild,0,0,100,100)
ImageCountCPTR (Bild,0,0,100,100)
ImageCountASM (Bild,0,0,100,100)
ImageCountMy (Bild,0,0,100,100)
ImageDestroy (Bild)
Sleep |
_________________
 |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|