Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi signed and unsigned types (https://www.delphipraxis.net/200111-signed-unsigned-types.html)

EWeiss 21. Mär 2019 11:29

AW: signed and unsigned types
 
Zitat:

Zitat von Neutral General (Beitrag 1428257)
Und nochmal:
Delphi-Quellcode:
// :
Buf[dx, dy] and 4278190080
Das ergibt IMMER 0 :!: Sicher das du das willst?

Ich versteh was du meinst.

Der Original source..
Wo es geht muss ich mich daran halten von den Datentypen mal abgesehen.
DatenTyp dafür ist Buf() As Long


Code:
        For y = 0 To h
            For x = 0 To w
                cx = x / s - o
                cy = y / h - 0.5

                r = Sqr(cx * cx + cy * cy)

                dx = (cx + o + 0.01 * cx * ((r - 1) / 0.5)) * s
                dy = (cy + 0.5 + 0.01 * cy * ((r - 1) / 0.5)) * h

                a = (((Buf(dx, dy) And &HFF000000) \ &H1000000) And &HFF&) - d

                If a < 0 Then
                    a = 0
                End If
               
                c = Buf(dx, dy) And &HFFFFFF

                If a > 127 Then
                    imgSpectrumData(x, y) = c Or ((a - 256) * &H1000000)
                Else
                    imgSpectrumData(x, y) = c Or (a * &H1000000)
                End If
            Next
        Next
Und ja ich habe das Problem das ich nicht über 0 hinwegkomme.

Ich erstelle ein leeres Image
Delphi-Quellcode:
  if GDIP_CreateBitmapFromScan0(w, rc.Bottom, w * 4, PixelFormat32bppARGB,
    PByte(imgSpectrumData[0, 0]), imgSpectrum) <> OK then
  begin
    MessageBox(0, 'Error create GDI+ bitmap', nil, 0);
    SendMessage(MainHandle, WM_DESTROY, 0, 0);
    exit;
  end;
imgSpectrumData ist als Byte definiert.. genauso wie das Array für den Buf.
Da ich aber einen Pointer übergeben muss caste ich das Byte zu PByte könnte auch Pointer nehmen.

Das imgSpectrumData ist leer und wird seltsamerweise auch nicht gefüllt das verursacht meine ganzen Probleme.

&HFF& sieht seltsam aus ist aber in DEZ 255 und in VB als Long definiert deshalb der Anhang hinter &HFF&

gruss

EWeiss 21. Mär 2019 12:05

AW: signed and unsigned types
 
Das Problem liegt hier..

Delphi-Quellcode:
PByte(imgSpectrumData[0, 0])


Habe mal eine Variable als PByte definiert.

Delphi-Quellcode:
scan0: PByte;
scan0 := PByte(imgSpectrumData[0, 0]);
so ist scan0 Nil.
Delphi-Quellcode:
scan0 := PByte(imgSpectrumData]);
so ist der Pointer scan0 gefüllt nur dann bekomme ich Fehlermeldungen..
In VB werden die Arrays mit übergeben und dort funktioniert es.

Hmmm was ist nun richtig.

gruss

Fritzew 21. Mär 2019 12:22

AW: signed and unsigned types
 
Versuche es mal so:

Delphi-Quellcode:
scan0 := PByte(@imgSpectrumData[0, 0]);

EWeiss 21. Mär 2019 12:36

AW: signed and unsigned types
 
Zitat:

Zitat von Fritzew (Beitrag 1428267)
Versuche es mal so:

Delphi-Quellcode:
scan0 := PByte(@imgSpectrumData[0, 0]);

Danke imgSpectrumData wird gefüllt aber jede menge Fehler. scan0 ist aber IO.
Ist das gleiche als wenn ich es ohne Array übergebe.

Vermute bald das es an etwas anderem liegt. (Integer für das waveInOpen als ShortInt auslegen) Integer ist ja 32Bit.
Dann muss ich viel ändern. ;) grrrr..

gruss

Blup 21. Mär 2019 16:01

AW: signed and unsigned types
 
Zitat:

imgSpectrumData ist als Byte definiert.. genauso wie das Array für den Buf.
GDIP_CreateBitmapFromScan0() erwartet doch sicherlich einen zusammenhängenden Speicherbereich und zwar von h * w * 4 Byte.

Sind die Elemente von imgSpectrumData[] nur als Byte deklariert, so ist das zu wenig Speicher.

Sollte imgSpectrumData[] als mehrdimensionales dynamisches Array deklariert sein, so ist der Speicherbereich noch nicht mal zusammenhängend.

Rudy Velthuis 21. Mär 2019 18:21

AW: signed and unsigned types
 
Zitat:

Zitat von EWeiss (Beitrag 1428263)
Das Problem liegt hier..

Delphi-Quellcode:
PByte(imgSpectrumData[0, 0])
Hmmm was ist nun richtig.

gruss

Warum nicht

Delphi-Quellcode:
PByte(@imgSpectrumData[0, 0])
Das würde mehr Sinn machen, glaube ich.

EWeiss 21. Mär 2019 18:43

AW: signed and unsigned types
 
Zitat:

Zitat von Rudy Velthuis (Beitrag 1428313)
Zitat:

Zitat von EWeiss (Beitrag 1428263)
Das Problem liegt hier..

Delphi-Quellcode:
PByte(imgSpectrumData[0, 0])
Hmmm was ist nun richtig.

gruss

Warum nicht

Delphi-Quellcode:
PByte(@imgSpectrumData[0, 0])
Das würde mehr Sinn machen, glaube ich.

Wurde doch von @FritzW schon vorgeschlagen habe es versucht und verursacht ebenfalls viele Fehler.
Sage nicht das es falsch ist. ;) Nun dann muss ich diese Fehler wohl beheben.

Zitat:

GDIP_CreateBitmapFromScan0() erwartet doch sicherlich einen zusammenhängenden Speicherbereich und zwar von h * w * 4 Byte.
ob er zusammenhängend sein muss keine Ahnung zumindest werden die Daten so übergeben.
Delphi-Quellcode:
 if GDIP_CreateBitmapFromScan0(w, rc.Bottom, w * 4


Wie würdest du denn dann das Array definieren wenn nicht mit Byte?
Wenn mit Pbyte dann ist das komplette Array "NIL" nach dem erstellen des Image. Siehe Pbyte.png
Und bei der ersten abfrage kracht es dann natürlich. Siehe crash.png

Edit:
Delphi-Quellcode:
a := (((int64(imgSpectrumData[x, y]) and 4278190080) div 16777216) and 255);


wäre möglich aber dann kracht es hier!

Delphi-Quellcode:
imgSpectrumData[x, y]^ := c or (a * 16777216);


gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:33 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz