Unmanaged C++ auf managed c++ mit NET umstellen



  • Ein wunderschönes Wochenende an die C++-Community

    Ich stehe momentan vor der Aufgabe ein Programm, welches ich geschrieben hab, auf managed umzustellen.
    Da das programm mit standard c++ begonnen hat und ich an NET nicht mehr vorbeigekommen bin,
    gab es dann auch des öfteren komplikationen zwischen den den komponenten.
    Nun will ich es auf managed c++ umstellen.
    Problem ist hierbei dass ich bei einigen sachen nicht weiß wie ich diese umstellen soll.

    wie z.b. der Standardprogrammaufbau aussieht, wo ich sachen aus der standardbibliothek verwenden sollte, wann ich z.b. die Int32^ anstatt normalen int benutzen sollte usw.
    hab bisher keine wirkliche anleitung gefunden.
    In den büchern zu c++ .net, ist jedoch dieser clr-syntax mit drin
    zb. Int32* runlevel = new Int32();
    also wenn ich ein objekt erzeuge möchte ich diesen syntax benutzen

    Int32^ runlevel = gcnew Int32();

    sind zwar ziemlich eigenartige fragen, aber ich bin in der NET-Welt bisher nicht so bewandert, und möchte dies nun ändern.
    Interessant wäre auch der standardaufbau von klassen für diese problematik.
    Wäre schön wenn ihr mir dort helfen könntet, oder ein paar seiten dazu vielleicht parat habt.

    Der Chris



  • Hier vielleicht ein ganz gutter Anfang: http://www.iis.uni-hildesheim.de/files/teaching/Sommersemester2007/PraktikumCPP/Folien/C++Prak-15_C++CLI.pdf

    > also wenn ich ein objekt erzeuge möchte ich diesen syntax benutzen
    > Int32^ runlevel = gcnew Int32();

    warum willst du das machen?
    int runlevel;
    ist doch auch gut und weniger overhead.

    In32^ i is in CLI ein Pointer also das gleiche wie int* i in ISO C++.
    Is also meistens sinloss. Einen Integer kannst du ka gleich auf dem Stack halten.

    Du musst auch wissen das es in C++/CLI reference klassen und value typen gibt und was der Unterschied ist (siehe auch Boxing/Unboxing).

    Ich denke da findest du genug Anleitungen fuer.



  • okay danke, ich werds mir dann mal reinziehen 🙂
    also ich kann in cli auch einfach normale c++ typen ohne probleme benutzen?
    z.b. bei einem switch?
    mit nem int32^ geht das irgendwie nicht^^



  • Int32^ ist ein CLI Pointer!!!
    int in einer ref bzw. value class/struct ist automatisch ein CLI type.



  • Jan^ schrieb:

    Int32^ ist ein CLI Pointer!!!

    aber wenn ich ihn Dereferenziere dann kann ich den CLI Pointer in einer Switch-Anweisung benutzen.

    Beispiel-Code:

    int main(array<System::String ^> ^args)
    {
    
    	Int32 ^zahl = gcnew Int32;
    
    	Console::Write("Geben Sie einen Wert ein: ");
    	zahl = Convert::ToInt32(Console::ReadLine()); //bei der Zuweisung braucht man den Dereferenzierung-Operator garnicht
    
    	switch(*zahl){ //Hier muss man den Pointer/Handle Dereferenzieren
    		case 1:
    			Console::WriteLine("{0}", zahl);
    			break;
    		case 2:
    			Console::WriteLine("{0}", zahl);
    			break;
    		default:
    			Console::WriteLine("Sie haben weder die 1 noch die 2 eingegeben!");
    	}
    
    	return 0;
    }
    

    Ob das jetzt sehr sinnvoll ist oder nicht, fakt ist das es funktioniert 😉

    Ich lasse mich in allem korrigieren, da ich nur ein Anfänger bin 🙂



  • Also mein Hauptanliegen in dieser Sache ist ja,
    dass ich oft Probleme mit dem gemixten Code hatte...
    Speicherschutzverletzungen und son Spaß.
    Das ist der Grund wieso ich es "einheitlich" machen möchte.
    Hat jemand für diese Problematik vllt noch Tipps?


Anmelden zum Antworten