Tom's Guide > Forum > Programmation > |Résolut]Tableau dynamique en C

|Résolut]Tableau dynamique en C

Forum Programmation : |Résolut]Tableau dynamique en C

TomsGuide.com : 800 000 inscrits répondent à toutes vos questions high-tech et informatique. Pour obtenir de l'aide, inscrivez-vous gratuitement !
Mot :    Pseudo :           
 

Bonjour!

Je suis un peu en galère pour crer un tableau dynamique en 2D en C.

Voilà comment je procède:

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(){    //je veut faire un tableau 3*3
  4.     int *p;
  5.     p=(int*)malloc(3*sizeof(int));    //je met l'adresse de trois bloc dans p
  6.     for(int i=0;i<3;i++){    //itération sur chaque bloc
  7.         *p[i]=(int*)malloc(3*sizeor(int));    //chaque bloc prend l'adresse de trois autre bloc
  8.     }
  9. }



Et là le compilateur me dit:

Citation :

prog2.c: In function âmainâ:
prog2.c:8: erreur: invalid type argument of âunary *â

(désoler il y a un problème d'encodage)

J'ai chercher sur google mais pas trouver grand chose de concluant!
Petite question:
A quoi sert le (int*) avant le malloc ?

Merci de votre aide!

Message cité 1 fois
Message édité par Vermoute le 11-04-2008 à 09:05:37
Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

ligne 8 essaye plutot un sizeof a la place du sizeor
en general ça marche mieux après :)

Répondre à totof59

Si tu veux faire une matrice, pourquoi tu commence par déclarer 1 tableau à 1 dimension ?

 
Vermoute a écrit :

Code :
  1. int *p;
  2. (...)
  3. *p[i]=(int*)malloc(3*sizeor(int));    //chaque bloc prend l'adresse de trois autre bloc


 

Soit :

Code :
  1. int **p;
 


Pour allouer ta matrice, il faut donc faire :

Code :
  1. p = (int**) malloc( 3 * sizeof(int*) );
 

On rajoute un petit test pour vérifier que la matrice à bien été alloué :

Code :
  1. if( p == NULL ) {
  2.     fprintf(stderr,"Allocation impossible" );
  3.     exit(EXIT_FAILURE);
  4. }
 

On va ensuite allouer le reste de la matrice :

Code :
  1. for( int i = 0 ; i < 3 ; i++ ) {
  2.     p[i] = (int*) malloc(3, sizeof(int) );
  3.    
  4.     if( p[i] == NULL ) {
  5.           fprintf(stderr,"Allocation impossible" );
  6.           exit(EXIT_FAILURE);
  7.     }
  8. }
 

Ensuite, tu peux remplir comme tu le souhaites !

 


Donc, petit récapitulatif :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(){
  4.     int **p;
  5.     p = (int**) malloc( 3 * sizeof(int*) );
  6.     if( p == NULL ) {
  7.         fprintf(stderr,"Allocation impossible" );
  8.         exit(EXIT_FAILURE);
  9.     }
  10.     for( int i = 0 ; i < 3 ; i++ ) {
  11.         p[i] = (int*) malloc(3, sizeof(int) );
  12.         if( p[i] == NULL ) {
  13.             fprintf(stderr,"Allocation impossible" );
  14.             exit(EXIT_FAILURE);
  15.         }
  16.     }
  17.     // Remplissages/Traitements de données
  18.     return 0;
  19. }
 
Vermoute a écrit :

A quoi sert le (int*) avant le malloc ?

 

T'as appris le C ? C'est un cast ! La fonction malloc retourne le type de base ( void* ) .

 


totof59 a écrit :

ligne 8 essaye plutot un sizeof a la place du sizeor

 

Petite faute de frappes sans importance, son programme est erroné de toute façon !
Il veut un tableau à deux dimensions, et il initialise le sien en 1 dimension ... Ça marchera jamais !

 
Vermoute a écrit :

un tableau dynamique en 2D en C.

 

un tableau 2D = matrice !


Message édité par RedTux le 10-04-2008 à 10:00:38
------------------------------ N'oubliez pas le [Résolu] dans le titre si vous êtes satisfait.
Les règles du Forum - À lire absolument
Répondre à RedTux

Ok j'ai compris le truc!
En faite s'était juste des problème d'étoile dans mon code.
Comme ça ça marche:

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(){    //je veut faire un tableau 3*3
  4.     int **p;
  5.     p=(int**)malloc(3*sizeof(int*));    //je met l'adresse de trois bloc dans p
  6.     for(int i=0;i<3;i++){    //itération sur chaque bloc
  7.         p[i]=(int*)malloc(3*sizeof(int));    //chaque bloc prend l'adresse de trois autre bloc
  8.     }
  9. }


Par contre il y a un truc que je n'ai pas compris:
p[i][j] par exemple, ce n'est pas une adresse ?
Parce qu'un printf me le prend que comme ça, pas d'étoile ?

Répondre à Vermoute

Si je me trompe pas
p[i][j] te renvoie un int
donc il faut taper
printf("%d",p[i][j]);

Répondre à totof59

Oui j'ai constater ça mais je trouve ça bizard!
si on a:
int *p;
p=(int*)malloc(sizeof(int);

p est une adresse et *p un entier !

Répondre à Vermoute

p[ i ] (contenu du ième élément de p) est équivalent à *(p + i) (adresse décalée de i, et on prend le contenu)
donc l'utilisation des opérateur [] prend bien le contenu. Pour ton problème p[ i ][ j ] est équivalent à (*(p + i))[ j ] équivalent à *(*(p + i) + j) p étant en fait ici un tableau de pointeurs pointant sur des tableaux à 1 dimension.


Message édité par CRicky le 10-04-2008 à 21:00:16
------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Tom's Guide > Forum > Programmation > |Résolut]Tableau dynamique en C
Aller à :

Il y a 1364 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens