Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1447 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  question bete : probleme dans la déclaration d'un tableau

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

question bete : probleme dans la déclaration d'un tableau

n°269358
Library
Posté le 13-12-2002 à 21:36:13  profilanswer
 

bonjour
 
je débute en C (je connais bien le php mais niveau déclarations de variables c'est pas ca :D) et j'ai un probleme dans la déclaration d'un tableau qui est sensé avoir une taille rentrée par les soins de l'utilisateur du programme. Voici mon code source :
 
 

Code :
  1. #include <stdio.h>
  2. /*fin des include*/
  3. int main(void)
  4. {
  5.   int nbcouches,i;
  6.   printf ("nombre de couches du réseau (sans compter la première) ? " );
  7.   scanf("%d",&nbcouches);
  8.  
  9.   int couche[nbcouches]; // ligne 11
  10.   for (i=0;i<nbcouches;i++) printf (i);
  11.    return 0;
  12. }

 
 
erreurs :

config.c: In function `main':
config.c:11: parse error before `int'
config.c:12: warning: passing arg 1 of `printf' makes pointer from integer without a cast


 
quelqu'un peut m'aider ?

mood
Publicité
Posté le 13-12-2002 à 21:36:13  profilanswer
 

n°269360
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 13-12-2002 à 21:40:22  profilanswer
 

printf("%d ", i);
 
le reste du code est correct en C99, mais tu devrais préféré l'allocation dynamique avec malloc. quel est ton compilateur?


---------------
du bon usage de rand [C] / [C++]
n°269363
Library
Posté le 13-12-2002 à 21:44:02  profilanswer
 

j'ai modifié mon print (i) avec ce que tu m'as dit.
ca m'affiche toujours
 
 


config.c: In function `main':
config.c:11: parse error before `int'

 
 
(enfin ca fait deja une erreur de résolue ;))
l'autre erreur vient du tableau non ?
 
 
j'utilise gcc, mais je sais pas a quoi sert malloc.

n°269367
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 13-12-2002 à 21:51:13  profilanswer
 

quelle version de gcc? (gcc --version)


---------------
du bon usage de rand [C] / [C++]
n°269369
Library
Posté le 13-12-2002 à 21:52:49  profilanswer
 

2.96

n°269374
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 13-12-2002 à 21:56:26  profilanswer
 

ben t'as 3 solution: soit tu mets à jour ton compilateur, soit tu cherches un cours sur les allocations dynamiques en C (site ou livre), soit t'attend qu'une bonne ame ou moi meme t'explique (mais la tu risque peut etre d'attendre indéfiniment  :D )


---------------
du bon usage de rand [C] / [C++]
n°269376
Library
Posté le 13-12-2002 à 21:57:47  profilanswer
 

Taz@PPC a écrit :

ben t'as 3 solution: soit tu mets à jour ton compilateur, soit tu cherches un cours sur les allocations dynamiques en C (site ou livre), soit t'attend qu'une bonne ame ou moi meme t'explique (mais la tu risque peut etre d'attendre indéfiniment  :D )


 
c'est si compliqué de définir un tableau avec une variable comme nombre de cellules ? :??:

n°269377
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 13-12-2002 à 22:03:47  profilanswer
 

Library a écrit :


 
c'est si compliqué de définir un tableau avec une variable comme nombre de cellules ? :??:

non, mais tu est tres debutant. tu as deja entendu parlé des pointeurs :dawa: ! ton code est correct mais est fait partie de la derière révision du C (norme C99): ca fonctionne mais dans toncas il vaut meiux préférer l'allocation dynamique (taille inconnue à la compilation)
 
petit exemple:
 

Code :
  1. type *tab;
  2. unsigned size;
  3. scanf("%u", &size);
  4. // allocation dynamique
  5. tab=malloc(size * sizeof(type)); // ou size * sizeof *tab;
  6. // utlisation comme pour un tableau tab[i]
  7. //desallocation : obligatoire sinon fuite mémoire
  8. free(tab);


Message édité par Taz@PPC le 13-12-2002 à 22:05:06

---------------
du bon usage de rand [C] / [C++]
n°269382
Library
Posté le 13-12-2002 à 22:11:58  profilanswer
 

Taz@PPC a écrit :

non, mais tu est tres debutant. tu as deja entendu parlé des pointeurs :dawa: ! ton code est correct mais est fait partie de la derière révision du C (norme C99): ca fonctionne mais dans toncas il vaut meiux préférer l'allocation dynamique (taille inconnue à la compilation)
 
petit exemple:
 

Code :
  1. type *tab;
  2. unsigned size;
  3. scanf("%u", &size);
  4. // allocation dynamique
  5. tab=malloc(size * sizeof(type)); // ou size * sizeof *tab;
  6. // utlisation comme pour un tableau tab[i]
  7. //desallocation : obligatoire sinon fuite mémoire
  8. free(tab);




 
j'avais deja essayé de programmer en C y a qq temps, je m'étais heurté au probleme des pointeurs. Apres un peu de lecture, j'avais rien compris :D
je vais essayer de m'informer plus sur ce que c'est, mais en attendant, si je me sers de ton code est ce que tab est un tableau "normal" avec le nombre de cellules que je veux ?

n°269385
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 13-12-2002 à 22:17:48  profilanswer
 

oui. fais un test et si tu as des problèmes ou que tu hesites, poste ton code (au fait pour malloc il faut inclure <stdlib.h> ou <malloc.h> (stdlib inclus lui meme malloc))


---------------
du bon usage de rand [C] / [C++]
mood
Publicité
Posté le 13-12-2002 à 22:17:48  profilanswer
 

n°269392
Library
Posté le 13-12-2002 à 22:31:36  profilanswer
 

j'ai encore plein d'erreurs :(
 
voici mon code :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /*fin des include*/
  4. int main(void)
  5. {
  6.   int nbcouches,i;
  7.   printf ("nombre de couches du réseau (sans compter la première) ? " );
  8.   scanf("%d",&nbcouches);
  9.  
  10.   type *tab;
  11.   unsigned size;
  12.    scanf("%u", &size);
  13.    // allocation dynamique
  14.    tab=malloc(size * sizeof(type));// ou size * sizeof *tab;
  15.    // utlisation comme pour un tableau tab[i]
  16.  
  17.    //desallocation : obligatoire sinon fuite mémoire
  18.   free(tab);
  19.   /*int couche[nbcouches];*/
  20.   /*for (i=0;i<nbcouches;i++) printf ("%d ",i);*/
  21.    return 0;
  22. }

 
 
 
et les erreurs :
 

config.c: In function `main':
config.c:12: `type' undeclared (first use in this function)
config.c:12: (Each undeclared identifier is reported only once
config.c:12: for each function it appears in.)
config.c:12: `tab' undeclared (first use in this function)
config.c:12: warning: statement with no effect
config.c:13: parse error before `unsigned'
config.c:14: `size' undeclared (first use in this function)
config.c:15: parse error before `/'
config.c:8: warning: unused variable `i'

 
 
faut que je déclare des variables ?

n°269404
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 13-12-2002 à 22:45:34  profilanswer
 

euh type ct pour dire la manière générique. si tu veux un tableau d'int, type, c'est int. adapte le code  :lol:


---------------
du bon usage de rand [C] / [C++]
n°269420
Library
Posté le 13-12-2002 à 23:00:28  profilanswer
 

je savais pas ;)
je fais ca alors :D

