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.
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

Ich habe jetzt eine Idee, was du meinen könntest: Ultraschall?
na siehste, geht doch. das kommt davon wenn man mit nichtfachleuten redet.
man verwendet immmer die kurzaussprache so wie einer steno schreibt.

kann dir mal ein kleines atmegaboard schenken mit einem atmega8 drauf, kann auf einem steckbrett montiert werden und mit 5v gleichspannung betrieben werden. das isp-kabel zum programmieren musst du dir dann selber bauen.

mfg
BlackJack

Dann rede doch bitte nicht in "Steno" wenn Du verstanden werden möchtest. Insbesondere wenn die Stimmung eh schon belastet ist, sollte man versuchen weitere, unnötige Missverständnisse zu vermeiden.

Und ob das nun die Fachsprache ist, bezweifle ich ein wenig, da Du anscheinend gerne mal bei den Begriffen etwas lax bist, bzw. daneben greifst. Ich bin mir zum Beispiel ziemlich sicher, dass Du bei "visueller Roboter" eigentlich "virtueller Roboter" meinst. Und wahrscheinlich ist der "visual-ultrasensor" eigentlich ein "virtueller Ultraschall-Sensor".
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

python printet mir die variable "a" nur als ganze zahl, aber immer abgerundet. die abgerundeten werte sind aber immer korrekt. es gibt keine fehlermeldung.

ich habe unten aus der hilfe nicht rauslesen können, wie ich die nachkommastellen printen kann.

kann mir einer helfen?

http://starship.python.net/crew/theller ... orial.html
hier habe ich ein teil der lösung gefunden.

das python-programm:

Code: Alles auswählen

#!/usr/bin/env python

from ctypes import *

f =cdll.LoadLibrary("test.dll")

b=c_float(34.3)

a=(f.mult(b))
print a
das c-programm für die dll:

Code: Alles auswählen

#include <math.h>

float mult(float n) {
float a;
a=n*3.7;
return  a;
} 

float div(float n) {
float a;
a=n/2.3;
return a;
}
Zuletzt geändert von sechsrad am Montag 7. April 2008, 15:14, insgesamt 1-mal geändert.
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

"visueller Roboter"
ich meine erstmal nur das bild was man sieht zum unterschied zur hardware, welches man visuell wahrnimmt auf dem bildschirm.

das er nachher auch die virtualität eines echten hardwareroboter nachahmt ist die zweite sache.

ich möchte damit aufzeigen, das man auch ein bild mit dem atmegaboard steuern kann ohne sich die teure roboterhardware zu kaufen wenn man eine computeranlage hat. man kann auch sagen eine gesteuerte simulation von aussen über die serielle schnittstelle.

mehr will ich nicht bewirken mit der ersten frage "c-routinen" in python nutzen über eine dll.

ich wusste nicht, wenn man mehr besitzt als die anderen, das man dann gleich über den tisch gezogen wird und man dann nur nach fehlern sucht, statt sich mal der frage zu widmen.


mfg
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

sechsrad hat geschrieben:

Code: Alles auswählen

