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 Anonyme . Évalué à 3.
Sans comprendre le probleme en lui meme, ton code me semble bizarre lui aussi:
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.
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 Matthieu M. (site web personnel) . Évalué à 1.
Voilà.
git commit suicide
[^] # Re: Juste une petite remarque
Posté par NeoX . Évalué à 1.
qu'il serait plus logique d'ecrire
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 Anonyme . Évalué à 2.
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 NeoX . Évalué à 1.
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 alf . Évalué à 2.
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 :
.
(*) 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.