Frage zu struct ( managed )



  • 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 glauben 🙂

    Zum 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,

    @Knuddlbaer

    Aus genau diesem Grund ( strcpy -> veraltet ) frage ich ja hier !
    Ich mach das doch nicht aus Spass oder um hier jemanden zu ärgern !

    @Artchi

    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 !
    Matthias

    Ps.: .. und sorry schon mal wenn ich wiedermal mit sowas einfachen nerve !



  • strcpy_s ist KEINE AnsiC Funktion.

    Horch mal, wenn Du einfach keinen Bock hast Dir selbst zu helfen und die Leute nur anmaulen kannst, weil sie in ihrer Freizeit sich Deinen teils unnötigen Fragen stellen, dann lass es einfach.

    Der compiler liefert eine große Hilfe mit, das schwarze sind die Buchstaben. Wenn Du eh nur maulen kannst, dann leb einfach mit der Hilfe aber lass uns hier im Forum mit dem rumgemaule und den absoluten Grundlagenfragen zufrieden.

    Es ist alles andere als schön wenn man Dir helfen will und nur gemaule erntet



  • Hallo,

    @Knuddelbär

    Also jetzt reichts !
    Wo hab ich denn rumgemault ?

    Ich lass mir ja viel nachsagen, aber lies Dir bitte auch MEINE Posts ( speziell den vorigen ) RICHTIG durch... da sind auch das schwarze die Buchstaben aber das blaue der Hintergrund !

    Ich hab mich ja wohl genug entschuldigt !
    Wenn Dir Fragen gegen den Strich gehen dann bist DU vielleicht hier falsch !
    Das ist ein Forum und das bedeutet das hier Leute die Hilfe brauchen Fragen stellen dürfen und ja, sie dürfen auch auf ganz einfache Antworten hoffen und nicht auf ewige Grundsatzdiskusionen von dir !

    Matthias


Anmelden zum Antworten