IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Allocation d'un tableau dynamique


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 21
    Par défaut Allocation d'un tableau dynamique
    Bonjour,
    Je suis débutant en Langage C est j'aimerais savoir si il faut allouer plusieurs fois un tableau dynamique ou seulement une seul fois dans mon cas.

    En fait ma variable chaine est appelé plusieurs fois pour ensuite convertir puis stocker dans mon tableau dynamique Chaine converti. Est ce que cette syntaxe fonctionne ou est ce qu'il m'efface mon tableau à chaque fois que je fait appel a ma fonction Convertir ?
    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int *ChaineConverti;
     
    int *Convertir(char *Chaine)
    {
    int n=strlen(chaine);
    ChaineConverti= (int*)malloc((n+1)*sizeof(int));
    Convertir ....
    }

  2. #2
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Salut,

    Si tu es débutant, je vais déjà te donner un bon conseil les variables globales tu "oublies" pour le moment c'est vraiment pas l'idéal, passe ChaineConverti en paramètre.
    Ensuite il nous faudrait un peu plus de détails sur ce que fait ton programme
    Mais la oui tu vas allouer à chaque un nouvelle espace mémoire avec ton malloc, et l'ancien emplacement sera perdu sans qu'il soit libérer (free(ChaineConverti)) donc tu auras des fuites de mémoire. Et il n'est pas necessaire de caster le retour du malloc().

    Voila j'espère que je n'ai pas dit de bétises, corrigez-moi sinon

    bye bye

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 21
    Par défaut
    Ma Fonction à pour but de lire un champ texte et de le convertir sous un autre format. En fait j'essaye de me prendre la tête en convertissant en temps réel (CAD des que je tape dans mon champs je convertie)

    En fait ma fonction doit me permettre de convertir une date une heure faire des opération etc ...


    La j'essaye de passer par une fonction sscanf pour convertir ma variable mais sa ne fonctionne pas ...
    Donc pour résumer :
    ->Je recupere le contenue d'une chaine
    -> Je la convertie
    ->je l'enregistre dans un tableau dynamique

    Variable Global :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char *chaineTest;
    int valider;
    Fonction Tester Date
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	if ( date == 1 )
    		sscanf(chaine,"%d",chaineTest);
    		if ( strlen(chaine) <= 2) valider =0;
    		else valider =-1;
    Bah les variables global c'est bien utiles quand même car tu fait appelle à cette variable dans plusiers fonction.

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Ta question n'est pas clairement formulée et le code trop succinct pour qu'on puisse l'en déduire.
    Je présume un code du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int *Convertir(char *Chaine)
    {
      int *ChaineConverti;
      int n=strlen(chaine);
      ChaineConverti= malloc((n+1)*sizeof(int));
      if(ChaineConverti != NULL)
      {
        // Remplir le tableau ChaineConverti
      }
      return ChaineConverti;
    }
    Alors, dans ce cas, un nouveau tableau est alloué à chaque appel de cette fonction. Pour éviter les fuites mémoires, le code appelant cette fonction doit faire un free() de chaque tableau ainsi alloué lorsqu'il est devenu inutile (à noter que la quantité allouée, (n+1) int, est plutôt bizarre, mais ce n'est pas le sujet).
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    chat tab[256];
    int * tabint;
    FILE * fichier;
    ...
    while(fgets(tab,256,fichier)!= NULL)
    {
      tabint = Convertir(tab);
      if(tabint != NULL)
      {
        // traitement des éléments du tableau tabint
        free(tabint);
      }
    }

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 21
    Par défaut
    Le but du programme
    • Entrez une chaine sous un format date
    • Tester la validiter de la date
    • Effectuer une operation sur la date


    et je doit passer par une fonction de convertion de la date avant l'operation dessus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    int *convertir(char *chaine)
    {
    	printf("Chaine avant convertion : %s \n",chaine);
    	int i=1;
    	int n=strlen(chaine);
    	printf("longueur de la chaine : %d \n",n);
    	chaineConverti = (int*)malloc((n+1)*sizeof(int)); //n+1 pour ajouter la fin de mon tableau
    	if ( chaineConverti == NULL )
    	{
    		 fprintf(stderr,"Allocation impossible");
    		 exit(EXIT_FAILURE);
    	}
    	else
    	{
    		while ( *chaine != '\0' )
    		{
    			if ( *chaine == '-' )
    			{
    				chaineConverti[i]='-1';
    				i++;
    			}
    			else if ( *chaine == '/' )
    			{
    				chaineConverti[i]='-4';
    				i++;
    			}
     
    			else if ( *chaine >= '0' && *chaine <= '9' )
    			{
    				chaineConverti[i]=*chaine;
    				printf("valeur[%d]=%c \n",i,chaineConverti[i]);
    				i++;
    			}
    			chaine++;
    		}
    		chaineConverti[i+1]=-10;
    		return chaineConverti; //La convertion à reussie
    	}
    	return 0; // l'allocation à échouer
    }
    Mon problème étant que quand je veux afficher le contenue de chaineConverti il me met des caractere incoherent lorsque ma chainelu est de forme '/' ou '-1'
    Code lecture de la chaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    else if(num >= 110 && num <= 113 && valider == 0 && date != 1) //Si on n'a pas d'erreur dans la saisie on effectue une operation
    	{
    		int i=0;
    		convertir(chainelu);
    		printf("Chaine converti : ");
    		/*while (*chaineConverti != '\0' && i < 100)
    		{
    			printf("%c",chaineConverti[i]);
    			i++;
    		}*/
    		//on reinit les var de format
    		date=1;
    		//Gere Operande
    		gereOperation(num);
    	}

  6. #6
    Membre éclairé Avatar de mikhailo
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 78
    Par défaut
    Salut,

    Pourquoi est-ce que tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaineConverti[i+1]=-10;
    Ce n'est pas plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaineConverti[i+1]='\0';
    que tu voulais dire?

    Ta fonction d'affichage affiche tant qu'elle ne rencontre pas '\0', mais si tu ne mets '\0' nulpart, elle ne risque pas de le rencontrer =)


    PS: ce n'est pas "convertion", mais "conversion" :p

Discussions similaires

  1. Réponses: 11
    Dernier message: 09/02/2010, 11h42
  2. Allocation d'un tableau dynamique 2D
    Par Arwel dans le forum Débuter
    Réponses: 5
    Dernier message: 08/03/2009, 21h47
  3. problème allocation tableau dynamique
    Par ofinot dans le forum C++
    Réponses: 5
    Dernier message: 12/02/2008, 15h03
  4. Réponses: 10
    Dernier message: 24/05/2007, 09h27
  5. Echec d'allocation d'un tableau dynamique
    Par le y@m's dans le forum WinDev
    Réponses: 1
    Dernier message: 09/05/2007, 16h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo