[C]Affectation d'un tableau qui en change un autre.

Fermé
Roninio02 Messages postés 63 Date d'inscription mardi 28 février 2012 Statut Membre Dernière intervention 3 mai 2016 - 25 nov. 2015 à 10:21
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 26 nov. 2015 à 12:01
Bonjour à tous,
Je suis actuellement en train d'essayer de coder un "Jeu du MOTUS". J'ai réuissit une bonne partie du programme, le seul soucis provient de deux de mes tableaux.
Pour expliquer simplement, j'ai fait une boucle pour inscrire dans un tableau les lettres qui sont mal placées. Cependant au moment où le programme entre dans cette boucle, dès qu'il écrit dans ce même tableau, il me modifie un second.

Par exemple le mot "VOITURE": Dans mon tableau de lettre bien placées, si j'ai "V-ITU--" et que je tape un mot qui contient un"R" ou un "E", quand je vais chercher les lettres mal placées, le tableau "V-ITU--" va devenir "V-ITU--RE".

Désolé si j'explique mal, mais c'est assez compliqué. Je vous remercie d'avance.


A voir également:

5 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
25 nov. 2015 à 15:21
Bonjour,

Sans code, point d'analyse possible.
Cependant, au vu de ce que je comprends, j'imagine que tu as utilisé des pointeurs et non des tableaux ?
N'hésite pas à poster ton code.
Note : pense à bien utilsier la balise <code> pour poster ton code. Exemple :
<code c>/*ici tu mets ton code*/</code>
Cdlt,
0
Roninio02 Messages postés 63 Date d'inscription mardi 28 février 2012 Statut Membre Dernière intervention 3 mai 2016 2
Modifié par Roninio02 le 25/11/2015 à 20:15
Merci de ta réponse.
Euh, non j'ai utilisé des tableaux que j'envoie dans mes fonctions. Je met le code de la fonction qui pose problème demain matin, parce que le programme fait 300 lignes.
0
Roninio02 Messages postés 63 Date d'inscription mardi 28 février 2012 Statut Membre Dernière intervention 3 mai 2016 2
Modifié par Roninio02 le 26/11/2015 à 09:48
/void m_place(char mot[],char stock2[], char stock1[], char temp2[])
{
    int i=0, j=0, k=0;

    for(i=0;i<6;i++)
        {
            stock2[i]=0;
        }

    for(i=0;i<6;i++)
    {
        for(j=0;j<6;j++)
        {
                if (temp2[j]==mot[i] && stock1[i]=='-' && temp2[j]!=stock2[k-1])
                {

                        stock2[k]=temp2[j];
                        k++;
                        buffer();
                }
        }
    }
    stock2[strlen(stock2)]='\0';
    printf("Le mot mystere contient les lettres suivantes: %s\n",stock2);
}/


Mes variables:
mot[]: Le mot à trouver.
temp2[]: Le mot entré par l'utilisateur.
stock1[]: Contient les lettres bien placées et '-' où il n'y pas de lettre bien placée.
stock2[]: Contient les lettres qui sont mal placées.

Le problème est que quand je met les lettres mal placées dans "stock2", ces mêmes lettres sont ajoutées à la suite de mon tableau "stock1".

https://pjjoint.malekal.com/files.php?id=20151126_q9u9k7o14h8

Merci.
0
Bonjour

Peut-on voir comment tes tableaux sont dimensionnés et initialisés ? Je soupçonne que tu n'as pas de zéro final dans stock1, et que stock2 vient immédiatement à suivre.

Tu devrais donner des noms parlants à tes variables, parce que 'temp' et 'stock', ça n'aide pas à comprendre à la lecture. Si tu trouves que motUtilisateur est trop long à taper, tu pourrais au moins mettre mut par exemple.
0
Roninio02 Messages postés 63 Date d'inscription mardi 28 février 2012 Statut Membre Dernière intervention 3 mai 2016 2
Modifié par Roninio02 le 26/11/2015 à 10:35
/   
    char nom1[15]={0};
    char nom2[15]={0};
    char place[6]={0};
    char mot[6]={0};
    char prop[6]={0};
    char stock1[6]={0};
    char stock2[6]={0};
    char temp2[6]={0};
/


En effet je pense que le problème vient de là, parce que avec les watches, je remarque que des tableau sont de type "char*" et d'autre de type "char[6]".
Peux tu m'éclairer pour comment bien les déclarer.
Merci.

EDIT: Je viens de faire quelques essais suite à ta remarque, j'ai reuissit a résoudre le problème sur cette fonction, mais il s'est reporté sur une autre chaine dans une autre fonction.
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié par [Dal] le 26/11/2015 à 10:48
Je ne comprend pas très bien ce qu'est sensé faire le code dans ta fonction, mais juste une observation au vu de ce que tu déclares.

