Delphi-PRAXiS

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 08:52

signed and unsigned types
 
Zitat:

[DCC Warning] uSpectrum.pas(760): W1024 Combining signed and unsigned types - widened both operands
Wie kann ich die kombinieren da ich nicht erkenne was signed ist und was nicht.

Delphi-Quellcode:
a := a + (((c and 4278190080) div 16777216) and 255);
a := (((Buf[dx, dy] and 4278190080) div 16777216) and 255) - d;

gruss

p80286 21. Mär 2019 09:07

AW: signed and unsigned types
 
Zitat:

Zitat von EWeiss (Beitrag 1428234)
Wie kann ich die kombinieren da ich nicht erkenne was signed ist und was nicht.

Und wo sind die Definitionen? Da sollte man das erkennen können.

Gruß
K-H

Neutral General 21. Mär 2019 09:08

AW: signed and unsigned types
 
Du erkennst was Singed und Unsinged ist am Datentyp.
Von daher wäre es hilfreich gewesen wenn du die Deklaration der Variablen auch gepostet hättest.
Du kannst die Warnung loswerden, indem du entweder die Deklarationen vereinheitlichst oder in der Rechnung durch explizite Casts vereinheitlichst.

EWeiss 21. Mär 2019 09:15

AW: signed and unsigned types
 
Zitat:

Du erkennst was Singed und Unsinged ist am Datentyp.
Davon bin ich auch ausgegangen ist aber nicht so..

Delphi-Quellcode:
x, y, c, w, h, a, d: Integer;


a und c sind beides Integer.. deshalb frage ich ja hier nach ;) und nun?

Delphi-Quellcode:
a := a + (((c and 4278190080) div 16777216) and 255);


gruss

EWeiss 21. Mär 2019 09:18

AW: signed and unsigned types
 
Zitat:

a := ((((Buf[dx, dy] and 4278190080) div 16777216) and 255) - d;
Das kann ich casten und gut ist.. hoffe das macht nachher keine Problem. "Buf" die Rückgabe ist Byte

Delphi-Quellcode:
a := ((Integer((Buf[dx, dy]) and 4278190080) div 16777216) and 255) - d;


gruss

Stevie 21. Mär 2019 09:31

AW: signed and unsigned types
 
4278190080 ist aber kein Integer...

EWeiss 21. Mär 2019 09:37

AW: signed and unsigned types
 
Zitat:

Zitat von Stevie (Beitrag 1428249)
4278190080 ist aber kein Integer...

Ist er im ersten gecasteten wert auch nicht und da meckert der Compiler nicht mehr.

Delphi-Quellcode:
a := ((Integer((Buf[dx, dy]) and 4278190080) div 16777216) and 255) - d;

ok du meinst dann wohl so!
Delphi-Quellcode:
((Integer(c and 4278190080) div 16777216) and 255);

obwohl c ein Integer ist ? Nun gut sei's drum.. :) verstehe was du meinst der wert (4278190080) passt nicht in einen Integer.

gruss

Neutral General 21. Mär 2019 09:48

AW: signed and unsigned types
 
4278190080 ist ein unsigned int, weil die Zahl zu groß ist für den Datentyp "Integer".
Wenn Buf[dx,dy] ein byte zurückgibt und du dann ein "and $FF000000" (4278190080) darauf anwendest, dann bringt dir das nichts.
Dann kannst du auch direkt "0" schreiben. Was genau hast du da vor?
Und wenn du mit Bitmasken/Bitoperationen arbeitest würde ich dir empfehlen die Hexadezimale Notation zu verwenden - die ist in dem Fall unendlich lesbarer.

EWeiss 21. Mär 2019 09:58

AW: signed and unsigned types
 
Zitat:

Und wenn du mit Bitmasken/Bitoperationen arbeitest würde ich dir empfehlen die Hexadezimale Notation zu verwenden - die ist in dem Fall unendlich lesbarer.
Hatte ich vorher.. habe es geändert um eine einheitliche Berechnung (Ansicht zu haben) durchzuführen kein Mischmasch zwischen DEZ und HEX.

Zitat:

4278190080 ist ein unsigned int, weil die Zahl zu groß ist für den Datentyp "Integer".
Habe es auf Int64 geändert so muss ich nicht konvertieren.

gruss

Neutral General 21. Mär 2019 10:38

AW: signed and unsigned types
 
Und nochmal:
Delphi-Quellcode:
// :
Buf[dx, dy] and 4278190080
Das ergibt IMMER 0 :!: Sicher das du das willst?

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 10:18 Uhr.

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