2016-05-15 9 views
8

Je me demande simplement s'il existe un moyen de créer un tableau de pointeurs pointant vers la première colonne de chaque ligne d'un tableau multidimensionnel d'entiers. À titre d'exemple, s'il vous plaît consulter le code suivant:Tableaux de pointeurs pointant vers des tableaux d'entiers

#include <stdio.h> 

int day_of_year(int year, int month, int day); 

main() 
{ 
    printf("Day of year = %d\n", day_of_year(2016, 2, 1)); 
    return 0; 
} 

static int daytab[2][13] = { 
    {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 
    {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} 
}; 

int day_of_year(int year, int month, int day) 
{ 
    int leap; 
    int *nlptr = &daytab[0][0]; 
    int *lpptr = &daytab[1][0]; 
    int *nlend = nlptr + month; 
    int *lpend = lpptr + month; 

    leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0; 
    if (leap) 
     for (; lpptr < lpend; lpptr++) 
      day += *lpptr; 
    else 
     for (; nlptr < nlend; nlptr++) 
      day += *nlptr; 
    return day; 
} 

Quand j'écris comme ceci ci-dessous:

int *p[2]; 
*p[0] = daytab[0][0]; 
*p[1] = daytab[1][0]; 

Je reçois une erreur comme ceci:

Error: Array must have at least one element 
Error: Variable 'p' is initialized more than once 
Error: { expected 
Error: Variable 'p' is initialized more than once 
Error: { expected 
***5 errors in Compile*** 

je l'ai changé comme ceci:

int *p[2]; 
p[0] = &daytab[0][0]; 
p[1] = &daytab[1][0]; 

Je reçois toujours le même erreur.

Je sais que nous pouvons faire un tableau de pointeurs vers des chaînes de caractères comme dans les domaines suivants:

char *str[] = { 
    "One", "Two", "Three", 
    "Four", "Five", "Six", 
    "Seven", "Eight", "Nine" 
} 

Comment pouvons-nous faire pour les tableaux d'entiers?

+0

"* Il ne fonctionne pas *" est l'erreur plus ou moins de valeur rapport, on peut donner. S'il vous plaît soyez plus précis sur l'erreur, l'avertissement, le dysfonctionnement que vous obtenez, observez! – alk

+2

Premier exemple: grande chance de provoquer une erreur de segmentation en déréférenciant un pointeur invalide Deuxième exemple: Pourriez-vous expliquer ce que vous entendez par "ne fonctionne pas"? – MikeCAT

+1

Le code affiché (en utilisant la 2ème approche) me semble bon. – alk

Répondre

2

Votre code devrait fonctionner comme charme:

int *p[2]; 
p[0] = &daytab[0][0]; 
p[1] = &daytab[1][0]; 

printf("%d \n", p[0][2]); // shows: 28 
printf("%d \n", p[1][2]); // shows: 29 

Cela fonctionne aussi:

int *p[2] = { &daytab[0][0],&daytab[1][0] }; 
+0

L'ancien code, lorsqu'il est compilé, continue à me donner les erreurs que j'ai mentionnées ci-dessus, bien que je pense que ce ne devrait pas. Mais le dernier fonctionne pour moi, et il a rendu le programme plus compact, éliminant le besoin de si-autre. Je vous remercie. –

+0

Ce dernier code fonctionne lorsque je le compile en tant que cpp. Mais quand je le compile comme c, j'obtiens l'erreur 'Initialisation illégale dans la fonction day_of_year' à la ligne' int * pe [2] = {p [0] + month, p [1] + month}; '. –

+1

Comme déjà mentionné par Alk, s'il vous plaît mettre à jour votre compilateur dès que possible !. Il était obsolète dans les années 90 et il va certainement vous donner beaucoup de mal à la tête. – tomekpe

1

Si elle est de changer la définition de daytab aller comme le 3ème exemple, vous voudrez peut-être utiliser:

int * daytab[] = { 
    (int[]){0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 
    (int[]){0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} 
}; 

à la place.

Ou rester enregistrer et marquer la fin du tableau en utilisant une sentinelle faire:

int * daytab[] = { 
    (int[]){0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 
    (int[]){0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 
    NULL 
}; 

Ou^2 pour rester même économiseur marquant également le tableau interne se termine:

int * daytab[] = { 
    (int[]){0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, -1}, 
    (int[]){0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, -1}, 
    NULL 
}; 

S'il vous plaît noter que les composés ((Type){Initialiser}) utilisés ici ne sont disponibles qu'à partir de C99.

1

utilisation comme ci-dessous

int *p[2]; p[0] = daytab[0]; p[1] = daytab[1];