2010-05-10 5 views
3

Ok, ceci est fait pour les devoirs sur les hashtables, mais c'est la chose simple que je pensais pouvoir faire dans les classes précédentes, et je me suis arraché les cheveux. Le professeur n'est pas assez réactif, alors j'ai pensé que j'essaierais ici.Avoir des problèmes avec l'initialisation du tableau de caractères

Nous avons une table de hachage d'objets Stock objets.Le sont créés comme ceci:

stock("IBM", "International Business Machines", 2573, date(date::MAY, 23, 1967))

mon constructeur ressemble:

stock::stock(char const * const symbol, char const * const name, int sharePrice, date priceDate): m_symbol(NULL), m_name(NULL), sharePrice(sharePrice), dateOfPrice(priceDate) 
{  
setSymbol(symbol); 
setName(name); 
} 

et setSymbol ressemble à ceci: (setName est indentical):

void stock::setSymbol(const char* symbol) 
{ 
if (m_symbol) 
    delete [] m_symbol; 
m_symbol = new char[strlen(symbol)+1]; 
strcpy(m_symbol,symbol); 
} 

et il refuse t o allouer sur la ligne

m_symbol = new char[strlen(symbol)+1];

avec un std :: bad_alloc. le nom et le symbole sont déclarés

char * m_name; 
char * m_symbol; 

C'est certainement strlen() qui s'égare. Et ça ne semble pas arriver à chaque fois.

cout << symbol << strlen(symbol); 

retourne IBM correctement, puis se bloque

+0

nom et le symbole sont des variables de classe, ainsi que les paramètres de fonction dans le constructeur et la méthode setSymbol. Peut-être un peu confus. – quandrum

+1

Faites un 'std :: cout << strlen (symbole)' avant la ligne qui échoue. Vérifiez que la valeur de longueur de chaîne a du sens. –

+1

Vous devriez adopter une convention de nommage pour vos variables membres. Deux populaires sont 'memberVariable_' et' m_memberVariable'. Une telle convention facilitera la distinction des noms de paramètres et des noms de variables membres. –

Répondre

1

Comme il est marqué C++ peut vous utiliser std::string au lieu de faire tout l'entretien du pointeur vous sur char*?

std::string name; 
std::string symbol 

Alors setSymbol devient facile:

void stock::setSymbol(const char* symbol) 
{ 
    this->symbol = symbol; 
} 
+0

Malheureusement, ce sont les devoirs et je ne peux pas – quandrum

+4

Je déteste tellement ça quand les professeurs C++ demandent aux étudiants d'utiliser la méthode C de faire les choses, pour aucune autre raison que l'enseignant est un programmeur C portant un chapeau qui dit '++ '. Il est certainement utile de savoir comment fonctionnent les chaînes, mais quand cela entrave la compréhension d'autres concepts, il n'y a aucune raison de l'exiger. –

+2

@Quandrum: Il pourrait être plus facile de faire la conversion juste pour voir si elle corrige le bogue actuel, puis revenir en arrière. – Potatoswatter

1

Il doit y avoir un problème avec symbol paramètre au moment où vous appelez

nouveau char [strlen (symbole) +1];

et strlen renvoient une longueur énorme que C++ Runtime est incapable d'allouer. Si symbol est non initialisé char* pointeur au début c'est assez possible. Il n'échoue pas tout le temps, n'est-ce pas?

+0

Je suppose que d'avoir les variables du même nom est source de confusion. Le symbole dans strlen (symbole) est le paramètre de la fonction, qui pointe vers la chaîne "IBM" à ce stade. Ce symbole est une variable de classe, qui est un pointeur nul à ce stade. Cependant, il n'échoue pas tout le temps. Vous avez raison. – quandrum

+0

Une question idiote (je testerais Si j'avais un compilateur sous la main mais pas maintenant): est-il possibel que le paramètre 'symbol' et la variable d'instance 'symbol' soient mélangés? Donc, à l'exécution, strlen s'exécuterait sur une chaîne non-initialisée et donnerait une longueur fictive ... Intuitivement, on pourrait penser que le compilateur ne peut pas être berné, mais avec C++, on ne sait jamais;) – phtrivier

+0

@phtrivier: Pas une question idiote . Ce problème est appelé "shadow shadowing": http://en.wikipedia.org/wiki/Variable_shadowing –

0

J'ai pu exécuter le code sans problèmes sur Cygwin, donc je suppose que c'est quelque chose qui dépend de l'implémentation en distinguant le paramètre symbol du membre symbol.

Vous vous dites que c'est déroutant - bien faire quelque chose à ce sujet !!! Et puis-je suggérer, jamais plus jamais, de nommer un paramètre de la même manière qu'une variable locale/membre. (Non seulement cela élimine la confusion, vous n'avez pas besoin de désambiguïser la variable membre avec this->.)

+0

Mine s'exécute sans problème parfois ... même après avoir changé les noms des variables pour qu'il ne soit pas déroutant. – quandrum

+0

haha, pas si confus. Cerveau frit. – quandrum

0

Merci à tous ceux qui ont offert de l'aide. J'y suis allé avec mon professeur, et malheureusement je débordais un tableau plus tôt et je corrompais le tas, qui se manifestait ici.

C'était une bonne conversation pour moi cependant.Cela m'a aidé à réfléchir à certaines choses que je venais de faire. Donc merci encore SO'ers

Questions connexes