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 :

C++: Violation d'accès à la lecture


Sujet :

C++

  1. #1
    En attente de confirmation mail
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 81
    Points : 68
    Points
    68
    Par défaut C++: Violation d'accès à la lecture
    Bonjour à tous,

    Je sais que c'est un problème assez classique, mais, malgré mes recherches, je n'ai trouvé aucune solution. En fait la compilation de mon code se passe avec succès, mais lors de l'exécution j'ai ce message d'erreur qui s'affiche:

    Exception non gérée à 0x00a3a6f9 dans graphe.exe*: 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0xcccccccc.


    J'utilise Visual Studio 2010 et voici la fonction utilisée:

    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
    graphe::graphe(char* NomFichier)
    {
        ifstream fichier(NomFichier);
        string ligne;
     
    	int num = 1;
    	while(getline(fichier, ligne) && num<=2)
    	{
    		if(num == 1) // Si num = 1, alors on lit la première ligne du fichier qui contient le tableau fs
    		{
    			int j = 0;
    			for(int i=0; i<ligne.length() ; i++)
    			{
    				if(ligne[i]!='\n')
    				{
     
    					string tmp;
    					tmp=ligne[i];
    					if(i+1<ligne.length())
    						i++; // Pour être positionné au caractère suivant
    					while(ligne[i]!=';' && i<ligne.length())
    					{
    						tmp = tmp+ligne[i];
    						i++;
    					}
    					if(i==0)
    					{
    						fs=(int*)malloc(atoi(tmp.c_str())+1);
    					}
    					fs[j]= atoi(tmp.c_str());
    					j++;
    				}
    			}
    		}
    		else
    		{
    			if(num==2) // Si num=2, alors il s'agit de la 2è ligne du fichier qui contient le tableau aps
    			{
    				int j = 0;
    				for(int i=0; i<ligne.length() ; i++)
    				{
    					if(ligne[i]!='\n')
    					{
    						string tmp;
    						tmp=ligne[i];
    						if(i+1<ligne.length())
    							i++; // Pour être positionné au caractère suivant
    						while(ligne[i]!=';' && i<ligne.length())
    						{
    							tmp = tmp+ligne[i];
    							i++;
    						}
    						if(i==0)
    						{
    							aps=(int*)malloc(atoi(tmp.c_str())+1);
    						}
    						aps[j]= atoi(tmp.c_str());
    						j++;
    					}
    				}
    			}
    		}
    		num++;
    	}
     
    	fichier.close();
    }
    Voici maintenant mon fichier main:

    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
    #include "graphe.h"
     
    #include <cstdlib>
    #include <iostream>
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
        char* NomFichier = "essai.txt";
     
    	graphe g(NomFichier);
     
    	for(int i=1; i<=g.fs[0];i++)
    		cout<< g.fs[i] << " ";
    	cout<<endl;
     
    	for(int i=1; i<=g.aps[0];i++)
    		cout<< g.aps[i] << " ";
     
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    Je précise que fs[0] contient le nombre d'élément du tableau fs -1 (sans la première case donc) et idem pour le tableau aps.

    Ce que la fonction graphe est censé faire est, à partir du fichier txt, mettre les nombres de la 1è ligne dans le tableau fs et ceux de la deuxième dans le tableau aps. Ces nombres sont séparés par des points virgules.

    Merci d'avance.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Tu as fait du pas ?
    Essayé de mettre des traces ?

    Je t'avoue qu'à cette heure-ci, j'ai un peu la flemme de lire ton code.

  3. #3
    En attente de confirmation mail
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 81
    Points : 68
    Points
    68
    Par défaut
    Tu veux dire quoi par mettre des traces et faire du pas ?

    Petite précision que je n'ai pas mis dans mon premier post : quand l'erreur s'affiche, j'ai la première boucle for dans le main qui est pointée par une flèche (donc l'erreur serait causé par celle-ci mais pourquoi je l'ignore).

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par seb68270 Voir le message
    Petite précision que je n'ai pas mis dans mon premier post : quand l'erreur s'affiche, j'ai la première boucle for dans le main qui est pointée par une flèche (donc l'erreur serait causé par celle-ci mais pourquoi je l'ignore).
    Si ça arrive sur la boucle de ton for, c'est que la construction de ton graphe s'est a priori bien passée.
    Ça doit planter sur g.fs(). Mais on n'a pas le code de cette fonction.

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Déjà, quand je vois cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fs=(int*)malloc(atoi(tmp.c_str())+1);
    j'ai peur! Et pour plusieurs raisons:
    • D'abord, cela sous entend que temp est une chaine de caractères qui représente une valeur numérique, ce qui reste à démontrer
    • Ensuite parce que l'on n'utilise jamais malloc en C++
    • Enfin, parce que cette allocation dynamique de mémoire a lieu dans une boucle, et qui plus est dans des boucles imbriquées. Je soupçonne donc que tu seras très rapidement confronté à une fuite mémoire
    Ta logique est vraiment pour le moins, humm, disons surprenante je te conseillerais très vivement de la revoir un tout petit peu, et, surtout, d'utiliser les fonctionnalités propres à C++ : les tableaux de taille dynamique sont gérés avec std::vector et la conversion se fait soit avec les classes stringstream, soit avec les fonctions adaptées que C++11 nous apporte (stoi, stol, stoll, stoul, stoull)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    En attente de confirmation mail
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 81
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par oodini Voir le message
    Si ça arrive sur la boucle de ton for, c'est que la construction de ton graphe s'est a priori bien passée.
    Ça doit planter sur g.fs(). Mais on n'a pas le code de cette fonction.
    En fait, j'ai créé une classe graphe dont voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class graphe
    {
    public:
     
        graphe(char* NomFichier);
        graphe(int** adj);
     
        int* fs;
        int* aps;
        int** adj;
     
    };
    D'où donc la ligne "graphe g(NomFichier);" dans le main.

    j'ai peur! Et pour plusieurs raisons:
    D'abord, cela sous entend que temp est une chaine de caractères qui représente une valeur numérique, ce qui reste à démontrer
    Ensuite parce que l'on n'utilise jamais malloc en C++
    Enfin, parce que cette allocation dynamique de mémoire a lieu dans une boucle, et qui plus est dans des boucles imbriquées. Je soupçonne donc que tu seras très rapidement confronté à une fuite mémoire
    Ta logique est vraiment pour le moins, humm, disons surprenante je te conseillerais très vivement de la revoir un tout petit peu, et, surtout, d'utiliser les fonctionnalités propres à C++ : les tableaux de taille dynamique sont gérés avec std::vector et la conversion se fait soit avec les classes stringstream, soit avec les fonctions adaptées que C++11 nous apporte (stoi, stol, stoll, stoul, stoull)
    Concernant la fuite mémoire c'est possible vu que j'ai un problème de violation d'accès à la lecture. Par contre, je ne peux pas utiliser un vecteur vu que je dois utiliser un tableau. Je fais c'est dans le cadre d'un projet pour la fac en fait et justement fs est un tableau déclaré comme ceci:

  7. #7
    Membre confirmé
    Profil pro
    Consultant en technologies
    Inscrit en
    Octobre 2013
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies

    Informations forums :
    Inscription : Octobre 2013
    Messages : 158
    Points : 555
    Points
    555
    Par défaut
    Citation Envoyé par seb68270 Voir le message
    En fait, j'ai créé une classe graphe dont voici le code:

    [Concernant la fuite mémoire c'est possible vu que j'ai un problème de violation d'accès à la lecture. Par contre, je ne penses pas pouvoir utiliser un vecteur vu que je dois utiliser un tableau (d'où le "int* fs;" dans la classe). Après je peux me tromper ...
    * Ce genre d'erreur c'est typique d'une lecture au mauvais index d'un tableau.

    * Pourquoi dois-tu utiliser un tableau (exercice, une contrainte particulière ?) dans au moins 90% des cas std::vector (et en cpp11 std::array) seront à préférer au tableau à la papy (Je doute pas qu'un conteneur complexe dont la taille peut se changer on the fly a un cout en terme de temps de calcul, mais sauf quelques applications, ce cout est compensé par le gain de développeur qui n'a pas à gerer de fuite de mémoire ou de Segfault).

    * En c++ un tableau dynamique (à la papy) c'est int* tab = new int[N]; (et se libère avec delete[]) les malloc c'est du C. Si tu alloue de la mèmoire à la main tu doit la liberer à la main (Sinon fuite de mémoire), le problème c'est que tu as vite fait d'oublier un corner-case et d'écrire une fonction qui dans un cas sur cents ne désalloue pas de la mémoire. Si tu fais 10 000 itérations et que ton objet fait 1 MB c'est pas grave. Si tu fais milles fois plus ou que tes objets sont 1000 fois plus gros tu plante ta machine. (Mais bon même de petits objets sur des petites boucles c'est à éviter). L'interet du vector/array (mais aussi des smart pointers) c'est de pas avoir à faire ce boulot à la main et donc d'éviter les corner-case

  8. #8
    En attente de confirmation mail
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 81
    Points : 68
    Points
    68
    Par défaut
    La contrainte est que justement les tableau fs et aps sont déclarés comme je l'ai écris dans mon dernier post pour fs, sinon c'est clair que j'aurais utilisé des vecteurs car plus simple d'utilisation.

    Je ne vois pas en quoi ce serait une lecture au mauvais index du tableau car dans la boucle for du main je fais monter i de 0 à fs[0] (qui contient le "numéro" de la dernière case du tableau, donc la dernière valeur de i), après faut que je relise mon code car j'ai sûrement dû faire une faute d'étourderie.

    Je viens d'ailleurs d'utiliser new à la place de malloc, même si ça ne règle pas le problème.

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Bon, maintenant que je suis un peu plus réveillé, j'ai vu que fs était un tableau et non pas une fonction.
    (vous avez été bien charitables vous autres de ne pas me 'lavoir fait remarquer).

    Ce que tu veux faire semble simple, mais ta manière de le faire est bien compliquée (si je comprend bien ton intention).

    Primo, tu n'as pas besoin de ta variable num. Tu lis ta première ligne, avec un traitement particulier, puis tu commences ta boucle pour lire les suivantes.
    Secundo, quand tu fais un getline(), ton saut de ligne est éliminé. Pas besoin de faire un test.
    Tertio, utilise les flux.
    Quarto, utilise new[]/delete[], puis strcpy().

    Pour améliorer encore les choses :
    Quinto, utilise une fonction pour factoriser le code pour la première ligne et les autres lignes.
    Sexto (mon préféré), utilise les pointeurs intelligents.

    Tu verras que ton ton code s'en trouvera beaucoup éclairci et allégé.

    Je ne te donne que les pistes, pour l'instant. Gratte un peu.

  10. #10
    Membre confirmé
    Profil pro
    Consultant en technologies
    Inscrit en
    Octobre 2013
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies

    Informations forums :
    Inscription : Octobre 2013
    Messages : 158
    Points : 555
    Points
    555
    Par défaut
    As tu lancé ton programme dans un debugger ? (Avec visual C++ c'est très simple, sous linux tu as nemiver qui est une gui pour gdb qui lui-même n'est pas si complexe que ca en tout cas pour les fonctions de bases)
    Au pire tu as l'option du cout debugging c'est pas une bonne pratique, mais si tu sais pas utiliser un debugger ca fera l'affaire en attendant.

    Au moment du crash, repère la ligne où ca plante ca va déjà pas mal t'aider.
    Ensuire regarde l'index du tableau, et la valeur des variables au moment du crash, en général l'origne du crash devient évidente une fois que tu as toute ces infos

    new à la place de malloc
    Ca suffira pas à empecher le programme de cracher (par exemple si tu alloue la mauvaise taille dans un cas tu continuera dans l'autre) et d'ailleurs si tu ne libère pas la mémoire ca ne suffira pas

    Par contre je vois un truc qui pose problème en survolant ton code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    while(ligne[i]!=';' && i<ligne.length())
    						{
    							tmp = tmp+ligne[i];
    							i++;
    						}
    						if(i==0)
    						{
    							aps=(int*)malloc(atoi(tmp.c_str())+1);
    						}
    						aps[j]= atoi(tmp.c_str());
    Comment es-tu sur que tmp contienne un nombre ?
    En plus je crois qu'une string C doit se finir par \0 pour être valide (et donc passer correctemetn dans atoi) je suis pas sur que ta magouille de copier caractère par caractère des string C++ garde un \0 à la fin. Si il trouve pas le \0 il va continuer sortir du tableau de char et Segfault

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    0xCCCCCCCC, c'est une variable locale non-initialisée (une valeur non-initialisée sur la pile). Donc, tu as tenté de lire un pointeur non-initialisé (ou initialisé avec une valeur non-initialisée).

    Note: Si tmp ne contient pas un nombre, atoi() retournera zéro, l'appel se résumera donc à malloc(1).

    Sur les plate-formes 32 bits modernes, sizeof(int)==4. Le malloc() sera donc trop petit pour contenir ne serait-ce qu'un seul entier si tmp contient une valeur strictement inférieure à 3.
    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.

  12. #12
    En attente de confirmation mail
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 81
    Points : 68
    Points
    68
    Par défaut
    @_zzyx_ :
    En fait, le fichier contient le contenu des tableaux fs et pas sous cette forme:
    1;2;3;4;...

    Donc, si on ne tombe pas sur le caractère ';' on tombe sur un chiffre.

  13. #13
    Membre confirmé
    Profil pro
    Consultant en technologies
    Inscrit en
    Octobre 2013
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies

    Informations forums :
    Inscription : Octobre 2013
    Messages : 158
    Points : 555
    Points
    555
    Par défaut
    Donc si je comprend bien tu t'emm... à compter des caractères et à checker des caractères pour spliter une string ? Il suffit qu'il y ai une espace ou un caractère bizare pour planter ton fichier

    Tu trouveras pleins d'exemple de code sur google (Pareil pour convertir string vers int/float) sans parler de boost
    ton code devrait resembler (par exemple) à ca (Ca compilera pas out-of-the-box sauf si je suis meilleur que je le pensais, mais ca te donne une idée, par flemme j'ai mis une loop cpp11 que tu remplacera par un iterateur si besoin)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    while(getline(infile,theline) { 
      vector<string> tokens;
      tokenize(theline, tokens,";");
      for (const auto& item in tokens) { 
        aps.push_back(StringToFloat(item)); 
        }
      }
    Je te passe le code de tokenize et StringToFloat c'est des grands classiques,
    J'ai négligé la gestion d'erreurs (aux choix try/catch ou alors simplement un NaN si StringToFloat recoit autre chose qu'un nombre)
    Au fait aps tu as pas moins explicite comme nom pour tes variables, essayes de donner un nom clair à ton programme

  14. #14
    En attente de confirmation mail
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 81
    Points : 68
    Points
    68
    Par défaut
    J'ai finalement utilisé subtr() et find() ... Et ça marche !

    Voici le code final de ma fonction graphe:

    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
    graphe::graphe(char* NomFichier)
    {
        ifstream fichier(NomFichier);
        string ligne;
    	int num = 0;
     
    	/* Tableau fs */
    	getline(fichier, ligne);
     
    	/* Cherche la position de la première instance du caractère ';' dans la variabe ligne */
    	int posdep=ligne.find(';',0);
    	int size = stoi(ligne.substr(0, posdep));
     
    	fs=new int[size+1];
    	fs[0]=size;
     
    	/* On utilise posdep maintenant pour déterminer la position du premier caractère après le caractère ';' et possuiv indique la position du point virgule suivant */
    	posdep++;
    	for(int i=1; i<=size; i++)
    	{
    		string tmp;
    		int possuiv=ligne.find(';',posdep);
    		tmp = ligne.substr(posdep,possuiv);
    		posdep=possuiv+1;
     
    		fs[i]=stoi(tmp);
    	}
     
    	/* Tableau aps */
    	getline(fichier, ligne);
     
    	/* Cherche la position de la première instance du caractère ';' dans la variabe ligne */
    	posdep=ligne.find(';',0);
    	size = stoi(ligne.substr(0, posdep));
     
    	aps=new int[size+1];
    	aps[0]=size;
     
    	/* On utilise posdep maintenant pour déterminer la position du premier caractère après le caractère ';' et possuiv indique la position du point virgule suivant */
    	posdep++;
    	for(int i=1; i<=size; i++)
    	{
    		string tmp;
    		int possuiv=ligne.find(';',posdep);
    		tmp = ligne.substr(posdep,possuiv);
    		posdep=possuiv+1;
     
    		aps[i]=stoi(tmp);
     
    	}
     
    	fichier.close();
    }
    Il y a peut-être mieux mais au moins ça marche. C'est d'ailleurs _zzyx_ qui m'y a fait pensé en parlant de tokenize.

    Merci à tous de m'avoir aidé.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pourquoi le type de NomFichier n'est-il pas const char*?
    Pourquoi utiliser un tableau dynamique de int plutôt qu'un std::vector?
    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.

  16. #16
    En attente de confirmation mail
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 81
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Pourquoi le type de NomFichier n'est-il pas const char*?
    Pourquoi utiliser un tableau dynamique de int plutôt qu'un std::vector?
    Le le tpye de "NomFichier" c'est parce que je n'ai pas pensé à le mettre en const (à la limite ça ne change rien), et pour le tableau plutôt que le vecteur c'est parce que c'est imposé pour le projet que je dois faire.

  17. #17
    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
    Citation Envoyé par seb68270 Voir le message
    (à la limite ça ne change rien)
    Il ne faut pas sous-estimer l'importance de la const-correctness !!
    C'est une des choses sur quoi je reprenais le plus mes étudiants, et qu'ils négligeaient le plus parce que "pas d'intérêt", "pas important", "ça marche" !!
    Les const, dans les arguments ou les méthodes sont très importants et à ne surtout pas négliger!
    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.

  18. #18
    En attente de confirmation mail
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 81
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Il ne faut pas sous-estimer l'importance de la const-correctness !!
    C'est une des choses sur quoi je reprenais le plus mes étudiants, et qu'ils négligeaient le plus parce que "pas d'intérêt", "pas important", "ça marche" !!
    Les const, dans les arguments ou les méthodes sont très importants et à ne surtout pas négliger!
    Vous éveillez ma curiosité là ! Qu'est-ce que ça apporterait de plus que je mette la variable en const ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Repérer dès la compilation une erreur du code de la fonction, qui causerait une écriture sur les données pointées.
    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.

  20. #20
    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
    Citation Envoyé par seb68270 Voir le message
    Vous éveillez ma curiosité là ! Qu'est-ce que ça apporterait de plus que je mette la variable en const ?
    "philosophiquement", si j'apelle une fonction qui a un argument constant (par pointeur ou référence), je suis assuré que ce que je lui passe ne sera pas modifié. (sauf à avoir caché du const_cast bien crade à l'intérieur)
    Ca parait anodin, mais c'est le pacte, le contrat, que remplit ma fonction.

    A l'inverse, si l'argument n'est pas const, je n'ai absolument aucune assurance qu'il ne sera pas modifié.

    Dans le cadre d'un TP de cours qui fait 2 méthodes et 15 lignes c'est sur que ça parait stupide.
    Quand on parle d'une appli de plusieurs années et millions de lignes...
    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.

Discussions similaires

  1. Violation d'accès en lecture écriture
    Par 3Fred9 dans le forum Langage
    Réponses: 5
    Dernier message: 30/03/2010, 14h36
  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