Erreur de compilation
momo2202
-
momo2202 -
momo2202 -
Bonjour,
lorsque je compile le petit programme suivant:
========================================
#include <stdio.h>
#include <stdlib.h>
static void init_tab(char **tab);/*fct qui initialise un tableau*/
int main(void)
{
char tab[2][2];
init_tab(tab);
return EXIT_SUCCESS;
}
static void init_tab(char **tab)
{
tab[0][0]=' ';
}
=========================================
J'obtiens un warning de compilation qui dit :
tab.c: Dans la fonction «main» :
tab.c:10: attention : passing argument 1 of «init_tab» from incompatible pointer type
De plus quand j'execute le programme :
il me renvoi segment fault pour l'affectation : tab[0][0]=' '
Ce que je ne comprend pas c'est que comme tab a une mémoire allouée définitivement, pourquoi j'ai ces messages d'erreur.
Merci de votre aide.
Cordialement
momo2202
lorsque je compile le petit programme suivant:
========================================
#include <stdio.h>
#include <stdlib.h>
static void init_tab(char **tab);/*fct qui initialise un tableau*/
int main(void)
{
char tab[2][2];
init_tab(tab);
return EXIT_SUCCESS;
}
static void init_tab(char **tab)
{
tab[0][0]=' ';
}
=========================================
J'obtiens un warning de compilation qui dit :
tab.c: Dans la fonction «main» :
tab.c:10: attention : passing argument 1 of «init_tab» from incompatible pointer type
De plus quand j'execute le programme :
il me renvoi segment fault pour l'affectation : tab[0][0]=' '
Ce que je ne comprend pas c'est que comme tab a une mémoire allouée définitivement, pourquoi j'ai ces messages d'erreur.
Merci de votre aide.
Cordialement
momo2202
A voir également:
- Erreur de compilation
- Erreur upes 1025 - Forum Téléviseurs
- Erreur t32 ✓ - Forum Livebox
- Erreur 3000 france tv - Forum Lecteurs et supports vidéo
- Erreur 0x80070643 - Accueil - Windows
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
3 réponses
Le problème viens du fait, comme je l'ai appris à mes dépend, que tableaux et pointeurs ne sont pas la même chose !
En tableau 1D, ça se passe relativement bien car il y a une certaine équivalence (un tableau est une espèce de char*const : un pointeur constant) mais le tableau à deux dimensions n'a rien à voir avec un pointeur double.
char t[2][2] aloue 2*2=4 espaces mémoire. Un double pointeur ce n'est pas la même philosophie, c'est un tableau de tableau, c'est à dire que la case t[i] contient un tableau qui n'a pas forcément la même taille que t[j].
Il y avait une bonne explication de ce problème dans le forum, un gars qui m'avais plutôt bien expliqué ça, mais je n'arrive pas à remettre la main dessus.
En tableau 1D, ça se passe relativement bien car il y a une certaine équivalence (un tableau est une espèce de char*const : un pointeur constant) mais le tableau à deux dimensions n'a rien à voir avec un pointeur double.
char t[2][2] aloue 2*2=4 espaces mémoire. Un double pointeur ce n'est pas la même philosophie, c'est un tableau de tableau, c'est à dire que la case t[i] contient un tableau qui n'a pas forcément la même taille que t[j].
Il y avait une bonne explication de ce problème dans le forum, un gars qui m'avais plutôt bien expliqué ça, mais je n'arrive pas à remettre la main dessus.
Salut,
En fait, en C, on envoie pas le tableau mais l'adresse du pointeur. Donc quand tu fais void init_tab(char *tab); ou void init_tab(char tab[]), ça revient exactement au même. Pour un tableau à 2D, c'est pareil, mais là le compilateur a un souci. Il ne peut pas savoir s'il s'agit d'un tableau par exemple de 2 lignes 4 colonnes ou de 1 ligne 8 colonnes (ou autre). D'où le message d'erreur. Pour ça, il faut donner la dimension du nombre de colonnes. Ce qui donne le prototype suivant :
void init_tab(char tab[][2]);
En fait, en C, on envoie pas le tableau mais l'adresse du pointeur. Donc quand tu fais void init_tab(char *tab); ou void init_tab(char tab[]), ça revient exactement au même. Pour un tableau à 2D, c'est pareil, mais là le compilateur a un souci. Il ne peut pas savoir s'il s'agit d'un tableau par exemple de 2 lignes 4 colonnes ou de 1 ligne 8 colonnes (ou autre). D'où le message d'erreur. Pour ça, il faut donner la dimension du nombre de colonnes. Ce qui donne le prototype suivant :
void init_tab(char tab[][2]);
J'ai retrouvé le site, mais pas les messages :
http://www-clips.imag.fr/commun/bernard.cassagne/Introduction_ANSI_C/node67.html
http://www-clips.imag.fr/commun/bernard.cassagne/Introduction_ANSI_C/node67.html