n°269778
Library
Posté le 14-12-2002 à 20:50:47  profilanswer
 

c'est bon ca ca marche :)
merci :)
 
maintenant j'ai un autre probleme, cette fois pour afficher un texte. Il n'y a pas d'erreur lors de la compilation, mais le printf me revoie "Erreur de segmentation". Faut faire quoi pour que ca marche ?
 
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /*fin des include*/
  4. int main(void)
  5. {
  6.   int nbcouches,i;
  7.   float eta;
  8.   int *couche;
  9.   char *fichier;
  10.  
  11.   printf ("Nom du fichier d'exemples : " );
  12.   scanf("%s",fichier);
  13.  
  14.   printf ("%s ",fichier);
  15.    return 0;
  16. }

n°269782
R3g
fonctionnaire certifié ITIL
Posté le 14-12-2002 à 21:02:58  profilanswer
 

Library a écrit :

c'est bon ca ca marche :)
merci :)
 
maintenant j'ai un autre probleme, cette fois pour afficher un texte. Il n'y a pas d'erreur lors de la compilation, mais le printf me revoie "Erreur de segmentation". Faut faire quoi pour que ca marche ?
 
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /*fin des include*/
  4. int main(void)
  5. {
  6.   int nbcouches,i;
  7.   float eta;
  8.   int *couche;
  9.   char *fichier;
  10.  
  11.   printf ("Nom du fichier d'exemples : " );
  12.   scanf("%s",fichier);
  13.  
  14.   printf ("%s ",fichier);
  15.    return 0;
  16. }

 


