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

  FORUM HardWare.fr
  Programmation
  C

  Initialisation d'un tableau sans connaitre sa dimention?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Initialisation d'un tableau sans connaitre sa dimention?

n°1510764
yak6942
Posté le 05-02-2007 à 02:12:12  profilanswer
 

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

mood
Publicité
Posté le 05-02-2007 à 02:12:12  profilanswer
 

n°1510774
Joel F
Real men use unique_ptr
Posté le 05-02-2007 à 08:32:48  profilanswer
 

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

n°1510780
Ange_blond
Posté le 05-02-2007 à 09:01:34  profilanswer
 

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));

n°1510834
Joel F
Real men use unique_ptr
Posté le 05-02-2007 à 11:15:55  profilanswer
 

comment dire :
 

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


 
suffit largement

n°1510843
Emmanuel D​elahaye
C is a sharp tool
Posté le 05-02-2007 à 11:33:52  profilanswer
 

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/
n°1510919
yak6942
Posté le 05-02-2007 à 14:32:09  profilanswer
 

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?

n°1510932
Taz
bisounours-codeur
Posté le 05-02-2007 à 14:55:38  profilanswer
 

c'est du gachis

n°1510935
yak6942
Posté le 05-02-2007 à 15:00:31  profilanswer
 

Taz a écrit :

c'est du gachis


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

n°1510959
bad___day
Posté le 05-02-2007 à 15:45:02  profilanswer
 

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
n°1510992
Taz
bisounours-codeur
Posté le 05-02-2007 à 16:34:01  profilanswer
 

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

mood
Publicité
Posté le 05-02-2007 à 16:34:01  profilanswer
 

n°1511005
bad___day
Posté le 05-02-2007 à 16:50:17  profilanswer
 

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
n°1511066
Emmanuel D​elahaye
C is a sharp tool
Posté le 05-02-2007 à 18:04:07  profilanswer
 

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/
n°1511070
++fab
victime du syndrome IH
Posté le 05-02-2007 à 18:18:40  profilanswer
 

Emmanuel Delahaye a écrit :

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


Qui ça on ?

n°1511074
Emmanuel D​elahaye
C is a sharp tool
Posté le 05-02-2007 à 18:22:23  profilanswer
 

++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/
n°1511078
++fab
victime du syndrome IH
Posté le 05-02-2007 à 18:33:16  profilanswer
 

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.

n°1511100
0x90
Posté le 05-02-2007 à 19:45:06  profilanswer
 

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.
n°1511102
++fab
victime du syndrome IH
Posté le 05-02-2007 à 19:52:12  profilanswer
 

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.

n°1511111
KangOl
Profil : pointeur
Posté le 05-02-2007 à 20:11:40  profilanswer
 

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

n°1511132
Joel F
Real men use unique_ptr
Posté le 05-02-2007 à 20:51:21  profilanswer
 

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

n°1511162
Sve@r
Posté le 05-02-2007 à 22:32:56  profilanswer
 

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.
n°1511173
++fab
victime du syndrome IH
Posté le 05-02-2007 à 22:49:42  profilanswer
 

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".
}

n°1511179
Taz
bisounours-codeur
Posté le 05-02-2007 à 22:54:49  profilanswer
 

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

n°1511186
Emmanuel D​elahaye
C is a sharp tool
Posté le 05-02-2007 à 23:14:41  profilanswer
 

++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/
n°1511387
++fab
victime du syndrome IH
Posté le 06-02-2007 à 14:30:17  profilanswer
 

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.

n°1511486
retrox
Posté le 06-02-2007 à 16:31:03  profilanswer
 

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
n°1511489
Emmanuel D​elahaye
C is a sharp tool
Posté le 06-02-2007 à 16:42:21  profilanswer
 

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/
n°1511493
++fab
victime du syndrome IH
Posté le 06-02-2007 à 16:59:42  profilanswer
 

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.

n°1511495
++fab
victime du syndrome IH
Posté le 06-02-2007 à 17:02:19  profilanswer
 

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.

n°1511500
retrox
Posté le 06-02-2007 à 17:11:08  profilanswer
 

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
n°1511510
Joel F
Real men use unique_ptr
Posté le 06-02-2007 à 17:35:49  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


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

  Initialisation d'un tableau sans connaitre sa dimention?

 

Sujets relatifs
tableau et structurecomparer des valeur dans un tableau
renvoyer 2 tableaux avec returnTableau dans un div qui permet de scroller le contenu, pas l'en-tête.
Initialisation à zéro d'une grosse matrice en CTableau avec ombre en bas et à droite
[C] Construire un tableau à partir d'un fichier[PHP] Recherche d'un module pour création de tableau du style Excel
Apparence d'un tableau...?? (pointillés)faire tableau avec des donnees recuperees d'un file xml
Plus de sujets relatifs à : Initialisation d'un tableau sans connaitre sa dimention?


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