Laden...

Problem: C++ to C#

Erstellt von Nostalb vor 19 Jahren Letzter Beitrag vor 19 Jahren 1.764 Views
N
Nostalb Themenstarter:in
118 Beiträge seit 2004
vor 19 Jahren
Problem: C++ to C#

Hallo

Habe ein problem ich möchte mein altes C++ programm nach C# übersetzen .
Der C++ Code sieht so aus und funktioniert prima:

C++:


Uint8 *p;
p = (Uint8*)surf->pixels + y * surf->pitch + x * Bpp;
p[0] = (clr >> 16) & 0xff;

Aber beim C# code erhalte ich (natürlich) fehler nur weis ich nicht wie ich die beheben kann:

C#


byte p;
p = Convert.ToByte(surf.Pixels.ToInt32() + y * surf.Pitch + x * Bpp);
p[0] = (clr >> 16) & 0xff;

Und ich erhalte wegen der Zeile:
p[0] = (clr >> 16) & 0xff;

Einen fehler weil der Typ byte keine indexierung erlaubt,
Wie behebe ich das problem?

cya

F
529 Beiträge seit 2003
vor 19 Jahren

p[0] = (clr >> 16) & 0xff;

Was bringt der Indexoperator hinter dem p? Gehen kann das ja wohl nicht, denn du kannst nicht dem ersten Arrayteil eines nicht vorhandenen Arrays einen Wert geben.

Was würde passieren, wenn du aus dem p[0] ein p machst?

--
mfg
Franknstein

Besuchen sie das VisualC++ - Forum

N
Nostalb Themenstarter:in
118 Beiträge seit 2004
vor 19 Jahren

Das würde nicht gehen weil ich ja noch auf die anderen elemente zugreife.
p[0] = (clr >> 16) & 0xff;
p[1] = (clr >> 8) & 0xff;
p[2] = clr & 0xff;

habe aber in einem anderen Forum den vorschlag bekommen einen byte pointer zu benutzen.

cya

4.506 Beiträge seit 2004
vor 19 Jahren

Hallo!

Mir ist zwar noch nicht so ganz klar, was du eigentlich machen möchtest, aber vielleicht kann ich Dir stückchenweise helfen?

Was ist das für eine Variable 'clr' ?

Vielleicht ein Int32 Wert? Und den willst du in 8-Bit-Weise in ein byte array packen?

Dann würde ich dir folgendes empfehlen:



byte[] p = new byte[4];

p = BitConverter.GetBytes(clr);


???

Mir ist halt nicht klar, dass Du p zunächst einen Wert zuweist :

p = (Uint8*)surf->pixels + y * surf->pitch + x * Bpp;

und dann anschließend versuchst p neu zu definieren mit p[0] = ...

Bitte um erklärung, dann kann ich Dir helfen!

Norman-Timo

P.S: ich glaube, dass der C++ Code auch schon nicht ganz sauber ist. (Dass er funktioniert, glaube ich, aber wahrscheinlich 1000x ja und 1x nein).
In C++ (und in C auch) ist es auch möglich Bitweise außerhalb des eigentlich zulässigen Bereichs zu schieben. Dein p hat 8 Bits, und du gibst ihm 16 Bits zu schlucken. (wie gesagt bei günstiger Memory-Gestaltung geht das, bei ungünstiger fliegt dein Prg. auf die Schnauze).
Falls ich hier verkehrt bin, bitte ich um Berichtigung, denn solche Operationen spornen mich irgendwie an (hardwarenahe bitprogrammierung -> geil!).

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

1.373 Beiträge seit 2004
vor 19 Jahren
V
842 Beiträge seit 2003
vor 19 Jahren

Hi!

Original von norman_timo
und dann anschließend versuchst p neu zu definieren mit p[0] = ...

p wird nicht neu definiert. Hier wird auf das erste Array-Element zugegriffen. Er übergibt an p eine berechnete Adresse eines Feldes o.ä. und greift dann per Index auf die Feldelemente zu, an denen er Veränderungen vornimmt, da wird also nichts neu definiert.

Code-Hacker

4.506 Beiträge seit 2004
vor 19 Jahren

Ok, aber wenn es Felder-Werte sein sollen, warum erstellt @Nostalb dann in C# kein Array?

Ungefähr so:


byte[] myBytes = new byte[8];

oder für 2-Byte Werte so etwas:


short[] myShorts = new short[4];

????

Wenn er dann alle Bitwerte und Felder des Array´s so manipuliert hat, und benötigt dann einen Vollzugriff auf alle bytes zu einem Int8 zusammengefasst, kann er ja den BitConverter.ToXXX bemühen, um dann aus den einzelfeldern ein Ganzes machen, oder hab ich da jetzt komplett falsch verstanden?

Deshalb hatte ich gehofft, dass @Nostalb noch mal genauer erklärt, was er eigentlich tun will...

Ciao
Norman-Timo

P.S: Unabhängig davon: WARUM SCHAUEN SO WENIGE IN DIE ANDEREN FOREN? Ich hab z.B. im Netzwerkforum eine Frage gestellt, aber weder eine aktuellere Frage noch eine Antwort ist gekommen??

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

V
842 Beiträge seit 2003
vor 19 Jahren

Hi!

Wozu sollte er ein Array erstellen was X-Byte groß ist? Er will nur irgendwo in ein vorhandenes Feld zeigen. Ich geb dir mal ein Beispiel aus C/C++, welches einfach nur demonstrieren soll warum ich kein Feld sondern einen Zeiger benötige:

char cStr[55] = "Das ist ein Beispiel, nicht mehr und nicht weniger!";
char *p = &cStr[3]; // p zeiger auf das Leerzeichen hinter "Das"
p[4] = '\n'; // p[4] ist das Leerzeichen hinter "ist", dort wird jetzt über den Pointer ein Newline gesetzt

Das ginge aber nicht, wenn:

char cStr[55] = "Das ist ein Beispiel, nicht mehr und nicht weniger!";
char *p = new char[10]; // Zeiger eine 10 Byte große Zeichenkette aufnehmen

Hier könntest du p auch wie oben die Adresse von cStr[3] zuweisen, wovon ich dir vor einem "delete p;" abraten würde, da du sonst allokierten Speicher hast, der nicht freigegeben wurde.

Er zeigt irgendwo in das Feld, von welchem Typ das gibt an von welchem Typ der Pointer ist da er nur auf solche Werte zeigen sollte. Dann kann man wenn man eine Adresse berechnet hat, diese dem Pointer zuweisen und über diesen kann man dann wunderbar Werte verändern, entweder indem man mit diesem über das Feld iteriert (zeiger einfach inkrementieren) und jedesmal dereferenziert, oder indem man direkt auf einen Index vom Pointer aus zugreift. Ich könnte also im Ersten Beispiel auch folgendes machen:

// hier Code aus dem ersten Beispiel
// zusätzlicher Code:
cout << p[-1]; // p[-1] == 's' von "Das"

Du kannst damit auch eine Indizierung wie in Pascal herstellen:

char foo[5] = /*irgendwas*/; 
char *pFoo = &foo[-1];
cout << pFoo[1]; // pFoo[1] == foo[0]

Hoffe das war verständlich und demonstrationsreich warum ein Pointer eine Adresse bekommt und man dem Pointer nicht die Adresse ein neuen Objektes (durch new) zuweist.

Zu deinem PS:
Wir gucken dort rein, doch wir können leider nicht immer alle Fragen beantworten und wenn schönes Wetter ist ist hier ohnehin wesentlich weniger los.

Code-Hacker