AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Problem: Format %p ungültig o. nicht kompatibel mit Argument
Thema durchsuchen
Ansicht
Themen-Optionen

Problem: Format %p ungültig o. nicht kompatibel mit Argument

Ein Thema von carknue · begonnen am 20. Aug 2005 · letzter Beitrag vom 20. Aug 2005
Antwort Antwort
Seite 1 von 2  1 2      
carknue

Registriert seit: 26. Mai 2005
37 Beiträge
 
Turbo Delphi für Win32
 
#1

Problem: Format %p ungültig o. nicht kompatibel mit Argument

  Alt 20. Aug 2005, 15:27
Ich programmiere ein kleines Freeware Tool, welches die Ansteuerung von verschiedenen Radios übernimmt. Nun bin ich bei einem neuen Empfänger, der per dll angesteuert wird auf ein merkwürdiges Problem gestoßen, welches ich mir nicht erkären kann. Mein Problem ist, dass ich bei einem Aufruf einer Funktion aus dieser externen dll eine EConvertError '%P' Exception bekomme. Die Exception bekomme ich nur, wenn ich das Programm über die IDE(Delphi 6) laufenlasse. Starte ich direkt die exe, gibt es ohne error Behandlung im Programm nur die Meldung "Format %p ungültig o. nicht kompatibel mit Argument" Diese läßt sich mit OK wegklicken und es läuft einwandfrei weiter, auch die Funktion wurde korrekt ausgeführt. Aber dies passiert nur, wenn ich diese Funktion aus bestimmten Proceduren meines Programms aufrufe. Hier zu erstmal die C++ Header Datei mit dem Funktionaufruf für die dll. Es geht um die Funktion FrontendSetMode aus der dll. Der Aufruf innerhalb meiner "procedure TForm1.checkaorClick(Sender: TObject)" funktioniert ohne Probleme, rufe ich sie allerdings mit den gleichen Parametern über meine "Procedure Tform1.SetDWTMode(mode: smallint)" auf, so kommt der Format Fehlermeldung. Jetzt kommt dass, was ich überhaupt nicht verstehe, denn wenn ich die Funktion in meiner "procedure Tform1.SetFreq(freq: string)" aufrufe, kommt keine Fehlermeldung. Und wenn ich, wie in "procedure TForm1.Button4Click(Sender: TObject)" die Exception abfangen will, wird das Programm ander Stelle ohne Meldung geschlossen. Wer weiß Rat?


Zitat:
/*! Frontend error codes, all values not listed are RFU */
typedef enum _tFrontendError
{
eFrontendOk = 0, /*!< no error */
eFrontendErrorNotInitialized = -1, /*!< DLL not initialized (call FrontendOpen() first */
eFrontendErrorReceiverDisconnected = -2, /*!< receiver is not connected to the PC */
eFrontendErrorInvalidParameter = -3, /*!< parameter for the command was invalid */
eFrontendErrorCommandFailure = -4, /*!< command was not executed */
} tFrontendError;



/*! Frontend modes, all values not listed are RFU */
typedef enum _tFrontendMode
{
eFrontendModeUndefined = 0, /*!< undefined/unknown mode */
eFrontendModeDrm = 1, /*!< mode for DRM demodulation */
eFrontendModeAm = 2, /*!< mode for AM demodulation */
eFrontendModeFm = 6, /*!< mode for FM demodulation */
} tFrontendMode

/* ################################################## ################################################ */


/*! open Frontend, called once on startup; to recover from an error FrontendClose
* followed by a further FrontendOpen will be called
*
* \return <0 error, see _tFrontendError, >0 API Version see cFrontendApiVersion
*/
FRONTEND_API
short
FRONTEND_API_CALL
FrontendOpen(void);



/*! close Frontend, called on shutdown of the receiver or while recovering from errors
*
* \return 0 = no error, <0 error see _tFrontendError
*/
FRONTEND_API
short
FRONTEND_API_CALL
FrontendClose(void);

/*! set frontend mode
* \param mode set frontend to the given mode
* \return 0 = no error, <0 error, see _tFrontendError
*/
FRONTEND_API
short
FRONTEND_API_CALL
FrontendSetMode(tFrontendMode mode);


/*! set frontend to the given frequency in Hz
* \param freq frequency in Hz
* the allowed intervals are 150000 .. 29999000 for DRM/AM, and 87500000 .. 108000000 for FM
* \return 0 = no error, <0 error, see _tFrontendError
*/
FRONTEND_API
short
FRONTEND_API_CALL
FrontendSetFrequency(double freq);
Hier der relevante Code meines Programms

Delphi-Quellcode:
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, sndkey32, StdCtrls, ComCtrls, ExtCtrls, inifiles, DateUtils,
  CPort, CPortCtl, Grids, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP, Menus;

type
  TForm1 = class(TForm)
    
    Procedure SetDWTMode(mode: smallint);
    procedure SetFreq(freq: string);
    procedure dwtmodClick(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure checkaorClick(Sender: TObject);
    
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  
  dwt: smallint;

  FrontendOpen: function(): Integer; stdcall;
  FrontendClose: function(): Integer; stdcall;
  FrontendSetFrequency: function(freq: double): smallint; stdcall;
  FrontendSetMode: function(mode: smallint): smallint; stdcall;
  FrontendSetAntennaMode: function(n: smallint): smallint; stdcall;

implementation

{$R *.dfm}

Procedure Tform1.SetDWTMode(mode: smallint);
begin
if mode=1 then FrontendSetMode(1);
if mode=2 then FrontendSetMode(2);
if mode=6 then FrontendSetMode(6);
end;

procedure Tform1.SetFreq(freq: string);
var rfreq: integer;
    dwtfreq:double;

begin

 rfreq:=strtoint(freq);
 if (rfreq > 150) and (rfreq < 29999) then
 begin
 edit1.Text:=freq;
 if cbrx.ItemIndex=10 then
 begin
 dwtfreq:=rfreq*1000;
 dwt:=FrontendSetFrequency(dwtfreq);
 label2.Caption:=inttostr(dwt);
 end
end
end;

procedure TForm1.checkaorClick(Sender: TObject);

 begin
   ShowMessage('Be sure that the DWT application is not running anymore!');
   Dll:=LoadLibrary('afgusbfe.dll');
   dwt:=69;

   if (Dll=0) then ShowMessage('afgusbfe.dll not found !')
   else begin
    FrontendOpen:=GetProcAddress(dll,'FrontendOpen');
    FrontendClose:=GetProcAddress(dll,'FrontendClose');
    FrontendSetFrequency:=GetProcAddress(dll,'FrontendSetFrequency');
    FrontendSetMode:=GetProcAddress(dll,'FrontendSetMode');
    FrontendSetAntennaMode:=GetProcAddress(dll,'FrontendSetAntennaMode');

     dwt:=FrontendOpen;
     label2.Caption:=inttostr(dwt);
     dwt:=FrontendSetFrequency(3995000);
     label2.Caption:=inttostr(dwt);
     dwt:=FrontendSetMode(1);
     label2.Caption:=inttostr(dwt);
     ShowMessage('1');
     dwt:=FrontendSetMode(2);
     label2.Caption:=inttostr(dwt);
     ShowMessage('2');
     dwt:=FrontendSetMode(6);
     label2.Caption:=inttostr(dwt);
     ShowMessage('6');
   end;
 end;

procedure TForm1.dwtmodClick(Sender: TObject);
begin
 if dwtmod.ItemIndex=0 then SetDWTMode(1);
 if dwtmod.ItemIndex=1 then SetDWTMode(2);
 if dwtmod.ItemIndex=2 then SetDWTMode(6);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
try
FrontendSetMode(6);
except
on EConvertError do
begin
label2.Caption:='Error';
end;
end;
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Problem: Format %p ungültig o. nicht kompatibel mit Argu

  Alt 20. Aug 2005, 15:57
300 Zeilen sind für dich relevat? Kürz es entweder oder pack es als Anhang zu deinem Beitrag dazu.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
carknue

Registriert seit: 26. Mai 2005
37 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Problem: Format %p ungültig o. nicht kompatibel mit Argu

  Alt 20. Aug 2005, 16:24
done.
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#4

Re: Problem: Format %p ungültig o. nicht kompatibel mit Argu

  Alt 20. Aug 2005, 17:10
EConvertError '%P' weist doch auf einen FormatString Fehler hin, also in Form von:

Code:
[b][...][/b]
  ShowMessage(Format('Pointer = %p', [text] ));
[b][...][/b]
Richtig:
Code:
[b][...][/b]
[b] var[/b]
  text : [b]string[/b];
[b]begin[/b]
  Trxt := 'Hallo';
  ShowMessage(Format('Pointer = %p', [@text]));
  ShowMessage(Format('Pointer = %p', [addr(text)]));
[b]end;[/b]
Zitat:
%P Zeiger: Das Argument muß ein Zeigerwert sein. Der Wert wird in einen String mit acht Zeichen, der den hexadezimalen Wert des Zeigers darstellt, konvertiert.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
carknue

Registriert seit: 26. Mai 2005
37 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Problem: Format %p ungültig o. nicht kompatibel mit Argu

  Alt 20. Aug 2005, 18:13
Ja aber die Funktion FrontendSetMode liefert einen Smallint und das Argument ist auch ein Smallint. Undw ieso klappt der der Aufruf dwt:=FrontendSetMode(2); in den Proceduren checkaorClick(Sender: TObject) und SetFreq(freq: string) aber nicht aus SetDWTMode(mode: smallint)?

  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#6

Re: Problem: Format %p ungültig o. nicht kompatibel mit Argu

  Alt 20. Aug 2005, 19:23
Procedure SetDWTMode(mode: smallint); Ist wo, und sieht wie aus ?

Benutzt Du auch mal die Entertaste ?


// Edit: Hänge doch bitte mal die C Header-File als Anhang mit dran.

Und ich habe nur nen kleinen Bildschirm mit max. 80 Zeichen

/* ################################################## ###################### */
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
carknue

Registriert seit: 26. Mai 2005
37 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Problem: Format %p ungültig o. nicht kompatibel mit Argu

  Alt 20. Aug 2005, 19:43
Ok, hier ist das c header file.
Angehängte Dateien
Dateityp: h afgusbtuner_126.h (8,9 KB, 6x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#8

Re: Problem: Format %p ungültig o. nicht kompatibel mit Argu

  Alt 20. Aug 2005, 20:02
Was mir Auffällt:

smallint ?

Delphi-Quellcode:
type
  short = shortint;
Aber die Procedure SetDWTMode finde ich nicht in der Header File.

Hast du die C-Header richtig übersetzt ?
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
carknue

Registriert seit: 26. Mai 2005
37 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Problem: Format %p ungültig o. nicht kompatibel mit Argu

  Alt 20. Aug 2005, 20:28
short von C++ entspricht smallint bei Delphi.
Shortint ist zu klein, obwohl es für die auftretenden Werte
reichen würde.

Es geht um die Funktion FrontendSetMode aus der header Datei.

Delphi-Quellcode:
Procedure Tform1.SetDWTMode(mode: smallint);
begin
if mode=1 then FrontendSetMode(1);
if mode=2 then FrontendSetMode(2);
if mode=6 then FrontendSetMode(6);
end;
Declariert ist es wie folgt:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
   
    Procedure SetDWTMode(mode: smallint);
    procedure SetFreq(freq: string);
    procedure dwtmodClick(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure checkaorClick(Sender: TObject);
   
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
 
  dwt: smallint;

  FrontendOpen: function(): Integer; stdcall;
  FrontendClose: function(): Integer; stdcall;
  FrontendSetFrequency: function(freq: double): smallint; stdcall;
  FrontendSetMode: function(mode: smallint): smallint; stdcall;
  FrontendSetAntennaMode: function(n: smallint): smallint; stdcall;

implementation

{$R *.dfm}
Die dll lade ich dann so:
Delphi-Quellcode:

Dll:=LoadLibrary('afgusbfe.dll');
   dwt:=69;

   if (Dll=0) then ShowMessage('afgusbfe.dll not found !')
   else begin
    FrontendOpen:=GetProcAddress(dll,'FrontendOpen');
    FrontendClose:=GetProcAddress(dll,'FrontendClose');
    FrontendSetFrequency:=GetProcAddress(dll,'FrontendSetFrequency');
    FrontendSetMode:=GetProcAddress(dll,'FrontendSetMode');
    FrontendSetAntennaMode:=GetProcAddress(dll,'FrontendSetAntennaMode');

     dwt:=FrontendOpen;
     dwt:=FrontendSetFrequency(3995000);
     dwt:=FrontendSetMode(1);
Bis hier geht der Aufruf von dwt:=FrontendSetMode(1); einwandfrei.
In dieser Procedure kommt aber die Formatfehlermeldung:
Delphi-Quellcode:
Procedure Tform1.SetDWTMode(mode: smallint);
begin
if mode=1 then dwt:=FrontendSetMode(1);
if mode=2 then dwt:=FrontendSetMode(2);
if mode=6 then dwt:=FrontendSetMode(6);
end;
In dieser Procedure klappt es dagegen wieder:

Delphi-Quellcode:
procedure Tform1.SetFreq(freq: string);
var rfreq: integer;
    dwtfreq:double;

begin

rfreq:=strtoint(freq);
dwtfreq:=rfreq*1000;
dwt:=FrontendSetFrequency(dwtfreq);
label2.Caption:=inttostr(dwt);
dwt:=FrontendSetMode(1);

end;
  Mit Zitat antworten Zitat
Phistev
(Gast)

n/a Beiträge
 
#10

Re: Problem: Format %p ungültig o. nicht kompatibel mit Argu

  Alt 20. Aug 2005, 21:23
Short soll smallint (Ganzzahl) sein? In SetFreq übergibst du ein Double (Fließkommazahl), und das scheint zu funktionieren

/Edit: Nachgeguckt, short scheint wirklich smallint zu sein. Wieso funktioniert dann der Double-Wert?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 01:49 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