Soutenez-nous
Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9
  1. #1
    Invité de passage
    Femme Profil pro
    Inscrit en
    novembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : novembre 2012
    Messages : 17
    Points : 2
    Points
    2

    Par défaut Allouer un fichier de données en memoire

    Bonjour,

    Je suis entrain d'écrire un programme qui permet de définir une structure.
    Cette structure sera par la suite utilisé pour lire un fichier de donnée ( 4 colonne et 1000 lignes). Par la suite je veux allouer ces données en mémoire pour y travailler par la suite.

    le programme est le suivant:

    Code :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #include <malloc.h>
     
    #define NUM_Element 1000
     
     
    typedef struct
    {
    int Index;
    int N;
    float d;
    float W;
    }ind_struct;
     
    ind_struct *ind_array;
     
     
    int main(void)
    {
    FILE *ind_struct;
    int i;
     
    /*Read the input data file*/
    ind_struct=fopen("Data.txt","r+");
    if (ind_struct==NULL)
    {
    printf("the input data is not ready \n");
    }
     
    else
    {
    printf("the input data is ready \n");
     
    ind_array = calloc(ind_array,NUM_Element,ind_struct);
    if (ind_array== NULL) nomemory("input");
     
     
    for (i=0; i<1000; i++) {
    fscanf(ind_struct,"%e",&ind_array[i].d);
    printf("%.3E \n",ind_array[i].d);
    }
    }
    return 0;
    }
     
     
    /*====================================================================
    Prints an error message and terminates the program
    ====================================================================*/
    nomemory(string)
    char *string;
    {
    printf("\nmalloc: out of memory making %s!!\n",string);
    printf("\n Program is halting .....");
    exit(-1);
    }

    Le code m'affiche un faux résultat. Quelqu’un peux m'aider à corriger ce programme?

    Merci d'avance.

  2. #2
    Membre chevronné
    Avatar de Kirilenko
    Homme Profil pro Lucas Pesenti
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Nom : Homme Lucas Pesenti
    Âge : 17
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2011
    Messages : 234
    Points : 766
    Points
    766

    Par défaut

    Bonjour,

    Tout d'abord, il m'étonne que tu parviennes à compiler correctement le programme (où alors, à quel prix), car tu as un argument supplémentaire à l'appel de la fonction calloc. De plus, le premier paramètre est incorrect. Il doit s'agir d'une taille (typée size_t), et tu envoies un pointeur sur structure. Cette allocation a donc déjà tout de fausse.

    Avec ces modifications, le code source compile, et le programme s'exécute correctement (du moins, comme je m'y attends). Peut-être devrais-tu préciser ce qui, pour toi, est un résultat faux. Pour cela, tu peux indiquer : un extrait du fichier, le résultat attendu, et le résultat obtenu. Avec ces informations, on pourra davantage t'aiguiller.

    Bonne journée !
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  3. #3
    Invité de passage
    Femme Profil pro
    Inscrit en
    novembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : novembre 2012
    Messages : 17
    Points : 2
    Points
    2

    Par défaut

    le fichier que j'ai contient des données comme les suivantes:

    0 2 1.34E-04 1.07E-05
    1 6 7.19E-05 6.47E-06
    2 2 1.81E-04 1.36E-05

    mais le résultat affiché est le suivant:

    -4.316E+008
    -4.316E+008
    -4.316E+008
    .
    .
    .
    -4.316E+008
    -4.316E+008
    -2.195E-005
    .
    .
    .
    0.000E+000
    0.000E+000
    0.000E+000
    0.000E+000
    0.000E+000

  4. #4
    Membre chevronné
    Avatar de Kirilenko
    Homme Profil pro Lucas Pesenti
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Nom : Homme Lucas Pesenti
    Âge : 17
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2011
    Messages : 234
    Points : 766
    Points
    766

    Par défaut

    Déjà, il faut voir comment tu as réarrangé ton code en fonction des remarques proposées. De plus, tu cherches à lire 1000 valeurs, alors qu'il y en a déjà quatre par lignes (soit 4000).
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  5. #5
    Invité de passage
    Femme Profil pro
    Inscrit en
    novembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : novembre 2012
    Messages : 17
    Points : 2
    Points
    2

    Par défaut

    Peux tu m'expliquer d'avancer comment je peux corriger mon programme (je suis débutante avec ces types de fonction)

  6. #6
    Modérateur
    Avatar de Bktero
    Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    2 533
    Détails du profil
    Informations personnelles :
    Âge : 26
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2009
    Messages : 2 533
    Points : 6 250
    Points
    6 250

    Par défaut

    Ton code ne compile pas. Tu ne peux pas utiliser ind_struct comme type et comme nom de variable.

    Tu utilises une fonction nommery qui semble pompée d'ailleurs. Pourquoi pas, mais les déclarations / définitions de fonctions à l'ancienne, c'est moche. Met le à jour. Un const ne serait pas mal non plus.

    Kirilenko te demande de montrer ton nouveau code et met en évidence que ton exemple ne correspond au problème que tu exposes...

    Poste le nouveau code et répond lui.
    Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a

    Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

    Pour vos problèmes d'embarqué, utilisez le forum dédié !

  7. #7
    Invité de passage
    Femme Profil pro
    Inscrit en
    novembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : novembre 2012
    Messages : 17
    Points : 2
    Points
    2

    Par défaut

    Code :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #include <malloc.h>
     
    #define NUM_IND 4000
    #define MAX_lignes 1000
     
    /*definition of the input data structure*/
    typedef struct
    {
    	float Index;
    	float N;
    	float d;
    	float w;
    }ind_struct;
     
    ind_struct *ind_array;
     
     
    int main(void)
    {
    	FILE *input_data;
    	int i;
     
    	/*Read the input data file and the test data file*/
    	input_data=fopen("data.txt","r+");
    	if (input_data==NULL)
    	{
    		printf("the input data is not ready \n");
    	}
     
    	else
    	{
    		printf("the input data is ready \n");
     
    		ind_array = (ind_struct *) calloc (NUM_IND, sizeof(ind_struct));
    		if (ind_array== NULL) nomemory("input");
     
    		else
    		{
     
    			for (i=0; i<MAX_lignes; i++) {
     
    				fscanf(input_data,"%e",&ind_array[i].Index);
    				fscanf(input_data,"%e",&ind_array[i].N);
    				fscanf(input_data,"%e",&ind_array[i].d);
    				fscanf(input_data,"%e",&ind_array[i].w);
    				printf("%.f  %.f  %.3E  %.3E \n",ind_array[i].Index,ind_array[i].N,ind_array[i].d,ind_array[i].w);
    			}
    		}
     
     
     
    	}
    	return 0;
    }
     
     
    /*====================================================================
    Prints an error message and terminates the program
    ====================================================================*/
    nomemory(string) 
    char *string; 
    { 
    	printf("\nmalloc: out of memory making %s!!\n",string); 
    	printf("\n Program is halting .....");
    	exit(-1); 
    }

  8. #8
    Invité de passage
    Femme Profil pro
    Inscrit en
    novembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : novembre 2012
    Messages : 17
    Points : 2
    Points
    2

    Par défaut

    J'ai essayé de modifier mon programme mais toujours je trouve une difficulté à manipuler ce type de fonction.

  9. #9
    Modérateur
    Avatar de Bktero
    Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    2 533
    Détails du profil
    Informations personnelles :
    Âge : 26
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2009
    Messages : 2 533
    Points : 6 250
    Points
    6 250

    Par défaut

    Oui..... et quel est ce soucis ?

    Il faut nous en dire plus pour qu'on puisse t'aider.
    Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a

    Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

    Pour vos problèmes d'embarqué, utilisez le forum dédié !

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •