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 :

Segmentation fault; pas d'idées


Sujet :

C++

  1. #21
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    ok !! donc 'a' est un tableau de cellules !!!
    Sa déclaration est bien :
    Par contre, d'où tu sors les syntaxes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (c=="/t") j++;
    if (c=="/" && c2=="/n") ...
    J'ai l'impression que tu as codé sans réfléchir.
    Commence par faire ton algo sur papier.

    Parce que concaténer une chaine avec elle-même, j'ai un peu de mal à comprendre !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcat(a[i][j],a[i][j]);

  2. #22
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Ok, donc ce sont vraiement des pointeurs, que tu mets à null pour pouvoir savoir si une chaine ou une autre existe.
    Peut être que pour faire du C++ il faudrait que tu aies un objet Feuille qui contient un std::vector<Ligne>, chaque Ligne contenant un std::vector<std::string>.
    Plus de prises de tête avec les pointeurs à initialiser, les vérifications d'existence, les concaténations de chaines. Et il me semble que std::string a les méthodes de concaténation qui vont bien.

    feuille.h:
    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
     
    #include <vector>
    #include <string>
    #include <ligne.h>
     
    class Feuille{
    private:
       std::vector<Ligne> lignes;
     
    public:
       /**
       * Ajoute une cellule en bas à droite de la feuille.
       */
       void addCell(const std::string & contenu);
    };
    et ligne.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <vector>
    #include <string>
     
    class Ligne{
    private:
    std::vector<std::string>
     
    public:
       /**
       * Ajoute une cellule en fin de ligne.
       */
       void addCell(const std::string & contenu);
    };
    ou quelque chose comme ça.

  3. #23
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    +1

    C'est bien pour ça que je demandais au début s'il voulait faire du C ou du C++...

  4. #24
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 18
    Par défaut
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    main()
    {
    int i=0;
    int j=0;
    char c2;
    char c;
     
    c=0;
     
    c2=0;
     
    char a[65000][2560];
     
     
    for(i=0;i<65000 ;i++){a[i][i]=calloc(10,sizeof(char));}
     
    i=1;
    j=1;
     
    FILE *fp=fopen("/sdcard/GDE.Main/tt.txt","a+");
    rewind(fp);
    do{
     
    fgets(&c,1,fp);
    fseek(fp,1,SEEK_CUR);
    fgets(&c2,1,fp);
    fseek(fp,-1,SEEK_CUR);
     
    if (strcmp(&c,"/")==0&&strcmp(&c2,"t")==0)j++;
    if (strcmp(&c,"/")==0 && strcmp(&c2,"n")==0){ i++,j=1;};
    strcat(&a[i][j],&c);
    }while (feof(fp)==0);
     
    fclose(fp);
     
    return 0;
    }
    Non toujours pas d'inspiration
    Fichiers attachés Fichiers attachés
    • Type de fichier : txt tt.txt (57 octets, 53 affichages)

  5. #25
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 18
    Par défaut
    Je n'avais pas vu les réponse suivantes sur la page 2.

    Oui il y a des chose que j'ai codé un peu vite.
    C++ car je compile avec G++ donc même contrainte au niveau des types.
    C'est une horreur quand on a pas l'habitude du typage fort, j'y comprends rien c'est le problème principal il me semble.

  6. #26
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    A mon avis la source de tes difficultés est que tu te mets les contraintes du typage fort sans en utiliser les avantages. Si tu pars du modèle que je t'ai suggéré, ça va te simplifier la vie.
    Utilisés en respectant leur logique, le typage fort et le modèle OO t'empêchent de faire certains choses...y compris les erreurs qui vraquent ton appli
    PS: mon planning est un peu tendu, là, donc je n'ai pas le temps de détailler, mais j'essaierai de trouver le temps de t'en glisser plus ce soir si tu es toujours bloqué...

  7. #27
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 18
    Par défaut
    Bonjour,

    Merci Eric, je suis pas pressé de toute façon juste contrarié de ne pas faire tourner un algo aussi simple avec 20 lignes de code.

  8. #28
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par Aurel5477 Voir le message
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    main()
    {
    int i=0;
    int j=0;
    char c2;
    char c;
     
    c=0;
     
    c2=0;
     
    char a[65000][2560];
     
     
    for(i=0;i<65000 ;i++){a[i][i]=calloc(10,sizeof(char));}
     
    i=1;
    j=1;
     
    FILE *fp=fopen("/sdcard/GDE.Main/tt.txt","a+");
    rewind(fp);
    do{
     
    fgets(&c,1,fp);
    fseek(fp,1,SEEK_CUR);
    fgets(&c2,1,fp);
    fseek(fp,-1,SEEK_CUR);
     
    if (strcmp(&c,"/")==0&&strcmp(&c2,"t")==0)j++;
    if (strcmp(&c,"/")==0 && strcmp(&c2,"n")==0){ i++,j=1;};
    strcat(&a[i][j],&c);
    }while (feof(fp)==0);
     
    fclose(fp);
     
    return 0;
    }
    Non toujours pas d'inspiration
    Les deux lignes qui me gènent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char a[65000][2560];
    ...
    for(i=0;i<65000 ;i++){a[i][i]=calloc(10,sizeof(char));}
    a étant un tableau de char, tu stocke les 8 bits de poids faible d'un pointeur dans chaque cellule. Ca ne peut pas marcher. Au pire, il faut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char * a[65000][2560];
    Le plus grave est le parcours du tableau : a[i][i] avec 0 < i < 65000 ? C'est quoi a[65000][65000] ? Ca pointe où ? Certainement pas dans le tableau en tout cas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (int i=0; i<65000; ++i) {
      for (j=0; j<2560; ++j) {
        a[i][j] = calloc(10, sizeof(char));
      }
    }
    Ensuite, un tel tableau a une taille assez rigolote : 65000*2560*sizeof(char*) = 634 Mo en 32 bits, ou 1,2 Go en 64 bits. Une fois les 166400000 pointeurs alloués, ça représente 2,2 Go (pour 32 bits) ou 2,8 Go (pour 64 bits). En 64 bits, tu n'auras pas de soucis. En 32 bits, est-ce que tu as assez de mémoire ? (avec la mémoire virtuelle et le swap, ça devrait passer, mais tu dois te demander quel est l'intérêt de ce tableau en RAM si une partie doit être stockée en swap, donc sur le disque...). Sous Windows, tu risques aussi de dépasser la limite max allouée à chaque process (2Go en temps normal sur une machine 32 bits) : du coup, une bonne partie des allocation vont échouer, renvoyer NULL, et tu ne testes pas le retour. Tu va avoir une partie de ton tableau rempli avec des pointeurs NULL, ce qui te poseras de gros problèmes plus tard.

    Plus tard, tu ne testes jamais si i ou j atteignent ou dépassent les valeurs max admissible. Si jamais c'est la cas, tu va encore une fois écrire dans des zones mémoires sur lesquelles tu n'as pas la main. Ton appel à strcat est aussi malavisé et ne peux pas fonctionner :

    1) a[i][j] est une chaine ; prendre l'adresse de la chaine n'est pas vraiment une bonne idée.
    2) c est un char, donc &c ne peut pas être une chaine de caractère terminée par un 0 puisqu'il faut au moins deux char pour la représenter.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  9. #29
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 18
    Par défaut
    le dernier code posté n'est pas le dernier testé (l'ai perdu sais pas comment)
    L'allocation a été testée avec "new" ;ça tourne jusqu'à mon "segmentation fault" même pour un tableau 10*10

  10. #30
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Citation Envoyé par Aurel5477 Voir le message
    C++ car je compile avec G++ donc même contrainte au niveau des types.
    On peut très bien compiler du C avec un compilateur C++.
    Donc ce n'est pas le point le plus important à prendre en compte.
    Si tu es plus à l'aise en C qu'en C++, ou si tu ne connais pas (suffisamment) le C++, ça peut être préférable de coder en C.
    Sauf si tu veux en profiter pour (mieux) maîtriser le C++...

    Si tu veux faire du C++, il te faudra utiliser une approche objet, ainsi que les classes adéquates.
    Les chaînes de caractères ne sont plus des char* mais des std::string ; les tableaux sont à proscrire au profit des std::vector ; les FILE* sont remplacés par la famille des std::{i,o}stream.
    Un des gros avantages des deux premières classes est quelles s'occupent automatiquement et de manière transparente pour l'utilisateur de la gestion de la mémoire : allocation, déallocation, et même réallocation lorsqu'il n'y a plus de place !

    Si tu veux rester sur du C... eh bien il y a du boulot...

  11. #31
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 18
    Par défaut
    Il serait effectivement pertinent que je me mette à l'OO. Intellectuellement m'embête un peu de pas faire tourner ça avec mes contraintes de départ. Bizarre que ça soit si compliqué ou impossible.

  12. #32
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Citation Envoyé par Aurel5477 Voir le message
    Bizarre que ça soit si compliqué ou impossible.
    C'est ni compliqué ni impossible, il faut juste "réfléchir" avant de coder.
    Tu mélanges la gestion d'un caractère avec la gestion d'une chaine de caractère.
    Tu fais des tuc super bizarre comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (strcmp(&c,"/")==0&&strcmp(&c2,"t")==0)j++;
    if (strcmp(&c,"/")==0 && strcmp(&c2,"n")==0){ i++,j=1;};
    D'où sors-tu les "/", tu ne verras jamais ça dans des tutoriaux ou exemples de code.
    Je suis peut-être à côte de la planque !! "/t" et "/n" sont peut-être réellement dans ton fichier de type tableur.

    Peux-tu nous mettre un exemple de ton fichier "tableur" ? autre qu'un truc super simple à 1 ligne (tt.txt)

  13. #33
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    L'algo en C pourrait ressembler à ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    colonne =0, ligne = 0,
    debut boucle
      je lis un caractère
     
      si ce caractère n''est pas un espace ou tab ou retour chariot
        je stocke mon caractère dans ma chaine temporaire
        retour au debut
     
      j''alloue la taille de ma chaine temporaire de la cellule courante (a[ligne][colonne] = malloc ...)
      si tab ou espace -> colonne++
      si retour chariot -> linge ++; colonne = 0;
    fin boucle

  14. #34
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Citation Envoyé par fregolo52 Voir le message
    D'où sors-tu les "/", tu ne verras jamais ça dans des tutoriaux ou exemples de code.
    Je suis peut-être à côte de la planque !! "/t" et "/n" sont peut-être réellement dans ton fichier de type tableur.

    Peux-tu nous mettre un exemple de ton fichier "tableur" ? autre qu'un truc super simple à 1 ligne (tt.txt)
    Ce morceau dans le code m'a aussi posé problème.
    Mais, à bien y réfléchir, je me demande s'il ne veut pas plutôt dire '\t' et '\n', soit le caractère « tabulation » et le caractère « nouvelle ligne ».
    Me trompe-je ?

    (À moins que ce ne soit "\t" et "\n", à savoir la chaîne contenant uniquement le caractère « tabulation » et la chaîne contenant uniquement le caractère « nouvelle ligne »...)

  15. #35
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 18
    Par défaut
    Ah c'est vrai merci: c'est le truc qui me manquait "réfléchir". Sans vous Msieur Fregolo je n'aurais jamais mis le doigt dessus. "Bizarre que ça soit si compliqué ou impossible" c'est de la ponctuation personnelle.

  16. #36
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 18
    Par défaut
    Exactement Steph

  17. #37
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Citation Envoyé par Aurel5477 Voir le message
    Ah c'est vrai merci: c'est le truc qui me manquait "réfléchir". Sans vous Msieur Fregolo je n'aurais jamais mis le doigt dessus. "Bizarre que ça soit si compliqué ou impossible" c'est de la ponctuation personnelle.
    Entre la spécification et le développement, il y a un truc nommé la conception, sans elle tu ne vas pas bien loin. On dirait que tu l'as oubliée.

    Et tu as sorti le verbe hors contexte !! J'ai dit "réfléchir avec de coder", je n'ai jamais dit que tu n'avais pas réfléchi.
    Malheureusement quand on réfléchit en codant on fait des conneries. On est quasi tous passé par là, au début.

  18. #38
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 18
    Par défaut
    Merci j'en prends note sans rancune et sans mauvais esprit

  19. #39
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Citation Envoyé par Aurel5477 Voir le message
    Merci j'en prends note sans rancune et sans mauvais esprit
    tu vas faire quoi maintenant ?
    Essayer de faire un code C avec le pseudo algo à 2 balles que j'ai posté ou passer avec les STL (C++) ?
    Parce qu'on ne va pas te guider de la même façon.

  20. #40
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 18
    Par défaut
    Les 2 m'intéressent mais je ne vais pas laisser tomber la forme C, comme tu l'as dit évidemment, il n'est pas impossible de faire tourner ce truc. je vais me poser un peu et remettre ça en forme.

Discussions similaires

  1. Réponses: 5
    Dernier message: 23/12/2009, 11h31
  2. Réponses: 5
    Dernier message: 09/06/2009, 10h30
  3. Problème : pas de segmentation fault ?!
    Par Loïc B. dans le forum C++
    Réponses: 3
    Dernier message: 05/11/2007, 17h08
  4. Réponses: 13
    Dernier message: 13/07/2004, 15h41
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 13h43

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