Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Pointerfrage
digi333
myCSharp.de - Member



Dabei seit:
Beiträge: 302

Themenstarter:

Pointerfrage

beantworten | zitieren | melden


byte leftPixel = 0;

IntPtr Scan0rgb = rgbData.Scan0;
void* picout = (void*)rgbData.Scan0;
// Outputpointer
byte* pRGB = (byte*)(void*)Scan0rgb;

//... mache irgendwas mit pRGB
pRGB[0] = 128;

// Das geht nicht!
leftPixel = pRGB[0];

Der ganze Quellcode wär zu lang deswegen hab ich die Schleifen und alles drum herum weg gelassen. Es kommt ein Fehler im Programm raus bei der Übergabe zu leftPixel. Scheinbar kann ich den Pointerwert nicht übergeben. Ne Idee???

Falls jemand den Quellcode sehen will... Problem in Zeile 88-89.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von digi333 am .
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo digi333,
Zitat
Es kommt ein Fehler im Programm raus bei der Übergabe zu leftPixel.
Nach 47 Beiträgen könntest du es wissen. :-) Welcher Fehler? [Hinweis] Wie poste ich richtig? Punkt 5.

herbivore
private Nachricht | Beiträge des Benutzers
digi333
myCSharp.de - Member



Dabei seit:
Beiträge: 302

Themenstarter:

beantworten | zitieren | melden

Ich kann leider nicht Debuggen, da ich die Ausgabe in einer Delphi-Umgebung habe. Ohne die Zeile 88 funktioniert es soweit auch, deswegen ist es bestimmt nur ein Übergabefehler.

Resharper und Compiler meckern nicht, aber die Ausgabe bleibt leer.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo digi333,

mach es doch lieber safe, indem du Marshal.Copy verwendest, siehe NET 1.1: Bitmap, Graphics, Handle: Problem mit 8-bit-Pixel .

herbivore
private Nachricht | Beiträge des Benutzers
digi333
myCSharp.de - Member



Dabei seit:
Beiträge: 302

Themenstarter:

beantworten | zitieren | melden

Ich möchte ehrlich gesagt nicht den Umweg machen über Bitmaps und SetPixel und GetPixel. Mir würde es reichen zu wissen warum ich den Inhalt des Pointer nicht speichern kann.

By the way... immernoch blutigster Anfänger.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo digi333,

ich habe nichts von Get- und SetPixel gesagt.

herbivore
private Nachricht | Beiträge des Benutzers
digi333
myCSharp.de - Member



Dabei seit:
Beiträge: 302

Themenstarter:

beantworten | zitieren | melden

Deswegen mein Zusatz Anfänger (Youngblood).

Meinst du so???


byte tempbyte;
Marshal.Copy(tempByte, 0, pRGB, 1);
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo digi333,

wie ich es mit dem Marshal.Copy meinte, steht doch in den Code, auf den ich verwiesen habe.

herbivore
private Nachricht | Beiträge des Benutzers
digi333
myCSharp.de - Member



Dabei seit:
Beiträge: 302

Themenstarter:

beantworten | zitieren | melden

Nicht böse sein... das geht echt nicht anders oder einfacher???
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo digi333,

hm, also sich mit einem Methodeaufruf den Speicherbereich, auf den man sonst per Pointer zugreifen würde, in ein verwaltetes Array zu kopieren, um dann mit verwalteten Operationen zugreifen zu können, finde ich wirklich nicht kompliziert. Am Ende muss man das Array natürlich in den ursprünglichen Speicherbereich zurückkopieren.

Also letztendlich zwei Methodeaufrufe, um unsafe zu vermeiden. Weiß nicht, was daran kompliziert sein soll.

herbivore
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8775
Herkunft: Berlin

beantworten | zitieren | melden

1. Arbeite nicht mit dem Umweg über den IntPtr sondern verwende direkt den &-Operator
2. du musst mit dem fixed-Statement arbeiten (siehe Hilfe)

Zumindest 2. ist ein Fehler, der aber trotzdem nicht für dein Problem verantwortlich sein wird, zumindest dann, wenn der Fehler nicht sporadisch auftritt.
private Nachricht | Beiträge des Benutzers
digi333
myCSharp.de - Member



Dabei seit:
Beiträge: 302

Themenstarter:

beantworten | zitieren | melden

Sind Arrays nicht wesentlich langsamer als Pointer??? Ich arbeite im Videobereich und jeder Geschwindigkeitsverlust hat drastische Auswirkungen.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo digi333,

dann solltest du die Routine wohl besser in C oder C++ schreiben und per DllImport aufrufen.

herbivore
private Nachricht | Beiträge des Benutzers