Initialisation d'un tableau sans connaitre sa dimention?

Initialisation d'un tableau sans connaitre sa dimention? - C - Programmation

Marsh Posté le 05-02-2007 à 02:12:12    

Salut,
 
Comment faire pour déclararer un tableau à une dimention sans connaitre au départ sa dimension?
 
Merci a tous,
 

Reply

Marsh Posté le 05-02-2007 à 02:12:12   

Reply

Marsh Posté le 05-02-2007 à 08:32:48    

On utilise les sytemes d'allocations dynamiques proposés par la fonction malloc (cf man malloc)

Reply

Marsh Posté le 05-02-2007 à 09:01:34    

de toute maniere, à part si c'est une chaine de caracteres, un tableau dont tu ne connais pas la dimension, est un tableau perdu, car en le parcourant, tu ne sais pas là où tu peux tomber dans la mémoire.
 
Edit : j'ai mal lu la question :
pour un tableua de "double" par exemple tu fait un "double *Tab = NULL;"
 
et quand tu connait la dimention, tu fait Tab = (double*)calloc(dimesion_du_tableau_,sizeof(double));

Reply

Marsh Posté le 05-02-2007 à 11:15:55    

comment dire :
 

Code :
  1. double* tab = malloc( taille*sizeof(double) );


 
suffit largement

Reply

Marsh Posté le 05-02-2007 à 11:33:52    

Joel F a écrit :

comment dire :
 

Code :
  1. double* tab = malloc( taille*sizeof(double) );


 
suffit largement


Et même, d'une façon générale :  

Code :
  1. T *a = malloc (sizeof *a * n);


http://mapage.noos.fr/emdel/notes.htm#malloc
 


---------------
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 05-02-2007 à 14:32:09    

Pour résumer,  
 
Je déclare mon tableau de la façon suivante :
 
Je connais pas ma dimension, alors je met une taille maximum,
 
int NBMAX = 20000;
 
double TAB[]=NULL;
 
TAB = (double*)malloc(NBMAX*sizeof(double));
 
Est ce bien ça?

Reply

Marsh Posté le 05-02-2007 à 14:55:38    

c'est du gachis

Reply

Marsh Posté le 05-02-2007 à 15:00:31    

Taz a écrit :

c'est du gachis


 
 
C'est à dire? Pourrais-tu développer?

Reply

Marsh Posté le 05-02-2007 à 15:45:02    

yak6942 a écrit :

Pour résumer,
Je déclare mon tableau de la façon suivante :
Je connais pas ma dimension, alors je met une taille maximum,

 

int NBMAX = 20000;
double TAB[]=NULL;
TAB = (double*)malloc(NBMAX*sizeof(double));
Est ce bien ça?

 

Non. ce que t'as fait ne va pas changer grand chose a ca:
double TAB[20000]; !

 


Pour te donner un exemple, tu fait:
double *TAB;
int taille;
printf("Donnez la taille du tableau :" ); // ou un truc dans le genre.
scanf("%d", &taille); // bon utilise autre fonction que scanf() toi... ce n'ai qu'un exemple ça :)
TAB = malloc( taille * sizeof(double) );

 



Message édité par bad___day le 05-02-2007 à 15:45:51
Reply

Marsh Posté le 05-02-2007 à 16:34:01    

pire. un scanf pourri et pas de vérification du retour de malloc.

Reply

Marsh Posté le 05-02-2007 à 16:34:01   

Reply

Marsh Posté le 05-02-2007 à 16:50:17    

Taz a écrit :

pire. un scanf pourri et pas de vérification du retour de malloc.

 

Ce n'ai qu'un exemple pour lui montrer l'idée hein  ... je ne lui ai pas donner un code source d'un prog !

 

Je lui ai préciser en commentaire de ne pas utiliser le scanf() , je ne le fait que pour l'exemple rapide.

 

Aparement notre ami yak6942 viens de faire connaissance avec malloc donc il devra lire la doc ou un petit cours sur l'utilisation de malloc, où il est certainement indiqué qu'il faut faire une vérification du retour de malloc :)

 



Message édité par bad___day le 05-02-2007 à 16:51:41
Reply

Marsh Posté le 05-02-2007 à 18:04:07    

yak6942 a écrit :


Je connais pas ma dimension, alors je met une taille maximum,

Code :
  1. int NBMAX = 20000;




Non. Tu mets une taille raisonnable.

Code :
  1. double TAB[]=NULL;


Pas du C.

Code :
  1. TAB = (double*)malloc(NBMAX*sizeof(double));


On se tue à dire que le cast est inutile...
 
Je pense que tu n'as rien compris aux réponses. Il faut que tu relises tout et que tu poses des questions précises si nécessaire.
 


---------------
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 05-02-2007 à 18:18:40    

Emmanuel Delahaye a écrit :

On se tue à dire que le cast est inutile...


Qui ça on ?

Reply

Marsh Posté le 05-02-2007 à 18:22:23    

++fab a écrit :

Qui ça on ?


http://forum.hardware.fr/hfr/Progr [...] m#t1510834
http://forum.hardware.fr/hfr/Progr [...] m#t1510843

 



Message édité par Emmanuel Delahaye le 05-02-2007 à 18:22:57

---------------
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 05-02-2007 à 18:33:16    

Emmanuel Delahaye a écrit :

Et même, d'une façon générale :  

Code :
  1. T *a = malloc (sizeof *a * n);



Moi, j'appelle ça d'une façon C-narrow-minded.
 


issus du lien :
"Le compilateur n'est pas C mais par exemple pré-C++98"
Pourquoi pré-C++98 ?
 
"D'autre part, en C++98, un cast se fait avec static_cast<...>"
Non, en C++98, certains casts se font avec static_cast<>, mais pas tous.

Reply

Marsh Posté le 05-02-2007 à 19:45:06    

Tant qu'on est dans les critiques :

Citation :


(cette situation pourrait changer en 2005 avec une nouvelle révision de C++ intégrant les nouveautés de C99).


Faut updater la date [:cupra]
 
(par contre pour le static_cast, il parle du cas du malloc, oui y'en a d'autres mais pas utilisés dans le cas d'un malloc)


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 05-02-2007 à 19:52:12    

0x90 a écrit :

Tant qu'on est dans les critiques :
(par contre pour le static_cast, il parle du cas du malloc, oui y'en a d'autres mais pas utilisés dans le cas d'un malloc)


Le contexte n'est pas mentionné dans la phrase en tout cas. Et je ne vois pas l'intérêt d'utiliser static_cast sur le retour d'un malloc. Il y a notament le C-cast qui convient pour cela.

Reply

Marsh Posté le 05-02-2007 à 20:11:40    

d'un autre coté, je vois pas l'utilité d'utiliser malloc en c++

Reply

Marsh Posté le 05-02-2007 à 20:51:21    

KangOl a écrit :

d'un autre coté, je vois pas l'utilité d'utiliser malloc en c++


Paske je m'a fais eu :o Le gus a posté dans la cat. C :o

Reply

Marsh Posté le 05-02-2007 à 22:32:56    

yak6942 a écrit :

Comment faire pour déclararer un tableau à une dimention sans connaitre au départ sa dimension?


Ben malheureusement, si tu ne connais pas au-moins sa dymension il n'y a rien à faire...  
 

yak6942 a écrit :

Pour résumer,  
 
Je déclare mon tableau de la façon suivante :
 
Je connais pas ma dimension, alors je met une taille maximum,
 
int NBMAX = 20000;
 
double TAB[]=NULL;
 
TAB = (double*)malloc(NBMAX*sizeof(double));
 
Est ce bien ça?


Pour résumer, 2 cas possibles
1) la taille "T" ne dépend pas de toi mais d'une donnée externe (lue dans un fichier, un capteur, un truc que tu ne connais pas quand tu écris le programme)
Alors:
tu déclares juste un pointeur => double *tab;
 
Puis, au moment de ton programme où tu connais enfin la taille "T", tu alloues la mémoire dont t'as besoin => "tab=malloc (T * sizeof(double))" ou bien "tab=malloc(T * sizeof(*tab))"
 
Enfin, quand tu n'as plus besoin de "tab", tu libères la mémoire => free(tab)
 
2) la taille "T" dépend de toi mais elle peut varier parce que tu fais évoluer ton programme (aujourd'hui t'as besoin de 50 doubles, demain ce sera 500, dans 3 ans ce sera 5000) mais, comme le dit Emmanuel, cela ne dépassera jamais une certaine taille "raisonnable" (style ce ne sera jamais 4Go)
Alors:
tu écris une macro avec un nom représentatif => #define TAILLE_MAX      50
 
Puis tu définis ton tableau avec cette macro comme taille => double tab[TAILLE_MAX]
Puis, partout où t'as besoin de balayer ton tableau, tu fais une boucle de 0 jusqu'à TAILLE_MAX
 
Le jour où tu dois le passer de 50 à 500, tu modifies simplement ta macro et tu recompiles
 
OU BIEN (certains n'aiment pas les macro car il y a danger que tu prennes un nom déjà utilisé par les headers officiels => conflit)
tu définis une constante avec un nom représentatif => const unsigned short taille_max=50
 
Puis tu fais comme au dessus mais tu utilises la constante "taille_max" au lieu de la macro "TAILLE_MAX"

Message cité 1 fois
Message édité par Sve@r le 05-02-2007 à 22:41:50

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 05-02-2007 à 22:49:42    

3) Tu utilises les VLA (une extension C99).  
void f( size_t n )
{
    int tab[ n ];
    // la mémoire est libérée à la fin de la portée directement englobante de "tab".
}

Reply

Marsh Posté le 05-02-2007 à 22:54:49    

j'ai un peu tendance à ne pas montrer ça aux débutants ...

Reply

Marsh Posté le 05-02-2007 à 23:14:41    

++fab a écrit :

3) Tu utilises les VLA (une extension C99).  
void f( size_t n )
{
    int tab[ n ];
    // la mémoire est libérée à la fin de la portée directement englobante de "tab".
}


Pas implémentée sur gcc... (status : "broken" )
 
http://gcc.gnu.org/gcc-4.1/c99status.html


---------------
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 06-02-2007 à 14:30:17    

Emmanuel Delahaye a écrit :

Pas implémentée sur gcc... (status : "broken" )
http://gcc.gnu.org/gcc-4.1/c99status.html


En effet, ce n'est implémenté que partiellement. Lorsqu'il y a un risque, GCC emet un warning.
Si l'on utilise pas la construction T[ * ], j'ai l'impression que GCC est OK.

Reply

Marsh Posté le 06-02-2007 à 16:31:03    

Je suis le seul à trouver ça choquant de bouffer 160 000 bytes sur la stack pour un beau tableau?
S'il y a quelques appels de fonctions imbriqués avec pour chacune ce genre de déclarations, ça promet. (Ne parlons meme pas de récursivité ou du jour ou ça passera de #define NBMAX 20000 à #define NBMAX 200000.....)
 
Edit : Ce qui me fait réagir, c'est que vous vous faites plaisir à disserter de l'inutilité du cast, sans éclairer le gars qui pose sa question (de toute évidence débutant) sur un point bien plus critique (stack vs heap).

Message cité 2 fois
Message édité par retrox le 06-02-2007 à 16:35:29
Reply

Marsh Posté le 06-02-2007 à 16:42:21    

retrox a écrit :

Edit : Ce qui me fait réagir, c'est que vous vous faites plaisir à disserter de l'inutilité du cast, sans éclairer le gars qui pose sa question (de toute évidence débutant) sur un point bien plus critique (stack vs heap).


Personnellement, je parlais de mémoire dynamique, alors la pile...


---------------
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 06-02-2007 à 16:59:42    

Sve@r a écrit :

OU BIEN (certains n'aiment pas les macro car il y a danger que tu prennes un nom déjà utilisé par les headers officiels => conflit)
tu définis une constante avec un nom représentatif => const unsigned short taille_max=50
Puis tu fais comme au dessus mais tu utilises la constante "taille_max" au lieu de la macro "TAILLE_MAX"


Et là, tu es conscient d'utiliser les VLA, et pas de la meilleure manière.

Reply

Marsh Posté le 06-02-2007 à 17:02:19    

retrox a écrit :

Edit : Ce qui me fait réagir, c'est que vous vous faites plaisir à disserter de l'inutilité du cast, sans éclairer le gars qui pose sa question (de toute évidence débutant) sur un point bien plus critique (stack vs heap).


Et bien quitte à réagir, va jusqu'au bout, et expose au PO tes lumières.

Reply

Marsh Posté le 06-02-2007 à 17:11:08    

http://fr.wikipedia.org/wiki/Alloc [...] C3%A9moire
 
Pour aller un peu plus loin, la pile est une ressource limitée qu'il vaut mieux éviter de gaspiller. Au dela de quelques dizaines (voire centaines) d'éléments dans un tableau (suivant la taille de chaque élément), il est préférable d'utiliser l'allocation sur le tas plutot que sur la pile.
 
On parle souvent de portabilité du code sur ce forum; écrire des fonctions avec comme postulat que la pile fait plusieurs centaines de Ko, c'est le début des ennuis.


Message édité par retrox le 06-02-2007 à 17:19:55
Reply

Marsh Posté le 06-02-2007 à 17:35:49    

euh c'est pas comme si on lui vait deja donner la soluce avec malloc :| [:pingouino]

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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