Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Ошибка в конструкторе класса


Автор: T0ohtik 2.5.2008, 11:00
Здравствуйте товарищи программисты! Помогите исправить ошибку в конструкторе класса:
Код

class CVeryLong
{
private:
    int *nLongNumber;
    int nCountBits;
    void reverse(int* mas);
public:
    CVeryLong(): nLongNumber(NULL), nCountBits(0)
    {}
    CVeryLong(int *nInsertNumber): nLongNumber(nInsertNumber), nCountBits(0)
    {
        nCountBits = _msize(nInsertNumber)/sizeof(int);
        nLongNumber = (int*)malloc(_msize(nInsertNumber));
        memcpy(nLongNumber,nInsertNumber,_msize(nInsertNumber));
        reverse(nLongNumber);
    }

};


Ошибка возникает в строке memcpy(nLongNumber,nInsertNumber,_msize(nInsertNumber)); Возникает она не всегда. Если в качестве указателя nInsertedNumber передать массив объявленный следующим образом: 
Код

    int *mas;
    mas = (int*)malloc(4*sizeof(int));
    mas[0] = 1;
    mas[1] = 2;
    mas[2] = 3;
    mas[3] = 4;

То все пройдет нормально. А если так:
Код

            int mas[4];
    mas[0] = 1;
    mas[1] = 2;
    mas[2] = 3;
    mas[3] = 4;

То программа вывалиается.

Автор: vinter 2.5.2008, 11:31
Код

CVeryLong(int *nInsertNumber)
    {
        nCountBits = _msize(nInsertNumber)/sizeof(int);
        nLongNumber = (int*)malloc(_msize(nInsertNumber));
        memcpy(nLongNumber,nInsertNumber,_msize(nInsertNumber));
        reverse(nLongNumber);
    }

ты написал какой то непонятный код, сначала ты получаешь два указателя указывающих в одну и ту же область, а потом пишешь из себя в себя же..
P.S пишешь на С++, пиши все на нем. Нафига malloc?

Автор: T0ohtik 2.5.2008, 11:46
vinter,  что-то я не могу уловить. Есть класс, делаю его инициализацию. Для этого создаю массив чисел. И указатель на этот массив передаю в конструктор. Далее в конструкторе мы определяем размер переданного массива. Выделяем память в классе и соответственно копируем туда массив. Где одинаковая область памяти?  

Автор: Fazil6 2.5.2008, 11:54
Цитата(T0ohtik @  2.5.2008,  11:46 Найти цитируемый пост)
Есть класс, делаю его инициализацию. Для этого создаю массив чисел. И указатель на этот массив передаю в конструктор. Далее в конструкторе мы определяем размер переданного массива. Выделяем память в классе и соответственно копируем туда массив. Где одинаковая область памяти?   

внутри конструктора нельзя по указателю определить размер массива. Передавай вместе с указателем еще и размер.
Код

CVeryLong(int *nInsertNumber, unsigned int array_size)...

Автор: vinter 2.5.2008, 12:10
Цитата(T0ohtik @  2.5.2008,  12:00 Найти цитируемый пост)
nLongNumber(nInsertNumber)

после этого действа, мы имеем два указателя указывающих на один блок в памяти
Цитата(T0ohtik @  2.5.2008,  12:46 Найти цитируемый пост)
 Выделяем память в классе

где ты память выделяешь?

Автор: Lazin 2.5.2008, 12:25
не понял, а где выделение памяти? куда ты копируешь массив? и вообще зачем там memcpy если копировать некуда))


Код

class CVeryLong
{
private:
    int *nLongNumber;
    size_t nCountBits;
public:
    CVeryLong(int *nInsertNumber, size_t len): nLongNumber( new int[len] ), nCountBits(len)
    {
        memcpy(nLongNumber, nInsertNumber, len);
        reverse(nLongNumber);
    }
    ~CVeryLong()
    { delete[] nLongNumbers;}
.......
};

Автор: T0ohtik 2.5.2008, 12:37
Ну память я выделяю для переменной, которая находится  классе. 
Код

nLongNumber = (int*)malloc(_msize(nInsertNumber));

Или что ты имеешь в виду?smile

Автор: Carnifex 2.5.2008, 12:48
T0ohtik, для статических массивов _msize не предназначен. Передавай размер в параметре конструктора.

Автор: vinter 2.5.2008, 14:54
Цитата(T0ohtik @  2.5.2008,  13:37 Найти цитируемый пост)
Ну память я выделяю для переменной, которая находится  классе. 

где?? в упор не вижу.
ну и слушай умных людей, размер передавай в конрукторе

Автор: T0ohtik 2.5.2008, 19:57
vinter, 
Код

 nLongNumber = (int*)malloc(_msize(nInsertNumber));

 вот здесь выделилsmile Ты ж мне еще писал замечание в первом посте о том что я использую malloc в С++
Да все исправил, размер передаю через конструктор. Вроде все равботает!
Правда с операторм присвоения что то не так, но то совсем другая история...
Всем спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)