Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Struct, Record (https://www.delphipraxis.net/49832-struct-record.html)

mcusa 16. Jul 2005 20:41


Struct, Record
 
Hallo,

habe folgendes Problem, es wäre schön wenn mir jemand weiter helfen könnte.


Delphi-Quellcode:
// check address on the bus
function CheckMDB ( devaddr: BYTE; dp: lpMDBEntry ): Integer; stdcall; external MDB_DLL;


// devices at the bus
type MDBEntry = record
    exist:     Integer;         // device exists
    supported:   Integer;         // supported by DLL
    manufacturer: Array [0.. 3] of Char;   // manufacturer
    model:     Array [0..12] of Char;   // model
  end;
  lpMDBEntry = ^MDBEntry;

Und hier ist das Problem !

CheckMDB ( 15, struct MDBEntry* mep );



Ich bekomme hier die Meldung:

[Fehler] Server1.pas(197): Undefinierter Bezeichner: 'struct'
[Fehler] Server1.pas(197): '(' erwartet, aber '*' gefunden
[Fataler Fehler] Server.dpr(6): Verwendete Unit 'Server1.pas' kann nicht compiliert werden

[edit=alcaeus]delphi-Tags eingefuegt. In Zukunft bitte selbst machen. Mfg, alcaeus[/edit]

malo 16. Jul 2005 20:44

Re: Struct, Record
 
Scheint sich wohl ein C++ler zu uns verirrt haben :mrgreen:

Code:
 struct MDBEntry* mep
Was willst du denn damit machen? Was willst du genau übergeben?

sniper_w 16. Jul 2005 21:49

Re: Struct, Record
 
Vielleicht so:
Delphi-Quellcode:
CheckMDB ( 15, @mep );
@malo: Sieht eher nach C aus.
@Fragesteller: Bitte benutze Delphi-Code Tags zukunftig.

Christian Seehase 17. Jul 2005 10:20

Re: Struct, Record
 
Moin mcusa,

wenn Du die Funktion in Delphi importierst, kannst Du das auf zwei Wegen machen:

Delphi-Quellcode:
// 1. Variante: C-Stil
function CheckMDB (const devaddr: BYTE;const dp: lpMDBEntry): Integer; stdcall; external MDB_DLL;
// 2. Variante: Borland-Stil
function CheckMDB (const devaddr: BYTE;var dp: lpMDBEntry ): Integer; stdcall; external MDB_DLL;
der Aufruf kann dann so erfolgen:

Delphi-Quellcode:
// 1.
var
  pmdb : lpMDBEntry;

begin
  pmdb := AllocMem(SizeOf(pmdb));
  try
    // Felder in pmdb, soweit erforderlich, initialisieren
    CheckMDB(15,pmbd);
    // mit dem Aufruf weiterverarbeiten
  finally
    FreeMem(pmdb,SizeOf(pmdb));
  end;
end;

// 2.
var
  mdb : MDBEntry;

begin
  // Felder in pmdb, soweit erforderlich, initialisieren
  CheckMDB(15,pmbd);
  // mit dem Aufruf weiterverarbeiten
end;
ausserdem solltest Du, sicherheitshalber, aus dem record einen packed record machen.

Olli 17. Jul 2005 16:30

Re: Struct, Record
 
Moin Christian,
Zitat:

Zitat von Christian Seehase
Delphi-Quellcode:
// 1. Variante: C-Stil
function CheckMDB (const devaddr: BYTE;const dp: lpMDBEntry): Integer; stdcall; external MDB_DLL;
// 2. Variante: Borland-Stil
function CheckMDB (const devaddr: BYTE;var dp: lpMDBEntry ): Integer; stdcall; external MDB_DLL;

Deine Varianten sind aber nicht gleichbedeutend mit seiner Übersetzung oben. Du verwendest im Endeffekt eine Referenz auf eine Referenz auf einen Record. Er nur eine einfache Referenz.

@mcusa: Kannst du bitte mal die C-Deklaration des Funktionsprototypen und ggf. auch der struct hier geben. Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:35 Uhr.

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