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 :

Tableau dynamique


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 7
    Par défaut Tableau dynamique
    Bonjour,

    N'ayant jamais utilisé les fonctions malloc et tableau dynamique et liste chainée.

    J'ai un souci pour réaliser une fonction en C.

    J'au un fichier in, comme ci-dessous (faisant des milliers de lignes) :
    907;A1;50455366941100; 8:54:22;;
    907;A2;50592402661100; 8:54:22;;
    907;A2;5026460369; 8:54:23;;
    518;A1;50513426561100; 8:54:23;;
    L07;A3;50652151531100; 8:54:24;;
    Je voudrais réaliser des compteurs dynamique, pour écrire dans un fichier out.
    En autorisant le comptage en colonne[0] du type 907 et 518 mais pas du type L07.
    En autorisant le comptage en colonne[1] du type A1 et A2 mais pas du type A3.

    Pour avoir dans un fichier out ci-dessous :

    907 = 3 - Type A1 = 1 - Type A2 = 2
    518 = 1 - Type A1 = 1
    L07 = NON AUTORISE = 1 - Type A3 = NON AUTORISE = 1
    Pour éviter le coté rébarbatif.
    En délarant 1000 int (suivant le type de colonne[0] - 907 518 etc...)
    Fois 3 int (suivant le type de colonne[1] - A1 A2 etc...).
    Ce qui alourdirait le programme en nombre de lignes de code.

    Je voudrais de l'aide.

    Ci après mon code source C, avec un type de compteur :

    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
    42
    43
    /*----*/
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    #define MY_BUFSIZ       128
     
    FILE *fin,
         *fout;
     
    char  fnout[MY_BUFSIZ],
          l_buf[MY_BUFSIZ];
     
    int nbr_907_auto       =    0;
     
     
    void main(int argc,char *argv[])
    {
        if(argc != 3)
            printf("manque paramètre exe fic_in fic_out\n");
        if ((fin = fopen(argv[1], "r")) == NULL)
             printf("pb fic_in\n");
        if ((fout = fopen(argv[2], "w")) == NULL)
             printf("pb fic_out\n");
     
        for(;;)
        {
            memset((char *)&l_buf,0x00,MY_BUFSIZ);
            if(fgets((char *)&l_buf,MY_BUFSIZ,fin)==NULL)
                break;
            memset(fnout, 0x00, MY_BUFSIZ);
            strncpy(fnout, l_buf, 3);
            if(!strncmp(fnout, "907", 3))
            {            
                nbr_907_auto++;
            }
        }
        fprintf(fout, " client 907 : %6d\n", nbr_907_auto);
        exit(0);
    }
     
    /*----*/
    Merci de votre aide.

    Cbibi

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    A mon avis, vous devriez décrire ce que doit faire le programme, par exemple
    - ouverture du fichier in en lecture seule
    - tant qu'on n'a pas atteint la fin de fichier
    - lire une ligne
    - séparer chaque champ
    - si le premier champ est correct
    le comptabiliser
    - etc ... pour chaque champ
    - fermeture du fichier in
    - création du fichier out en écriture
    - écriture des résultats de comptage
    - fermeture du fichier out.

    Dans votre explication, il manque des détails, par exemple pourquoi 907 et 518 sont bons et pas L07 ? Je suppose qu c'est parcequ'il y a un 'L' au lieu d'un '9'.
    Donc, c'est ça qu'il faut décrire.
    Est-ce que la liste des codes (3 premiers caractères) est définie, ou à constituer au fur et à mesure?
    Etes-vous sûr qu'il faut utiliser la fonction memset() ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 7
    Par défaut
    Merci.

    En faites pour l'histoire du 907 et 518 et L07.

    Je voudrais tester la valeur de la colonne[0] sans passer par un if.
    Du style ci-dessous :
    Si colonne[0] = '907' || colonne[0] = '518' then tracker='OK'
    else tracker = 'KO'

    Je pense qu'il faudrait que j'utilise la commande enum ?

    Pour le stockage des valeurs je pense qu'il faudrait que j'utilise un tableau avec 3 colonnes ?

    Puis je faire un tableau de 1 char avec 2 int ?

    Si quelqu'un peut me répondre.
    Merci d'avance.

    cbibi

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    A mon avis, vous pensez plus à la traduction que vous devrez faire qu'à ce que vous voulez dire.
    On ne "passe pas par un if".
    Avant de penser à la commande que vous aller utiliser, pensez à ce le programme doit faire.

    Pour la réponse à vos 3 questions, ça peut être oui pour les 3, non pour les 3 mais en fait aucune des ces questions ne devrait être posées.
    Ou alors, à titre d'exercice "Dans tel contexte, utilisez le mot clé enum".

  5. #5
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 7
    Par défaut
    Merci d'avoir répondu.
    Désolé si cela n'est pas clair.

    J'ai une liste de valeur autorisé en colonne 0 présent dans un fichier in.
    Ma liste de valeur autorisé est d'environ 50 chiffre ou mot.
    Cette colonne 0 peut faire de 3 à 5 caractères.
    Style : 518-907-850-525-M00-K88-9999 etc...

    Pour éviter de fair une 50ène de condition dans un if.

    Je pense qu'il y a une meilleur solution.
    Mais je n'arrive pas à trouver ?

    Ci après le code C que je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        for(;;)
        {
            memset((char *)&l_buf,0x00,MY_BUFSIZ);
            if(fgets((char *)&l_buf,MY_BUFSIZ,fic_in)==NULL)
                break;		
    		strncpy(num_client,l_buf, 3);
    		if( (!strcmp(num_client, "907")) || (!strcmp(num_client, "518")) )
                printf("%s client OK\n", num_client);
            else
                printf("%s client KO\n", num_client);
        }
    Si quelqu'un peut prendre quelques minutes de son temps, pour m'éclaicir.

    Merci.

  6. #6
    Invité
    Invité(e)
    Par défaut
    S'il s'agit d'un exercice, autant nous donner directement l'énoncé.
    Si vous voulez qu'on le fasse pour vous, autant nous donner le mail du professeur.
    Le fichier qui contient les données est un fichier au format CSV. Donc la première chose à faire est de lire les 4 champs de chaque ligne.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 7
    Par défaut
    Ceci est dans le cadre d'un développement dans une entreprise.

    J'arrive à lire et a stocker dans un tableau les n valeur séparé par un ;
    Comme le montre mon code ci-dessous :

    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
       		numligne=0;
    		indice=0;
     
    		do
    		{
    			ligne=(char)fgetc(fic_in);
    	  		if ((ligne==';') || (ligne=='\n'))  
    	     	{
    	  			adresse[numligne][indice] ='\0';
    	    	  	numligne++;
    	 	  		indice=0;
         		}
        	   	else
    	     	{
    	  			adresse[numligne][indice] =ligne;
    	  			indice++;	
         		}
    	 	}
    	    while ((ligne != '\n') && feof (fic_in)==0);

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bon,
    Alors, il y a plusieurs choses à préciser.
    1- la liste de codes (3 à 5 caractères) est-elle fixée ou non?
    2- un code (3 à 5 caractères) est-il uniquement constitué de chiffres ou les lettres sont-elles admises?
    3- le problème est-il uniquement un comptage du nombre de lignes pour chaque code, une détection d'anomalies ou autre chose?
    4- le comptage et la vérification ne sont à faire que sur le champ 1 ou aussi sur les autres, en particulier contrôle de cohérence entre le code et le champ.
    5- toutes les lignes ont le même format, ou les champs 1. 2 etc dépendent du code article
    6- Pourquoi comptage dynamique
    7- etc.

    PS pour plus de clarté, il vaut mieux mettre en relief le code, soit en mettent 'code' au début et '/code' (entre crochets []) ou après avoir sélectionné l'ensemble des lignes du code, choisissez l'icône '#'.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 7
    Par défaut
    Merci pour la réponse.

    Je pense qu'il ne doit pas y avoir beaucoup de lignes de code à faire !

    J'ai réalisé le programme complet, mais pour moi il n'est pas optimisé avec une 50 int du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int nbr_907;
    int nbr_907_auto;
    int nbr_907_manuel;
    Et une 50 de if du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(!strcmp(num_client, "907")) 
            {            
                  nbr_907++;
            }
    1- la liste de codes (3 à 5 caractères) est-elle fixée ou non?
    Oui elle est fixe, mais pour la paramétrer je ne sais pas le faire.
    2- un code (3 à 5 caractères) est-il uniquement constitué de chiffres ou les lettres sont-elles admises?
    Alpha numérique de 3 à 5 caractères.
    3- le problème est-il uniquement un comptage du nombre de lignes pour chaque code, une détection d'anomalies ou autre chose?
    Juste sur le comptage du champ 1 et du champ 2.
    Mais le champ 2 dépend du champ 1.
    Je ne sais pas incrémenter des compteur dans un tableau.

    4- le comptage et la vérification ne sont à faire que sur le champ 1 ou aussi sur les autres, en particulier contrôle de cohérence entre le code et le champ.
    Champ 1 et champ 2
    5- toutes les lignes ont le même format, ou les champs 1. 2 etc dépendent du code article
    Toujours le même format séparateur ;
    6- Pourquoi comptage dynamique
    Parce que je voudrais utilser un tableau qui met des compteur dans le champ 2 et 3 suivant la lecture des valeur du champ 1 et 2.
    7- etc.

  10. #10
    Invité
    Invité(e)
    Par défaut
    J'ai un peu de mal à comprendre. Par exemple, si le champ 1 est le code, je suppose, habituellement pour le premier champ, on parle du champ 0.
    Si la liste des codes est définitivement fixe, un peut stocker le nom dans une énumération. Par contre, comme les codes peuvent commencer pas un chiffre, c'est incompatible avec les membres d'une énumération.
    Donc il faudra à un moment faire quelque-chose comme ça:
    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
    #define NB_CODE 50
      int TabCompt[NB_CODE];
      for (int i=0; i<NB_CODE; i++) TabCompt[i]=0;
      ...
    // maintenant, on a lu le champ 0 
      char Champ0[6]; // 5 caractères + 0 terminal
      int CodeLu=-1;
      if (strcmp(Champ0,"518")) CodeLu=0; 
      else if (strcmp(Champ0,"917")) CodeLu=1; 
      else if (strcmp(Champ0,"850")) CodeLu=2; 
      else if (strcmp(Champ0,"525")) CodeLu=3; 
      else if (strcmp(Champ0,"M00")) CodeLu=4; 
      else if (strcmp(Champ0,"K88")) CodeLu=5; 
      else if (strcmp(Champ0,"999")) CodeLu=6; 
    ...
      else
      {
    // code inconnu
        ...
      }    
      switch (CodeLu)
      {
        case 0:  // traitement du code 518
        TabCompt[CodeLu]++;
           ...
        break;
        case 1:  // traitement du code 917
        TabCompt[CodeLu]++;
           ...
        break;
    ... etc.
      }
    C'est un début, mais ce n'est pas clair.

  11. #11
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 7
    Par défaut
    Merci beaucoup.
    Avec votre aide, j'ai pigé.

    cbibi

  12. #12
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 811
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    J'ai un peu de mal à comprendre. Par exemple, si le champ 1 est le code, je suppose, habituellement pour le premier champ, on parle du champ 0.
    Si la liste des codes est définitivement fixe, un peut stocker le nom dans une énumération. Par contre, comme les codes peuvent commencer pas un chiffre, c'est incompatible avec les membres d'une énumération.
    Donc il faudra à un moment faire quelque-chose comme ça:
    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
    #define NB_CODE 50
      int TabCompt[NB_CODE];
      for (int i=0; i<NB_CODE; i++) TabCompt[i]=0;
      ...
    // maintenant, on a lu le champ 0 
      char Champ0[6]; // 5 caractères + 0 terminal
      int CodeLu=-1;
      if (strcmp(Champ0,"518")) CodeLu=0; 
      else if (strcmp(Champ0,"917")) CodeLu=1; 
      else if (strcmp(Champ0,"850")) CodeLu=2; 
      else if (strcmp(Champ0,"525")) CodeLu=3; 
      else if (strcmp(Champ0,"M00")) CodeLu=4; 
      else if (strcmp(Champ0,"K88")) CodeLu=5; 
      else if (strcmp(Champ0,"999")) CodeLu=6; 
    ...
      else
      {
    // code inconnu
        ...
      }    
      switch (CodeLu)
      {
        case 0:  // traitement du code 518
        TabCompt[CodeLu]++;
           ...
        break;
        case 1:  // traitement du code 917
        TabCompt[CodeLu]++;
           ...
        break;
    ... etc.
      }
    C'est un début, mais ce n'est pas clair.
    A ce moment là, pour plus de souplesse, mieux vaut passer par un tableau associatif

    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
    typedef struct {
        char *str;
        int code;
    } t_assoc;
     
    t_assoc tab[]={
        {"518", 1},
        {"917", 2},
        {"825", 3},
        {"M00", 4},
        {NULL, -1},
    };
     
    t_assoc *pt;
     
    for (pt=tab; pt->str != NULL; pt++)
    {
        if (strcmp(Champ0, pt->str) == 0)
        {
            codeLu=pt->code;
            break;
        }
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  13. #13
    Invité
    Invité(e)
    Par défaut
    Oh oui, parfaitement d'accord, mais je ne suis pas sûr que le problème se situe réellement là.
    Moi, par exemple j'aurais fait un fichier ini, suivant le principe que les codes sont fixée à un instant T, si ils changent c'est dommage de modifier le programme.
    Par ailleurs, je ne connaissais pas cette technique de tableau associatif, je la retiens.

  14. #14
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 7
    Par défaut
    Merci à vous deux pour l'aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/03/2015, 18h31
  2. récupérer la memoire et tableau dynamique
    Par Guigui_ dans le forum Langage
    Réponses: 6
    Dernier message: 06/01/2003, 08h02
  3. AFFICHER UN TABLEAU DYNAMIQUE
    Par ghassenus dans le forum Langage
    Réponses: 2
    Dernier message: 28/12/2002, 14h19
  4. [Kylix] tableau dynamique
    Par sdoura2 dans le forum EDI
    Réponses: 1
    Dernier message: 31/10/2002, 08h57
  5. Réponses: 4
    Dernier message: 13/05/2002, 16h43

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