Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка в конструкторе класса 
:(
    Опции темы
T0ohtik
Дата 2.5.2008, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 9.2.2008

Репутация: нет
Всего: 1



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

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;

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

Это сообщение отредактировал(а) T0ohtik - 2.5.2008, 12:51
PM MAIL   Вверх
vinter
Дата 2.5.2008, 11:31 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Код

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

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


--------------------
Мой блог
PM MAIL WWW   Вверх
T0ohtik
Дата 2.5.2008, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 9.2.2008

Репутация: нет
Всего: 1



vinter,  что-то я не могу уловить. Есть класс, делаю его инициализацию. Для этого создаю массив чисел. И указатель на этот массив передаю в конструктор. Далее в конструкторе мы определяем размер переданного массива. Выделяем память в классе и соответственно копируем туда массив. Где одинаковая область памяти?  
PM MAIL   Вверх
Fazil6
Дата 2.5.2008, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



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

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

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

PM MAIL   Вверх
vinter
Дата 2.5.2008, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



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

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

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


--------------------
Мой блог
PM MAIL WWW   Вверх
Lazin
Дата 2.5.2008, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



не понял, а где выделение памяти? куда ты копируешь массив? и вообще зачем там 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;}
.......
};

PM MAIL Skype GTalk   Вверх
T0ohtik
Дата 2.5.2008, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 9.2.2008

Репутация: нет
Всего: 1



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

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

Или что ты имеешь в виду?smile
PM MAIL   Вверх
Carnifex
Дата 2.5.2008, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 1.5.2008

Репутация: нет
Всего: нет



T0ohtik, для статических массивов _msize не предназначен. Передавай размер в параметре конструктора.
PM MAIL   Вверх
vinter
Дата 2.5.2008, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



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

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


--------------------
Мой блог
PM MAIL WWW   Вверх
T0ohtik
Дата 2.5.2008, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 9.2.2008

Репутация: нет
Всего: 1



vinter, 
Код

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

 вот здесь выделилsmile Ты ж мне еще писал замечание в первом посте о том что я использую malloc в С++
Да все исправил, размер передаю через конструктор. Вроде все равботает!
Правда с операторм присвоения что то не так, но то совсем другая история...
Всем спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0537 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.