2009-12-01 8 views
1

Итак, я разрабатывал класс полиномов, в который пользователь вводит: 1x^0 + 2x^1 + 3x^2 ... и 1,2,3 (коэффициенты) хранятся в int arrayПерегрузка C++ * для полиномиального умножения

Мои перегруженные + и - функции работают, однако, * не работают. Независимо от ввода, он всегда показывает -842150450
, когда должно быть (5x^0 + x^1) * (-3x^0 + x^1) = -15x^0 + 2x^1 + 1x^2
или (х + 5) (х-3) = х^2 + 2x - 15

Я использую перегруженный * функции, как: Polynomial multiply = one * two;
Im угадывание проблемы является strtol (р, & endptr , 10), так как он использует длинную Int, однако, добавление и вычитание работает отлично

Мой конструктор

Polynomial::Polynomial(char *s) 
{ 
    char *string; 
    string = new char [strlen(s) + 1]; 
    int length = strlen(string); 
    strcpy(string, s); 

    char *copy; 
    copy = new char [length]; 
    strcpy(copy, string); 

    char *p = strtok(string, " +-"); 
    counter = 0; 
    while (p) 
    { 
     p = strtok(NULL, " +-"); 
     counter++; 
    } 

    coefficient = new int[counter]; 

    p = strtok(copy, " +"); 
    int a = 0; 
    while (p) 
    { 
     long int coeff; 
     char *endptr; 
     coeff = strtol(p, &endptr, 10); //stops at first non number 
     if (*p == 'x') 
      coeff = 1; 

     coefficient[a] = coeff; 
     p = strtok(NULL, " +"); 
     a++; 
    } 
} 

и перегруженный * Функция

Polynomial Polynomial::operator * (const Polynomial &right) 
{ 
    Polynomial temp; 

    //make coefficient array 
    int count = (counter + right.counter) - 1; 
    temp.counter = count; 
    temp.coefficient = new int [count]; 
    for (int i = 0; i < counter; i++) 
    { 
     for (int j = 0; j < right.counter; j++) 
      temp.coefficient[i+j] += coefficient[i] * right.coefficient[j]; 
    } 
    return temp; 
} 

И Heres мой весь код: http://pastie.org/721143

+0

И вопрос: –

+0

Мои перегруженные + и - функции работают, однако, перегруженные * не работают. Независимо от ввода, он всегда показывает -842150450 – Raptrex

+1

Я скачал ваш код с сайта pastie.org, скомпилировал его с g ++ 4.4.1, и он работает просто отлично. Требуется некоторая проверка ошибок. – divegeek

ответ

7

Вы, кажется, не Инициализируем temp.coefficient[i+j] к нулю в вашем operator *().

temp.coefficient = new int [count]; 
std::memset (temp.coefficient, 0, count * sizeof(int)); 
+1

Более простой способ сделать это в одном утверждении - это 'new int [count]()', который будет инициализировать по умолчанию каждый элемент. –

+0

Спасибо, это решило. Почему мне пришлось добавить std: memset ... – Raptrex

+0

Пожалуйста, посмотрите мой ответ, ваш код не «безопасен» для работы повсюду даже с этим исправлением. – Earlz

1

ли

temp.coefficient = new int [count]; 

даст вам множество нулей?

В противном случае в вашем цикле вы добавляете материал для мусора.

5

Конвертировать -842150450 в hex, чтобы найти один из magic values, используемый в CRT в отладочной сборке. Это помогает найти ошибку в коде:

temp.coefficient = new int [count]; 
    // Must initialize the memory 
    for (int ix = 0; ix < count; ++ix) temp.coefficient[ix] = 0; 

Есть много другой Bugz Кстати, фиксируя их удачи.

+0

Хорошая ссылка. +1 для вас –

+1

Это довольно неэффективный способ инициализации массива. Вместо этого используйте 'memset' или явный инициализатор в' new [] '. –

+0

Взгляните на сгенерированный код этого цикла в сборке Release. –

1

Заменить

temp.coefficient = new int [count]; 

от

temp.coefficient = new int [count](); 

для того, чтобы инициализировать нуля значения массива.