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 :

Operation sur les pointeurs


Sujet :

C

  1. #1
    Membre confirmé Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Par défaut Operation sur les pointeurs
    Bonjour à toutes et à tous.

    J'ai un petit (gros) problème au sujet des pointeurs et des fonctions.
    Voila en gros à quoi ressemble mon code.

    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
     
    #include <stdio.h>
    #include <dirent.h>
    #include <sys/stat.h>
    #include <string.h>
     
    int getInfoFile(char *psNomRep, char *psNomFichier, char *psCheminFichier, int *piDateFichier);
     
    int getInfoFile(char *psNomRep, char *psNomFichier, char *psCheminFichier, int *piDateFichier)
    {
            struct stat s;
     
            psCheminFichier = (char *) malloc(strlen(psNomRep) + strlen(psNomFichier) + 1);
            if(psCheminFichier == NULL)
            {
                    printf("ERR : Plus assez de mémoire dispo...");
                    exit(1);
            }
     
            strcpy(psCheminFichier, psNomRep);
            strcat(psCheminFichier, psNomFichier);
     
            lstat(psCheminFichier, &s);
            *piDateFichier = s.st_mtime;
    }
    Mon souci là-dessus vient de ma variable de sortie psCheminFichier. Je ne sais pas comment faire pour bien la récupérer.

    J'ai effectivement compris que pour récupérer une variable en sortie, il fallait en faire un pointeur et attribuer à sa valeur un certain contenu à l'intérieur même de la fonction. Puis, lorsqu'on appelle la fonction, il faut placer dans le bon paramètre l'adresse d'une variable. Mais là, avec strcpy, je ne sais que faire...

    Dans mon main(), j'appelle cette fonction en plusieurs occasions.

    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
    int main()
    {
            struct dirent *pDp;
            DIR *pRep_id;
            int iDateFichier = 0;
            int iDateFichierCourant = 0;
            char sCheminFichier;
            char sCheminFichierCourant;
            char *psNomRep = "/MonChemin/";
            int i=0;
     
            pRep_id = opendir(psNomRep);
            for(pDp = readdir(pRep_id); pDp != NULL; pDp = readdir(pRep_id))
            {
                    if(strcmp(pDp->d_name, ".") != 0 && strcmp(pDp->d_name, "..") != 0)
                    {
                            if (i == 0)
                            {
                                    getInfoFile(psNomRep, pDp->d_name, &sCheminFichier, &iDateFichier);
                                    i++;
                            }
                            else
                            {
                                    getInfoFile(psNomRep, pDp->d_name, &sCheminFichierCourant, &iDateFichierCourant);
     
                                    if(iDateFichierCourant < iDateFichier)
                                    {
                                            iDateFichier = iDateFichierCourant;
                                            sCheminFichier =sCheminFichierCourant;
                                    }
                            }
                    }
            }
            closedir(pRep_id);
            printf("\n-----------\nLe plus ancien fichier est %s.\n-----------\n", sCheminFichier);
            return 0;
    }
    Ma fonction main() va me servir à ramener le fichier avec la date de modification la plus basse pour pouvoir ensuite faire un traitement sur ce fichier.

    Je m'excuse d'avance pour la maladresse de mon code .

    Bahan

  2. #2
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Salut

    Comme tu l'as dit, il faut effectivement faire passer un pointeur sur la variable que tu veux modifier, or cette variable est déjà un pointeur, et plus, tu alloues de la mémoire pour lui (donc tu modifies le pointeur en lui-même et pas uniquement ce qui est pointé)

    il te faut donc faire passer un pointeur de pointeur, et déclarer un char* (et non un char) dans ton main

    de plus, pense à faire un free sur ton pointeur, pour le libéré (puisqu'il est alloué avec malloc
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  3. #3
    Membre confirmé Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Par défaut
    J'ai modifié le code de mon main() pour essayer de prendre en compte tes conseils.
    Voici ce que cela donne (en rouge), sachant que ma fonction getInfoFile() n'a pas changé de celle du début du topic.

    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
    #include <stdio.h>
    #include <dirent.h>
    #include <sys/stat.h>
    #include <string.h>
     
    int main()
    {
            struct dirent *pDp;
            DIR *pRep_id;
            int iDateFichier = 0;
            int iDateFichierCourant = 0;
           char *psCheminFichier;
            char *psCheminFichierCourant;
         char *psNomRep = "/MonChemin/";
            int i=0;
     
            pRep_id = opendir(psNomRep);
            for(pDp = readdir(pRep_id); pDp != NULL; pDp = readdir(pRep_id))
            {
                    if(strcmp(pDp->d_name, ".") != 0 && strcmp(pDp->d_name, "..") != 0)
                    {
                            if (i == 0)
                            {
                                    getInfoFile(psNomRep, pDp->d_name, psCheminFichier, &iDateFichier);
                                    i++;
                            }
                            else
                            {
                                    getInfoFile(psNomRep, pDp->d_name, psCheminFichierCourant, &iDateFichierCourant);
     
                                    if(iDateFichierCourant < iDateFichier)
                                    {
                                            iDateFichier = iDateFichierCourant;
                                            realloc(psCheminFichier, strlen(psCheminFichierCourant)+1);
                                            strcpy(psCheminFichier, psCheminFichierCourant);
                                            free(psCheminFichierCourant);
                                    }
                            }
                    }
            }
       closedir(pRep_id);
       printf("\n-----------\nLe plus ancien fichier est %s.\n-----------\n", psCheminFichier);
       free(psCheminFichier);
       return 0;
    }
    Je n'ai pas d'erreur de compilation. Cependant, j'ai maintenant une erreur de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Segmentation fault(coredump).
    Cela signifie en gros que j'attribue mal mes variables n'est-ce pas ?

    Bahan

  4. #4
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    comme je te l'ai dit, il faut passer un pointeur de pointeur, donc remettre les & au moment de l'appel, rajouter un * à char* dans la déclaration/définition de la fonction et penser à travailler sur *psCheminFichier au lieu de psCheminFichier
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Swoög
    comme je te l'ai dit, il faut passer un pointeur de pointeur, donc remettre les & au moment de l'appel, rajouter un * à char* dans la déclaration/définition de la fonction et penser à travailler sur *psCheminFichier au lieu de psCheminFichier
    Que c'est laid...

  6. #6
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Que c'est laid...
    Si tu as une autre solution... comme il doit manipuler plusieurs variables, le retour de fonction n'est pas envisageable... je ne vois, personnellement, rien d'autre, ça ne signifie, bien sûr, pas qu'il n'y en a pas d'autre...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  7. #7
    Membre confirmé Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Par défaut
    Merci pour votre aide.

    Bahan

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Swoög
    Si tu as une autre solution... comme il doit manipuler plusieurs variables, le retour de fonction n'est pas envisageable... je ne vois, personnellement, rien d'autre, ça ne signifie, bien sûr, pas qu'il n'y en a pas d'autre...
    La structure. Je l'ai souvent évoquée...

  9. #9
    Membre confirmé Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Par défaut
    Yop les gens.

    Pour finir, j'utilise la fonction popen, bien sympathoche.

    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
     
    #include <stdio.h>
    #include <string.h>
     
    main()
    {
            char    * pszExtension;
            char    * pszRadical;
            char    szBufferW[1000];
            char    szBuffer[1000];
            FILE *  pfPop;
            printf("DEBUT\n");
            pfPop   = popen ("ls -rt /tmp | sort", "r") ;
            if ( pfPop == (FILE *) NULL)
            {
                    printf("Erreur sur ouverture du PIPE\n");
                    exit(0);
            }
            while(fgets(szBuffer, sizeof(szBuffer), pfPop) != (char *) NULL)
            {
                    szBuffer[strlen(szBuffer) - 1] = '\0';
                    strcpy(szBufferW, szBuffer);
                    pszRadical = strtok(szBufferW, ".");
                    pszExtension = strtok(NULL, ".");
                    printf("Buffer lu <%s> radical <%s> extension <%s>\n",
                            szBuffer,
                            pszRadical,
                            pszExtension);
            }
            printf("FIN\n");
            exit(0);
    }
    Cela me permet de ramener mes fichiers dans l'ordre que je désire vu que je peux coupler le ls avec ce que je veux, et m'extrait le radical et l'extension de mes fichiers.

    Est-ce plus propre déjà ?

    Bahan

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

Discussions similaires

  1. operation sur les float
    Par grand's dans le forum C++
    Réponses: 14
    Dernier message: 26/10/2005, 10h43
  2. Opération sur les dates (Shell)
    Par argoet dans le forum Linux
    Réponses: 6
    Dernier message: 21/06/2005, 13h56
  3. operation sur les dates
    Par elendil dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 13/04/2005, 12h14
  4. questions sur les pointeurs
    Par Hyoga dans le forum C++
    Réponses: 17
    Dernier message: 08/01/2005, 23h25
  5. Pb de débutant sur les pointeurs!!!
    Par benji17c dans le forum C
    Réponses: 6
    Dernier message: 30/09/2003, 17h50

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