Segmentation fault Linux

Fermé
safir - 4 nov. 2004 à 15:39
blurk Messages postés 486 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 15 mars 2009 - 5 nov. 2004 à 18:56
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 */
A voir également:

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

0
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
0
blurk Messages postés 486 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 15 mars 2009 160
4 nov. 2004 à 20:40
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
¤
0
blurk Messages postés 486 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 15 mars 2009 160
5 nov. 2004 à 18:56
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
¤
0