c_str in Python???

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.
Antworten
kullerauge
User
Beiträge: 4
Registriert: Dienstag 31. Januar 2012, 17:26

Hallo zusammen,

Ich bin relativ neu in Python (generell sind meine programmierkenntnisse nicht sehr ausgeprägt :() und soll zum Einstieg ein Programm welches in C++ geschrieben wurde in Python übersetzten. Derzeit hänge ich daran eine geignete Übersetztung für c_str zu finden.
ich habe ein liste List und wende darauf die Methode iter an. daraufhin sollte ich einen listiterator erhalten haben wenn ich das richtig verstehe:
listiterator=iter(List)
im c++ code wir dann folgendes definiert:
const char *name= (*listiterator).c_str()
ich habe mir zwar die documentation zu c_str angeschaut, verstehe aber nur Bahnhof :K
Daher weiß ich auch nicht wie ich das dann in Python programmieren könnte. Denn wenn ich c_str benutze bekomm ich eine fehlermeldung:
AttributeError: 'listiterator' object has no attribute 'c_str'

Wär echt super wenn mir jemand helfen kann:)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Arbeite am besten das Tutorial durch, alles andere hat keinen Sinn. Code durch Raten zum Laufen zu bekommen ist nicht besonders effizient ;-) Auch würde ich am Anfang nicht versuchen anderen Code in Python zu übersetzen, das fördert sicher nicht die Motivation. Probiere besser eigenständig mit Python Probleme zu lösen und ein Programm zu entwickeln welches dich interessiert.

Sebastian
Das Leben ist wie ein Tennisball.
kullerauge
User
Beiträge: 4
Registriert: Dienstag 31. Januar 2012, 17:26

