Erreur - Appel de fonction
Résolu/Fermé
A voir également:
- Erreur - Appel de fonction
- Erreur 0x80070643 - Accueil - Windows
- Fonction si et - Guide
- Appel inconnu - Guide
- Nommez une application d'appel vidéo ou de visioconférence - Guide
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
2 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
29 mars 2014 à 16:36
29 mars 2014 à 16:36
Bonjour,
#define TRUE 1;
#define FALSE 0;
Pas de ; après les define. Je n'ai pas lu plus bas que ces deux erreurs. Mais cela devrait déjà corriger plein d'erreurs.
#define TRUE 1;
#define FALSE 0;
Pas de ; après les define. Je n'ai pas lu plus bas que ces deux erreurs. Mais cela devrait déjà corriger plein d'erreurs.
Merci pour la précision. J'ai effectué quelques modifs et le code compil :
Seulement, j'ai une erreur à l'exécution : le programme a cessé de fonctionner.
#include <stdio.h>
#include <stdlib.h>
#define MIN 1
#define MAX 10000000
#define TRUE 1
#define FALSE 0
void triBulle(int tab[]);
void triInsertion(int tab[]);
void echanger(int tableau[], int a, int b);
void rapide(int tableau[], int debut, int fin);
int main(int argc, char **argv)
{
int tabBulle[MAX];
int tabInsert[MAX];
FILE* fichier=NULL;
FILE* fichier1=NULL;
FILE* fichier2=NULL;
fichier=fopen("casPire.txt", "w+");
fichier1=fopen("triBulle.txt", "w+");
fichier2=fopen("triInsertion.txt", "w+");
if(fichier != NULL && fichier1 != NULL && fichier2 != NULL)
{
printf("Succesfull");
int i;
for (i=MAX;i<MIN;i--)
{
fprintf(fichier, "%d ", i);
tabBulle[i]=i;
tabInsert[i]=i;
}
triBulle(tabBulle);
triInsertion(tabInsert);
for (i=MIN;i<MAX;i++)
{
fprintf(fichier1, "%d ", tabBulle[i]);
fprintf(fichier2, "%d ", tabInsert[i]);
}
fclose(fichier);
}
else
{
printf("Failed");
}
return 0;
}
void triBulle(int tab[])
{
int j;
int tmp=0;
int desordre=TRUE;
while (desordre) {
desordre=FALSE;
for (j=MIN;j<=MAX;j++) {
if(tab[j]>tab[j+1]) {
tmp=tab[j+1];
tab[j+1]=tab[j];
tab[j]=tmp;
desordre=TRUE;
}
}
}
}
void triInsertion(int tab[])
{
int i, j;
for (i=MIN;i<MAX;++i) {
int elem=tab[i];
for (j=i;j>0 && tab[j-1]>elem;j--)
tab[j]=tab[j-1];
tab[j]=elem;
}
}
Seulement, j'ai une erreur à l'exécution : le programme a cessé de fonctionner.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
30 mars 2014 à 13:25
30 mars 2014 à 13:25
Bonjour,
#define MIN 1
L'indice minimum est 0, pas 1.
if(fichier != NULL && fichier1 != NULL && fichier2 != NULL)
Attention, si tu fais comme ça et qu'une seul fichier renvoie NULL, tu ne feras pas le fclose()...
printf("Succesfull");
printf("Failed");
Mets un \n en fin ou alors fflush(stdout); pour forcer l'affichage.
for (i=MAX;i<MIN;i--)
i<MIN; c'est pas bon ça. Plutôt i>=MIN;
Attention i est de type int. Il ne peux donc pas contenir MAX qui est trop grand. Utilise plutôt long int.
fclose(fichier);
Et les autres ?
Dans triBulle()
for (j=MIN;j<=MAX;j++) {
j<MAX-1 plutôt sinon lorsque tu feras tab[j+1] il y aura débordement et probablement plantage.
Dans triInsertion()
for (i=MIN;i<MAX;++i) {
A revoir aussi.
Cdlt,
#define MIN 1
L'indice minimum est 0, pas 1.
if(fichier != NULL && fichier1 != NULL && fichier2 != NULL)
Attention, si tu fais comme ça et qu'une seul fichier renvoie NULL, tu ne feras pas le fclose()...
printf("Succesfull");
printf("Failed");
Mets un \n en fin ou alors fflush(stdout); pour forcer l'affichage.
for (i=MAX;i<MIN;i--)
i<MIN; c'est pas bon ça. Plutôt i>=MIN;
Attention i est de type int. Il ne peux donc pas contenir MAX qui est trop grand. Utilise plutôt long int.
fclose(fichier);
Et les autres ?
Dans triBulle()
for (j=MIN;j<=MAX;j++) {
j<MAX-1 plutôt sinon lorsque tu feras tab[j+1] il y aura débordement et probablement plantage.
Dans triInsertion()
for (i=MIN;i<MAX;++i) {
A revoir aussi.
Cdlt,
Ça donne ceci :
J'ai mis des long int à tout les compteurs (i et j).
J'ai changé le i du deuxième for dans le main par un j.
J'ai changé les %d par des %lu.
J'ai fais les 3 closes.
Avec tout ça, j'ai une erreur au niveau du fprintf sur les fichiers 2 et 3 :
"Test.c:38:4: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'int' [-Wformat=]"
Mon j est bien déclaré comme étant un long int pourtant, je ne comprend pas.
Concernant le premier if du main, si je veux exécuter le code seulement si mes 3 fichiers ont bien été crée, c'est bien avec des "et" que je vais le faire, non ?
Autre chose, est-ce que les tableaux doivent aussi passé en long int ?
#include <stdio.h>
#include <stdlib.h>
#define MIN 0
#define MAX 10000000
#define TRUE 1
#define FALSE 0
void triBulle(int tab[]);
void triInsertion(int tab[]);
void echanger(int tableau[], int a, int b);
void rapide(int tableau[], int debut, int fin);
int main(int argc, char **argv)
{
int tabBulle[MAX];
int tabInsert[MAX];
FILE* fichier1=NULL;
FILE* fichier2=NULL;
FILE* fichier3=NULL;
fichier1=fopen("casPire.txt", "w+");
fichier2=fopen("triBulle.txt", "w+");
fichier3=fopen("triInsertion.txt", "w+");
if(fichier1 != NULL && fichier2 != NULL && fichier3 != NULL)
{
printf("Succesfull\n");
long int i;
for (i=MAX;i>=MIN;i--)
{
fprintf(fichier1, "%lu ", i);
tabBulle[i]=i;
tabInsert[i]=i;
}
triBulle(tabBulle);
triInsertion(tabInsert);
long int j;
for (j=MIN;j<=MAX-1;j++)
{
fprintf(fichier2, "%lu ", tabBulle[j]);
fprintf(fichier3, "%lu ", tabInsert[j]);
}
fclose(fichier1);
fclose(fichier2);
fclose(fichier3);
}
else
{
printf("Failed\n");
}
return 0;
}
void triBulle(int tab[])
{
long int j;
int tmp=0;
int desordre=TRUE;
while (desordre) {
desordre=FALSE;
for (j=MIN;j<=MAX-1;j++) {
if(tab[j]>tab[j+1]) {
tmp=tab[j+1];
tab[j+1]=tab[j];
tab[j]=tmp;
desordre=TRUE;
}
}
}
}
void triInsertion(int tab[])
{
long int i, j;
for (i=MIN;i<=MAX-1;++i) {
int elem=tab[i];
for (j=i;j>0 && tab[j-1]>elem;j--)
tab[j]=tab[j-1];
tab[j]=elem;
}
}
J'ai mis des long int à tout les compteurs (i et j).
J'ai changé le i du deuxième for dans le main par un j.
J'ai changé les %d par des %lu.
J'ai fais les 3 closes.
Avec tout ça, j'ai une erreur au niveau du fprintf sur les fichiers 2 et 3 :
"Test.c:38:4: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'int' [-Wformat=]"
Mon j est bien déclaré comme étant un long int pourtant, je ne comprend pas.
Concernant le premier if du main, si je veux exécuter le code seulement si mes 3 fichiers ont bien été crée, c'est bien avec des "et" que je vais le faire, non ?
Autre chose, est-ce que les tableaux doivent aussi passé en long int ?
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
30 mars 2014 à 15:47
30 mars 2014 à 15:47
for (i=MAX;i>=MIN;i--)
Le dernier élément d'un tableau est MAX-1, donc il faut commencer à i=MAX-1;
Dans les printf, ce n'est pas %lu qu'il faut mettre quand tu affiches i mais %ld
fprintf(fichier2, "%lu ", tabBulle[j]);
tabBulle[j] est de type int et tu mets %lu. Il faut laisser %d.
C'est ce qu'indique le warning.
Dans triBulle et triInsertion (pas dans le main())
for (j=MIN;j<=MAX-1;j++)
Je n'ai pas dit de mettre j<=MAX-1 mais j<MAX-1.
Mon j est bien déclaré comme étant un long int pourtant, je ne comprend pas.
Si tu affiches un long, c'est %ld qu'il faut mettre. Mais si tu affiches un int, il faut laisser %d (c'est le cas ici puisqu'il est question de l'affichage d'un élément du tableau et pas de j).
Concernant le premier if du main, si je veux exécuter le code seulement si mes 3 fichiers ont bien été crée, c'est bien avec des "et" que je vais le faire, non ?
Oui. Mais ce que j'ai dit, c'est que la gestion des erreurs n'est pas correcte. Tu ne fais pas un fclose() dans tous les cas.
Le dernier élément d'un tableau est MAX-1, donc il faut commencer à i=MAX-1;
Dans les printf, ce n'est pas %lu qu'il faut mettre quand tu affiches i mais %ld
fprintf(fichier2, "%lu ", tabBulle[j]);
tabBulle[j] est de type int et tu mets %lu. Il faut laisser %d.
C'est ce qu'indique le warning.
Dans triBulle et triInsertion (pas dans le main())
for (j=MIN;j<=MAX-1;j++)
Je n'ai pas dit de mettre j<=MAX-1 mais j<MAX-1.
Mon j est bien déclaré comme étant un long int pourtant, je ne comprend pas.
Si tu affiches un long, c'est %ld qu'il faut mettre. Mais si tu affiches un int, il faut laisser %d (c'est le cas ici puisqu'il est question de l'affichage d'un élément du tableau et pas de j).
Concernant le premier if du main, si je veux exécuter le code seulement si mes 3 fichiers ont bien été crée, c'est bien avec des "et" que je vais le faire, non ?
Oui. Mais ce que j'ai dit, c'est que la gestion des erreurs n'est pas correcte. Tu ne fais pas un fclose() dans tous les cas.
Ça compile mais j'ai toujours l'erreur "le programme a cessé de fonctionner".
Je remets le code, si jamais j'aurai mal retranscris quelques choses :
Je remets le code, si jamais j'aurai mal retranscris quelques choses :
#include <stdio.h>
#include <stdlib.h>
#define MIN 0
#define MAX 10000000
#define TRUE 1
#define FALSE 0
void triBulle(int tab[]);
void triInsertion(int tab[]);
void echanger(int tableau[], int a, int b);
void rapide(int tableau[], int debut, int fin);
int main(int argc, char **argv)
{
int tabBulle[MAX];
int tabInsert[MAX];
FILE* fichier1=NULL;
FILE* fichier2=NULL;
FILE* fichier3=NULL;
fichier1=fopen("casPire.txt", "w+");
fichier2=fopen("triBulle.txt", "w+");
fichier3=fopen("triInsertion.txt", "w+");
if(fichier1 != NULL && fichier2 != NULL && fichier3 != NULL)
{
printf("Succesfull\n");
long unsigned int i;
for (i=MAX-1;i>=MIN;i--)
{
fprintf(fichier1, "%ld ", i);
tabBulle[i]=i;
tabInsert[i]=i;
}
triBulle(tabBulle);
triInsertion(tabInsert);
long unsigned int j;
for (j=MIN;j<=MAX-1;j++)
{
fprintf(fichier2, "%d", tabBulle[j]);
fprintf(fichier3, "%d", tabInsert[j]);
}
fclose(fichier1);
fclose(fichier2);
fclose(fichier3);
}
else
{
printf("Failed\n");
}
return 0;
}
void triBulle(int tab[])
{
long unsigned int j;
int tmp=0;
int desordre=TRUE;
while (desordre) {
desordre=FALSE;
for (j=MIN;j<MAX-1;j++) {
if(tab[j]>tab[j+1]) {
tmp=tab[j+1];
tab[j+1]=tab[j];
tab[j]=tmp;
desordre=TRUE;
}
}
}
}
void triInsertion(int tab[])
{
long unsigned int i, j;
for (i=MIN;i<MAX-1;++i) {
int elem=tab[i];
for (j=i;j>0 && tab[j-1]>elem;j--)
tab[j]=tab[j-1];
tab[j]=elem;
}
}