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

  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)...

  8. #8
    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
    Alors dans un premier temps, je te remercie pour ta réponse qui m'éclaire pas mal tout de même

    Le soucis c'est que je ne connais le nombre de "nombre" de mon fichier. Je traite des fichiers denregistrement si tu préfères. Pour te donner un ordre d'idée, ce sont des enregistrements de 1h environ découpés en bloc de 2s. Et dans chaque bloc il y'a 2048 valeurs. Je ne connais donc absolument pas le nombre de données du fichier.
    Je connais seulement la taille des blocs (ici 2048).

    En ce qui concerne les max et min, je me moque de ligne courante ou non, la seule chose que je souhaite avec ces boucles c'est d'obtenir la valeur max et min par bloc de 2048 valeurs.

    Pour les colonnes il en faudra effectivement 16 du coup comme il 'ya une colonne pour le temps. Pour ce qui est du k = 4, j'ai voulu tester un fichier à 4 colonnes, mais cela n'a pas été fructueux...

    En ce qui concerne la somme c'est tout bête, je souhaite faire la somme des 2048 termes constituant un bloc mais ces termes doivent être au carré. Ensuite je calcul la valeur RMS (petit calcul pas compliqué) qui est la racine de cette somme de terme au carré divisé par le nombre de terme.

    Voilà, voilà je continue les recherches de mon côté mais l'allocation dynamique me laisse quelque peu perplexe dirons-nous

    En tous cas, encore merci à toi

  9. #9
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par BES_63 Voir le message
    Le soucis c'est que je ne connais le nombre de "nombre" de mon fichier.
    Tu le détermines à la lecture. Tu lis ton fichier ligne par ligne par exemple à l'aide de fgets() qui est faite pour cela. Tu stockes la ligne courante dans un tampon et tu détermines le nombre de nombres que contient la ligne courante.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  10. #10
    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
    Je connais le nombre de données par ligne. Je sais au préalable combien de colonnes comporte mon fichier et donc combien de valeurs par ligne j'ai.

    Je ne sais pas comment définir un tableau dont le nombre de colonnes est variables ainsi que le nombre de ligne en fait.

  11. #11
    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
    Je connais le nombre de données par ligne. Je sais au préalable combien de colonnes comporte mon fichier et donc combien de valeurs par ligne j'ai.
    Oui, mais ton programme n'est pas censé le savoir, à moins que tu affectes toi-même à la variable k la bonne valeur (ce qui est le cas actuellement). Tu devras donc recompiler le code à chaque fois que le fichier texte à traiter aura un nombre de colonnes différent par rapport au précédent. C'est donc pas terrible.

    Il y a deux autres possibilités :
    1) Coder le programme pour qu'il s'exécute en récupérant un argument passé lors de l'exécution (via argv), qui lui indique le nombre de colonnes que le fichier texte comporte
    2) Coder le programme pour qu'il trouve lui-même le nombre de colonnes. C'est la méthode la plus souple, je trouve.

    C'est à toi de voir.

    Je ne sais pas comment définir un tableau dont le nombre de colonnes est variables ainsi que le nombre de ligne en fait.
    Le mieux, c'est l'allocation dynamique. Il faut soit créer un tableau de 2048 (2048, car tu dis que ton programme traite toujours par blocs de 2048 lignes) pointeurs sur float et allouer, grâce à une boucle, 2048 tableaux dynamiques d'une taille de . Ou bien allouer un gros bloc de mémoire de taille (l'accès aux données se fait différemment).
    Plus d'infos ici, ce sera plus simple à comprendre que mes explications : http://c.developpez.com/faq/?page=al...LOC_tableau_2D
    Il faut bien entendu remplacer les int par float.

    Si on fait de l'allocation dynamique pour un tableau, autant le faire pour les autres également...

  12. #12
    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
    En ce qui concerne le nombre de colonnes, ce nombre est connue car le fichier lu contient une en -tête qui donnera à chaque fois le nombre de voies. J'ai déjà réalisé un petit bout de code qui lit cette valeur et la place dans la variable k. Donc effectivement, le programme trouve lui-même le nombre de colonnes.

    Au niveau du tableau je ne vois effectivement pas d'autre solution que l'allocation dynamique.

    Mais une fois mon tableau correctement déclaré, je me demande si cela fonctionnera car je doute de mes boucles au niveau de mes for.

  13. #13
    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
    En ce qui concerne le nombre de colonnes, ce nombre est connue car le fichier lu contient une en -tête qui donnera à chaque fois le nombre de voies.
    Tu ne l'avais pas précisé...

    Mais une fois mon tableau correctement déclaré, je me demande si cela fonctionnera car je doute de mes boucles au niveau de mes for.
    Le forum est là pour apporter de l'aide. Poste le code et on corrigera.

  14. #14
    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
    Bon bah pour ne plus me prendre la tête j'ai trouvé une solution un peu bourrin mais qui fonctionne en tous cas. J'utilise un switch (NombreVoies) et je traite chaque cas. C'est un peu long mais c'est que du copié/coller donc ça marche.

    Merci encore à vous de m'avoir filé un coup de main, c'était très sympa de votre part

  15. #15
    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
    Bon bah pour ne plus me prendre la tête j'ai trouvé une solution un peu bourrin mais qui fonctionne en tous cas. J'utilise un switch (NombreVoies) et je traite chaque cas. C'est un peu long mais c'est que du copié/coller donc ça marche.

    Pourquoi faire compliqué quand on peut faire simple ? Lire une ligne et la décoder (i.e. lire chaque nombre, convertir et mettre dans un tableau), c'est une affaire de quelques lignes de code seulement. Et ça marche quelque soit le nombre de colonnes...

  16. #16
    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
    Oui c'est vrai mais j'ai eu de nouvelles directives hiers, je dois me contenter de le faire pour 3 voies au maximum finalement, donc comme ça c'est du copier/coller.

    Merci à vous pour vos conseils, c'était vraiment sympa de votre part

+ 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