Problem mit Programm!!!



  • Hallo, ich gehe in die 1. Klasse Oberstufe und habe ein programm geschrieben, das zwar ausführen geht, dann aber(nachdem zwei Zahlen eingebenen werden) mit der Fehlermeldung: "The variable 'ergebnis' is beeing used without initalized."
    ich habe sie aber initialisiert.
    ps: Das programm soll nach eingabe von 2 Zahlen, die sich in einem Koordinatensystem befinden, ausgeben, in welchem Quartal des Koordinatensystemes sich diese Zahl befindet.(oder auf welcher achse(x,y)).

    Hier noch der Source Code:

    ////////////////////////////////////////////////////////////////////////////////

    #include <stdio.h>
    #include <conio.h>

    int berechne(int,int,int);

    void main()
    {
    int posx,posy;
    int ergebnis;

    printf("Geben Sie die Koordinate fuer x ein: ");
    scanf_s("%d", &posx);

    printf("Geben Sie die Koordinate fuer y ein: ");
    scanf_s("%d", &posy);

    berechne(posx,posy,ergebnis);

    switch(ergebnis)
    {
    case 1:
    printf("\nDie eingegebene Koordinate liegt im 1. Teil");
    break;

    case 2:
    printf("\nDie eingegebene Koordinate liegt im 2. Teil");
    break;

    case 3:
    printf("\nDie eingegebene Koordinate liegt im 3. Teil");
    break;

    case 4:
    printf("\nDie eingegebene Koordinate liegt im 4. Teil");
    break;

    case 5:
    printf("\nDie eingegebene Koordinate liegt auf der x Achse");
    break;

    case 6:
    printf("\nDie eingegebene Koordinate liegt auf der y Achse");
    break;

    case 0:
    printf("\nDie eingegebene Koordinate liegt genau im Mittelpunkt");
    break;
    }

    getch();
    }

    int berechne(int posx, int posy, int ergebnis)
    {
    if(posx>0 && posy>0){
    ergebnis = 1;
    return ergebnis;}

    if(posx>0 && posy<0){
    ergebnis = 2;
    return ergebnis;}

    if(posx<0 && posy<0){
    ergebnis = 3;
    return ergebnis;}

    if(posx<0 && posy>0){
    ergebnis = 4;
    return ergebnis;}

    if(posx>0 && posy==0){
    ergebnis = 5;
    return ergebnis;}

    if(posx==0 && posy>0){
    ergebnis = 6;
    return ergebnis;}

    if(posx==0 && posy==0){
    ergebnis = 0;
    return ergebnis;}
    }

    ////////////////////////////////////////////////////////////////////////////////

    Danke



  • Dies ist als Warnung zu verstehen deinem Fall. Du kannst es einfach korrigieren indem du int ergebnis = 0; schreibst. Wichtig ist, dass deine main NICHT void main() heißen darf, sondern muss int main() sein!


  • Mod

    Dein Compiler hat natürlich Recht (in der Regel hat er das immer). Und Compilerwarnungen sind in 99% der Fälle auch Fehler, so auch hier. Das ergebnis in berechne hat nichts mit deinem ergebnis in main zu tun. Wenn du wissen willst, wie du machen kannst, dass berechne die Variable ergebnis in main ändern kann, such mal nach "call by reference".

    HighLigerBiMBam schrieb:

    Dies ist als Warnung zu verstehen deinem Fall. Du kannst es einfach korrigieren indem du int ergebnis = 0; schreibst. Wichtig ist, dass deine main NICHT void main() heißen darf, sondern muss int main() sein!

    Nein, das ist keine Warnung, sondern ein rechter Fehler. =0 zu schreiben behebt die Symptome, aber nicht den eigentlichen Fehler den ich oben beschreibe. Es ist daher auch eine schlechte Idee, Variablen einfach mal so mit einem willkürlichen Wert (z.B. 0) zu initialisieren. Dann bekommt man nämlich keine Warnung, wenn man die Initialisierung mit dem wirklich gewünschten Wert verschlampt hat.



  • Die Zeile

    berechne(posx,posy,ergebnis);
    

    tut nicht das, was du wahrscheinlich erwartest. In ergebnis steht nach Aufruf der Funktion nichts anderes drin als vorher, es bietet sich deshalb z.B. an:

    ergebnis=berechne(posx,posy,ergebnis);
    


  • Das hab ich übersehen, wegen fehlenden Code-Tags. Naja ich habe deinen Code so verändert, dass Call by Reference durchgeführt wird.

    #include <stdio.h> 
    #include <conio.h> 
    
    void berechne(int,int,int*); 
    
    int main() 
    { 
    int posx,posy; 
    int ergebnis; 
    
    printf("Geben Sie die Koordinate fuer x ein: "); 
    scanf_s("%d", &posx); 
    
    printf("Geben Sie die Koordinate fuer y ein: "); 
    scanf_s("%d", &posy); 
    
    berechne(posx,posy,&ergebnis); 
    
    switch(ergebnis) 
    { 
    case 1: 
    printf("\nDie eingegebene Koordinate liegt im 1. Teil"); 
    break; 
    
    case 2: 
    printf("\nDie eingegebene Koordinate liegt im 2. Teil"); 
    break; 
    
    case 3: 
    printf("\nDie eingegebene Koordinate liegt im 3. Teil"); 
    break; 
    
    case 4: 
    printf("\nDie eingegebene Koordinate liegt im 4. Teil"); 
    break; 
    
    case 5: 
    printf("\nDie eingegebene Koordinate liegt auf der x Achse"); 
    break; 
    
    case 6: 
    printf("\nDie eingegebene Koordinate liegt auf der y Achse"); 
    break; 
    
    case 0: 
    printf("\nDie eingegebene Koordinate liegt genau im Mittelpunkt"); 
    break; 
    } 
    
    getch(); 
    
    return 0;
    } 
    
    void berechne(int posx, int posy, int *ergebnis) 
    { 
    if(posx>0 && posy>0){ 
    *ergebnis = 1;} 
    
    if(posx>0 && posy<0){ 
    *ergebnis = 2;} 
    
    if(posx<0 && posy<0){ 
    *ergebnis = 3;} 
    
    if(posx<0 && posy>0){ 
    *ergebnis = 4;} 
    
    if(posx>0 && posy==0){ 
    *ergebnis = 5;} 
    
    if(posx==0 && posy>0){ 
    *ergebnis = 6;} 
    
    if(posx==0 && posy==0){ 
    *ergebnis = 0;} 
    }
    


  • @HighLigerBiMBam

    Danke jetzt geht es.

    Aber was bezwecken deine Veränderungen?



  • Das Ganze nennt sich Call by Reference. In der Funktion übergebe ich nun keinen Wert mehr, sondern die Adresse der Variablen. Diese Adresse kann ich dann innerhalb der Funktion ändern. Das ganze wird über Zeiger bewerkstelligt.

    Ich denke aber, dass ihr dies bislang nicht hattet. Vielleicht ist deshalb Wutz-Vorschlag besser geeignet, wobei du dann aber keine Variable Ergebnis an die Funktion übergeben musst.

    #include <stdio.h> 
    #include <conio.h> 
    
    int berechne(int,int); 
    
    int main() 
    { 
    int posx,posy; 
    int ergebnis; 
    
    printf("Geben Sie die Koordinate fuer x ein: "); 
    scanf_s("%d", &posx); 
    
    printf("Geben Sie die Koordinate fuer y ein: "); 
    scanf_s("%d", &posy); 
    
    ergebnis = berechne(posx,posy); 
    
    switch(ergebnis) 
    { 
    case 1: 
    printf("\nDie eingegebene Koordinate liegt im 1. Teil"); 
    break; 
    
    case 2: 
    printf("\nDie eingegebene Koordinate liegt im 2. Teil"); 
    break; 
    
    case 3: 
    printf("\nDie eingegebene Koordinate liegt im 3. Teil"); 
    break; 
    
    case 4: 
    printf("\nDie eingegebene Koordinate liegt im 4. Teil"); 
    break; 
    
    case 5: 
    printf("\nDie eingegebene Koordinate liegt auf der x Achse"); 
    break; 
    
    case 6: 
    printf("\nDie eingegebene Koordinate liegt auf der y Achse"); 
    break; 
    
    case 0: 
    printf("\nDie eingegebene Koordinate liegt genau im Mittelpunkt"); 
    break; 
    } 
    
    getch(); 
    
    return 0;
    } 
    
    int berechne(int posx, int posy) 
    { 
    int ergebnis;
    
    if(posx>0 && posy>0){ 
    ergebnis = 1;} 
    
    if(posx>0 && posy<0){ 
    ergebnis = 2;} 
    
    if(posx<0 && posy<0){ 
    ergebnis = 3;} 
    
    if(posx<0 && posy>0){ 
    ergebnis = 4;} 
    
    if(posx>0 && posy==0){ 
    ergebnis = 5;} 
    
    if(posx==0 && posy>0){ 
    ergebnis = 6;} 
    
    if(posx==0 && posy==0){ 
    ergebnis = 0;}
    
    return ergebnis;
    }
    


  • HighLigerBiMBam schrieb:

    Das Ganze nennt sich Call by Reference. In der Funktion übergebe ich nun keinen Wert mehr, sondern die Adresse der Variablen. Diese Adresse kann ich dann innerhalb der Funktion ändern.

    Man sollte noch dazuschreiben, dass diese Änderungen an der Zeigeradresse nur Auswirkungen auf die lokale Kopie des Zeigers haben, während sich Änderungen am Wert hinter dieser Adresse nicht auf die Funktion beschränken 🙂

    Edit: Und C hat kein Call By Reference, denn es wird im Falle von Zeigerparametern immer eine Kopie des Zeigers übergeben 😉


Anmelden zum Antworten