Erreur - Appel de fonction

Résolu/Fermé
Mendoza - 29 mars 2014 à 15:46
 Mendoza - 20 avril 2014 à 21:39
Bonjour,

J'ai réaliser un code qui permet d'effectuer un tri bulle ainsi qu'un tri à insertion sur un ensemble de chiffre (10.000.000) afin de comparer lequel des tris est le plus rapide.
Seulement, j'ai plusieurs erreurs. Deux au niveau de l'appel des deux fonctions dans le main et deux au niveau de l'entête des deux fonctions.


#include <stdio.h>
#include <stdlib.h>
#define MIN 1
#define MAX 10000000
#define TRUE 1;
#define FALSE 0;

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=0;
int tmp=0;
int desordre=TRUE;

while (desordre) {
desordre=FALSE;
for (j=0;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 = 1; 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;
}
}


D'avance, merci.

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
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.
0
Merci pour la précision. J'ai effectué quelques modifs et le code compil :


#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.
0
Une idée ?
0
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
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,
0
Ça donne ceci :


#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 ?
0
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
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.
0
Ç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 :


#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;
}
}

0