A.exe a cesse de fonctionner
Fermé
amine
-
Modifié le 2 févr. 2022 à 14:13
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 9 févr. 2022 à 11:37
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 9 févr. 2022 à 11:37
A voir également:
- A.exe a cesse de fonctionner
- Comment faire fonctionner chromecast - Guide
- Tvapi service a cessé de fonctionner - Forum TV & Vidéo
- Durée de fonctionnement processeur ✓ - Forum Windows 10
- Léo navigue sur le web en utilisant sa box. soudain, la connexion cesse de fonctionner. il redémarre son ordinateur, mais cela ne change rien. quel conseil pouvez-vous donner à léo ? ✓ - Forum Webmastering
- Le jeu a cessé de fonctionner minecraft exit code 1 - Forum Minecraft
5 réponses
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
Modifié le 1 févr. 2022 à 22:00
Modifié le 1 févr. 2022 à 22:00
Bonjour,
Le problème doit être dans le code écrit :-)
Tu peux poster ton code pour qu'on t'aide à trouver l'origine du problème (pour le poster sur le forum clique sur
Autrement Dev-C++ doit contenir un débogueur basé sur GDB. C'est le cas en tout cas de la version gérée par Embarcadero : https://www.embarcadero.com/fr/free-tools/dev-cpp et je pense aussi des versions Bloodshed et Orwell.
En compilant ton projet avec les informations de débogage (option -g de GCC), tu pourras tenter de trouver l'origine de ton problème à partir de l'endroit signalé par le débogueur, en arrêtant l'exécution du code avant le plantage en créant des points d'arrêt, en exécutant pas à pas ton code, en inspectant le code fautif et le contenu des variables, etc. Bref en déboguant.
Dal
Le problème doit être dans le code écrit :-)
Tu peux poster ton code pour qu'on t'aide à trouver l'origine du problème (pour le poster sur le forum clique sur
<>▼sur le triangle pointant vers le bas et choisit le langage c, puis copie colle ton code entre les balises de code c).
Autrement Dev-C++ doit contenir un débogueur basé sur GDB. C'est le cas en tout cas de la version gérée par Embarcadero : https://www.embarcadero.com/fr/free-tools/dev-cpp et je pense aussi des versions Bloodshed et Orwell.
En compilant ton projet avec les informations de débogage (option -g de GCC), tu pourras tenter de trouver l'origine de ton problème à partir de l'endroit signalé par le débogueur, en arrêtant l'exécution du code avant le plantage en créant des points d'arrêt, en exécutant pas à pas ton code, en inspectant le code fautif et le contenu des variables, etc. Bref en déboguant.
Dal
Utilisateur anonyme
1 févr. 2022 à 22:02
1 févr. 2022 à 22:02
« Bonjour », « merci » ou « s'il vous plait » sont essentiels à toute demande car ces mots marquent la politesse élémentaire et montrent le respect que tout demandeur devrait avoir envers les bénévoles qui animent ce forum.
D’autre part, dans ma boule de cristal, je crois voir qu’il manque une pinte à la ligne 1064. On peut consulter un marabout.
Ou alors tu postes ton code en utilisant la coloration syntaxique (voir ici https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code )
Merci donc de reformuler correctement ta question.
D’autre part, dans ma boule de cristal, je crois voir qu’il manque une pinte à la ligne 1064. On peut consulter un marabout.
Ou alors tu postes ton code en utilisant la coloration syntaxique (voir ici https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code )
Merci donc de reformuler correctement ta question.
Dalfab
Messages postés
706
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
2 novembre 2023
101
2 févr. 2022 à 14:23
2 févr. 2022 à 14:23
Bonjour Amine,
- Ligne ????, le type de la fonction
- Ligne ????, tu déclares des choses, en particulier
- même ligne tu veux initialiser le
- Ligne suivante, tu veux mettre dans le
- Sur la même ligne, tu fais un test d'inégalité entre une chaine et le
- Toujours sur la même ligne, dans la zone d'incrémentation tu écris
Je n'ai pas lu au-delà.
Maintenant ce que j'ai écris, ton compilateur a dû aussi te l'indiquer. Tu utilises dev-C++ mais ne précises pas le compilateur utilisé. Il faut correctement configurer tes options de compilation pour faire apparaître tous les avertissements de compilation et il faut lire le résultat de la compilation. Sur une demande polie, tu devrais pouvoir avoir une aide plus précise sur cela.
- Ligne ????, le type de la fonction
main()doit être
int.
- Ligne ????, tu déclares des choses, en particulier
v2est indiqué comme étant un
char.
- même ligne tu veux initialiser le
char
v1avec une chaine, ça n'a pas sens. Il ne faut pas confondre les chaines (suites de
charterminés par un '\0') et les
char.
- Ligne suivante, tu veux mettre dans le
char
v2la chaine "0" ça n'a pas de sens.
- Sur la même ligne, tu fais un test d'inégalité entre une chaine et le
char
v2, ça n'a pas de sens.
- Toujours sur la même ligne, dans la zone d'incrémentation tu écris
v2, ça n'a pas plus de sens.
Je n'ai pas lu au-delà.
Maintenant ce que j'ai écris, ton compilateur a dû aussi te l'indiquer. Tu utilises dev-C++ mais ne précises pas le compilateur utilisé. Il faut correctement configurer tes options de compilation pour faire apparaître tous les avertissements de compilation et il faut lire le résultat de la compilation. Sur une demande polie, tu devrais pouvoir avoir une aide plus précise sur cela.
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
2 févr. 2022 à 14:35
2 févr. 2022 à 14:35
@Dalfab:
Tu utilises dev-C++ mais ne précises pas le compilateur utilisé.
Je pense que Dev-C++ ne supporte que GCC
http://www.bloodshed.net/FAQ
"Dev-C++ uses GCC, the GNU Compiler Collection"
Tu utilises dev-C++ mais ne précises pas le compilateur utilisé.
Je pense que Dev-C++ ne supporte que GCC
http://www.bloodshed.net/FAQ
"Dev-C++ uses GCC, the GNU Compiler Collection"
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
Modifié le 2 févr. 2022 à 14:45
Modifié le 2 févr. 2022 à 14:45
Bonjour,
Ce qui ne va pas dans ton programme
Comme l'explique le manuel de la fonction
Il en va d'ailleurs de même pour
Ce n'est pas le cas ici, ce qui provoque une erreur de segmentation et fait planter le programme.
La plupart de ces erreurs serait évitées si tu tenais compte des messages de ton compilateur. Voici à titre indicatif toutes les erreurs remontées par gcc 11.2.0.
En C plus que dans tout autre langage, il faut être vigilant aux types et à la mémoire, sinon tu as vite fait d'écrire quelque chose qui n'a aucun sens.
Merci par ailleurs quand tu joins un bout de code de dire quel est ton objectif.
Correction naïve
Si on corrige ton programme sans changer les variables et sans se demander si c'est bien ce que tu veux faire, voilà à quoi ça pourrait ressembler :
Correction approfondie
Le programme précédent a plusieurs défaut.
Une fois corrigé le programme devient :
Bonne chance
Ce qui ne va pas dans ton programme
Comme l'explique le manuel de la fonction
strcat, la fonction strcat() ajoute la chaîne src à la fin de la chaîne dest en écrasant le caractère nul (« \0 ») à la fin de dest, puis en ajoutant un nouveau caractère nul final. Les chaînes ne doivent pas se chevaucher, et la chaîne dest doit être assez grande pour accueillir le résultat..
Il en va d'ailleurs de même pour
strcpy.
Ce n'est pas le cas ici, ce qui provoque une erreur de segmentation et fait planter le programme.
- l7 :
v1
fait 7 caractères. Or tu stockes dans la longueur dev1
(7 caractères) +v2
soit 8 caractères et donc ça déborde. - l5 :
v1
devrait en toute rigueur être unconst char *
, ce qui veut dire une chaîne non modifiable. Cela signifie que si tu veux concaténerv1
etv2
. Cela signifie qu'il faut créer un buffer suffisamment long (au moins 8 caractères à ce stade), dans lequel tu recopiesv1
puis auquel tu concatènesv2
. - l5 :
v1
est une chaîne de caractère constante (doncconst char *
) or tu déclares cette variable comme unchar
. - l8 : tu recopies une chaîne qui a priori fait la longueur de v (= la longueur de
v1
etv2
) dans var2, qui ne fait que 2 caractères ! - l9 : même erreur
- l12 : cet appel rend ton programme spécifique à Windows. C'est un peu dommage et inutile si ton programme est lancé depuis un terminal (e.g. celui de dev cpp).
- l13 : cette ligne pourrait être incorporé dans le 3e membre de la boucle
for
.
La plupart de ces erreurs serait évitées si tu tenais compte des messages de ton compilateur. Voici à titre indicatif toutes les erreurs remontées par gcc 11.2.0.
(mando@silk) (~) $ gcc toto.c
toto.c: In function ‘main’:
toto.c:5:47: warning: initialization of ‘char’ from ‘char *’ makes integer from pointer without a cast [-Wint-conversion]
5 | char var1[7] = "COLOR ", var2[2] ,v ,v1 = "0", v2, cmnd[8];
| ^~~
toto.c:6:12: warning: assignment to ‘char’ from ‘char *’ makes integer from pointer without a cast [-Wint-conversion]
6 | for(v2 = "0"; v2 < "f"; v2) {
| ^
toto.c:6:22: warning: comparison between pointer and integer
6 | for(v2 = "0"; v2 < "f"; v2) {
| ^
toto.c:7:20: warning: passing argument 1 of ‘strcat’ makes pointer from integer without a cast [-Wint-conversion]
7 | v = strcat(v1, v2);
| ^~
| |
| char
In file included from toto.c:2:
/usr/include/string.h:133:39: note: expected ‘char * restrict’ but argument is of type ‘char’
133 | extern char *strcat (char *__restrict __dest, const char *__restrict __src)
| ~~~~~~~~~~~~~~~~~^~~~~~
toto.c:7:24: warning: passing argument 2 of ‘strcat’ makes pointer from integer without a cast [-Wint-conversion]
7 | v = strcat(v1, v2);
| ^~
| |
| char
In file included from toto.c:2:
/usr/include/string.h:133:70: note: expected ‘const char * restrict’ but argument is of type ‘char’
133 | extern char *strcat (char *__restrict __dest, const char *__restrict __src)
| ~~~~~~~~~~~~~~~~~~~~~~~^~~~~
toto.c:7:11: warning: assignment to ‘char’ from ‘char *’ makes integer from pointer without a cast [-Wint-conversion]
7 | v = strcat(v1, v2);
| ^
toto.c:8:22: warning: passing argument 2 of ‘strcpy’ makes pointer from integer without a cast [-Wint-conversion]
8 | strcpy(var2, v);
| ^
| |
| char
In file included from toto.c:2:
/usr/include/string.h:125:70: note: expected ‘const char * restrict’ but argument is of type ‘char’
125 | extern char *strcpy (char *__restrict __dest, const char *__restrict __src)
| ~~~~~~~~~~~~~~~~~~~~~~~^~~~~
toto.c:10:9: warning: implicit declaration of function ‘system’ [-Wimplicit-function-declaration]
10 | system(cmnd);
|
En C plus que dans tout autre langage, il faut être vigilant aux types et à la mémoire, sinon tu as vite fait d'écrire quelque chose qui n'a aucun sens.
Merci par ailleurs quand tu joins un bout de code de dire quel est ton objectif.
Correction naïve
Si on corrige ton programme sans changer les variables et sans se demander si c'est bien ce que tu veux faire, voilà à quoi ça pourrait ressembler :
#include <stdio.h> int main(){ const char * var1 = "COLOR"; const char v1 = '0'; char cmnd[255]; for (char c = '0'; c <= 'f'; c++) { snprintf(cmnd, sizeof(cmnd), "%s %c%c", var1, v1, c); printf("%s", cmnd); printf("\nBONJOUR\n"); } return 0; }
Correction approfondie
Le programme précédent a plusieurs défaut.
- La boucle
for
énumère les caractères selon la table ASCII (voirman ascii
) et donc il n'y a pas que les caractères hexadécimaux, et donc utiliser unchar
est inadéquat. - Beaucoup de variables sont inutiles, et surchargent inutilement le programme (
var1
,v1
).
Une fois corrigé le programme devient :
#include <stdio.h> int main(){ char buffer[255]; for (unsigned i = 0; i < 16; i++) { snprintf(buffer, sizeof(buffer), "COLOR 0%x", i); printf("%s", buffer); printf("\nBONJOUR\n"); } return 0; }
Bonne chance
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Merci pour tout ce que vous avez écrit, mais ce code ne me donne la sortie de programme que je souhaite : je veux que le programme change la couleur de son background tous seul couleur les uns après les autre en utilisant la commande
system(color). Merci.
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
Modifié le 9 févr. 2022 à 11:38
Modifié le 9 févr. 2022 à 11:38
Change
printfpar
systemaux bons endroits ?
Modifié le 2 févr. 2022 à 14:16
Modifié le 2 févr. 2022 à 15:21
Ton plantage est dû à une corruption de la mémoire, car tu n'utilises pas les types de variables adéquates, ni un espace suffisant de stockage.
Tu devrais déclarer une seule variable par ligne, cela te permettra d'y voir plus clair.
Tu confonds un type char, qui permet de stocker un seul char, et un type tableau de char (ou pointeur sur char) qui permet de stocker à l'emplacement mémoire réservé une suite de char terminée par un caractère terminateur '\0' qui signifie la fin de chaîne et tu confonds aussi la notation "chose" (avec des guillemets) qui permet de représenter une chaîne de caractères (nécessitant un espace mémoire d'au moins 6 bytes) et 'c' (avec des apostrophes) qui permet de représenter un seul char.
Si la commande que tu veux envoyer à system() est une chaîne du type "COLOR 0F" tu as besoin d'un tableau de 9 char au minimum, et non 8.
Par ailleurs, ton code est compliqué et peu compréhensible en raison de tes variables dont les noms sont peu explicites.
Voilà un exemple de ce qui pourrait être fait plus simplement, avec des noms plus explicites , des tableaux correctement dimensionnés et un usage approprié des guillemets ou des apostrophes, selon qu'on se réfère à une chaîne ou à un (seul) char, illustrant comment composer "COLOR 0f" à partir d'une chaîne où on stocke la commande "COLOR ", d'une chaîne où on stocke le code couleur commençant par "0", et d'un char 'f'.
Ce code compile et s'exécute sans erreurs ni warnings et devrait t'aider à comprendre ce qui ne va pas dans ta façon de faire :-)
les lignes 11 et 12 permettent de composer le code couleur en plaçant la valeur 'f' à la suite du premier char de la chaîne et en terminant la chaîne sur le char suivant.
P.S. : la façon de faire de mamiemando est meilleure (elle utilise - cf son intervention). J'ai présenté l'exemple ci-dessus parce qu'il ressemble un peu plus à la façon dont tu voulais le faire.