Heim >Backend-Entwicklung >Python-Tutorial >Warum gibt meine C-Funktion einen falschen Wert zurück, wenn sie von Python aus mit ctypes aufgerufen wird?

Warum gibt meine C-Funktion einen falschen Wert zurück, wenn sie von Python aus mit ctypes aufgerufen wird?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-24 20:50:14595Durchsuche

Why Does My C Function Return an Incorrect Value When Called from Python Using ctypes?

C-Funktion gibt einen falschen Wert zurück, wenn sie von Python über Ctypes aufgerufen wird

Bei dem Versuch, eine C-Funktion von Python aus unter Verwendung von Ctypes aufzurufen, kam es zu einer Nichtübereinstimmung im erwarteten Ergebnis entstand. Die betreffende Funktion erhöhte eine gegebene Zahl auf eine bestimmte Potenz und gab das Ergebnis wie erwartet zurück, wenn sie direkt in C aufgerufen wurde. Beim Aufruf aus Python wurde jedoch ein anderer, falscher Wert erhalten.

Die freigegebene Datei Das Gehäuse der C-Funktion wurde mit dem folgenden Befehl erstellt:

$ gcc -fPIC -shared -o test.so test.c

Nach einigen Permutationen der Konfiguration der C-Funktion wurde in einigen Fällen tatsächlich der erwartete Wert zurückgegeben, was darauf hindeutet, dass das Problem nicht aufgetreten ist aufgrund eines inhärenten Fehlers im C-Code. Insbesondere als die Funktion vereinfacht wurde, um ein einfaches Quadrat zu berechnen (d. h. x*x zurückzugeben, anstatt eine for-Schleife zu verwenden), gab Python das richtige Ergebnis zurück.

Das ultimative Ziel bestand darin, auf ein zweidimensionales C zuzugreifen Array aus Python heraus.

#include <stdio.h>

float power(float x, int exponent)
{
    float val = x;
    for(int i=1; i<exponent; i++){
        val = val*x;
    }
    return val;
}
from ctypes import *

so_file = '/Users/.../test.so'
functions = CDLL(so_file)

functions.power.argtype = [c_float, c_int]
functions.power.restype = c_float

print(functions.power(5,3))

Beim Aufruf der Funktion aus C wurde die erwartete Ausgabe von 125,0 beobachtet. Allerdings lieferte Python stattdessen einen Wert von 0,0.

Bei weiterer Untersuchung wurde die Diskrepanz auf einen Fehler bei der Angabe der Argumenttypen der C-Funktion in Python zurückgeführt. Anstelle von argtype wurde versehentlich die falsche Schreibweise von argtypes verwendet.

functions.power.argtypes = [c_float, c_int]

Nachdem dieser Tippfehler korrigiert wurde, wurde beim Aufruf der Funktion aus Python erfolgreich der richtige Wert (125,0) zurückgegeben.

Das obige ist der detaillierte Inhalt vonWarum gibt meine C-Funktion einen falschen Wert zurück, wenn sie von Python aus mit ctypes aufgerufen wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn