Ajouter une valeur à un tableau en C

Fermé
prypiat_child Messages postés 1343 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 10 avril 2014 - 23 nov. 2010 à 19:28
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 24 nov. 2010 à 23:50
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...
A voir également:

12 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
23 nov. 2010 à 22:41
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,
1
prypiat_child Messages postés 1343 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 10 avril 2014 272
23 nov. 2010 à 22:48
Ce n'est pas une chaîne de caractères (sans quoi ca serait pas compliqué, une simple concaténation....) (3e fois que je le dis quand même^^ mais merci quand meme !
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
23 nov. 2010 à 23:00
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.
0
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'
0
Nazuras Messages postés 62 Date d'inscription jeudi 2 juillet 2009 Statut Membre Dernière intervention 20 juin 2011 99
23 nov. 2010 à 19:34
Salut,

En C, tu es obligé de parcourir le tableau pour en connaitre sa taille.

a+
0
prypiat_child Messages postés 1343 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 10 avril 2014 272
Modifié par prypiat_child le 23/11/2010 à 19:51
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."
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Nazuras Messages postés 62 Date d'inscription jeudi 2 juillet 2009 Statut Membre Dernière intervention 20 juin 2011 99
23 nov. 2010 à 19:57
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.
0
prypiat_child Messages postés 1343 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 10 avril 2014 272
Modifié par prypiat_child le 23/11/2010 à 20:16
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."
0
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
0
prypiat_child Messages postés 1343 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 10 avril 2014 272
23 nov. 2010 à 20:55
heu, si j'ai bien compris une liste est un genre de structure récursive ? dans ce cas c'est pas ca non...
0
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?
0
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.
0
prypiat_child Messages postés 1343 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 10 avril 2014 272
23 nov. 2010 à 22:49
Oui en gros c'est ca.... une fois que j'aurai récupéré cette taille ca sera plus simple^^
0
Tu peut la choisir toi meme selon tes besoins, c'est toi qui doit l'imposer lorsque tu crée ton
typedef struct
{...}
EnsembleP;
Non?
0
Comme suit -->
typedef struct
{
float element;
int nboccu;
}Tab;

typedef struct
{
Tab tabelement[LA_TAILLE_QUE_TU_VEUT];
int iterateur;
}EnsembleP;
0
ghuysmans99 Messages postés 2496 Date d'inscription jeudi 14 juillet 2005 Statut Contributeur Dernière intervention 5 juin 2016 338
23 nov. 2010 à 23:42
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.
0
prypiat_child Messages postés 1343 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 10 avril 2014 272
24 nov. 2010 à 12:33
non, je pense pas que je vais choisir ce genre de chose... a vrai dire le choix de la structure est un peu imposé^^
0
prypiat_child Messages postés 1343 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 10 avril 2014 272
Modifié par prypiat_child le 24/11/2010 à 12:27
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."
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
24 nov. 2010 à 21:11
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.
0
prypiat_child Messages postés 1343 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 10 avril 2014 272
24 nov. 2010 à 23:17
Finalement j'ai décidé de mettre la taille dans la structure... je vais me débrouiller comme ca parce que sinon ca va pas être possible... merci !
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
24 nov. 2010 à 23:50
Dès que tu fais ton malloc/realloc, tu mets à jour la variable taille dans ta structure. Et ça passera tout seul ;-))).
0
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;
0