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 :

Problème avec violation d'accès


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Newbie
    Inscrit en
    Juin 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Newbie

    Informations forums :
    Inscription : Juin 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut Problème avec violation d'accès
    Bonjour,
    Comment éviter l'erreur de violation d'acces à la ligne I[p][o][q]=(uint16_t)temp;?

    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
    uint16_t *** get_Images(uint32_t ImageCount,uint32_t ImHeight, uint32_t ImWidth,FILE* fp)
    	{
    		uint16_t ***I;
    		uint16_t temp[2];
    		I = (uint16_t ***)malloc((ImHeight+ImWidth+ImageCount)*sizeof(uint16_t**));
    		uint16_t tracks[4];
    		uint32_t o,p;
    		uint16_t q;
                    printf("ImWidth %d\n",ImWidth);
    		printf("ImWidth*sizeof(uint16_t) %d\n",ImWidth*sizeof(uint16_t));
    		printf("ImageCount %d\n",ImageCount);
    		printf("ImHeight %d\n",ImHeight);
     
           for (p=0;p<ImageCount;p++)
    		{
    			for(o=(ImHeight-1);o>=0;o--)
    			{
    				q=0;
    				while(q<ImWidth)
    				{
    					fread(&temp,2,1,fp);
    					//printf("temp %d",temp);
    					I[p][o][q]=(uint16_t)temp;
    					q=q+2;
    				}
    			}
    			fread(&tracks,sizeof(tracks),1,fp);
     
    		}
    		return(I);
    		free(I);
    	}

    Message:

    'Cine_project.exe'*: Chargé 'C:\Users\qz27p2\Documents\Visual Studio 2010\Projects\Cine_project\Debug\Cine_project.exe', Les symboles ont été chargés.
    'Cine_project.exe'*: Chargé 'C:\Windows\SysWOW64\ntdll.dll', Cannot find or open the PDB file
    'Cine_project.exe'*: Chargé 'C:\Windows\SysWOW64\kernel32.dll', Cannot find or open the PDB file
    'Cine_project.exe'*: Chargé 'C:\Windows\SysWOW64\KernelBase.dll', Cannot find or open the PDB file
    'Cine_project.exe'*: Chargé 'C:\Windows\SysWOW64\msvcr100d.dll', Les symboles ont été chargés.
    Exception de première chance à 0x00bd3f7d dans Cine_project.exe*: 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0xcdcdd389.


    Merci d'avance pour d'éventuelles réponses.

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    C'est moi où tu ne "malloc" pas correctement chacun des dimensions de ta matrice ? --> http://c.developpez.com/faq/?page=L-...a-2-dimensions

    C'est quoi ce return dans la boucle ?

    C'est quoi cette boucle de free() alors qu'il n'y a pas la boucle de malloc() correspondante ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Newbie
    Inscrit en
    Juin 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Newbie

    Informations forums :
    Inscription : Juin 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par Bktero Voir le message
    C'est moi où tu ne "malloc" pas correctement chacun des dimensions de ta matrice ? --> http://c.developpez.com/faq/?page=L-...a-2-dimensions

    C'est quoi ce return dans la boucle ?

    C'est quoi cette boucle de free() alors qu'il n'y a pas la boucle de malloc() correspondante ?

    Merci pour ta réponse mais je pense que tu as du mal lire mon code, mon return est à la fin de mes boucles ainsi que mon free, je recopie avec une meilleure indentation mais bon :



    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
     
    for (p=0;p<ImageCount;p++)
    {
    	for(o=(ImHeight-1);o>=0;o--)
    	{
    		q=0;
    		while(q<ImWidth)
    		{
    		        fread(&temp,2,1,fp);
    			//printf("temp %d",temp);
    			I[p][o][q]=(uint16_t)temp;
    			q=q+2;
    		}
    	}
    	fread(&tracks,sizeof(tracks),1,fp);
    }
    return(I);
    free(I);
    Je n'avais pas fait attention à mon malloc effectivement (j'ai additionné au lieu de multiplier mes dimensions), si je suis le deuxième exemple du lien que tu m'a envoyé alors je devrais écrire

    uint16_t * I = malloc((ImHeight*ImWidth*ImageCount)*sizeof(uint16_t)); ?

    A ce moment là ce message apparait: error C2440: 'initialisation'*: impossible de convertir de 'void *' en 'uint16_t *'

    Quant à l'autre méthode j'ai écrit cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    uint32_t i,j;
    uint16_t ***I ;
    I = malloc(ImageCount*sizeof(*I));
    for(i = 0; i < ImageCount; i++) 
    {
    	I[i] = malloc(ImHeight * sizeof(**I));
    	for(j = 0; j < ImHeight; j++) 
    	{
    		I[i][j]=malloc(ImWidth* sizeof(***I));
    	}
    }
    Mais pareil probleme de conversion, message du debuger:

    1>------ Début de la génération*: Projet*: Cine_project, Configuration*: Debug Win32 ------
    1> cine.cpp
    1>c:\users\qz27p2\documents\visual studio 2010\projects\cine_project\cine_project\cine.cpp(432): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdio.h(234)*: voir la déclaration de 'fopen'
    1>c:\users\qz27p2\documents\visual studio 2010\projects\cine_project\cine_project\cine.cpp(456): error C2440: '='*: impossible de convertir de 'void *' en 'uint16_t ***'
    1> La conversion de 'void*' en pointeur vers non 'void' nécessite un cast explicite
    1>c:\users\qz27p2\documents\visual studio 2010\projects\cine_project\cine_project\cine.cpp(459): error C2440: '='*: impossible de convertir de 'void *' en 'uint16_t **'
    1> La conversion de 'void*' en pointeur vers non 'void' nécessite un cast explicite
    1>c:\users\qz27p2\documents\visual studio 2010\projects\cine_project\cine_project\cine.cpp(462): error C2440: '='*: impossible de convertir de 'void *' en 'uint16_t *'
    1> La conversion de 'void*' en pointeur vers non 'void' nécessite un cast explicite
    ========== Génération*: 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========

    Et si je mets les (uint16_t *) ou (uint16_t **) ou (uint16_t ***) je n'ai plus mes problemes de convertion mais j'ai toujours mon probleme de violation d'acces a la ligne
    I[p][o][q]=(uint16_t)temp;

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Newbie
    Inscrit en
    Juin 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Newbie

    Informations forums :
    Inscription : Juin 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Bon j'ai trouvé la solution.


    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
     
    uint16_t *** get_Images(uint32_t ImageCount,uint32_t ImHeight, uint32_t ImWidth,FILE* fp)
    {
    		uint16_t temp;
    		uint32_t i,j;
    		uint16_t ***I ;
    		I = (uint16_t ***)malloc(ImageCount*sizeof(*I));
    		for(i = 0; i < ImageCount; i++) 
    		{
    			I[i] = (uint16_t **)malloc(ImHeight * sizeof(**I));
    			for(j = ImHeight; j >0; j--) 
    			{
    				I[i][j]=(uint16_t *)malloc(ImWidth * sizeof(***I));
    			}
    		}
    		uint16_t tracks[4];
    		uint32_t o,p;
    		uint32_t q;
            for (p=0;p<ImageCount;p++)
    		{
    			for(o=ImHeight;o>0;o--)
    			{
    				for(q=0;q<ImWidth;q++)
    				{
    					fread(&temp,2,1,fp);
    					I[p][o][q]=temp;		
    				}
     
    			}
    			fread(&tracks,sizeof(tracks),1,fp);
    		}
     
    		return(I);
    		for(i=0 ; i < ImageCount ; i++)
    		{
    			for(j=ImHeight ; j >0 ; j--)
    			{
    					free(I[i][j]);
    			}
    		}
    		for(i=0 ; i < ImageCount ; i++)
    		{
    			free(I[i]);
    		}
    		free(I);
    	}
    J'avais mal défini ma boucle pour décrémenter et j'avais incrémenter ma boucle dans malloc, du coup ca fonctionnait pas.

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Je me suis en effet totalement basé sur l'indentation, pardon. Encore une fois, on voit l'importance de l'indentation !

    Content que tu aies trouvé la solution à ton problème. Bonne continuation.

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

Discussions similaires

  1. problème de violation d'accès avec createprocess
    Par sevyc64 dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 01/04/2014, 14h37
  2. Problème de violation d'accès avec Array
    Par kracter56 dans le forum Débuter
    Réponses: 2
    Dernier message: 07/06/2012, 09h27
  3. Réponses: 2
    Dernier message: 17/12/2008, 22h30
  4. [vb 2005]Problème de violation d'accès concurentiel
    Par estelledany dans le forum Windows Forms
    Réponses: 3
    Dernier message: 14/06/2006, 17h14
  5. Problème de violation d'accès
    Par Oluha dans le forum Bases de données
    Réponses: 11
    Dernier message: 31/05/2005, 10h26

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