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 :

probleme mémoire allouer dynamiquement


Sujet :

C

  1. #1
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut probleme mémoire allouer dynamiquement
    Bonjour,

    Je dois faire un démon suveillant un fichier de log des scans. Dans ce fichier j'alloue dynamiquement de la mémoire pour mes variables, et je rencontre quelque soucis dans une fonction qui est lancé périodiquement, voici sa sortie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Nombre de minutes écoulées depuis le dernier scan: 12 min
    date_search: Apr 25 22:04:25
    IP: 9.9.9.69
    IP2: 99.99.99.69
     
    //quelque seconde plus tard second passage dans la fonction:
     
    date_search: Apr 25 22:04:25
    IP: 9.9.9.692:05:25
    IP2: 99.99.99.69
    La premier adresse IP semble étre écrasser par une autre donnée . J'ai eu beau faire des free de toutes les variables et les réallouer au début de la fonction ca n'a rien changer. Pouvez vous m'expliquer ce cas ?

    Voici la fonction en cause:

    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
     
    int startDeamon()
    {
     
      struct stat mystat;
      char *IP=NULL, *date_search=NULL, *date_lastModif=NULL, *date_lastScan=NULL, *SRCip={"SRC"}, *buff_file=NULL;
      FILE *file_ulog=NULL, *file_out=NULL, *file_log=NULL;
      int nbSec;
      time_t t;
     
      printf("Go\n");
     
      //récupère l'heure courante
      time(&t);
     
      file_log=fopen(LOG_FILE,"a");
        if (file_log < 0) exit(1);
     
      file_ulog=fopen(FILE_ULOG,"r");
      	if (file_ulog<0) exit(1);
     
      file_out=fopen(FILE_OUT,"r");
      	if (file_out<0) exit(1);
     
      date_search=smalloc(24);
     
      date_lastScan=smalloc(24);
     
      date_lastModif=smalloc(24);
     
      //On recupère la date de la derniere modification du fichier de log d'ulog 
      if ( stat(FILE_ULOG, &mystat) == -1) { perror("stat"); exit(EXIT_FAILURE);} 
      strftime(date_lastModif, 100, "%c", localtime(&mystat.st_mtime));
     
      //on test si le fichier existe  
      if ( file_out == NULL )
      {
        //On créé le fichier puis on ecrit la date du dernier accès
        file_out=fopen(FILE_OUT,"w+");
        if ( fwrite(date_lastModif, strlen(date_lastModif), 1, file_out) < 1 ) perror ("Erreur fwrite 1");
     
        //On copie la date dans la seconde variable
        strcpy(date_lastScan, date_lastModif);
     
      }
      else
      {
     
        //Le fichier existe on lit la date 
        int ret = fread(date_lastScan, 24, 1, file_out); 
     
      } 
     
      printf("date_lastScan %s, date_lastModif %s\n" ,date_lastScan, date_lastModif);
     
      // Exécution de la fonction "compareDate"
      nbSec=compareDate(date_lastScan, date_lastModif);
     
      printf("Nombre de minutes écoulées depuis le dernier scan: %d min\n", nbSec/60);
     
      //Si le nombre de secondes est supérieur 0 un scan a été effectué. 
      if ( nbSec > 0 )
      {  
     
        strcpy(date_search, substr(date_lastScan, 4, 18));
     
        //Recherche de la derniere date d'un scan (si elle existe) et copie des autres lignes en mémoire
        //Ou lieu de charger tous le fichier en mémoire
     
        //On charge le fichier en mémoire
        buff_file=LoadFileToMemory(file_ulog);
     
        //On recherche la date dans d'ulog le fichier et on retourne sa position dans le fichier
        buff_file = Ulog_Search(buff_file, date_search);
        printf("date_search: %s\n", date_search);
     
        if( buff_file == NULL)
        { 
          printf("Date introuvable\n");
          exit(1);
        }
     
        //On recherche l'ip source
        IP=getip(buff_file);
        if( IP == NULL)
        { 
          printf("IP introuvable\n");
          exit(1);
        }
     
        printf("IP: %s\n",IP); 
     
        buff_file = Ulog_Search_END_LINE(buff_file);
     
        while( buff_file != NULL )
        {
           date_search=Ulog_get_date(buff_file);
     
           IP=getip(buff_file);
           printf("IP2: %s\n", IP);
     
           buff_file=Ulog_Search_END_LINE(buff_file);
     
        }
     
        //file_out=fopen(FILE_OUT,"w+");
        //	if ( fwrite(date_lastModif, strlen(date_lastModif), 1, file_out) < 1 ) perror ("Erreur fwrite 1");
     
      }
      else
      {
         printf ("Le fichier n'a pas été modifier\n" );
      }
     
      free(date_search);
      free(date_lastModif);
      free(date_lastScan);
     
      date_search=NULL;
      date_lastModif=NULL;
      date_lastScan=NULL;
     
      if(file_ulog != NULL)
        fclose(file_ulog);
     
      if(file_out != NULL)
        fclose(file_out);
     
     
      //Attention les données ne sont écrites dans les fichier qu'apres le close
      if(file_log != NULL) 
        fclose(file_log);
     
      return 0;
    }
    Et le code de ma fonction servant à allouer de la mémoire dynamique:

    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
     
    char *smalloc(int stringsize)
    {
     
      char *buffer;
     
      buffer=malloc(stringsize + 1);
      if ( buffer == NULL )
      {  
        fprintf ( stderr, "ERREUR D'ALLOCATION !!");
        return NULL;
      }
     
      memset(buffer, 0, sizeof(buffer));
     
      return buffer;
    }
    Merci :-)

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 376
    Points
    376
    Par défaut
    Première chose (qui n'explique pas ton erreur): pourquoi ces tests <0 après les fopen alors que le retour est un FILE * ?

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    en dehors de pljusieurs trucs pas corrects, je suppose que dans une des fonctions Ulog_Search_END_LINE, Ulog_get_date ou getip tu dois avoir soit un

    printf("\r%s",date search), ou

    fprintf (stderr, "\r ...)

    Typiquement je crois que ça marche, mais que c'est juste à l'écriture, car on dirait vraiment la fin d'une date (+ 1minute).

    Or le seul moyen d'écrire au même endroit est de revenir au début de la ligne ('\r') et d'écrire une date.

    Et je vais (pour le fun) te rajouter quelques remarques :

    Plusieurs problèmes :

    ce n'est pas
    mais
    Ensuite, quand tu ouvres tes fichiers, ce n'est pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        if (file_log < 0) exit(1);
    mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        if (file_log ==  NULL ) exit(1);

    Ensuite, ta fonction smalloc est trop compliquée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    char *smalloc(int stringsize)
    {
      char *buffer;
     
      buffer=calloc((stringsize + 1), 1);
      if ( buffer == NULL )
        fprintf ( stderr, "ERREUR D'ALLOCATION !!");
     
      return buffer;
    }
    calloc est une fonction standard qui fait exactement ce que tu voulais faire.

    Ensuite, quand tu appleles strftime, tu alloues 25 caractères et tu passes comme taille max 100.

    Ensuite, tu appelles une variable Nb_Secs mais tu mets en commentaire "Nombre de minutes écoulées... " . Faudrait être cohérent.

    Et je n'ai pas regardé le reste..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 376
    Points
    376
    Par défaut
    Pourquoi aussi cette valeur de 100 dans ton strftime alors que tu n'alloues que 24+1 octets ?

    [EDIT]:
    Oups, Souviron vient de remarquer la même chose ... Désolé pour le bégaiement.

  5. #5
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut
    Je suis pour toutes les remarques constructives sur ce code ;-).

    Ben justement, je n'ai pas de printf ou fprint dans ces fonctions.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    tu l'appelles deamon.. Ce que je suppose etre un job en background. Comment est-il lancé ? et comment est appelée la routine incriminée ?

    T'es sûr que tu le lances pas 2 fois de suite à 1 minute d'intervalle ?

    ça me semblerait être le cas...


    Et pourquoi mentionnes-tu : "second passage dans la fonction" ???
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Blo0d4x3
    Voici la fonction en cause:
    Ca fait beaucoup d'erreurs, non ?
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `smalloc':
    main.c:6: warning: implicit declaration of function `malloc'
    main.c:7: error: `NULL' undeclared (first use in this function)
    main.c:7: error: (Each undeclared identifier is reported only once
    main.c:7: error: for each function it appears in.)
    main.c:9: warning: implicit declaration of function `fprintf'
    main.c:9: error: `stderr' undeclared (first use in this function)
    main.c:13: warning: implicit declaration of function `memset'
    main.c: At top level:
    main.c:19: warning: function declaration isn't a prototype
    main.c: In function `startDeamon':
    main.c:21: error: storage size of 'mystat' isn't known
    main.c:22: error: `NULL' undeclared (first use in this function)
    main.c:22: warning: initialization discards qualifiers from pointer target type
    main.c:23: error: `FILE' undeclared (first use in this function)
    main.c:23: error: `file_ulog' undeclared (first use in this function)
    main.c:23: error: `file_out' undeclared (first use in this function)
    main.c:23: error: `file_log' undeclared (first use in this function)
    main.c:23: warning: left-hand operand of comma expression has no effect
    main.c:23: warning: left-hand operand of comma expression has no effect
    main.c:25: error: `time_t' undeclared (first use in this function)
    main.c:25: error: syntax error before "t"
    main.c:27: warning: implicit declaration of function `printf'
    main.c:30: warning: implicit declaration of function `time'
    main.c:30: error: `t' undeclared (first use in this function)
    main.c:32: warning: implicit declaration of function `fopen'
    main.c:32: error: `LOG_FILE' undeclared (first use in this function)
    main.c:33: warning: implicit declaration of function `exit'
    main.c:35: error: `FILE_ULOG' undeclared (first use in this function)
    main.c:38: error: `FILE_OUT' undeclared (first use in this function)
    main.c:48: warning: implicit declaration of function `stat'
    main.c:48: warning: implicit declaration of function `perror'
    main.c:48: error: `EXIT_FAILURE' undeclared (first use in this function)
    main.c:49: warning: implicit declaration of function `strftime'
    main.c:49: warning: implicit declaration of function `localtime'
    main.c:49: warning: passing arg 4 of `strftime' makes pointer from integer without a cast
    main.c:56: warning: implicit declaration of function `fwrite'
    main.c:56: warning: implicit declaration of function `strlen'
    main.c:59: warning: implicit declaration of function `strcpy'
    main.c:66: warning: implicit declaration of function `fread'
    main.c:66: warning: unused variable `ret'
    main.c:73: warning: implicit declaration of function `compareDate'
    main.c:81: warning: implicit declaration of function `substr'
    main.c:81: warning: passing arg 2 of `strcpy' makes pointer from integer without a cast
    main.c:87: warning: implicit declaration of function `LoadFileToMemory'
    main.c:87: warning: assignment makes pointer from integer without a cast
    main.c:90: warning: implicit declaration of function `Ulog_Search'
    main.c:90: warning: assignment makes pointer from integer without a cast
    main.c:100: warning: implicit declaration of function `getip'
    main.c:100: warning: assignment makes pointer from integer without a cast
    main.c:109: warning: implicit declaration of function `Ulog_Search_END_LINE'
    main.c:109: warning: assignment makes pointer from integer without a cast
    main.c:113: warning: implicit declaration of function `Ulog_get_date'
    main.c:113: warning: assignment makes pointer from integer without a cast
    main.c:115: warning: assignment makes pointer from integer without a cast
    main.c:118: warning: assignment makes pointer from integer without a cast
    main.c:131: warning: implicit declaration of function `free'
    main.c:140: warning: implicit declaration of function `fclose'
    main.c:21: warning: unused variable `mystat'
    main.c:22: warning: unused variable `SRCip'
    main.c:23: warning: statement with no effect
    Process terminated with status 1 (0 minutes, 2 seconds)
    17 errors, 41 warnings
    Malgré mes efforts pour rendre ton code compilable, je me heurte à l'absence de nombreuses fonctions.
    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
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
     
    /* POSIX.1 */
    #include <sys/stat.h>
     
    /* C */
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <time.h>
     
    #define LOG_FILE  "log.txt"
    #define FILE_ULOG "ulog.txt"
    #define FILE_OUT "out.txt"
     
    char *smalloc (int stringsize)
    {
     
       char *buffer;
     
       buffer = malloc (stringsize + 1);
       if (buffer == NULL)
       {
          fprintf (stderr, "ERREUR D'ALLOCATION !!");
          return NULL;
       }
     
       memset (buffer, 0, sizeof (buffer));
     
       return buffer;
    }
     
    int startDeamon (void)
    {
     
       struct stat mystat;
       char *IP = NULL, *date_search = NULL, *date_lastModif =
          NULL, *date_lastScan = NULL;
       char const *SRCip = { "SRC" }, *buff_file = NULL;
       FILE *file_ulog = NULL, *file_out = NULL, *file_log = NULL;
       int nbSec;
       time_t t;
     
       printf ("Go\n");
     
       /* récupère l'heure courante */
       time (&t);
     
       file_log = fopen (LOG_FILE, "a");
       if (file_log == NULL)
          exit (1);
     
       file_ulog = fopen (FILE_ULOG, "r");
       if (file_ulog == NULL)
          exit (1);
     
       file_out = fopen (FILE_OUT, "r");
       if (file_out == NULL)
          exit (1);
     
       date_search = smalloc (24);
     
       date_lastScan = smalloc (24);
     
       date_lastModif = smalloc (24);
     
       /* On recupère la date de la derniere modification du fichier de log d'ulog */
       if (stat (FILE_ULOG, &mystat) == -1)
       {
          perror ("stat");
          exit (EXIT_FAILURE);
       }
       strftime (date_lastModif, 100, "%c", localtime (&mystat.st_mtime));
     
       /* on test si le fichier existe */
       if (file_out == NULL)
       {
          /* On créé le fichier puis on ecrit la date du dernier accès */
          file_out = fopen (FILE_OUT, "w+");
          if (fwrite (date_lastModif, strlen (date_lastModif), 1, file_out) < 1)
             perror ("Erreur fwrite 1");
     
          /* On copie la date dans la seconde variable */
          strcpy (date_lastScan, date_lastModif);
     
       }
       else
       {
          /* Le fichier existe on lit la date */
          int ret = fread (date_lastScan, 24, 1, file_out);
     
          /* -ed- ret n'est jamais utilise... */
       }
     
       printf ("date_lastScan %s, date_lastModif %s\n", date_lastScan,
               date_lastModif);
     
       /* Exécution de la fonction "compareDate" */
       nbSec = compareDate (date_lastScan, date_lastModif);
     
       printf ("Nombre de minutes écoulées depuis le dernier scan: %d min\n",
               nbSec / 60);
     
       /* Si le nombre de secondes est supérieur 0 un scan a été effectué. */
       if (nbSec > 0)
       {
     
          strcpy (date_search, substr (date_lastScan, 4, 18));
     
          /* Recherche de la derniere date d'un scan (si elle existe) et copie des autres lignes en mémoire */
          /* Ou lieu de charger tous le fichier en mémoire */
     
          /* On charge le fichier en mémoire */
          buff_file = LoadFileToMemory (file_ulog);
     
          /* On recherche la date dans d'ulog le fichier et on retourne sa position dans le fichier */
          buff_file = Ulog_Search (buff_file, date_search);
          printf ("date_search: %s\n", date_search);
     
          if (buff_file == NULL)
          {
             printf ("Date introuvable\n");
             exit (1);
          }
     
          /* On recherche l'ip source */
          IP = getip (buff_file);
          if (IP == NULL)
          {
             printf ("IP introuvable\n");
             exit (1);
          }
     
          printf ("IP: %s\n", IP);
     
          buff_file = Ulog_Search_END_LINE (buff_file);
     
          while (buff_file != NULL)
          {
             date_search = Ulog_get_date (buff_file);
     
             IP = getip (buff_file);
             printf ("IP2: %s\n", IP);
     
             buff_file = Ulog_Search_END_LINE (buff_file);
     
          }
     
          /* file_out=fopen(FILE_OUT,"w+"); */
          /* if ( fwrite(date_lastModif, strlen(date_lastModif), 1, file_out) < 1 ) perror ("Erreur fwrite 1"); */
     
       }
       else
       {
          printf ("Le fichier n'a pas été modifier\n");
       }
     
       free (date_search);
       free (date_lastModif);
       free (date_lastScan);
     
       date_search = NULL;
       date_lastModif = NULL;
       date_lastScan = NULL;
     
       if (file_ulog != NULL)
          fclose (file_ulog);
     
       if (file_out != NULL)
          fclose (file_out);
     
       /* Attention les données ne sont écrites dans les fichier qu'apres le close */
       if (file_log != NULL)
          fclose (file_log);
     
       return 0;
    }
     
    int main (void)
    {
       startDeamon ();
     
       return 0;
    }
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `startDeamon':
    main.c:88: warning: unused variable `ret'
    main.c:97: warning: implicit declaration of function `compareDate'
    main.c:106: warning: implicit declaration of function `substr'
    main.c:106: warning: passing arg 2 of `strcpy' makes pointer from integer without a cast
    main.c:112: warning: implicit declaration of function `LoadFileToMemory'
    main.c:112: warning: assignment makes pointer from integer without a cast
    main.c:115: warning: implicit declaration of function `Ulog_Search'
    main.c:115: warning: assignment makes pointer from integer without a cast
    main.c:125: warning: implicit declaration of function `getip'
    main.c:125: warning: assignment makes pointer from integer without a cast
    main.c:134: warning: implicit declaration of function `Ulog_Search_END_LINE'
    main.c:134: warning: assignment makes pointer from integer without a cast
    main.c:138: warning: implicit declaration of function `Ulog_get_date'
    main.c:138: warning: assignment makes pointer from integer without a cast
    main.c:140: warning: assignment makes pointer from integer without a cast
    main.c:143: warning: assignment makes pointer from integer without a cast
    main.c:37: warning: unused variable `SRCip'
    Linking console executable: console.exe
    .objs\main.o: In function `startDeamon':
    C:/dev/forums/main.c:97: undefined reference to `compareDate'
    C:/dev/forums/main.c:106: undefined reference to `substr'
    C:/dev/forums/main.c:112: undefined reference to `LoadFileToMemory'
    C:/dev/forums/main.c:115: undefined reference to `Ulog_Search'
    C:/dev/forums/main.c:125: undefined reference to `getip'
    C:/dev/forums/main.c:134: undefined reference to `Ulog_Search_END_LINE'
    C:/dev/forums/main.c:138: undefined reference to `Ulog_get_date'
    C:/dev/forums/main.c:140: undefined reference to `getip'
    C:/dev/forums/main.c:143: undefined reference to `Ulog_Search_END_LINE'
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 2 seconds)
    9 errors, 17 warnings
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut
    Salut,

    J'ai essayer calloc à la place de malloc ca marche :-)

    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
     
    char *smalloc(int stringsize)
    {
     
      char *buffer;
     
      buffer=calloc((stringsize + 1), 1);
      if ( buffer == NULL )
      {  
        fprintf ( stderr, "\rERREUR D'ALLOCATION !!");
        return NULL;
      }
     
      memset(buffer, 0, sizeof(buffer));
     
      return buffer;
    }
    J'ai plus le soucie de la variable "écraser", mais je n'ai pas encore compris le pourquoi.

    En effet c'est un démon, la fonction est éxécuter dans un fork

    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
     
    void deamonize()
    {
      pid_t pid;
     
      pid=fork();
     
      switch (pid)
      {    
         case 0:
               initDeamon();
               break;
     
         case 1:
               printf("Problème à la création du process fils du démon survUlog");
               exit(EXIT_FAILURE);
               break;
     
         default:
                exit(EXIT_SUCCESS);
     
      }
     
    }
     
    void initDeamon()
    {
      while(1)
      {
        startDeamon();
        sleep(timer_value);
      }
    }
    A la compilation je n'ai pas d'erreur, juste un warning sur une comparaison d'un pointeur, mais pas bien méchante.

    Si vous voulez voir tous le code je peux le poster, pas de problème.

    Merci souviron34 t'a vu juste :-).

  9. #9
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Tu vérifies le retour de malloc c'est bien mais pas la retour de ta fonction smalloc caymal.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    et en plus tu ne sais pas lire...

    ni les réponses ni la doc ou les man pages.

    Voici ce que tu as mis :

    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
     
    char *smalloc(int stringsize)
    {
     
      char *buffer;
     
      buffer=calloc((stringsize + 1), 1);
      if ( buffer == NULL )
      {  
        fprintf ( stderr, "\rERREUR D'ALLOCATION !!");
        return NULL;
      }
     
      memset(buffer, 0, sizeof(buffer));
     
      return buffer;
    }
    et voici ce que j'avais mis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    char *smalloc(int stringsize)
    {
     
      char *buffer=NULL;
     
      buffer=calloc((stringsize + 1), 1);
      if ( buffer == NULL )
        fprintf ( stderr, "\rERREUR D'ALLOCATION !!");
     
      return buffer;
    }
    regardes dans la doc pourquoi ma fonction est nettement plus simple que la tienne....


    d'autre part, vu qu'un fread lit en binaire, je ne suis pas certain que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       int ret = fread(date_lastScan, 24, 1, file_out);
    mette bien un '\0' à la fin de la chaîne, contrairement au fgets...

    Et enfin, quand tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      memset(buffer, 0, sizeof(buffer));
    ça ne fait pas ce que tu penses que ça fait...

    si tu regardes la définiton de la fonction il faut passer (et c'est d'ailleurs donné dans les exemples même du man) : 0L et non pas 0.

    Ensuite, puisque tu as un paramètre qui donne la taille, pourquoi ne pas s'en servir ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      memset(buffer, 0L, (stringsize+1));
    Car buffer est un pointeur.. sizeof(buffer) te donnera donc la taille d'un pointeur (corriges-moi si je me trompe, Emmanuel ), donc 4 dans la plupart des implémentations. Et donc tu n'initialises à 0L que 4 octets.


    Mais comme en plus on peut s'en passer pusique que calloc le fait...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    en plus, m'est venu une tite idée ce matin :

    puisque tu l'appelles "deamon", pourquoi fais-tu une boucle while et pas juste une seule passe et mettre la ligne de lancement dans crontab (pour que ce soit lancé par cron) ??

    Si là pour une raison ou une autre ça plante, et ben..... ça plante ... Et ça redémarre jamais....

    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

Discussions similaires

  1. [PHP 5.0] Est-il possible d'allouer dynamiquement de la mémoire partagé ?
    Par motenai dans le forum Langage
    Réponses: 1
    Dernier message: 08/02/2011, 10h03
  2. probleme d'allocation dynamique de mémoire
    Par Blo0d4x3 dans le forum C
    Réponses: 2
    Dernier message: 13/03/2007, 07h53
  3. probleme de tableau dynamique
    Par El Krotal dans le forum C
    Réponses: 9
    Dernier message: 25/06/2004, 17h00
  4. probleme d'allocation dynamique
    Par vince3320 dans le forum C
    Réponses: 10
    Dernier message: 22/04/2004, 16h27
  5. [DOS][Mémoire] Allouer plus de 64 Ko
    Par Pascool dans le forum C
    Réponses: 3
    Dernier message: 11/02/2003, 10h26

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