Partage
  • Partager sur Facebook
  • Partager sur Twitter

Segmentation fault:11

    10 septembre 2020 à 17:23:52

    Bonjour,

    J'essaye de créer un petit programme afin de générer des octaves mais j'ai une erreur lors du comptage : segmentions fault:11

    voici le code 

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #include <limits.h> 
    
    #define T_ENTETE 44 // taille de l'entete d'un fichier wave
    #define VAL_MAX INT_MAX  // plus grand nombre que l'on peut representer par un int
    #define PI 3.1415927
    #define Fe 48000 //Fréquence d'échantillonnage qualité CD
    #define T_BLOC (Fe*12) // soit 12 secondes
    
    
    struct wave {
        char str_riff[4]; // mot "RIFF";
        int32_t taille; // La taille du fichier - 8 Ou num_data + 44 - 8
        char str_wave[4]; // mot "WAVE";
        char str_fmt[4]; // mot "fmt "
        int32_t tailleEntete; // Taille du header jusqu'à "data" 
        int16_t formatAudio; // 1 pour format PCM
        int16_t nombreCanaux; // Nombres de canaux 
        int32_t freqFe; // 48000 = Fréquence d'échantillonnage qualité CD
        int32_t ByteRate; // Fe * nombreCanaux * bitsParEch / 8 
        int16_t align; //nombreCanaux * bitsParEch / 8 
        int16_t bitsParEch; //  Bits par échantillon
        char str_data[4]; //mot "data"
        int32_t num_data; //Taille des données
        int *data; // à allouer dynamiquement
    };
    
    void init_wave(struct wave *audio){
    	strncpy((*audio).str_riff,"RIFF",4);
    	strncpy(audio->str_wave,"WAVE",4);
    	strncpy(audio-> str_fmt, "fmt ",4);
    	audio->tailleEntete = 16;
    	audio->formatAudio = 1;
    	audio->nombreCanaux = 1;
    	audio->freqFe = Fe;
    	audio->bitsParEch = 8*sizeof(int);
    	audio->ByteRate =  audio->freqFe * audio->nombreCanaux * (audio->bitsParEch / 8);
    	audio->align = audio->nombreCanaux * (audio->bitsParEch / 8);
    	strncpy(audio->str_data,"data",4);
    	audio->num_data = T_BLOC*sizeof(int);
        audio->taille = audio->num_data*sizeof(int) + 44 - 8;
        audio->data = calloc(audio->num_data,1);
    }
     
    void genere_la(struct wave audio){
    	int Fla = 440;
    	int i,j,k;
    	int cpt=0;
    	for(i=0;i<T_BLOC;i++){
    		audio.data[i]= VAL_MAX*(sin(i*2*PI/(Fe/Fla)));
    	}
    }
    
    void genere_gamme(struct wave audio, int o){
    	int i,j,cpt=0;
    	float FreqDo=32.70;
    	float Freq=32.70*pow(2,o);
    	for(i=0;i<24;i++){
    		for(j=i*Fe;j<(i+1)*(T_BLOC/12);j++){
    			audio.data[j] = VAL_MAX*(sin(j*2*PI/(Fe/Freq)));
    			cpt++;
    		}
    		Freq=FreqDo*pow(2,i/(float)12)*pow(2,o);
    	}
    }
    
    
    /* ------------partie-B-----------------------------*/
    
    int ajout_note(struct wave audio, int pos, int note, int octave, float duree){
    	int j=0;	
    	float FreqDo = 32.70;
    	float Freq=FreqDo*pow(2,note/(float)12)*pow(2,octave);
    	for(j=pos;j<pos+duree*Fe;j++){
    		if (j < T_BLOC){		
    			audio.data[j] = VAL_MAX*(sin(j*2*PI/(Fe/Freq)));
    		}
    	}	
    	return j;
    }
    
    char t[] = {'1','\'','2','@','3','4','$','5','%','6','^','7','8','*','9','(','0','q',
    'Q','w','W','e','E','r','t','T','y','Y','u','i','I','o','O','p','P','a','s','S','d',
    'D','f','g','G','h','H','j','J','k','l','L','z','Z','x','c','C','v','V','b','b','n','m'};
    
    int o[] = {1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,
    	4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,6};
    
    int n[] = {0,1,2,3,4,5,6,7,8,9,10,11,0,1,2,3,4,5,6,7,8,9,10,11,0,1,2,3,4,5,6,7,8,9,
    	10,11,0,1,2,3,4,5,6,7,8,9,10,11,0,1,2,3,4,5,6,7,8,9,10,11,0};
    
    
    int octave(char touche){
    	for(int i=0;i<56;i++){
    		if (touche == t[i]){
    			return o[i];		
    		}
    	}
    	return -1;
    }
    int note(char touche){
    	for(int i=0;i<56;i++){
    		if (touche == t[i]){
    			return n[i];		
    		}
    	}
    	return -1;
    }
    
    
    int ajout_note_lettre(struct wave audio, int pos, char lettre, float duree){
    
    	return ajout_note(audio, pos, note(lettre), octave(lettre), duree);
    	
    }
    
    void happy(struct wave audio, float duree){
    	char * partition = "etety ";
    	int i;
    	int pos=0;
    	for (i=0;i<strlen(partition);i++){
    		pos=ajout_note_lettre(audio , pos , partition[i], duree);
    		printf("%c\n" , partition[i]);
    	}
    
    
    }
    
    
    /* ------------MAIN-----------------------------*/
    
    int main(int argc, char const *argv[]){
    
    	struct wave audio;
    	init_wave(&audio);
    	genere_gamme(audio,6);
    	happy(audio,0.3);
    
    	printf("%d\n%d\n", octave('a'), note('a'));
    	
    	FILE *fich_wav = fopen("audio.wav", "wb+");
        
        if (fich_wav == NULL){
        	printf("Impossible de creer le fichier fic_audio.wav\n");
            return 1;
        }
        fwrite(&audio, T_ENTETE, 1, fich_wav); // entete sans les donnees
        fwrite(audio.data, audio.num_data, 1, fich_wav); // donnees
     
    	free(audio.data);
    	fclose(fich_wav);
    
    	return 0;
    }

    merci de votre aide 

    • Partager sur Facebook
    • Partager sur Twitter
      10 septembre 2020 à 17:31:42

      C'est dans ces circonstances, qu'il faut utiliser un débogueur !
      • Partager sur Facebook
      • Partager sur Twitter
        10 septembre 2020 à 21:28:32

        Quand ça plante on prend un debugger et on regarde où ça a planté. C'est fait pour ça car le développement ne consiste pas à deviner.

        • Partager sur Facebook
        • Partager sur Twitter

        git is great because Linus did it, mercurial is better because he didn't.

          10 septembre 2020 à 21:53:41

          Si tu n'as pas le temps d'apprendre à te servir d'un débogueur, je te suggère la méthode que j'emploie : mettre des 'printf' partout afin de détecter à quel endroit du programme a lieu le plantage. Si le mystère persiste, il faut afficher la valeur des variables (c'est là où le débogueur serait très pratique, évidemment).

          Ce n'est pas en lisant le listing du programme qu'on trouve la cause d'un plantage, mais en cherchant à quel endroit il s'est produit.

          • Partager sur Facebook
          • Partager sur Twitter
            10 septembre 2020 à 23:55:28

            Dans ta fonction genere_gamme ligne 63, j'ai bien l'impression que tu débordes du tableau pointé par audio.data
            • Partager sur Facebook
            • Partager sur Twitter

            Segmentation fault:11

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown