IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

erreur d'allocation de mémoire?


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 20
    Par défaut erreur d'allocation de mémoire?
    j'ai donc alloué ma mémoire, à la compilation ca passe mais le problème est qu'au lancement de l'executable ça veux ecrire ou lire dans des endroits non alloué et je vois pas trop où j'aurai pu faire une bourde.
    Donc il y a t'il une erreur dans ma syntaxe?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    void main()
    {
        Donneewav *D=(Donneewav*)malloc(sizeof(Donneewav));
    	char* name=(char*)malloc(7*sizeof(char));
    	double** tri,*y,** data_trame,*E;
    	int i,j,TRAME,DEC,NB_TR,tempo,tempo2,SCAL_DELTA,SCAL_ACC;
    	D->file_type=(char*) malloc(4*sizeof(char));
        D->file_id=(char*) malloc(4*sizeof(char));			
        D->chunk_id=(char*) malloc(4*sizeof(char));
        D->chunk2_id=(char*) malloc(4*sizeof(char));
    	D->data=(double*)malloc(25000*sizeof(double));
    	tri = (double**)malloc(NUMCHANS* sizeof(double*));
    	for(i=0;i<NUMCHANS;i++)
    		tri[i] =(double*) calloc (Lfft/2, sizeof(double));
        y =(double*)malloc (Lfft* sizeof(double));
     
    	sprintf(name,"busarri");
        wavread(name,D);															
     
    	TRAME=D->sampling_freq*25/1000;												
    	DEC=D->sampling_freq*10/1000;												
    	NB_TR=(int)(((D->chunk3_size)-(TRAME-DEC))/DEC);							
    	SCAL_DELTA=0;
    	for (i=1;i<DELTA+1;i++)
    		SCAL_DELTA=i^2+SCAL_DELTA;												
    	SCAL_ACC=0;
    	for (i=1;i<ACC+1;i++)
    		SCAL_ACC=i^2+SCAL_ACC;													/
     
    	filt_mel(tri,D);															
     
    	data_trame = (double**)malloc(NB_TR* sizeof(double*));
    	for(i=0;i<NB_TR;i++)
    		data_trame[i] =(double*) calloc (Lfft, sizeof(double));
     
    	trame(D,data_trame,TRAME,DEC,NB_TR);						
     
    	E=(double*)malloc(NB_TR*sizeof(double));
    	tempo2=0;	
     
    	for(i=0;i<NB_TR;i++)
    	{
    		E[i]=0;
    		for(j=0;j<TRAME;j++)
    		{
    			E[i]=E[i]+pow(data_trame[i][j],2);									
     
    			tempo=data_trame[i][j];
    			data_trame[i][j]=data_trame[i][j]-0.97*tempo2;
    			tempo2=tempo;
    			data_trame[i][j]=data_trame[i][j]*(0.54-0.46*cos(2*Pi*j/(TRAME-1)));
    		}
            E[i]=log(E[i]);
    		fft(data_trame[i],y);
     
    	}
     
     
    	free(E);
    	E=NULL;
    	for(i=0;i<NB_TR;i++)
    	{
    		free(data_trame[i]);
    		data_trame[i]=NULL;
    	}
        free(data_trame);
    	data_trame=NULL;
    	free(y);
    	for(i=0;i<NUMCHANS;i++)
    	{
    		free(tri[i]);
    		tri[i]=NULL;
    	}
    	free(tri);
    	tri=NULL;
    	free(D->data);
    	D->data=NULL;
    	free(name);
    	name=NULL;
    	free(D->file_type);
    	D->file_type=NULL;
        free(D->file_id);
    	D->file_id=NULL;
        free(D->chunk_id);
    	D->chunk_id=NULL;
        free(D->chunk2_id);
    	D->chunk2_id=NULL;
        free(D);
    	D=NULL;
    }

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Salut,
    1) teste le retour de malloc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if(mon_pointeur==NULL)
    {
      perror("Erreur");
      exit(EXIT_FAILURE);
    }
    2) enlève tous les cast avant le malloc : ils ne servent à rien

    3) le prototype de main est

    4) rajoute un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return EXIT_SUCCESS;
    tout à la fin de ton main (car la fonction renvoie un int)

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TRAME=D->sampling_freq*25/1000;												
    	DEC=D->sampling_freq*10/1000;
    qu'est-ce que D->sampling_freq ? un int ou un double ?

    en entier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    25/1000 == 0
    10/1000 == 0
    je ne sais pas si l'opération 25/1000 est effectuée en premier puis le résultat est multiplié par D->sampling_freq (auquel cas le résultat sera 0) ou si la 1e opération est D->sampling_freq * 25 puis le résultat est divisé par 1000. Je ne sais pas s'il y a une optimisation du compilo...

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Ôte donc ces casts que je ne saurais voir!
    Le cast du retour de malloc() est inutile en C, et parfois nuisible car il peut cacher un oubli d'inclusion de stdlib.h.

    Et comme dit plus haut, teste les valeurs retournées.
    Je te conseille aussi de décomposer un peu plus ton code en fonctions.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 20
    Par défaut
    il n'y a pas de soucis pour D->sampling_freq, il vaut 8000

    j'ai testé tous mes pointeurs sur mon programme mais j'ai préféré tout enlevé pour allégé.

    mais j'ai de grosse crainte sur le fait que ma fonction fft() puisse me désaloué mes pointeurs sans que je lui demande :/

    EDIT: et il manquait la library stdlib.h mais ça ne résout pas mon problème

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par ulnar

    mais j'ai de grosse crainte sur le fait que ma fonction fft() puisse me désaloué mes pointeurs sans que je lui demande
    salut, désaloué == faire un free ? as-tu fait un free() dans la fonction fft() ? Poste la.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for (i=1;i<DELTA+1;i++)
    		SCAL_DELTA=i^2+SCAL_DELTA;
    qu'est-ce que le ^ ?? pour faire un carré, soit tu fais i*i, soit tu fais pow(i,2.)

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 20
    Par défaut
    Citation Envoyé par salseropom
    salut, désaloué == faire un free ? as-tu fait un free() dans la fonction fft() ? Poste la.
    la fonction fft() fait un free mais comme c'est un code repris que je ne contrôle pas... normalement ça devrai pas avoir d'incidence mais ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void fft(double* x,double* X)
    {	
    	IppStatus status;
    	IppsFFTSpec_R_64f* spec;
    	status= ippsFFTInitAlloc_R_64f(&spec,8,IPP_FFT_DIV_INV_BY_N,ippAlgHintNone);
    	status=ippsFFTFwd_RToCCS_64f(x,X,spec,NULL);
    	ippsMagnitude_64fc((Ipp64fc*)X,X,Lfft/2);
    	ippsFFTFree_R_64f(spec);
    }
    comme je disais, je doute que ca aide

  9. #9
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    d'abord, avant de démarrer le code, vu que tu fais tes allocs dans les intiialisations, je ferais comme première instructuon un gigantesque

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ( (pointeur1 == NULL) || (pointeur2 == NULL) ...)
      {
        return EXIT_FAILURE ;
      }

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par salseropom
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for (i=1;i<DELTA+1;i++)
    		SCAL_DELTA=i^2+SCAL_DELTA;
    qu'est-ce que le ^ ?? pour faire un carré, soit tu fais i*i, soit tu fais pow(i,2.)
    cette opération peut se calculer de la manière suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SCAL_DELTA=DELTA*(DELTA+1)*(2*DELTA+1)/6
    car somme i^2 pour i=1 à n = n*(n+1)*(2*n+1)/6

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 20
    Par défaut
    Citation Envoyé par salseropom
    cette opération peut se calculer de la manière suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SCAL_DELTA=DELTA*(DELTA+1)*(2*DELTA+1)/6
    car somme i^2 pour i=1 à n = n*(n+1)*(2*n+1)/6
    je me demandait ce qu'était la manière rapide de calculer cette série mais je m'en rappelais pas, merci

    je peux mettre cette expression en constante global ?

  12. #12
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	TRAME=D->sampling_freq*25/1000;
    ....
    	data_trame = (double**)malloc(NB_TR* sizeof(double*));
    	for(i=0;i<NB_TR;i++)
    		data_trame[i] =(double*) calloc (Lfft, sizeof(double));
    ....
    	for(i=0;i<NB_TR;i++)
    	{
    		E[i]=0;
    		for(j=0;j<TRAME;j++)
    		{
    			E[i]=E[i]+pow(data_trame[i][j],2);
    ....
    Est-ce qu'il y a un rapport connu entre Lfft (non défini dans le code posté), nombre d'éléments de data_trame[.], et TRAME, limite de la boucle ?

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 20
    Par défaut
    on a TRAME qui est plus petite que Lfft

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 20
    Par défaut
    j'ai résolu mon problème n doublant la taille de y et de data_trame

    c'était bien ma fonction fft() qui était mal accepté, je sais pas pourquoi il voulait des vecteurs 2 fois plus grand :/ mais bon il a l'air de tout bien marché maintenant (je sais que c'est qu'une solution de pacotille mais j'ai déjà perdu trop de temps sur le sujet)

    je vous remercie pour les différents conseils, j'en tiendrai compte!;

  15. #15
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 972
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 972
    Par défaut
    gao,
    Citation Envoyé par ulnar
    j'ai résolu mon problème n doublant la taille de y et de data_trame

    c'était bien ma fonction fft() qui était mal accepté, je sais pas pourquoi il voulait des vecteurs 2 fois plus grand :/ mais bon il a l'air de tout bien marché maintenant (je sais que c'est qu'une solution de pacotille mais j'ai déjà perdu trop de temps sur le sujet)

    je vous remercie pour les différents conseils, j'en tiendrai compte!;
    Parce que classiquement, il attend des nombres complexe, généralement le format est (à vérifier pour ton programme )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    tableau[0].partie_reelle;
    tableau[0].partie_imaginaire;
    tableau[1].partie_reelle;
    tableau[1].partie_imaginaire;
    ...
    Ce qui fait que logiquement, si tu t'es contenté d'augmenter la taille du vecteur sans mettre les données à leur bonne place, les calculs sont faux.

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par ulnar
    je me demandait ce qu'était la manière rapide de calculer cette série mais je m'en rappelais pas, merci

    je peux mettre cette expression en constante global ?
    evite autant que possible les variables globales.

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 20
    Par défaut
    j'avais une autre question sinon, quel est la différence entre une macro et une fonction quel sont les avantages et les inconvénients d'utiliser l'une ou l'autre ?

  18. #18
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    quel est la différence entre une macro et une fonction quel sont les avantages et les inconvénients d'utiliser l'une ou l'autre ?
    Une macro procède par remplacement de texte. L'écriture de la macro doit tenir compte de ce qu'elle peut intervenir dans n'importe quel contexte et fournir après remplacement une expression syntaxiquement correcte (et faisant ce qui est souhaité, d'où la quantité de parenthèses souvent nécessaire à son écriture correcte). Si il y a une erreur, le message du compilateur peut souvent sembler obscur et ne pas correspondre à la ligne en cause puisqu'il correspond au texte remplacé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur d'allocation mémoire
    Par Sagee dans le forum Débuter
    Réponses: 5
    Dernier message: 18/04/2012, 12h03
  2. Erreur d'allocation mémoire - GTK+
    Par Jazzero dans le forum Débuter
    Réponses: 13
    Dernier message: 13/07/2009, 18h33
  3. C++, erreur d'allocation dynamique de mémoire
    Par YuGiOhJCJ dans le forum C++
    Réponses: 8
    Dernier message: 20/02/2009, 11h51
  4. Double allocation de mémoire
    Par hunter001 dans le forum C++
    Réponses: 16
    Dernier message: 25/08/2005, 13h53
  5. pb d'allocation de mémoire
    Par shura dans le forum C
    Réponses: 7
    Dernier message: 17/04/2005, 21h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo