mikrocontroller.net

Forum: PC-Programmierung Rückgabe-Wert als double aus C-DLL auslesen


Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

ich schreibe mit einem Freund zusammen ein Programm. Er schreibt eine 
DLL-Datei und ich schreibe das Hauptprogramm. Die DLL liefert einen 
floating-Wert zurück. In meinem Programm kommt allerdings kein 
floating-Wert an, sondern ein INT oder LONG - also Ganzzahl.
Bei Aufruf der Funktion in der DLL wird der double Wert auf dem 
Bildschirm ausgegeben. Da ist es noch eine Gleitkommazahl.
Die Initialisierung der DLL sieht so aus:
_Division_Berechnen (unsigned long *Zaehler, unsigned long *Nenner, double *result_div, int Stelle)
   {
      typedef double (CALLBACK *LPWSTR)(unsigned long *, unsigned long *, double *, int);
      LPWSTR p;
      p = (LPWSTR)GetProcAddress(hDLL,"_DLL_Division");
      if (!p)
      {
         printf ("\nFormel in DLL nicht gefunden!\n\n");
         exit(-1);
      }
      else
      {
         return (p)(Zaehler, Nenner, result_div, Stelle);
      }
   }

Was könnte ich falsch machen, dass der floating-Wert als Ganzzahl-Wert 
übergeben wird?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was steht vor "_Division_Berechnen"?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steffen schrieb:

> floating-Wert zurück. In meinem Programm kommt allerdings kein
> floating-Wert an, sondern ein INT oder LONG - also Ganzzahl.

Woher weißt du das.

Der Zahlenwert wird ganz sicher nicht von irgendjemanden zwischendurch 
verändert.
Entweder dein Freund hat sich irgendwo vertan und sich einen cast auf 
eine Ganzzahl eingehandelt oder deine Ausgabe ist ganz einfach falsch 
programmiert.

Beides hat aber mit dem gezeigten Code nichts zu tun, sondern du musst 
auf DLL Seite den Code ansehen oder aber was du mit dem Ergbenis-Wert 
weiter machst.

Autor: Aus Interesse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
schau mal hier 
http://c-buch.sommergut.de/Kapitel10/Verwendung-vo... 
.

Nur aus reiner Neugier: Warum stellts Du die Verknüpfung zu Deiner Dll 
explizit her?

Gruss

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Grund dafür könnte sein, daß mehrere DLLs mit gleichem Interface 
wechselweise geladen und genutzt werden sollen - man denke an ein 
"Plugin"-Modell.
Das lässt sich über Importlibraries nicht nutzen, auch ist eine 
softwareseitige Behandlung von Fehlern (DLL nicht da, falsche Version 
o.ä.) dann nicht möglich, weil der Programmlader das Programm erst dann 
startet, wenn alle erforderlichen DLLs vorhanden sind.

Autor: Aus Interesse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus Τ. Firefly schrieb:
> Ein Grund dafür könnte sein, daß mehrere DLLs mit gleichem Interface
> wechselweise geladen und genutzt werden sollen - man denke an ein
> "Plugin"-Modell.
> Das lässt sich über Importlibraries nicht nutzen, auch ist eine
> softwareseitige Behandlung von Fehlern (DLL nicht da, falsche Version
> o.ä.) dann nicht möglich, weil der Programmlader das Programm erst dann
> startet, wenn alle erforderlichen DLLs vorhanden sind.

Da hast Du natürlich völlig recht. Allerdings war die Frage eher als Tip 
meinerseits gedacht. Das fehlende "double" zeigt mir, dass mit grösster 
Wahrscheinlichkeit kein Plugin-Modell genutzt wird.

Viele Grüsse

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
super, es hat geklappt. Es hat das "DOUBLE" vor der 
Initialisierung/Funktionsaufruf gefehlt.

Autor: Nico Sch. (nico22)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man merke, der Standard-Rückgabewert in C ist ein int.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Compiler hätte hier allerdings eine Warnung ausgeben müssen. Hat er 
vermutlich auch, aber das Ignorieren von Warnungen von C-Compilern gilt 
ja als "sportlich".

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.