Felder mit Variablen initialisieren



  • Hallo,
    Ich habe ein Problem und weiß nicht mehr weiter. Hier erstmal das mini-Programm:

    #include <iostream>
    int main()
    {
    int m = 5, n = 5;
    int (*a) [m] = (int (*) [m]) new int [n];

    std::cout << "Adresse: " << a << "\n" << "Inhalt: " << *a << "\n";
    return 0;
    }

    Ich programmiere am MacBook mit dem llvm Compiler und der wirft mir bei der Initialisierung von a nen Error aus:

    "error: cannot initialize a variable of type 'int ()[m]'
    with an rvalue of type 'int (
    )[m]'"

    Am Windows Pc geht es. Aber das ist in meinen Augen schon ein ziemlich großes Problem. Wenn ich statt "m" direkt eine Zahl eingebe funktioniert es nämlich, wenn ich mich nicht irre heißt das, dass die Zahl zur Compile-Zeit bekannt sein muss. Ich halte diese Funktionalität für nicht ganz unwichtig, wie kann ich den Error umgehen ohne den Compiler zu wechseln?

    Alternativ: Könnt ihr für mac/Xcode nen gescheiten Compiler empfehlen?

    PS: Der Compiler ist auf aktueller Version

    Danke für jede Antwort!



  • Du kannst Typangaben nicht mit erst zur Laufzeit bekannten Werten kombinieren. Den Rückgabewert von new brauchst du auch nicht zu casten.
    new und vor allem delete brauchst und willst du in C++ sehr selten (http://stackoverflow.com/questions/6500313/why-should-c-programmers-minimize-use-of-new), benutze doch lieber einen vorgefertigten Container:

    std::vector<int> ints;
    

    Guck mal hier, wie der zu verwenden ist: http://en.cppreference.com/w/cpp/container/vector



  • Ah ok, ja ich hatte mal gehört dass es kein ISO-Standard sei. Ich wollte das auch gar nicht so machen, aber es stand in unserem Skript so und ich befürchte dass das Klausurrelevant sein wird, deshalb wollte ich es logisch verstehen. Danke für die Antwort :)!



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum Linux/Unix in das Forum C++ (alle ISO-Standards) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    std::vector ist seit 1998 ISO-standardisiert. Genauso wie alles andere das du nutzt und die gesamte Sprache C++.



  • Ich verstehe den Sinn hinter dieser Code Zeile nicht.

    int (*a)[m]=(int(*)[m]) new int[n];
    

    So wie ich das sehe soll hier ein int Pointer Array der größe m angelegt werden und mit den Werte n initalisiert werden.

    ich hab das mal schnell in meinen Compiler eingegeben das Array wird angelegt, jedoch nicht mit den entsprechenden Werten intitalisiert.
    Mein Code

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int m=5,n=5;
        int (*a)[m]=(int(*)[m]) new int[n];
        for(unsigned int i=0;i<=sizeof(a);i++)
        {cout << "Adresse. " << a[i] <<" \n";
         cout <<"Inhalt :" <<*a[i] << "\n";
        }
        return 0;
    }
    

    es werden die Adressen des Arrays ausgegeben jedoch die Werte sind zufällig.
    Ich würde die Zuweisung jetzt spontan über eine Schleife machen, oder soll dies einen Möglichkeit darstellen welche ich noch nicht kenne ?



  • Maxxtrix schrieb:

    Ich verstehe den Sinn hinter dieser Code Zeile nicht.

    int (*a)[m]=(int(*)[m]) new int[n];
    

    So wie ich das sehe soll hier ein int Pointer Array der größe m angelegt werden und mit den Werte n initalisiert werden.

    Bevor Leute hier noch etwas falsches Lernen... Hier gehts um einen Zeiger auf ein Array mit 5ints.

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	const int m = 5;
    	int ar[m] = {1,2,3,4,5}; // Array mit 5ints
    	int (*a)[m] = &ar; // a ist ein Zeiger auf ein Array mit 5ints
    
    	for (int i = 0; i != m; ++i)
    		cout << (*a)[i]; // zeiger dereferenzieren, dann lade ich beim Array, und dann normal aufs Array zufreifen.
    
    }
    

    Schadet nicht wenn man das weiß, aber unterm Strich solltest du fertige Container verwenden, und kein Array-Zeiger-Gefrickel anfangen.



  • Ja Danke
    so hatte ich das auch verstanden, nur mich etwas unglücklich ausgedrückt.
    Die Lösung sieht auch viel schöner aus als Meine... 😉


Anmelden zum Antworten