Zeiger und Arrays



  • Hi Leutz!

    Es wäre echt necht wenn Ihr mir weiterhelfen könntet!
    Habe folgendes Problem. Ich habe ein Programm geschrieben (siehe Quelltext) das eine Tabelle mit Zahlen ausgibt. Jedoch habe ich Probleme bei der Errechnung der "Gesamt Punkte". Irgendwas ist da falsch gecodet!
    Als "Gesamt Punkte" sollte nähmlich herauskommen:

    Klasse8a: 151
    Klasse8b: 156
    Klasse8c: 149
    Klasse8d: 155

    Was mache ich falsch? Ich glaube es hat mit dem Zugriff auf die Arrays zu tun.

    #include <stdio.h>

    void main(void)

    {

    int matrix_a [2][5] = {{ 1, 2, 3, 4, 5},

          { 3, 2, 1, 2, 3}};
    

    int matrix_b [4][5] = {{ 3, 15, 10, 30, 14},

          {16, 12, 12, 24,  8},
    
          { 8,  5, 15, 20, 20},
    
          {10,  8, 14, 10, 25}};
    

    int ges_pkte [5] = { 0, 0, 0, 0, 0 };

    int *z_matrix_a;

    int *z_matrix_b;

    int *z_ges_pkte;

    z_matrix_a = &matrix_a[0][0];

    z_matrix_b = &matrix_b[0][0];

    z_ges_pkte = &ges_pkte[0];

    int k,

      a;
    

    /--------------------------------Ich glaube hier liegt der Fehler!!!!-------/

    for(k=0; k<5; k++)

    for(a=0; a<5; a++)
    
     \*z\_ges\_pkte += \*(z\_matrix\_a+1) * *(z\_matrix\_b+1);
    

    z_matrix_a = &matrix_a[0][0];

    z_matrix_b = &matrix_b[0][0];

    printf("\n\n Die Punktverteilung fuer alle 4 Klassen:");

    printf("\n\n Nr der Aufg.");

    for(k=0; k<5; k++)

    printf(" %6d", *z_matrix_a++);

    printf(" Gesamt Pkt.");

    for(k=0; k<4; k++)

    {
    
      printf("\\n\\n !Klasse 8%c:     ", 97+k);
    
      for(a=0; a<5; a++)
    

    printf("%4d !", *z_matrix_b++);

      printf("%6d    ! ", *z\_ges\_pkte++);
    
    }
    

    printf("\n\n !Pkt/Aufg.: ");

    for(k=0; k<5; k++)
    

    printf("%4d !", *z_matrix_a++);

    printf("\n\n\n");

    }[/code]

    Bitte um HILFE!!

    M f g -> Robb.

    [ Dieser Beitrag wurde am 17.02.2003 um 20:55 Uhr von Robb editiert. ]

    [ Dieser Beitrag wurde am 17.02.2003 um 20:59 Uhr von Robb editiert. ]

    [ Dieser Beitrag wurde am 18.02.2003 um 11:12 Uhr von Robb editiert. ]



  • Du darfst nicht in die Felder schreiben da sie const sind! und int k,a; musst du am Anfang deklarieren. Und bitte LASS es deine Threads besonders zu kennzeichnen.



  • Gehts mit Deiner Antwort bitte noch etwas ausfürlicher ???

    Danke !



  • k und a sind korrekt deklariert und die Arrays sind auch nicht const.

    Aber in der Zeile

    *z_ges_pkte += *(z_matrix_a+1) * *(z_matrix_b+1);
    

    wird in jedem Schleifendurchlauf das gleiche gemacht, da du die Laufvariablen nicht verwendest bzw. die Pointer nicht incrementierst.



  • Meinst Du, es wäre besser, wenn ich es so machen würde:

    for(k=0; k<5; k++)

    for(a=0; a<5; a++)
    
     ges\_pkte[a] += matrix\_a[1][a] * matrix_b[a][k];[/code]
    

    M f G -> Robb.



  • Korrigiert mich wenn ich falsch liege:
    Nachdem was ich grad gelesen habe ist

    z_matrix_a = &matrix_a[0][0];
    z_matrix_b = &matrix_b[0][0];
    z_ges_pkte = &ges_pkte[0];
    

    völlig falsch.
    Begründung: Der Name eines Array repräsentiert dessen Speicheradresse, besser die des ersten Elements.
    Außerdem ist demnach das [0] überflüssig, da wie gesagt der Name schon auf das erste Element verweist.
    Müsste dann also so:

    z_matrix_a = matrix_a
    z_matrix_b = matrix_b;
    z_ges_pkte = ges_pkte;
    

    aussehen.

    Allerdings weis ich nicht genau wie das bei mehrdimensionalen Arrays ausschaut.

    Ansonnsten Stimm ich Robb zu: Nimm lieber die Arrays und nicht die Pointer darauf. Dürfte einfacher sein.

    Wenn alles soweit funzt, dann geh doch einfach mall deinen Quelltext durch und schau dir überall wo du einen Pointer verwendet hast, ob es sich nun um den Wert oder die Speicheradresse handelt, und überprüfe genau ob du den Wert oder den Pointer incrementierst. Villeicht bringt dich das weiter...

    [ Dieser Beitrag wurde am 19.02.2003 um 18:44 Uhr von THE_FreaK editiert. ]



  • Hi,

    mache einfach folgendes:

    [code]

    for(k=0; k<5; k++)
    for(a=0; a<5; a++)
    *(ges_pkte+a) += *(*matrix_a+1*5+k) * *(*matrix_b+a*5+k);

    //N= Spaltenzahl (gesamt) = 5[/code]

    Eine andere Schreibweise wäre:

    z_matrix_a = matrix_a[0];
      z_matrix_b = matrix_b[0];
      z_ges_pkte = ges_pkte;
    

    mfg
    pierre


Log in to reply