none
Globale Variablen RRS feed

  • Frage

  • Hallo,

    ich habe ein ziehmlich umfangreiches Projekt geschrieben.

    Sprache: C++ MFC.

    Ich brauche ein globales Feld, dynamisch erzeugt, wie                        double Höhenfeld[][] = new int[X][Y]

    So konnte ich es nicht in der .h Datei erzeugen, zum Test ging dies:    double Höhenfeld[300][214]

    In dem einen Fenster (.cpp Datei) werden die Daten eingetragen.

    Im anderen Fenstrer (.cpp Datei) werden die Daten benötigt.

    Binde ich in beiden Fenstern (.cpp) die globale (.h Datei) ein, erhalte ich vom Linker eine Fehlermeldung wegen Neudefinition.

    Definiere ich in nur einem Fenster .cpp das Höhenfeld, kennt das andere Fenster dieses nicht.

    Wie kann ich Fensterübergreifend eine globale Variable verwenden?

    Dienstag, 21. Februar 2012 18:25

Antworten

  • So geht das nicht. Der Compiler muss immer eine Dimension kennen.

    Einzige Möglichekit ist ein jagged Arry.

    	double **lines = new double*[y];
    	for (int iLine=0; iLine<y; ++iLine)
    		lines[iLine] = new double[x];

    Aber warum nimmst Du nicht einen std::vector das ist noch einfacher:

    typedef std::vector<double> T_LINE;
    typedef std::vector<T_LINE> T_FIELD;
    @GreatVolk: Von der extern Lösung halte ich gar nichts. globale Variablen, passen einfach in kein Projekt-Design.

    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de


    Freitag, 24. Februar 2012 07:46
    Moderator
  • #include <vector>
    
    void test()
    {
        std::vector<double> list;
    }

    Zeige doch mal den Code... sowas geht problemlos...


    Jochen Kalmbach (MVP VC++)
    Samstag, 25. Februar 2012 19:30

Alle Antworten

  • definiere es in einem Cpp-File mit:

    double Höhenfeld[X][Y];

    Im Headerfile mit

    extern double Höhenfeld[X][Y];

    Huch... Wozu das new? also... ich bezweifle das das geht, wenn zwei dimensionen variabel sein sollen...



    • Bearbeitet GreatVolk Dienstag, 21. Februar 2012 18:31
    Dienstag, 21. Februar 2012 18:29
  • Hallo Volk,

    das mit dem "extern" hat geklappt.

    Jedoch nur mit im vorherein festgelegten Arrayfelder.

    Da ich jedoch variable Größen der Felder brauche, sollte das Höhenfeld noch modifiziert werden.

    MFG

     Didi

    Donnerstag, 23. Februar 2012 21:07
  • So geht das nicht. Der Compiler muss immer eine Dimension kennen.

    Einzige Möglichekit ist ein jagged Arry.

    	double **lines = new double*[y];
    	for (int iLine=0; iLine<y; ++iLine)
    		lines[iLine] = new double[x];

    Aber warum nimmst Du nicht einen std::vector das ist noch einfacher:

    typedef std::vector<double> T_LINE;
    typedef std::vector<T_LINE> T_FIELD;
    @GreatVolk: Von der extern Lösung halte ich gar nichts. globale Variablen, passen einfach in kein Projekt-Design.

    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de


    Freitag, 24. Februar 2012 07:46
    Moderator
  • @GreatVolk: Von der extern Lösung halte ich gar nichts. globale Variablen, passen einfach in kein Projekt-Design.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de


    :D Er wollte ja wissen, wie das mit globalen Variablen geht - und es nicht gewertet bekommen. Trotzdem stimme ich Dir für die meisten Fälle voll und ganz zu :)

    Freitag, 24. Februar 2012 09:31
  • Wir können die Dinger ja zur not Singleton nennen... OK? ;)

    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de

    Freitag, 24. Februar 2012 12:10
    Moderator
  • So geht das nicht. Der Compiler muss immer eine Dimension kennen.

    Einzige Möglichekit ist ein jagged Arry.

    	double **lines = new double*[y];
    	for (int iLine=0; iLine<y; ++iLine)
    		lines[iLine] = new double[x];

    Aber warum nimmst Du nicht einen std::vector das ist noch einfacher:

    typedef std::vector<double> T_LINE;
    typedef std::vector<T_LINE> T_FIELD;
    @GreatVolk: Von der extern Lösung halte ich gar nichts. globale Variablen, passen einfach in kein Projekt-Design.

    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de


    Ich habs jetzt mit "vector" ausprobiert.

    Die Compilermeldung war: "errorC2039:´vector´:Ist kein Element von `std`

    Gruß

      Didi

    Samstag, 25. Februar 2012 17:30
  • #include <vector>
    
    void test()
    {
        std::vector<double> list;
    }

    Zeige doch mal den Code... sowas geht problemlos...


    Jochen Kalmbach (MVP VC++)
    Samstag, 25. Februar 2012 19:30
  • Hallo didi369,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Montag, 12. März 2012 15:09
    Moderator