Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C nach Pascal (https://www.delphipraxis.net/126476-c-nach-pascal.html)

totti14 25. Dez 2008 23:55


C nach Pascal
 
Hallo,
ich versuche gerade ein kleine C Beispiel nach Pascal zu übersetzten hänge aber leider an folgenden Konstrukt:


Stack.h

Code:
#define MAX_APP_ENTRY 5

typedef struct
{
 unsigned int port;               // Port
 void(*fp)(unsigned char);  // Zeiger auf auszuführende Funktion
} TCP_PORT_ITEM;


TCP_PORT_ITEM TCP_PORT_TABLE[MAX_APP_ENTRY];
Stack.c

Code:
TCP_PORT_ITEM TCP_PORT_TABLE[MAX_APP_ENTRY] = // Port-Tabelle
{
 {0,0},
 {0,0},
 {0,0} 
};
Hätte da jemand einen Tip.

Danke
Thorsten

[edit=Matze][c]-Tags eingefügt. Zukünftig bitte selbst daran denken. MfG, Matze[/edit]

Cyf 26. Dez 2008 04:48

Re: C nach Pascal
 
Zitat:

Zitat von totti14
#define MAX_APP_ENTRY 5

Kannst du als Konstante ansehen.


Zitat:

typedef struct
{
unsigned int port; // Port
void(*fp)(unsigned char); // Zeiger auf auszuführende Funktion
} TCP_PORT_ITEM;
Ein record.


Zitat:

TCP_PORT_ITEM TCP_PORT_TABLE[MAX_APP_ENTRY];
Ein Array dieses records, von 0 bis MAX_APP_ENTRY.



Zitat:

TCP_PORT_ITEM TCP_PORT_TABLE[MAX_APP_ENTRY] = // Port-Tabelle
{
{0,0},
{0,0},
{0,0}
};
Die ersten 3 Indexe auf 0 initialisieren.

totti14 26. Dez 2008 12:00

Re: C nach Pascal
 
Hallo Cyf,
dann sollte es doch so aussehen:

Delphi-Quellcode:

Type
  TCP_PORT_ITEM = Record
                     port          : Word; // Port
                     fp            : Pointer;  // Zeiger auf auszuführende Funktion
                   end;
var
  TCP_PORT_TABLE : array[0..MAX_APP_ENTRY-1] of TCP_PORT_ITEM;


initialization
  for i:=0 to 2 do
   TCP_PORT_TABLE[i]:=(0,0);
Aber wo bleibt das Byte(Char) aus void(*fp)(unsigned char); // Zeiger auf auszuführende Funktion

Gruß
Thorsten

DeddyH 26. Dez 2008 12:19

Re: C nach Pascal
 
Nicht, dass ich da Ahnung davon hätte, aber kann es sein, dass die auszuführende Funktion über ihren Namen angesprochen werden soll?

SirTwist 26. Dez 2008 12:20

Re: C nach Pascal
 
Zitat:

Zitat von totti14
Aber wo bleibt das Byte(Char) aus void(*fp)(unsigned char); // Zeiger auf auszuführende Funktion

Du musst Dir zuerst einen Typ definieren:
Delphi-Quellcode:
type
  TCallProc = procedure(c: Char);
Und dann ist 'fp' im Record 'TCP_PORT_ITEM' kein Pointer, sondern ein TCallProc.

Wobei ich grad nicht auswendig weiß, was der richtige Delphi-Datentyp für 'unsigned char' ist.

Gruß,
SirTwist

totti14 26. Dez 2008 13:47

Re: C nach Pascal
 
Danke funzt

Delphi-Quellcode:
type
  TCallProc = procedure(c: Char);

  TCP_PORT_ITEM = Record
                     port          : Word; // Port
                     fp            : TCallProc;  // Zeiger auf auszuführende Funktion
                   end;

initialization

for i:=0 to MAX_APP_ENTRY-1 do
    TCP_PORT_TABLE[i].Port:=0;
    TCP_PORT_TABLE[i].fp:=nil;
   endfor;
dann sollte das doch eine Variable sein
struct arp_table arp_entry[MAX_ARP_ENTRY];

Delphi-Quellcode:
Var
  arp_entry : Array[0-MAX_ARP_ENTRY-1] of arp_table;
Nur wofür steht das struct davor ? Ist ja kein Record.
Sieht alles anders aus als in den Tutorials

Thorsten

Cyf 26. Dez 2008 14:09

Re: C nach Pascal
 
Zitat:

Zitat von SirTwist
Wobei ich grad nicht auswendig weiß, was der richtige Delphi-Datentyp für 'unsigned char' ist.


Byte
:!: Ansonsten stimmts bei Unicode-Chars nicht mehr. In C ist ein Char immer genau 1 Byte groß.

Zitat:

Nur wofür steht das struct davor ? Ist ja kein Record.
Ist in C so üblich, wenn die struct nicht nochmal durch ein typedef benannt ist.
Wenn arp_table bei dir der Typ der struct ist, stimmt das schon.
Nur hast du wahrscheinlich eher
Delphi-Quellcode:
array[0 .. MAX_ARP_ENTRY-1]
gemeint.

totti14 26. Dez 2008 14:20

Re: C nach Pascal
 
Zitat:

Nur hast du wahrscheinlich eher
Delphi-Quellcode: markieren
array[0 .. MAX_ARP_ENTRY-1]
gemeint.
Ups Tippfehler.

Mal schauen wie weit ich jetzt komme.

Danke alle

Thorsten

Christian Seehase 26. Dez 2008 14:32

Re: C nach Pascal
 
Moin Thorsten,

den Record würde ich allerdings so beginnen:

Delphi-Quellcode:
Type
  TCP_PORT_ITEM = packed record
                     port          : cardinal; // Port
unsigned int entspricht in Delphi dem cardinal, da es er 4 Byte gross ist, und nicht 2.

totti14 26. Dez 2008 16:34

Re: C nach Pascal
 
Zitat:

unsigned int entspricht in Delphi dem cardinal, da es er 4 Byte gross ist, und nicht 2.
Jups, habe ich übersehen. Ist jetzt ein Longword, da für einen 8 Bit Controller und AVRco Pascal.
Word sind ja hier 16 Bit und das würde für den Portrange nicht reichen.

Danke
Thorsten

jbg 26. Dez 2008 17:20

Re: C nach Pascal
 
Zitat:

Zitat von Christian Seehase
packed record

Bist du dir da sicher, dass da ein "packed" hin kommt? Steht im C code etwa ein "#pragra pack(push,1)" oder ähnliches?

Zudem würde ich bei dem Funktionszeiger noch "cdecl" anhängen, wenn man nicht sein blaues Wunder erleben will.

totti14 26. Dez 2008 19:18

Re: C nach Pascal
 
Zitat:

Bist du dir da sicher, dass da ein "packed" hin kommt? Steht im C code etwa ein "#pragra pack(push,1)" oder ähnliches?

Zudem würde ich bei dem Funktionszeiger noch "cdecl" anhängen, wenn man nicht sein blaues Wunder erleben will.
Steht dort nicht und den Rest gibt es im Emded Pascal nicht.

Gruß
Thorsten


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:40 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