Segmentation fault Linux [Fermé]

Signaler
-
blurk
Messages postés
488
Date d'inscription
vendredi 16 avril 2004
Statut
Membre
Dernière intervention
15 mars 2009
-
Bonjour,
J'ai compilé un petit programme "debug.pc" de test sous linux et j'ai eu une erreur de Segmentation fault a l execution ( pas d erreurs a la compile ).
Ce meme programme s execute sous HPUX sans problemes.
Remarque :
Lorsque je declare les deux structures st_test1 et st_test2 ===> Il y a segmentation fault. Par contre si je ne declare que une d entre elles ou diminue la taille de TAB1,TAB2 ou TAB3 le programme s execute normalement.

Merci de votre aide.

Voilà le contenu du programme :


#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>

EXEC SQL INCLUDE SQLCA;

main(argc,argv)
int argc;
char *argv[];
{
#define AFFICHAGE 100
#define TAB1 1000
#define TAB2 60000
#define TAB3 50000

/* Table test1 */

typedef struct st_test1 { /* Si cette declaration est en commentaire, le programme marche */
double taille;
char rec_1[6];
};
struct st_test1 tab_test1[TAB3];

/* Table test2 */
typedef struct st_test2 {
char vp[2];
char car[3];
char marque[4];
char modele[11];
char energie[2];
};
struct st_test2 tab_test2[TAB2];

printf("\n");
printf("################################\n");
printf("### ###\n");
printf("### PROG DEBUG ###\n");
printf("### ###\n");
printf("################################\n");
printf("\n");
exit(0);

} /* Fin de la fonction main */

3 réponses

Salut!

EXEC SQL INCLUDE SQLCA; 


me parait douteux et pas standard. Macro non définie?

main(argc,argv) 


aucun type pour la fonction main et l'utilisaiton de 2 arguments non déclarés (type) avant leur utilisation

#define AFFICHAGE 100
#define TAB1 1000
#define TAB2 60000
#define TAB3 50000 


on a pour habitude de déclarer les macro en début de code (c'est plus jolie) mais dans ton code ça n'apporte pas plus de clarté de déclarer ces macros

/* Table test1 */

typedef struct st_test1 { /* Si cette declaration est en commentaire, le programme marche */
double taille;
char rec_1[6];
};
struct st_test1 tab_test1[TAB3]; 


pourquoi faire un typedef ici qui ne sert à rien?

/* Table test2 */
typedef struct st_test2 {
char vp[2];
char car[3];
char marque[4];
char modele[11];
char energie[2];
};
struct st_test2 tab_test2[TAB2]; 


idem

A mon avis le compilo a du trouver une mauvaise définition du type par typedef

normalement ça devrait ressembler à un ça

typedef ancientype nouveautype;


permet moi de remodeler ton code d'un façon plus clair à mes yeux

#include <stdlib.h>
#include <stdio.h>

typedef
	struct
	{
		double taille;
		char rec_1[6];
	}
	st_test1;

typedef
	struct
	{
		char vp[2];
		char car[3];
		char marque[4];
		char modele[11];
		char energie[2];
	}
	st_test2;

int main(int argc, char *argv[])
{
	st_test1 tab_test1[50000];
	st_test2 tab_test2[60000];

	printf("\n");
	printf("################################\n");
	printf("### ###\n");
	printf("### PROG DEBUG ###\n");
	printf("### ###\n");
	printf("################################\n");
	printf("\n");
	return EXIT_SUCCESS;
}

Merci Guki,
Jai utilisé le code après tes remarques et j'ai toujours la meme erreur.
Mais quand je mets la ligne :
st_test1 tab_test1[50000];
en commentaire ou je remplace 50000 par une taille plus petite ça marche.
Pour EXEC SQL INCLUDE SQLCA; C'est parce que c'est un PRO*C. Mais en tout cas on peut utiliser que le .c généré.

Merci
Messages postés
488
Date d'inscription
vendredi 16 avril 2004
Statut
Membre
Dernière intervention
15 mars 2009
156
salut!
y'a juste un truc qui me chagrine dans cette source
j'aurais plutôt fait comme ça:

int main(int argc, char *argv[])
{

  return 0;
}


segmentation fault, la plupart du temps c'est un
pointeur auquel on n'a pas alloué assez de mémoire
(ici l'allocation est faite implicitement)
cordialement
¤
Messages postés
488
Date d'inscription
vendredi 16 avril 2004
Statut
Membre
Dernière intervention
15 mars 2009
156
salut,
Je viens de penser à un truc:
struct st_test1 tab_test1[50000]

j'ai déjà eu ce problème avec un enorme tableau statique du même genre.
ce que j'ai fait:

// debut de la fonction
struct  st_test1 *tab_test1=
(struct *st_test1) malloc (50000*sizeof(*tab_test1));
if(tab_test1==null)printf("probleme d'allocation");
//
//
//
// fin de fonction:
free (tab_test1);



seulement il faut le déclarer dans une fonction et le passer par pointeur aux autres fonctions. Voilà, si ça peut te servir...
cordialement
¤