AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Funktionsaufruf von C nach Delphi übersetzen
Thema durchsuchen
Ansicht
Themen-Optionen

Funktionsaufruf von C nach Delphi übersetzen

Ein Thema von Daniel · begonnen am 31. Jul 2007 · letzter Beitrag vom 1. Aug 2007
Antwort Antwort
Seite 2 von 2     12   
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#11

Re: Funktionsaufruf von C nach Delphi übersetzen

  Alt 31. Jul 2007, 23:34
Moin Michael,

Zitat von Luckie:
Zitat von Daniel:
Wenn ich jetzt im Hinterkopf habe, dass die Datenstrukturen unter anderem aus PChars bestehen,
Hast du auch Speicher für die PChars reserviert?
Zitat von Daniel:
könnte der Fehler daraus resultieren, dass ich die nicht alle initialisiert habe, weil ich einie für optional hielt. Ich habe zu Anfang ein FillChar( Variable, SizeOf(VariablenTyp), 0 ) drüber laufen lassen.
so geht der Satz weiter...
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#12

Re: Funktionsaufruf von C nach Delphi übersetzen

  Alt 1. Aug 2007, 09:36
Offensichtlich ist's doch haariger ...

Die Strukturen sehen wie folgt aus - im Original nur etwas länger, aber nur mit PChars, LongInts und Doubles:

Delphi-Quellcode:
TTarifEingabe = packed record
  tarifname: PChar;
  tarifkennung: PChar;
  geburtsdatum: PChar;
  geschlecht: LongInt;
  versicherungsbeginn: PChar;
  beitrag: Double;
  waehrung: LongInt;
  beitragszahlungsweise: LongInt;
end;
Die ersten beiden Parameter für die Funktion nennen sich TarifEingabe und TarifAusgabe. Der dritte Parameter sollte dann der Status sein, da ich einen solchen Status erhalte, nicht jedoch in den Strukturen selbst.

Mein Aufruf schaut wie folgt aus - die Belegung der Felder habe ich hier für diesen Beitrag weggelassen, aber wie es scheint, sollte ich als nächstes versuchen, für jeden der PChars Speicher zu reservieren.

Delphi-Quellcode:
procedure MachWas;
var TEin : TTarifEingabe;
    TAus : TTarifAusgabe;
    stat : longint;
begin
  FillMemory( @TEin, SizeOf(TTarifEingabe), 0 );
  FillMemory( @TAus, SizeOf(TTarifAusgabe), 0 );

  calcFonds( TEin, TAus, stat );
end;
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#13

Re: Funktionsaufruf von C nach Delphi übersetzen

  Alt 1. Aug 2007, 10:16
Poste doch mal das ganze .h File hier und gleich noch deine Konversion dazu.
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#14

Re: Funktionsaufruf von C nach Delphi übersetzen

  Alt 1. Aug 2007, 11:19
Genau das kann ich aktuell leider nicht tun.

Es handelt sich um die Schnittstelle zu einem Tarifrechner einer Versicherungsgesellschaft. Wenn die das Wort 'Veröffentlichen' schon hören, dann sind sie zu gleichen Teilen empört und entsetzt. Das .h-File an sich wäre zwar in meinen Augen kein kritischer Teil, aber das müsste ich einem aus einer Fachabteilung (= Nicht-Informatiker) klarmachen und dieses Vorhanebn wäre zum Scheitern verurteilt.

Ich habe stattdessen um einen Beispielaufruf in C gebeten. Aus dem Code sollte deutlich werden, wie die Strukturen bestückt werden und sich um den Speicher kümmert.

Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
hoika

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

Re: Funktionsaufruf von C nach Delphi übersetzen

  Alt 1. Aug 2007, 11:23
Hallo,

ein FillChar initialisiert keine PChars !.
Das sind ja nur Pointer.

wenn ich in der Dll ein

strcpy(TarifEingabe->tarifname, "bla") mache,
gibt es eine Schutzverletzung, weil durch dein FillChar der Pointer NIL (NULL) ist.

Du musst per GetMem für die PChars Speicher anfordern,
wie viel, müsste in der Header-Datei stehen.
Wenn nicht, ausprobierne (255 ist ein guter Start).

Nach dem Aufruf aber auch wieder freigeben ...


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#16

Re: Funktionsaufruf von C nach Delphi übersetzen

  Alt 1. Aug 2007, 11:40
und dann gäbe es noch die Möglichkeit eines statischen array of char
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#17

Re: Funktionsaufruf von C nach Delphi übersetzen

  Alt 1. Aug 2007, 11:52
Das grundlegende Problem scheint gelöst. Es lag an den PChars, für die ich explizit Speicher mit StrAlloc() reservieren musste. Die Inhalte habe ich dann via StrPCopy() reinkopiert. Da ich keine Ahnung / Dokumentation habe, wie groß die zu erwartenden Werte sind, habe ich pauschal 1 KB pro PChar reserviert. Das scheint zu langen.

Wieso löst sich so ein Knoten eigentlich immer genau dann, wenn man gerade beim Kunden einen Auftrag an dessen IT-Abteilung rausgegeben hat? *seufz*

Im Moment scheinen die verbleibenden Probleme bei der Bestückung der Strukturen zu liegen. Ich erhielt schon brauchbare Fehlercodes aus dem dritten Parameter. Die gelieferten Fehlernummern stimmten mit den Ursachen überein. Bisschen holperig ist's noch, ich erhalte jetzt aber keine Schutzverletzungen mehr, sondern nur noch eine EDivisionByZero aus dem Tarifrechner selbst. Ich denke und hoffe, das rührt bloß daher, dass ich nicht alle benötigten Felder mit sinnvollen Werten belegt habe. Das zum Thema Prüfung der Plausibilitäten.



@Heiko: Dass ich für die PChars den Speicher separat zu reservieren habe, schrieb ich doch schon.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#18

Re: Funktionsaufruf von C nach Delphi übersetzen

  Alt 1. Aug 2007, 12:38
Sag den Idioten mal (hoeflich natuerlich ) sie sollen ein vernuenftiges API bauen. Was Du bisher gezeigt hast deutet darauf hin das beim Design und der Dokumentation ein Totalversager vorliegt. Man macht keine PChars in ein Record in das Daten ausgegeben werden. Da nimmt man Arrays, damit man nicht extra Alloziieren muss und damit die Puffergroessen definiert sind. abgesehen davon sollte man die nicht so neue C-Syntax mit Parameternamen in den Deklarationen beherrschen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 12:57 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