Mit Cython versuche ich eine Python-Liste in ein Cython-Array zu konvertieren und umgekehrt. Die Python-Liste enthält Zahlen aus dem Bereich von 0 bis 255, also spezifiziere ich den Typ des Arrays als unsigned char
-Array. Hier ist mein Code, um die Konvertierungen durchzuführen:
Das Problem liegt in der Tatsache, dass Teile von Mülldaten im Cython-Array generiert werden, und wenn sie in Python-Listen konvertiert werden, werden die Mülldaten übernommen. Zum Beispiel sollte donothing
absolut nichts tun und die Python-Liste unverändert an mich zurückgeben. Diese Funktion dient nur zum Testen der Konvertierung, aber wenn ich sie ausführe, bekomme ich etwas wie:
Woher kommen diese Daten im Code und wie kann dieser Müll bereinigt werden, so dass kein Speicher verschwendet wird?
P.S. Es könnte eine bessere Version geben, Zahlen aus einer Python-Liste zu nehmen und sie in ein unsigned char
-Array zu injizieren. Wenn ja, bitte leiten Sie mich vollständig zu einer besseren Methode.
Ihr to_array
hat einen nicht typisierten Rückgabewert. Außerdem weisen Sie das Ergebnis einem nicht typisierten Wert zu. Daher muss Cython char *
in einen Python-Typ konvertieren.
Cython konvertiert zu bytes
, weil char
ungefähr bytes
ist. Leider nimmt Cython ohne eine explizit angegebene Länge an, dass char *
null-terminiert ist. Dies ist der Grund für das Problem:
Wenn keine Nullen vorhanden sind, liest Cython nur so lange, bis es einen gefunden hat, und geht an tatsächlich zugewiesenem Speicher vorbei.
Sie können for x in my_pointer_arrray
nicht für beliebige Cython-Typen verwenden. Die for
Schleife arbeitet tatsächlich mit falsch konvertierten bytes
.
Sie können dies beheben, indem Sie alle Werte eingeben, die das Array char
enthalten, die Länge explizit durchlaufen und Bereiche durchlaufen (was auch schneller ist, wenn die Schleifenvariable eingegeben wird), oder indem Sie einen Wrapper irgendeiner Art verwenden. Für Ideen, welche Wrapper-Arrays verwendet werden sollen, Dieses Frage-und-Antwort-Paar haben Sie abgedeckt .
Bitte beachten Sie auch, dass Sie bei der manuellen Zuordnung sehr vorsichtig sein sollten. malloc
'd data ist kein Garbage Collected. Wenn Sie also einen Code-Pfad falsch setzen, werden Sie Speicher verlieren. Sie sollten überprüfen, wie mit jedem einzelnen Fall umzugehen ist.