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 :

Insertion tableau dynamique 2D


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2015
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Insertion tableau dynamique 2D
    Bien le bonjour à tous !

    Je viens vous demander de l'aide car je rencontre actuellement un problème lors de l’exécution de mon petit programme. Pour résumer il me permet de chiffrer un message avec le chiffrage ADFGVX.

    Voici un petit morceau de code (soyez indulgent j'ai commencé le C il n'y a que 2 semaines ) :

    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
    int cryptage()
    {
      char phraseDecrypter[101];
      char *phraseCrypter, remplacement;
      char **tableauCryptage, **tableauCryptageBis;
      int longueurCle = 0;
      int *cleCryptage, i, j, longueurChaine, n, saisieTemporaire, validationSaisie, x, y, z;
      int coordX, coordY;
      char algo [6] = {'A','D','F','G','V','X'};
      char algoCryptage[6][6] = {{'c','1','o','f','w','j'},
    			     {'y','m','t','5','b','4'},
    			     {'i','7','a','2','8','s'},
    			     {'p','3','0','q','h','x'},
    			     {'k','e','u','l','6','d'},
    			     {'v','r','g','z','n','9'}};
     
      affichageCartouche();
      affichageCryptage();
     
      // Saisie par l'utilisateur de la phrase decrypter
      scanf("%s", &phraseDecrypter);
     
      // Vider la mémoire après la saisie utilisateur
      viderBuffer();
     
      affichageCartouche();
     
      // Boucle permettant de demander et vérifier la longueur de la clé (comprise entre 3 et 9)
      while (longueurCle < 3 || longueurCle > 9)
      {
        affichageCartouche();
        printf("La phrase a crypter est : %s\n\n", phraseDecrypter);
        printf("Quelle est la longueur n de la clé de cryptage, tel que : 2 < n < 10 : ");
        scanf("%d", &longueurCle);
     
        viderBuffer();
      }
     
      // Création d'un tableau dynamique pour contenir les nombres de la clé
      cleCryptage = (int*)calloc(longueurCle, sizeof(int));
     
      // Première boucle imbriquée parcourant cleCryptage afin de la remplir
      for (i = 0; i < longueurCle; i++)
      {
        // Deuxième boucle permettant de verifier que la saisie est comprise entre 2 et longueurCle
        while (cleCryptage[i] < 1 || cleCryptage[i] > longueurCle)
        {      
          // Affichage personnalisé
          if (i == 0)
          {
    	printf("Saisie du 1er chiffre de la clé de cryptage : ");
          }
          else
          {
    	printf("Saisie du %deme chiffre de la clé de cryptage : ", i+1);
          }
     
          // Saisie du chiffre
          scanf("%d", &saisieTemporaire);
          viderBuffer();
     
          // Troisième boucle vérifiant si la saisie n'existe pas deja dans la clé
          for (j = 0; j < longueurCle; j++)
          {
    	if (saisieTemporaire == cleCryptage[j])
    	{
    	  validationSaisie = 1;
    	}
          }
     
          // Si la saisie n'apparait pas dans la liste on peux ajouter le chiffre
          if(validationSaisie == 1)
          {
    	cleCryptage[i] = 0;
          }
          else
          {
    	cleCryptage[i] = saisieTemporaire;
          }
     
          // On re-initialise la variable validationSaisie à 0
          validationSaisie = 0;
        }
      }
     
      // Recapitulation
      affichageCartouche();
      printf("La phrase a crypter est : %s\n", phraseDecrypter);
      affichageCle(cleCryptage, longueurCle);
     
      // Calcul de la taille de la phrase Crypter
      longueurChaine = strlen(phraseDecrypter);
      longueurChaine = longueurChaine * 2;
     
      // Dans le cas où on ajoute des X pour completer la ligne
      while (longueurChaine % longueurCle != 0)
      {
        longueurChaine = longueurChaine+1;
      }
     
      // Creation dynamique d'une liste de caractaires contenant les coordonnées des lettres de la phrase
      phraseCrypter = (char *)calloc(longueurChaine, sizeof(char));
     
      // Remplissage de la précédante liste en fonction des coordonnées
      for (i = 0; i < longueurChaine; i++)
      {
        z = i;
        for (x = 0; x < 6; x++)
        {
          for (y = 0; y < 6; y++)
          {
    	if (algoCryptage[x][y] == phraseDecrypter[i])
    	{
    	  while (phraseCrypter[z] != 0) // permet de vérifier qu'on ecrase pas une donnée deja mise
    	  {
    	    z++;
    	  }
    	  phraseCrypter[z] = algo[x];
    	  phraseCrypter[z+1] = algo[y];
    	}
          }
        }
      }
     
      // On parcours la phrase crypter à partir du dernier caractaire renseigné,le reste vaut forcecment 
      for (i = strlen(phraseDecrypter) * 2; i < longueurChaine; i++)
      {
        // On met X
        phraseCrypter[i] = algo[5];
      }
     
      // Création dynamique d'un tableau à 2 dimension qui va traiter les coordonnées avant permutation
      coordX = longueurCle;
      coordY = longueurChaine / longueurCle;
     
      tableauCryptage = (char **)calloc(coordX, sizeof(char));
      for (i = 0; i < coordX; i ++)
      {
        tableauCryptage[i] = (char *)calloc(coordY, sizeof(char));
      }
     
      z = 0;
      for (y = 0; y < coordY; y++)
      {
        for (x = 0; x < coordX; x++)
        {
          tableauCryptage[x][y] = phraseCrypter[z];  // C'est cette ligne qui me met erreur de segmentation
          z++;
        }
      }
    Lorsque je fait lon test avec une clé de permutation de longueur 4 ca marche, mais lorsque la longueur de la clé dépasse le nombre de ligne du tableau dynamique ... problème.

    Ce que j'essaye de faire :

    - ma chaine "attaque" devient FFDFDFFFGGVFVD Ok !
    - Avec la longueur de la clé de permutation saisie par l'utilisateur je fabrique un tableau dynamique de taille longueur de la clé Ok !
    - le nombre de ligne du tableau précèdent va correspondre à (la longueur de la phrase de l'utilisateur * 2) / longueur de la clé OK (cette valeur est forcément un entier car si % longueurCle != 0 j'incrémente d'1)
    - Test sur une clé de longueur 5 / 6 / 7 ... Non Ok !


    Voila, voila ... si quelqu'un a une petite idée ... je suis preneur ! S'il il manque des infos n'hésitez pas à me demander !!!


    Bonne journée !

    Agrakan

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Agrakan Voir le message
    Voila, voila ... si quelqu'un a une petite idée ... je suis preneur !
    Bonjour

    Je suis désolé - Ton code semble à priori correct (je l'ai lu et n'y ai vu aucunes incohérences). Donc s'il ne fonctionne pas, il te faut y mettre les mains. Examiner chaque étape, les variables avant et après pour voir si elles ont bien les bonnes valeurs.

    Accessoirement tu peux optimiser certaines instructions
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    char algo [] = "ADFGVX";
    char algoCryptage[6][] = {
    	"c1ofwj",
    	"ymt5b4",
    	"i7a28s",
    	"p30qhx",
    	"keul6d"
    	"vrgzn9",
    };
    Presque identique à ce que tu avais écrit mais tellement plus simple à écrire (et accessible de la même façon)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Hello,

    Deux choses (il y en a peut-être plus):

    1) ligne 21: il ne faut pas donner l'adresse de la chaine: scanf("%s", &phraseDecrypter); --> scanf("%s",phraseDecrypter);

    2) ligne 136: l'allocation est insuffisante: tableauCryptage = (char **)calloc(coordX, sizeof(char)); --> tableauCryptage = calloc(coordX, sizeof(char *)); : ceci devrait résoudre ton segfault....

    A+

    Edgar;
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  4. #4
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2015
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour !

    Merci Sve@r pour tes conseils ! Cependant j'avais déja fait de la détection d'erreur étape par étape jusqu'à trouver qu'il y avait un problème de place mais sans savoir pourquoi ...

    Merci également à toi Edgar ! C'est exactement ca l'erreur ! Du coup maintenant je n'ai plus de problème d'allocation !

    Pourrais-tu s'il te plait m'expliquer pourquoi mettre ce "*",histoire de faire une piqure de rappel ? (c'est bien un pointeur non ?)

    Je passe le sujet en résolu !

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par edgarjacobs Voir le message
    1) ligne 21: il ne faut pas donner l'adresse de la chaine: scanf("%s", &phraseDecrypter); --> scanf("%s",phraseDecrypter);
    C'est vrai - En plus je l'avais vue mais ensuite ça m'était sorti de la tête...

    Citation Envoyé par edgarjacobs Voir le message
    2) ligne 136: l'allocation est insuffisante: tableauCryptage = (char **)calloc(coordX, sizeof(char)); --> tableauCryptage = calloc(coordX, sizeof(char *)); : ceci devrait résoudre ton segfault....
    Argh, j'ai lu au-moins 15 fois cette ligne (et l'allocation de chaque item dans la boucle for des lignes 137 à 139) en me disant "il se peut qu'il y ait un soucis ici" et j'ai même pas vu ça !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2015
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    xD, no problem^^

    Du coup ca a l'air de fonctionner, j'en suis la permutation des colonnes et j'aurai enfin terminé la partie Cryptage !

  7. #7
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Citation Envoyé par Agrakan Voir le message
    Pourrais-tu s'il te plait m'expliquer pourquoi mettre ce "*",histoire de faire une piqure de rappel ? (c'est bien un pointeur non ?)
    Un char ** signifie que tu désires créer un tableau de tableau - dans ce cas-ci, de caractères. Il est donc nécessaire de créer d'abord un tableau de pointeurs, dont chaque entrée pointera vers un tableau de char. Et les pointeurs nécessitent (sur ma machine) 4 bytes, alors qu'un char n'en utilise qu'un seul. D'où le manque de place évident.... et le crash....

    @ sve@r:

    A+

    Edgar;
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Agrakan Voir le message
    Pourrais-tu s'il te plait m'expliquer pourquoi mettre ce "*",histoire de faire une piqure de rappel ? (c'est bien un pointeur non ?)
    Oui c'est bien un pointeur. Mais ce pointeur doit pointer sur un tableaux de pointeurs et non un tableau de caractères.
    Ensuite, chaque pointeur de ce tableau pointera, lui, vers un tableau de caractères.

    Nom : pointeurs.jpg
Affichages : 107
Taille : 80,2 Ko

    Donc tu dois bien allouer n "char *"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Insertion de 3 ligne à la fin d'un tableau dynamique
    Par sab_info dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 24/01/2013, 15h53
  2. [Conception] Insertion de champs d'un tableau dynamique dans une base de données
    Par loreleï85 dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 12/05/2011, 14h39
  3. Réponses: 1
    Dernier message: 23/06/2006, 11h19
  4. [Kylix] tableau dynamique
    Par sdoura2 dans le forum EDI
    Réponses: 1
    Dernier message: 31/10/2002, 08h57
  5. Réponses: 4
    Dernier message: 13/05/2002, 16h43

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