Vektorproblem



  • ich mach grad was mit Vektoren und anscheinend habe ich etwas falsch gemacht mit ihnen (es kommt immer die fehlermeldung: vector subscript out of range (Vektorindex außerhalb des gültigen Bereichs)). hier mein code:

    #include <vector>
    #include <fstream>
    #include <stdlib.h>
    #include <ctime>
    using namespace std;
    
    long potenz(long basis, int exponent) 
    { 
    ...  
    } 
    
    bool solovay_strassen_test(long n)
    {
    	long counter = 0, hilfe, h, loop = 1, b, x = 0, y, z; 
    	int prim_true = 0;
    	bool prim = false;
    	vector<long>a; // Zufallszahl
    
    	do 
    	{
    		srand( ( unsigned ) time ( NULL ) );
    		a.push_back(rand () % n);
    
    		while (a[loop] != 0)
    		{
    			h = a[loop] % n;
    			a[loop] = n;
    			b = h;
    			a[loop] = x;
    		}
    		if (x == 1)
    		{
    			y = (a[loop] / n) % n;
    			z = potenz(a[loop], (n-1) / 2) % n;
    
    			if (y == z)
    			{
    				++prim_true;
    			}
    		}
    
    		++loop;
    
    	} while (prim_true < 3 || loop <= 5);
    
    	if (loop - prim_true < loop / 2)
    	{
    		return true;
    	}
    
    	else
    	{
    		return false;
    	}
    }
    

    vielleicht könnte mir jemand sagen / ein tip geben , was ich falsch gemacht habe 😃


  • Mod

    In vielen Programmiersprachen beginnt man mit dem Zählen bei 0. Auch in C++. Das erste Element deines Vektors a ist a[0]. Daher greifst du im ersten Durchgang bei a[loop] auf ein nicht exisiterendes Element zu (loop ist am Anfang 1).

    P.S.: Dein Code sieht aber auch sonst falsch aus.
    P.P.S.: Das srand willst du wahrscheinlich vor der Schleife haben.



  • mir ist grad aufgefallen, ich hab eh die hälfte vergessen

    hier der rest:

    int main()
    {
    	long mittelzahl, loop;
    	bool s;
    	vector<long>primzahl;
    	cout << "Welche Zahl soll die Mittelzahl bzw. trenner sein?" << endl;
    	cin >> mittelzahl;
    
    	// Mittelzahltest
    
    	// erste Primzahl
    
    	for (loop = 2; loop < mittelzahl; ++loop)
    	{
    		s = solovay_strassen_test(loop);
    		if (s = true)
    		{
    			primzahl.push_back(loop);
    		}
    	}
    	return 0;
    }
    

    was meinst du mit der code sieht falsch aus??
    das andere hat geklappt aber jetzt passiert nichts wenn ich es ausführe



  • das andere hat geklappt aber jetzt passiert nichts wenn ich es ausführe

    Kann nicht sein... die Frage ist was passiert und was passieren soll...
    Also?


  • Mod

    Gucky schrieb:

    was meinst du mit der code sieht falsch aus??

    Ich sag's mal so: Wenn ich so etwas sehe:

    long counter = 0, hilfe, h, loop = 1, b, x = 0, y, z;
        int prim_true = 0;
        bool prim = false;
    

    Oder sowas:

    do
        {
            srand( ( unsigned ) time ( NULL ) );
    

    Oder dies:

    if (loop - prim_true < loop / 2)
        {
            return true;
        }
    
        else
        {
            return false;
        }
    

    Oder doppelt schlimm dies( ⚠ guck dir dies mal genauer an):

    if (s = true)
            {
                primzahl.push_back(loop);
            }
    

    Also wenn ich so etwas sehe, dann gibt mir das kein Vertrauen in den Code. Ich weiß dann aus Erfahrung, dass so schlechter Code auch meistens falsch ist.



  • wenn ich in die if-bedingung direkt die funktion reinschreibe, kommt die fehlermeldung, es muss ein änderbarer lvalue sein, wenn du das meinst.



  • = ist eine Zuweisung, == ein Vergleich!



  • sry ist mir auch grad aufgefallen

    großer denkfehler



  • Aus diesem Grund schreibe ich immer nur

    if ( s ) 
            { 
                primzahl.push_back(loop); 
            }
    

    Ist meiner Meinung nach genauso gut lesbar und es passiert einem nicht ein = anstatt einem == zu tippen.



  • Oberon_0 schrieb:

    = ist eine Zuweisung, == ein Vergleich!

    Zuweisungen sind so lahm... Bei Vergleichen giebt's alles doppelt! 🙄


Anmelden zum Antworten