einbinden vom c und c++

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Montag 7. April 2008, 20:28

Wahrscheinlich hast du vorher einfach nur ein "import ctypes" vergessen.
ne0h
User
Beiträge: 115
Registriert: Samstag 16. Februar 2008, 11:35

Montag 7. April 2008, 20:29

Du musst die Module auch erstmal importieren, damit sie bekannt sind.

Also zuerst:

Code: Alles auswählen

import math
und dann

Code: Alles auswählen

dir(irgendwas)


ne0h
ne0h
User
Beiträge: 115
Registriert: Samstag 16. Februar 2008, 11:35

Montag 7. April 2008, 20:30

Warum bin ich immer zu langsam... :?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 7. April 2008, 20:34

sechsrad hat geschrieben:bei dir(ctypes) kommt "NameError: name 'ctypes' is not defined"
Man muss ``ctypes`` vorher importieren, bevor man es mit ``dir`` analysieren kann.

EDIT:
ne0h hat geschrieben:Warum bin ich immer zu langsam... :?
Und du glaubst, du bist langsam? ;-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Montag 7. April 2008, 21:22

Masaru hat geschrieben:So wie du das da versuchst sechsrad, funktioniert es bei mir auch nicht ...
Eine andere, meines Erachtens einfachere Variante, da die C-Funktionen nicht umständlich angepasst werden müssen, wäre mit restype:

Code: Alles auswählen

import ctypes

f = ctypes.cdll.LoadLibrary('test.dll')
f.mult.restype = ctypes.c_float
print f.mult(ctypes.c_float(34.3))
print 3.7 * 34.3
Hierbei kann dann sechsrads Original-DLL

Code: Alles auswählen

#include <math.h>

float mult(float n) {
float a;
a = n * 3.7;
return a;
}
verwendet werden.
MfG
HWK
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

Montag 7. April 2008, 22:22

da kommt dieses als ergebnis : -1.#IND

mfg
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

Montag 7. April 2008, 22:27

die variante von masaru funktioniert jetzt :

Code: Alles auswählen

#!/usr/bin/env python

from ctypes import *
f =cdll.LoadLibrary("test.dll")

ff=pointer(c_float())
tt=pointer(c_char_p())

b=c_float(10.0)
f.mult(b,ff)
print ff.contents.value

b=c_float(10.8)
f.div(b,ff)
print ff.contents.value

f.text(tt)
print tt.contents.value
und die dll:

Code: Alles auswählen

#include <math.h>

void mult(float n, float* r) {
*r=n*3.7;
} 

void div(float n, float* r) {
*r=n/2.0;
}

void text(int* r) {
char text[] = "hurra, es geht !\n";
*r=text;
}

ergebnis ist dieses hier :
D:/Python25/pythonw.exe -u "D:/Python25/test-py/dll/dll1.py"
37.0
5.40000009537
hurra, es geht !
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Montag 7. April 2008, 22:51

sechsrad hat geschrieben:

Code: Alles auswählen

void text(int* r) {
char text[] = "hurra, es geht !\n";
*r=text;
}
Aua. Ich hoffe mal, dass nur dein Testcode so aussieht.
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

Montag 7. April 2008, 23:12

aua, es ging nur darum, wie man text aus einer dll übertragen kann, aua.

das andere ergibt dann die feinarbeit. die funktion steht jetzt erstmal im vordergrund.

wie man dieses char jetzt ausfüllt, da gibt es ja verschiedene möglichkeiten in c.

eine textfunktion aus einer dll hatte ich hier im ganzen forum noch nicht gefunden.

es funktioniert erst einmal, das ist wichtig.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Montag 7. April 2008, 23:25

sechsrad hat geschrieben: eine textfunktion aus einer dll hatte ich hier im ganzen forum noch nicht gefunden.
Warum auch....das hier ist kein C-Forum.

du hast übrigens noch immer nicht diese unglaublich komplexen Rechnungen gezeigt, die in Python zu langsam sind.
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Montag 7. April 2008, 23:29

sechsrad hat geschrieben:es funktioniert erst einmal, das ist wichtig.
Nur damit das klargestellt ist: es ist reiner Zufall, dass die text-Funktion funktioniert.
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

Dienstag 8. April 2008, 13:46

nochmals danke für die hilfe mit einer dll in python einbinden.

mein ziel ist erreicht, klappt wunderbar mit allen was ich mir vorgestellt habe.

danke.

mfg

Nur damit das klargestellt ist: es ist reiner Zufall, dass die text-Funktion funktioniert.
ich meine, eine zeigerübergabe ist kein zufall, ich glaube(gehe auch in die kirche) das ist die einfachste lösung.
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dienstag 8. April 2008, 14:36

sechsrad hat geschrieben:ich meine, eine zeigerübergabe ist kein zufall, ich glaube(gehe auch in die kirche) das ist die einfachste lösung.
Das stimmt, das Übergebens eines Zeigers ist kein Zufall. Jedoch befindet sich der String auf dem Stack und damit ist nach Abarbeitung der Funktion auch der Inhalt auf den der Zeiger zeigt undefiniert.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Dienstag 8. April 2008, 19:45

sechsrad hat geschrieben:da kommt dieses als ergebnis : -1.#IND

mfg
Ich weiß ja nicht, was Du da gemacht hast, bei mir kommt jedenfalls folgendes heraus:

Code: Alles auswählen

C:\Programme\Python24\Scripts\Test>type test.py
#!/usr/bin/env python

import ctypes

f = ctypes.cdll.LoadLibrary('test.dll')
f.mult.restype = ctypes.c_float
print f.mult(ctypes.c_float(34.3))
print 3.7 * 34.3

C:\Programme\Python24\Scripts\Test>test.py
126.909996033
126.91
MfG
HWK
BlackJack

Mittwoch 9. April 2008, 11:20

@EyDu: Die Zeichenkette sollte sich nicht auf dem Stack befinden. Das würde ja bedeuten, dass die Zeichenkette bei jedem Aufruf von woanders dort hin kopiert werden müsste, und da literale Zeichenketten "read only" sind, wäre das ziemlich unsinnig.

Aber die Funktion ist trotzdem total falsch. Erstens ist das Rückgabeargument vom Typ ``int*`` und dann wird nicht die Zeichenkette zurückgegeben, sondern die Adresse als Zahl. Wenn man den Rückgabeargumenttyp auf ``char*`` korrigieren würde, ist es immer noch nicht richtig, da dann versucht würde einen Zeiger in ein Zeichen zu konvertieren.
Antworten