Seite 1 von 2
Pointer für Variable[]...
Verfasst: Samstag 6. November 2010, 14:18
von funkheld
Wie bekomme ich den pointer für "s"?
Der unten von mir stimmt ja nicht.
Danke.
Gruss
Code: Alles auswählen
f=open("cpc.bin", "rb")
s = f.read(laenge)
pp=pointer(create_string_buffer(s,laenge)) >>>> stimmt ja nicht hmm....
Re: Pointer für Variable[]...
Verfasst: Samstag 6. November 2010, 14:25
von BlackJack
@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?
Re: Pointer für Variable[]...
Verfasst: Samstag 6. November 2010, 14:26
von Hyperion
funkheld hat geschrieben:Wie bekomme ich den pointer für "s"?
Was verstehst Du unter einem "Pointer"? Den Ausdruck kenne ich von Sprachen wie "C"; in Python wüßte ich damit erst mal nichts anzufangen.
Re: Pointer für Variable[]...
Verfasst: Samstag 6. November 2010, 14:49
von Darii
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`.
Re: Pointer für Variable[]...
Verfasst: Samstag 6. November 2010, 15:20
von funkheld
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.
Gruss
Re: Pointer für Variable[]...
Verfasst: Samstag 6. November 2010, 15:38
von Xynon1
Wenn mich nicht alles täuscht, gehöhrt das auch wieder hier: "Python mit anderen Sprachen verwenden" hin.
Re: Pointer für Variable[]...
Verfasst: Samstag 6. November 2010, 15:43
von funkheld
Wahrscheinlich unter "ctypes" oder...........
Gruss
Re: Pointer für Variable[]...
Verfasst: Samstag 6. November 2010, 15:54
von BlackJack
@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.
Re: Pointer für Variable[]...
Verfasst: Samstag 6. November 2010, 17:19
von funkheld
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.
Gruss
Re: Pointer für Variable[]...
Verfasst: Samstag 6. November 2010, 17:55
von jerch
Also mit dem char_array-Typen hast Du doch alles, was Du brauchst

:
Code: Alles auswählen
from ctypes import create_string_buffer
s = 'abc'
s_char_array = create_string_buffer(s, 3)
# Ausgabe
print s_char_array.raw # --> 'abc'
# Manipulieren des char Arrays
# stell Dir einfach vor, das macht Deine Basicfunktion
s_char_array[0] = 'x'
# Ausgabe
print s_char_array.raw # --> 'xbc'
print s # s ist gleich geblieben!
Re: Pointer für Variable[]...
Verfasst: Samstag 6. November 2010, 22:43
von funkheld
Zeichenketten sind in Python unveränderbar.
Nein...Nein...Nein...
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.
Gruss
Code: Alles auswählen
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.
Re: Pointer für Variable[]...
Verfasst: Samstag 6. November 2010, 23:12
von EyDu
funkheld hat geschrieben:
Zeichenketten sind in Python unveränderbar.
Nein...Nein...Nein...
Da wirft aber einer mit geballtem
Unwissen um sich. Darii und BlackJack hatten dir die Lösung übrigens schon genannt.
Re: Pointer für Variable[]...
Verfasst: Samstag 6. November 2010, 23:41
von funkheld
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...
Gruss
Re: Pointer für Variable[]...
Verfasst: Samstag 6. November 2010, 23:52
von BlackJack
@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.
Re: Pointer für Variable[]...
Verfasst: Sonntag 7. November 2010, 00:03
von funkheld
Sag ich doch , durch die brust ins Auge....
Gruss
Re: Pointer für Variable[]...
Verfasst: Sonntag 7. November 2010, 00:18
von funkheld
Ohne "s" geht es aber auch, weil es eine rawkopie gibt.
Gruss
Code: Alles auswählen
f=open("cpc.bin", "rb")
pp = create_string_buffer( f.read(laenge),laenge)
f.close()
Re: Pointer für Variable[]...
Verfasst: Sonntag 7. November 2010, 00:28
von jerch
Es geht auch ohne Python. Die Datei einfach im PureBasic öffnen und bearbeiten.
Ist Dir eigentlich der Unterschied zw. ProcedureCDLL und ProcedureDLL in PureBasic bewusst?
Re: Pointer für Variable[]...
Verfasst: Sonntag 7. November 2010, 00:28
von Hyperion
funkheld hat geschrieben:Ohne "s" geht es aber auch, weil es eine rawkopie gibt.
Gruss
Code: Alles auswählen
f=open("cpc.bin", "rb")
pp = create_string_buffer( f.read(laenge),laenge)
f.close()
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:
Code: Alles auswählen
with open(..., "r") as handle:
# handle ist hier als File-Object verfügbar
Ich glaube das hatten wir schon gefühlte 10 Mal

Re: Pointer für Variable[]...
Verfasst: Sonntag 7. November 2010, 09:20
von funkheld
BlackJacks Posting also entweder nicht gelesen oder nicht verstanden.
Der redet immer von "s", das es hier aber nicht gibt.
Es wird hier keine Copie abgelegt usw.
Gruss
Re: Pointer für Variable[]...
Verfasst: Sonntag 7. November 2010, 09:26
von funkheld
ProcedureDLL
Damit kommt eine Fehlermeldung mit dem Hinweiss , das pro Wert beim Aufruf in der Klammer 4Byte fehlen.
Gruss