static-problem mit der variablen



  • guten tag

    c++
    ich hab folgendes problem:
    mein hauptprogramm liest durch cin>>x eine int-variable ein und die muss ich in ein nebenprogramm miteinbeziehen.
    das nebenprogramm beinhaltet static int-variablen. die grösse der variablen ist durch x bestimmt.

    hier der fehler:
    error: storage size of (s) isn't constant
    error: variable-sized object (s) may not be initialized

    und hier mein code:
    int main()
    {int x;cin>>x;trying(0,x)}
    void trying(int i,int n)
    {static int s[n]={0},d1[n*n-1]={0},d2[n*n-1]={0},d[n];}

    was hab ich falsch gemacht?

    danke im voraus



  • Dimensionen von statischen Arrays müssen konstante Ausdrücke sein. Das heisst, ihr Wert muss bereits zur Kompilierzeit feststehen (z.B. durch ein Literal, eine const -Variable, die mit einem konstanten Ausdruck intialisiert wurde, ein Enumerator, ein Resulat von sizeof , ein Templateparameter).

    Bitte mach den Code nächstes Mal lesbarer, auch [cpp]-Tags helfen dabei. 😉



  • Du kannst die Anzahl der Elemente von s nicht mit einer Variablen (n) angeben. Dazu musst du dynamisch Speicher anfordern mit new.

    P.S.: Bitte cpp-Tags benutzen.

    P.P.S.: Arbeite an deinem Stil! Dieses enge Zusammenklatschen ist wirklich grauenhaft...



  • int main()
    {
       int x;
       cin>>x;
       trying(0,x)
    }
    
    void trying(int i,int n)
    {
       static int s[n]={0},d1[n*n-1]={0},d2[n*n-1]={0},d[n];
    }
    

    Erstmal muss die Array-Groesse von s zur Laufzeit bekannt sein. Wenn das nicht bestimmbar ist brauchst du ein dynamisches Array:

    static int* s = new int[n];
    

    Bdenke hier jedoch, dass du den Speicher auch wieder freigeben musst; ansonsten empfiehlt sich std-Container zu nutzen.

    Desweiteren muss vor main noch eine Funktionsdeklaration in dieser Form stehen:

    void trying(int,int);
    

    Ausserdem hast du in main ein Semikolon nach dem Aufruf von trying vergessen.

    Auf deine Formatierung solltest du auch besser achten, dein Code ist naemlich sehr schlecht lesbar. Und bitte beim naechsten mal CPP-Tags benutzen.

    Gruss
    Cartman



  • okay...das mit der darstellung des codes war nur ein grober entwurf, der die wichtigen aussagen beinhaltet.

    nur zur vervollständigung der ganze code:

    #include<stdlib.h>
    #include<iostream>
    #include<iomanip>
    using namespace std;
    void print(const int *,int);
    void trying(int,int);
    int main()
    {
        int x;
        cout<<"Lösung des n-Damen-Problems"<<endl<<endl;
        cout<<"Bitte geben Sie ]n[ an: ";
        cin>>x;
        cout<<"Die Loesungen des "<<x<<"-Damen-Problems"<<endl;
        trying(0,x);
    }
    
    void trying(int i,int n)
    {  static int   spalte[n]={0},
                    d1[n*n-1]={0},
                    d2[n*n-1]={0},
                    dame[n];                                                    // Feld fuer die n Damen
       for (int k=0; k<n; k++)
          if (spalte[k]==0 && d1[i+k]==0 && d2[i-k+(n-1)]==0)
          {                                                                     // Dame ist setzbar
              dame[i] = k;                                                      // Dame ist gesetzt
              spalte[k] = d1[i+k] = d2[i-k+(n-1)] = 1;
              if (i < (n-1))
                 trying(i+1);                                                   // Rekursion
              else
                 print(dame);
              spalte[k] = d1[i+k] = d2[i-k+(n-1)] = 0;}}
    
    void print(const int *dame,int n)
    {  static int anzahl = 0;int k;
       cout<<"Lsg."<<setw(2)<<++anzahl<<"  ";
       for (k=0; k<n; k++)
          cout<<setw(3)<<dame[k]+1;                                             // +1, um nicht von 0 an zu zaehlen
       cout << (anzahl%2 == 1) ? "         " : "\n";
    }
    

    und nochmal danke für die antworten



  • 1. Die Formatierung ist teilweise immernoch graesslich

    2. Hast du die vorherigen Beitraege ueberlesen?

    3. Ich sehe zwei Funktionen mit jeweils zwei Parametern. In trying versuchst du die Funktionen aber mit nur einem Parameter aufzurufen.

    Gruss
    Cartman



  • Ich bin ma nicht so und korrigiere zumindest das offensichtliche ^^

    #include <cstdlib> //
    #include <iostream>
    #include <iomanip>
    
    using namespace std;
    
    void print(const int *, int); //parameternamen wären echt hilfreich - auch, wenn sie nicht pflicht sind, sollte man sie doch _immer_ mitschreiben
    void trying(int, int); // ---- "" ----
    
    int main() 
    { 
        int x; 
        cout<<"Lösung des n-Damen-Problems"<<endl<<endl; 
        cout<<"Bitte geben Sie ]n[ an: "; 
        cin>>x; 
        cout<<"Die Loesungen des "<<x<<"-Damen-Problems"<<endl; 
        trying(0,x); 
    } 
    
    void trying(int i,int n) 
    {
      int *spalte = new int[n]; // etc - so, wie du das gemacht hattest, geht das nich - aber das wurde dir hier schon erklärt...
    
    /*etc - das sieht mir zu grässlich aus, sry...*/
    
       for (int k=0; k<n; k++) 
          if (spalte[k]==0 && d1[i+k]==0 && d2[i-k+(n-1)]==0) //sieht echt voll übersichtlich aus, oder!? :D mal davon abgesehen, dass es bestimmt falsch ist ^^
    
      delete[] spalte;
    }
    
    void print(const int *dame,int n) 
    {
       int anzahl = 0;
    
       cout << "Lsg." << setw(2) << ++anzahl << "  ";
    
       for (int k=0; k<n; k++) 
          cout << setw(3) << dame[k];  // +1, um nicht von 0 an zu zaehlen - ich seh nirgendwo ne +1 :P
    
       cout << (anzahl%2) ? "         " : "\n"; //
    }
    

    sag einfach ma, wie die aufgabenstellung (genau) war - da du zumindest gezeigt hast, dass du dich damit beschäftigt hast, könnte man dir ja auch ein ganz klein wenig helfen ^^
    ab und an steht da ja was von rekursiv oder eben gerade nicht - und das ausgeben versteh ich auf anhieb auch nich ^^

    bb



  • also die aufgabe war folgend gestellt:

    """""
    Verallgemeinern Sie das Achtdamen-Problem, und lösen Sie das N-Damenproblem mit n
    größer 4 und kleiner gleich 20. Im Programm wird die Zahl n angefordert. Es erfolgt eine Überprüfung auf Korrektheit.
    Mit Hilfe der Rekursion wird die Aufgabe gelöst, die Lösungen werden auf cout ausgegeben. Zusätzlich erfolgt eine grafische Ausgabe.
    """""

    der pseudo-code wurde halt in der vorlesung erklärt. damit hab ich auch das 8-Damen-Problem gelöst(setze n=8).
    jetzt versuche ich es so zu gestalten, dass es halt mit einer beliebigen eingabe funzt.

    P.S: was habts ihr alle mit meiner schreibweise für problemme. das ist doch nachvollziehbar,
    dass ich bei der deklaration der variablen alles in eine zeile schreibe.
    und wenn einer den algorithmus nicht versteht, da kann ich nach jedem wort ein enter machen und er checkt es sowieso nicht.



  • 13maxwell13 schrieb:

    P.S: was habts ihr alle mit meiner schreibweise für problemme

    Du wirst Dein eigenes Programm in einem halben Jahr nicht mehr verstehen.



  • okay...gutes argument

    aber wie soll man dieses übersichtlicher hinschreiben???

    if (spalte[k]==0 && d1[i+k]==0 && d2[i-k+(n-1)]==0) //sieht echt voll übersichtlich aus, oder!? :D mal davon abgesehen, dass es bestimmt falsch ist ^^
    

    [von unskilled]

    belehre mich meister^^



  • 13maxwell13 schrieb:

    okay...gutes argument

    aber wie soll man dieses übersichtlicher hinschreiben???

    if (spalte[k]==0 && d1[i+k]==0 && d2[i-k+(n-1)]==0) //sieht echt voll übersichtlich aus, oder!? :D mal davon abgesehen, dass es bestimmt falsch ist ^^
    

    [von unskilled]

    belehre mich meister^^

    Also ich sehe da erstmal keien Übersichtlichkeitsprobleme, generell ist bei solchen vergleichen aber ein Kommentar hilfreich was man damit eigentlich bezweckt, und für Komplexere Vergleiche oder Berechnungen kann, und sollte man, der übersichtlichkeit halber den Inhalt Vorberechnen oder änliches um das ganze etwas übersichtlicher zu gestalten.



  • if ((!spalte[k]) && (!d1[i+k]) && (!d2[i-k+(n-1)]))
    

    Und noch nen Kommentar hinzu - abgesehen davon glaube ich noch immer nicht, dass es richtig wäre, aberich bin ehrlich gesagt zu faul, mir anzugucken, ob es nun doch stimmt ^^

    Na dann fangen wir mal mit deiner Aufgabe an ^^

    Verallgemeinern Sie das Achtdamen-Problem, und lösen Sie das N-Damenproblem mit n
    größer 4 und kleiner gleich 20. Im Programm wird die Zahl n angefordert. Es erfolgt eine Überprüfung auf Korrektheit.
    Mit Hilfe der Rekursion wird die Aufgabe gelöst, die Lösungen werden auf cout ausgegeben. Zusätzlich erfolgt eine grafische Ausgabe.

    n ist also zwischen 4 und 20 - damit brauchen wir kein new und deshalb auch kein delete...
    Nur nen paar globale Variablen, weils sonst zu chaotisch mit dem weitergeben wird ^^ Und bevor jmd anfängt mit flamen, weil man ja immer davon abrät: ich denke, es ist hier durchaus vertretbar...

    hier wäre zumindest nen hübscheres grundgerüst:

    #include <cstdlib>
    using std::size_t; //ein positiver integer
    
    const size_t n_max = 20;
    const size_t n_max_square = n_max*n_max;
    
    bool feld[n_max_square]; //zugriff auf [x][y] durch [x*n+y]
    
    int main()
    {
      size_t n;
      std::cin >> n;
    
      /*siehe faq zum console schließen verhindern*/
    }
    

    bb



  • size_t ist doch nicht im std-Namensraum, oder irre ich mich> Ich musste jedenfalls beim MSVC noch nie size_t bekannt machen.

    P.S.: Wieso nicht objektorientiert loesen? 🙂

    Gruss
    Cartman



  • Eric Cartman schrieb:

    size_t ist doch nicht im std-Namensraum, oder irre ich mich> Ich musste jedenfalls beim MSVC noch nie size_t bekannt machen.

    es steht so im standard, auch wenn ich es nicht gerade sinnvoll finde -.-
    ich hab jedenfalls in meiner config immer nen #include <cstdlib> und using std::size_t stehen - so ist es im standard wie gesagt imho auch beschrieben...

    Eric Cartman schrieb:

    P.S.: Wieso nicht objektorientiert loesen? 🙂

    weil er vermutlich keinen plan von klassen usw hat - es geht (vermutlich) darum, nen algorithmus in ner programmiersprache zu implementieren - und hier braucht man weder ein new noch ein class noch was weiß ich nich ^^
    wäre mir neu, wenn es bei so nen aufgaben darum geht, c++ perfekt zu verwenden...

    bb


Anmelden zum Antworten