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 :

Memory Fault


Sujet :

C

  1. #41
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 166
    Points : 39
    Points
    39
    Par défaut Memory fault
    tu m'a dis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    [quote]
    Il suffit maintenant de recopier chaque struct stat mise a jour par stat() dans le tableau...
    ça ne suffit pas:result=stat(argv[i], &sbuf[i]);
    [/quote]
    pour le qsort je me suis trompé t'a raison.


    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
     
    struct stat sbuf[argc];
      char T[50];
     
     
      for(i=1; i < argc; i++)
      {
         result=stat(argv[i], &sbuf[i]);
         if(result == 0)
         {
            mode=sbuf[i].st_mode;
            size[i]=sbuf[i].st_size;
            sprintf(T,"%d", (int *)sbuf[i].st_size);
             ................................
     
    }
      qsort(T, 20, sizeof(int *),tri);
      printf("%s\n", T[i]);
      return 0;
    }
     
     
    int tri(const void * a, const void * b) {
      return(*(int *)a - *(int *)b);
    }

  2. #42
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 166
    Points : 39
    Points
    39
    Par défaut Memory fault
    j'ai oublié de rajouter un for à la fin pour afficher les tailles.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    qsort(T, 20, sizeof(int *),tri);
      for(j=1; j<20; j++)
         printf("%s\n", T);

  3. #43
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 166
    Points : 39
    Points
    39
    Par défaut Memory fault
    ohhhh
    j'ai fait une betise au niveau du printf

    je rectifie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    qsort(T, 20, sizeof(int *),tri);
      for(j=1; j<20; j++)
         printf("\nT[%d]=%d",j,T[j]);
    mais c'est vide

  4. #44
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 166
    Points : 39
    Points
    39
    Par défaut Memory Fault
    tu peut pas m'aider à resolu ce probleme

  5. #45
    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 Re: Memory Fault
    Citation Envoyé par melmouj
    tu peut pas m'aider à resolu ce probleme
    Je t'ai déjà donné tous les éléments. A part faire le travail à ta place, je ne sais plus quoi faire...

    Tu as constitué un tableau de struct stat. Les adresses reçues dans la fonction de comparaison sont donc de type struct stat, non ? Pourquoi tu me parles d'int ?

    Il faut créer 2 pointeurs locaux de type struct stat, les initialiser avec les adresses reçues, et ensuite faire les comparaisons des champs requis (taille, date, nom, que sais-je). Je t'ai suggéré de te former sur qsort(), ce que tu refuses de faire, je ne peux plus rien pour toi. C'est à toi de tout reprendre, de tout lire, de chercher à tout comprendre, et de poser des questions si tiu ne comprends pas...

    Expérimente pas à pas. Ne mange pas d'un coup un morceau trop gros, tu vas t'étouffer...
    Pas de Wi-Fi à la maison : CPL

  6. #46
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 166
    Points : 39
    Points
    39
    Par défaut Memory Fault
    a propos des 2 point locaux de type struct stat c'est ça?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct stat 
      {
        char * key1;
        char * key2;
      }sbuf[100];
    tu parle de les 'initialiser avec les adresses reçus ie ?

    et pr la comparaison est ce que de ce genre

    if (strcmp(argv[i].key1,sbuf[i].st_size))

    [/code]

  7. #47
    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 Re: Memory Fault
    Citation Envoyé par melmouj
    a propos des 2 point locaux de type struct stat c'est ça?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct stat 
      {
        char * key1;
        char * key2;
      }sbuf[100];
    Non! Des variables locales de type pointeur sur struc stat (qui est défini dans <sys/stah.h>) à définir dans la fonction de comparaison... Je crois que tu es en train d'épuiser mon stock de patience...
    tu parle de les 'initialiser avec les adresses reçus ie ?
    (Je suis censé savoir que "ie", qui s'écrit "i.e.", veux dire "c'est à dire" ?)
    Ben oui, la fonction de comparaison reçoit 2 adresses non ? On s'en sert pour initialiser deux pointeurs, avec l'opérateur '='. T'es sûr que t'es programmeur ?
    et pr la comparaison est ce que de ce genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (strcmp(argv[i].key1,sbuf[i].st_size))
    Ben non.

    Tri par taille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return pa->st_size -pb->st_size;
    Tant que tu n'as pas compris comment fonctionne qsort(), laisse tomber. Pour la nième fois, commences par le début et vas-y pas à pas. Tu te prends pour un génie ou quoi ? Tu penses que tu peux brûler les étapes comme ça ?
    Pas de Wi-Fi à la maison : CPL

  8. #48
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut Re: Memory Fault
    Citation Envoyé par Emmanuel Delahaye
    Tri par taille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (strcmp(pa->st_size, pb->st_size))
    je précise, c'est un sarcasme (à moins que st_size soit une chaîne, ce dont je doute fort, étant donnés la structure et le nom du champ)

    Voici un truc de base, si tu ne peux pas comprendre ceci, je ne peux rien pour toi, car je ne peux pas faire plus simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int CompareTaille(const void * pt_a, const void * pt_b)
    {
    const struct stat * pt_sa = (const struct stat *)pt_a;
    const struct stat * pt_sb = (const struct stat *)pt_b;
    return (pt_sa->st_size - pt_sb->st_size);
    }
    Je te laisse deviner ce que ce code est censé faire...
    PS: Qu'est-ce que c'est que cette lubie de vouloir mettre strcmp() à toutes les sauces?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #49
    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 Re: Memory Fault
    Citation Envoyé par Médinoc
    Citation Envoyé par Emmanuel Delahaye
    Tri par taille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (strcmp(pa->st_size, pb->st_size))
    je précise, c'est un sarcasme (à moins que st_size soit une chaîne, ce dont je doute fort, étant donnés la structure et le nom du champ)
    Il m'a tellement pris la tête que j'ai fini par écrire n'importe quoi. J'ai corrigé un peu plus tard...
    Voici un truc de base, si tu ne peux pas comprendre ceci, je ne peux rien pour toi, car je ne peux pas faire plus simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int CompareTaille(const void * pt_a, const void * pt_b)
    {
    const struct stat * pt_sa = (const struct stat *)pt_a;
    const struct stat * pt_sb = (const struct stat *)pt_b;
    return (pt_sa->st_size - pt_sb->st_size);
    }
    Y'a pas besoin des casts...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    const struct stat * pt_sa = pt_a;
    const struct stat * pt_sb = pt_b;
    Pas de Wi-Fi à la maison : CPL

  10. #50
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Désolé. Mon compilo C n'acceptait les casts de void * que quand il s'agissait du pointeur NULL ((void *)0)

    D'ailleurs, j'avais lu dans mon bouquin de C que c'était la règle (conversion implicite type * --> void *, et conversion implicite [pointeur valant la constante zéro] -> type *)
    Je n'ai appris que récemment que ce n'était pas cela...

    Résultat, j'ai gardé le réflexe (surtout que j'ai tendance à coder sous Visual c++, bien que je n'utilise aucune fonction avancée (comprendre: tout ce qui a des < >, ni la STL que je ne connais pas) du c++). Et lui, n'apprécie pas les copies de pointeurs sans cast explicite...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #51
    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 Médinoc
    Désolé. Mon compilo C n'acceptait les casts de void * que quand il s'agissait du pointeur NULL ((void *)0)
    Non conforme.
    Résultat, j'ai gardé le réflexe (surtout que j'ai tendance à coder sous Visual c++, bien que je n'utilise aucune fonction avancée (comprendre: tout ce qui a des < >, ni la STL que je ne connais pas) du c++). Et lui, n'apprécie pas les copies de pointeurs sans cast explicite...
    C'est parce que tu appelles le compilateur C++. Commence par mettre .c au lieu de .cpp ou .C à tes fichiers sources... Ensuite vérifie tes reglage pour appeler le compilateur C.

    Compiler du C en C++ est un bug. Les langages sont différents, le comportement est différent.
    Pas de Wi-Fi à la maison : CPL

  12. #52
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    non-conforme
    Enfin, je ne sais plus s'il refusait ou mettait un warning... C'était un vieux compilo microsoft qui me mettait un warning "commentaire uniligne est une extension nouvelle"...


    Quand à la compilation en .c, je le fais quand j'y pense: visual 6 crée des fichiers cpp par défaut, et puis son compilo est vieux (pas de C99).
    Sinon, quand je compile en c++, j'ai dit je n'utilise aucune fonction avancée. J'utilise assez fréquemment des classes et de la surdéfinition de fonctions. Et puis, le cast systématique des pointeurs void, je pense que c'est un réflexe à prendre dans les deux langages (mais ça n'engage que moi. Je ne vais pas non plus crier sur ceux qui passent les paramètres par référence en c++ pour d'autres fonctions que les opérateurs)



    PS: Retour dans le sujet, je vais moi-même tenter de coder ça, j'en évaluerai mieux la difficulté

    Edit: Pas dur (testé sous visual : pour linux, il faudra peut-être retirer certains underscores):
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
     
    //--- Prototypes ---
    void testStatQSortC(int argc, char *argv[]);
    int compareStatC(const void *pt_a, const void *pt_b);
     
    //--- Test functions ---
     
    void testStatQSortC(int argc, char *argv[])
    {
    	struct _stat *pt_stats = NULL;
    	size_t i, nFiles;
     
    	//Allocate memory for enough _stat structures
    	nFiles = (size_t)(argc-1);
     
    	pt_stats = (struct _stat *)calloc(nFiles, sizeof(struct _stat));
     
     
    	//Fill the _stat structures
    	for(i=0 ; i<nFiles ; i++)
    		_stat( argv[i+1], &(pt_stats[i]) );// ou pt_stats+i
     
    	//Sort them
    	qsort(pt_stats, nFiles, sizeof(struct _stat), compareStatC);
     
    	//Print the results
    	for(i=0 ; i<nFiles ; i++)
    		printf("%d\n", pt_stats[i].st_size);
     
    	//free the memory
    	free(pt_stats);
    }
     
     
    //Compare function
    int compareStatC(const void *pt_a, const void *pt_b)
    {
    	const struct _stat *pt_sa = (const struct _stat *)pt_a;
    	const struct _stat *pt_sb = (const struct _stat *)pt_b;
    	return (pt_sa->st_size - pt_sb->st_size);
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #53
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 166
    Points : 39
    Points
    39
    Par défaut Memory fault
    voila ce que j'ai fait, j'avance petit à petit
    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
     
     
    #include <sys/types.h> 
    #include <sys/stat.h> 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <time.h> 
    #include <string.h> 
    #include <strings.h>
     
    int tri(void *tab, int nbr, int taille, int (* comp)(const void *, const void *))
    {
    	int i;
    	for(i=1; i<nbr; i++)
    	  if(comp((char *)tab+i*taille, (char *)tab+(i+1)*taille)>0)
    	    return 0;
    	return 1;
    }	
     
    int compar_size(const void * pt_a, const void * pt_b) 
    { 
      const struct stat * pt_sa=(const struct stat *)pt_a;
      const struct stat * pt_sb=(const struct stat *)pt_b;
      return(pt_sa->size > pt_sb->size);
    } 
     
    int main (int argc, char *argv[]) 
    { 
      int i, mode;
      int j; 
      int size; 
      int result; 
      char * patch=NULL; 
      char date1[30]; 
      char date2[30]; 
      char date3[30];
      char T[40]; 
     
      struct stat sbuf[40];
     
      for(i=1; i < argc; i++) 
      { 
         result=stat(argv[i], &sbuf[i]);
     
         if(result == 0) 
         { 
            mode=sbuf[i].st_mode; 
            size=sbuf[i].st_size; 
     
       ::::::::
            }        	
     
         } 
            else 
              printf("Problem getting information\n"); 
      } 
        if(tri(sbuf, 40, sizeof(stat), compar_size)
          qsort((void *)sbuf,40,sizeof(stat),compar_size);
     
     
      return 0; 
    }

  14. #54
    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 Médinoc
    PS: Retour dans le sujet, je vais moi-même tenter de coder ça, j'en évaluerai mieux la difficulté
    Je me doute bien que tu sais le faire. J'aurais préféré que ça sorte de la tête du posteur original qui a sérieusement besoin de réfléchir...
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
     
    /* --- Prototypes --- */
     
    /* -ed-
       pourquoi des prototypes separes dans un code monobloc ?
       Il suffit d'une meilleure disposition des fonctions.
     */
    void testStatQSortC (int argc, char *argv[]);
    int compareStatC (const void *pt_a, const void *pt_b);
     
    /* --- Test functions --- */
     
    void testStatQSortC (int argc, char *argv[])
    {
       struct _stat *pt_stats = NULL;
       size_t i, nFiles;
     
       /* Allocate memory for enough _stat structures */
       nFiles = (size_t) (argc - 1);
     
       pt_stats = (struct _stat *) calloc (nFiles, sizeof (struct _stat));
     
       /* -ed-
          calloc() pourrait echouer. Il manque un test.
          calloc() met tous les bits a zero ce qui n'est pas une facon portable
          d'initialiser des structures contant autre chose que des char.
        */
     
       /* Fill the _stat structures */
       for (i = 0; i < nFiles; i++)
       {
          _stat (argv[i + 1], &(pt_stats[i]));  /* ou pt_stats+i */
          /* -ed- la fonction POSIX.1, est stat() et non _stat() qui est un erstaz a-la-Microsoft. */
       }
     
       /* Sort them */
       qsort (pt_stats, nFiles, sizeof (struct _stat), compareStatC);
     
       /* Print the results */
       for (i = 0; i < nFiles; i++)
       {
          /* -ed- %d attend un int, pas un off_t */
          printf ("%d\n", pt_stats[i].st_size);
       }
     
       /* free the memory */
       free (pt_stats);
    }
     
     
    /* Compare function */
    int compareStatC (const void *pt_a, const void *pt_b)
    {
       const struct _stat *pt_sa = (const struct _stat *) pt_a;
       const struct _stat *pt_sb = (const struct _stat *) pt_b;
       return (pt_sa->st_size - pt_sb->st_size);
    }
     
    /* -ed- que de casts inutiles... */
    Pas de Wi-Fi à la maison : CPL

  15. #55
    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 Re: Memory fault
    Citation Envoyé par melmouj
    voila ce que j'ai fait, j'avance petit à petit
    Ca commence à venir, mais
    • l'élement 'taille' s'appelle 'st_size' et non 'size'. Ton compilateur ne dit rien ?
    • A quoi sert la fonction tri() ? Tu n'as pas confiance en qsort() ?
    • Le tableau n'est pas complètement initialisé.
    • Attention à ne pas déborder du tableau.
    • La case 0 du tableau n'est pas utilisée.
    • Tu demandes à qsort() de tout trier, Il y a exactement 40 fichiers à chaque fois ? Ca fait une sacré ligne de commande...

    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
     
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    int compar_size (const void *pt_a, const void *pt_b)
    {
       const struct stat *pt_sa = pt_a;
       const struct stat *pt_sb = pt_b;
       return pt_sa->st_size > pt_sb->st_size;
    }
     
    int main (int argc, char *argv[])
    {
       int i;
       int result;
     
       struct stat sbuf[40];
     
       for (i = 0; i < argc - 1; i++)
       {
          result = stat (argv[i + 1], &sbuf[i]);
     
          if (result != 0)
          {
             printf ("Problem getting information\n");
          }
       }
       qsort (sbuf, 40, sizeof (stat), compar_size);
     
       /* -ed-
          Ok. Maintenant, il faut relire le tableau et faire les affichages
          qui vont bien.
        */
       return 0;
    }
    Pas de Wi-Fi à la maison : CPL

  16. #56
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    pourquoi des prototypes separes dans un code monobloc ?
    Il suffit d'une meilleure disposition des fonctions.

    Tu vas peut-être trouver cela bète, mais il est fréquent que je dispose volontairement mes fonctions de sorte qu'elles nécessitent un prototype. Histoire de prendre le réflexe de les mettre...

    calloc() pourrait echouer. Il manque un test.
    calloc() met tous les bits a zero ce qui n'est pas une facon portable
    d'initialiser des structures contant autre chose que des char.

    1) Tu as raison, j'ai oublié
    2) ??? Pas portable ???

    la fonction POSIX.1, est stat() et non _stat() qui est un erstaz a-la-Microsoft.
    testé sous visual : pour linux, il faudra peut-être retirer certains underscores
    %d attend un int, pas un off_t
    printf ("%ld\n", pt_stats[ i ].st_size);
    Tu as raison, j'ai perdu le réflèxe de mettre le l quand je suis passé à la programmation 32 bits (je rappelle que off_t est signé)

    que de casts inutiles...
    En effet, en C, il le sont, mais je trouve que c'est un réflèxe à prendre et à garder. On a tous nos lubies.
    (De plus, si tu fais un jour un bète copier-coller dans un .cpp, ça compile quand aussi. Testé sous Visual également).


    melmouj : Je ne sais pas ce qu'elle fait ta fonction de trie, mais à mon avis, elle ne trie pas. Par contre, il est possible qu'elle teste que le tableau est bien trié...
    * Médinoc relit le bas de ton code *
    Ah, compris: Tu appelles qsort() si le tableau n'est pas déja trié...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #57
    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 Médinoc
    pourquoi des prototypes separes dans un code monobloc ?
    Il suffit d'une meilleure disposition des fonctions.

    Tu vas peut-être trouver cela bète,
    possible...
    mais il est fréquent que je dispose volontairement mes fonctions de sorte qu'elles nécessitent un prototype. Histoire de prendre le réflexe de les mettre...
    Meuh ? Et ça sert à quoi ? Le prototype est déjà intégré dans la définition. La fonction peut être ocale (static) et elle n'aura pas besoin de prototype séparé. Evidemment si on a plusieurs unités de comilations séparées, c'est autre chose, mais dans ce cas, les prototypes sont exclusivement dans des headers, car ils doivent être inclus au moins 2 fois (une fois dans le fichier de définition et autant de fois que nécessaire dans les fichiers utilisateurs).

    http://emmanuel-delahaye.developpez....ganiser_source
    http://emmanuel-delahaye.developpez.....htm#organiser

    Le seul cas où un protoype séparé pour une fonction locale (static) est obligatoire, c'est dans le cas où il y aurait des appels mutuels.

    Comme c'est une source de plantage sévère (appels récursifs non désirés), il est particulièrement utile que ce genre de cas apparaisse clairement, ce qui est le cas si le prototype séparé reste exceptionnel.

    calloc() met tous les bits a zero ce qui n'est pas une facon portable
    d'initialiser des structures contant autre chose que des char.

    2) ??? Pas portable ???
    Oui. Un flottant à 0.0 n'a pas forcément tous ces bits à 0. Idem pour un pointeur NULL (sujet épuisé, merci de ne pas relancer le débat -> archives).
    %d attend un int, pas un off_t
    printf ("%ld\n", pt_stats[ i ].st_size);
    Tu as raison, j'ai perdu le réflèxe de mettre le l quand je suis passé à la programmation 32 bits (je rappelle que off_t est signé)
    Il manque un cast explicite, parce qu'on ne connait pas le type exact de off_t :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf ("%ld\n", (long) pt_stats[ i ].st_size);
    ou (C99)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf ("%lld\n", (long long) pt_stats[ i ].st_size);
    que de casts inutiles...
    En effet, en C, il le sont, mais je trouve que c'est un réflèxe à prendre et à garder. On a tous nos lubies.
    (De plus, si tu fais un jour un bète copier-coller dans un .cpp, ça compile quand aussi. Testé sous Visual également).
    Dans mes sources, (par exemple : http://emmanuel-delahaye.developpez.com/clib.htm) il y a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #ifdef __cplusplus
    #error This source file is not C++ but rather C. Please use a C-compiler
    #endif
    car il n'est pas question de faire compiler du code écrit en C par autre chose qu'un compilateur C.

    Qui ferait ça ? un fou, probablement...
    Pas de Wi-Fi à la maison : CPL

  18. #58
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 166
    Points : 39
    Points
    39
    Par défaut Memory fault
    mais ça n'affiche pas ds l'ordre
    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
     
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
     
    int compar_size (const void *pt_a, const void *pt_b)
    {
       const struct stat *pt_sa = pt_a;
       const struct stat *pt_sb = pt_b;
       return pt_sa->st_size > pt_sb->st_size;
    }
     
     
    int main (int argc, char *argv[])
    {
      int i, mode;
      int size;
      int result;
      char * patch=NULL;
      char date1[30];
      char date2[30];
      char date3[30];
      struct stat sbuf[argc];
     
      for(i=0; i < argc - 1; i++)
      {
         result=stat(argv[i+1], &sbuf[i]);
         if(result == 0)
         {
            mode=sbuf[i].st_mode;
            size=sbuf[i].st_size;
     
           .....................
           ....................
     
         }
         else
         {
           printf("Problem getting information\n");
         }
      }
     
      qsort(sbuf, argc, sizeof (stat), compar_size);
      for(i=0;i<argc - 1;i++)
      {
        printf("%d\n",sbuf[i].st_size);
      }
      return 0;
    }

  19. #59
    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 Re: Memory fault
    Citation Envoyé par melmouj
    mais ça n'affiche pas ds l'ordre
    Je ne conseille pas d'utiliser les tableau à taille variable (nouveauté C99 qui n'est pas au point avec gcc). Utilise plutôt la mémoire dynamique . Attention à la fonction de comparaison qui doit retourner <0, 0 ou >0. et non pas 0 ou 1... On t'avait déjà conseillé d'utiliser la difference. Pourquoi as-tu changé le code ?

    EDIT : nettoyage...
    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
     
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    int compar_size (const void *pt_a, const void *pt_b)
    {
       const struct stat *pt_sa = pt_a;
       const struct stat *pt_sb = pt_b;
     
       return pt_sa->st_size - pt_sb->st_size;
    }
     
    int main (int argc, char *argv[])
    {
       size_t i;
       size_t size = argc - 1;
       struct stat *sbuf = malloc (size * sizeof *sbuf);
     
       if (sbuf != NULL)
       {
          int err = 0;
     
          for (i = 0; !err && i < size; i++)
          {
             printf ("'%s'\n", argv[i + 1]);
             err = stat (argv[i + 1], &sbuf[i]) != 0;
          }
     
          if (!err)
          {
             qsort (sbuf, argc - 1, sizeof *sbuf, compar_size);
     
             for (i = 0; i < size; i++)
             {
                printf ("%d\n", sbuf[i].st_size);
             }
          }
          else
          {
             printf ("Problem getting information\n");
             perror (argv[i + 1]);
          }
     
          free (sbuf), sbuf = NULL;
       }
       return 0;
    }
    Pose des questions si tu ne comprends pas.
    Pas de Wi-Fi à la maison : CPL

  20. #60
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 166
    Points : 39
    Points
    39
    Par défaut Memory fault
    Merci Emmanuel

Discussions similaires

  1. Problème de Core dumped, Memory Fault
    Par pmboutteau dans le forum C
    Réponses: 26
    Dernier message: 26/03/2009, 16h07
  2. [Mémoire] Probleme de Memory Fault louche
    Par wawa84 dans le forum C++
    Réponses: 1
    Dernier message: 23/11/2008, 20h53
  3. Memory fault à l'exécution
    Par miketidy dans le forum C++
    Réponses: 26
    Dernier message: 09/09/2008, 14h43
  4. Memory fault avec une structure
    Par Neuromancien2 dans le forum C
    Réponses: 4
    Dernier message: 04/01/2008, 14h25
  5. Memory fault(coredump)
    Par nono1 dans le forum C
    Réponses: 8
    Dernier message: 17/12/2002, 17h26

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