Newbies et problème de pointeur

Signaler
Messages postés
14
Date d'inscription
jeudi 25 septembre 2003
Statut
Membre
Dernière intervention
12 février 2005
-
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
-
Bonjour ,

J'ai quelque problème de compréhension au niveau de la gestion des pointeurs ... j'ai essayé de me documenter un maximum en lisant des bouquins de C/C++ etc ... mais c'est encore très flou dans mon esprit ....

J'ai une question très simple qui me pose problème ...

Je voudrais que l'utilisateur d'un programme saisisse une série de commandes .... Je voudrais ensuite enregistrer toutes ces commandes dans un tableau ( à ce que j'ai compris , en C tableau = pointeur .... )
Le problème c'est que je ne sais pas du tout combien de commande l'utilisateur va saisir ....

Il faudrait donc que je déclare un tableau sans en connaitre le nombre d'élements ....

je me suis dis que ça serait ptet plus simple en faisant de l'arithmétique de pointeur ( mais ptet que je me plantes et qu' il y a plus simple )

Je suppose qu'il doit y avoir un rapport avec l'allocation de mémoire dynamique ( avec un malloc ou un calloc ) mais je vois pas trop comment m'y prendre .....

Est ce que kelk'un pourrait m'éclairer sur la déclaration de tableau avec un nombre d'élements indifinis ???

Merci d'avance ...

11 réponses

Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
qu'appelles-tu une commande? un nombre? un float ? un char*? un char[]...?
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
dartal > justement tableau != de pointeur

/* déclaration d'un tableau */
int v[10];

si la ne peut etre resolu à la compilation (inconnu)

/* allocation dynamique */
int *p;

p = malloc( s * sizeof*p );

free( p );
Messages postés
14
Date d'inscription
jeudi 25 septembre 2003
Statut
Membre
Dernière intervention
12 février 2005

Tou d'abord merci de vos réponses .....

>qu'appelles-tu une commande? un nombre? un float ? un char*? un >char[]...?

En fait l'utilisateur doit rentrer un char* que je découpe à chaque espace ...
J'aimerais entrer les différentes mots entrés dans un tableau...
(chaque paramètre de la commande en fait )

>/* allocation dynamique */
>int *p;
>p = malloc( s * sizeof*p );
>free( p );

Le malloc m'allouera un espace mémoire de taille seulement , mais comment savoir le nombre d'élement p à allouer ???
( perso je peux pas savoir le nombre de commande que l'utilisateur va entrer )

Est que le malloc me permet vraiment de définir un espace mémoire ( un genre de tableau koi ) sans obligatoirement en connaitre la taille ????

Merci d'avance ....
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
dans ce cas il te faut une liste (std::list en c++)

ou alors (plus simple en c)

tu fais un malloc, et un realloc si necessaire au cours de la saisie (et en fin de saisie)
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
djl-> c'et possible alors de faire malloc avec un seul 'mot', puis a chaque mot entré, de faire realloc ? c'est pas super lent ou quoi?
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
oui c'est possible

pour la lenteur, ca peut etre tres lent (en imaginant le pir)

si il n'y a pas assez d'espace memoire en contunuité, realloc fais un deplacement memoire de la zone (donc alllocation ailleur + copie, lent )

donc l'interet de realloc c'est de pouvoir reallouer (pour rallonger ou diminuer la taille d'une zone allouer) mais ca n'empeche pas d'utiliser une strategie de reallocation pour rester performant
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
"deplacement memoire de la zone"
merci djl tu viens de répondre a une question que je me posais depuis des temps immémoriaux

sinon, si il n'y a qu'une seule char* entrée par l'utilisateur, pourquoi ne pas trouver le nombre d'espaces contenues dans cette chaine, ce qui donne le nombre de mots, puis allouer ta mem a partir de la, puis enfin de faire 'copier-coller' du char* a la meme allouée?
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
oui c'est possible, mais je crois que pour dartal une commande == les mots saisies (1 lignes) et que c'est justement le nombre de lignes (à saisir) qu'il ne sait pas combien il ne connait pas

pour le realloc et le deplacement memoir, c'est tres important, et c'est d'ailleur pour ca que realloc retourne un pointeur (qui est en fait l'adresse de la nouvelle zone allouer si necessaire)

il faut toujours ecrire

p = realloc( p, ... );

car la zone peut avoir changer d'adresse, d'ailleur tout autre pointeur contenant la valeur de p (ou une valeur décalé) avant le realloc est potentielement invalide
Messages postés
14
Date d'inscription
jeudi 25 septembre 2003
Statut
Membre
Dernière intervention
12 février 2005

En fait pour moi une commande = un mot

C'est pour la création d'un mini-shell , l'utilisateur rentre un char* de type : " ls -l -i " etc ..... , je la découpe en mot ... mais je ne sais pas combien de paramêtre il peut rentrer.

Mais comme dit plus haut , il me suffit de faire un malloc de taille mon char* rentré par l'utilisateur ^-^

Le realoc est donc je suppose facultatif .....

( ça m'aura permis de comprendre comment gérer tout ça si on ne connais vraiment pas la taille ^^)

En tout cas je vous remercie de votre aide !!!
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011

Cb de parametres ? ben ya l'idée de la fct à paramètre multiple au pire des cas, si tu arrives pas à résoudre le pb :

void function(char* chaine1, ...) { // exemple succint

  va_list list;
  va_start list;

   //instructions

  va_arg = .... // instrcutions

  va_end
 }


voila ;-))

Gendal67, à votre service !
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
eu... ca ne reponds pas à la question, dans ce cas une fonction prenant en parametre une liste de mot dans un quelquonque conteneur suffirait