2010-09-23 15 views
0

Hé les gars, j'écrivais du code et j'ai trouvé une erreur particulière. La fonction convert_vector2d (& i_scale) convertit une chaîne en vector2d (hérite de sf :: vector2f). Si vous examinez les prochaines lignes de code, je fais deux fois la même opération.stocker les valeurs de retour puis en utilisant vs en utilisant directement C++

Code: Tout sélectionner

float x = convert_Vector2D(&i_scale).x; 
float y = convert_Vector2D(&i_scale).y; 
object.SetScale((convert_Vector2D(&i_scale))); 
ss = object.GetScale(); 
object.SetScale(x , y); 
ss = object.GetScale(); 

première fois que j'appelle setScale avec le vecteur de retour de convert_vector2d et ss = 1,1. J'appelle encore object.setScale cette fois avec x, y (les résultats stockés) et quand j'appelle object.getScale je reçois ss = 1,2 (ce qui est attendu/correct). J'ai franchi la fonction de conversion et renvoie 1,2 par les deux appels de fonction.

Code: Tout sélectionner

const Vector2D Map::convert_Vector2D(std::string * string_to_convert) 
{ 
    size_t foundit = 0; 
    Vector2D temp; 
    std::string one, two; 
    if((foundit = string_to_convert->find(',')) != std::string::npos && 
     string_to_convert->find_first_of(',') == string_to_convert->find_last_of(',')) // only one comma per line. 
    { 
     one = string_to_convert->substr(0, foundit); 
     two = string_to_convert->substr(foundit+1, string_to_convert->size()); // +1 to skip over the comma. 

     temp.x = (float)strtod(one.c_str(), NULL); 
     temp.y = (float)strtod(two.c_str(), NULL); 

     check_conversion_errors_vector2d(temp, string_to_convert); 
    } 
    else 
    { 
     Debugger::print("MapLoader: Error: more then one comma on line %d of file %s. Stopping reading of file.\n", 
      i_Current_Line, mMapName.c_str()); 
     i_QuitParsing = true; // TODO: maybe add return after this line? 
    } 

    return temp; 
} 

Toutes les idées sur la raison pour laquelle j'obtenir un comportement différent?

void Drawable::SetScale(float ScaleX, float ScaleY) 
{ 
    SetScaleX(ScaleX); 
    SetScaleY(ScaleY); 
} 

void Drawable::SetScale(const Vector2f& Scale) 
{ 
    SetScaleX(Scale.x); 
    SetScaleY(Scale.y); 
} 

void Drawable::SetScaleX(float FactorX) 
{ 
    if (FactorX > 0) 
    { 
      myScale.x  = FactorX; 
      myNeedUpdate = true; 
      myInvNeedUpdate = true; 
    } 
} 


void Drawable::SetScaleY(float FactorY) 
{ 
    if (FactorY > 0) 
    { 
      myScale.y = FactorY; 
      myNeedUpdate = true; 
      myInvNeedUpdate = true; 
    } 
} 

constructeurs de copie SFML et les variables membres:

// = equals operator assignment 
Vector2D& operator=(const Vector2D &rhs) 
{ 
    if(this == &rhs) 
    { 
     return *this; 
    } 
    else 
    { 
     this->x = rhs.x; 
     this->y = rhs.y; 
     return *this; 
    } 
} 
// = equals operator assignment 
Vector2D& operator=(const sf::Vector2f &rhs) 
{ 
    this->x = rhs.x; 
    this->y = rhs.y; 
    return *this; 
} 

float x, y; 
+0

A quoi ressemblent les deux fonctions 'SetScale()'? –

+0

ajouté à l'article original. –

+1

Pouvez-vous nous montrer le code pour 'Vector2f' et' Vector2D' (spécifiquement, les variables membres, et les constructeurs de copie que vous avez)? Je soupçonne que vous pourriez avoir des membres nommés 'x' et' y' déclarés dans les deux. – Doug

Répondre

0

Ne pas Allouer Vector2D sur la pile, faites-le sur le tas avec de nouveaux. Votre référence à temp en dehors de la fonction est indéfinie, susceptible d'être garbage.

+0

Je renvoie la valeur, en retournant la valeur je pensais que je ne faisais plus référence à la variable temp stockée sur la pile, car elle a été retournée? –

+2

@Ben: vous l'utilisez correctement. Je soupçonne que l'utilisateur a mal lu votre code. :) –

+0

Très diplomatique Jonathan, j'ai codé en Java trop longtemps mes fils de cerveau se sont croisés ... – user318904