Tableau infiniment grand [C] - Programmation
Marsh Posté le 25-09-2001 à 16:51:41
En tout cas cette solution marche pas:
int n;
int tab[n];
Y'a un autre moyen?
Marsh Posté le 25-09-2001 à 16:53:08
oui et non (genial comme reponse )
tu ne peux pas utiliser une variable si tu définis ton tableau "statiquement" (genre int tab[50])
par contre si tu fais int *tab et ensuite tab = new int[50] ou un truc du genre ça devrait passer même avec une variable... Enfin là je suis plus sûr du tout de la syntaxe, je crois que j'ai fait trop de Delphi sans faire du C/C++...
edit: bah je tape trop ou alors pas assez vite
dans le post ci-dessus solution en C, le truc avec le new c'est en C++ (mais je sais plus si c'est avec des [] ou des ()).
[edtdd]--Message édité par antp--[/edtdd]
Marsh Posté le 25-09-2001 à 16:53:13
bkadoum a écrit a écrit : En tout cas cette solution marche pas: int n; int tab[n]; Y'a un autre moyen? |
bonne question! j'ai deja eu ce pb... et po trouvé de soluce..et j'ai du passe par un truc de porc tab[1000000]....
Marsh Posté le 25-09-2001 à 16:54:27
tgrx a écrit a écrit : int* t= malloc(n*sizeof(int)); |
??? justement on connait pas n...
Marsh Posté le 25-09-2001 à 16:55:36
suri a écrit a écrit : bonne question! j'ai deja eu ce pb... et po trouvé de soluce..et j'ai du passe par un truc de porc tab[1000000].... |
cette solution marche pas pcq quand tu fais int tab[50] c'est compilé comme tel, et il (le compilateur) sait combien d'octets fera le tableau. Si tu fais int tab[n] il peut pas deviner la taille du tableau, même si tu as défini n juste au-dessus.
Suri: tu dis "on ne connait pas n"... faudra bien le connaitre un jour... tu vas pas dire "je veux un tableau mais je sais pas quelle taille"... ou alors tu fais un tableau dynamique, avec la STL par ex.
[edtdd]--Message édité par antp--[/edtdd]
Marsh Posté le 25-09-2001 à 16:55:49
Ben t'es oblige de le connaitre a un moment ou a un autre nan ?
Marsh Posté le 25-09-2001 à 17:14:33
antp a écrit a écrit : oui et non (genial comme reponse ) tu ne peux pas utiliser une variable si tu définis ton tableau "statiquement" (genre int tab[50]) par contre si tu fais int *tab et ensuite tab = new int[50] ou un truc du genre ça devrait passer même avec une variable... Enfin là je suis plus sûr du tout de la syntaxe, je crois que j'ai fait trop de Delphi sans faire du C/C++... edit: bah je tape trop ou alors pas assez vite dans le post ci-dessus solution en C, le truc avec le new c'est en C++ (mais je sais plus si c'est avec des [] ou des ()). |
Ouais la définition du tableau marche comme ca mais la taille reste toujours la même, moi j'aimerai un tableau qui s'agrandisse tout seul indéfiniment.
Marsh Posté le 25-09-2001 à 17:17:36
ha bhen alors c dynamique, donc soit tu utilises les trucs de la STL, soit tu le fabriques toi même.
Si le nombre de colonnes est fixe par ex, tu peux faire une liste de tableaux à 1 dimension, chaque tableau représentant une ligne.
Marsh Posté le 25-09-2001 à 17:18:39
bkadoum a écrit a écrit : Ouais la définition du tableau marche comme ca mais la taille reste toujours la même, moi j'aimerai un tableau qui s'agrandisse tout seul indéfiniment. |
A non j'ai parlé trop vite ca marche! Faut juste réallouer le pointeur a chaque fois que la taille s'imcrémente:
int n = 0;
int *tab;
tab = new int[n];
RezizeTab()
{
n++;
tab = new int[n];
}
Marsh Posté le 25-09-2001 à 17:22:24
t'as intérêt à désalouer la mémoire avant (et donc perdre le contenu du tableau) sinon bonjour la catastrophe...
Marsh Posté le 25-09-2001 à 17:57:02
Bon c bien ce que je disais....mon tab[1 000000] ct un tab fixe. j'etais sur de pas le depasser. Parce que j'ai pas trouve comment faire un tableau dynamique d'int en C...
le "new" c'est en C++ non?
Marsh Posté le 25-09-2001 à 17:59:42
suri a écrit a écrit : Bon c bien ce que je disais....mon tab[1 000000] ct un tab fixe. j'etais sur de pas le depasser. Parce que j'ai pas trouve comment faire un tableau dynamique d'int en C... le "new" c'est en C++ non? |
oui. malloc/free = C, new/delete = C++
Marsh Posté le 25-09-2001 à 18:20:33
antp a écrit a écrit : t'as intérêt à désalouer la mémoire avant (et donc perdre le contenu du tableau) sinon bonjour la catastrophe... |
oui donc un tableau dynamique d'int c'est possible ou pas?
(évidemment je veux garder mon contenu...)
Marsh Posté le 25-09-2001 à 18:54:01
realloc desalloue la memoire de ton ancien tableau puis alloue un nouvel espace et recopie dedans toutes les donnes qui etait dans l'ancien ( a lal limite il tronque ) si nouveau < ancien
en c avec des int :
int * t;
int n=50;
t= (int *) malloc( sizeof(int) *n);
puis quand tu veux changer la taille t = (int *)realloc(t,sizeof(int)*n);
et voila
(tiré du man de malloc )
Marsh Posté le 25-09-2001 à 19:53:05
le plus simplissime:
#include <vector>
using namespace std;
vector<int> tableau;
puis tu peux utiliser ton tableau comme un vecteur
tableau[100]=5;
tableau.push_back(50); // pour rajouter à la fin
tableau.pop_back(); //te retourne le last
tableau.size(); //te retourne le nb d'elements ds le tableau
...........
Marsh Posté le 25-09-2001 à 21:37:23
arf, j'ai pas vu le [C] ds le titre du tomic mais bon, y'a deja des grandes chances que son compilo soit un compilo c++. On peut tres bien programmer style c en utilisant des pitites briques c++ pour se faciliter la vie
Marsh Posté le 26-09-2001 à 09:20:21
Mais qd même, tgrx à donné la solution depuis la 3 ligne, et tout le monde blablatte à côté de choses plus ou moins inutiles en ignorant ce qu'il a dit !
ça m'énerverai à ta place tgrx ... d'ailleur ça m'énerve !
lis un peu la doc sur la gestion de mémoire dynamique (malloc, realloc, ...)
[edtdd]--Message édité par El_Gringo--[/edtdd]
Marsh Posté le 26-09-2001 à 11:29:09
Pour du C un seul truc REALLOC. Le pb c'est que ca bouffe pas mal de tps donc il vaut mieux allouer et reallouer par blocs de N (N connu : c'est toi qui le determine ... ). Donc un alloc de N cases et puis des realloc successifs de N cases ...
Marsh Posté le 26-09-2001 à 11:56:27
tgrx a donne une solution...
La plus adaptee semble etre le vector ou list de la STL, mais comme le faisait remarquer tgrx, c'est en C et non en C++...
donc soit le realloc apres le malloc...
soit comme le propose shinichi une structure de type liste chainee ou chaque element comporte un bloc de m donnees, quand le dernier bloc est plein on en alloue un autre... Quand le dernier est vide on le libere... Mais la on perd la syntaxe tableau...
Marsh Posté le 26-09-2001 à 22:14:44
Il y a des compilos C qui permettent d' ecrire le code suivant:
int tableau[expression];
ou expression est eventuellement avec des variables, a condition que l'expression soit calculable a l'allocation du tableau (pas de variables non initilisees). Mais c'est pas du standard.
De toute maniere, il est clair que en C on ne peut pas avoir de tableaux dont la taille augmente, sans passer par realloc, etant donne qu'un tableau est une zone memoire continue, et qu'une fois cette zone allouee, on ne sait pas si ce qui est apres est disponible.
A+,
Marsh Posté le 25-09-2001 à 16:49:36
C'est possible de définir la taille d'un tableau avec une variable et non une constante?