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
Bonjour,

J'ai écrit un programme en langage C avec Dev-C++. Après compilation, il m'affiche le message
a.exe a cesse de fonctionner
. Je ne comprends pas pourquoi.

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
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
 <>▼ 
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
0
#include <stdio.h>
#include <string.h>

void main(){
    char var1[7] = "COLOR ", var2[2] ,v ,v1 = "0", v2, cmnd[8];
    for(v2 = "0"; v2 < "f"; v2) {
        v = strcat(v1, v2);
        strcpy(var2, v);
        strcpy(cmnd, strcat(var1, var2));
        system(cmnd);
        printf("\nBONJOUR\n");
        system("pause");
        v2++;
    }
}
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096 > amine
Modifié le 2 févr. 2022 à 15:21
Alors, comme ton code est court, un débogueur comme GDB n'est pas nécessaire.

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'.

#include <stdio.h>
#include <string.h>

int main(void) {
        char color_command[8] = "COLOR ";
        char color_code[3] = "0";
        char command[9];

        char val = 'f';

        *(color_code+1) = val;
        *(color_code+2) = '\0';
        strcpy(command, color_command);
        strcat(command, color_code);
        printf("La commande composée est :\n%s\n", command);

        return 0;
}


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
snprintf()
- 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.
0
Utilisateur anonyme
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.
0
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
Bonjour Amine,

- Ligne ????, le type de la fonction
main()
doit être
int
.
- Ligne ????, tu déclares des choses, en particulier
v2
est indiqué comme étant un
char
.
- même ligne tu veux initialiser le
char
v1
avec une chaine, ça n'a pas sens. Il ne faut pas confondre les chaines (suites de
char
terminés par un '\0') et les
char
.
- Ligne suivante, tu veux mettre dans le
char
v2
la 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.
0
[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
@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"
0
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
Bonjour,

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 de
    v1
    (7 caractères) +
    v2
    soit 8 caractères et donc ça déborde.
  • l5 :
    v1
    devrait en toute rigueur être un
    const char *
    , ce qui veut dire une chaîne non modifiable. Cela signifie que si tu veux concaténer
    v1
    et
    v2
    . Cela signifie qu'il faut créer un buffer suffisamment long (au moins 8 caractères à ce stade), dans lequel tu recopies
    v1
    puis auquel tu concatènes
    v2
    .
  • l5 :
    v1
    est une chaîne de caractère constante (donc
    const char *
    ) or tu déclares cette variable comme un
    char
    .
  • l8 : tu recopies une chaîne qui a priori fait la longueur de v (= la longueur de
    v1
    et
    v2
    ) 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 (voir
    man ascii
    ) et donc il n'y a pas que les caractères hexadécimaux, et donc utiliser un
    char
    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
0

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.
0
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
Change
printf
par
system
aux bons endroits ?
0