probleme de C

probleme de C - Programmation

Marsh Posté le 15-12-2001 à 14:32:14    

Bonjour st ce que qqun pourrait me dire pourquoi ce petiti bout de prg ne marche pas???
 
void main(void)
{
 
char ***tab=NULL;
int k=0,t=0, i=16;
 
if( (*tab = (char**)malloc(i*sizeof(char*))) == NULL )
 {
  printf("Probleme d'allocation" );
  exit(1);
 }
 
}
 
 
je sais que cela ne sert a rien mais je voudrai tout de meme le faire marcher..
 
merci

Reply

Marsh Posté le 15-12-2001 à 14:32:14   

Reply

Marsh Posté le 15-12-2001 à 14:43:53    

C quoi exactement le pb ?
Tu n'alloues qu'une partie de tab là....
(Un pointeur de pointeur de pointeur sur char ? ça va te servir à quoi ça ? :pt1cable: )
 :hello:


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 15-12-2001 à 14:46:23    

bon alors je m'explique c un petit morceau de prog qui se reouve dans un appel a une fonction, d'ou le ***.
Ensuite cela plante sur la ligne du malloc t je ne comprend pas pourqoui!

Reply

Marsh Posté le 15-12-2001 à 16:19:15    

Hug ! Homme voulant programmer en C. Trève de plaisenterie....
Le probleme est simple : tu veux allouer de la memoire à *tab alors que celui ci n'existe pas !!!! Un exemple pour mieux comprendre :
 
void main(void)
{
  char ***tab;
 
  tab = malloc(i * sizeof(char*));
  if (tab == NULL)
  {
    printf("Probleme d'allocation" );
    exit(1);
  }
}
 
J ai pas testé mais ca devrais marcher.
Ensuite tu pourras faire  
 
  *tab = malloc(j * sizeof(char*));
  **tab = malloc(k * sizeof(char*));
 
et ainsi de suite ....
 
J'espere avoir été clair :D


---------------
WoIP - Video and Voice over IP -  http://www.woip.net/
Reply

Marsh Posté le 15-12-2001 à 16:55:11    

en fait tab est un tableau a 2d mais comme je veut le moifier dans une fonction je le passe en triple pointeur, c tout. Ici je l'ai mit dans la main pour simplifier tout, mais le probleme reste le meme je ne veut pas allouer de la mem pour tab mais pour *tab!

Reply

Marsh Posté le 15-12-2001 à 16:56:18    

magot a écrit a écrit :

en fait tab est un tableau a 2d mais comme je veut le moifier dans une fonction je le passe en triple pointeur, c tout. Ici je l'ai mit dans la main pour simplifier tout, mais le probleme reste le meme je ne veut pas allouer de la mem pour tab mais pour *tab!  




Pour modif un tableau dans une fonction tu n'as pas besoin de le repasser en pointeur ! Un tableau est déjà un pointeur !


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 15-12-2001 à 17:05:07    

effectivement, le nom du tableau est deja un pointeur sur le 1er element de ce tableau


---------------
Super.
Reply

Marsh Posté le 15-12-2001 à 18:00:00    

ex :
 
void changetab(int tab[][]) {
  tab[0][1] = 2;
}
 
void main()
{
  int tab[][];
 
  //allocation  
  ....
  changetab(tab);
}
 
aprés appel tab[0][1] = 2


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 17-12-2001 à 09:45:06    

[SDF]Poire a écrit a écrit :

ex :
 
void changetab(int tab[][]) {
  tab[0][1] = 2;
}
 
void main()
{
  int tab[][];
  //allocation  
  ....
  changetab(tab);
}
 
aprés appel tab[0][1] = 2  




 
:gun:
 
fonction main toujours retourner int :)
 
:ouch:
 
plus grave, c'est quoi cette déclaration ? "int tab[][];" ça ne fonctionne pas ce genre de truc
 
dans tes déclarations de variables:
tu peux mettre "int tab[]" à condition que tu fasses immédiatement une initialisation
 
int main()
{
  int tab[] = {10, 11, 12, 13};
...
 
mais à moins que le C "iso 90" soit radicalement différent du ANSI C, je crois bien que ta déclaration ne fonctionne pas...
 
dans tes définitions de paramètres :
"int tab[]" équivalent à "int *tab" à condition que t'initialise tout de suite derrière  
mais
"int tab[][]" équivalent à "je veux une syntax error"
 
la règle, pour les définitions des paramètres, tu peux ommettre la première dimension, mais les autres sont nécessaires pour calculer les adresses...
 
Pour le pb de magot, j'adhère tout à fait à ce qu'a dit MrTonio, mais j'utiliserai un simple char*
 
int main()
{
  char *tab;
 
  /* je veux un tableau x * y */
  if ( (tab = (char *)malloc(x*y)) == NULL )
    {
      perror("Pb init tab" );
      return(1);
    }
 
  ...
 
  /* je veux accèder à l'élément ligne i, colonne j */
  tab[i*y+j] = machin_truc;
 
  ...
 
}
 
Et hop, no problemo
 
Mogi.

Reply

Marsh Posté le 17-12-2001 à 09:48:27    

mogi a écrit a écrit :

 
...
 
dans tes définitions de paramètres :
"int tab[]" équivalent à "int *tab" à condition que t'initialise tout de suite derrière  




 
n'importe quoi, l'autre ;) euh, c'est un mauvais copier-coller, il fallait lire
 
dans tes définitions de paramètres :
"int tab[]" équivalent à "int *tab"
 
désolé,
Mogi.

Reply

Marsh Posté le 17-12-2001 à 09:48:27   

Reply

Marsh Posté le 17-12-2001 à 15:15:52    

mogi a écrit a écrit :

 
 
n'importe quoi, l'autre ;) euh, c'est un mauvais copier-coller, il fallait lire
 
dans tes définitions de paramètres :
"int tab[]" équivalent à "int *tab"
 
désolé,
Mogi.  




Mon main je lui fais renvoyer ce que je veux.... ;)  
Scuse pour le int tab[][]... j'étais un peu fatigué... je voulais dire int * *tab ou int tab[10][10] par ex....
 :hello:

Reply

Marsh Posté le 30-12-2001 à 16:15:23    

Allô ? Jean-Perrin ? :D


---------------
Un site web qu'il est beau (v2.0)
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed