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 :

strcpy: Violation d'accès lors de la lecture


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 248
    Points : 74
    Points
    74
    Par défaut strcpy: Violation d'accès lors de la lecture
    Bonjour à tous !!

    Alors voilà, je cherche à ouvrir d'un seul coup plusieurs images notées pic1, pic2, pic3, ....., pic16 pour ensuite faire des manip dessus en analyse d'images, avec OpenCV.

    Alors j'ai pensé faire une concaténation avec le terme constant "pic" et les différents numéros 1, 2, ... 16 le truc classique que j'ai déjà fait maintes fois mais là je coince !!



    VOICI L'ERREUR :

    Exception non gérée à 0x518ab840 (msvcr100d.dll) dans OpenCV.exe*: 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00000010cccccccc.


    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
    
    
    int main(int argc, char** argv)
    	{
    	    char* names[16];
    		
    		for(int i=0; i<16; i++)
    		{
    			names[i] =  new char[5];
    		}
    
    		
    
    		const char a[] = "pic"; 
    
    
    		for(int i=0; i<16; i++)
    		{
    			strcpy (names[i], a);  // L'ERREUR EST ICI
    			strcat (names[i], convertInt(i+1).c_str());  // char * strcat ( char * destination, const char * source ); 
    		}
    	
    
    	    namedWindow( wndname, 1 );
    	    vector<vector<Point> > squares;
    	   
    	    for( int i = 0; names[i] != 0; i++ )
    	    {
    	        Mat image = imread(names[i], 1);
    
    	        if( image.empty() )
    	        {
    	            cout << "Couldn't load " << names[i] << endl;
    	            continue;
    	        }
    	       
    	        findSquares(image, squares);
    	        drawSquares(image, squares);
    	
    	        int c = waitKey();
    	        
    			//break;
    	    }
    	
    	    return 0;
    	}

    Et en sortie j'obtiens :

    Couldn't load pic1
    Couldn't load pic2
    .......................
    Couldn't load pic16

    J'ai cherché pas mal mais je suis débutant, et je n'ai point trouvé !! Votre aide me serait fort utile !!
    "Les ordinateurs font toujours ce qu'on leur dit, mais jamais ce qu'on veut."

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Bonjour,

    ensuite un new de 1000 c'est pas un peu excessif pour écrire une chaîne de 5 caractère max.

    ce type de déclaration fonctionne bien dans le cadre de chaine qui ne bougeront pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char names[][] = {"pic1", "pic2", ....
    }
    Le contenu de tes 2 boucles tient dans une seule.

    Et pq tu utilise des char* alors que tu es en C++ et que l'objet string t'éviterais qlq pb

  3. #3
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    je ne peux que te conseiller avec insistance de:
    . utiliser la classe string à la place des char*
    . utiliser la classe vector à la place des tableaux[]

    Par exemple, un tableau de chaines de caracteres, en c++, ne sera pas char* names[16], mais vector<string> names( 16 );

    En utilisant des string à la place des char*, plus de strcopy ni de strcat (avec tous les problèmes qui vont avec), mais des opérations entre string (= et +).
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Le code est moche mais semble correct.
    Preuve en est ta sortie "couldn't load pic1" ... si tu avais vraiment une exception, le code n'irait pas aussi loin, à fortiori si elle se trouvait là où tu l'indiques.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for( int i = 0; names[i] != 0; i++ )
    Que signifie cette condition de sortie ?! (en dehors d'un bon gros crash bien évident)
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    var arriver jusqu'à l'indice 16 et taper une zone de mémoire qui ne lui est pas réservée ! Le pointeur n'est pas nul mais n'est pas valide pour autant. J'imagine que tu as fait ça pour pouvoir changer le nombre d'images sans avoir à modifier ta boucle (curieux car on peut utiliser une variable contenant le nombre d'images ^^) ?

    L'utilisation de string, de vector et des itérateurs règlera tous ces problèmes.
    Find me on github

  6. #6
    Membre régulier
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 248
    Points : 74
    Points
    74
    Par défaut
    VOILA MON NOUVEAU CODE :

    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
     
     
     
    	int main(int argc, char** argv)
    	{
    	    vector <string> names;
     
     
    		string png = ".png";
     
    		string pic = "pic";
     
    		string total; 	 
     
     
     
    		for(int i=0; i<16; i++)
    		{
    			// créer un flux de sortie
    			std::ostringstream oss;
    			// écrire un nombre dans le flux
    			oss << i+1;
    			// récupérer une chaîne de caractères
    			std::string result = oss.str();
     
    			total = pic + result + png;
     
    			names.push_back(total);
    		}
     
     
    	    namedWindow( wndname, 1 );
    	    vector<vector<Point> > squares;
     
    	    for( int i = 0; i<16 ; i++ )
    	    {
    	        Mat image = imread(names.at(i), 1);
     
    	        if( image.empty() )
    	        {
    	            cout << "Couldn't load " << names[i] << endl;
    	            continue;
    	        }
     
    	        findSquares(image, squares);
    	        drawSquares(image, squares);
     
    	        int c = waitKey();
     
    			//break;
    	    }
     
    	    return 0;
    	}
    ça marche !!

    Merci de vos indications !!

    Je déteste le c ++ !!
    "Les ordinateurs font toujours ce qu'on leur dit, mais jamais ce qu'on veut."

  7. #7
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par wilfryjules Voir le message
    VOILA MON NOUVEAU CODE :Je déteste le c ++ !!
    Ben pourquoi, c'est pas beaucoup plus clair une fois écrit plus proprement ?
    Find me on github

  8. #8
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    tu as encore 2 boucles avec la même condition qui ont leurs traitements qui pourraient tenir dans une seule

    Après je dit ça je dit rien

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

Discussions similaires

  1. Violation d'accès lors de la lecture
    Par moooona dans le forum MFC
    Réponses: 2
    Dernier message: 27/05/2010, 17h52
  2. Réponses: 5
    Dernier message: 01/12/2009, 01h06
  3. Réponses: 7
    Dernier message: 13/08/2009, 09h01
  4. Réponses: 5
    Dernier message: 02/01/2009, 10h37
  5. Violation d'accès lors de la lecture
    Par Fullmetal82 dans le forum C++
    Réponses: 9
    Dernier message: 29/11/2007, 17h13

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