Pointer für Variable[]...

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

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....

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?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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`.
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Code: Alles auswählen

f=open("cpc.bin", "rb")
s = f.read(laenge)
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
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Wenn mich nicht alles täuscht, gehöhrt das auch wieder hier: "Python mit anderen Sprachen verwenden" hin.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Wahrscheinlich unter "ctypes" oder........... :D :D :D

Gruss
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.
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

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
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Also mit dem char_array-Typen hast Du doch alles, was Du brauchst :roll: :

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!
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

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... :D 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.
   
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Ich habe die Zeichenkette geändert... :D
Obwohl es nicht gehen sollte... :D

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... :D


Gruss
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.
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Sag ich doch , durch die brust ins Auge.... :D

Gruss
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

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()
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

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?
Zuletzt geändert von jerch am Sonntag 7. November 2010, 00:29, insgesamt 2-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 :twisted:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

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
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

ProcedureDLL
Damit kommt eine Fehlermeldung mit dem Hinweiss , das pro Wert beim Aufruf in der Klammer 4Byte fehlen.

Gruss
Antworten