Frage

Ich habe eine C-Funktion in einer statischen Bibliothek bekommt, nennen sie es ein, mit der folgenden Schnittstelle:

int A(unsigned int a, unsigned long long b, unsigned int *y, unsigned char *z);

Diese Funktion wird den Wert ändern y eine z (dies sicher ist). Ich benutze es, innerhalb eines dynamischen C ++ Bibliothek, mit extern "C".

Nun, hier ist das, was stune mich:

  • y richtig eingestellt ist, wird z nicht verändert. Was ich meine, ist genau das, dass, wenn beide mit einem (spitzen) Wert von 666 initialisiert werden, wird der Wert darauf von y nach dem Aufruf geändert hat, aber nicht der Wert von z zeigt (noch 666).
  • , wenn sie von einem C binär genannt, ist diese Funktion arbeitet nahtlos (Wert zeigte durch z modifiziert).
  • wenn ich eine Dummy-C-Bibliothek mit einer Funktion mit dem gleichen Prototyp zu erstellen, und ich verwende es aus meiner dynamischen C ++ Bibliothek, es funktioniert sehr gut. Wenn ich die gleichen Variablen wiederverwenden A nennen (..), ich das gleiche Ergebnis wie zuvor, z nicht geändert wird.

Ich denke, dass die oben genannten Punkte zeigen, dass es nicht ein dummer Fehler mit der Erklärung meiner Variablen ist.

Ich bin eindeutig fest, und ich kann nicht die C-Bibliothek ändern. Sie haben keine Ahnung, was das Problem sein kann? Ich war auf dem C / C ++ Schnittstelle über ein Problem nachzudenken, pro Instanz die Art und Weise eines char * interpretiert wird.

Edit: Ich fand schließlich heraus, was das Problem war. Im folgenden sehen Sie meine Antwort.

War es hilfreich?

Lösung 9

Zunächst einmal bin ich alle für Ihre Hilfe sehr dankbar. Dank der zahlreichen Ideen und Hinweisen du mir gegeben hast, habe ich in der Lage gewesen, um endlich dieses Problem zu lösen. Ihre Ratschläge haben mir geholfen, zu fragen, was ich für selbstverständlich hielt.

Kurze Antwort auf mein Problem: Das Problem war, dass meine C ++ Bibliothek eine alte Version der C-Bibliothek verwendet. Diese alte Version verpasst das vierte Argument. Als Folge wurde das vierte Argument offensichtlich nie geändert.

Ich bin ein bisschen beschämt jetzt, dass ich erkennen dies das Problem war. Allerdings war ich von der Tatsache misslead, dass mein Code in Ordnung war kompilieren. Dies war aufgrund der Tatsache, dass die C ++ Bibliothek gegen die korrekte Version des C lib kompiliert, sondern zur Laufzeit verwendete es die alte Version statisch mit einer anderen Bibliothek verknüpft, die ich benutze.

C++ Lib (M) ---> dyn C++ lib (N) ---> C lib (P) v.1.0
     |
     ------> C lib (P) v.1.1

(N) ist eine dynamische Bibliothek, die statisch mit (P), Version 1.0 verbunden ist. Der Compiler akzeptiert den Anruf von (M) auf die Funktion mit 4 Argumente, weil ich gegen (P) verknüpfte Version 1.1, aber zur Laufzeit verwendet es die alte Version von (P).

Sie können ferner diese Antwort oder die Frage zu bearbeiten oder um mich zu fragen, dies zu tun.

Andere Tipps

Es sieht aus wie eine Differenz zwischen dem die Art und Weise Ihrer C-Bibliothek und C ++ Compiler es zu tun hat long longs . Meine Vermutung ist, dass es ist, dass die C-Bibliothek wahrscheinlich Standard C89 wird vor und Behandlung tatsächlich den 64-Bit long long als 32-Bit lang. Ihre C ++ Bibliothek ist der Umgang es richtig und 64 Bit in der Aufrufliste platzieren und somit y und z korrumpiert. Vielleicht versuchen, die Funktion durch * int A (unsigned int a, unsigned long b, unsigned int * y, unsigned char z) Aufruf , und sehen, was Sie erhalten.

Nur so ein Gedanke.

Dies ist eine jener Fragen, wo es nichts offensichtlich falsch von dem, was Sie beschrieben haben, aber die Dinge funktionieren nicht so, wie Sie es erwarten.

Ich glaube, Sie sollten Bearbeiten Ihre Post viel mehr Informationen zu geben, um einige sinnvolle Antworten zu erhalten. Insbesondere lassen Sie uns beginnen mit: -

  • Welche Plattform ist dieser Code für: Windows, Linux, etwas eingebettet oder ...?
  • Welche Compiler ist die C statische Bibliothek gebaut mit?
  • Was Compiler ist die C ++ dynamische Bibliothek gebaut mit?
  • Welche Compiler ist die C die die erfolgreich aufrufen Bibliothek gebaut mit?
  • Haben Sie eine Source-Level-Debugger? Wenn ja, kann Sie Schritt für in die C-Code aus der C ++.

Wenn Sie einen falsch sind über immer Verändern der Daten von Z zugespitzt, die einzigen wahrscheinliche Ursache des Problems ist eine Inkompatibilität zwischen der Parameterübergabe Konventionen. Das „long long“ Problem kann ein Hinweis darauf sein, dass die Dinge nicht, wie sie scheinen.

Als letzten Ausweg, können Sie die zerlegten C ++ Aufruf Code vergleichen (was Sie sagen nicht) und die C-Aufruf-Code (die Sie sagen erfolgreich) oder Schritt durch die CPU-Befehle mit dem Debugger (ja, wirklich - Sie‘ ll auch eine gute Fähigkeit zu erlernen, wie das Problem zu lösen)

Soweit ich weiß, lange, lange nicht Teil der Standard-C ++ ist, vielleicht ist das die Ursache des Problems.

Keine Ahnung. Versuchen Sie, Debug-Schritt in A und sehen, was passiert (Assembler-Code Alarm!)

Vielleicht können Sie die ursprüngliche Funktion in einer C-Bibliothek wickeln, die Sie aus C ++ aufrufen Bibliothek?

Auf der Basis Ihre Punkte 2 und 3, wie es scheint, dies funktionieren könnte.

Wenn es nicht der Fall ist, es gibt Ihnen eine weitere Debug-Punkt, um weitere Hinweise zu finden - sehen, welche Ihrer Bibliotheken das Scheitern erscheint zuerst in, und prüfen Sie, warum 2 und 3 arbeiten, aber dies nicht - was die minimal ist Unterschied?

Sie können auch versuchen, den Stapel zu untersuchen, das jeweils durch Ihren Funktionsaufruf eingerichtet ist, zu prüfen, ob der Unterschied hier ist, -. Unterschiedliche Aufrufkonventionen Berücksichtigung

1. Schritt: Vergleichen der Zeiger y und z von der Seite ++ mit dem von der C-Funktion empfing C bestanden

.

P. S. Ich will nicht offensichtlich klingen, aber nur die doppelte Kontrolle hier. Ich nehme an, wenn Sie sagen, dass z gerade fein modifiziert wird, wenn aus einer C binär genannt, meinen Sie, dass die Daten, bei denen z verändert zeigen sich nur in Ordnung. Die Zeiger y und z sich von Wert übergeben werden, so dass Sie nicht die Zeiger ändern.

Eine andere wilde Vermutung: Sind Sie sicher, dass Sie die Verknüpfung gegen die rechte Instanz der Funktion in der C-Bibliothek? Könnte es sein, dass es in Ihrer Bibliotheken mehrere solche Funktionen zur Verfügung stehen? In C ist der Linker über den Rückgabetyp oder die Parameterliste nicht kümmern, wenn die Entscheidung, wie eine Funktion zu lösen - nur der Name wichtig ist. Wenn Sie also mehr Funktionen mit dem gleichen Namen hat ...

Sie könnten programmatisch die Identität der Funktion überprüfen. Erstellen Sie eine C-Bibliothek, die Ihre Funktion A mit einigen Testparameter aufruft und das funktioniert gut und druckt den Zeiger A. Link zu der Bibliothek in C ++ App zu funktionieren. Dann drucken, wie Sie den Zeiger auf die ursprünglichen einer Funktion aus dem C ++ Code zu sehen und den Zeiger mit dem von Ihrer C-Bibliothek gesehen vergleichen, wenn im gleichen Prozess aufgerufen.

Wieder eine der nahe liegenden, aber wer weiß ... Sind Sie sicher, dass die C-Funktion ist staatenlos Sie aufrufen, hängt von seinen Eingängen nur seinen Ausgang Bedeutung? Ist die Funktion nicht staatenlos ist, dann könnte es sein, dass die „versteckten“ Zustand für das unterschiedliche Verhalten verantwortlich ist (nicht ändern sich die Daten von z hingewiesen) der Funktion, wenn sie von Ihrem C ++ App aufgerufen wird.

In Ihrem C ++ Programm, ist der Prototyp mit extern "C" erklärt?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top