wohin gehört die Declaration von struct ?



  • Hallo,

    ichhab schon wieder( immer noch ) ne Frage :

    Ich, Anfänger, bin derzeit am rumprobieren mit struct in Visual C++ 2005.

    Noch weiss ich nicht so wirklich was wo hingehört in den vielen Dateien eines Windows Forms Projekts ?
    Ich habe die Form.h, die WinForm.cpp als Hauptprojektdatei usw.
    Wenn ich nun ein struct definieren will ( ist ja eigentlich sowieso global oder ? ) wo genau muss das hin ?

    In die Form.h ?

    Übrigens das hier funktioniert :

    #include <string>
    
    #pragma once
    
    namespace WinFormProjekt {
    
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    
    	value struct sPerson
    	{
    		String^ Vorname;
    		String^ NachName;
    		//char Vorname[20];
    		//char NachName[20];
    		double Weight;
    		double Height;
    	};
    

    aber das hier nicht ??

    #include <string>
    
    #pragma once
    
    namespace WinFormProjekt {
    
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    
    	ref struct sPerson    // <--
    	{
    		String^ Vorname;
    		String^ NachName;
    		//char Vorname[20];
    		//char NachName[20];
    		double Weight;
    		double Height;
    	};
    

    Also ein value struct geht und ein ref struct nicht, jedenfalls nicht an der stelle des Codes.
    Einfache Frage ... warum nicht und wohin gehört es ?
    Matthias



  • Wo es hin gehört hängt davon ab, wo es gebraucht wird. Alleine durch den Namespace ist die Struktur nicht mehr global.

    Ansonsten wäre es hilfreich mal auf den Fehler zu klicken, dann F1 um zu sehen was die Hilfe sagt. Wenn das nach ein wenig forschen mittels googel etc. nicht hilft, dann mal die Fehlermeldungen dazu posten.

    So muss man ein Projekt nachbauen um die Fehler zu erzeugen um dann wieder alles einzeln erklären zu dürfen.



  • Hallo,

    wir werdens doch schaffen oder ?

    Also kann ich dann davon ausgehen das es auch nicht falsch ist die struct anweisung über die namespace definition zu schreiben ?
    Also direkt nach #pragma once ?
    Ist die definition denn in der Form1.h generell richtig oder sollte diese generell in eine andere Datei ? *.cpp ?

    Der Fehler sieht so aus :

    Warnung 1 Either VCProject or VCCodeModel is not ready yet. Please close designer and try again. 0 0

    Gibt sogar ein Bild davon :

    http://www.starflight-virtual.de/image294.jpg

    Bei Google hab ich schon gesucht. Diesmal gibt es leider keine Fehlernummer und auch die Hilfe

    Fehlermeldung
    Unbenannte Klasse, Struktur oder Union kann nicht innerhalb des verwalteten Typs 'Typ' definiert werden
    cannot define unnamed class, struct or union inside of managed type 'type'

    Ein in einen verwalteten Typ eingebetteter Typ muss benannt sein.

    Im folgenden Beispiel wird C3183 generiert:

    Hilft diesmal nicht wirklich weil es hier, in der Hilfe, um eine classe und nicht um ein struct geht.
    Obwohl zwar ein struct in CLI gleiche Bahandlung findet habe ich nun alle MEINE Mögliochkeiten ausgeschöpft, eine detaierte Frage gestellt und hoffe nun auf eine erschöpfende Antwort.

    Hier nochmals die Frage(n)

    1.Wohin gehört die Declaration eines struct in VS2005 ?
    2.Kann diese denn auch auserhalb/ innerhalb eines NS erfolgen ?

    Matthias



  • #pragma once
    
    namespace WinFormProjekt {
    
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    
        ref struct sPerson    // <-- 
        { 
            String^ Vorname; 
            String^ NachName; 
            //char Vorname[20]; 
            //char NachName[20]; 
            double Weight; 
            double Height; 
        };
    

    Buildlog:

    1>------ Erstellen gestartet: Projekt: WinFormProjekt, Konfiguration: Debug Win32 ------
    1>Kompilieren...
    1>stdafx.cpp
    1>Kompilieren...
    1>AssemblyInfo.cpp
    1>WinFormProjekt.cpp
    1>Code wird generiert...
    1>Verwaltete Ressourcen werden kompiliert...
    1>Liest in den 0-Ressourcen von "c:\Dokumente und Einstellungen\mroth\Eigene Dateien\Visual Studio 2005\Projects\WinFormProjekt\WinFormProjekt\Form1.resX".
    1>Ressourcendatei wird geschrieben...  Fertig.
    1>Ressourcen werden kompiliert...
    1>Verknüpfen...
    1>Das Manifest wird eingebettet...
    1>Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\mroth\Eigene Dateien\Visual Studio 2005\Projects\WinFormProjekt\WinFormProjekt\Debug\BuildLog.htm" gespeichert.
    1>WinFormProjekt - 0 Fehler, 0 Warnung(en)
    ========== Erstellen: 1 erfolgreich, Fehler bei 0, 0 aktuell, 0 übersprungen ==========
    

    Es gibt im gezeigten Code keine Fehlermeldung.

    Namensräume:
    http://www.google.de/search?sourceid=navclient&hl=de&ie=UTF-8&rls=GGLJ,GGLJ:2006-39,GGLJ:de&q=C%2B%2B+namespaces

    In Headern werden meist die Deklarationen untergebracht, in den .cpp Dateien die Definitionen. Abhängig von den Compilerabhängigkeiten und des benötigten Sichtbarkeitsbereiches werden die Deklarationen von Typen gesetzt. Die Antwort in Datei XYZ wird es hier nicht geben, weil es keine sinvolle Antwort ist. Vielmehr fordert die Positionierung der Deklaration einiges an wissen über das Projekt. Am einfachsten kann man diese Entescheidungen treffen wenn man die notwenidgen Grundlagen kennt. So wird man eine deklaration in einer .cpp Datei nur machen, wenn man diese auch nur in dieser Unit benötigt und selbst dann ist es ein reines kann und eine reine Entscheidung des Entwicklers.

    http://www.google.de/search?hl=de&rls=GGLJ%2CGGLJ%3A2006-39%2CGGLJ%3Ade&q=C%2B%2B+definition+deklaration&meta=

    http://carcino.gen.nz/tech/cpp/struct_vs_class.php

    Was die Fehlermeldung im Formdesigner betrifft: ka, dafür sind zu wenig Informationen vorhanden. Btw. scheint der Formdesigner buggy zu sein, ich diskutiere derzeit mit Microsoft deswegen rum, weil ich überhaupt nicht mehr an die Dialoge komme und der Workarround dafür derzeit 80% der Entwicklungszeit frisst.



  • Hallo,

    danke Dir für die Hilfe, das werd ich mir aber morgen genau durchlesen.

    Eine letzte Frage :

    Also du den Code, also mit dem ref struct .. in dein Projekt eingefügt hattest wurde da noch die Form angezeigt oder nicht ?
    Das war ja die Frage, also eine davon.
    Compilieren tut ers bei mir ja auch , nur die Form im Designer wird nicht mehr angezeigt.

    Was die Fehlermeldung im Formdesigner betrifft: ka, dafür sind zu wenig Informationen vorhanden. Btw. scheint der Formdesigner buggy zu sein, ich diskutiere derzeit mit Microsoft deswegen rum, weil ich überhaupt nicht mehr an die Dialoge komme und der Workarround dafür derzeit 80% der Entwicklungszeit frisst.

    Dafür hab ich extra das Bildchen gemacht :

    Gibt sogar ein Bild davon :

    http://www.starflight-virtual.de/image294.jpg

    Bei Google hab ich schon gesucht. Diesmal gibt es leider keine Fehlernummer und auch die Hilfe

    Matthias

    PS.: Um Dir Arbeit zu sparen hab ich das mal gepackt und hochgeladen.
    Also mit dem struct geht der Designer nicht und ohne das struct sieht man den Designer wieder.
    Es geht mir nur darum ob das bei Dir auch so ist ?
    http://www.starflight-virtual.de/Designer_fehler.rar
    Somit hast Du ja dann auch genug infos was ich meine oder ?



  • Was hat

    Fehlermeldung
    Unbenannte Klasse, Struktur oder Union kann nicht innerhalb des verwalteten Typs 'Typ' definiert werden
    cannot define unnamed class, struct or union inside of managed type 'type'

    Ein in einen verwalteten Typ eingebetteter Typ muss benannt sein.

    Im folgenden Beispiel wird C3183 generiert:

    damit zu tun ?

    Ja das Problem gibt es bei mir auch. Der Formdesigner parst den kompletten Header um die FOrm dazustellen. Was nun das VCCodeModel ist weiß ich nicht. Hierzu gibt es ein eigenes Kapitel in der MSDN mit dessen KnowHow man wohl die Fehlermeldung interpretieren könnte. (Es lässt sich eben nicht alles in aller kürze erläutern).

    Workaround:

    Pack die Struktur in einen weiteren Header und includiere diesen in Form1.h . Der Parser bekommt so die struct nicht zu sehen.



  • Hallo,

    ich danke Dir für die Antwort.

    Zu dem Was hat ... damit zu tun:
    Wenn Du das Problem nachvollziehst und der Fehler unten in der Liste erscheint und ich das dann so mache wie Du es mir gesagt hat, also den Fehler markieren und dann F1 drücken. Genau dann kommt die Hilfe, was auch schöne ist, jedoch steht darin dann das was ich geschrieben habe, also ganz oben in der Hilfe steht dann

    Fehlermeldung
    Unbenannte Klasse, Struktur oder Union kann nicht innerhalb des verwalteten Typs 'Typ' definiert werden
    cannot define unnamed class, struct or union inside of managed type 'type'

    Ein in einen verwalteten Typ eingebetteter Typ muss benannt sein.

    Im folgenden Beispiel wird C3183 generiert:

    das geht noch weiter, aber ich hab mal nur den Auschnitt hier kopiert.

    Genau das ist es aber auch wenn ich mal geschrieben habe das die Hilfe sehr aufschlussreich war !
    Ich weiss sicher um die Funktion der Taste F1 und benutze Sie auch, nur wenn man dann als Anfänger SOWAS angezeigt bekommt .. du kannst Dir sicher denken das ich da manchmal nicht wirklich was anfangen konnte oder etwa nicht ?
    Du sagst ja selber das das nichts mit dem Desigerfehler zu tun hat.

    Nun zu der header datei:

    Die Idee kam mir auch schon. Hab das Projekt um eine Datei erweitert fehler.h
    Die Fragen die das wieder aufwirft ( sorry aber ich glaube das sind wieder Grundlagen und wenn Du nicht antworten magst, ist das nicht so schlimm !)
    1.Wohin genau gehört das #include "fehler.h" ?
    (( Kann man das auch in den Namespace des Projekts schreiben oder ist das dann schlechter Stil ?)
    2.Muss oder besser sollte in der fehler.h ein Namespace eingerichtet werden ?
    ->was würde das ändern ?

    Ich hab das Projekt jetzt nochmal so hochgeladen wie es jetzt ist.
    Da drin sind auch ienige Fragen Auskommentiert.
    Wenn Du Lust hast, aber auch nur dann, kannst Du ja mal drüberfliegen.
    Ich hoffe das ist einfacher für Dich wenn ich zu Anfang mal immer die kompletten Projekte auf meinen Server lade ?

    Matthias

    http://www.starflight-virtual.de/Designer_fehler.rar



  • Die Mledung bei dem Problem das Du hast lautet:

    Warnung 1 Either VCProject or VCCodeModel is not ready yet. Please close designer and try again. 0

    Die Hilfe die erscheint wenn man F1 drückt lautet

    Mithilfe der Fehlerliste können Sie die Anwendungsentwicklung beschleunigen. Im Fenster Fehlerliste haben Sie folgende Möglichkeiten:

    Anzeigen von Fehlern, Warnungen und Meldungen, die beim Bearbeiten und Kompilieren von Code ausgegeben werden.

    Suchen nach Syntaxfehlern, die von IntelliSense erkannt werden.

    [....]

    Das was Du als Fehlermeldung gepostet hast, hat nichts mit dem beschriebenen Problem zu tun. Es ist ein Compilerfehler der eine andere Stelle in Deinem Quellcode beziffern dürfte.

    Ich lad es mir mal runter und schau mal nach den Fragen.



  • sPerson Person = {"Vorname", "Nachname",0,0};
    							 // Warum geht das denn nun wieder nicht ?
    							 // da vertsehe ich auch die Hilfe wieder nicht.
    							 // Wo ist da der Unterschied von Pair_correct1 zu meiner definition ?
    
    ref struct sPerson    // <-- 
      { 
    	public:
    		String^ Vorname; 
    		String^ NachName; 
    		double Weight; 
    		double Height; 
      };
    

    Es gibt keinen Konstruktor der die Daten entgegen nimmt. Hierzu bitte ein Tutorual/Buch lesen das sich rund um Klassen beschäftigt. Das Wissen wirst Du unbedingt benötigen wenn Du mit .Net arbeiten willst. Schau Dir das Beispiel der Hilfe mal genau an, da wirst Du sehen, das die dort gezeigte Klasse mehr ist als ein struct. (Nein, ich zeige bewusst nicht wie der Konstruktur ausschaut - das Wissen solltest Du Dir erarbeiten weil es sehr wichtig ist dies verinnerlicht zu haben.)

    Zur Tetbox: Du musst noch ein \r\n einfügen um einen Zeilenumbruch zu erzeugen.

    Zur fehler.h:

    //using namespace System; <-- sowas nicht in einem Header schreiben
    
    namespace Designer_fehler
    {
    
    ref struct sPerson    // <-- 
      { 
    	public:
    		String^ Vorname; 
    		String^ NachName; 
    		double Weight; 
    		double Height; 
      };
    
    }
    

    Das ist jetzt eine Empfehlung, wie gesagt hängt das vom Stil und Einsatz der Struktur ab.

    Mal ein paar Links die sich zu lesen lohnen hier aus dem Forum:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-61231.html
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39485.html
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39484.html
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39483.html
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39459.html
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-126465.html (werd ich selbst gleich lesen)

    Und vllt. noch ein wenig über Namespaces:
    http://www.google.de/search?sourceid=navclient&aq=t&hl=de&ie=UTF-8&rls=GGLJ,GGLJ:2006-39,GGLJ:de&q=C%2B%2B+namespaces

    Das schaut erst mal viel aus, ist es aber nicht und hilft Dir sicherlich enorm weiter , ebenso den Antwortenden weil man einfach ein wenig was vorraussetzen kann und die Antworten dann klarer werden 🤡



  • Hallo,

    ich weiss nicht genau ob wir jetzt aneinander vorbei reden.

    Also hier mal eine exemplarische Vorgehensweise um den Fehler ( is ne Warnung !! ) zu reproduzieren:

    -Ein neues Windows Form Projekt erstellen
    (Datei->Neu->Projekt->// in dem erscheinenden Fenster // Visual C++->CLR->Windows Forms-Anwendung )
    [ ich habs mit Absicht so genau beschrieben ]

    Dann bekommt man doch ein neues Projekt mit vershciedenen Dateien zusammengestellt.
    (Form1.h, -> Form1.resx, resource.h, stdafx.h)
    (Assemblerinfo.cpp, stdafx.cpp)
    (app.ico, app.rc)
    (ReadMe.txt)

    So, in der Form1.h mal ( zum test ) folgendes in Zeile 3 einfügen, also direkt unter #pragman once

    value struct test2
    	{};
    

    Das funktioniert bei mir. Nun gibt es aber auch ein ref struct, also einfach die eingefügte Zeile in :

    ref struct test2
    	{};
    

    und siehe da wenn man jetzt die Registrierkarte Form1.h[Entwurf] anschaut hat man den Salat.

    Und unten bei Warnungen steht bei mir folgenedes :

    Warnung 1 Either VCProject or VCCodeModel is not ready yet. Please close designer and try again. 0 0

    Also kann es nicht an einem anderen Code Schnipsel liegen oder ?
    Ich hab ja nur diese eine Zeile geändert und auch nur das überhaupt eingefügt. Ansonsten ist es ja ein absolut leeres Projekt.

    Nun kann es gut sein das das struct dort an der falschen stelle ist ( was ich ja unter anderem versuche rauszukriegen ) oder ?

    Ändert man jetzt "ref" wieder in "value" UND SCHLIE?T DIE REGISTRIERKARTE Form1.h[Entwurf] UND ÖFFNET SIE DANN NEU geht es wieder, also die Form wird im Designer wieder angezeigt.

    Wenn ich den Fehler markiere bekomme ich die Seite

    ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.de/dv_vccomp/html/3595d66e-cf87-4fda-a896-c0cd81f95db4.htm

    in der Hilfe angezeigt. Ist das bei Dir die gleiche ? Vielleicht stimmt ja was mit meiner Hilfe nicht ?

    Die seite fängt so an :

    Fehlermeldung
    'Funktion': Konvertierung des Parameters Nummer von 'Typ1' in 'Typ2' nicht möglich
    'function' : cannot convert parameter number from 'type1' to 'type2'

    Ein Parameter kann nicht in den erforderlichen Typ konvertiert werden. Dies kann passieren, wenn Sie eine Instanz einer Klasse erstellen und versuchen, eine implizite Konvertierung für einen Konstruktor durchzuführen, der mit dem Schlüsselwort explicit gekennzeichnet ist.
    .
    .
    .

    Da steht natürlich noch ein bischen mehr, aber nichts von ref struct !?

    Das scheint also irgendwie gar nichts mit dem Fehler zu tun zu haben oder ?

    Ist das bei Dir/Euch auch so ? Kannst Du/Ihr das jetzt nachvollziehen ?

    Danke für Deine/Eure Mühe
    Matthias



  • Hallo,

    jetzt haben wir gleichzeitig geschrieben 🙂

    Ich lese mir das auf alle fälle in ruhe durch !! Keine Frage !!

    Meld mich dann wieder. So hast Du / Ihr auch ein bischen mehr zeit wegen dem letzten Post. Das dauert ja doch ein bischen das genau nachzuvollziehen.
    Würd mich aber schon interessieren ob der Fehler auch bei Euch ist und hauptsächlich auch ob die gleiche Hilfe Seite angezeigt wird ?

    Matthias



  • Dein Problem mit dem Designer kann ich nachvollziehen, ja.

    Ich werde zu
    ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.de/dv_vsnav/html/b7f6d45a-733b-4ad8-bc2f-737a37509e56.htm

    geschickt. Eigentlich richtig sollte sein:

    ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.de/dv_mancli/html/cf610bf4-5fe4-471c-bce7-6a05ece07bd2.htm



  • Knuddlbaer schrieb:

    > Ja das Problem gibt es bei mir auch.

    [...]
    Workaround:

    Pack die Struktur in einen weiteren Header und includiere diesen in Form1.h . Der Parser bekommt so die struct nicht zu sehen.

    Da stand eigentlich schon das es das Problem auch wo anderst gibt.



  • Hallo,

    sorry, aber siehste nun das ich nicht nur blödsinn und unsinnige Fragen stelle !
    Wie kann ich denn Ahnen das mit meiner Hilfe irgendwas nicht stimmt ?

    Na ok, ich möchte DIESE Diskusion jetzt bitte lasse...ich streng mich schon an !

    Rückfrage :
    Ist das jetzt die richtige Hilfeseite ? Bei mir steht oben in dem blauen Teil:

    Fehlermeldungen für Windows Forms
    Fehlermeldungen im Windows Forms-Designer

    Falls das die richtige ist bin ich noch am suchen welche der dort aufgelisteten hier zutrifft ?
    Die richtige hab ich bisher noch nicht gefunden.

    Andere Frage noch : Hast Du vielleicht ne Ahnung wieso ich da auf der falschen Seite in der Hilfe rauskomme ?

    Bei deinem Workaround bin ich gerade dabei....

    Wow... coole Sache, das funktioniert !!! Danke !!

    Hab das ganze wieder zusammengepackt und hochgeladen.
    Wenn Du Lust haben solltest könntest Du es Dir ja mal anschauen. Vielleicht mach ich doch noch irgendwas falsch.
    Eine Frage .... siehste wenn Du Dir das Projekt anschaust ... hätte ich noch.Damit hab ich schonmal rumprobiert und keinen Erfolg gehabt.

    Also es gibt im Delphi ein Memo. Das kennst Du sicher. Da konnte man ganz einfach Zeilen anfügen mit memo1.Lines.Add("irgendwas");
    Nun, in VC++ scheints das nicht zu geben . Ich hab also nur eine textBox1.
    Bei der kan nich aber dafür eine Eigenschaft Multiline einstellen....cool dachte ich, denn ein textBox1->Lines->Add oder so hab ich nicht gefunden !?

    Hättest Du da nen Tip wie das geht ?
    Wenn nicht ist nicht schlimm, ist ersten (noch ) nicht wirklich wichtig, sondern nur aus interesse und vorausschauend weil ich weiss das ich das mal brauchen werde.

    Matthias

    Link vergessen : http://www.starflight-virtual.de/test.rar



  • Hallo,

    ich hab in der Hilfe zu dem erzeugten Fehler des Formdesigners keinerlei Hilfe gefunden. Es gibt lediglich viel Text zum Thema VCCodeComponent (oder wie das hies) aus dem man dann mit Transferwissen etwas anfangen kann.

    Warum Du auf der Hilfe nicht auf der passenden Seite gelangst weiß ich nicht. Da ist die IDE etwas eigen. Bei mir wird, wenn im Fehler/Warunungsfenster ein Thema steht zu das keine Hilfe gefunden wird, die Hilfsseite für die Liste selbst aufgerufen. Warum Du zur Typumwandlung gelangst ka, da kann Dir aber Microsoft helfen.

    Die Seite die ich Dir nannte findet man, wenn man nach Fehlermeldungen Formdesginer googelt bzw. die Hilfe danach durchsucht. Es gibt oft die Information nicht direkt sondern man muss sich diese auf Umwegen zusammen suchen.

    Zur Textbox (hab ich wohl versehentlich wegeditiert in einem der Beiträge).
    Auf die schnelle fällt mir nur \r\n ein im Text.

    Mach mal folgendes:
    Dialog auf -> Textbox makieren -> F1 drücken.

    Nach unten Scrollen zu Siehe auch und folgenden Link anklicken:
    Gewusst wie: Anzeigen mehrerer Zeilen im TextBox-Steuerelement in Windows Forms



  • Hallo,

    hmm, ist schon komisch mit der Hilfe.
    Könnte aber vielleiucht auch mein Fehler ( wiedermal ) sein. Ich habe zuerst die Express Versionen installiert, also C++ un C# und danach auch noch Borland Developer Studio. Alle installieren ein .NET Framework, alle verlangen ja auch zugriff auf die Dateien. Vielleicht liegts daran.
    Ich werd vioelleicht mal alles runterschmeißen und nochmal sauber installieren.

    zur Hilfe noch ... das ist es eben. Ich bin da von Delphi vielleicht ein bischen verwöhnt. Da musste man sich nichts "zusammensuchen" oder so. F1 drücken und man bekommt da auch wirklich Hilfe zu jedem Befehl und wenn nicht, dann hat man sich verschrieben oder den Befehl gibts gar nicht.
    Aber daran gewöhne ich mich...bitte um Nachsicht.

    Die Frage mit der TextBox ist genau so ein Beispiel .. nicht genug/genau genug gelesen.

    Nun aber zu dem test projekt nochmal kurz. Hast Du das mal aufgerufen ?
    Steht das da alles an der richtigen stelle oder würdest Du das irgendwie anders machen ?
    Wie schon erwähnt...ich blicke bei der Dateistrucktur noch nicht richtig durch zu was die alle gut sind ?
    stdafx.cpp und stdafx.h z.B. braucht man die später erst oder zu was sollen die gut sein ?

    Wenn ich dashier aus der stdafx.h

    // stdafx.h : Includedatei für Standardsystem-Includedateien
    // oder häufig verwendete projektspezifische Includedateien,
    // die nur in unregelmäßigen Abständen geändert werden.
    #pragma once
    
    // TODO: Hier auf zusätzliche Header, die das Programm erfordert, verweisen.
    

    richtig verstehe hätte ich die struct.h auch hier einbinden können oder ?
    Mach das nun einen Unterschied oder ist es egal oder wie ist das ?

    Hab das jetzt nicht ausprobiert....bin aber dabei !

    Danke
    Matthias...es wird doch 🕶



  • Nachtrag ...

    wo wird denn eigentlich die stdafx.cpp geladen / includet ?
    Ich hab in der AssemblyInfo.cpp nur die stdafx.h gefunden.

    Wioe gesagt, ich versteh den zusammenhang nicht

    Matthias

    PS.: textBox1->AppendText(t.str+"\r\n"); .. geht herforragend !! danke



  • Hallo,

    nochmal zur Hilfe, da schein wirklich irgendwas nicht zu stimmen.

    Wenn ich AppendText markiere und F1 drücke lande ich hier :
    ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.de/cpref8/html/M_System_IO_File_AppendText_1_16219e3a.htm

    ist das normal ? Hat doch gar nichts mit der TextBox zu tun.
    unten steht aber auch keine Alternative drin. Sicher kann man jetzt AppendText links zum suchen eingeben....is klar

    Wenn ich allerdings textBox1->AppendText markiere lande ich hier :
    ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.de/cpref8/html/M_System_IO_File_AppendText_1_16219e3a.htm

    in der Online Hile auf MSDN2....komisch irgendwie

    Matthias



  • Daran wirst Du Dich gewöhnen müssen. Auch im .Net Framework allgemein, da sucht man sich nen Wolf. Oft landet man dann im Forum weil man einfach nichts findet oder die Suchbegriffe fehlen. Es gibt dann den Suchbegriff und man sucht weiter damit.

    Auch wirst Du in C++ an einigen Stellen unwissen akzeptieren müssen. Es gibt oft A das zum Verständnis B benötigt. B wiederum braucht zum vollendeten verständnis A. So muss man erst mal bei einem von beiden mit ner Lücke leben.

    .cpp Dateien werden nicht includiert. Jede .cpp wird vom Compiler übersetzt und zu einer Objektdatei gemacht. Die .cpp wissen nichts voneinander. Erst der Linker bringt die Objekte zusammen. (So wäre der nächste Tipp: Wenn sich mal etwas nicht kompilieren lässt, Unit für Unit einzeln Übersetzen. Wenn alles richtig ist, muss sich jede Unit einzeln übersetzen lassen).

    Jede dieser Units muss ja aber die Informationen herbekommen was Form1 ist, was sPerson ist etc. Diese Informationen stellt man mit der Deklaration zur Verfügung die man üblicherweise in einen Header packt.

    stdafx nimmt beim VC IMHO eine sonderstellung ein, da kommt alles rein was alle sehen sollen. So wird Dir sicherlich aufgefallen sein, das die stdafx.h überall includiert wird. Hinzu kommt, das die vorkompilierten Headerdateien durch stdafx.h makiert werden (details kann ich Dir nich sagen, nie mit auseinandergesetzt).

    Insgesammt ist es ein sehr großes Thema für .cpp .h definition und deklaration.

    Situationsbetrachtung:

    Ausgangspunkt:

    sPerson.h enhält folgenden Code:

    ref class sPerson
    {
       System::String ^ Name;
        [...]
       public:
         System::Void    aufwecken()
         {
            if(chef_in_der_naehe() && schlaeft())
               schlagen();
            else
               sanft_ruetteln;
         }
    
    }
    

    Wir haben 20 Dialoge von denen 10 mit sPerson umgehen. Wir überlegen uns nun: Packen wir doch sPerson.h per include in stdafx.h - dann hat jeder was von und ich muss mir keine Gedanken machen. Denn wenn der 11. Dialog sPerson braucht, ist sPerson da und ich kann einfach faul sein.

    Ok, gemacht getan. Wir sind ja alle faul.

    Nun haben wir das Projekt einmal vollständig übersetzt. Wir ändern sPerson nun ab:

    ref class sPerson
    {
       System::String ^ Name;
       System::Int16    alter;
        [...]
       public:
         System::Void    aufwecken()
         {
            if(chef_in_der_naehe() && schlaeft())
               schlagen();
            else
               sanft_ruetteln;
         }       
    }
    

    Wir drücken übersetzen und merken, das der Compiler alle 20 Dialoge übersetzt. Schlussfolgerung: Überall wo ein Header eingebunden wird und sich dieser direkt oder indirekt ändert, muss alles, was diese Informationen per Include zieht (wie gesagt, das kann auch indirekt erfolgen!!) neu übersetzt werden.

    Natürlich reicht unser Kuchen nicht und der Compiler arbeitet immer noch. Das dauert uns einfach zu lang, es muss eine Lösung her.

    Also sPerson wieder aus stdafx.h entfernen und nur in die Dialoge einbinden, die sPerson wirklich benötigen. Nun das Projekt vollständig übersetzen - fertig.

    Nun müssen wir aber noch was an der definition von sPerson ändern. Denn wenn Feierabend ist, wird der Kollege auch geschlagen. Wer will schon nach Feierabend ewig da rumzerren bis der wach wird ?

    ref class sPerson
    {
       System::String ^ Name;
       System::Int16    alter;
        [...]
       public:
         System::Void    aufwecken()
         {
            if(schlaeft() && (chef_in_der_naehe() || feierabend()))
               schlagen();
            else
               sanft_ruetteln;
         }       
    }
    

    Ein Druck auf F7 zeigt uns, er compiliert wieder alle 10 Dialoge. Aber warum ? Eigentlich ist es doch egal, der Compiler muss doch in den Dialogen nur wissen, wie die Schnittstelle ausschaut. Der Inhalt ist doch völlig uninteresannt. (Ich hab nie ein Buch über Compilerbau gelesen, aber IMHO wird einfach das Dateidatum/zeit herangezogen um eine Änderung zu erkennen).

    So, wir sitzen wieder schmollend vor der Kiste. Kuchen ist alle und Langeweile macht sich breit. Wir haben ja die Schnitstelle bereits abgesprochen und an der Deklaration wird sich so schnell nichts mehr ändern. Aber in der Definition müssen wir noch oft ran, wir sind uns da einfach unschlüssig. Aber so viel Kuchen können wir garnicht essen wie wir Compilerdurchläufe machen müssten.

    Was könnte helfen ?

    Wir trennen die Deklaration und die Definition. Die Definition kloppen wir in sPerson.cpp und erhalten folgendes:

    ref class sPerson
    {
       System::String ^ Name;
       System::Int16    alter;
        [...]
       public:
         System::Void    aufwecken();
    }
    
    System::Void    sPerson::aufwecken()
         {
            if(schlaeft() && (chef_in_der_naehe() || feierabend()))
               schlagen();
            else
               sanft_ruetteln;
         }
    

    Ab jetzt können wir immer, zur Syntaxprüfung, sPerson.cpp alleine übersetzen und schauen ob alles ok ist uns müssen nich alles Übersetzen.

    So, nun sind wir sauer auf unseren kollegen weil der so viel pennt und nix schafft. Also wollen wir den nun immer schlagen und packen die Definition an:

    System::Void    sPerson::aufwecken()
         {
               schlagen();
               schlagen();
               schlagen();
         }
    

    Nun wieder F7 gedrückt und siehe da - es wird sPerson.cpp compiliert und danach geht schon der Linker ans Wek.

    Nun haben die Compilerbauer noch vorkompilierte Header erfunden um diesem Effekt entgegen zu treten. Soll heissen: So extrem ist es nicht mehr wie vor 10 Jahren. Leider wird dadurch die Abhängigkeit der Dateien ständig unter den Tisch gekehrt und nurnoch rumgemurkst.

    Das war jetzt 1 Aspekt der .cpp und .h Dateien. Es gibt viele weitere die man berücksichtigen muss / sollte / kann. Templates, inline um mal zwei wichtige Themen genannt zu haben. Auch sind Namespace über die Jahre hinweg ein sehr wichtiges Werkzeug geworden. Forwarddeklarationen gehören zu dem .h und .cpp Spiel ebenfalls hinzu wie Mehrdeutigkeiten.

    Warum nun MS alles in den Header packt weiß ich nicht. Ich denke, da hatte man keine Lust die .cpp auch noch zu parsen. Ich persönlich trenne nach wie vor streng zwischen deklaration und definition.

    Fazit:

    Im Header möglichst nur Deklarationen haben (wie immer gibt es ausnahmen) und im Header die Definitionen. Nur das includieren was wirklich benötigt wird. using namespace nur in .cpp Dateien . Und schon muss der Compiler weniger ackern, die möglichen Fehler werden automatisch weniger und das Design wesentlich übersichtlicher.

    Und nun bete ich, das ich Definition und Deklaration nicht durcheinander geschmissen hab 🤡

    Ahja, eine Definition ist auch gleichzeitig eine Deklaration.

    Pps.: Der Text hat jetzt 40 Minuten gebraucht und es war nur ein ganz kleiner Ausflug zum Thema .cpp und .h. Vieles was man dazu noch sagen könnte sind Nebenprodukte anderer Themen wie forwarddeklaration, templates und inline sowie export etc.

    Du wirst immer , wenn Du fertig bist, alles neu machen wollen, weil Du weisst wie es besser gegangen wäre.

    Manchmal ist es aber auch einfach die wirtschaftlichkeit die einen Zwingt. Ich habe ein Projekt mit 20 Dialogen, 30 Datasets und viele Hilfsklassen . Da sind z.B. 7 Dialoge identisch vom Grundaufbau her. Es hat mich angekotzt das ich alles an Funktionalität neu machen musste. Ich hätte am liebsten den Grundaufbau gemacht und dann den Dialog vererbt.

    Irgendwann kam genug KnowHow um das etwas generischer zu gestalten. Events eintragen etc also nurnoch die Oberfläche neu gestalten. Aber das führte dann dazu, das ich die Menüs , ToolboxButtons und DataGridViews hätte alle per Hand setzen initialisieren etc. hätte müssen und den Formdesigner nicht hätte nehmen können.

    Nach einer Weile und vielen sonderwünschen sehen sich die Dialoge nurnoch grob ähnlich und gleichen sich nurnoch in etwa 40% der Funktionen. Hätte ich alles zusammen gelegt hätte ich lange daran arbeiten müssen das wieder zu zerpflücken.

    Also kurz: Der Kunde zahlt nicht den Idealsten Quellcode und man muss leider manchmal mit unschönheiten leben.



  • FileAppend gibt es einfach in vielen Methoden.

    Such nach dem Hauptelement und gehe über die Member.

    ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.de/CPref17/html/M_System_Windows_Forms_TextBoxBase_AppendText_1_16219e3a.htm



  • Hallo,

    danke Dir sehr für die echt erschöpfende Antwort !
    Ich les mir das nachher nochmal GANZ genau durch ... muss erst mal Abendbrot machen 🙂

    Was ich beim "überfliegen" gerade nicht gesehen habe sind die sogenannten prototypen von eigenen funktionen.
    Ich hab das nur mal in anderen Projekten gesehen, gehört und auch was davon im Tutorial gelesen.
    Jedoch kann man ja mit .NET keine funktionen mehr außerhalb von Classen definieren oder hab ich da was falsch verstanden ?
    Dann geht das ja mit den Prototypen gar nicht mehr so oder bin ich jetzt völlig auf dem falschen Dampfer mit den Prototypen ?

    Dank Dir nochmal für die Antwort...habs mir glatt ausgedruckt !

    Matthias


Anmelden zum Antworten