ctypes seltsamer Umgang mit variadischen Argumenten in Funktionen

GaTTaCa

Ich starte dieses Snippet:

>>> from ctypes import *
>>> libc = CDLL("libc.so.6")
>>> libc.printf("%f %f\n", c_float(1.0), c_double(1.0))
0.000000 1.000000

printferwartet ein doublefür %fABER ich dachte, Floats wurden in variadischen Funktionen zu Doubles befördert, wie der folgende C-Code zeigt:

#include<stdio.h>
int main()
{
   float a = 1.0f;
   double b = 1.0;
   printf("%f %f\n", a, b);
}

produziert das erwartete 1.000000 1.000000.

Vermisse ich etwas Führt der Compiler ein implizites Casting im C-Code durch?

Ich benutze eine 64-Bit-Maschine.

JBGreen

Der Anrufer ist für die Typwerbung von floatbis verantwortlich double. Aber ctypesweiß nichts über die Unterschrift von, es printfsei denn, Sie sagen es. Es weiß nicht, dass es variadisch ist und dass eine Typförderung erforderlich ist.

Wenn Sie ctypesdurch Setzen von argtypesund nicht erkennen, wie die Signatur einer Funktion lautet restype, wird ein intRückgabetyp angenommen, und der von Ihnen übergebene Parameter stimmt mit den Signaturen überein. In Ihrem Fall wird also nur die Signatur von angenommen printf:

int printf(char*, double, float)

Soweit ich weiß, gibt es keine Möglichkeit, eine Variable argtypesin zu definieren ctypes, aber es scheint sowieso kein Casting zu geben, selbst wenn festgelegt argtypesist:

>>> from ctypes import *
>>> libc = CDLL("libc.so.6")
>>> libc.printf.argtypes = [c_char_p, c_double, c_double]
>>> libc.printf(c_char_p(b"%f %f\n"), c_double(1.0), c_float(1.0))
Traceback (most recent call last):
  File "printf.py", line 5, in <module>
    libc.printf(c_char_p(b"%f %f\n"), c_double(1.0), c_float(1.0))
ctypes.ArgumentError: argument 3: <class 'TypeError'>: wrong type

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Schwierigkeiten mit variadischen Funktionen

Vorlagenparameter - Funktionszeiger mit variadischen Argumenten

FFI im Chez-Schema für C-Funktionen mit variadischen Argumenten (varargs)

Überladene Funktionen mit variadischen Vorlagenargumenten

C ++: Hacky-Parametermuster mit variadischen Argumenten

ES6-Klasse super () mit variadischen Argumenten

Node.js Commander mit optionalen + variadischen Argumenten

Exportieren mehrerer Funktionen mit Argumenten

Funktionen mit flexiblen Argumenten in Python

Funktionen mit mehreren Argumenten erstellen

Umgang mit benannten Argumenten in der bash

Umgang mit nicht verwendeten getopts-Argumenten

Ctypes-Rückruffunktion mit Argumenten

numpy und ctypes: Umgang mit Ansichten

Problem mit verschachtelter #define zum Definieren einer Funktion mit variadischen Argumenten

DRY mit fast ähnlichen Funktionen und Argumenten

Übergeben von Argumenten an Funktionen in Python mit argv

Javascript-Standardparameter in Funktionen mit mehreren Argumenten

Python-Multiprocessing, Funktionen mit Argumenten

Mehrere Callback-Funktionen mit mehreren Argumenten

Funktionen mit variabler Anzahl von Argumenten c

Funktionen mit unterschiedlichen Namen, aber gleichen Argumenten

Übergeben mehrerer Funktionen mit Argumenten an eine Hauptfunktion

Umgang mit Funktionen Rückgabewert in Python

Flask: richtiger Umgang mit Routen und Funktionen

Umgang mit N-dimensionalen Schichten in Funktionen

Umgang mit lang laufenden, blockierenden Funktionen

Umgang mit asynchronen Funktionen in Node.js.

Umgang mit Folge abhängiger Funktionen

TOP Liste

  1. 1

    Modbus Python Schneider PM5300

  2. 2

    Glassfish v3.0.1 im Vergleich zu Oracle GlassFish Server 3.0.1 - Gibt es einen technischen Grund, die kommerzielle Version zu verwenden?

  3. 3

    Wie schließe ich mehrere Ordner mit der Variablen EXTRA_ARGS aus?

  4. 4

    Wie kann eine gleichmäßige Lastverteilung in ElasticSearch mit Indizes mit unterschiedlicher Anzahl von Shards erreicht werden?

  5. 5

    Wie kann man eine Multi-Container-Anwendung in Steuerkarten erstellen?

  6. 6

    ElasticSearch - Knotensperren konnten nicht abgerufen werden

  7. 7

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  8. 8

    Elasticsearch startet nicht nach dem Laden in viele Daten

  9. 9

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

  10. 10

    Wie Verwenden von Httpclient mit jedem SSL-Zertifikat, egal wie „schlecht“ es ist

  11. 11

    Wie vergleicht man scala.xml-Knoten richtig?

  12. 12

    ElasticSeach Auto Complete mit dem Vervollständigungsvorschlag, um das vollständige Dokument zurückzugeben

  13. 13

    Wie füge ich eine Spalte in einer Zeile in der Ansible Jinja2-Vorlage mit der for-Schleife hinzu?

  14. 14

    HTTPS-Verbindung mit Moneris-Servern in Curl

  15. 15

    Unity Build-Fehler: Der Name 'EditorUtility' ist im aktuellen Kontext nicht vorhanden

  16. 16

    Bester Crawler, um festzustellen, ob er mit Technologien gebaut wurde?

  17. 17

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  18. 18

    Wie kann ich den Kaskadenmodus global einstellen?

  19. 19

    Eclipse Oxygen - Projekte verschwinden

  20. 20

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  21. 21

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

heißlabel

Archiv