Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 22

Thema: Warum geht das nicht :(

  1. #1
    Registered User
    Registriert seit
    Jan 2011
    Beiträge
    8
    Renommee
    -11

    Warum geht das nicht :(

    Code:
    #define MAX 4
    
    int funk3(int x[],int y)
    
    int main(void)
    {
    
    int count;
    int zahlen[MAX];
    
     for(count = 1;count < 4;count++)
               {         
                 printf("\nGeben Sie bitte die %d. Zahl ein\n",count);
                 scanf("%d",&zahlen[count]);
               }
               
                for(count = 1;count < 4;count++)
               {
                 printf("\n%d. Zahl = %d\n",count,zahlen[count]);
               }
              
              /*rueckgabewertfunk =*/ ;
               
               printf("\n%d ist die groesste Zahl\n",funk3(zahlen,MAX)); 
               system("Pause");
               system("Cls");
             
    return 0;
    } 
    
    
    
    
    int funk3(int x[],int y)
    {
        
        int *zgr1,*zgr2,*zgr3,*zgr4;
         zgr1 = &x[1];
         zgr2 = &x[2];
         zgr3 = &x[3];
         zgr4 = &x[4];
      
        
    printf("%d\n",*zgr1);
                       
    if(zgr1 > zgr2 && zgr1 > zgr3 && zgr1 > zgr4)
    return *zgr1;
    
    
    
    }

    Wenn das Programm aus der Funktion zurück in die main() springt wird der wert von x[1] nicht zurückgegeben.

    Es scheint als würde die if abfrage nicht funktionieren kriege die ganze Zeit 0 angegeben.

    // edit admin: code tags eingefügt.

  2. #2
    Moderator
    Nothing is unbreakable!

    Registriert seit
    Jul 2003
    Beiträge
    622
    Renommee
    819

    Re: Warum geht das nicht :(

    Versuchs mal so
    Code:
    if(*zgr1 > *zgr2 && *zgr1 > *zgr3 && *zgr1 > *zgr4)
    return *zgr1;
    else
    return -1;
    In der if() hast du die Adressen der Variablen verglichen, nicht deren Werte.
    Und Arrays fangen in C bei 0 an, nicht bei 1. Deine count Variable fängt aber immer bei 1 an zu zählen.

  3. #3
    Registered User
    Registriert seit
    Sep 2008
    Beiträge
    402
    Renommee
    270

  4. #4
    Registered User
    Registriert seit
    Jan 2011
    Beiträge
    8
    Renommee
    -11

    Re: Warum geht das nicht :(

    Danke erstmal für Antworten.

    wartet ich poste das ganze Programm hab es mal umgeschrieben,es hat 3 Funktionen die 3.te ist die Problem Funktion
    ich will es kompliziert haben, also ein array mit 3 elementen, die werte werden eingelesen,diese
    dann an die funktion übergeben dort soll die größte zahl ermittelt werden und diese dann wieder zurück gegeben werden. Also wenn jemand Zeit hat mir zu helfen ich bin wirklich froh darüber. Danke leute.

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    /*Funktionsdeklaration ========================================================= */
    void funk1(void);
    int funk2(void);
    int funk3(int x[]);
    
    #define MAX 4 
    /*===============================================================================*/
    int main (void)
    {   
        
        int zahlen[MAX],count;
        int rueckgabewertfunk;
        int auswahl;
        
        printf("Waehlen Sie Ihre Option aus.\n");
        printf("(1)Funktion ohne Rueckgabewert und ohne Parameterliste\n");
        printf("(2)Funktion mit Rueckgabewert ohne Parameterliste\n");
        printf("(3)Funktion mit Rueckgabewert und Parameterliste\n");
        printf("(4)Abbruch\n");
       
        scanf("%d",&auswahl);
       
        switch(auswahl)
        {
                       
             case 1:
             {
                  funk1();
                  break;
             }
             case 2:
             {
               rueckgabewertfunk = funk2();
               printf("\n%d ist die groesste Zahl\n",rueckgabewertfunk);
               system("Pause");
               system("Cls");
               main();
             }
             case 3:
             {
               for(count = 1;count < 4;count++)
               {         
                 printf("\nGeben Sie bitte die %d. Zahl ein\n",count);
                 scanf("%d",&zahlen[count]);
               }
               
                for(count = 1;count < 4;count++)
               {
                 printf("\n%d. Zahl = %d\n",count,zahlen[count]);
               }
              
              /*rueckgabewertfunk =*/ ;
               
               printf("\n%d ist die groesste Zahl\n",funk3(zahlen)); 
               system("Pause");
               system("Cls");
               main();
             }
             case 4:
             ;
             case 5:
             ;
             default:
             ;
        }
       
        getchar();
        
        return 0;
    }            
    
    
    /*======================================== Beginn der Funktionen ===============================================================*/
    void funk1(void) 
    {     
       int zahlen[4];        
       int count;
       
       system("cls");
       
       for(count = 1;count < 4;count++)
       {         
                 printf("\nGeben Sie bitte die %d. Zahl ein\n",count);
                 scanf("%d",&zahlen[count]);
       }
       
       for(count = 1;count < 4;count++)
       {
                 printf("\n%d. Zahl = %d\n",count,zahlen[count]);
       }
    
       if(zahlen[1] > zahlen[2] && zahlen[1] > zahlen[3] && zahlen[1] > zahlen[4])
       {
                    printf("\n%d ist die groesste Zahl\n",zahlen[1]);
       }
       if(zahlen[2] > zahlen[1] && zahlen[2] > zahlen[3] && zahlen[2] > zahlen[4])
       {
                      printf("\n%d ist die groesste Zahl\n",zahlen[2]);
       }
       if(zahlen[3] > zahlen[2] && zahlen[3] > zahlen[1] && zahlen[3] > zahlen[4])
       {
                      printf("\n%d ist die groesste Zahl\n",zahlen[3]);
       }
       if(zahlen[4] > zahlen[1] && zahlen[4] > zahlen[3] && zahlen[4] > zahlen[2])
       {
                      printf("\n%d ist die groesste Zahl\n",zahlen[4]);
       }
    
    printf("\n");
    system("PAUSE");
    system("Cls");
    
    main();
    }
    
    
    /*===================================================================funk 2=============================*/
    
    int funk2(void)
    {
     
       int zahlen[4];        
       int count;
       
       system("Cls");
       
       for(count = 1;count < 4;count++)
       {         
                 printf("\nGeben Sie bitte die %d. Zahl ein\n",count);
                 scanf("%d",&zahlen[count]);
       }
       
       for(count = 1;count < 4;count++)
       {
                 printf("\n%d. Zahl = %d",count,zahlen[count]);
       }
    
       if(zahlen[1] > zahlen[2] && zahlen[1] > zahlen[3] && zahlen[1] > zahlen[4])
       {
                    return zahlen[1];
       }
       if(zahlen[2] > zahlen[1] && zahlen[2] > zahlen[3] && zahlen[2] > zahlen[4])
       {
                      return zahlen[2];
       }
       if(zahlen[3] > zahlen[2] && zahlen[3] > zahlen[1] && zahlen[3] > zahlen[4])
       {
                      return zahlen[3];
       }
       if(zahlen[4] > zahlen[1] && zahlen[4] > zahlen[3] && zahlen[4] > zahlen[2])
       {
                      return zahlen[4];
       }
    
    printf("\n");
    system("PAUSE");
    system("Cls");
    
    main();  
    }
    
    /*==============================================funk3==========================================================*/
    
    int funk3(int x[])
    {
      
        
       
                       
      if(x[1] > x[2] && x[1] > x[3] && x[1] > x[4])
       {
                    return x[1];
       }
      if(x[2] > x[3] && x[2] > x[4] && x[2] > x[1])
       {
                    return x[1];
       }
      if(x[3] > x[4] && x[3] > x[2] && x[3] > x[1])
      {
                     return x[3];
      }
      if(x[4] > x[3] && x[4] > x[2] && x[4] > x[1])
      {
                     return x[4];
      }
      
      
    }
    Geändert von nait (09.06.2011 um 07:47 Uhr) Grund: Code Tags

  5. #5
    Registered User
    Registriert seit
    Sep 2008
    Beiträge
    402
    Renommee
    270

    Re: Warum geht das nicht :(

    Dir fehlen einfach die Grundlagen... lies dir mal das Kapitel im Openbook durch.

  6. #6
    Registered User
    Registriert seit
    Jan 2011
    Beiträge
    8
    Renommee
    -11

    Re: Warum geht das nicht :(

    ich hab doch absichtlich nicht beim array bei 0 begonnen.. das programm läuft. Aber etwas stimmt da nicht bekomme die Adresse ständig ausgegeben.

  7. #7
    Registered User
    Registriert seit
    Sep 2008
    Beiträge
    402
    Renommee
    270

    Re: Warum geht das nicht :(

    Dann musst du die Adresse dereferenzieren... auch Grundlage.

  8. #8
    Registered User
    Registriert seit
    Feb 2004
    Beiträge
    800
    Renommee
    756

    Re: Warum geht das nicht :(

    könntest du bitte DRINGEND niemals die main() als funktion aufrufen?
    wozu gibt es denn schleifen?

    verbiete ich hiermit ausdrücklich ;) raus damit!

  9. #9
    Moderator
    Registriert seit
    Aug 2004
    Beiträge
    1.310
    Renommee
    1286

    Re: Warum geht das nicht :(

    Hallo Galactus,

    Warum hast du "absichtlich" nicht bei 0 im Array angefangen? Ein Array ist eine bestimmte Anzahl von Variablen in einer Reihe.
    Code:
    int array[4];
    Legt dir im Speicher 4 ints hintereinander an:
    Code:
    [int][int][int][int]
    Die Regelung der Programmiersprache schreibt dir vor, dass du beim Zugriff auf die Elemente mit 0 zu zählen anfangen musst.
    Wenn du jetzt also mit
    Code:
     array[4]=17;
    in dein Array schreibst, überschreibst du Speicher der nicht mehr zu deinem Array gehört. Je nach Situation kann das zu sehr merkwürdigem Verhalten in deinem Programm führen. Das ist übrigens ein sehr häufiger Fehler (ein sogenannter "off by one") der gerne in Schleifen und beim Arbeiten mit Strings vorkommt.

    Übrigens wäre es schön wenn du deinen Code mit Code-Tags versiehst. Einfach vor den Code [ code ] schreiben und ans Ende des Codes [ /code ]. Natürlich ohne die Leerzeichen. ;)

  10. #10
    Registered User
    Registriert seit
    Jan 2011
    Beiträge
    8
    Renommee
    -11

    Re: Warum geht das nicht :(

    Jungs Danke viel mals für die tipps !!!!!
    Wirklich.

    jaaaaa array[4] elemente benutzt.

    Okay warum habe ich bei 1 begonnen :) Beispiel ^^

    Code:
    for (count = 0;count < 4 ;count++)
    printf(" %d Zahl",count);
    dann krieg ich ja immer als erstes 0 Zahl, 1 Zahl, 2 Zahl, 3 Zahl
    und 0 Zahl sieht hässlich aus :( vielleicht kennt da jemand ne bessere alternative.

    Ich habe ja 4 elemente im array, da ich bei 1 beginne muss die abfrage bei dem if sich eigendlich nur auf die 1,2,3 beziehen also
    Code:
     if(x[1] > x[2] && x[1] > x[3])
    hatte aber bei der if abfrage die 4 benutzt (
    Code:
    if(x[1] > x[2] && x[1] > x[3] && x[1] > x[4])
    was ja bedeutet das es 5 elemente geben müsste, also habe ich auf einen berreich gezeigt der nicht existierte D: .

    Danke nochmal Leute

    @elise würdest du mir ein beispiel posten wie elegant wieder zurück komme? :(

  11. #11
    Registered User
    Registriert seit
    Feb 2004
    Beiträge
    800
    Renommee
    756

    Re: Warum geht das nicht :(

    Zitat Zitat von Galactus Beitrag anzeigen

    @elise würdest du mir ein beispiel posten wie elegant wieder zurück komme? :(
    schau dir mal die gemeine WHILE Schleife an.
    denk dir einen Abbruch aus und überlege, ob die kopf- oder fußgesteuerte hier passt.

  12. #12
    Administrator
    Registriert seit
    Jul 2002
    Beiträge
    2.552
    Renommee
    903

    Re: Warum geht das nicht :(

    dann krieg ich ja immer als erstes 0 Zahl, 1 Zahl, 2 Zahl, 3 Zahl
    und 0 Zahl sieht hässlich aus :( vielleicht kennt da jemand ne bessere alternative.
    Du willst also immer count + 1 ausgeben? Hint!
    Die Nacht ist die schönste Zeit des Tages,
    alle Bälger sind im Bett und die scheiß Sonne scheint auch nicht!

  13. #13
    Registered User
    Registriert seit
    Jan 2011
    Beiträge
    8
    Renommee
    -11

    Re: Warum geht das nicht :(

    Hey Danke für die Denkanstöße.

    Also

    Elise du meinst soetwas wie
    Code:
    do{
    
    puts("(1)weiter");
    puts("(2)neustart");
    scanf("%d",&auswahl);
    
    
     }while(auswahl != 2);

    Und

    echox
    meint das ich bei
    Code:
    printf("%d",count+1);
    so die 1 dazu zählen kann.


    :)

  14. #14
    Moderator
    Registriert seit
    May 2000
    Beiträge
    1.368
    Renommee
    1285

    Re: Warum geht das nicht :(

    Zum Analysieren und Aus- und Umbauen ;)

    Sollte als Uebungsbeispiel zum Einstieg recht ok sein, erhebt aber keinen Anspruch auf Perfektion. Das kann man noch viel besser machen, du kannst ja mal versuchen, alle Schwaechen dieses Programms zu finden und auszubessern. Im Laufe der Zeit, wenn du immer mehr lernst, wirst du dich wundern, wie aufwaendig es ist, sogar so ein einfaches Programm zu perfektionieren.

    Code:
    #include <unistd.h>
    #include <sys/types.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    /* enough for minus 2 billion something \n \0 as a string*/
    #define STRBUF_SZ 14
    
    /* 4 numbers if not redefined by the compiler */
    #ifndef NUMS
      #define NUMS 4
    #endif
    
    char strbuf[STRBUF_SZ];
    
    int main(int, char*[], char*[]);
    void userinput(void);
    int maxval(int[]);
    
    int main(int argc, char* argv[], char* envp[])
    {
        int  numbers[NUMS];
        int  idx;
    
        do
        {
            for (idx = 0; idx < NUMS; ++idx)
            {
                numbers[idx] = 0;
                fprintf(stdout, "Enter number #%d: ", idx + 1);
                fflush(stdout);
                userinput();
                numbers[idx] = (int) strtol(strbuf, (char**) NULL, 10);
            }
    
            idx = maxval(numbers);
            fprintf(stdout, "The largest number is %d\n\n", numbers[idx]);
    
            fputs("Type 'y' and press enter to enter new numbers: ", stdout);
            fflush(stdout);
            userinput();
        } while (strncmp("y", strbuf, 1) == 0);
    
        return 0;
    }
    
    void userinput()
    {
        char* rc;
    
        if ((rc = fgets(strbuf, STRBUF_SZ, stdin)) == NULL)
        {
            /* End of file or I/O error - exit */
            if (feof(stdin))
            {
                /* End of file */
                exit(0);
            }
            /* Something else, assume error, exit code 1 */
            exit(1);
        }
    }
    
    int maxval(int numbers[])
    {
        int largest;
        int idx;
        int i;
    
        /* smallest number for int ... minus very much */
        largest = 0x80000000;
        idx = 0;
    
        for (i = 0; i < NUMS; ++i)
        {
            if (numbers[i] > largest)
            {
                largest = numbers[i];
                idx = i;
            }
        }
    
        return idx;
    }
    Viel Spass, ich hoffe, es hilft.

    [edit: paar Kommentare hinzugefuegt]
    Geändert von octogen (18.06.2011 um 00:00 Uhr)
    Segmentation fault (core dumped)

  15. #15
    Registered User
    Registriert seit
    Jan 2011
    Beiträge
    8
    Renommee
    -11

    Re: Warum geht das nicht :(

    okay also einige Sachen muss ich nochmal nachlesen. Denn Argv und Argc kenne ich leider noch nicht. Vorerst 1 Frage. Was bedeutet
    Code:
    largest = 0x80000000
    Also wie du die größere Zahl ermittelst.



    Wenn ich fragen darf, schlagt eigentlich in Büchern nach, oder kennt ihr die benötigten Funktionen auswendig? Also wenn ihr jetzt ein Programm schreibt?

    Wenn ich schon dabei bin.. , was muss ich noch wissen oder ansteuern in der Programmiersprache C um nach den Grundlagen besser zu werden. Ich meine was gibt es so für Themenbereiche auf die man sich spezialisieren könnte,welche aber mit Security zu tun haben?

    Danke auch nochmal für das übungsprog :)

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Ähnliche Themen

  1. Antworten: 14
    Letzter Beitrag: 28.12.2004, 00:39
  2. socket.h hat geht nicht. warum ?
    Von rlKing im Forum C / C++
    Antworten: 13
    Letzter Beitrag: 01.03.2003, 10:35
  3. TonyHawk 2 geht bei mir nicht. Warum??? Kopierschutz???
    Von Ploy im Forum Reverse Engineering
    Antworten: 6
    Letzter Beitrag: 26.12.2001, 22:15
  4. Warum geht goTo nich
    Von The_Freak im Forum VisualBasic / VBScript
    Antworten: 2
    Letzter Beitrag: 26.06.2001, 20:07
  5. Root PWD: Warum geht es nicht??
    Von Sturm im Forum (In)Security allgemein
    Antworten: 9
    Letzter Beitrag: 14.12.2000, 20:32

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •