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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    260
    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 : 260
    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 !!

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    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 actuellement connecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    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 +).

  4. #4
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    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
    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.

  6. #6
    Membre très actif
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    260
    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 : 260
    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 ++ !!

+ 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