EyDu hat geschrieben:Hallo und willkommen im Forum!
Auch würde ich am Anfang nicht versuchen anderen Code in Python zu übersetzen, das fördert sicher nicht die Motivation. Probiere besser eigenständig mit Python Probleme zu lösen und ein Programm zu entwickeln welches dich interessiert.
Leider hab ich mir die Aufgabe nicht selbst gestellt, sondern die ist teil meiner Bachelorarbeit :( ... Ich bin auch schon einige Tuturials durchgegangen sodass ich den ganzen code "übersetzten" konnte (also nur mit der python syntax geschrieben). Jetzt bin ich eben dabei die ganze Fehler weg zu machen, und das mit dem c_str ist einer davon.
problembär

kullerauge hat geschrieben:im c++ code wir dann folgendes definiert:
const char *name= (*listiterator).c_str()
ich habe mir zwar die documentation zu c_str angeschaut, verstehe aber nur Bahnhof :K
http://www.cplusplus.com/reference/string/string/c_str/
sagt
Generates a null-terminated sequence of characters (c-string) with the same content as the string object and returns it as a pointer to an array of characters.

A terminating null character is automatically appended.
C kennt nicht wirklich den Datentyp "String". Stattdessen muß man sich in C einige Bytes hintereinander vorstellen, die irgendwo im Speicher abgelegt sind. Solche Bytes spricht man üblicherweise über ein Array an (oder aber über einen Zeiger, der auf die betreffende Speicherstelle gesetzt ist). Jetzt muß das Programm noch wissen, daß die dort gespeicherten Zahlen als Zeichen zu interpretieren sind (Datentyp 'char'). Und wo die Zeichenkette zuende sein soll. Das wird durch eine Bytestelle mit einer 0 angezeigt. Das alles ist ziemlich umständlich. Deshalb gibt es in C++ Konstruktionen, die das vereinfachen sollen. Manchmal braucht man dort aber doch einen C-String. Dafür die Methode ".c_str()".

In Python brauchst Du das alles nicht. Du kannst da einfach so über eine Liste iterieren:

Code: Alles auswählen

a = ["Apfel", "Birne", "Pfirsich"]
for i in a:
    print i
oder auch über einen einzelnen String:

Code: Alles auswählen

a = "Apfel"
for i in a:
    print i
Solltest Du in Python ganz ausnahmsweise doch mal einen echten C-String benötigen (z.B. weil Du ihn einer C-Bibliothek übergeben willst, die mit den Python-Datentypen nichts anfangen kann), dann schau Dir das Modul "ctypes" an.

HTH
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Alos hier suchen sich alle das Thema ihrer Bachelorarbeit selber aus, es wird eigentlich keinem ein Thema aufgezwungen... Aber egal, deine Herangehensweise ist nicht sonderlich effizient. Nur weil das Programm nun zufällig keine Fehler wir heißt es noch lange nicht, dass es auch das gewünschte tut. Versuche erst das C++-Programm vollständig zu verstehen und schreibe es erst danach vollständig (ohne Kopieren und Abschreiben des vorhandenen Codes) in Python um. Mit allen anderen Ansätzen wirst du wahrscheinlich mehr Zeit verlieren. Was für ein Programm sollst du denn überhaupt übersetzen? Vielleicht gibt es da ja schon etwas fertiges in Python.

Sebastian
Das Leben ist wie ein Tennisball.
problembär

EyDu hat geschrieben:Versuche erst das C++-Programm vollständig zu verstehen
Schön und gut, dafür muß er aber auch die C++-Zeile "wasauchimmer.c_str();" verstehen, was er bisher nach eigenen Angaben nicht konnte.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wobei man sich dann wieder fragen kann, wieso man in C++ noch auf C-Strings zurückgreifen muss. (Ok, gibt sicher Anwendungsfälle; Kommunikation mit C-Libs z.B. - bleibt die Frage, ob das hier sinnvoll ist).
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
kullerauge
User
Beiträge: 4
Registriert: Dienstag 31. Januar 2012, 17:26

Vielen Dank für die verständliche Erklärung, prolembär.
Es ist auch nicht so das ich nur durch auprobieren versuche meinen code zum laufen zu bringen (an manchen stellen wo ich gar nicht mehr weiter weiß dann schon), ich dachte mir nur wenn ich das ganze zumindest in der syntax von python hab kann ich daran dann einfacher rumbasteln...naja so einfach wars dann doch nicht.
Im großen und ganze soll das programm xml dateien einlesen, die wege darstellen und dann diese in einem fenster zeichnen und auch den median einzeichnen.
Vielen Dank nochmal :)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ich hoffe du portierst da nicht den XML Part, sondern benutzt Python-Lösungen, beispielsweise die ElementTree API (xml.etree in der Stdlib).
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Als Einstieg halte ich das übrigens für ziemlich anspruchsvoll; der XML-Teil und die Berechnung mögen vielleicht noch gehen. Das ganze dann aber noch in eine GUI einzubetten... das klingt schon ziemlich heftig.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
kullerauge
User
Beiträge: 4
Registriert: Dienstag 31. Januar 2012, 17:26

ja den xml teil hab ich auch mit dem element-tree implementiert...ob der so funktioniert weiß ich noch nicht da das programm gerade kurz davor hängt. Und das mit der GUI hab ich schon einigermaßen hinbekommen...zumindest den anfang wo es darum geht die einzelenen fenster aufzurufen bzw. zu erstellen. da hat mir unter anderem der Qt-designer weitergeholfen. bei dem zeichnen an sich bin ich noch nicht angekommen. Aber wie gesagt ich konnts mir nicht aussuchen. Hätte zu nem anderen prof gehen können aber der Theorie teil dazu ist sehr interessant wesewegen ich mich dann auch dafür entschieden hab. Wobei ich gestehen muss, dass ich nicht gedacht hätte, dass das programmieren so schwer wird. Naja, muss ich jetzt durch...
lunar

@Hyperion: Es gibt auch in der C++-Standardbibliothek Klassen, die nur einen C-String entgegen nehmen. Die "fstream"-Klasse zum Lesen und Schreiben von Dateien beispielsweise benötigten einen "C-String" als Dateinamen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

lunar hat geschrieben:@Hyperion: Es gibt auch in der C++-Standardbibliothek Klassen, die nur einen C-String entgegen nehmen. Die "fstream"-Klasse zum Lesen und Schreiben von Dateien beispielsweise benötigten einen "C-String" als Dateinamen.
Ok, hab ich mir ja fast gedacht - so viel zur Konsistenz ;-) Aber zu diesem Thema hatte wir ja erst unlängst einen Thread :-D
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten