Funktionsaufruf, Ich finde den Fehler nicht.



  • Hey.

    Kann mir bitte jemand sagen was hier falsch gelaufen ist?

    void haeufigkeit_zaehlen(int array[], int haeufigkeit[], int anzahl_eingaben)
    {
    int i=0;
    int temp=0;
    int zaehler=1;
    int offset=1;
    
       do
        {
            temp=array[i]%array[i+offset]; // hier wird bei der Fehlersuche Makiert
    
            if (temp == 0)
            {
            zaehler++;
            offset++;
            continue;
            }
            else
            haeufigkeit[i]=zaehler;
    
        i++;
        offset=1;
        zaehler=1;
        }
        while (i != anzahl_eingaben+1);
    
     haeufigkeit[i+1]=0;//letzten array-wert 0 setzen
    
    }
    

    Der Compiler führt das Programm aus, an der Stelle an der die Funktion aufgerufen wird stürzt es ab. Die Fehler suche Gibt mir die beschriebene Stelle an, aber keinen Grund.

    Gruß
    Dennis



  • Was soll an der Stelle schief gehen? Entweder eine Dereferenzierung ist ungültig, oder du versuchst % 0. (Ersteres scheint mir allerdings wahrscheinlicher, weil er dir sonst etwas Vernünftiges sagen würde.)



  • Nutze den Debugger, dann findest du den Fehler ganz schnell und problemlos. Wenn du nicht weißt, was das ist, bringe es in Erfahrung. Du wirst dich wundern, wie einfach die Fehlersuche doch sein kann. 😉



  • Hallo 🙂
    Danke für die Antworten. Ich weis nicht was Dereferenzierung ist.
    Aus der Fehlersuche bin ich auch nicht schlauer gewurden:

    zaehler = ?
    offset = ?
    anzahl_eingaben = ?
    3
    2
    i = ?
    Could not watch this variable

    __________________________________

    Die Variablen sind doch global in der Funktion deffiniert und deklariert.. ;/

    Selbst, wenn ich sie eine Ebene nach vorn stelle ( über die funktion, über main (die funktion ist auch über main) ) und dann in der funktion deklariere funktioniert es nicht richtig.



  • Cannaroct schrieb:

    Selbst, wenn ich sie eine Ebene nach vorn stelle ( über die funktion, über main (die funktion ist auch über main) ) und dann in der funktion deklariere funktioniert es nicht richtig.

    Hört sich an als hättest du im Release Modus kompiliert.

    Dereferenzierung -> Auf den Speicher auf den ein Pointer zeigt zugreifen.

    array ist hier z.B. ein Pointer (Typ int *), und diesen dereferenzierst du mit den Klammern []. Wenn die Zahl in den Klammern aber zu groß wird, also so, dass du versuchst auf Speicherbereiche zuzugreifen, die gar nicht dir gehören, kannst du einen Fehler bekommen.



  • Cannaroct schrieb:

    Hey.

    Kann mir bitte jemand sagen was hier falsch gelaufen ist?

    void haeufigkeit_zaehlen(int array[], int haeufigkeit[], int anzahl_eingaben)
    {
       do
        {
            temp=array[i]%array[i+offset]; // hier wird bei der Fehlersuche Makiert
    
        }
        while (i != anzahl_eingaben+1);
    
    }
    

    Der Compiler führt das Programm aus, an der Stelle an der die Funktion aufgerufen wird stürzt es ab. Die Fehler suche Gibt mir die beschriebene Stelle an, aber keinen Grund.

    Gruß
    Dennis

    Hallo,

    der Compiler führt keine Programme aus. Er übersetzt nur.

    Das ist höchstwahrscheinlich ein klassischer Fall von Indexüberlauf.
    Prüfe:
    Wieviele Elemente hat das Array array?
    Welche Werte ergeben die Ausdrücke i und i+offset?

    Merke:
    Der Index beim Arrayzugriff darf niemals größer oder gleich der Anzahl der Elemente des jeweiligen Arrays sein und muß auch immer >= 0 sein.

    Möglicherweise ist es aber auch ein Divide By Zero error. Der Teilausdruck array[i+offset] darf nicht 0 sein.

    BTW.: Welchen Debuggger und/oder welches Betriebssystem benutzt Du denn, daß Dir nicht der Grund für die Exception genannt wird?

    mfg Martin



  • Argh. Bei meiner Antwort eben war ich nicht eingeloggt.. 😮 🙄

    Ich glaube es lag an der Deferenzierung,

    oder

    "Möglicherweise ist es aber auch ein Divide By Zero error. Der Teilausdruck array[i+offset] darf nicht 0 sein."

    Ich habe die Quotienten mal in Variabeln a und b gespeichert und mir dann alles anzeigen lassen. printf("\n\t%d = %d / %d", temp, a, b)
    Statt (bsp) 1=4/4, hatte ich 1954520 = 19546348/0... oder 0 = 0/1687946, also Adressen und Nullen. Also ein Problem mit der Deferenzierung und dadurch Devide By Zero error?

    Ich danke Euch allen! Schönes Wochenende 🙂

    So hat es funktioniert:

    void haeufigkeit_zaehlen(int array[], int haeufigkeit[], int anzahl_eingaben)
    {
    int i=0, offset=1, zaehler=1;
    
        do
        {
            if (array[i]==array[i+offset])  :+1: 
            {
            zaehler++;
            offset++;
            continue;
            }
            else
            haeufigkeit[i]=zaehler;
    
        i++;
        offset=1;
        zaehler=1;
        }
        while (i != anzahl_eingaben+1);
    
     haeufigkeit[anzahl_eingaben+1]=0;//letzten array-wert 0 setzen
    
    }
    


  • Ah das hatte ich vergessen:

    Devc++ unter Windows XP.

    ps: Das Programm ist mittlerweile 650 zeilen lang. ❤ it 🙂



  • Cannaroct schrieb:

    Ich habe die Quotienten mal in Variabeln a und b gespeichert und mir dann alles anzeigen lassen. printf("\n\t%d = %d / %d", temp, a, b)
    Statt (bsp) 1=4/4, hatte ich 1954520 = 19546348/0... oder 0 = 0/1687946, also Adressen und Nullen. Also ein Problem mit der Deferenzierung und dadurch Devide By Zero error?

    Gleich bei Deinem ersten Beispiel hattest Du eine verbotene 0. Natürlich ist das nicht erlaubt. x % 0 ergibt eine Divide by Zero Exception.

    Deine Lösung ist typisch für jemanden der die Wirkung bekämpft aber sich nicht für die Ursache interessiert.

    Klar hast Du jetzt keinen Divide By Zero mehr, aber Dein Programm macht jetzt auch was anderes. Vorher wurde geprüft ob array[i] ein Vielfaches von array[i+offset] ist. Jetzt prüfst Du ob es identisch ist.

    Wenn Du die fehlerhafte 0 bekommen hast, weil die Zeiger falsch waren, dann sind sie das immer noch. Du hast halt bis jetzt das Glück, daß deine Zeiger wenigstens auf gültigen Speicher verweisen, aber das ist möglicherweise Zufall.

    mfg Martin



  • Cannaroct schrieb:

    Ah das hatte ich vergessen:

    Devc++ unter Windows XP.

    ps: Das Programm ist mittlerweile 650 zeilen lang. ❤ it 🙂

    Bei einem so kleinen Programm, solltest Du doch den Fehler mit den falschen Zeigern leicht finden können.

    mfg Martin



  • Cannaroct schrieb:

    Argh. Bei meiner Antwort eben war ich nicht eingeloggt.. 😮 🙄

    Ich glaube es lag an der Deferenzierung,

    oder

    "Möglicherweise ist es aber auch ein Divide By Zero error. Der Teilausdruck array[i+offset] darf nicht 0 sein."

    Ich habe die Quotienten mal in Variabeln a und b gespeichert und mir dann alles anzeigen lassen. printf("\n\t%d = %d / %d", temp, a, b)
    Statt (bsp) 1=4/4, hatte ich 1954520 = 19546348/0... oder 0 = 0/1687946, also Adressen und Nullen. Also ein Problem mit der Deferenzierung und dadurch Devide By Zero error?

    Ich danke Euch allen! Schönes Wochenende 🙂

    So hat es funktioniert:

    void haeufigkeit_zaehlen(int array[], int haeufigkeit[], int anzahl_eingaben)
    {
    int i=0, offset=1, zaehler=1;
    
        do
        {
            if (array[i]==array[i+offset])  :+1: 
            {
            zaehler++;
            offset++;
            continue;
            }
            else
            haeufigkeit[i]=zaehler;
    
        i++;
        offset=1;
        zaehler=1;
        }
        while (i != anzahl_eingaben+1);
    
     haeufigkeit[anzahl_eingaben+1]=0;//letzten array-wert 0 setzen
    
    }
    

    Auch hier kann was nich stimmen wenn du eine eingabe wie a a a a a a a hast sollte offset so groß werden dass du aufjedenfall ein element aus dem array ziehst das es nicht gibt


Anmelden zum Antworten