PHP Forum - Coding Board
Juli 18, 2018, 08:52:14 *
Willkommen Gast. Bitte einloggen oder registrieren.

Einloggen mit Benutzername, Passwort und Sitzungslänge
News:
 
   Übersicht   Hilfe Suche Einloggen Registrieren  
Seiten: [1]
  Drucken  
Autor Thema: [C++] Wo ist der Fehler ?  (Gelesen 141 mal)
0 Mitglieder und 1 Gast betrachten dieses Thema.
<ComManD>
Newbie
*
Beiträge: 21


Profil anzeigen E-Mail
« am: Juli 14, 2009, 11:16:07 »

CODE]Bestimmen sie die Primfaktorzerlegung einen beliebigen Zahl (z.B. 200 = 2*2*2*5*5)[/CODE]Da hab ich mich dann eine viertel Stunde rangesessen und folgendes Programm ausgearbeitet:
Code:
//misc_tests.cpp

#include
#include
#include
using namespace std;

bool prime(int kandidat)                        //Es wird ein Primzahlenkandidat übergeben,
    {
        for(int kan = 2;kan        {
            if((kandidat % kan) == 0)            //dieser Das Kreterium erfüllt nur durch sich und durch 1 teilbar zu sein
            {
                return false;                    //wenn er dann doch durch eine andere Zahl teilbar ist dann wird die Methode beendet
            }                                    //mit einem Rückgabetyp von false
        }
        return true;                            //wenn doch durch nichts au?er sichselbst und eins teilbar ist dann wird true zurrückgeliefert
    }

int main()
{
    int zahl;
    int primes[999];                                            //hier wird ein Array von Integers mit 0 initialisiert
    for(int i = 0; i<=999; i++)                                    //indem später die Primzahl gespeichert werden
    {
        primes[i] = 0;
    }

   
   
    for(int i = 2; i <= 1000; i++)
    {
        if(prime(i))
        {
            for(int j = 0; primes[j-1] != i; j++)                //mit dieser Kette von Schleifen und Bedingungen soll geprüft werden
            {
                if(primes[j] == 0)                                //ob eine Zahl eine Primzahl ist und wird falls sie eine ist ins Array gespeichert
                {
                    primes[j] = i;
                }
            }
        }
    }
   

    cout << "Geben sie eine Zahl ein die in ihre Primfaktoren zerlegt werden sollt : ";
    cin >> zahl;

    if(zahl > 1000)
    {
        do
        {
            cout << "\nWahelen sie eine Zahl die kleiner als 1000 ist :";
            cin >> zahl;

        }while(zahl > 1000);
    }

    cout << endl << endl << zahl << " = ";

    do
    {
        for(int i = 0; i < 1000; i++)
        {
           
            if((zahl % primes[i]) == 0)                            //mit diesem Komplex wird versucht nacheinander die zahl durch eine Primzahl zu teilen
            {
                zahl /= primes[i];                                //und nachdem die zahl sich ohne Rest durch eine Primzahl teilen lässt
                cout << primes[i];                                //wird zahl neu difniert mit zahl = zahl / primzahl und die Primzahl wird ausgegeben
                break;
            }
       
        }
        if(zahl != 1)                                            //diese Prozedur muss natürlich nur solange gemacht werden bis die Zahl nurnoch 1 ist
        {
            cout << "*";    
        }
    }while(zahl != 1);

    return(0);
}
(Nicht durch die vielen Includes verwirren lassen, die stammen noch von voriegen Aufgaben)
So das Problem ist folgendes: Das Programm funktioniert jetzt soweit, aber nach der Ausgabe der Primzahlenfaktoren, gibt es eine Laufzeitfehlermeldung mit:

Run-Time Check Failure #2 - Stack arround the variable 'primes' was corrupted.

Was mach ich falsch ?

EDIT: Ich habe jetzt mal die Source kommentiert damit ihr euch nur damit ihr mir helft nicht erstmal komplett durch die Source durchdenken müsst =
Code:
Bestimmen sie die Primfaktorzerlegung einen beliebigen Zahl (z.B. 200 = 2*2*2*5*5)
Da hab ich mich dann eine viertel Stunde rangesessen und folgendes Programm ausgearbeitet:
Code:
//misc_tests.cpp

#include
#include
#include
using namespace std;

bool prime(int kandidat)                        //Es wird ein Primzahlenkandidat übergeben,
    {
        for(int kan = 2;kan        {
            if((kandidat % kan) == 0)            //dieser Das Kreterium erfüllt nur durch sich und durch 1 teilbar zu sein
            {
                return false;                    //wenn er dann doch durch eine andere Zahl teilbar ist dann wird die Methode beendet
            }                                    //mit einem Rückgabetyp von false
        }
        return true;                            //wenn doch durch nichts au?er sichselbst und eins teilbar ist dann wird true zurrückgeliefert
    }

int main()
{
    int zahl;
    int primes[999];                                            //hier wird ein Array von Integers mit 0 initialisiert
    for(int i = 0; i<=999; i++)                                    //indem später die Primzahl gespeichert werden
    {
        primes[i] = 0;
    }

   
   
    for(int i = 2; i <= 1000; i++)
    {
        if(prime(i))
        {
            for(int j = 0; primes[j-1] != i; j++)                //mit dieser Kette von Schleifen und Bedingungen soll geprüft werden
            {
                if(primes[j] == 0)                                //ob eine Zahl eine Primzahl ist und wird falls sie eine ist ins Array gespeichert
                {
                    primes[j] = i;
                }
            }
        }
    }
   

    cout << "Geben sie eine Zahl ein die in ihre Primfaktoren zerlegt werden sollt : ";
    cin >> zahl;

    if(zahl > 1000)
    {
        do
        {
            cout << "\nWahelen sie eine Zahl die kleiner als 1000 ist :";
            cin >> zahl;

        }while(zahl > 1000);
    }

    cout << endl << endl << zahl << " = ";

    do
    {
        for(int i = 0; i < 1000; i++)
        {
           
            if((zahl % primes[i]) == 0)                            //mit diesem Komplex wird versucht nacheinander die zahl durch eine Primzahl zu teilen
            {
                zahl /= primes[i];                                //und nachdem die zahl sich ohne Rest durch eine Primzahl teilen lässt
                cout << primes[i];                                //wird zahl neu difniert mit zahl = zahl / primzahl und die Primzahl wird ausgegeben
                break;
            }
       
        }
        if(zahl != 1)                                            //diese Prozedur muss natürlich nur solange gemacht werden bis die Zahl nurnoch 1 ist
        {
            cout << "*";    
        }
    }while(zahl != 1);

    return(0);
}
(Nicht durch die vielen Includes verwirren lassen, die stammen noch von voriegen Aufgaben)
So das Problem ist folgendes: Das Programm funktioniert jetzt soweit, aber nach der Ausgabe der Primzahlenfaktoren, gibt es eine Laufzeitfehlermeldung mit:

Run-Time Check Failure #2 - Stack arround the variable 'primes' was corrupted.

Was mach ich falsch ?

EDIT: Ich habe jetzt mal die Source kommentiert damit ihr euch nur damit ihr mir helft nicht erstmal komplett durch die Source durchdenken müsst =)
« Letzte Änderung: Juli 14, 2009, 12:01:09 von <ComManD> » Gespeichert
MrWellKnown
Newbie
*
Beiträge: 17


Profil anzeigen E-Mail
« Antworten #1 am: Juli 14, 2009, 12:48:51 »

Also bei mir gibts keinen Error. Hast du im Release-Modus kompiliert? Wenn nicht, dann tu das. ;p

// btw hab gerade mitn Debugger geschaut, liegt an deiner Arraysize von "primes". C++ fängt bei 0 an zu zählen, deshalb zählt deine for-schleife einen "primes" zuviel, sprich kann nicht darauf zugreifen. Einfach Arraysize von "primes" um 1 erhöhen.

int primes[1000];
« Letzte Änderung: Juli 14, 2009, 12:55:51 von MrWellKnown » Gespeichert
<ComManD>
Newbie
*
Beiträge: 21


Profil anzeigen E-Mail
« Antworten #2 am: Juli 14, 2009, 01:35:09 »

Oh danke du hast recht, ich seh jetzt erst geade das ich bei vielen for schleifen immer verschiedene Bedingungen gegeben habe bei denen aufgehört werden soll, ich habe jetzt mal  alle for Bedingungen auf i < 999 gelegt, jetzt gibts auch keinen Fehler mehr thx:)
Gespeichert
Nop0x90
Full Member
***
Beiträge: 197


541820
Profil anzeigen E-Mail
« Antworten #3 am: Juli 14, 2009, 02:29:30 »

Wie kommt man von "Array size incorrect" oder so auf
Zitat
Run-Time Check Failure #2 - Stack arround the variable 'primes' was corrupted.

ich wette du benutzt visual Fehlermeldunggenerator.
Guck dir mal Code::Blocks mit mingw an Smiley
Gespeichert

greetz Nop (ehem. Av0c4d0)
-Coding & RE


Seiten: [1]
  Drucken  
 
Gehe zu:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines | New Look by Nolt Prüfe XHTML 1.0 Prüfe CSS