Exception levée , violation d'acces en lecture

Fermé
zz770 Messages postés 1 Date d'inscription mercredi 18 juillet 2018 Statut Membre Dernière intervention 18 juillet 2018 - Modifié le 18 juil. 2018 à 12:24
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 - 19 juil. 2018 à 08:17
bonjour, j'ai un programme a faire et je l'ai deja commencer mais arriver un moment ce message d'erreur apparait et je ne sais pas pourquoi. Le programme consiste a creer une base de donnée contenant des bus avec pour infomatation le numero de ligne , nombre de station et durée du trajet.
le programme se decoupe en plusieurs fonction et je suis en train de creer la fonction qui consiste a rajouter une ligne de bus au systeme.
Si le numero de ligne de bus existe deja , un message d'erreur apparait , sinon elle est creer dans le systeme et par la suite le systeme se trie par ordre croissant des ligne de bus.

voici le code :

#include <iostream>
using namespace std;

#define MAX 10

void addline(int(*ptr)[3], int &nombredeligne);
bool search(int ligne, int(*ptr2)[3], int &nombredeligne);




void main()
{
 int bus[MAX][3],nombredeligne;
 int(*ptr)[3] = bus; 
 




 addline(bus, nombredeligne);
 


 for (int i = 0; i < MAX; i++)
 {
  for (int j = 0; j < 3; j++)
  {
   cout<<   *(*(ptr+i)+j )       <<" ";
  }
  cout << endl;
 }


 system("pause");
}




void addline(int (*ptr)[3], int &nombredeligne)
{
 bool ok = true;
 int ligne, station, temps, (*ptr2)[3];
 ptr2 = ptr;

 cout << "entrez le numero de ligne : ";
 cin >> ligne;
 cout << "entrez le nombre de station : ";
 cin >> station;
 cout << "entrez la duree du trajet : ";
 cin >> temps;

 ok = search(ligne,ptr,nombredeligne);

 if (ok == false)
  cout << "ce numero de ligne existe deja ! "<<endl;
 else
 {


*(*(ptr + nombredeligne)+0) = ligne;

*(*(ptr + nombredeligne) + 1) = station;

*(*(ptr + nombredeligne) + 2) = temps;
  nombredeligne++;

  for (int g = 0; g < nombredeligne; g++)
  {
   for (int f = g+1; f < nombredeligne; f++)
   {
    if (*(*(ptr + g)) > *(*(ptr + f)))
    {
     for (int m = 0; m < 3; m++)
     {


*(*(ptr2 + g) + m) = *(*(ptr + g) + m);

*(*(ptr + g) + m) = *(*(ptr2 + f) + m);

*(*(ptr + f) + m) = *(*(ptr2 + g) + m);
     }
    }
   }
  }
  cout << "votre ligne a bien ete ajoutee ! " << endl << endl;
 }

 
}


bool search(int ligne,int (*ptr2)[3],int &nombredeligne)
{

 for (int i = 0; i < nombredeligne; i++)
 {
  if (*(*(ptr2+i))== ligne)
   return false; 
 }
 return true;

}

pendant l'execution , apres que j'ai rentree mes valeur le programme m'affiche le message d'erreur par rapport a ptr en ligne 60 et je ne comprend pas pourquoi !


merci d'avance !

1 réponse

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
18 juil. 2018 à 22:23
Bonjour,

Ligne 62 de ton code, ligne 40 du mien. A ton avis quelle est la valeur de
nombredeligne
dès le début du programme?

En changeant les notations pour une syntaxe plus claire, et en ôtant des variables égales dupliquées ton code s'écrit :
#include <iostream>
using std::cout;
using std::cin;
using std::endl;

constexpr int MAX = 10;

void addline( int ptr[][3], int &nombredeligne );
bool search( int ligne, int ptr2[][3], int nombredeligne );

int main() {
   int bus[MAX][3], nombredeligne;

   addline( bus, nombredeligne );

   for ( int i = 0; i < MAX; i++ ) {
      for ( int j = 0; j < 3; j++ ) {
         cout << bus[i][j] <<" ";
      }
      cout << endl;
   }
   system( "pause" );
}

void addline( int ptr[][3] , int &nombredeligne ) {
   int ligne, station, temps;

   cout << "entrez le numero de ligne : ";
   cin >> ligne;
   cout << "entrez le nombre de station : ";
   cin >> station;
   cout << "entrez la duree du trajet : ";
   cin >> temps;

   bool ok = search( ligne, ptr, nombredeligne );

   if ( !ok )
      cout << "ce numero de ligne existe deja ! "<<endl;
   else {
      ptr[nombredeligne][0] = ligne;
      ptr[nombredeligne][1] = station;
      ptr[nombredeligne][2] = temps;
      nombredeligne++;

      for ( int g = 0; g < nombredeligne; g++ ) {
         for ( int f = g+1; f < nombredeligne; f++ ) {
            if ( ptr[g][0] > ptr[f][0] ) {
               for ( int m = 0; m < 3; m++ ) {
                  //ptr[g][m] = ptr[g][m];
                  ptr[g][m] = ptr[f][m];
                  ptr[f][m] = ptr[g][m];
               }
            }
         }
      }
      cout << "votre ligne a bien ete ajoutee !\n" << endl;
   }
}

bool search( int ligne , int ptr2[][3] , int nombredeligne ) {
   for ( int i = 0; i < nombredeligne; i++ ) {
      if ( ptr2[i][0] == ligne )
         return false;
   }
   return true;
}
C'est encore de la syntaxe C à 99%, mais ça me pique moins les yeux, ça serait plus simple en C++. Je n'ai rien changé, mais les problèmes devraient être plus visibles.
0
Oui le probleme c'est que l'exercice m'impose l'utilisation de pointeur dans toutes mes utilisation du tableau , modification ou affichage. Et nombredeligne vaut 0 a la base.
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101 > Zz770
19 juil. 2018 à 08:17
Et nombredeligne vaut 0 a la base.

où est cette ligne qui la met à 0?
0