AGB  ·  Datenschutz  ·  Impressum  







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

Doppeldeutiger Aufruf

Ein Thema von EWeiss · begonnen am 16. Jun 2011 · letzter Beitrag vom 16. Jun 2011
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

Doppeldeutiger Aufruf

  Alt 16. Jun 2011, 16:31
Fehler zu bereinigen?
Habe da meine Zweifel da ich nicht in der SysUtils rummachen kann oder?

Zitat:
[DCC Fehler] MidiOut.pas(268): E2251 Doppeldeutiger überladener Aufruf von 'StrMove'
SysUtils.pas(7723): Verwandet Methode: function StrMove(PAnsiChar; const PAnsiChar; Cardinal): PAnsiChar;
SysUtils.pas(7729): Verwandet Methode: function StrMove(PWideChar; const PWideChar; Cardinal): PWideChar;
Delphi-Quellcode:
procedure TMidiOutput.PutLong(TheSysex: Pointer; msgLength: Word);
{ Notes: This works asynchronously }
var
  MyMidiHdr: TMyMidiHdr;
begin
  { Initialize the header and allocate buffer memory }
  MyMidiHdr := TMyMidiHdr.Create(msgLength);
  StrMove(MyMidiHdr.SysexPointer, TheSysex, msgLength);
  { Store the MyMidiHdr address in the header so we can find it again quickly }
  MyMidiHdr.hdrPointer^.dwUser := DWORD(MyMidiHdr);
  { Get MMSYSTEM's blessing for this header }
  FError := midiOutPrepareHeader(FMidiHandle, MyMidiHdr.hdrPointer, sizeof(TMIDIHDR));
  if Ferror > 0 then
    raise EMidiOutputError.Create(MidiIOErrorString(False, FError));
  { Send it }
  FError := midiOutLongMsg(FMidiHandle, MyMidiHdr.hdrPointer, sizeof(TMIDIHDR));
  if FError > 0 then
    raise EMidiOutputError.Create(MidiIOErrorString(False, FError));
end;
gruss
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
675 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Doppeldeutiger Aufruf

  Alt 16. Jun 2011, 16:36
Keine Angst, SysUtils musst Du dafür nicht anfassen

Sowohl MyMidiHdr.SysexPointer als auch TheSysex "müssen" beide entweder PAnsiChar oder PWideChar sein, zur Not per typecasting, sonst weiß der Compiler nicht, an welche der beiden überladenen Funktionen er andere Typen am besten übergeben soll.

Geändert von CCRDude (16. Jun 2011 um 16:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

AW: Doppeldeutiger Aufruf

  Alt 16. Jun 2011, 16:36
Schon mal einen Cast probiert?
Delphi-Quellcode:
StrMove(PWideChar(MyMidiHdr.SysexPointer), PWideChar(TheSysex), msgLength);
// oder eben
StrMove(PAnsiChar(MyMidiHdr.SysexPointer), PAnsiChar(TheSysex), msgLength);
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Doppeldeutiger Aufruf

  Alt 16. Jun 2011, 16:40
Warum solltest Du dafür etwas in den SysUtils machen müssen?

Sowohl MyMidiHdr.SysexPointer als auch TheSysex "müssen" beide entweder PAnsiChar oder PWideChar sein, zur Not per typecasting, sonst weiß der Compiler nicht, an welche der beiden überladenen Funktionen er andere Typen am besten übergeben soll.
Ok das erklärt einiges
Sind als Pointer deklariert ..
Mit s.h.a.r.k seinem cast sollte es gehen.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#5

AW: Doppeldeutiger Aufruf

  Alt 16. Jun 2011, 16:41
Kannst eigentlich auch nur PChar nutzen, dann hast bei "alten" Delphi-Versionen PAnsiChar und bei neueren eben PWideChar.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
675 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Doppeldeutiger Aufruf

  Alt 16. Jun 2011, 16:46
Und bei einem von beiden eben ein Problem?

Welches der drei er nun verwenden kann, hängt komplett davon ab, was TheSysex nun wirklich ist. Zumindest spricht die Delphi-Hilfe von "number of characters" und nicht "number of bytes" - das Verwenden des falschen Typen würde dann entweder nur halbe "Messages" oder einen Speicherüberlauf bedeuten.

Da es hier um Rohdaten gehen könnte, wäre das PAnsiChar, und da PChar oder PWideChar unter neuerem Delphi zu verwenden würde heißen, jedesmal doppelt so viel Speicher wie nötig zu kopieren - von unklarer Stelle und in nicht allokiierten Speicher hinein!

Wenn es aber nur Daten und keine Texte sind, warum dann eigentlich StrMove und nicht nur Move?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Doppeldeutiger Aufruf

  Alt 16. Jun 2011, 17:03
Kannst eigentlich auch nur PChar nutzen, dann hast bei "alten" Delphi-Versionen PAnsiChar und bei neueren eben PWideChar.
Wobei aber D2005 den Pointer aktzeptiert muss da nichts casten.
aber D2009 leider nicht.

gruss
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Doppeldeutiger Aufruf

  Alt 16. Jun 2011, 17:06
Damals gab es halt nur einen Stringtyp ( eigentlich 2, ist aber für dieses Problem egal). Jetzt gibt es halt 2 verschiedene, da weiss der Compiler dann nicht welcher der richtige ist!
Markus Kinzler
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Doppeldeutiger Aufruf

  Alt 16. Jun 2011, 17:07
Damals gab es halt nur einen Stringtyp ( eigentlich 2, ist aber für dieses Problem egal). Jetzt gibt es halt 2 verschiedene, da weiss der Compiler dann nicht welcher der richtige ist!
Ok Danke euch!

gruss
  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 11:33 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