Arrayeintrag einer Variablen zuweisen



  • Hallo!
    Als C++-Anfänger stehe ich gerade vor einem Problem mit einem Array.
    Ich habe einen Array
    double t[3][3];
    mit Einträgen -1 und 1

    und einen vektor
    int vektor[4];

    Erreichen würde ich gern die Ausgabe von

    int k=0;
    for (i=0; i<4; i++)
    for (j=0; j<4; j++){
    if (t[vektor[i]][[vektor[j]]==t[2][1]) k= k+1;}

    und außerdem wäre es toll zu wissen, wie ich z.b.
    double s=0;
    s= t[2][1];

    hinkriegen könnte, bzw wo der Fehler liegt. Kompilieren geht, aber bei der Ausgabe kriege ich immer ne Fehlermeldung. Ausgeben über cout geht alles, nur wie kann ich die ausgegebenen t[][] Werte in einer Variablen abspeichern?

    Vielen Dank schonmal, ich hoffe ich habe es einigermaßen verständlich formuliert! 🙂



  • Oh, habe ganz vergessen, dass in dem Vektor natürlich Werte zwischen 0 und 2 stehen.



  • #include <iostream>
    
    int main()
    {
        using namespace std;   
        double t[3][3];
        int vektor[4];
    
        for (int i = 0; i < 3; i++)
            for (int j = 0; j < 3; j++)
                t[i][j] = i * j;
    
        for (int i = 0; i < 4; ++i)
            vektor[i] = 1;
    
        int k = 0;    
    
        for (int i = 0; i < 4; i++)
            for (int j = 0; j < 4; j++)
            {
                if (t[vektor[i]][vektor[j]] == t[2][1]) 
                {
                    k = k + 1;
    
                }
            }
        double s = 0;                
        s= t[2][1];
    
        cout << "s = " << s << "\n";
        cout << "k = " << k << "\n";
    
        std::cin.get();
        return 0;
    }
    

    Bei mir funktioniert das alles. Vielleicht gibst du mal ein vernünftiges vollständiges Beispiel und sagst was dieses Beispeil für einen Fehler verursacht.



  • Hast du jedem Element von vektor was Sinnvolles zugewiesen?

    und außerdem wäre es toll zu wissen, wie ich z.b.
    double s=0;
    s= t[2][1];

    hinkriegen könnte, bzw wo der Fehler liegt.

    Du kannst das als

    double s = t[2][1];
    

    schreiben, aber fehlerhaft ist das nicht.

    Achja: Vergleichen von double mit irgendwas (double, int) kann ganz schön ins Auge gehen. Das wird aber sicher noch in deinem Buch kommen.



  • brotbernd schrieb:

    Bei mir funktioniert das alles.

    Nö, bei i = j = 3 ist t[vektor[i]][vektor[j]] dasselbe wie t[3][3] , was ein Speicherzugriffsfehler ist.



  • äh ja, das war jetzt natürlich blöd sorry 🙄
    Aber es zeigt, dass man zu einem vollständigen Beipsiel sofot etwas richtiges sagen kann 😉



  • Michael E. schrieb:

    Achja: Vergleichen von double mit irgendwas (double, int) kann ganz schön ins Auge gehen. Das wird aber sicher noch in deinem Buch kommen.

    Was nehme ich denn dann besser statt double, wenn ich -1 und 1 als mögliche Werte habe?

    Und zu dem Beispiel oben: Das klappt bei mir fehlerfrei.
    Ich poste gleich nochmal mein konkretes Beispiel, was sich ja wie gesagt kompilieren lässt, aber nicht weiter.. Kleinen Moment. 🙂



  • Vanilla schrieb:

    Was nehme ich denn dann besser statt double, wenn ich -1 und 1 als mögliche Werte habe?

    Wie wärs mit int? 😉



  • #include<iostream>
    #include<cmath>
    #include<cstdlib> 
    #include <ctime>
    #include <vector>
    
    using namespace std;
    
    int main() 
    {int n=3;
    float beta;
    beta=0.25;
    
    int Zaehler;
    Zaehler=0;
    
    int minn =0;
    int maxx=2;
    int maxx2=100;
    int irandom, jrandom;
    double u;
    
    std::srand(time(NULL));
    
    jrandom=minn + rand()%(maxx-minn+1);
    irandom=minn + rand()%(maxx-minn+1);
    u= (double)rand()/RAND_MAX;
    
    int K= 1000;
    
    int i[K];  
    int j[K];
    float z1[K];
    float z2[K];
    for (int l=0; l<K; l++)
    {i[l]=0;
    j[l]=0;
    }
    
    int s[n][n];
    int t[n][n];
    
    for (int l=0; l<n; l++)      
    {for (int h=0; h<n; h++)
    {t[l][h]=-1;
    s[l][h]=1;
    }}
    
    Anfang: 
    jrandom=minn + rand()%(maxx-minn+1);
    irandom=minn + rand()%(maxx-minn+1);
    u= (double)rand()/RAND_MAX;
    i[Zaehler]= jrandom;  
    j[Zaehler]=irandom;
    z1[Zaehler]=u;
    
    int vek1[4], vek2[4];    
    
    for (int l=0; l<4; l++)
    {vek1[l]=0;
    vek2[l]=0;
    }
    
    while (Zaehler >=0){
    
    		int Nz=0;
    
       for (int l=0;l<n;l++)
       {for (int h=0;h<n;h++)
    		   if( abs(i[Zaehler]-l)+abs(j[Zaehler]-h)== ((1) % (n*n)))
    	   {vek1[Nz]=l;
    		vek2[Nz]=h;
    		Nz=Nz+1;		
    }}
     Zaehler--;}
    
    int GN=0;
    int GN2=0;
      int v = i[Zaehler];
      int w = j[Zaehler];
    int ss = t [v][w];
    
    for (int l=0;l<4;l++){ int g = vek1[l]; 
    					   int f = vek2[l];
    					   cout << t[g][0];
    					   if (t[g][f]==t[v][w])  {GN=GN+1;} 
    }
    
    float UU=1/(1+ exp(-beta * (8-4*GN)));
    if (z1[Zaehler]< UU) 
    {
    	t[v][w]=1;
    }
    else
    {
       t[v][w]=-1;
    }
    
    cout << "GN = " << GN;
    }
    

    Das ist mein Code, der bis einschließlich float UU prima läuft, sich danach noch kompilieren lässt, aber ne Windows-Fehlermeldung hervorruft.



  • Oh... ich glaube ich habs selbst gefunden... Mit u als float geht es. Sorry, aber danke! (Hoffe ich komme nicht gleich wieder mit der nächsten Sache.)



  • int GN=0;
    int GN2=0;
      int v = i[Zaehler];
      int w = j[Zaehler];
    int ss = t [v][w];
    
    for (int l=0;l<4;l++){ int g = vek1[l]; 
    					   int f = vek2[l];
    					   cout << " t ist "<<s[g][0]<<" s ist "<<t[g][0];
    					   if (s[g][f]==s[v][w])  {GN=GN+1;} 
     if (t[g][f]==t[v][w])  {GN2=GN2+1;} 
    }
    
    float UU=1/(1+ exp(-beta * (8-4*GN)));
    float UUU;
    // UUU = 5;
    

    Ich hatte ja gehofft nicht nochmal schreiben zu müssen, aber das ist höchst merkwürdig.
    Das da oben drangehängt an das vorherige geht wunderbar. Wenn ich jetzt nur noch UUU=5; ohne Kommentarstriche hinterherhänge lässt es sich wieder kompilieren, aber es kommt diese mysteriöse Windows-Fehlermeldung. Ist das Programm dann zu groß? Wie kann das sein?



  • Ich hoffe, dass ich nicht nerve, aber nur um den Thread noch einmal kurz hochzuholen, falls meine letzte Frage (einen Post hierüber) übersehen wurde: Hat jemand irgendeine Idee, was da dahinter stecken könnte?

    Auch wenn nicht vielen Dank für die Hilfe, ich bin doch um einiges weiter gekommen!



  • Die Zeile UUU = 5 ist kein Fehler. Das Wahrscheinlichste ist wohl, dass du irrtümlicherweise auf ne andere Variable zugreifst, die nicht mehr existiert und an derselben Speicherstelle war.

    Reduziere deinen Code ein bisschen und schaue, ob der Fehler immer noch da ist. Wenn ja: Reduziere deinen Code nochmal etc. Damit wirst du den Fehler relativ gut eingrenzen können. Wenn nicht, kannst du ein Minimalbeispiel nochmal komplett posten (in Code-Tags).



  • Ich würde dir diesen Artikel mal ans Herz legen, wenn du unbedingt C weiter programmieren willst. Alternativ wäre es vielleicht keine schlechte Idee die Möglichkeiten von C++ auszuschöpfen, auch wenn einige der Meinung sind dadurch würde das Programm untragbar langsam.

    http://duma.sourceforge.net/74_75_76_77_78_Debugging_DE.pdf


Log in to reply