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
Seite 2 von 3     12 3      
hoika

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

AW: unsigned DWORD

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

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

n/a Beiträge
 
#12

AW: unsigned DWORD

  Alt 19. Feb 2017, 02: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.184 Beiträge
 
Delphi 12 Athens
 
#13

AW: unsigned DWORD

  Alt 19. Feb 2017, 02: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.
$2B or not $2B

Geändert von himitsu (19. Feb 2017 um 02:48 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#14

AW: unsigned DWORD

  Alt 19. Feb 2017, 02:59
Dann also
DW_ERROR = LongWord(-1); zu
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.

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

Geändert von EWeiss (19. Feb 2017 um 03:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: unsigned DWORD

  Alt 19. Feb 2017, 03:18
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)
$2B or not $2B

Geändert von himitsu (19. Feb 2017 um 03:23 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#16

AW: unsigned DWORD

  Alt 19. Feb 2017, 03:29
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
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.649 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: unsigned DWORD

  Alt 19. Feb 2017, 07:19
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 {$RangeChecks Off} bzw. {$RangeChecks On} .
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#18

AW: unsigned DWORD

  Alt 19. Feb 2017, 13:38
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 {$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
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.649 Beiträge
 
Delphi 11 Alexandria
 
#19

AW: unsigned DWORD

  Alt 19. Feb 2017, 13:49
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#20

AW: unsigned DWORD

  Alt 19. Feb 2017, 13:59
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 07:26 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