2017-09-10 4 views
1

J'essaie d'obtenir les valeurs des valeurs diagonales à partir d'un tableau 2D. Par exemple ..C Programmation - Somme des tableaux 2D

10 20 30 
10 20 30 
10 20 30 

De mes codes, j'ajouterons/additionner les chiffres de l'indice [0] [0] avec l'index et 1 index [2] [2] qui REPÈRES UTILISATION calculer 60. Cependant, lorsque je compile et exécute, il renvoie le calcul de l'adresse de mémoire à la place. Quelqu'un peut-il expliquer le problème ici? (Je suis nouveau à la programmation C et pointeurs)

void diagonals2D(int array[][SIZE], int rowSize, int colSize, int *sum) 
{ 
    int count; 
    *sum=0; 

    for(count=0;count<SIZE;count++) 
    { 
     (*sum)+=*(array+count+count); 
    } 

} 

enter image description here

+2

'* (matrice + nombre + nombre)' -> 'array [count] [compter]' – BLUEPIXY

+3

@Han (* somme) + = * (* (matrice + count) + count); –

+0

J'ai édité ma réponse et cela semble fonctionner, vérifiez-la – magicleon

Répondre

3

Le premier paramètre est réglé à

int (*array)[SIZE] 

qui est un pointeur. L'expression array + count a également le type int (*)[SIZE]. Pour obtenir le correspondant « ligne » du tableau que vous avez à déréférencer le pointeur

*(array + count) 

Dans ce cas, vous avez un objet du type int[SIZE] qui, à son tour dans l'expression

*(array + count) + count 

est implicitement convered au type int *.

maintenant déréférencement toute l'expression, vous obtiendrez l'élément cible

*(*(array + count) + count) 

Il est préférable de déclarer la fonction comme ayant le paramètre du tableau de longueur variable.

Voici un programme de démonstration

#include <stdio.h> 

void diagonals2D(long long int *sum, size_t n, int a[n][n]) 
{ 
    *sum = 0; 

    for (size_t i = 0; i < n; i++) 
    { 
     *sum += *(*(a + i) + i); 
    } 
} 

#define N 3 

int main(void) 
{ 
    int a[][N] = 
    { 
     { 10, 20, 30 }, 
     { 10, 20, 30 }, 
     { 10, 20, 30 }  
    }; 

    long long int sum; 

    diagonals2D(&sum, N, a); 

    printf("sum = %lld\n", sum); 

    return 0; 
} 

Sa sortie est

sum = 60 
+0

@Han Voir mon programme démonstratif et comparer sa sortie avec votre sortie pour trouver la différence. Peut-être que dans un appel printf vous utilisez expression & sum au lieu de sum. –

0

Ce array+count+count ne équivaut pas à array[count][count], c'est-ce que vous devez atteindre.
La meilleure façon que vous pourriez y parvenir est le plus propre array[count][count] mais si vous voulez coller avec des pointeurs arithmétiques à partir d'un point d'apprentissage de la vue (encore une fois, cela est mauvais pour la lisibilité et la mise au point), vous devez accéder à l'élément de cette façon:

(*sum)+=*(*(array+count)+count); 

De cette façon, vous ajoutez count au pointeur de base array, emplacement de mémoire de l'adresse de base de la counte ligne. C'est un pointeur vers un pointeur. En déréférenciant, vous obtiendrez l'adresse de base de la ligne.

L'ajout de count au pointeur de base de la ligne vous donnera l'adresse du count ème élément de la ligne, et le déréférencement vous donnera la valeur de l'élément.

Voir le code here

+0

Dans le contexte de l'extrait de l'OP "*' * (tableau + compte * TAILLE + compte) "*" n'évalue pas à un "int"! – alk

+0

que voulez-vous dire? L'emplacement de mémoire qui est déréférencé me semble correct. Laissez-moi essayer, attendez – magicleon

+0

Je veux dire que 'int array [] [SIZE]' et 'int array [SIZE]' ne sont * pas * identiques. – alk

0

Comme le problème donné, vous devez utiliser le code suivant.

for(count = 0; count < size; count++) 
    sum=*(*(array + count) + count);