Hilfe: Wo liegt der Fehler ? - Ich komm nicht drauf...



  • Hallo an alle,

    erst einmal "Entschuldigung", falls ich hier im falschen Forum poste und alles noch nicht so ganz richtig machen sollte. Ausserdem weiß ich gar nicht, ob man hier im Forum überhaupt solche Mickey-Maus-Fragen stellen kann...

    Aber egal, vielleicht kann mir ja bitte, bitte jemand helfen:

    Also: Das folgende Programm soll eine Matrix erstellen, diese mit Werten von o und 1 befüllen und schließlich die Anzahl der darin enthaltenen Teilmatrizen mit Seiten länge n testen: Klappt auch wunderbar! Nun aber soll es auch feststellen, wieviele dieser Teilmatrizen in der Hauptdiagonale nur den Wert 1 haben.

    Und da hängt´s jetzt - ich scheine da irgenwie einen Laufzeit- oder Denkfehler drin zu haben (siehe untenstehenden Text).

    Wer auch immer mir helfen kann - DANKE!!!

    #include <stdio.h>
    #include <stdlib.h>
    #define BUF 255
    
    int main(void)
    
    {
        int i, j, x, eingabe=0, zeile, spalte, n, anzahltm=0, einszaehler=0, diagonalenzaehler=0;
        /* Matrix ist Zeiger auf int-Zeiger */
    
        int ** matrix; 
    
        printf("Wie viele Zeilen : ");
        scanf("%d", &zeile);
        printf("Wie viele Spalten: ");
        scanf("%d", &spalte);
    
       /* Speicher reservieren für die int-Zeiger (=zeile) */
    
       matrix = (int **)malloc(zeile * sizeof(int *));
    
       if(NULL == matrix)
       {
          printf("Kein Virtueller RAM mehr vorhanden ... !");
          return EXIT_FAILURE;
       }
    
       /* Jetzt noch Speicher reservieren für die einzelnen Spalten
        * der i-ten Zeile */
    
       for(i = 0; i < zeile; i++)
       {
          matrix[i] = (int *)malloc(spalte * sizeof(int));
             if(NULL == matrix[i])
             {
                printf("Kein Speicher mehr fuer Zeile %d\n",i);
                return EXIT_FAILURE;
             }
       }
    
       /* Matrix initialisieren */
      for (i = 0; i < zeile; i++)
      {
          for (j = 0; j < spalte; j++)
          {
              eingabe=2;
               while (eingabe>1 || eingabe < 0)
              {
              printf("\n Bitte Zahl eingeben ->");
              scanf("%i",&eingabe);
              matrix[i][j]=eingabe;
              if (eingabe>1 || eingabe < 0)
              {printf("Falsche Eingabe! Die Zahl muss 0 oder 1 sein...");}
              }          
            }
      }
    
    /* matrix[zeile][spalte] */
    
       /* Inhalt der Matrix entsprechend ausgeben */
    
    printf("\n\tDas ist Ihre Matrix:");
    printf("\n");
         for (i = 0; i < zeile; i++)
         {
          for (j = 0; j < spalte; j++)
          {
              printf("%d ",matrix[i][j]);
          }
          printf("\n");
         }
    
    /*Testen auf Anzahl der Quadratischen Teilmatrizen*/
    
    printf("\n Bitte geben Sie die Seitenlaenge der zu suchenden quad. Teilmatrix ein ->  ");
    scanf("%i",&n);
    for (i=zeile; i>0; i--)
    {
      for (j=spalte; j>0; j--)
            {
                if (n<=i && n<=j)
                {
                    anzahltm+=1;
    
    /*AB HIER FUNKTIONIERT`S NICHT*/                
                    for (x=n; x>=0; x--)                
                    {
                        if (matrix[i-x][j-x]!=0)
                                {
                                    einszaehler+=1;
                                    printf("%i",einszaehler);
                                    if (einszaehler==n)
                                    {
                                        diagonalenzaehler+=1;
                                    }
                                }
                    }
                }
            }
    }
    
    printf("\n\nDie Ausgangsmatrix enthaelt %i Teilmatrizen vom Typ %i x %i \n", anzahltm,n,n);
    printf("Davon %i mit nur dem Wert 1 in der Hauptdiagonale", diagonalenzaehler);
    printf("\n");
    printf("\n");
    system("PAUSE");
    
       /* Speicherplatz wieder freigeben
        * Wichtig! In umgekehrter Reihenfolge */
    
       /* Spalten der i-ten Zeile freigeben */
    
       for(i = 0; i < zeile; i++)
    
          free(matrix[i]);
    
       /* Jetzt können die leeren Zeilen freigegeben werden */
    
       free(matrix);
       return EXIT_SUCCESS;
    
    }
    

    Edit by c.rackwitz: cpp-tag geschlossen



  • Ein Denkfehler fällt mir schon auf - du solltest vor der Schleife "for(x=n;...)" die Variable einszaehler wieder zurücksetzen, sonst zählst du dortdrin die Diagonalenelemtente aus ALLEN Teilmatrizen.



  • Ein Problem wird auch hier entstehen

    if (matrix[i-x][j-x]!=0)
    

    ZB wird ja i mit zeile für die Schleife initialisiert und x kann bis 0 laufen. Was praktisch bedeutet, dass du irgendwann auf matrix[zeile] zugreifst, was es aber nicht gibt. Die letzte Zeile ist matrix[zeile - 1].

    Noch ein paar Anmerkungen:
    Die Rückgabe von malloc brauchst du nicht zu casten.
    Und überdenke nochmal dein Speichermanagement. Ich weiss, das ist in C immer etwas problematisch. Aber so wie es jetzt ist, gibt es uU Speicherlecks. ZB wenn das erste malloc ok ist, eines der nachfolgenden aber fehlschlägt. "Virtueller RAM" ist übrigens auch schön. Ich hoffe, dass der RAM in meinem Rechner real ist, immerhin hab ich einige Ocken dafür hingelegt. 😃
    Man kann so eine Matrix übrigens auch linear erstellen, wenn die Anforderungen dafür passen. Dann braucht man auch nur ein malloc.
    Und das mit den Code-Tags hat wohl auch nicht ganz geklappt. 🙂 Kleiner Tipp, vorm Absenden den Vorschau-Button nutzen.



  • zu den codetags: du hast am ende das [/cpp] vergessen



  • Herzlichen Dank!

    Ich hab genau die Änderungen eingearbeitet und siehe da .... es funktioniert!
    Vor allem auf die Indexüberschreitung wäre ich nie gekommen, ich hab mich nur gewundert, warum er immer abstürzt.

    Die ersten Schritte sind halt hart, aber wenn man jemanden hat, der einem hilft, macht´s wirklich Spaß! Und zwar nicht bloß virtuell... 😉

    Herzlichen Dank nochmal und beim nächsten Mal klappt´s besser mit der Formatierung - versprochen!

    😃


Anmelden zum Antworten