2010-05-10 3 views
3

Хорошо, это для домашней работы о хэш-таблицах, но это простой материал, который, как я думал, я смог сделать из более ранних классов, и я вырываю волосы. Профессор недостаточно чувствителен, поэтому я решил попробовать здесь.Проблемы с инициализацией массива символов

У нас есть Hashtable фондового objects.The фондовых объектов создаются следующим образом:

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

мой конструктор выглядит следующим образом:

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); 
} 

и setSymbol выглядит следующим образом: (SetName является in indentical):

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

и он отказывается от t о выделении на линии

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

с станд :: bad_alloc. имя и символ объявлены

char * m_name; 
char * m_symbol; 

Это определенно strlen(), который сбивается с пути. И это, кажется, не происходит каждый раз.

cout << symbol << strlen(symbol); 

возвращает IBM правильно, то выходит из строя

+0

имя и символ являются переменными класса, а также параметры функции в конструкторе и метод setSymbol. Может быть, немного смущает. – quandrum

+1

Сделайте 'std :: cout << strlen (символ)' перед неудачной строкой. Убедитесь, что значение длины строки имеет смысл. –

+1

Вы должны принять соглашение об именах для ваших переменных-членов. Два популярных - 'memberVariable_' и' m_memberVariable'. Такое соглашение упростит идентификацию имен параметров и имен переменных-членов. –

ответ

1

Как это помечено C++ вы можете использовать std::string вместо того, чтобы делать все содержание указателя самостоятельно на char*?

std::string name; 
std::string symbol 

Тогда setSymbol становится легко:

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

К сожалению, это домашнее задание, и я не могу – quandrum

+4

Я так ненавижу его, когда учителя C++ требуют, чтобы ученики использовали C-способ делать что-то, кроме того, что учитель программист на C в шляпе, в которой говорится '++ '. Разумеется, важно знать, как работают струны, но когда это препятствует пониманию других понятий, в этом нет необходимости. –

+2

@Quandrum: Возможно, было бы проще сделать преобразование, чтобы проверить, исправляет ли он текущую ошибку, а затем переключается обратно. – Potatoswatter

1

Там должна быть какая-то проблема с symbol параметром при вызове

новый символ [STRLEN (символ) +1];

и strlen вернуть огромную длину, которую C++ runtime не может выделить. Если symbol неинициализирован char* Указатель в начале это довольно возможно. Это не подводит все время, не так ли?

+0

Я предполагаю, что переменные одно и тоже имя сбивают с толку. Символом в strlen (symbol) является параметр функции, который указывает на строку «IBM» на этом этапе. this-> symbol - это переменная класса, которая в данный момент является нулевым указателем. Однако это не подводит все время. Ты прав. – quandrum

+0

Глупый вопрос (я бы проверил Если у меня был компилятор, но сейчас я этого не делаю): возможно ли, что параметр «символ» и переменная экземпляра «symbol» каким-то образом запутались? Таким образом, во время выполнения strlen запускается на неинициализированной строке и дает фиктивную длину ... Интуитивно, вы могли бы подумать, что компилятор не может быть обманут, но с C++ вы никогда не знаете;) – phtrivier

+0

@phtrivier: Не глупый вопрос , Эта проблема называется переменной shadowing: http://en.wikipedia.org/wiki/Variable_shadowing –

0

Мне удалось запустить код без проблем на Cygwin, поэтому я бы предположил, что это зависит от реализации, отличая параметр symbol от члена symbol.

Вы говорите себе, что это сбивает с толку - сделайте что-нибудь об этом !!! И могу ли я предложить, никогда, никогда, именовать параметр так же, как переменная local/member. (Это не только устраняет путаницу, вам не нужно будет устранять неоднозначность переменной-члена с помощью this->.)

+0

Шахта работает без проблем иногда ... даже после того, как я изменил имена переменных, чтобы это не сбивало с толку. – quandrum

+0

ха-ха, не так запутанно. Мозг жарен. – quandrum

0

Спасибо всем, кто предложил помощь. Я прошел через это с моим профессором, и, к сожалению, я раньше переполнил массив и развратил кучу, которая проявлялась здесь.

Это был хороший разговор для меня.Это помогло мне продумать некоторые вещи, которые я только что делал. Так что спасибо снова SO'ers

Смежные вопросы