#1 Le 10/10/2008, à 20:42
- lebossejames
problème programme C
Bonjour,
voici un bout de mon prog:
void PA(char tab[5][5])
{
int i,j;
for (i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
tab[i][j]='b';
}
}
}
void calcul(tab[5][5])
{
tab[4][4]='g';
tab[5][5]='d';
}
void affich(char tab[5][5])
{
int i,j;
for (i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%c",tab[i][j]);
}
}
}
int main()
{
int i,j;
char tab[5][5];
PA(tab);
affich(tab);
return 0;
}
Il m'affiche de temps en temps correctement le tableau et souvent des caractères bizarre !!
Je voulais savoir d'une part si le code est correcte, d'autre part le tab[5][5] déclaré dans le main est -il possible de le réutiliser dans les fonctions?
Dernière modification par lebossejames (Le 10/10/2008, à 21:10)
Hors ligne
#2 Le 10/10/2008, à 20:53
- slasher_fun
Re : problème programme C
Ton tableau de 5x5 est indexé de 0 à 4, pas de 1 à 5 !
Hors ligne
#3 Le 10/10/2008, à 20:55
- lebossejames
Re : problème programme C
donc tab[0][0] n'existe pas en C
Hors ligne
#4 Le 10/10/2008, à 20:56
- slasher_fun
Re : problème programme C
Si, mais pas tab[5][5]
Hors ligne
#5 Le 10/10/2008, à 20:57
- lebossejames
Re : problème programme C
donc je doit mettre tab[6][6] à la place de tab[5][5] ?
Hors ligne
#6 Le 10/10/2008, à 20:58
- Dark-Sham
Re : problème programme C
Si, bien sûr, les indices en C peuvent se voir comme ceci :
comptage C 0 1 2 3 4
comptage "humain" 1 2 3 4 5
EDIT : non ! tu dois mettre tab[4][4] !
Dernière modification par Dark-Sham (Le 10/10/2008, à 20:59)
Script de sauvegarde/restauration APT
Ubuntu 8.04 "Hardy Heron"
CPU : AMD Athlon XP 2800+ ; GPU : ATI Radeon 9250/9200 Series ; RAM : 2 Gigots + 512 Mégots ; Carte mère : Asus A7N8X-E Deluxe
Hors ligne
#7 Le 10/10/2008, à 21:01
- lebossejames
Re : problème programme C
d'accord je vais tester
Hors ligne
#8 Le 10/10/2008, à 21:02
- slasher_fun
Re : problème programme C
donc je doit mettre tab[6][6] à la place de tab[5][5] ?
Relis bien ce que j'ai écrit :
* Quand tu déclares un tableau, entre crochet se trouve le nombre de "cases" du tableau dans chaque dimension. tab[5] correspond donc à un tableau à 5 cases
* MAIS l'index commence à 0. Ainsi dans un tableau déclaré tab[5], il existe tab[0] à tab[4] (soit 5 "cases") mais PAS tab[5] et au-dessus !
Hors ligne
#9 Le 10/10/2008, à 21:04
- lebossejames
Re : problème programme C
ok merci.
Hors ligne
#10 Le 10/10/2008, à 21:13
- lebossejames
Re : problème programme C
le problème ne vient pas de là c'est une erreur de ma part pour tab[5][5];
Hors ligne
#11 Le 10/10/2008, à 21:21
- tiky
Re : problème programme C
L'index d'un tableau C commence à zéro car il s'agit du décalage par rapport l'adresse mémoire du premier élément du tableau.
Si tu écris:
int tab[5];
Tu obtiens un espace mémoire pouvant contenir 5 entiers consécutivement, soit sur la plus part des machines x86, 5*4 = 20 octets ( car un entier de type int prend 4 octets en mémoire ).
l'identificateur tab est comparable à un pointeur constant sur le premier élément du tableau.
Un petit schéma pour y voir plus clair.
Chaque case fait 4 octet.
----------------------
tab -> | | | | | |
----------------------
Si tu déréférences tab, tu obtiens la valeur du premier entier:
*tab
Pour accèder à l'élément suivant, il faut décaler l'adresse contenue par le pointeur de 4 octet. Logiquement il faudrait taper:
*(tab+4)
mais en fait le compilateur multiplie automatiquement la valeur ajoutée par la taille du type du tableau ( ici 4 octets ), donc la bonne syntaxe est:
*(tab+1)
Note: tab++ est incorrect car tab est constant.
Ainsi pour accéder au 5ème élément du tableau:
*(tab+4)
La syntaxe tab[n] est identique à *(tab+n).
Dernière modification par tiky (Le 10/10/2008, à 21:25)
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#12 Le 10/10/2008, à 22:59
- lebossejames
Re : problème programme C
dans mon cas c'est un tableau n fois n
Hors ligne
#13 Le 10/10/2008, à 22:59
- lebossejames
Re : problème programme C
comment utilisé un pointeur de tableau pour un tableau à 2 dimensions.
Hors ligne
#14 Le 10/10/2008, à 23:40
- Link31
Re : problème programme C
comment utilisé un pointeur de tableau pour un tableau à 2 dimensions.
Comme une grille à deux dimensions, ramenée à une seule ligne en mémoire.
int tab[3][4];
En principe :
------x------
tab => 0| 1| 2| 3|
-------------
y | 4| 5| 6| 7|
-------------
| 8| 9|10|11|
-------------
Structure réelle en mémoire :
tab => | 0| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10| 11|
Pour accéder à un élément [y][x] à partir d'un pointeur "p" pointant vers le début du tableau, tu dois donc utiliser *(p+largeur*y+x), soit en l'occurrence : *(p+4*y+x)
Hors ligne
#15 Le 11/10/2008, à 10:10
- morphoneo69
Re : problème programme C
Je voulais faire ma petite remarque sur la forme du code. Un peu d'indentation ne fait pas de mal.
Hors ligne
#16 Le 11/10/2008, à 10:47
- morphoneo69
Re : problème programme C
Le morceau de code que tu as donné fonctionne.
Hors ligne
#17 Le 11/10/2008, à 10:56
- nicolas.sitbon
Re : problème programme C
#include <stdio.h>
#include <stdlib.h>
#define ROW 5
#define COL 5
static void init_tab (char tab[][COL])
{
for (size_t i = 0; i < ROW; i++)
{
for (size_t j = 0; j < COL; j++)
{
tab[i][j] = 'b';
}
}
}
static void print_tab (char tab[][COL])
{
for (size_t i = 0; i < ROW; i++)
{
for (size_t j = 0; j < COL; j++)
{
putchar (tab[i][j]);
}
}
fflush (stdout);
}
int main (void)
{
char tab[ROW][COL];
init_tab (tab);
print_tab (tab);
return 0;
}
Hors ligne
#18 Le 11/10/2008, à 17:32
- lebossejames
Re : problème programme C
pour accéder à la valeur tab[5][5] on doit faire *(p+5*5+5)?
Hors ligne
#19 Le 11/10/2008, à 17:38
- lebossejames
Re : problème programme C
si c'est possible que quelqu'un me fasse un exemple de code C avec utilisation de pointeurs pour accéder à des valeurs afin d'aller dans une autre fonction afin de les afficher s'il vous plait.
Car c'est un problème qui m'embête depuis 1 semaine.
Hors ligne
#20 Le 11/10/2008, à 18:25
- slasher_fun
Re : problème programme C
pour accéder à la valeur tab[5][5] on doit faire *(p+5*5+5)?
On peut (mais ce n'est pas le plus simple), sauf que dans ton exemple tab[5][5] n'existe pas...
Hors ligne
#21 Le 11/10/2008, à 19:23
- tiky
Re : problème programme C
pour accéder à la valeur tab[5][5] on doit faire *(p+5*5+5)?
On peut utiliser l'un ou l'autre. Sachant que les deux sont utilisables aussi bien sur les pointeurs ( au sens du C ) que sur les tableaux. On préfère l'utilisation des crochets pour les tableaux car c'est plus lisible, mais dans certains cas précis, l'utilisation de l'arithmétique des pointeurs permet de condenser et optimiser du code.
En C, le passage d'un tableau comme argument d'une fonction se fait toujours en tant que pointeur:
void function( int * ptr, size_t size );
void function( int ptr[], size_t size );
Nb: Les deux syntaxes sont identiques.
Autrement dit la variable ptr contient l'adresse du premier élément du tableau.
Ce pointeur local à la fonction ne contient plus les informations nécessaires pour connaître la taille du tableau sur lequel il pointe. Il faut donc lui passer cette taille par un deuxième argument.
Par exemple:
int tab[10];
size_t size = sizeof( tab )/sizeof( int );
function( tab, size );
Nb: sizeof( ptr ) donnera 4 dans la fonction car il retourne la taille du pointeur ( soit 4 octets sur une machine x86 32bits ). C'est pour ça qu'il faut passer le nombre d'élément du tableau en argument ( ou sa taille globale ). Et c'est pour ça qu'on peut pas dire que l'indentificateur du tableau est rigoureusement un pointeur ( au sens du C ) sur le premier élément.
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#22 Le 11/10/2008, à 20:04
- lebossejames
Re : problème programme C
là c'est un tableau à 1 dimension
Hors ligne
#23 Le 11/10/2008, à 20:36
- tiky
Re : problème programme C
Et alors? ça marche aussi bien...
#include <stdio.h>
#include <stdlib.h>
void function( int * tab, size_t size )
{
int i;
for( i=0; i < size; i++ )
{
printf( "%i\n", tab[i] );
}
}
int main( void )
{
int tab[5][5];
int i, j;
for( i=0; i < 5; i++ )
{
for( j=0; j < 5; j++ )
{
tab[i][j] = i;
}
}
size_t size = sizeof( tab ) / sizeof( int );
function( (int *)tab, size );
return 0;
}
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#24 Le 11/10/2008, à 20:47
- tiky
Re : problème programme C
Tu peux aussi le passer par valeur, mais il sera impossible de modifier le tableau dans la fonction.
#include <stdio.h>
#include <stdlib.h>
void function( int tab[5][5] )
{
int i, j;
for( i=0; i < 5; i++ )
{
for( j=0; j < 5; j++ )
printf( "%i\n", tab[i][j] );
}
}
int main( void )
{
int tab[5][5];
int i, j;
for( i=0; i < 5; i++ )
{
for( j=0; j < 5; j++ )
{
tab[i][j] = i;
}
}
function( tab );
return 0;
}
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#25 Le 11/10/2008, à 22:37
- lebossejames
Re : problème programme C
ça ne marche pas ça :
size_t size = sizeof( tab ) / sizeof( int );
Hors ligne