Frage zu struct ( managed )
-
Warum .Net und warum so toll kann ich Dir nicht erklären. Ich arbeite damit weil ich muss (leider bisher zu wenig und die Vorteile zu kennen. Daher hab ich z.B. auch derzeit einen Unmanaged Singleton der Managed Fenster hält, wäre sicherlich eleganter zu lösen).
Zu den Problemen:
Managed bedeutet, das Du Dich nicht um den Speicher kümmern musst. (u.a. bevor es einwände gibt). Unmanaged bedeutet: Du legst das Objekt an und musst selbst zusehen wie Du es los wirst.
Das hat vor und nachteile. Vorteil: Weniger sorgen um Memoryleaks. Nachteil: Die Objekte werden nicht dann zerstört wenn Du es haben willst. (Ich persönlich arbeite sehr viel mit Destruktoren und hab meine Probleme mit .Net weil ich die Objekte nicht dann zerstört bekomme wann ich es erwarte bzw. will).
Deine Struct ist nun Unmanaged und soll Managed Klassen halten. Das mag der Compiler nicht, weil er nicht weiß was er nun machen soll und einfach nur doof aus der Wäsche schaut. Du kannst gcroot nehmen (siehe FAQ) oder besser noch: Prüfen ob es denn undebingt ein unmanaged Typ sein muss.
Wenn nein, pack nen ref davor:
ref struct xx...
Generell sollte man jedoch bei der Verwendung von Managed und Unmanaged serh vorsichtig sein. Ich kann es nicht beschwören, aber ich kann mir vorstellen das eine Art switsching mit Abgleichen von Daten etc gemacht werden muss. Man könnte durchaus mehr Zeit damit verbringen zu wechseln als die Aufgaben zu lösen. (Jochen kann und mag bestimmt etwas dazu sagen).
Einem chararray kannst Du nichts mit = zuweisen. Erst recht nicht wenn es const ist. char[7] ist ein anderer Datentyp wie char[8] oder char[6].
Um in char "Zeichenketten" etwas zu bekommen, darfst Du Routinen wie strcpy / memcpy etc verwenden.
Für Dich persönlich würde ich mal folgendes Emfpehlen:
Vergiss .Net und leg mal Dein C Buch zurseite.
Das C Buch bringt Dir keinerlei Objektorientierung bei und lässt Dich mit char* etc. arbeiten. Das ist jetzt generell nicht schlecht und ist wissen das man immer brauchen kann, aber eine gute C++ Lektüre würde Dir viel mehr bringen.
Wenn Du dann mit dem reinen C++ klar kommst und die ersten eigenen Objekte mit Vererbung etc. geschrieben hast, schau Dir das .Net noch mal an. Dann sind viele Dinge verständlich und erklären sich von Selbst.
Dein Ehrgeiz in allen Ehren, aber Du machst es Dir im Moment selbst schwerer als es sein muss.
Ich persönlich wurde mit .Net ins kalte Wasser geschmissen und paddel da nun vor mich hin. Ich glaube nicht, das es für einen Einsteiger Sinnvoll ist, gleich auf .Net zu gehen. Lieber eine Zeitlang reines C++ schreiben. Das Wissen wird Dir aber auch später in VB.Net oder C# etc. weiterhelfen. Auch wenn Du dann ggf. einiges vermisst, sind Objekte und Vererbung kein Fremdwort mehr und findest Dich in der Dokumentation besser zurecht.
Solange Du zumindest an Grundlagen wie
char[20] Nachname; Person.NachName = "Anders";
klemmst, ist es keine gute Idee sich parallel gleich noch ein Framework anzusehen, was eigene und neue Regeln mit sich bringt.
-
Das Hauptproblem ist:
Du bringst (native) C++ und C++/CLI komplett durcheinander!Als "Anfänger" sollte man entweder mit C++ *oder mit C++/CLI anfangen; nicht aber beides mischen, das versteht man ja nie...
-
HAllo,
@alle Danke
@Knuddlbaer
Ich danke Dir sehr für deine sehr ausführliche und sehr hilfreiche Antwort.
Das problem war also einzig uund allein das struct unmanaged code ist und ich das nicht wußte !
Ok, das kann man ja nicht wissen.Ich hab aber das gleiche Problem wie Du. Ich arbeite hier ja auch auf etwas bestimmtes hin. Ich möchte/muss, wenn ich mal noch ein bischen mehr gelernt habe, mit einem SDK arbeiten welches Beispiele und eine Schnittstelle zu einem Programm in .NET zur Verfügung stellt.
So ganz aus dem Hut gezaubert ist die Idee managed C++ zu lernen ja nun doch nicht.
Außerdem habe ich mir doch nicht Visual Studio gekauft um dann mit Dev C++ Consolen zu schreiben. Das möchte ich ( auch Consolen , welche als CLR viele Dateien haben können ) in Visual Studio machen !Ich danke Dir also nochmals für Deine Antwort !
@ All
Also eine einfache Antwort auf meine Frage mit einer Erklärung wäre aber wesentlich hilfreicher gewesen als der Hinweis was ich denn lernen soll.
Sorry aber ist so und nochmals sorry ( auch wenn ich mir jetzt hier die Gusche verbrenne ) so war das auch im Delphi Forum.Die Frage war ja nicht danach was ich denn weiterlrnen soll, die Frage war ja ... warum geht das nicht. Also sollte doch eine Antwort so in der Art ... "Das geht deswegen nicht ... das MUSS MAN SO MACHEN"
aussehen oder ?Also das da nicht nur struct sondern entweder value struct oder ref struct stehene muss damit es managed ist oder ?
Weiterhin wäre es sehr Hilfreich gewesen wenn ich nun ( managed oder unmanaged ) erfahren hätte wie ich das mit dem char name[20] mache ??
Die Frage ist ja immer noch offen, also wie macht man denn das ?
Wie kann ich denn einen Wert in einem unmanaged struct verändern ?
Das hätte ich ja dann trotzdem gerne gewusst.Gleiches gilt ja auch für etliche andere Fragen die ich hier schon gestellt habe, z.B. wo oes um die Dateien ging und was denn nun wohin gehört ?
Ich kann nicht erst noch mit Dev C++ anfangen und 2 Jahre lang Console schreiben, geht leider nicht, aber das hat ja nix damit zu tun das ich nur eine Antwort hier suche oder ?
Irgendwie klappt das Spielchen Frage stellen -> Antwort bekommen hier nicht so richtig. Ich mach sicher was falsch, aber ich stell immer eine Frage und bekomm eine Belehrung das ich doch etwas anderes ( unmanaged C++ ) lernen soll. Das ist aber gar nicht die Frage gewesen und absolut nicht die erwartete Antwort !
Ich hoffe Ihr versteht das ??
Sorry für die direktheit und ich bitte Euch nochmal um eine Antwort auf die gestellten Fragen.
Matthias
-
Hallo,
ich hoffe aber auch das Du verstehst das viele Fragen sehr an Grundkentnisse gehen. Wenn man dann verärgerung sieht, weil man einem char[20] keinen Text zuweisen kann, hat man nicht so die interesse das nun zu erklären.
Es sagt ja niemand, das Du 2 Jahre lang Console schreiben sollst. Ich kenne es ja selbst wenn man etwas muss aber man sich dort nicht auskennt.
Aber die Herangeehensweiße ist wirklich wenig Sinvoll. Erst mal auf C++ konzentrieren und nach den ersten Laufschritten was neues dazu nehmen.
Du mischst hier C C++ und C++/CLI durcheinander und ziehst den Lernprozss Zeitlich so in die Länge.
Sieh es mal nicht als Befehl sondern als Empfehlung an erst mal ein wenig von dem einen zu lernen und dann erst das andere zu machen. Es wird Dir auch bei Deinem Zeitplan für das Projekt helfen können
Ansonsten Frag, aber versuch mal Fragen zu splitten. So kann man das dann in die Passenden voren verschieben. Die Zeiger auf Zeiger auf Zeiger Problematik z.B. hätte Dir jemand in einem C Forum vermutlich besser erklären können (auch wenn meine Erklärung geholfen hat).
Also einfach berücksichtigen das solche Posts auch unmut bei den Leuten machen, die Antworten und irgendwann mehr dazu übergehen alles zu ingorieren.
Is nicht böse gemeint, zumal man ja merkt das die Fragen gestellt werden weil Du es wissen willst und nicht weil Du Hausaufgaben gemacht bekommen willst
-
Hallo,
ich hab Deinen Post sorgfältig gelesen und kann nur sagen .. .das verstehe ich auch !
Du verstehst aber sicher auch meinen Standpunkt, das eine einfache Berichtigung von char[20] in "das muss heißen char name[20]" und ausserdem wenn Du CLI haben willst muss das struct value/ref struct heissen , besser gewesen wäre als diese Diskusion jetzt oder ?
Wie ich nun in C/C++ ein struct mit dem namen erstelle und den dann auch noch ändere weiss ich nun immer noch nicht ?Warum ist das denn so schlimm wenn meine Fragen manchmal ein bischen beim Urschleim beginnen ? Ist das schlimm ?
Trotzdem habe ich mir doch, wie ich geschrieben habe, nicht umsonst das Visual Studio zugelegt !
Zu dem vermischen von C, C++ und CLI...kann ich nur sagen das ich hier das Tutorial Schritt für Schritt durcharbeite !
Da kommen Abschnitte da geht der Autor auf C/C++ ein und im nächsten macht er das gleiche dann in CLI. Das Tutorial ist halt so aufgebaut. Das ist zwar in englisch, ist aber das einzige einigermaßen gute welches ich gefunden habe. Ich hätte schon gerne eins in deutsch, kannste glaubenZum anderen ... so einige Vorkenntnisse hab ich ja durch mein Delphi.w32, aber da ist der Syntax sowas von anders. Ich will das ganze vielleicht auch zu sehr verstehen.
MfG
Matthias
-
Jup,
aber so wie die Fragen gestellt werden , werden die Antworten gegeben.
Ansonsten sind die Foren nach Fachgebieten sortiert. So werden wohl nur weniger die mit .Net arbeiten noch mit char konstrukten Übung haben.Die Zeit die hier in die Antworten fliessen ist die Freizeit anderer. Und wenn man häufig viel Zeit damit verbringen muss den Urschleim zu erläutern der zigfach in Tutorials , FAQs und Magazinen steht vergeht einem die Lust. Es sei denn, die Frage wurde so gestellt das man es als "alter Hase" wissen will und aus scham das man es nicht aus dem Handgelenk schütteln kann sich damit beschäftigt. So hat mich die Zeiger auf Zeiger geschichte damals immerhin ne 1/2h gekostet weil ich die Grundlagen erst zusammen suchen musste, da ich seit Jahren solche Konstrukte nicht mehr geschrieben habe.
Mit mehr Grundkentnissen würden sich einige Deiner Probleme völlig von selbst lösen.
Meldungen wie:
Konvertierung des Parameters 1 von 'char [20]' in 'System::String ^' nicht möglich
sind sehr eindeutig und keiner hat so recht die Lust den Urschleim vorzukauen um die Umstände zu erläutern. Mit einem "nimm da ein ref vor struct" gibst Du Dich ja nicht zufrieden, Du willst es ja bis aufs kleinste genau wissen. (Was ja auch gut ist) , aber das sprengt halt den Ramen eines Forums.
Ansonsten: Fragen Sachlich halten und die Problemstellungen voneinander trennen. Dann gibts weniger geflame und gezieltere Antworten
Mit sprüchen wie:
danke Dir für die Antwort, aber ich glaube ich hab Dir noch nicht gesagt das ich noch Anfänger bin und zwar "blutige". Also brauche ich eine etwas genauere Ausführung.
machst Du Dir keine Freude. Es wird Dir einfach niemand den Urschleim vorkauen. Eventuell bekommst Du dann nurnoch kommentarlos einen Link auf ein Tutorial.
Und Probleme wie:
T lässt sich nicht in T^ umwandeln wird hier auch keiner eingehen. Das lässt nur darauf schliessen, das Zeiger völlig unbekannt sind - also mangelnde Grundlagen . Ebenso merkst Du an dieser Stelle an, das "an dieser Stelle der Fehler sein könnte" - der Compiler sagt Dir das jedoch sehr genau das dort der Fehler ist. Doppelklick und Du bist da.Also, ein wenig an der Art und Weiße wie Du die Fragen stellst arbeiten und mehr den Urschleim erforschen.
@Mod - sorry, das hab ich nun total in OT gezogen
-
Hallo,
ok, dann danke ich Dir hier nochmals für Deine Mühen und die Antworten !!
Nur jetzt nochmals die Frage, weil ich das auch in dem Tut nochnicht wirklich kapiert habe
Ist jetzt mit Absicht managed UND unmanaged code weil ichs vertsehen will !!
struct test { char name[20]; int zahl; };
auf der Form ein einfaches textbox und ein button :
private: System::Void button5_Click(System::Object^ sender, System::EventArgs^ e) { test t; textBox1->Text = t.name; }
Jetzt nochmal die Bitte an Dich .. könntest Du mir
1. erklären wie ich dem t.name einen text zuweisen kann ( t.name = "Matthias" z.B. )
2. Wie kann ich dann textBox1->text = t.name; zuweisen ?Ich hab das in dem Tut gesucht und auch auf anderen Seiten, ich hab wirklich gesucht und nix passendes gefunden !
Also ich wäre Dir echt dankbar für eine aufschlussreiche antwort !Danke
Matthias
-
STF-DIR schrieb:
Trotzdem habe ich mir doch, wie ich geschrieben habe, nicht umsonst das Visual Studio zugelegt
Also, VS zu kaufen, kann sich auch für C++ lohnen. Es ist für C++ die beste IDE und Compiler unter Windows! Ich selber habe bisher kein Interesse an C++/CLI und trotzdem habe ich jedesmal VC++6, VC++2003 und bald VS2005 gekauft. Warum? Weil es sich schon alleine für C++ lohnt.
C++/CLI ist ein nettes Feature, das du übrigens auch mit der kostenlosen VC++2005 Express Edition hättest haben können.
-
1. erklären wie ich dem t.name einen text zuweisen kann ( t.name = "Matthias" z.B. )
Um in char "Zeichenketten" etwas zu bekommen, darfst Du Routinen wie strcpy / memcpy etc verwenden.
Mehr Information gibt es hierzu nicht. Wenn ich Dir jetzt zeige wie man strncpy z.B. verwendet, hast Du Dir keine Gedanken drum gemacht.
2. Wie kann ich dann textBox1->text = t.name; zuweisen ?
System::String hat einen Konstruktor, der char* entgegen nimmt.
-
Hallo zusammen,
ich fang mal hinten an
@Knuddlbaer
hmm, genau das ist das Problem.
Es war doch nun eine ( zwei ) spezielle Frage
1."Wie kann ich textBox1->text = einen Char zuweisen ?"
2."Wie kann ich dem struct test = t , t.name = einen neuen Wert zuweisen ?"Das sind doch zwei spezielle Fragen. Warum kannst Du darauf nicht einfach mal antworten , oder jemand anders ?
Ich finds auch irgendwie selber raus, aber ich dachte dafür ( für solche Fragen ) ist so ein Forum gedacht ?
Vielleicht irre ich mich ja auch !?@Artchi
Ja genau das ist es ja auch warum ich das ganz genauso mache wie Du.
Bei Delphi war es genauso bei mir. Hab auch das BDS2006 gekauft um Delphi .NET zu haben.Zum anderen will ich ja BEIDES lernen !
Ich weiß das das schwer ist und das mir da auch viele davon abraten, aber es muss sein weil die SDK's die ich damit nutzen muss sowohl C/C++ und auch CLI beinhalten !
Frag MS warum das so ist. Ist sicher eine Voraussetzung für MS das man das eben kann. Ich kanns ( noch ) nicht und deswegen muss ich es eben lernen.@ALL
Danke
Matthias
-
Naja, ich weiß nicht was an den Antworten falsch ist.
Wenn Du Dir nicht einmal Mühe geben willst beim Urschleim, wer soll dann Lust haben Dir komplexere dinge zu erklären ?
Zu 1. durch verwendung von Routinen wie strcpy
Zu 2. Der Konstruktor von System::String nimmt ein char* entgegen.Wo ist jetzt das Problem ?
-
->Nachtrag,
hab gerade folgendes gefunden und ausprobiert :
#include <iostream> #include <string> int main() { // char Array deklarieren char test[15]; // Text nach char Array kopieren strcpy(test, "Hallo, Welt!"); // C++ String deklarieren std::string str; // char Array dem String zuweisen str = test; // String ausgeben std::cout << str << std::endl; return 0; }
Das dürfte jetzt unmanaged Code sein( was ich ja auch verwenden muss, leider )
Da kommen aber auch Zwei Fehler :
struct test { char name[20]; int zahl; }; test t; strcpy(t.name,"Anders"); std::string test; test = t.name; textBox1->Text = test; }
Fehler immer noch:
Warnung 1 warning C4996: 'strcpy' wurde als veraltet deklariert e:\eigene dateien\visual studio 2005\projects\projects c++\winformprojekt\winformprojekt\Form1.h 219 ---------------------------------------------------------------------------
strcpy ist also veraltet ... geht also auch nicht und ich weiss immer noch nicht weiter ???
Matthias ( der Ratlose )
-
Wenn strcpy als veraltet deklariert wird, könnte man annehmen, das man das gesammte Stringhandling über char* als veraltet ansehen könnte.
Makiere die Fehlermeldung und drück F1 - dann weisst Du was der Compiler dazu sagt und was die Hilfe empfiehlt. (Die 2. Taste in der ersten Reihe von Links)
-
Es ist veraltet, heißt aber nicht das es nicht funktioniert (es ist ein WARNING, kein ERROR!!!). Du kannst es trotzdem benutzen, der Compiler gibt dir nur einen Hinweis. Du kannst diese eine spezielle Warning-Nr per pragma abschalten, dann kommt sie nie wieder. Oder du schaust das du eine Alternative Funktion benutzt. Das gute am VisualC++ ist, das man den Error- oder Warning-Code in den MSDN-Index-Suche eingeben kann und eine ausführlichere Hilfe erhält. Gib mal C4996 in die Indexsuche ein.
-
Hallo,
Aus genau diesem Grund ( strcpy -> veraltet ) frage ich ja hier !
Ich mach das doch nicht aus Spass oder um hier jemanden zu ärgern !Makiere die Fehlermeldung und drück F1 - dann weisst Du was der Compiler dazu sagt und was die Hilfe empfiehlt. (Die 2. Taste in der ersten Reihe von Links)
Ja wo die Hilfe ist weiss ich und da hab ich schonmal nachgesehen. Aber ich weiss nicht ob Du das mal gemacht hast ?
Das was da steht sit nur das was schon in der Fehlermeldung steht, also das strcpy veraltet ist und nicht mehr verwendet werden soll. Was man ansonsten nehmen kann hab ich jedenfalls nich/noch nicht gefunden !Wenn strcpy als veraltet deklariert wird, könnte man annehmen, das man das gesammte Stringhandling über char* als veraltet ansehen könnte.
Wenn das wirklich so ist wies der Compiler sagt dann frage ich mich ernsthaft wie das dann mit nur C/C++ gemacht wurde ?
Ich denke mit VC 2005 kann man managed als auch unmanaged schreiben ?
Wie wurde denn sowas in z.B. VC++ 6 gemacht ?Irgendwie denke ich das ich es jetzt vershcerzt habe und nur deswegen hier 100mal schreibe und keine Antwort bekomme.
Ich will mich doch hier nicht wegen einer einfachen bekloppten Frage rumstreiten !Matthias
-
Hallo,
danke, hab grad was ähnliches gemacht:
Bin in der Hilfe auf eine Alternative btw auf eine Erklärung des Constructors Strin^ gestoßen.
Danach hab ich Google befragt und bin in der MSDN auf folgendes gestoßen :
http://msdn2.microsoft.com/de-de/library/k9s9t975.aspx// Null terminated ASCII characters in a simple char array char charArray3[4] = {0x41,0x42,0x43,0x00}; char * pstr3 = &charArray3[ 0 ]; String^ szAsciiUpper = gcnew String( pstr3 );
So, das hab ich versucht für mich umzubauen :
test t; // test ist das struct char name[20]; char * pTest = &t.name[0]; String^ test = gcnew String(pTest); textBox1->Text = test;
Das kann aber nicht gehen weil ich das mit dem t.name ändern noch nicht hinbekommen habe.
Geht das nur über das abschalten der warnung oder gibts vielleicht noch ne andere Lösung um dieses strcpy zu ersetzen ?Matthias
-
strcpy ist eine gültige ANSI C Funktion.
-
Hallo,
strcpy ist eine gültige ANSI C Funktion .. möchte ich gerne glauben aber es bringt mich auch nicht weiter weil der Fehler trotzdem kommt.
Was hilft es mir da das es eine gültige ANSI C Fkt ist ... das ist zwar schön aber das hier hätte mir sehr viel besser geholfen :strcpy_s(t.name,"Anders"); textBox1->Text = gcnew String(&t.name[0]);
Matthias
-
möchte ich gerne glauben aber es bringt mich auch nicht weiter weil der Fehler trotzdem kommt.
Lies doch mal was wir dir schreiben. Es ist KEIN FEHLER was dir gemeldet wird und die Funktion funktioniert trotzdem anstandslos! Es ist eine WARNUNG bzw. HINWEIS. Nicht mehr und nicht weniger. Oder weißt du nicht wo der Unterschied zwischen WARNUNG und FEHLER ist? Und du kannst die Warnung abschalten, wenn sie dich stört. Gibts sogar von MS eine offizielle Mitteilung dazu bzgl. der sichereren C-Funktionen (weil du nicht der erste bist). MS will einfach nur die Leute dazu bringen, sicherere C-Funktionen zu benutzen, aber es ist kein Muß! Das sagt die Warnung aus.
strcpy_s ist in dem Fall nur die sicherere stdcpy-Variante (Unterstrich-S steht für safe! Also in etwa strcpy_safe). Du mußt sie nicht benutzen. Und lass dir gesagt sein: stdcpy ist offiziell eine ANSI-C Funktion. Das der MS-Compiler eine Warnung ausspuckt, ist eine Entscheidung von MS. Und es ist nur eine Warnung bzw. Hinweis. Es hindert dich aber auch niemand, die sicheren C-Funktionen zu benutzen. Nur solltest du auch nicht denken, das wir dich hier verarschen wollen. Hier gibts schon sehr erfahrene Leute.
-
Hallo,
ich weiss schon den Unterschied, nur wurde das Prog. nach der Warnung nicht compiliert.
Ich hatte aber übersehen das DANACH, also nach der Warnung, noch ein FEHLER kam, SORRY SORRY...kann ja mal passieren oder ?Ich entschuldige mich ja !
Ich denke auch keinesfalls das Ihr mich hier verarschen wollt oder sowas und ich bin mir 100%'ig sicher das Ihr mehr auf dem Aksten habt als ich !!!
Da gibts keinen Zweifel !!!!Nur es wäre doch für Euch sehr einfach gewesen mir einfach mit dem Stück Code zu helfen und es zu erklären als hier 100 posts zu schreiben und zu streiten warum was nicht so gemacht werden soll oder ob es nun C/C++ oder managed C++ ist oder ?
Ich danke Euch ALLEN für die Hilfe trotzdem !
Weil auch diese Diskusion mich wieder ein bischen weitergebracht hat und es immer lichter im Dunkel wird !
Es ist auch nicht wirklich schlecht das ihr mich gezwungen habt da selber drauf zu kommen ! Das hat den Vorteil das ich so ganz genau verstanden habe was ich mache BEVOR ich es mache.
Wenn Ihr mir die Lösung aufgezeigt hättet hätte ich es auch verstanden aber erst danach und das macht schon einen Untershcied !Also danke nochmal an Alle !
MatthiasPs.: .. und sorry schon mal wenn ich wiedermal mit sowas einfachen nerve !