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 :

problème de tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 17
    Par défaut problème de tableau
    Salut à tous!

    J'ai réalisé un programme qui me permet d'ouvrir un fichier .txt d'en extraire des données et de les placer dans un tableau multidimensionnels.

    Mais comme vous pouvez l'imaginer, mon programme ne fonctionne pas, je n'ai pas d'erreur de compilation mais le résultat est complètement faux.
    Je pense m'être trompé dans la déclaration de mon tableau et sûrement dans mes boucles. Je me suis également bien compliqué la vie dans l'écriture dans un fichier à la fin du programme.

    Je ne pense pas que le programme soit très compliqué mais je m'y perd un peu pour être tout à fait franc .

    Je me suis renseigné sur l'allocation dynamique et la fonction malloc mais j'avoue ne pas avoir bien compris le principe.

    Si des personnes ont des idées pour le faire fonctionner correctement, je suis preneur , merci

    Voici le programme :
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    #include <stdlib.h>
    #include <stdio.h>
    #include <windows.h>
    #include <math.h>
     
    int main(int argc, char *argv[])
    {
        //Delcarations des pointeurs de type FILE pour les fichier 1, 2, 3 et 4
        FILE* fichier1 = NULL; 
        FILE* fichier2 = NULL; 
     
        //Declaration de la chaine de craractères correspondant au nom du fichier1  
        char nom_fichier[100];
     
        //Declaration des entiers i (pour les tableaux) et de NUMBLOC pour le numéro de chaque bloc
        int i = 0,
            j = 0,
            k = 4,
            n = 2048,
        NUMBLOC = 1,
        NumBloc[5000];
     
        /*Declarations des variables recuperant les valeurs maximales et minimales de chaque voie 
          et des sommes permettant le calcul des valeurs RMS*/     
        float MAX = 0,          
              MIN = 0,          
              SOMME = 0;
     
        //Declarations des valeurs RMS
        double RMS = 0;
     
        printf("Saisir le nom du fichier a ouvrir\n\n");    
     
        // Saisie du nom du fichier au clavier 
        scanf("%s",nom_fichier);   
     
        //Declarations des tableaux recuperant les valeurs du temps, de la voie 1 Jusqu'à la voie 15
        float tab[n][k],
              max[10000][k],
              min[10000][k],
              somme[10000][k],
              rms[10000][k];
     
        //fonction ouvrir avec mode d'ouverture "r" (lecture seulement)      
        fichier1 = fopen(nom_fichier, "r");
     
        //si il n'y a pas de lecture de fichier ou que la lecture est finie, on renvoie NULL      
        if (fichier1 == NULL) 
        {
                     //On affiche un message d'erreur si le fichier demandé n'existe pas
                     printf("Erreur lors de l'ouverture du fichier\n");
        }
        else 
        {   
     
        //Boucle qui s'execute tant que la fin du fichier n'est pas detectée (eof = End Of File)
        while(!feof(fichier1))
        {           
     
                //On définit le numéro du bloc
                NumBloc[i] = NUMBLOC;
     
                for (i = 0; i < n; i++)
                {
                    for (j = 0; j < k; j++)
                    {
                // Récupération des valeurs contenues dans le fichier et stockage de ces dernières dans le tableau
                fscanf(fichier1, "%f", &tab[i][j]);
                    }            
                }
     
                //Boucle qui Determine les valeurs maximales de chaque voie et les recupere dans des variables           
                for (j = 1; j < k; j++)
                {
                     for (i = 0; i < n; i++)
                     {               
                            if(tab[i][j] > MAX)                                         
                            MAX = tab[i][j];               
     
                     }
                     max[i][j] = MAX;
                     i++;
                }
     
          i = 0;
     
          //Boucle qui determine les valeurs minimales pour chaque voie et les recupere dans des variables
          for (j = 1; j < k; j++)
                {
                     for (i = 0; i < n; i++)
                     {               
                            if(tab[i][j] > MIN)                                         
                            MIN = tab[i][j];               
     
                     }
                     min[i][j] = MIN;
                     i++;
                }
     
          i = 0;          
     
          //Boucle qui determine la somme des termes au carré d'un bloc           
          for (j = 1; j < k; j++)
                {
                     for (i = 0; i < n; i++)
                     {               
                             SOMME = SOMME + (tab[i][j]*tab[i][j]);
                     }
                     somme[i][j] = SOMME;
                     i++;                                                 
            }
     
          i = 0;    
     
          //Calcul des valeurs RMS
          for (j = 1; j < k; j++)
                {
                      RMS = (sqrt(somme[i][j])/n);
                      rms[i][j] = RMS;
                      i++;   
     
                }
     
          i = 0;      
     
        //Ouvre le fichier "RMS.txt" en mode a+ (ajout). Si le fichier n'existe pas, il est créé 
        fichier2 = fopen("DONNEES.txt","a+"); 
     
        if (fichier2 != NULL)
        {          
                //Ecriture des données dans le fichier DONNEES.txt
                for (i = 0; i < n; i++)
                     {               
                        fprintf(fichier2,"%d %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f \n", NumBloc[i], max[i][1], min[i][1], rms[i][1], max[i][2], min[i][2], rms[i][2], max[i][3], min[i][3], rms[i][3], max[i][4], min[i][4], rms[i][4], max[i][5], min[i][5], rms[i][5], max[i][6], min[i][6], rms[i][6], max[i][7], min[i][7], rms[i][7], max[i][8], min[i][8], rms[i][8], max[i][9], min[i][9], rms[i][9], max[i][10], min[i][10], rms[i][10], max[i][11], min[i][11], rms[i][11], max[i][12], min[i][12], rms[i][12], max[i][13], min[i][13], rms[i][13], max[i][14], min[i][14], rms[i][14], max[i][15], min[i][15], rms[i][15]);
                     }
                //Fermeture du fichier 2
                fclose(fichier2); 
        }
     
        //Remise à zero des variables
          SOMME = 0;     
     
          MAX = 0;    
     
          MIN = 0;
     
        //On incrémente NUM pour passer au bloc suivant
        NUMBLOC = NUMBLOC + 1;
        i++;
     
        }
        //Fermeture du fichier1
        fclose(fichier1); 
        }
     
        //Fais patienter le système (demande d'appuyer sur "ENTREE" pour se fermer)
        system("PAUSE"); 
     
        return 0;
     
    }
    A noter que je déclare ici 4 colonnes et 2048 lignes mais le nombre de lignes et de colonnes peut varier.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Salut

    Je n'ai pas tout compris à ton code.

    Je me suis renseigné sur l'allocation dynamique et la fonction malloc mais j'avoue ne pas avoir bien compris le principe.
    http://rperrot.developpez.com/articles/c/allocationC/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    fichier1 = fopen(nom_fichier, "r");
    if (fichier1 == NULL) 
    {
    	printf("Erreur lors de l'ouverture du fichier\n");
    }
    else 
    {   
    	while(!feof(fichier1))
    	{           
    		(...)
    	}
    	(...)
    }
    La fonction feof sert seulement en cas d'erreur de lecture, pour distinguer une fin de fichier d'une autre erreur. Il ne faut donc pas l'utiliser ici.
    La fonction scanf renvoie EOF en cas d'erreur (de lecture) ou le nombre d'éléments correctement assignés en cas de succès. Il faut donc utiliser cette valeur pour vérifier si tout s'est bien passé.

    A plusieurs endroits, on voit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (j = 1; j < k; j++)
    Commencer la boucle à 1 est-il volontaire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(fichier2,"%d %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f \n", NumBloc[i], max[i][1], min[i][1], rms[i][1], max[i][2], min[i][2], rms[i][2], max[i][3], min[i][3], rms[i][3], max[i][4], min[i][4], rms[i][4], max[i][5], min[i][5], rms[i][5], max[i][6], min[i][6], rms[i][6], max[i][7], min[i][7], rms[i][7], max[i][8], min[i][8], rms[i][8], max[i][9], min[i][9], rms[i][9], max[i][10], min[i][10], rms[i][10], max[i][11], min[i][11], rms[i][11], max[i][12], min[i][12], rms[i][12], max[i][13], min[i][13], rms[i][13], max[i][14], min[i][14], rms[i][14], max[i][15], min[i][15], rms[i][15]);
    Il y a moyen d'optimiser l'écriture grâce à une boucle.

    Au premier coup, i vaut 0, mais vaut ensuite toujours n+1 :
    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
    while (...)
    {
       NumBloc[i] = NUMBLOC;
    
       (...)
    
       if (fichier2 != NULL)
       {          
          //Ecriture des données dans le fichier DONNEES.txt
          for (i = 0; i < n; i++)
          {
             (...)
          }
       }
    
       (...)
    
       i++; /* i vaut n+1 */
    
       (...)
    }
    Il est préférable de ne pas utiliser une même variable pour plusieurs choses différentes, car c'est une source de problèmes.
    A quoi sert ce tableau Numbloc ? Si tu veux le remplir avec des valeurs incrémentées (0, 1, 2, ...), pourquoi les stocker dans un tableau ? Vu que tu incrémentes déjà NUMBLOC, pourquoi ne pas l'utiliser ? A moins que j'ai pas compris ce que tu voulais faire...

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 17
    Par défaut
    Pour mieux comprendre je dois réaliser un programme qui récupère des données dans un fichier .txt de type :
    0.0000 0.005073 -0.007836 0.003538
    0.0005 0.005073 -0.007836 0.003538
    0.0010 0.005073 -0.007835 0.003537
    0.0015 0.005073 -0.007825 0.003535
    0.0020 0.005071 -0.007784 0.003526
    0.0025 0.005062 -0.007668 0.003502
    0.0030 0.005036 -0.007407 0.003446
    0.0035 0.004984 -0.006933 0.003336
    0.0040 0.004915 -0.006219 0.003148
    0.0045 0.004868 -0.005312 0.002863
    0.0050 0.004907 -0.004333 0.002477
    0.0055 0.005100 -0.003444 0.002008
    0.0060 0.005483 -0.002787 0.001495
    0.0065 0.006020 -0.002438 0.000993
    0.0070 0.006605 -0.002382 0.000561
    0.0075 0.007088 -0.002530 0.000250
    0.0080 0.007330 -0.002765 0.000094
    0.0085 0.007258 -0.002994 0.000095

    Mais en beaucoup plus long. Le truc c'est que je dois lire ce fichier par bloc de 2048 lignes et il peut y avoir 1 à 15 colonnes. Je dois effectuer après les quelques traitement (max, min...) et écrire ces résultats dans un nouveau fichier.


    Pour le foef j'ai déjà tester sur un autre programme ou j'ai créé trois tableaux différents pour 3 colonnes et ça marche nickel. On m'a conseillé cela sur un forum, j'y croyais pas trop mais ça fonctionne et c'est juste.

    Pour le J = 1, oui c'est fait exprès pcq la première colonne de données correspond au temps, et les autres aux mesures, et c'est les mesures qui m'intéresse.

    L'écriture dans le fichier à la fin est farfelu je le reconnaît mais je n'ai malheureusement pas trouvé mieux pour affiché mes donnée en colonnes alignées.

    En ce qui concerne NumBloc, dans la mesure ou je traite le fichier par bloc de 2048 lignes, je voudrais qu'il m'écrive également le numéro des blocs mais je m'y suis effectivement très mal pris.

    J'espère que ces détails aide à comprendr eun peu mieux ce que je souhaite réaliser. Merci de d'être pencher sur mon problème en tous cas

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Pour le foef j'ai déjà tester sur un autre programme ou j'ai créé trois tableaux différents pour 3 colonnes et ça marche nickel. On m'a conseillé cela sur un forum, j'y croyais pas trop mais ça fonctionne et c'est juste.
    "On" t'a donné un très mauvais conseil. Cette fonction ne sert pas à ça. Tu peux avoir des surprises. Il faut absolument utiliser la valeur retour des fonctions de lecture, elles sont faites pour cela.
    Fonction feof : http://c.developpez.com/faq/?page=es_general#ES_feof

    L'écriture dans le fichier à la fin est farfelu je le reconnaît mais je n'ai malheureusement pas trouvé mieux pour affiché mes donnée en colonnes alignées.
    Si, si : une boucle. On peut remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (i = 0; i < n; i++)
    {               
    	fprintf(fichier2,"%d %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f \n", NumBloc[i], max[i][1], min[i][1], rms[i][1], max[i][2], min[i][2], rms[i][2], max[i][3], min[i][3], rms[i][3], max[i][4], min[i][4], rms[i][4], max[i][5], min[i][5], rms[i][5], max[i][6], min[i][6], rms[i][6], max[i][7], min[i][7], rms[i][7], max[i][8], min[i][8], rms[i][8], max[i][9], min[i][9], rms[i][9], max[i][10], min[i][10], rms[i][10], max[i][11], min[i][11], rms[i][11], max[i][12], min[i][12], rms[i][12], max[i][13], min[i][13], rms[i][13], max[i][14], min[i][14], rms[i][14], max[i][15], min[i][15], rms[i][15]);
    }
    par (par exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for (i = 0; i < n; i++)
    {
    	int num_colonne;
     
    	fprintf(fichier2 , "%d ", NumBloc[i]); /* NumBloc[i] <-> NUMBLOC ? */
    	for (num_colonne = 1 ; num_colonne <= 15 ; num_colonne++)
    		fprintf(fichier2 , "%f %f %f " , max[i][num_colonne] , min[i][num_colonne] , rms[i][num_colonne]);
    	fprintf(fichier2 , "\n");
    }
    Par contre, est-ce à ton programme de déterminer le nombre de colonnes ou le code doit-il être adapté "sur mesure" ? Car la première option est faisable, moyennant des modifications dans le code.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 17
    Par défaut
    C'est en effet à mon programme de déterminer le nombre de colonnes. Pour cela je vais chercher l'information dans le fichier .txt en déplaçant le curseur. Mais ici pour simplifier la chose je rentre juste la donnée dans une variable.

    Mon vrai soucis vient de là, pour l'affichage à la fin, ta solution est effectivement bonne ^^. Si tu as une piste au niveau des modifications à apporter, je suis preneur, merci à toi

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 17
    Par défaut
    Pour être un peu plus précis, il me faudrait un tableau qui puisse comporter 2 à 16 colonnes, paramètre que l'on détermine en fonction d'une variable. Je n'ai juste aucune idée de comment déclarer un tel tableau.

    Parce-que les traitements que j'effectue dans mes boucles ne sont pas franchement compliqués après.

    J'aurais juste une question par rapport à ce que tu as proposé pour écrire à la fin du programme. Pour les tableaux max, min et rms, on ne doit pas aller jusqu'à nm_colonne <= 16? Pcq il y'a effectivement au maximum 15 voies, mais il faut rajouter la colonne du temps.

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Pour déterminer le nombre de colonnes, il suffit de lire la première ligne et de compter le nombre de... nombres...
    Le problème avec fscanf, lorsqu'on s'en sert pour lire le fichier via une boucle, c'est qu'il n'indique pas les fins de ligne (ou alors, je n'ai pas trouvé la combine ?)...
    Toutefois, il est possible de troquer la solution fscanf avec la solution fgets / strtod.
    Le nombre de colonne sera à conserver dans une variable (la variable k ), qui servira pour les boucles de lecture/calcul/écriture.

    Concernant la question de trouver la valeur maximale pour chacune des voies, est-ce qu'il faut trouver quelle est la valeur maximale entre la première ligne et la ligne courante (c'est-à-dire au fur et à mesure, jusqu'à la 2048eme ligne) et afficher cette valeur à la ligne courante, ou bien est-ce qu'il faut juste trouver cette valeur parmi les 2048 lignes en une seule fois ? Car j'ai un doute en lisant ton code.
    Même question pour la valeur minimale.
    Et tant qu'on y est, comment doit être calculée la somme ? (si tu as l'algorithme sous la main...)

    J'aurais juste une question par rapport à ce que tu as proposé pour écrire à la fin du programme. Pour les tableaux max, min et rms, on ne doit pas aller jusqu'à nm_colonne <= 16? Pcq il y'a effectivement au maximum 15 voies, mais il faut rajouter la colonne du temps.
    J'avais seulement optimisé la ligne que tu avais écrite. Après, il faut modifier ce "15" en fonction du nombre de voies.

    D'après ton code :
    tab[...][0] -> temps
    tab[...][1 à k-1] -> valeurs

    Si tu as une valeur de temps suivie de 15 autres valeurs (15 voies), il faut donc un tableau de 16 éléments, donc k doit être à 16.
    Dans ce cas :
    tab[...][0] -> temps
    tab[...][1 à 15] -> valeurs

    (Après, si tu demandes à ton programme de compter le nombre de colonnes se trouvant dans une ligne, il donnera lui-même à k la valeur qui convient)

    Par contre, je n'avais pas vu que tu avais initialisé ton k à 4. Ta grosse ligne de fprintf va donc écrire dans le fichier des valeurs farfelues vu que tu débordes des tableaux.

    Il suffit de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	for (num_colonne = 1 ; num_colonne <= 15 ; num_colonne++)
    		fprintf(fichier2 , "%f %f %f " , max[i][num_colonne] , min[i][num_colonne] , rms[i][num_colonne]);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	for (num_colonne = 1 ; num_colonne < k ; num_colonne++)
    		fprintf(fichier2 , "%f %f %f " , max[i][num_colonne] , min[i][num_colonne] , rms[i][num_colonne]);
    et encore !... Y a encore moyen de réduire la taille de tes tableaux max / min / somme vu que l'indice 0 n'est jamais utilisé...

    Sinon, si la quantité de données à mémoriser en mémoire (ça dépend notamment s'il est nécessaire que tes tableaux de calcul soient en 2 dimensions) est vraiment importante, il va probablement falloir se pencher sur l'allocation dynamique. Car sinon la pile risque de pleurer (et le programme avec)...

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

Discussions similaires

  1. Débutant en Javascript : problème de tableau !
    Par bluheim dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 06/11/2005, 15h03
  2. [XHTML] problème de tableau
    Par virgul dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 28/04/2005, 07h18
  3. Problème de tableau
    Par tom06440 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 26/04/2005, 20h30
  4. Problème de tableau
    Par krfa1 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 08/02/2005, 11h09

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