int mult(float n) {
[...]
int div(float n) {
Hallo sechsrad!

``int`` steht für Integer. Deine C-Funktionen geben keine Fließkommazahl zurück.

mfg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

hallo, hatte ich schon geändert .
der fehler kam weil ich schon wieder dauernd zwischen float, double , c_float und c_double gewechselt hatte. dann wieder die dll und zurück usw.

geht aber immer nocht nicht.

es ist eben keine kaffeetrinkerlösung, wo gehobelt wird fallen fehler.

mfg
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

omg..
Hast du mal nen type() auf deine Variable durchgeführt und geprüft ob wirklich ein float-Objekt in den Fingern hast?
Das deine Werte immer "abgerundet" ist schon sehr verdächtig.
sechsrad hat geschrieben:es ist eben keine kaffeetrinkerlösung, wo gehobelt wird fallen fehler.
Bei allem Verständnis für Fehler, bevor man Leute in einem Forum mit Fragen löchert sollte man mal einen Blick auf sein Code-Snippet werfen in dem ganz klar ein integer zurück geben wird. Vielleicht hat sich ja noch irgendwo ein solcher Flüchtigkeitsfehler eingeschlichen.

Ich bin zwar hier kein Admin, würde dich aber trotzdem bitten deine komischen Andeutungen zu lassen...
sechsrad hat geschrieben:ich wusste nicht, wenn man mehr besitzt als die anderen, das man dann gleich über den tisch gezogen wird und man dann nur nach fehlern sucht, statt sich mal der frage zu widmen.
Neidisch ist hier bestimmt keiner auf dich, das garantier ich dir!
Lass deine komischen Nebenbemerkungen und jeder hier ist gern bereit zu helfen.
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

jetzt kommt eine 10-stellige zahl, die überhaupt keinen wert ergibt.
kann das irgendwie eine adresse sein.

wenn ja, wie kann ich drauf zugreifen.

vorher , wo noch das "int" davor stand, waren die werte wenigstens immer abgerundet genau, also ein wert wie man ihn als int erwartet.

jetzt hat sich der rückgabewert total geändert.

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

Das deine Werte immer "abgerundet" ist schon sehr verdächtig.
kam durch den int-fehler.

jetzt nach richtigstellung sieht die sache total anders aus.

mehr code als dort oben habe ich zum testen nicht verwendet.

nur mit den c_float usw, aber parallel zur dll gearbeitet.
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

Neidisch ist hier bestimmt keiner auf dich, das garantier ich dir!
na, der audax hat hier aber getobt wie ein...


mfg
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

So wie du das da versuchst sechsrad, funktioniert es bei mir auch nicht ... aber wenn man einen Zeiger (c_float) als 2. Paramter übergibt, dann funktioniert es wie folgt:

cmath.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.3;
}
Und dann einmal den Python-Teil im Interpreter durchgespielt:

Code: Alles auswählen

>>> from ctypes import *
>>> cmath = cdll.LoadLibrary("cmath.dll")
>>> b = c_float(34.3)
>>> r = ct.pointer(c_float())
>>> 
>>> cmath.mult(b,r)
14484904 #<-- das hier, ist eine ähnliche Zahl wie bei dir, vermute das es die Speicheradresse (aber nicht der tatsächliche Wert eben) ist
>>> r.contents
c_float(126.90999603271484)
>>> print r.contents.value
126.909996033
>>> # oder hier mal gerundet auf 2 Nachkommastellen ...
>>> print round(r.contents.value,2)
126.91
Voilla,
>>Masaru<<
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

es funktioniert jetzt ohne ct.

das kommt raus:
126.909996033

danke.
from ctypes import *

f =cdll.LoadLibrary("test.dll")

b=c_float(34.3)
r=pointer(c_float())

f.mult(b,r)

print r.contents.value
Zuletzt geändert von sechsrad am Montag 7. April 2008, 17:09, insgesamt 2-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mitdenken. Für was könnte "ct" wohl eine Abkürzung sein... ?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

lunar hat geschrieben:Ich bestreite ja nicht, dass Reverse Engineering möglich ist, aber ich bestreite, dass es einfach ist und "recht gut" funktioniert ;) In solche Keygeneratoren und Cracks steckt nämlich verdammt viel Arbeit, und oft braucht es ein paar Monate intensiver Arbeit, bis solche Algorithmen gebrochen sind.
Lies mal den Artikel "Mifare-Funkchip geknackt" in c't 8/2008 (das ist die aktuelle) auf S. 80 durch (kann ich übrigens auch allen anderen empfehlen). Der ist super gemacht und zeigt wie sie Hardware-Reverse-Engineering gemacht haben. Natürlich, das war sicherlich mehr Aufwand als wie das im Artikel klingt, aber trotzdem - mit genügend Motivation (und die kann durchaus gegeben sein, wenn man sieht, wo die Mifare Classic überall eigesetzt wird) ist so etwas durchaus zu schaffen. Klar dass das schon einiges an Vorwissen benötigt, aber das ist nun mal mit allem so :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

Mitdenken. Für was könnte "ct" wohl eine Abkürzung sein... ?
aha, bei "from ctypes import *" wird dieses "ctypes" automatisch angenommen und es kommt dann die fehlermeldung wenn ich es davor setze und bei "import ctypes" muss ich es jedesmal davorschreiben.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

sechsrad hat geschrieben:aha, bei "from ctypes import *" wird dieses "ctypes" automatisch angenommen und es kommt dann die fehlermeldung wenn ich es davor setze und bei "import ctypes" muss ich es jedesmal davorschreiben.
Ja, daher sollte man es eben nicht machen. Um die Übersicht zu bewahren.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
ne0h
User
Beiträge: 115
Registriert: Samstag 16. Februar 2008, 11:35

Lies mal den Artikel "Mifare-Funkchip geknackt" in c't 8/2008 (das ist die aktuelle) auf S. 80 durch (kann ich übrigens auch allen anderen empfehlen). Der ist super gemacht und zeigt wie sie Hardware-Reverse-Engineering gemacht haben. Natürlich, das war sicherlich mehr Aufwand als wie das im Artikel klingt, aber trotzdem - mit genügend Motivation (und die kann durchaus gegeben sein, wenn man sieht, wo die Mifare Classic überall eigesetzt wird) ist so etwas durchaus zu schaffen. Klar dass das schon einiges an Vorwissen benötigt, aber das ist nun mal mit allem so
Den Artikel habe ich auch zuletzt gelesen, wirklich schön, wie die Jungs dort das Ganze auseinandergenommen haben.


@sechsrad

Sorry, aber Deine ganzen Begriffe sind einfach nur zusammengewürfelt, ich habe auch danach gegoogelt und nichts sinnvolles dazu gefunden.

Des weiteren würde mich mal interessieren, wie Du die Leistung deines Pythoncodes analysiert hast und wie Du feststellst, dass Dein Pythoncode langsamer ist als Deine C-Implementierung ?

Wo genau macht Python denn bei Deinem Projekt schlapp? Hast Du NumPy und andere Möglichkeiten eingesetzt, die auch schon hier gepostet wurden?

Hast Du schon versucht, Deinen Pythoncode zu optimieren?


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

Ja, daher sollte man es eben nicht machen. Um die Übersicht zu bewahren.
also mit "import ctypes"

mfg
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

sechsrad hat geschrieben:
Ja, daher sollte man es eben nicht machen. Um die Übersicht zu bewahren.
also mit "import ctypes"
Richtig. Du kannst dem zwar einen Alias geben, aber mir fällt kein brauchenares Kürzel ein. Alternativ kannst du auch die Namen die du benötigst einzeln importieren, das ist im Fall von ctypes wohl auch ein brauchbarer Ansatz. Also mit ``from ctypes import pointer, cdll`` usw.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lunar

Leonidas hat geschrieben:
lunar hat geschrieben:Ich bestreite ja nicht, dass Reverse Engineering möglich ist, aber ich bestreite, dass es einfach ist und "recht gut" funktioniert ;) In solche Keygeneratoren und Cracks steckt nämlich verdammt viel Arbeit, und oft braucht es ein paar Monate intensiver Arbeit, bis solche Algorithmen gebrochen sind.
Lies mal den Artikel "Mifare-Funkchip geknackt" in c't 8/2008 (das ist die aktuelle) auf S. 80 durch (kann ich übrigens auch allen anderen empfehlen). Der ist super gemacht und zeigt wie sie Hardware-Reverse-Engineering gemacht haben. Natürlich, das war sicherlich mehr Aufwand als wie das im Artikel klingt, aber trotzdem - mit genügend Motivation (und die kann durchaus gegeben sein, wenn man sieht, wo die Mifare Classic überall eigesetzt wird) ist so etwas durchaus zu schaffen. Klar dass das schon einiges an Vorwissen benötigt, aber das ist nun mal mit allem so :)
Was anderes habe ich ja auch gar nicht gesagt ;) Allerdings sind Vorwissen und Motivation für viele ausreichend große Hürden, vor allem, wenn das benötigte Vorwissen sehr umfangreich ist, und die Motivation lang anhalten muss ;) Beides ist beim Reverse Engineering eher Regel denn Ausnahme... insofern kann man schon davon sprechen, dass Reverse Engineering von Binärkompilaten wesentlich aufwendiger ist als das von Byte-Code. Nichts anderes wollte ich sagen ;)

Also lassen wir das jetzt, dass ist eh OT ;)
Antworten