AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

unsigned DWORD

Ein Thema von EWeiss · begonnen am 18. Feb 2017 · letzter Beitrag vom 20. Feb 2017
Antwort Antwort
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#1

AW: unsigned DWORD

  Alt 18. Feb 2017, 22:05
Sorry das ist kein Gefrickel, das ist pure binäre Logik.

"Oder warum denkst du das es sonst einen ERangeError mit dem Data Typ DWORD in Delphi gibt?"... für negative "Integer" Werte oder Konstanten die man ohne Cast auf DWORD zuweist(obwohl die Typgröße im Speicher passt) und in 64BitDelphi macht es Sinn
(z.B. unter Delphi64Bit ist es klar, das eine = $FFFFFFFFFFFFFFFF für eine z.B. "Integer:-1" Zuweisung einen Fehler bei der Bereichsprüfung wirft, denn $FFFFFFFFFFFFFFFF ist dann nunmal größer wie der maximale $FFFFFFFF im DWORD Typ)

Sorry für die Faulheit alles in Hex zu schreiben, da es eh um das Verständnis der entsprechenden 2er Potenzen geht, ist es so sogar "klarer" worum es geht.
(in dezimal erkenne ich den Zusammenhang auch immer nicht sofort, aber das Spiel mit den Nullen&Einsen kann man sich durchaus mal BitByBit zu Gemüte führen )


BASS nutzt bei seinen DLL Deglerationen die WindowsAPI und C konforme Variante, möglichst alles vorzeichenlos Sprachen portabel mit 100% fix bestimmten Typen zu definieren.
BYTE = unsigned 8Bit 0..$FF
WORD = unsigned 16Bit 0..$FFFF
DWORD = unsigned 32Bit 0..$FFFFFFFF
QWORD = unsigned 64Bit 0..$FFFFFFFFFFFFFFFF

Mit signed Variablen mit wo möglich noch ala "Integer" variablem Wertebereich kann ich in eigenen Programmteilen leben, aber wenn es um externe Kopplungen geht sollte man wie BASS es macht sich an die üblichen Standards halten.
Wenn was in Delphi nicht passt, liegt es oft nur an "schlecht" definierten/portierten Konstanten welche z.B. als "-1" deglariert sind und bei aktivierter Bereichsprüfung eben nicht für einen DWORD Parameter verwendet werden können.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: unsigned DWORD

  Alt 18. Feb 2017, 22:16
Mit gefrickel meine ich das wenn ich die Bereichsprüfung für Bass extra ausschalten muss.
Es hatte nichts mit deiner Person zu tun. oder den Byte Werten an sich.

Zitat:
Ich habe in diesem Thread noch keinen Code gesehen, der einen solchen Fehler im Compiler auslöst.
Dieser hier!

Einfaches Beispiel.
Mit Bereichsprüfung wirft diese Funktion einen ERangeError.
Nicht bei normaler Behandlung aber wenn ich die Samples pushe über einen Equalizer.
function BASS_ChannelGetData(handle: DWORD; buffer: Pointer; length: DWORD): DWORD;
Delphi-Quellcode:
function BassDataAvailable: BOOL;
var
  BytesValid: DWORD;
begin
  result := TRUE;

  BytesValid := BASS_ChannelGetData(gnAudioChannel, nil, BASS_DATA_AVAILABLE); //<< ERangeError

  if BytesValid = DW_ERROR then
    result := FALSE;

end;
Wie du siehst ist das ne simple Sache destotrotz werden Fehler geworfen..
Ich kann die Samples natürlich einzeln analysieren und anschließend BytesValid den Wert übergeben.
Nur wo steckt der Sinn dahinter.

Und dieser hier!
Delphi-Quellcode:
      for C := 1 to 2 do
        Inc(pInteger[C]); // WaveData von TWaveData über BASS_ChannelGetData
Ich muss hier die Samples separat vorher Analysieren um den Fehler zu beheben.
Delphi-Quellcode:
      for C := 1 to 2 do
      begin
        IntI := pInteger[C];
        if (IntI > 32767) then
          IntI := 32767
        else
        if (IntI < -32768) then
          IntI := -32768;
        pInteger[C] := IntI;
      end;

gruss

Geändert von EWeiss (18. Feb 2017 um 22:27 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: unsigned DWORD

  Alt 18. Feb 2017, 22:44
Anderes Beispiel.

Delphi-Quellcode:
function BassChannelGetLevel: DWORD;
begin
  result := 0;

  if gnAudioPause = FALSE then
  begin
    if gnAudioChannel <> 0 then
      result := BASS_ChannelGetLevel(gnAudioChannel);
  end;
end;
Zitat:
stack dump:
0018e06c 7e de 56 00 de fa ed 0e - 01 00 00 00 07 00 00 00 ~.V.............
0018e07c 80 e0 18 00 7e de 56 00 - 00 76 a1 02 7e de 56 00 ....~.V..v..~.V.
0018e08c 7e de 56 00 00 00 00 00 - 60 e9 18 00 9c e0 18 00 ~.V.....`.......
0018e09c 04 00 00 00 74 43 40 00 - 00 80 00 80 90 6e 9d 02 ....tC@......n..
0018e0ac 7e de 56 00 68 e9 18 00 - ec 62 40 00 60 e9 18 00 ~.V.h....b@.`...
0018e0bc 00 00 00 00 d4 53 56 00 - 00 00 00 00 00 00 00 00 .....SV.........
0018e0cc 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0018e0dc 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0018e0ec 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0018e0fc 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0018e10c 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0018e11c 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0018e12c 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0018e13c 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0018e14c 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0018e15c 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0018e16c 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0018e17c 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0018e18c 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0018e19c 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
Zitat:
disassembling:
[...]
0056de6e 3112 call -$15bdf ($558294) ; uBass.BassChannelGetLevel
0056de73 mov esi, eax
0056de75 test esi, esi
0056de77 jns loc_56de7e
0056de79 call -$16874a ($405734) ; System.@BoundErr
0056de7e 3113 > cmp esi, -1
0056de81 jnz loc_56de85
0056de83 3114 xor esi, esi
0056de85 3116 mov edx, esi
0056de87 movzx edx, dx
0056de8a mov ecx, $80
[...]
Code:
exception class   : ERangeError
exception message : Fehler bei Bereichsprüfung.

usw..

gruss

Geändert von EWeiss (18. Feb 2017 um 22:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.688 Beiträge
 
Delphi 12 Athens
 
#4

AW: unsigned DWORD

  Alt 18. Feb 2017, 23:29
Und wie ist gnAudioChannel deklariert?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: unsigned DWORD

  Alt 18. Feb 2017, 23:36
Und wie ist gnAudioChannel deklariert?
Delphi-Quellcode:
HSTREAM = DWORD; // sample stream handle
gnAudioChannel: HSTREAM; (Cardinal)
Ich habe nichts davon hier irgendwas zu erzählen
Möchte nur das es funktioniert auch mit eingeschalteter Bereichsprüfung.
Das es nicht geht sieht man ja.

Bei diesen einfachen Beispielen kann man nichts falsch machen.
Kann aber auch nichts an den Ergebnis ändern das von Bass geliefert wird.

D2010..

gruss

Geändert von EWeiss (18. Feb 2017 um 23:39 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: unsigned DWORD

  Alt 19. Feb 2017, 00:57
Hallo,
Google ...

http://www.un4seen.com/forum/?topic=13417.0;wap2
Heiko
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: unsigned DWORD

  Alt 19. Feb 2017, 01:13
Gut das würde mein Problem lösen.
Frage mich nur warum man dann noch weiter eine Unit Publiziert obwohl das Problem ja schon seit längeren bekannt ist.
Muss dann wohl alle DWords mit LongInt ersetzen. bzw.. nur die Rückgabe.

Hoffe mal das es hilft.

Das verstehe ich nicht ganz
Zitat:
I have tried also DW_ERROR with a c defined as Bass.dWord and it works.
Also wie das ersetzen? So belassen?
DW_ERROR = LongWord(-1);

if BytesValid = DW_ERROR then

gruss und Danke.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.400 Beiträge
 
Delphi 12 Athens
 
#8

AW: unsigned DWORD

  Alt 19. Feb 2017, 01:44
C ist bezüglich Typisierung nunmal recht "lasch" und Delphi reagiert auf falsche Typen eben bissl allergisch.
Code:
int r=BASS_ChannelGetData(decoder, buffer, length);
if (r==-1) return 0; // error = no data
In C mag das gehen.
Delphi erkennt hier, dass R niemals -1 sein kann und wären beides Variablen, dann würde Delphi die beiden Typen so weit vergrößern, dass sie gemeinsam in den selben Wertebereich passen, also 64 Bit signed > Int64 bei LongInt und LongWord

In Deplhi kann man Typgrenzen nur durch harte explizite Casts umgehen.
Delphi-Quellcode:
const BassNoData = DWORD(-1);

if r = BassNoData then Result := 0; // error = no data
Man könnte es zwar auch als const BassNoData = $FFFFFF; deklarieren, aber dann würde es nicht mehr der Vorgabe entsprechen.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (19. Feb 2017 um 01:48 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:56 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