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

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
BlackJack

@funkheld: Als ich das letzte mal von `s` geredet habe, da gab es das noch! Du hast erst *danach* Quelltext gezeigt, wo Du den Wert von ``f.read(laenge)`` direkt als Argument von `create_string_buffer()` verwendet hast.

Das ändert aber auch nichts an dem Vorgang den ich beschrieben habe. Eine Kopie wird an der Stelle trotzdem von `create_string_buffer()` gemacht, denn Zeichenketten sind in Python nun einmal unveränderbar.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@funkheld:
ProcedureDLL und ProcedureCDLL stehen für die Aufrufkonvention (calling convention), mit der die Funktionen in PureBasic versehen werden (hab ich auch nur aus dem PureBasic-Forum, keine Garantie bzgl. Richtigkeit). Gerade weil Du offensichtlich mit inline-Assembler rumhantieren möchtest, solltest Du die Konventionen kennen und die Register- und Stackbehandlung richtig vornehmen, ansonsten geht Dein Programm mit dem Laden Deiner oder fremder DLLs baden (spätestens beim Rücksprung aus einer Funktion der DLL kann der Stackframe korrupt werden oder als sicher angenommene Register enthalten Unsinn). Die Fehlersuche kann dann sehr müßig werden und segfaults sind vorprogrammiert.
In PureBasic stehen ProcedureDLL für stdcall und ProcedureCDLL für cdecl. Für beides hat ctypes einen entsprechenden Lademechanismus (windll vs. cdll).

Wie Du siehst, sind die calling conventions nicht nur was fürs Jungvolk, sondern eher ein Problem Deiner low-level-Herangehensweise. Im Übrigen sind fast alle WinAPI-Funktionen stdcall. Näheres dazu in den WinAPI-Docs.

Edit:
Noch ein Wort zum Benutzen Deiner DLLs. Falls Du vorhast, diese von mehreren Prozessen oder gar Threads aus zeitgleich shared einzubinden und zu benutzen, musst Du sehr sorgfältig bei deren Programmierung sein, damit sie nebeneffektsfrei ihren Dienst tun. (Stichwort zum googlen: reentrant)
Antworten