Forum Programmation.c creation d'une matrice de sous mot

Posté par  .
Étiquettes : aucune
0
21
déc.
2006
bonjour,
je veux creer une matrice d'entiers avec les positions de chaque alphabet dans un mot donné.

En effet, ma matrice prend en ligne la taille de l'alphabet du mot et en colonne la taille du mot+1
et on crée un tableau position qui prend en argument le mot et chaque alphabet et renvoi ses positions dans ce mot.
Pour remplir la matrice il faut à chaque fois comparer la position de la lettre avec l'indice de la ligne et si c'est supérieur on le met a la case qui correspond.

Voici mon code, ma fonction ne me rempli pas la matrice bien comme il faut et j'ai essayé ça à la main et ça marche mais je vois pas l'erreur.
Merci pour votre aide

Matrice* CreerMatrice(char* mot,char* alphabet)
{
int i;
int j=0;
int k=0;

int* pos=(int*)malloc(sizeof(int));//allouer la memoire pour le tableau position//

Matrice* M=AllouerMatrice(strlen(mot)+1,1);//allouer la memoire pour la matrice//

//parcours pour remplir la matrice//
for(i=0;i<strlen(alphabet)+1;i++)
{

pos=position(mot,alphabet[i]);//recuperation du tableau position//

while(j<strlen(mot)+1)
{
if(pos[k]>j)
{
M->tab[i][j]=pos[k];
j++;
}

else
{
k++;

}

}
for(i=0;i<strlen(alphabet)+1;i++)
for(i=0;i<strlen(mot)+1;i++)
if(M->tab[i][j]==0)
M->tab[i][j]=strlen(mot)+1;

return M;
}
  • # rien compris

    Posté par  . Évalué à 3.

    c'est peut etre parce que je n'ai pas pris de petit dejeuner ce matin, mais ta description du probleme ne me semble pas tres claire

    Sans comprendre le probleme en lui meme, ton code me semble bizarre lui aussi:

    int* pos=(int*)malloc(sizeof(int));//allouer la memoire pour le tableau position//

    tu reserves la taille d'un entier (taille variable en fonction de l'architecture sur laquelle tu compiles ton code) en memoire sur laquelle tu fais pointer ton pointeur pos. Tu ne pourras donc stocker qu'un seul entier a cet emplacement. Je doute que ce soit ce que tu souhaites faire a l'origine (utiliser un tableau, donc priori un serie d'entiers).
    En C les commentaires sont soient entre /* et */, soient sur une seule ligne precedes de //
    Le // a la fin de ton commentaire est inutile.


    for(i=0;i<strlen(alphabet)+1;i++)
    while(j<strlen(mot)+1)
    for(i=0;i<strlen(alphabet)+1;i++)
    for(i=0;i<strlen(mot)+1;i++)

    Dans tes boucles, tu t'obstines a utiliser comme condition strlen(s)+1 , ce qui signifie que tu vas appliquer le contenu de ta boucle sur toute la longueur de ta chaine [strlen(s)] ET sur l'octet NULL terminant ta chaine [+1]... je doute de l'utilite d'un tel comportement.

    enfin, ne sachant pas ce que font les fonctions AllouerMatrice et position, il va etre difficile de savoir ce que fait ton morceau de code

    Essaies d'etre plus clair dans l'expose de ton probleme et fourni la totalite du code que tu souhaites verifier
  • # Juste une petite remarque

    Posté par  (site web personnel) . Évalué à 1.

    Magnifique double boucle for (i=0; ... for (i=0; ... qui ne doit pas arranger les choses.

    Voilà.

    git commit suicide

    • [^] # Re: Juste une petite remarque

      Posté par  . Évalué à 1.

      sans compter les
      i < strlen(xxxx) +1

      qu'il serait plus logique d'ecrire
      i < = strlen(xxxx)


      car tu as ecrit, pour eviter d'oublier le dernier caractere
      Tantque i n'est pas (l'avant denier + 1)

      alors que ton algorythme, serait
      Tantque i n'atteint pas la longueur du xxx
      • [^] # Re: Juste une petite remarque

        Posté par  . Évalué à 2.

        faux: tu ecris deux fois la meme chose
        pour strlen(x)=3,
        i<strlen(x)+1 (soit i<4) appliquera la boucle pour i={0,1,2,3}
        i<=strlen(x) (soit i<=3) appliquera la boucle pour i={0,1,2,3}

        le +1 ne permet pas "d'eviter d'oublier le dernier caractere" mais prend en compte l'octet NULL de terminaison de la chaine, ce qui semble etre une erreur.
        • [^] # Re: Juste une petite remarque

          Posté par  . Évalué à 1.

          je suis d'accord avec toi que cela correspond à la meme chose
          car dans les 2 cas i={0,1,2,3}

          simplement je trouvais qu'il etait plus lisible et logique de faire
          (i=0; i<=strlen(xxx);i++)
          que
          (i=0; i< strlen(xxx)+1 ; i++)
  • # Malloc

    Posté par  . Évalué à 2.

    1)
    int* pos=(int*)malloc(sizeof(int)); /*allouer la memoire pour le tableau position */
    Matrice* M=AllouerMatrice(strlen(mot)+1,1); / *allouer la memoire pour la matrice */

    Caster la valeur de retour de *alloc est inutile en C (bien qu'obligatoire en C++, mais c'est un autre langage). Le cast peut même cacher une erreur : en l'absence d'inclusion de l'en-tête stdlib.h, le prototype de malloc n'est pas "connu" au moment où tu appelles cette fonction. En mode C90, le compilateur supposera alors qu'elle renvoie le type int. Sur certaines archi, les conséquences sont nulles, mais il existe des achi sur lesquelles le code se comportera de manière erratique. Si, par exemple, des registres différents sont utilisés pour les entiers et les pointeurs, alors malloc renverra sa valeur de retour dans un registre "pointeur", et le code appelant ira chercher la valeur dans un registre "entier". D'où incohérence, et comportement indéfini garanti.

    Si tu affectais le retour de malloc dans une variable de type pointeur sur quelque chose, alors le compilateur devrait te renvoyer une erreur (*). Si tu castes la valeur avant l'affectation, comme tu le fais, alors le compilateur ne dit plus rien, car il suppose que tu sais ce que tu fais.

    Note qu'en mode C99, la règle du int implicite quand une fonction sans prototype visible est appelée n'existe plus, c'est directement une erreur (comportement indéfini, je crois, mais bref), et donc la question ne se pose plus.

    2)
    Si malloc n'arrive pas à allouer de la mémoire, elle renvoie un pointeur nul. Il faut donc faire un test :

    if (pos == NULL)
    {
        /* En cas d'erreur */
    }
    else
    {
        /* Le comportement "normal" */
    }

    .

    (*) En passant, le message d'erreur de gcc dans cette situation est très peu explicite pour celui qui ne connaît pas les détails du C...

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.