Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi unsigned DWORD (https://www.delphipraxis.net/191784-unsigned-dword.html)

hoika 19. Feb 2017 00:57

AW: unsigned DWORD
 
Hallo,
Google ...

http://www.un4seen.com/forum/?topic=13417.0;wap2

EWeiss 19. Feb 2017 01:13

AW: unsigned DWORD
 
Zitat:

Zitat von hoika (Beitrag 1362043)

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?
Delphi-Quellcode:
DW_ERROR = LongWord(-1);


Delphi-Quellcode:
if BytesValid = DW_ERROR then


gruss und Danke.

himitsu 19. Feb 2017 01:44

AW: unsigned DWORD
 
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
Delphi-Quellcode:
const BassNoData = $FFFFFF;
deklarieren, aber dann würde es nicht mehr der Vorgabe entsprechen. :stupid:

EWeiss 19. Feb 2017 01:59

AW: unsigned DWORD
 
Dann also
Delphi-Quellcode:
DW_ERROR = LongWord(-1);
zu
Delphi-Quellcode:
DW_ERROR = DWord(-1);
oder verstehe ich da wieder was falsch.

Aber nebenbei es nimmt kein ende.
Habe es nach LongInt geändert.

Nun bekomme ich hier einen ERangeError.

Delphi-Quellcode:
function BASS_ChannelGetLevel(handle: DWORD): LongInt;
Delphi-Quellcode:
function TMainApp.SolvePeak(nValue, nTotal: LongInt): LongInt;
begin
  Result := 0;
  if nTotal <> 0 then
    Result := (nValue * 98) div nTotal;

end;
Delphi-Quellcode:
    nLevel := BassChannelGetLevel;

    nLpeak := SolvePeak(loword(nLevel), 128);
    nRpeak := SolvePeak(Hiword(nLevel), 128);
EDIT:
Nein kann kein LongInt verwenden da die Daten die von Bass_ChannelGetdata geliefert werden im Bereich höher sind als bei LongInt (-2147483648 to 2147483647)
Was für ein Schmarrn..
Da bleibt nichts anderes übrig als die Bereichsprüfung auszuschalten.
Oder eine neuere Version von Delphi zu verwenden (Nur dafür fehlt mir die Kohle zu teuer für Hobby Programmierer). ;)

Danke an alle für die Diskussion.

gruss

himitsu 19. Feb 2017 02:18

AW: unsigned DWORD
 
LongWord und DWORD ist das "Selbe".
Das Eine ist blos der Pascal-Name und das andere der C-Name.

Wie zu lesen ist, ist BASS absichtlich unsigned, also kann man da nicht es nicht einfach signed ändern.
Aber man kann integer explizit auf DWORD/LongWord casten.

Gut, man könnte zwar geziehtl versuchen einige Stellen auf Integer zu ändern, damit der Code delphi-typischer wird, aber dann muß man bei Upgrades aufpassen.


Alternativ kann man auch nur für bestimmte Units die Bereichsprüfung deaktivieren, so wie man es z.B. auch bei Verschlüsselungen/Hashs macht, welche implizit mit Überläufen "funktionieren", damit der Code einfacher bleibt.

Die Starter-Edition ist ja aktuell gratis. (wenn man auf ein bissl was bezüglich Features verzichten mag, siehe die vielen Threads dazu)

EWeiss 19. Feb 2017 02:29

AW: unsigned DWORD
 
Zitat:

Gut, man könnte zwar geziehtl versuchen einige Stellen auf Integer zu ändern, damit der Code delphi-typischer wird, aber dann muß man bei Upgrades aufpassen.
JO das hatte ich letztens hab mir da mehr Kaputt optimiert als das es der Anwendung gut tat.
Hatte anschließend unerklärliche Speicherlecks und muste zurück zum letzten Build.

gruss

jaenicke 19. Feb 2017 06:19

AW: unsigned DWORD
 
Du kannst aber auch gezielt die Bereichsprüfung nur in deiner Schnittstelle zu BASS deaktivieren (also in der Unit, in der du die Funktionen der DLL aufrufst), im Rest des Projekts aber aktiv lassen.

Dafür gibt es die Direktive
Delphi-Quellcode:
{$RangeChecks Off} bzw. {$RangeChecks On}
.

EWeiss 19. Feb 2017 12:38

AW: unsigned DWORD
 
Zitat:

Zitat von jaenicke (Beitrag 1362049)
Du kannst aber auch gezielt die Bereichsprüfung nur in deiner Schnittstelle zu BASS deaktivieren (also in der Unit, in der du die Funktionen der DLL aufrufst), im Rest des Projekts aber aktiv lassen.

Dafür gibt es die Direktive
Delphi-Quellcode:
{$RangeChecks Off} bzw. {$RangeChecks On}
.

Gut zu wissen.
Da aber die Funktionen von und zu der Bass Schnittstelle aus der Main und diverser anderer Units aufgerufen werden
denke ich das es nicht viel Sinn macht diese nur in der Bass Unit zu deaktivieren.

gruss

jaenicke 19. Feb 2017 12:49

AW: unsigned DWORD
 
Wenn die Software nicht genug modularisiert ist, geht das natürlich schlecht.

Bei unserem Quelltext würde es genügen das in einer oder mehrerer Schnittstellenunits bei uns zu deaktivieren, weil nicht potenziell viele Units (und schon gar nicht eine Formular-Unit aus der GUI) darauf zugreifen würden.

Unsere Business Logik greift dann nur auf diese Schnittstellenunits zu, die von uns selbst geschrieben sind.

EWeiss 19. Feb 2017 12:59

AW: unsigned DWORD
 
Zitat:

Wenn die Software nicht genug modularisiert ist, geht das natürlich schlecht.
Das ist leider nicht anders machbar.

Ich habe schon versucht diverse Funktionen in dafür vorgesehene Units zu lagern.
Aber für jede inklusive das Abspielen von Musik externe Units anzulegen ist nicht umsetzbar und
würde nichts bringen da ich am ende doch von der Main Form darauf zugreifen muss.

bsp.
Bass, uBass (alle Funktionen die mit Bass zu tun haben)
Muss ich aber von der Main Unit drauf zugreifen.

BassVis, uBassVis
Hier das gleiche usw..

Modular ist da nichts zu machen.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:56 Uhr.
Seite 2 von 3     12 3      

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