[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
[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
A voir également:
- [C]Affectation d'un tableau qui en change un autre.
- Tableau croisé dynamique - Guide
- Comment faire un tableau - Guide
- Tableau ascii - Guide
- Trier un tableau excel - Guide
- Comment imprimer un tableau excel sur une seule page - Guide
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
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,
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,
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
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.
Utilisateur anonyme
Modifié par le père. le 26/11/2015 à 10:03
Modifié par le père. le 26/11/2015 à 10:03
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.
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.
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
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.
[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
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,
Donc, tu devrais déclarer
Dal
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
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
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 ..
Le problème 'est que je modifie un tableau, et le deuxième change aussi alors que je n'y touche pas ..
[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
Modifié par [Dal] le 26/11/2015 à 11:10
non, si tu déclares
si tu écrits quelque chose sur tab[6], tu est en dehors de l'espace alloué.
Dal
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
[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
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
c'est certainement parce que tu débordes sur une zone mémoire contiguë allouée par ton programme à un autre tableau :-)
Dal
Utilisateur anonyme
Modifié par le père. le 26/11/2015 à 11:14
Modifié par le père. le 26/11/2015 à 11:14
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 ?
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 ?
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
26 nov. 2015 à 11:21
k il est initialisé à 0, c'est pour incrémenté mon tableau de lettres mal placées.
[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
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
dans un autre ordre d'idées,
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
Dal
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
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
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.
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.
[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
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
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
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
Modifié par Roninio02 le 25/11/2015 à 20:15
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.