Speicherinhalt eines Pointers in C# auslesen
-
HI
Wie kann ich in C# den Inhalt eines Pointers auslesen?
Ich habs mal so versucht:ushort *col; for (int i = 0; i<614400; i++) { test[i] = (byte)*col; t = test[i]; col ++; }
Das Array test ist 614400 groß, was auch die Größe des Bereiches sein sollte, den ich auslesen will.
Da ich unter bestimmten Bedingungen weiss, was in dem Pointer steht, weiss ich dass das ganze so nicht geht, da die Werte die ich mir über t anschaue, nicht stimmen.Kann das unter umständen auch an der GarbageCollection liegen? Gibt es eine Möglichkeit bestimmte Pointer vor der GarbageCollection zu schützen?
Danke für eure Hilfe
-
Hallo,
unsafe code in C# ist zuwar möglich aber nicht unbedings anstrebenswert. Benutze Pointer in der Form nur, wenn du unbedingt musst. Ich sehe kein Grund in deinem Post, dieses zu tun.
Davon mal abgesehen ist der Quellcode, den du gepostet hast, vollkommener Unsinn.
Du deklarierst ein Pointer, weist diesen keinen Wert zu (er ist also undefiniert) und fragst ihn zwei Zeilen später ab, was natürlch nicht geht, da der Pointer undefiniert ist. Dann versuchst du auch noch den nicht definierten Pointer hochzuzählen...Davon mal abgesehen, wenn du ein Pointer benutzt, wird dieser nicht vom GarbageCollector verwaltet. Für solche sachen muss man eine Methode deswegen auch mit unsafe kennzeichnen, damit man sowas nicht aus versehen macht.
weiss ich dass das ganze so nicht geht, da die Werte die ich mir über t anschaue, nicht stimmen.
unmöglich.
Wenn du dir die Werte anschauen könntest, hätte der Compiler den Quellocde kompilieren müssen. Das geht aber definitiv nicht.
-
wenn du uns erzählst, was du eigentlich machen möchtest, können wir vieleicht helfen.
-
Hi AndreasW
1. ich weiss dass unsafe Code und Pointer wenn irgendwie möglich vermieden werden soll. Wenn es gehen würd, würd ichs machen, ich MUSS aber in diesem Fall Pointer verwenden.2. Wenn ich nur den Code hätte den ich hier reingeschrieben hab dann würds natürlich nicht funktionieren. Meinem Pointer ist ein Speicherbereich zugewiesen, der auch mit Daten gefüllt ist. Und mein Compiler kompiliert den Code. Ich wusste nicht dass man seit neuestem den kompletten Quellcode posten muss um ne vernünftige anwort zu erhalten. Aber ich werd das in Zukunft deutlicher machen wenn ich Code weglasse.
Hinführen soll das ganze dazu dass ich den Inhalt des Pointers in eine in C# speicherbare Form bringen.
-
Hmmm scheinbar kann mir keiner weiter helfen.
Schade
-
Pointer machen zum teil sinn, wenn ich mich nicht täusche schreibst du eine DirectX Anwendung.
Um einen Pointer nutzen zu können, musst du ihn fixieren.
Kleines Beispiel ( absoluter Schwachsinn )
int[] array = new int[] { 10, 20, 30, 40, 50, 60 }; fixed( int* pointer = &array[0] ) { int* pointer2 = pointer; for ( int i = 0; i < array.Length; i++ ) { Console.Out.WriteLine( (*pointer2++).ToString( ) ); } }
-
Stimmt ich mache auch auch was mit DirectX, aber das hat gerade nix damit zu tun.
Das mit dem fixed hab ich auch schon versucht, aber nachdem ich die Werte bereits in meinem Pointer, den ich von ner andren Anwendung bekomme, drin habe, geht so irgendwie nicht.
Versucht hab ichs so:fixed(ushort *pointer1 = pointer2) { ... //CODE }
pointer2 bekomm ich von ner andren Anwendung und ist auch gültig und nicht null.
Als Fehlermeldungen bekomm ich:
Die Zuordnung zu 'pointer1' ist nicht möglich, da sie schreibgeschützt ist.
Sie müssen keine feste Anwendung verwenden, um die Adresse eines bereits festen Ausdrucks abzurufenOder weiss jemand wie man anders als den Pointer in ein byte-Array einzulesen in C# den Pointerinhalt auf Restplatte speichert? Ich muss nichts verändern sonder wirklich nur einszueins speichern.
-
hi
keine ahnung ob es dir helfen tut aber das hier habe ich in der MSDN gefunden
[C#] IntPtr unmanagedArray = ...; // One way to print the 10 elements of the C-style unmanagedArray byte [] newArray = new byte[10]; Marshal.Copy(unmanagedArray, newArray, 0, 10); for (int i = 0; i < newArray.Length; i++) Console.WriteLine(newArray[i]); // Another way to print the 10 elements of the C-style unmanagedArray for (int i = 0; i < 10; i++) Console.WriteLine(Marshal.ReadByte(unmanagedArray, i));
Und das tolle daran du musst net den geschi** mit den "unsafe code" nutzten.
-
Cool Danke de_Bert des Funktioniert wunderbar. Muss nicht mal die For-Schleife durchlaufen, weil man da angeben kann wie lange der zu kopierende Bereich sein soll. Hatte die Hoffnung schon fast aufgegeben dass das mit dem Speichern geht.
-
hi,
ich finde, das gehört in die FAQ.
grüsse
-
ja dann mal rein damit
Wo ist der Admin