Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
antake
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 29
#1

Присвоить NULL массиву - C++

16.10.2013, 09:25. Просмотров 825. Ответов 11
Метки нет (Все метки)

Здравствуйте!
Есть код:
C++
1
2
matrix();
clear();
В классе matrix объявлен указатель
C++
1
 unsigned char* data;
.
В конструкторе matrix() есть строка data = NULL;

Когда захожу в функцию clear, data уже не равен нулю! Дебаггер показывает, что он указывает на значение 0'', имеет ненулевой адрес!

Подскажите, пожалуйста, в чем дело?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.10.2013, 09:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Присвоить NULL массиву (C++):

Присвоить значения массиву символов - C++
простейший вопрос, но где-то ошибся... char TestArr; TestArr = { +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, + } ; //...

Как присвоить массиву значение суммы? - C++
Вычислить сумму элементов матрицы по столбцам . Найти наименьшую сумму. #include <iostream> #include <math.h> using namespace std; ...

Как присвоить двумерному символьному массиву значение? - C++
Проблема в строке 18. Как будет правильно? #include <cstdio> int main() { char buf; int i,j,N,time,t,k,buftime,m; ...

Не получается присвоить значение двумерному массиву char - C++
объявляю двумерный массив (массив массивов в char для хранения имен файлов) в cpp файле char m_fname ; я хочу инициализировать...

Как правильно массиву объектов присвоить ссылки на объекты. - C++
TPoint Point,*p_Point; p_Point = Point; TPoint Mass; for (i=0; i<10; i++) { Mass = p_Point; //вот не задвоятся ли у меня...

Как присвоить массиву Char строку TextBox->Text ? - C++
Как сделать ?

11
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
16.10.2013, 10:01 #2
может быть Вы ему значение присваиваете между вызовами Matrix() и Clear()
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,533
Завершенные тесты: 1
16.10.2013, 10:49 #3
Цитата Сообщение от antake Посмотреть сообщение
имеет ненулевой адрес
Нууу тут не все так просто. Если в си без плюсов можно было присваивать указатель на void любому указателю, то в плюсах нельзя. Плюсовой компилятор сам подставит на свой вкус значение этому макросу. В лучшем случае ноль.
NULL

С вики: NULL - прям первый абзац.

А решение:
C++
1
nullptr
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
16.10.2013, 11:09 #4
А каким образом связан конструктор matrix и функция clear ? Мне отчего-то кажется, что здесь простое непонимание происходящего....
antake, ты не мог бы привести минимальный пример кода, воспроизводящего проблему?
0
antake
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 29
16.10.2013, 11:18  [ТС] #5
Да, конечно:

C++
1
2
3
4
5
6
7
        // Default constructor
        template<typename T> matrix<T>::matrix ()
        {
            data = NULL;
            rows = 0;
            columns = 0;
        }
C++
1
2
3
4
5
6
        template<typename T> matrix<T>::matrix (const shared_ptr<Mat> X)
        {   
            matrix<T>();
            setMatrix( X );
 
        }
C++
1
2
3
4
5
6
7
8
9
10
11
12
template<typename T> void matrix<T>::setMatrix( const shared_ptr<Mat> mat )
        {
            clear();
                      .........
                 }
        template<typename T> void matrix<T>::clear()
        {
                delete[] data;
                data = NULL; // it doesn't work..., see function setMatrix
                rows = 0;
                columns = 0;
        }
Добавлено через 2 минуты
Спасибо за ответы, я подозреваю, что действительно проблема в макросе NULL ( который у меня объявлен как 0), но пока другим занят, не проверил.

data становится ненулевой уже после выхода из дефолтного конструктора
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,533
Завершенные тесты: 1
16.10.2013, 11:21 #6
Цитата Сообщение от antake Посмотреть сообщение
data становится ненулевой
Суть не в том, чтобы сделать ее именно непременно нулевой, а только в том, чтобы она больше не указывала ни на один объект.

А с nullptr что дебаггер говорит?
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
16.10.2013, 11:54 #7
А не очень даже важно, что он говорит. Дело не в NULL и не в nullptr.

Дело вот в этом коде:
C++
1
2
3
4
5
6
        template<typename T> matrix<T>::matrix (const shared_ptr<Mat> X)
        {   
            matrix<T>();
            setMatrix( X );
 
        }
antake, ты думаешь, после выполнения строки matrix<T>(); у тебя будет data == NULL ? Нет. Потому что matrix<T>(); - это создание безымянного объекта типа matrix<T> ! И этот безымянный объект не имеет никакого отношения к тому объекту, для которого потом будет вызван setMatrix.... Разумеется, поэтому и data содержит мусор.

Тебе нужен немного другой синтаксис, доступный в C++11 (но не в более раннем C++03!):
C++
1
2
3
4
5
6
        template<typename T> matrix<T>::matrix (const shared_ptr<Mat> X):
            matrix<T>()
        {   
            setMatrix( X );
 
        }
1
Fyret
185 / 171 / 13
Регистрация: 30.07.2013
Сообщений: 359
16.10.2013, 11:56 #8
NULL, конечно, может и не быть нулем, но вероятность этого (на форуме С++ для начинающих) ничтожна.
Меня другое забавляет. Вот в этом некоем подобии копирующего конструктора
C++
1
2
3
4
5
template<typename T> matrix<T>::matrix (const shared_ptr<Mat> X)
{   
    matrix<T>();
    setMatrix( X );
}
создается временный объект maxtrix<T>(). А поле data собственно создаваемого объекта никто не обнуляет. Так с чего бы ему быть NULL'ом?
1
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.10.2013, 12:02 #9
Цитата Сообщение от antake Посмотреть сообщение
data становится ненулевой уже после выхода из дефолтного конструктора
правильно ли я понял:
C++
1
2
matrix<int> m;
cout << m.data << endl; // выведет отличное от 0 значение?
Добавлено через 3 минуты
P.S. похоже ТС запутался с конструкторами.
Цитата Сообщение от CheshireCat Посмотреть сообщение
Тебе нужен немного другой синтаксис, доступный в C++11 (но не в более раннем C++03!):
Придется обойтись функцией инициализации тогда.
1
antake
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 29
16.10.2013, 12:04  [ТС] #10
ААА, спасибо!)

даже стыдно немного стало)
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
16.10.2013, 12:10 #11
Он может вывести все, что угодно. Разыменование NULL-указателя - это UB по Стандарту.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.10.2013, 12:29 #12
Цитата Сообщение от CheshireCat Посмотреть сообщение
Он может вывести все, что угодно. Разыменование NULL-указателя - это UB по Стандарту.
Если это ответ на моё сообщение, то разыменования не происходит, мы просто выводим адрес.
0
16.10.2013, 12:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2013, 12:29
Привет! Вот еще темы с ответами:

Как правильно присвоить значение NULL - C++
Есть класс:struct TPointR3 { float r0; float r1; float r2; }; struct TPointR2 { float r0;

Надо присвоить значения массива а массиву b с помощю функции, и указателей - C++
Надо присвоить значения массива а массиву b с помощю функции, и указателей... Я написал, но не работет... В чём дело? #include...

Можно ли значения двумерного динамического массива присвоить обыкновенному двумерному массиву? - C++
Столкнулся с проблемой с динамическими массивами, можно ли значения двумерного динамического массива присвоить обыкновенному двумерному...

Как в связном списке присвоить NULL полю next, если тип этого поля не указатель, а ссылка? - C++
Друзья! В общем, надо реализовать связный список и понятно, последний элемент должен содержать адрес NULL, вот ломаю голову как это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru