Array et library

Bonjour à tous,

Petit problème sur la conception d'une librairie : est-il possible de redimmensionner un array ? Est-on obligé de placer toutes les déclarations dans le .h ?

Je m'explique : j'aimerais à l'instanciation que l'utilisateur puisse dimensionner la taille d'un array qui va servir à stocker des données, or j'ai envie d'optimiser le truc et donc de pas mettre une grande valeur histoire que ça prenne pas des ressources pour rien. Donc soit à l'instanciation que redimmenssione mon array déclarer dans le .h, soit je le déclare à l'instanciation en récupérant l'argument correspondant à la taille. Mais autant les deux solutions sont impossibles ...

Un array de quoi ?

Sinon il faut utiliser la fonction malloc pour créer un tableau dynamique. La fonction realloc permet de redimensionner un tableau.

C'est peut-être une solution : tu créer un tableau de 5 éléments, si tu arrive à un momoent où tu dois stocker le 4eme élément, tu redimensionnes le tableau pour en ajouter 5 autres.

voir : malloc, realloc.

ou encore ce lien pas mal fait : http://rperrot.developpez.com/articles/c/allocationC/

A+

Si la librairie est en C++, tu peux créer le tableau dans le constructeur de ta classe avec un malloc en le dimensionnant avec un paramètre passé en argument à ce constructeur. Ensuite, soit le pointeur sur ce tableau est une variable publique, soit tu fournis des méthodes pour accéder au tableau si tu préfères le déclarer privé (la solution 2 est peut être un peu plus lourde pour un petit micro)

Grag38:
Un array de quoi ?

Hey hey, de string ... et justement je viens de regarder les histoires de malloc() mais le problème est maintenant : quelle taille allouer pour un tableau de string ? Pour des integers ok, mais la ??

Bonjour,

B@tto:
Je m'explique : j'aimerais à l'instanciation que l'utilisateur puisse dimensionner la taille d'un array qui va servir à stocker des données, or j'ai envie d'optimiser le truc et donc de pas mettre une grande valeur histoire que ça prenne pas des ressources pour rien. Donc soit à l'instanciation que redimmenssione mon array déclarer dans le .h, soit je le déclare à l'instanciation en récupérant l'argument correspondant à la taille. Mais autant les deux solutions sont impossibles ...

La taille du tableau restera fixe quoi qu'il arrive ou le tableau pourra éventuellement changer de taille pendant l'exécution ?

Si oui : malloc() / realloc() ou new / delete.
Si non : utilisation d'un template C++ pour fixer la taille du tableau à la compilation.

La solution du malloc(), realloc(), ... est une TRÈS MAUVAISE idée sur un système avec peu de mémoire RAM.
Si les realloc() s'enchainent la mémoire ram va finir par être complétement fragmenté et des erreurs à l'exécution vont apparaitre aléatoirement.

Ps: A noter aussi qu'une version de avr-gcc (je me souvient plus du numéro) a été fourni avec une version buggé de new / delete (équivalent de malloc() en C++) ...

B@tto:
Hey hey, de string ... et justement je viens de regarder les histoires de malloc() mais le problème est maintenant : quelle taille allouer pour un tableau de string ? Pour des integers ok, mais la ??

String est une classe, elle peut donc se stocker sous forme de tableau comme n'importe quelle autre type de variable.

Exemple :

String plop[10]; // Tableau de 10 String vide

Attention: String utilise en interne des malloc / realloc pour stocker les caractères !
-> Faire des tableaux de String c'est ce tirer une balle dans le pied ...

Exemple de template C++ pour faire une allocation statique à la compilation :

// Déclaration
template <const int NBCHR>
class Test {
private:
    char tab[NBCHR];
};

// Utilisation
Test toto<12>();

(les templates doivent être déclaré dans un fichier .h PAS .cpp sinon il ne sont utilisable que dans le fichier en question)

skywodd:
Bonjour,

B@tto:
Je m'explique : j'aimerais à l'instanciation que l'utilisateur puisse dimensionner la taille d'un array qui va servir à stocker des données, or j'ai envie d'optimiser le truc et donc de pas mettre une grande valeur histoire que ça prenne pas des ressources pour rien. Donc soit à l'instanciation que redimmenssione mon array déclarer dans le .h, soit je le déclare à l'instanciation en récupérant l'argument correspondant à la taille. Mais autant les deux solutions sont impossibles ...

La taille du tableau restera fixe quoi qu'il arrive ou le tableau pourra éventuellement changer de taille pendant l'exécution ?

Nan elle est définit une fois pour toute à l'instanciation. Par contre j'ai remarqué un truc : si dans mon .h je déclare un array sans spécifier la taille (par ex String MonTableau[]; ) => pas d'erreur à la compilation, normal ?

skywodd:

B@tto:
Hey hey, de string ... et justement je viens de regarder les histoires de malloc() mais le problème est maintenant : quelle taille allouer pour un tableau de string ? Pour des integers ok, mais la ??

String est une classe, elle peut donc se stocker sous forme de tableau comme n'importe quelle autre type de variable.

Oui mais c'est une variable à taille variable puisqu'elle est dépendante du nombre de caractère, et d'après ce que j'ai lu sur malloc(), il faut dimensionner via sizeof, facile pour un int dont la taille est fixe, mais une une string ?

B@tto:
Nan elle est définit une fois pour toute à l'instanciation. Par contre j'ai remarqué un truc : si dans mon .h je déclare un array sans spécifier la taille (par ex String MonTableau[]; ) => pas d'erreur à la compilation, normal ?

Normal dans les deux cas ça reste un pointeur :wink:

Exemple :

char toto[];
char *tata; // Équivalent si non initialisé

Dans le premier le tableau est créé automatiquement si tu met quelque chose dans les crochets, dans le second c'est à toi de faire pointer le pointeur sur quelque chose.

B@tto:
Oui mais c'est une variable à taille variable puisqu'elle est dépendante du nombre de caractère, et d'après ce que j'ai lu sur malloc(), il faut dimensionner via sizeof, facile pour un int dont la taille est fixe, mais une une string ?

NON, String est une classe, tu fait donc un tableau d'objet String, point final.
C'est à la classe String de gérer les alloc() realloc() pour stocker les char :wink:

Si tu veut faire ton propre tableau de char dynamique il faut garder un tableau de pointeur sur char* (-> char**, taille fixe connu) dont tu fait pointer chaque pointeur sur un tableau alloué dynamiquement (via alloc / realloc) en fonction de l'utilisation que tu en fait.
http://www.siteduzero.com/tutoriel-3-14061-l-allocation-dynamique.html