Problème avec la taille d'un tableau [résolu]

Problème avec la taille d'un tableau [résolu] - C - Programmation

Marsh Posté le 07-12-2004 à 23:06:34    

Hello tout le monde !
 
D'après ce que j'ai compris, un tableau doit avoir une taille bien définie si on veut pouvoir espérer le compiler (j'ai entendu parler d'allocations dynmaiques et autre joyeusetés, mais j'en suis pas encore là). Donc au début de mon code (après les includes) j'ai :
 

Code :
  1. const int longueur_max = 100;


 
puis dans ma main je déclare une chaîne :
 

Code :
  1. char mot[longueur_max] = "programmation";


 
Malheureusement quand je tente de compiler j'ai ceci :
 

variable-sized object may not be initialized


 
mais si je fais  
 

Code :
  1. char mot[100] = "programmation";


 
Pas de problèmes à la compile ! :heink: Je pige pas trop... merci de votre aide !


Message édité par Evolvox le 08-12-2004 à 19:35:03

---------------
gaymer's est la personne la plus formidable jamais rencontrée dans toute ma vie, je lui achèterais un makato et au moins les 4 news pourries quotidiennes qui vont avec
Reply

Marsh Posté le 07-12-2004 à 23:06:34   

Reply

Marsh Posté le 08-12-2004 à 00:38:10    

"const" ne signifie pas "constante" mais "ne peut être réaffecter par la suite". Un tableau étant constuit par un type et une expression constante, ton compilateur a donc raison

Reply

Marsh Posté le 08-12-2004 à 14:44:42    

Taz a écrit :

"const" ne signifie pas "constante" mais "ne peut être réaffecter par la suite". Un tableau étant constuit par un type et une expression constante, ton compilateur a donc raison


 
rien a voir, mais la au taf on a un gcc 2.96 (on fait du c90). Si on update y'a risque de pb d'apres toi ? (truc qui compile pu, ce genre de gag)

Reply

Marsh Posté le 08-12-2004 à 15:10:15    

si tu veut définir une vraie constante fait une macro  
 
#define POUET 100
 
et tout sera remplacé par le préprocesseur

Reply

Marsh Posté le 08-12-2004 à 15:22:04    

Ouais, enfin y a plus simple, hein.  
  const char * tab = "programmation";
 
  const char tab[] = "programmation";
 
Ou même si ça t'amuse (en C99 uniquement, avec les VLA):
  char tab[taille];
  strncpy(tab, "programmation", sizeof (tab));

Reply

Marsh Posté le 08-12-2004 à 15:57:05    

Lam's> pq en C99 uniquement ?

Reply

Marsh Posté le 08-12-2004 à 16:32:45    

push a écrit :

Lam's> pq en C99 uniquement ?


Si taille n'est pas une constante, alors la taille du tableau n'est pas connue à la compilation, et le C90 (le C Ansi) ne l'accepte pas.  
 
Par contre, le C99 autorise la création de Variable-Length Arrays, dont la taille n'est connue qu'à l'exécution. Dans mon pseudo-bout de code, taille était une variable.  

Reply

Marsh Posté le 08-12-2004 à 16:42:08    

chrisbk a écrit :

rien a voir, mais la au taf on a un gcc 2.96 (on fait du c90). Si on update y'a risque de pb d'apres toi ? (truc qui compile pu, ce genre de gag)

non, je pense pas. Mais tu devrais d'abord t'assurer que ton fonctionne bien avec quelque chose genre -std=gnu89 .
Après si c'est propre, ça devrait très bien passé. Les seuls trucs qui vont chier, c'est les trucs de type-punning sur les pointeurs et les cast de l-values, mais normalement, dans du code propre, on en trouve pas.

Reply

Marsh Posté le 08-12-2004 à 19:34:38    

Taz a écrit :

"const" ne signifie pas "constante" mais "ne peut être réaffecter par la suite". Un tableau étant constuit par un type et une expression constante, ton compilateur a donc raison


 
Mais je n'ai pas mis la faute une seule seconde sur le copilateur. :D
 
Merci pour vos réponses  :)  


---------------
gaymer's est la personne la plus formidable jamais rencontrée dans toute ma vie, je lui achèterais un makato et au moins les 4 news pourries quotidiennes qui vont avec
Reply

Marsh Posté le 08-12-2004 à 21:16:57    

Evolvox a écrit :

D'après ce que j'ai compris, un tableau doit avoir une taille bien définie si on veut pouvoir espérer le compiler (j'ai entendu parler d'allocations dynmaiques et autre joyeusetés, mais j'en suis pas encore là). Donc au début de mon code (après les includes) j'ai :
 

Code :
  1. const int longueur_max = 100;


 
puis dans ma main je déclare une chaîne :
 

Code :
  1. char mot[longueur_max] = "programmation";


 
Malheureusement quand je tente de compiler j'ai ceci :
 

variable-sized object may not be initialized




C'est normal. En C90 (le C le plus en vogue), l'expression qui est entre les crochets doit être une 'expression constante', c'est à dire une valeur numérique valide, une macro représentant une valeur numérique valide ou un enum. Le code que tu proposes est appelé 'VLA' (Variable Length Array) et n'est disponible (en théorie) que sur les compilateur à la norme C99. (rare, mais c'est le cas de gcc 3.x si on utilise les bons flags)

Citation :


mais si je fais  
 

Code :
  1. char mot[100] = "programmation";


 
Pas de problèmes à la compile !


C'est normal, '100' est une 'expression constante', et ton compilateur (probabement C90) avale ça sans problèmes.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 08-12-2004 à 21:16:57   

Reply

Marsh Posté le 08-12-2004 à 23:06:43    

N'empeche qu'avec un const int dont la valeur est definie a la declaration, le compilo a toutes les infos dont il a besoin pour reserver le tableau. Il n'y a pas de raison technique qui l'empeche de le faire.

Reply

Marsh Posté le 08-12-2004 à 23:09:24    

matafan a écrit :

N'empeche qu'avec un const int dont la valeur est definie a la declaration, le compilo a toutes les infos dont il a besoin pour reserver le tableau. Il n'y a pas de raison technique qui l'empeche de le faire.


Oui, c'est une extension connue de gcc...


Message édité par Emmanuel Delahaye le 08-12-2004 à 23:09:34

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

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