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 :

Problème d'allocation ?


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 2
    Points : 4
    Points
    4
    Par défaut Problème d'allocation ?
    Salut tout le monde,

    Alors voilà je planche sur un petit Exo de cryptage, j'ai déjà passé quelques jours dessus à cause d'allocation dynamique mais cette fois j'arrive absolument pas à mettre la main sur le problème. Je débute encore dans la programmation et j'ai du mal avec l’algorithme ( me faut plus de pratique )

    Mon programme s’exécute jusqu'à la fin mais bug, il m'affiche pourtant ce que je veux. Je pense que cela vient d'un problème d'allocation mémoire mais je sens que je ne suis pas assez expérimenté dans les pointeurs et les mallocs cette fois pour trouver le problème. J'ai retourné le problème de plusieurs façon en changeant les mallocs, en changeant les free ( le free(crypter) bug plus précisément ) etc ....

    Voici mes fonctions avant le main, transDecBin je la met juste au cas où elle poserait problème aussi mais je pense pas.
    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
    int *transDecBin(int Dec)        // Méthode transformer le Décimal en Binaire
    {
        int *binaireOrdone;
        binaireOrdone = malloc(sizeof(int)*8);
        int i=0, j=0, k=0, l=0;
        int bin[20];
     
        for(l=0; l< 8; l++)
            {
                bin[l]=Dec%2;
                Dec = Dec/2;
                k++;
            }
     
        for(i = k-1; i>= 0; i--)
        {
            binaireOrdone[j] = bin[i];
            j++;
        }
        return binaireOrdone;
    }
     
    int *cryptage(int *motBin, int matrice[4][16], char *mot1)
    {
        int *coder;
        coder = malloc(sizeof(strlen(mot1)*32));
        int j,p=0, b;
        int reste[4] = {0,0,0,0};
        int o = 0;
     
        for(p=0; p < strlen(mot1)*32; p+=4)
        {
            for(j=0; j<16; j++)//COLONNE PAR COLONNE
            {
                //LIGNE PAR LIGNE
                for(b=0; b<4;b++)
                        reste[b] = motBin[b+p]*matrice[b][j];// On * la I case de coder avec la I ligne de matrice et la J colonne de matrice
                coder[p+j+o]=reste[0]^reste[1]^reste[2]^reste[3];
            }
            o+=12;
        }
        return coder;
    }
    Mon main : Il doit afficher mon mot crypté avec la Matrice mais à la fin du programme il se termine mal. J'ai de grosse allocation mémoire mais vu la taille en sortie du int * je suis un peu obligé :/ !
    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
     
    int main(int argc, char **argv)
    {
        int i, j, l=0;
        char mot[100];
        FILE* f;
        int G4[4][16]={         // Matrice G4
            {1,0,1,1,1,0,0,0,0,0,1,1,1,0,1,1},
            {1,1,1,0,1,0,1,0,0,1,0,1,0,1,0,1},
            {0,0,1,0,1,0,1,1,1,1,1,0,0,0,1,0},
            {0,0,0,0,1,1,0,0,1,1,1,1,1,1,0,1}
            };
     
        printf("Saisir un mot\n");
        fflush(stdin);
        fgets(mot, 100, stdin);
        mot[strlen(mot)-1]='\0';
        int *motEntier;
        motEntier = malloc(sizeof(int)*strlen(mot)*8);
        int *m;
        m = malloc(sizeof(int)*strlen(mot)*8);
        int *crypter;
        crypter = malloc(sizeof(int)*strlen(mot)*32);
     
        for(j =0; j < strlen(mot); j++) // Double boucle pour transformer le Decimal en Binaire
        {
            motEntier = transDecBin(mot[j]);    //lettre par lettre
            for(i = 0; i < 8; i++)
               {
                    m[l] = motEntier[i];
                    l++;
               }
        }
     
        crypter = cryptage(m, G4, mot);
     
        for(i=0; i < strlen(mot)*32; i++) printf("%d", crypter[i]);
     
        f = fopen("outc.txt", "w+");
        if(f == NULL )
        {
            for(i=0; i< strlen(mot)*32; i++) fprintf(f, "%d", crypter[i]);
            printf("\nL'ecriture a fonctionne");
            fclose(f);
        }
     
        else printf("Fichier inexistant");
     
        //AFFICHER tout le mot en Binaire
        /*for(k=0; k < 8*strlen(mot); k++)
            printf("%d", m[k]);*/
     
        free(motEntier);
        free(m);
        free(crypter);
     
        return 0;
    }
    Pour l'instant la partie avec le fichier ne devrait pas poser problème, la suite de mon programme devrait m'envoyer tout mon mot crypter dans un fichier.

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Pour commencer tu alloues un bloc mémoire à crypter ligne 23 puis tu affectes une nouvelle allocation à la même variable ligne 35. Tu viens de perdre le pointeur sur le premier bloc !

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 620
    Points
    23 620
    Par défaut
    … et un petit coup de gdb nous informe que c'est bien le free(crypter) en fin de programme qui fait planter l'affaire !

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Histoire d'enfoncer le clou le problème semble être spécifiquement dans la fonction int *cryptage(int *motBin, int matrice[4][16], char *mot1);.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 2
    Points : 4
    Points
    4
    Par défaut
    Oula il est moche effectivement le malloc de coder dans ma fonction crypter(...). Je l'ai changer en coder = malloc(sizeof(int)*(strlen(mot1)*32));
    J'ai aussi enlever le malloc de crypter dans mon main, pas judicieux d'allouer deux fois :/ !

    Maintenant je galère à essayer de savoir combien j'ai de valeur dans coder, si je dépasse pas, mais j'ai du mal à voir où mettre le compteur dans ces boucles. Juste après coder[p+j+o] = ... mais il me renvoi 16 c'est logique.

    EDIT : Ok j'ai trouvé, ma tout premiere boucle me faisait dépasser LARGEMENT ma taille de tableau, j'ai changer le *32 en *8 et ça passe niquel. J'ai bien du mal avec une triple boucle :/ ! Merci à vous

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

Discussions similaires

  1. Problème d'allocator
    Par Quark-Up dans le forum C++
    Réponses: 4
    Dernier message: 23/03/2006, 01h37
  2. Problème d'allocation mémoire
    Par cali1983 dans le forum C++
    Réponses: 10
    Dernier message: 10/03/2006, 23h23
  3. Problème d'allocation de mémoire dans la pile
    Par prophet666 dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 19/01/2006, 02h22
  4. fenetre MDI - problème d'allocation
    Par say dans le forum C++Builder
    Réponses: 8
    Dernier message: 03/11/2005, 17h06
  5. Question sur les problèmes d'allocation dynamique
    Par slylafone dans le forum C++
    Réponses: 23
    Dernier message: 25/10/2004, 14h18

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