Question

J'utilise l'opérateur () comme opérateur de cette façon indice:

double CVector::operator() (int i) const
{
 if (i >= 0 && i < this->size)
  return this->data[i];
 else
  return 0;
}

double& CVector::operator() (int i)
{
 return (this->data[i]);
}

Il fonctionne quand je reçois des valeurs, mais je reçois une erreur lorsque je tente d'écrire attribuer une valeur à l'aide

a(i) = 1;

UPD: Texte d'erreur:

  

exception non gérée à 0x651cf54a   (Msvcr100d.dll) dans CG.exe: 0xC0000005:   Accès emplacement de lecture de violation   0xccccccc0.

Était-ce utile?

La solution

Comme je l'ai dit dans mon commentaire, le problème est votre conception défectueuse. Je fais une garantie de 100% sur l'une des deux choses:

  1. La valeur que vous passez à la fonction d'affectation est hors de portée valide.
  2. Le data membre est orientée vers l'espace en mémoire invalide.

Dans les deux cas, je vous suggère d'ajouter:

#include <cassert>

et en ajoutant assert(i >= 0 && i < this->size) au lieu des échecs silencieux:

double CVector::operator() (int i) const
{
    assert(i >= 0 && i < this->size);
    return this->data[i];
}

double& CVector::operator() (int i)
{
    assert(i >= 0 && i < this->size);
    return (this->data[i]);
}

Autres conseils

C'est parce que vous n'avez pas le traitement des erreurs mises en œuvre dans double& CVector::operator() (int i) comme vous l'avez fait pour l'autre fonction qui surchargent ().

Changer à:

double& CVector::operator() (int i)
{
 if (i >= 0 && i < this->size)
 {
  return this->data[i];
 }
 else // Whatever manner you want to gracefully exit the program
 {
  std::cout<<"Out of bounds!"<<endl;
  exit(1);
 }
}

Vous devriez également envisager de modifier le mécanisme de gestion des erreurs dans l'autre fonction de return 0; à quelque chose de plus significatif.

  

exception non gérée à 0x651cf54a   (Msvcr100d.dll) dans CG.exe: 0xC0000005:   Accès emplacement de lecture de violation   0xccccccc0.

0xcc est la valeur de l'octet de la mémoire non initialisée MSVC. En d'autres termes, votre problème est probablement dû à l'accès à un pointeur non initialisé ou un pointeur qui a été dérivé de la mémoire non initialisée.

Le problème est que vous ne cochez pas pour l'indice hors de portée dans votre version de double& operator().

Vous ne pouvez probablement pas garantir que les points de data[i] à une adresse mémoire valide pour une assez grande i. Vous devriez vérifier soit index hors de portée et de jeter une exception ou redimensionner votre vecteur (en allouant plus de mémoire ne data) pour pouvoir tenir plus de valeurs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top