Si tes mots font 6 lettres, en déclarant un tableau tel que, par exemple,
char mot[6];
tu n'as pas assez de place pour stocker une chaîne de 6 lettres en C, car il manque une place pour stocker le caractère de fin de chaîne
'\0'
.

Donc, tu devrais déclarer
char mot[7];
au moins, pour te permettre de terminer correctement tes chaînes, tout en restant sur l'espace mémoire affecté à cette chaîne.


Dal
0
Roninio02 Messages postés 63 Date d'inscription mardi 28 février 2012 Statut Membre Dernière intervention 3 mai 2016 2 > [Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024
Modifié par Roninio02 le 26/11/2015 à 10:58
Mais lorsqu'on déclare un tableau "tab[6]", normalement ça va de "0 à 6" non, sa fait donc 7. Donc 6 lettres plus '\0'.

Le problème 'est que je modifie un tableau, et le deuxième change aussi alors que je n'y touche pas ..
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié par [Dal] le 26/11/2015 à 11:10
non, si tu déclares
char tab[6];
, tu as 6 emplacements, indexés de 0 à 5 :

|    1   |    2   |    3   |    4   |    5   |    6   |
| tab[0] | tab[1] | tab[2] | tab[3] | tab[4] | tab[5] |

si tu écrits quelque chose sur tab[6], tu est en dehors de l'espace alloué.

Dal
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
26 nov. 2015 à 11:14
Le problème 'est que je modifie un tableau, et le deuxième change aussi alors que je n'y touche pas ..

c'est certainement parce que tu débordes sur une zone mémoire contiguë allouée par ton programme à un autre tableau :-)

Dal
0
Non, tab[6] n'a que 6 éléments, donc de 0 à 5.
Et si tu fais tes essais avec le mot "voiture", tu exploses tout puisque ça fait déjà 7 lettres, plus le zéro final il faudrait au moins tab[8]

As-tu corrigé le stock2[k-1] avec k initialisé à 0 ?
0
Roninio02 Messages postés 63 Date d'inscription mardi 28 février 2012 Statut Membre Dernière intervention 3 mai 2016 2
26 nov. 2015 à 11:21
k il est initialisé à 0, c'est pour incrémenté mon tableau de lettres mal placées.
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié par [Dal] le 26/11/2015 à 12:27
oui, mais quand k vaut 0, 0-1 cela fait -1 et le père a un sérieux doute que tu veuilles faire
stock2[-1]
;-)

dans un autre ordre d'idées,
stock2[strlen(stock2)]='\0';
m'ennuie, car je ne la comprends pas. Si la chaîne est déjà terminée, cette ligne placera
'\0'
au même endroit. Si elle n'est pas déjà terminée, strlen() trouvera le premier
'\0'
venu ... qui risque encore d'être à côté de la plaque.

Mais, comme tu initialises ton tableau à 0 systématiquement dans ta fonction, je pense que cette ligne est simplement inutile, car tout l'espace est mis à zéro au préalable, sous réserve que tu reste dans les limites de la mémoire allouée sans écraser le dernier '\0', bien sûr, et que tu mettes tout bien à zéro avec
for(i=0;i<7;i++)
au lieu de
for(i=0;i<6;i++)
.

Dal
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Roninio02 Messages postés 63 Date d'inscription mardi 28 février 2012 Statut Membre Dernière intervention 3 mai 2016 2
26 nov. 2015 à 11:40
Merci à tous, j'ai réussit à résoudre les quelques problèmes que j'avais.
J'ai un autre question, comment je pourrais faire pour donner du temps pour la saisie du mot? Par exemple si le mot n'est pas entré avant 10 secondes, il perd un essais.
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
26 nov. 2015 à 12:01
Cela dépend de la façon dont tu obtiens la saisie et de ce que tu veux faire.

Avec les fonctions du C standard, des fonctions telles que scanf vont bloquer l'exécution du programme tant que la saisie n'est pas validée (l'utilisateur presse "Entrée").

Tu peux utiliser les fonctions dans time.h pour calculer le différence de temps en secondes avec
difftime()
juste avant l'appel à scanf() et juste après.

http://www.cplusplus.com/reference/ctime/difftime/

Mais tu ne pourras pas interrompre l'attente de la saisie.

Avec des bibliothèques, tu peux faire autrement, mais cela va compliquer pas mal ton programme.

Note que, comme tu as désormais une autre question qui n'a rien à voir, c'est mieux de créer un autre sujet.

Dal
0