AW: unsigned DWORD
|
AW: unsigned DWORD
Zitat:
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:
Delphi-Quellcode:
DW_ERROR = LongWord(-1);
Delphi-Quellcode:
if BytesValid = DW_ERROR then
gruss und Danke. |
AW: unsigned DWORD
C ist bezüglich Typisierung nunmal recht "lasch" und Delphi reagiert auf falsche Typen eben bissl allergisch.
Code:
In C mag das gehen.
int r=BASS_ChannelGetData(decoder, buffer, length);
if (r==-1) return 0; // error = no data 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:
Man könnte es zwar auch als
const BassNoData = DWORD(-1);
if r = BassNoData then Result := 0; // error = no data
Delphi-Quellcode:
deklarieren, aber dann würde es nicht mehr der Vorgabe entsprechen. :stupid:
const BassNoData = $FFFFFF;
|
AW: unsigned DWORD
Dann also
Delphi-Quellcode:
zu
DW_ERROR = LongWord(-1);
Delphi-Quellcode:
oder verstehe ich da wieder was falsch.
DW_ERROR = DWord(-1);
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:
EDIT:
nLevel := BassChannelGetLevel;
nLpeak := SolvePeak(loword(nLevel), 128); nRpeak := SolvePeak(Hiword(nLevel), 128); 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 |
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) |
AW: unsigned DWORD
Zitat:
Hatte anschließend unerklärliche Speicherlecks und muste zurück zum letzten Build. gruss |
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}
|
AW: unsigned DWORD
Zitat:
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 |
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. |
AW: unsigned DWORD
Zitat:
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. |
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