Ajouter une valeur à un tableau en C
prypiat_child
Messages postés
1500
Statut
Membre
-
fiddy Messages postés 441 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 441 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Tout est dans le titre... Je dois écrire une fonction permettant d'ajouter un élément à la fin d'un tableau, mais qui prend en paramètres uniquement le tableau en question, et l'élément à ajouter. (C'est imposé)
j'ai déjà réalloué la mémoire pour "agrandir" le tableau, mais maintenant je ne parviens pas à ajouter un élément à la fin du tableau ! je ne connais pas sa longueur d'origine...
--
"Si Satan aime le jazz, alors il doit écouter Naked City, confortablement installé
sur son canapé en cuir humain."
Tout est dans le titre... Je dois écrire une fonction permettant d'ajouter un élément à la fin d'un tableau, mais qui prend en paramètres uniquement le tableau en question, et l'élément à ajouter. (C'est imposé)
j'ai déjà réalloué la mémoire pour "agrandir" le tableau, mais maintenant je ne parviens pas à ajouter un élément à la fin du tableau ! je ne connais pas sa longueur d'origine...
--
"Si Satan aime le jazz, alors il doit écouter Naked City, confortablement installé
sur son canapé en cuir humain."
12 réponses
-
Bonjour,
Tu souhaites connaître la taille d'une chaîne de caractère ?
Utilise tout simplement strlen.
Par exemple :
const char *prenom1="marie"; const char *prenom2="marie-line"; char *prenom=malloc(strlen(prenom1)+1); strcpy(prenom, prenom1); puts(prenom); realloc(prenom,strlen(prenom2)+1); strcpy(prenom, prenom2); puts(prenom); free(prenom), prenom=NULL;
L'idéal serait de vérifier les valeurs de retour de malloc et de realloc. Mais, il s'agit juste d'un exemple.
Cdlt,-
-
Certes, j'ai pas tout lu. Mais c'est vrai que si t'avais donné tous les éléments plus tôt, ça ne serait pas arrivé ^^.
Tu ne peux pas déterminer la longueur de ton tableau dans ce cas puisqu'alloué dynamiquement. Il faut tout simplement mémoriser la "variable" mise dans ton malloc. Et par conséquent, il faudra passer la taille en argument à ta fonction ou de mettre un champ supplémentaire dans ta structure.
-
-
je vais peut être dire une bêtise mais un "strlen" de ton tableau ne fonctionnerai pas pour connaitre sa taille?
sinon tu parcourt ton tableau en incrémentant une variable jusqu'au carractère '\0' -
Salut,
En C, tu es obligé de parcourir le tableau pour en connaitre sa taille.
a+ -
Merci d'avoir répondu rapidement...
J.K.ja : Il ne s'agit pas d'un tableau de caractères... ou ca peut être n'importe quoi comme tableau
Nazuras : Comment le parcourir sans en sortir et sans utiliser de for (vu qu'on connaît pas sa taille ?)
"Si Satan aime le jazz, alors il doit écouter Naked City, confortablement installé
sur son canapé en cuir humain." -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Pourquoi tu ne fixes pas la taille de ton tableau ?
Même si la taille que tu va fixer sera trop grande, c'est toujours mieux. -
Il ne s'agit en réalité pas vraiment d'un tableau, mais de cela :
typedef struct Tab{ float element; int nboccu; }Tab; struct EnsembleP{ Tab *tabelement; int iterateur; };
Et je souhaite donc ajouter un élément de type "Tab" à la fin du tableau dynamique "tabelement" qui est dans "struct EnsembleP".
Ceci, en écrivant la fonction suivante :ensembleAjouterElement(EnsembleP *self, float elt);
edit : j'aurais peut-être dû donner cette précision plus tôt^^
"Si Satan aime le jazz, alors il doit écouter Naked City, confortablement installé
sur son canapé en cuir humain." -
Salut ,
on dirait que tu veux utiliser la méthode des listes chainée ,mais je n'en suis pas sur :
https://www.commentcamarche.net/contents/114-langage-c-les-listes-chainees -
Désolé mais je vois pas comment faire sans plus de détails...
A quoi ressemble la déclaration de la fonction?
A tu le main correspondant, si oui qu'envoi tu dans la fonction? -
Oups, j'avais raté ton post de 20h15.
Je crois comprendre que dans ton cas tu n'a que un seul EnsembleP en réalité, car tu déclare " tab* tabelement " et pas " tab tabelement[taille_du_tableau] "
Et donc ce que tu cherche serait taille_du_tableau.
En espérant ne pas me tromper. -
A mon sens, utiliser une liste chainée c'est le plus efficace :
typedef struct { float element; int nboccu; }Tab; typedef struct _EnsembleP { Tab tabelement; int iterateur; struct _EnsembleP *_suivant; }EnsembleP;
Ce n'est pas une structure récursive, il y a seulement à la fin de chaque maillon un pointeur vers le suivant -> si le pointeur vaut 0 (NULL), cela signifie qu'on est au bout de la liste. -
Je pensais, si je fais ca :
typedef struct EnsembleP * Ensemble; Ensemble self; int tailleSelf = sizeof(*self)/sizeof(struct EnsembleP);
tailleSelf devrait contenir la longueur de l'ensemble self non ? et le problème serait réglé... (self étant bien entendu l'ensemble passé en paramètre)
"Si Satan aime le jazz, alors il doit écouter Naked City, confortablement installé
sur son canapé en cuir humain."-
Ca ne marchera pas.
Ta formule donnera 1. *self est de type struct EnsembleP, donc ton tailleSelf retournera 1.
Et si tu calcules simplement : sizeof(*self), ça te donnera sizeof(void*)+sizeof(int).
Comme je t'ai dit, il faut que tu passes la taille en argument ou que tu la mettes dans la structure ou alors liste chaînée. Tu ne peux pas recalculer la taille puisqu'il s'agit d'un pointeur que tu devras allouer avec malloc. -
-
-
-
Tu peut choisir ta taille selon tes besoins, c'est toi qui doit l'imposer lorsque tu crée ton
typedef struct
{...}
EnsembleP;
Comme suit -->
typedef struct
{
float element;
int nboccu;
}Tab;
typedef struct
{
Tab tabelement[LA_TAILLE_QUE_TU_VEUT]; // et non Tab* tabelement;
int iterateur;
}EnsembleP;