Il faut allouer de la mémoire à ton tableau avant d'écrire dedans. Là, fichier est juste nu pointeur, avec rien derrière, c'est même bizarre que le scanf passe.
->AVANT toute utilisation de ton tableau,il faut allouer la mémoire (malloc)
->APRES la dernière utilisation de ton tableau il faut libérer la mémoire (free)

n°269787
Library
Posté le 14-12-2002 à 21:09:13  profilanswer
 

merci, ca marche :)
en plus je crois que je commence a comprendre les pointeurs :D

n°269853
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 15-12-2002 à 00:24:31  profilanswer
 

Library a écrit :

merci, ca marche :)
en plus je crois que je commence a comprendre les pointeurs :D

:hello:  :D la route est encore longue j'ai bien peur


---------------
du bon usage de rand [C] / [C++]
n°269896
Musaran
Cerveaulté
Posté le 15-12-2002 à 04:13:57  profilanswer
 

Code :
  1. int (*(*pfpai)())[N];


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°269910
Library
Posté le 15-12-2002 à 11:14:28  profilanswer
 

Taz@PPC a écrit :

:hello:  :D la route est encore longue j'ai bien peur


 
oui ca j'en suis sur :D
 
d'ailleurs j'ai un autre probleme  :whistle:  
 
je veux concaténer des chaines de caracteres. J'ai vu qu'il fallait se servir de strcat. Mais comment faire pour concatener une chaine de caracteres avec un entier ou un float ?
j'ai essayé de changer le type de l'int en char mais j'ai pas réussi.
comment faire ?

n°269919
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 15-12-2002 à 11:48:30  profilanswer
 

avec sprintf. tu veux pas t'acheter un livre sur le C (comme le Kernighan & Richie) ou installer linux histoire d'avoir les man sont la main, sachant qu'il n'existe pas à ma connaissance de tutoriel valable pour apprendre le C sur le net. si tu as des problèmes, on va t'aider, mais si il faut qu'on te decrive tout la bibliothèque standard, ca risque de prendre du temps, et pour nous, et pour toi.


---------------
du bon usage de rand [C] / [C++]
n°269930
Library
Posté le 15-12-2002 à 12:00:59  profilanswer
 

je suis sous linux (mais je sais pas encore trop m'en servir). Faut taper quoi pour avoir les aides ? (man je sais, mais quoi apres ?)
 
oui faudra surement que je m'achete un bouquin, mais la j'en ai pas sous la main.
j'ai essayé de trouver sur le net et c'est vrai qu'il y a pas grand chose.

n°269934
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 15-12-2002 à 12:09:09  profilanswer
 

man <nom_de_la_fonction>
 
 
man printf
man sprintf
man pow
etc...
 
si tu ne trouves pas essaye "man -a <fonction>" ou "apropos <fonction>"


---------------
du bon usage de rand [C] / [C++]
n°270037
lorill
Posté le 15-12-2002 à 16:47:44  profilanswer
 

man -k plutot, non ?

n°270038
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 15-12-2002 à 16:51:07  profilanswer
 

-k     Equivalent to apropos.
 
-a     By default, man  will  exit  after  displaying  the first  manual  page  it  finds.   Using this option forces man to display all  the  manual  pages  that match name, not just the first.



---------------
du bon usage de rand [C] / [C++]
n°270048
Library
Posté le 15-12-2002 à 17:58:16  profilanswer
 

en tous cas ca marche :)
merci... et a la prochaine erreur :D

n°270080
Library
Posté le 15-12-2002 à 20:00:06  profilanswer
 

elle a pas tardé a venir :D
enfin c'est pas une erreur, mais je sais pas du tout comment programmer ce que je veux :
 
je veux un tableau de chaines de caracteres, i.e. dans chaque contenu[i] il y aura une chaine de caracteres. Je pense que c'est un tableau de caracteres contenu[i][j] mais je sais pas trop comment le faire.
 
a mon avis c'est un  
char **contenu;
 
mais apres je met quoi dans les sizeof du malloc ?
je met  
*contenu=malloc(nombre*sizeof(int));
contenu=malloc(25*sizeof(char));
?
(sachant que mes chaines de caracteres font environ 25 caracteres)
 
merci :)

n°270081
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 15-12-2002 à 20:06:30  profilanswer
 

sizeof(char) == 1 par définition.
 
si tu connais la taille des tes chaines, pas besoin de malloc a priori
 

Code :
  1. char **contenu;
  2. contenu=malloc(n_string * sizeof(char *));
  3. for(i=0; i<n_string; ++i)
  4. {
  5.   contenu[i]=malloc(taille_string);
  6. }
  7. // et boucle analogue pour la désallocation, puis free(contenu)


Message édité par Taz@PPC le 15-12-2002 à 20:06:42

---------------
du bon usage de rand [C] / [C++]
n°270092
Kyle_Katar​n
Posté le 15-12-2002 à 21:06:18  profilanswer
 

il vaut mieux "caster" explicitement le malloc
 

Code :
  1. pint = (type *)malloc(N*sizeof(type));


 
avec "type" le type de données (char, int, ....) sinon sous certains OS (sur nos serveurs HP par exemple) y'a des warnings à la con à la compilation.
 
Et n'oubliez pas le  
 

Code :
  1. if pint==NULL
  2. {
  3.    printf("Erreur de malloc" );
  4.    exit(-1);
  5. }


 
Pour être sûr qu'il n'y a pas eu d'erreurs d'allocation

n°270094
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 15-12-2002 à 21:11:00  profilanswer
 

non, il vaut mieux pas. retourne au delphi [:dawa]


---------------
du bon usage de rand [C] / [C++]
n°270095
Library
Posté le 15-12-2002 à 21:15:13  profilanswer
 

merci, ca marche bien :)
 
enfin j'ai tjs un probleme  :ange:  
j'essaie de "mélanger" mon tableau de chaines de caracteres.
 

Code :
  1. char tmp[25];
  2. char **contenu;
  3.   contenu=malloc(nombre*sizeof(char *));
  4.   for (i=0;i<nombre;i++)
  5.     {
  6.       contenu[i]=malloc(25);
  7.     }
  8. for (i=0;i<nombre;i++)
  9. {
  10. e=floor(100*drand48());
  11. f=floor(100*drand48());
  12. /*printf ("%s",contenu[e]);*/
  13. tmp=contenu[e]; /* ligne 77 */
  14. contenu[e]=contenu[f];
  15. contenu[f]=tmp;
  16. }

 
 
ca me met "donnees.c:77: incompatible types in assignment"
 

n°270104
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 15-12-2002 à 21:42:46  profilanswer
 

donne un morceau de code plus complet et expliques ce que tu veux faire.
tu melanges tableau et pointeur.
tmp est un tableau de char et ne peut pas etre modifié (son contenu si) et e est un type flottant: c'est absolument incompatible. il faut deja absolument que e et f soit des entiers positifs et que leur index soit valide. ensuite si tu veux permuter ces éléments, le plus simple ce n'est pas de tenter de recopier le tableau (ce que tu voudrais bien faire), mais de permuter les pointeur. tmp doit donc etre un char*
 
 
 
commande un livre pour nowel.
 
du bon usage du générateur de nombres pseudo-aléatoire (drand48() n'est pas standard, mais ca vaut pour lui aussi)
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h> /* pour srand, rand et RAND_MAX */
  3. #include <time.h> /* pour time */
  4. unsigned myrand1(unsigned N)
  5. {
  6.   /**
  7.    * les bits de poids faibles ont une dsitribution tres peu alétoire
  8.    * d'ou des sequences 0 1 0 1 0 1 0 1 0
  9.    * ce n'est donc pas une bonne methode
  10.    */
  11.   return (unsigned)rand()%N;
  12. }
  13. unsigned myrand2(unsigned N)
  14. {
  15.   /**
  16.    * beaucoup plus aléatoire
  17.    * (la je te fais pas l'explication)
  18.    */
  19.   return (unsigned)((double)rand()/((double)RAND_MAX+1)*N);
  20. }
  21. int main()
  22. {
  23.   /**
  24.    * initialisation du générateur de nombres pseudos-aleatoires
  25.    * on iutilise généralement le temps courant (nombre de secondes ecoulees
  26.    * depuis 01/01/1970
  27.    * srand => seed == 'graine'
  28.    */
  29.   srand(time(NULL));
  30.   unsigned n;
  31.   scanf("%u", &n);
  32.   int i;
  33.   for(i=0; i<10; ++i)
  34.     {
  35.       printf("%u\t%u\n", myrand1(n), myrand2(n));
  36.     }
  37.   return EXIT_SUCCESS;
  38. }


Message édité par Taz@PPC le 15-12-2002 à 21:46:39

---------------
du bon usage de rand [C] / [C++]
n°270106
Library
Posté le 15-12-2002 à 21:53:58  profilanswer
 

Taz@PPC a écrit :

donne un morceau de code plus complet et expliques ce que tu veux faire.
tu melanges tableau et pointeur.
tmp est un tableau de char et ne peut pas etre modifié (son contenu si) et e est un type flottant: c'est absolument incompatible. il faut deja absolument que e et f soit des entiers positifs et que leur index soit valide. ensuite si tu veux permuter ces éléments, le plus simple ce n'est pas de tenter de recopier le tableau (ce que tu voudrais bien faire), mais de permuter les pointeur. tmp doit donc etre un char*
 
 
 
commande un livre pour nowel.
 
du bon usage du générateur de nombres pseudo-aléatoire (drand48() n'est pas standard, mais ca vaut pour lui aussi)
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h> /* pour srand, rand et RAND_MAX */
  3. #include <time.h> /* pour time */
  4. unsigned myrand1(unsigned N)
  5. {
  6.   /**
  7.    * les bits de poids faibles ont une dsitribution tres peu alétoire
  8.    * d'ou des sequences 0 1 0 1 0 1 0 1 0
  9.    * ce n'est donc pas une bonne methode
  10.    */
  11.   return (unsigned)rand()%N;
  12. }
  13. unsigned myrand2(unsigned N)
  14. {
  15.   /**
  16.    * beaucoup plus aléatoire
  17.    * (la je te fais pas l'explication)
  18.    */
  19.   return (unsigned)((double)rand()/((double)RAND_MAX+1)*N);
  20. }
  21. int main()
  22. {
  23.   /**
  24.    * initialisation du générateur de nombres pseudos-aleatoires
  25.    * on iutilise généralement le temps courant (nombre de secondes ecoulees
  26.    * depuis 01/01/1970
  27.    * srand => seed == 'graine'
  28.    */
  29.   srand(time(NULL));
  30.   unsigned n;
  31.   scanf("%u", &n);
  32.   int i;
  33.   for(i=0; i<10; ++i)
  34.     {
  35.       printf("%u\t%u\n", myrand1(n), myrand2(n));
  36.     }
  37.   return EXIT_SUCCESS;
  38. }




 
ce que je veux faire c'est échanger les contenus de contenu[e] et contenu[f]. Pour cela, il faut que je passe pas une variable intermédiaire. Comme contenu[e] et contenu[f] sont des chaines de caracteres, il faut donc que tmp soit une chaine de caracteres non ?
e et f sont des entiers positifs je pense (floor d'un nombre flottant positif)

n°270110
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 15-12-2002 à 22:08:05  profilanswer
 

merci de m'avoir cité en entier  ;)  
 
 
contenu[e] et contenu[f] ne sont pas des chaines de caractères, mais des pointeurs vers des zones contigues de bits pouvant etre interprétées comme une chaine de caractère. permute les pointeurs et c'est gagné. les contenus pointés ne sont pas déplacés, seuls les pointeurs qui les référence sont permutés.
 
et assure toi plus sérieusement de la validité de e et f qui doivent etre de type entier (pas flottant) et j'ai bien dit type, et d'index valide [0 , n[


---------------
du bon usage de rand [C] / [C++]
n°270112
Library
Posté le 15-12-2002 à 22:24:14  profilanswer
 

en mettant char * tmp, ca ne met plus d'erreur :)
j'ai déclaré e et f comme entiers, il m'aurait mis une erreur si j'avais voulu mettre un float dedans non ?
et je crois que drand48() renvoie un float entre 0 et 1. Comme je le multiplie par le nombre d'éléments de mon tableau ca devrait rouler

n°270116
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 15-12-2002 à 22:30:31  profilanswer
 

regarde le code que j'ai egalement posté qui renvoie pardéfaut un entier positif ou nul et qui a pour lui d'etre standard


---------------
du bon usage de rand [C] / [C++]
n°270117
Library
Posté le 15-12-2002 à 22:35:58  profilanswer
 

au temps pour moi, je m'étais planté dans mon code : le 100 c'est en fait nombre (mais comme au début je testais que pour nombre=100, j'ai mis 100 sans faire expres)
 
sinon faut que je change mon rand, drand48() ne me donne pas de bons résultats (bcp de valeurs proches de 9). C'est normal ca ?
ton code donne de bons résultats ?

n°270118
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 15-12-2002 à 22:38:58  profilanswer
 

Library a écrit :

au temps pour moi, je m'étais planté dans mon code : le 100 c'est en fait nombre (mais comme au début je testais que pour nombre=100, j'ai mis 100 sans faire expres)
 
sinon faut que je change mon rand, drand48() ne me donne pas de bons résultats (bcp de valeurs proches de 9). C'est normal ca ?
ton code donne de bons résultats ?

:heink: il marche impeccablement mais peut etre l'utilsie mal. tu as bien mis le srand(time(NULL)) ? montre ton code complet modifié


---------------
du bon usage de rand [C] / [C++]
n°270119
Library
Posté le 15-12-2002 à 22:42:36  profilanswer
 

nan en fait c'est bon. c'est du à une sélection de valeurs que j'ai faite qui a pour effet de garder autant de "grandes" valeurs que de valeurs "moins grandes"
donc ca me garde bcp de 9.
 
j'ai vérifié sur 10000 rand, ca fait une moyenne de 0.497895, c'est pas mal ;)
 
encore merci pour ton aide :)
je vais arreter pour ce soir :D

n°270983
Library
Posté le 16-12-2002 à 21:51:19  profilanswer
 

J'ai un probleme pour déclarer un tableau en variable globale :
mon tableau global qui marche pas c'est *couche (enfin c'est encore un pointeur au moment ou je le déclare)
je commence par récuperer des valeurs dans un fichier (fonction config). Ensuite, dans la fonction main je défini mon tableau couche a partir des donnees que j'ai récupéré.
mon probleme est que lorsque je met "printf("%d",couche[0]);" dans ma fonction main ca me met "Errreur de segmentation" (alors que lorsque je met la meme ligne dans la fonction config ca m'affiche ce qu'il faut.
 
comment faire ?
 
 
mon code :

Code :
  1. #include <time.h>
  2. #include <math.h>
  3. /*fin des include*/
  4. float * w;
  5. int nbcouches,moyennisation,recup_poids,verif_appr,nbpresentations,fonction_cachee,fonction_sortie;
  6. int *couche;
  7. float eta;
  8. char fichier_exemples[20],fichier_verif[20];
  9. double drand48(void);
  10. void srand48 (long int seed);
  11. int main(void)
  12. {
  13.   /*fonction de recuperation des donnees du fichier de configuration du reseau*/
  14.   void config (char fichier[20]);
  15.  
  16.   char fichier[20];
  17.   int max,i;
  18.  
  19.   /*max=couche[0];
  20.   for (i=0;i<=nbcouches;i++)  
  21.     {
  22.       if (couche[i]>max) max=couche[i];
  23.       }*/
  24.   /*printf("%d",couche[0]);  */
  25.     /* w=malloc(nbcouches*max*max*sizeof(float));*/
  26.   /* w[c][i][j]=w[c*max*max+i*max+j] est le poids de la connexion allant entre  
  27. le neurone i de la couche c-1 au neurone j de la couche c*/
  28.  
  29.   printf ("Nom du fichier de config : " );
  30.   scanf("%s",fichier);
  31.   config(fichier);
  32.   free(couche);
  33. return 0;
  34. }
  35. void config (char fichier[20])
  36. {
  37.   FILE *id_fichier;
  38.   int i;
  39.  
  40.   id_fichier=fopen(fichier,"r" );
  41.   fscanf(id_fichier,"%d",&nbcouches);
  42.   couche=malloc((nbcouches+1)*sizeof(int));
  43.   for (i=0;i<nbcouches;i++)
  44.     {
  45.       if (fscanf(id_fichier,"%d;",&couche[i])!=1) printf ("Erreur de lecture" );
  46.     }
  47.   fscanf(id_fichier,"%d",&couche[nbcouches]);
  48.   fscanf(id_fichier,"%f",&eta);
  49.   fscanf(id_fichier,"%s",fichier_exemples);
  50.   fscanf(id_fichier,"%s",fichier_verif);
  51.   fscanf(id_fichier,"%d",&moyennisation);
  52.   fscanf(id_fichier,"%d",&recup_poids);
  53.   fscanf(id_fichier,"%d",&verif_appr);
  54.   fscanf(id_fichier,"%d",&nbpresentations);
  55.   fscanf(id_fichier,"%d",&fonction_cachee);
  56.   fscanf(id_fichier,"%d",&fonction_sortie);
  57.  
  58.   fclose(id_fichier);
  59.  
  60.   /*printf("%d\n",nbcouches);
  61.   for (i=0;i<=nbcouches;i++) printf("%d;",couche[i]);
  62.   printf("\n%s\n%s\n%d\n%d\n%d\n%d\n%d\n%d\n",fichier_exemples,fichier_verif,moyennisation,recup_poids,verif_appr,nbpresentations,fonction_cachee,fonction_sortie);*/
  63.   printf("%d ",couche[0]);
  64. }


 
merci :)


Message édité par Library le 16-12-2002 à 21:51:59
n°271114
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 17-12-2002 à 08:08:41  profilanswer
 

c pas le printf qui merde, c'est ça
 
w=malloc(nbcouches*max*max*sizeof(float));
w[c][i][j]=w[c*max*max+i*max+j]
 
sachant que w est un float*. par contre ton code est assez mal foutu. j'ai jamais vu autant de variables globales. et il est inutile de donner les prototypes de fonctions des bibliotheques (ca sert à ça les .h) et si tu définis tes fonctions utilisateurs apres main, à ce moment la, mets les prototypes justes apres les includes
 
et au fait: tu peux combiner tout tes fscanf en un seul


Message édité par Taz@PPC le 17-12-2002 à 08:10:10

---------------
du bon usage de rand [C] / [C++]
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  question bete : probleme dans la déclaration d'un tableau

 

Sujets relatifs
[PHP] pb de generation de tableau auto 1 ligne Ok 2eme NaN[ACCESS] Problème de requette
Requête SQL sur controle ADO - ProblèmeResalut a vous les masters java , question de newbie 2eme volet :
[JAVA] Problème avec javax.servlet :/[TOMCAT] question newbie
question sur les downloads...[JS] Petit probleme de retour à la window par défaut apres un popup
Question sur les CSSdernier probleme a resoudre.
Plus de sujets relatifs à : question bete : probleme dans la déclaration d'un tableau


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR