@funkheld: Musst Du dafür extra einen neuen Thread aufmachen!?
Die Frage macht nicht so viel Sinn weil es Python keine Pointer als Datentyp gibt. Und mit einem Pointer auf die C-Datenstruktur, die das Python-Objekt `s` repräsentiert, kann man in Python auch eher wenig anfangen. Was willst Du also eigentlich machen? Wozu brauchst Du den Pointer?
funkheld hat geschrieben:Wie bekomme ich den pointer für "s"?
Der unten von mir stimmt ja nicht.
Was willst du machen, was geht nicht? Mach dir bitte beim nächsten Mal die Mühe wenigstens eine minimale Problembeschreibung zu posten.
Mit `create_string_buffer` bekommst du schon einen Pointer den du an andere C-Funktionen mit ctypes übergeben kannst, da brauchst du nicht noch zusätzlich `pointer`.
In s werden doch jetzt 256 byte eingelesen.
Mit "print ords(s[0])" kann ich doch einen Wert ausgeben.
Die Adresse von "s" bzw "s[0]" möchte ich an eine dll übergeben.
Möchte dann zb die Bilddaten in der dll Auswerten/Ändern und dann in Python wieder zb als s[0] zb verfügbar haben.
@funkheld: Zeichenketten sind in Python unveränderbar. Das Ändern kannst Du also vergessen. Was genau ist denn das Problem bei dem Datentyp, den Du von `create_string_buffer()` zurückbekommst? Den kannst Du doch als Pointer an externe Funktionen übergeben und den Inhalt auch verändern.
Ich möchte die eingelesenen Daten(bytes) durch eine dll behandeln und dann soll Python wieder damit glücklich werden.
Wenn es bei Strings nicht geht, dann mach bitte mal ein Vorschlg, wo ich die Daten vom File einlesen kann, damit ich dann diese über Pointer greifbar habe und Python damit auch wieder arbeiten kann.
Hab jetzt die Zeichenkette mit meiner dll geändert, die ersten 5 Zellen werden manipuliert "dl.ladewert(pp,4)" und Python kann mit diesen manipulierten String weiterarbeiten.
jerch, du hast mich erst mit deinem Vorschlag draufgebracht... danke.
from ctypes import *
import os
dl = cdll.LoadLibrary("pydll.dll")
laenge=os.path.getsize("cpc.bin")
f=open("cpc.bin", "rb")
s = f.read(laenge)
f.close()
pp = create_string_buffer(s, laenge)
for n in range(0, 10): ::::: die ersten Werte mit Print
print ord(pp.raw[n])
dl.ladewert(pp,4) ::::: Zelle0 bis Zelle4 werden manipuliert durch die dll
print
for n in range(0, 10): ::::: die veränderten Werte von Zelle0 bis Zelle4 mit der dll werden
print ord(pp.raw[n]) jetzt angezeigt und die restlichen alten Werte.
Ich habe die Zeichenkette geändert...
Obwohl es nicht gehen sollte...
Er hat es wahrscheinlich durch die Brust ins Auge gesagt, das kann ich nicht rauslesen. :K
Du brauchst ihn nicht in Schutz zu nehmen.
Und darii, na ja...., hätte er besser erklären können...
@funkheld: Du hast die Zeichenkette nicht verändert. Du hast das Objekt verändert, welches `create_string_buffer()` zurück liefert. Die Funktion erzeugt eine Kopie von den Bytes die den Wert von `s` ausmachen. Und wenn Du auf das `raw`-Attribut zugreifst, bekommst Du wiederrum eine Kopie der veränderten Daten als unveränderliche Zeichenkette.
Da solltest Du mal drüber nachdenken warum Du nicht per Index auf `pp` zugreifst, statt auf das `raw`-Attribut wo bei jedem Attributzugriff eine Zeichenkette erstellt wird, von der Du dann nur ein Zeichen abfragst.
Was ändert das an der Aussage, dass Zeichenketten in Python nicht veränderbar sind? Du hast BlackJacks Posting also entweder nicht gelesen oder nicht verstanden.
Dieses Beispiel ist doch nur Dein eigenes in verkürzter Form, weil Du f.read() nicht gesondert an einen Namen bindest. Insofern ist es quasi kein Unterschied... zumindest keiner, der einen anderen Programmablauf o.ä. zur Folge hätte.
BTW: Dateien öffnet man mit dem with-Statement und folgendem Idiom: