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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
VenCarbon
32 / 31 / 3
Регистрация: 14.12.2010
Сообщений: 158
#1

Сделать указатель на указатель NULL - C++

24.03.2012, 18:40. Просмотров 1949. Ответов 14
Метки нет (Все метки)

есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Matrix {
private:
    double **data; //нужно, чтобы в самом начале это было NULL
    double *b; //и это тоже было NULL
    int length;
 
public:
    Matrix(int size) {
        length = size;
        data = new double*[length];
        for (int i = 0; i < length; i++) {
            data[i] = new double[size];
        }
        b = new double[size];
        return;
    }
// еще код
//...
};
int main() {
    Matrix A(10); // еще вот к этому есть вопросы...
    A.menu();
    system("PAUSE");
    return 0;
}
1. На запись
C++
1
2
3
4
private:
    double **data = NULL;
    double *b = NULL;
    int length;
Компилятор ругается, посылает нафиг и говорит что "IntelliSense: data member initializer is not allowed"
Что с этим делать?

2. А правильно ли вообще вот так говорить?..
C++
1
2
3
4
int main() {
    Matrix A(10); 
        ...
}
Во всяком случае, это работает, если запускать в VS...

Пожалуйста, поделитесь мыслями...
Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.03.2012, 18:40     Сделать указатель на указатель NULL
Посмотрите здесь:

C++ Как в связном списке присвоить NULL полю next, если тип этого поля не указатель, а ссылка?
указатель на указатель или присваивание объекта C++
Динамический массив и указатель на указатель C++
Указатель при инициализации не равен NULL C++
C++ Почему delete не устанавливает автоматически указатель в NULL?
C++ Указатель и NULL
Зачем использовать Указатель на указатель? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
24.03.2012, 18:46     Сделать указатель на указатель NULL #2
А зачем в начале NULL, если ты все равно в конструкторе заполняешь?
VenCarbon
32 / 31 / 3
Регистрация: 14.12.2010
Сообщений: 158
24.03.2012, 18:54  [ТС]     Сделать указатель на указатель NULL #3
Nekto, я в начале не заполняю, а просто создаю массив массивов.
Хм...
Да, верно, мне это потом ничем не поможет)
Суть в том, что дальше идет менюшка, что-то вроде
"Нажмите 1, чтобы заполнить матрицу;
нажмите 2, чтобы обработать матрицу
нажмите 3, чтобы вывести матрицу
..."
Если не заполнять матрицу, то (не нажимая 1, сразу нажать 3) выводятся какие-то левые, "мусорные" значения.
Я хочу сделать так, чтобы если не было заполнения матрицы, нельзя было ее выводить; чтобы просто выводилось сообщение "Нет матрицы".
HighPredator
5429 / 1812 / 332
Регистрация: 10.12.2010
Сообщений: 5,369
Записей в блоге: 3
24.03.2012, 18:56     Сделать указатель на указатель NULL #4
Цитата Сообщение от VenCarbon Посмотреть сообщение
А правильно ли вообще вот так говорить?..
C++
1
2
3
4
int main() {
* * * * Matrix A(10); 
* * * * ...
}
А что вам не нравится?
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
24.03.2012, 18:58     Сделать указатель на указатель NULL #5
Цитата Сообщение от VenCarbon Посмотреть сообщение
Если не заполнять матрицу, то (не нажимая 1, сразу нажать 3) выводятся какие-то левые, "мусорные" значения.
Я хочу сделать так, чтобы если не было заполнения матрицы, нельзя было ее выводить; чтобы просто выводилось сообщение "Нет матрицы".
Запускай с параметром 0, например. И в конструкторе на случай входа "0" приравнивай к NULL. Я бы создание вообще отдельной функцией написал и в конструкторе вызывал её с нужным параметром. И в этой функции проверку, выделена ли память, если выделена, то освободить, а потом уже выделять.
HighPredator
5429 / 1812 / 332
Регистрация: 10.12.2010
Сообщений: 5,369
Записей в блоге: 3
24.03.2012, 18:58     Сделать указатель на указатель NULL #6
Цитата Сообщение от VenCarbon Посмотреть сообщение
Если не заполнять матрицу, то (не нажимая 1, сразу нажать 3) выводятся какие-то левые, "мусорные" значения.
Это означает, что плохо написан вывод матрицы. А мусор там потому, что память выделена, но лично вы туда ничего не писали, поэтому как говорится "что бог послал".
VenCarbon
32 / 31 / 3
Регистрация: 14.12.2010
Сообщений: 158
24.03.2012, 19:08  [ТС]     Сделать указатель на указатель NULL #7
HighPredator, да стрёмно как-то выглядит... Не нравится... Кажется, что так никто не делает.

Добавлено через 6 минут
Цитата Сообщение от HighPredator Посмотреть сообщение
Это означает, что плохо написан вывод матрицы. А мусор там потому, что память выделена, но лично вы туда ничего не писали, поэтому как говорится "что бог послал".
Поэтому я и хотела сделать начальные значения указателей NULL'ами, чтобы сделать проверку. Но мысль была плохая...

Цитата Сообщение от Nekto Посмотреть сообщение
Запускай с параметром 0, например. И в конструкторе на случай входа "0" приравнивай к NULL. Я бы создание вообще отдельной функцией написал и в конструкторе вызывал её с нужным параметром. И в этой функции проверку, выделена ли память, если выделена, то освободить, а потом уже выделять.
Да, наверное... Только тогда не совсем понятно, почему это должна быть отдельная функция.)
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
24.03.2012, 19:11     Сделать указатель на указатель NULL #8
Цитата Сообщение от VenCarbon Посмотреть сообщение
Да, наверное... Только тогда не совсем понятно, почему это должна быть отдельная функция.)
Привычка
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
24.03.2012, 19:33     Сделать указатель на указатель NULL #9
На сколько знаю, в C++ NULL == 0 или 0L. И С++ принято инициализировать указатели нулем. NULL оставлен для наследуемого кода от С.

Добавлено через 4 минуты
C++
1
2
3
4
5
6
Matrix(int size) 
        : length( size ), data( new double*[ length ]), b( new double[ size ]) {
                for (int i = 0; i < length; i++) {
                        data[i] = new double[size];
                }
        }
Добавлено через 5 минут
Вот так лучше, для обнуления:
C++
1
2
3
4
5
6
7
8
9
Matrix( int size ) 
        : length( size ), data( new double*[ length ]), b( new double[ size ]) {
    for (int i = 0; i < length; i++) {
        data[i] = new double[size];
 
        for ( int j = 0; i < size; j++ )
             data[ i ][ j ] = 0;
    }
}
Jupiter
Каратель
Эксперт C++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.03.2012, 22:36     Сделать указатель на указатель NULL #10
Цитата Сообщение от Toshkarik Посмотреть сообщение
Вот так лучше, для обнуления:
достаточно
C++
1
data[i] = new double[size]();
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
25.03.2012, 14:48     Сделать указатель на указатель NULL #11
Jupiter, то есть автоматически будут нули?
Avazart
7045 / 5222 / 259
Регистрация: 10.12.2010
Сообщений: 22,955
Записей в блоге: 17
25.03.2012, 15:00     Сделать указатель на указатель NULL #12
Вариант
1. В конструкторе присваивать NULL, а в специальном методе устанавливать значения и создавать матрицу
2. В конструкторе присваивать 0 каждому элементу матрицы как предложено выше.
VenCarbon
32 / 31 / 3
Регистрация: 14.12.2010
Сообщений: 158
25.03.2012, 15:13  [ТС]     Сделать указатель на указатель NULL #13
проблема решилась переписыванием конструктора:
C++
1
2
3
4
5
6
    Matrix() {
        data = 0;
        b = 0;
        length = 0;
        return;
    }
и добавлением новой функции creation:
C++
1
2
3
4
5
6
7
8
void creation(int size) {
        length = size;
        data = new double*[length];
        for (int i = 0; i < length; i++) {
            data[i] = new double[size]();
        }
        b = new double[size];
    }
Спасибо за помощь!)
Avazart
7045 / 5222 / 259
Регистрация: 10.12.2010
Сообщений: 22,955
Записей в блоге: 17
25.03.2012, 15:29     Сделать указатель на указатель NULL #14
Указатели потенциальные места ошибок поэтому рекомендуется писать NULL вместо 0,
для машины может и пофиг, но для человека NULL лучше читается.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2012, 17:11     Сделать указатель на указатель NULL
Еще ссылки по теме:

C++ Указатель на указатель и Нарушение прав доступа
C++ Как работает нулевой указатель null
C++ Указатель на указатель внутри структуры
Указатель на указатель заполнение матрицы C++
Указатель на указатель заполнение матрицы C++

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

Или воспользуйтесь поиском по форуму:
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
25.03.2012, 17:11     Сделать указатель на указатель NULL #15
Avazart, дело не в машине. Где то читал, не могу вспомнить, что в C++ принято писать 0 вместо NULL, У Дейтелов вроде читал. Хотя это дело привычки и стиля наверно больше.

Да, нашел именно у них:
Указатели должны инициализироваться либо при объявлении, либо путем
присваивания. Указатель можно инициализировать значением либо адресом.
Указатель со значением 0 или NULL ни на что не указывает и называется
нулевым указателем. Символическая константа NULL определяется в
заголовочном файле <iostream> (и некоторых других заголовочных файлах
стандартной библиотеки) и представляет значение 0. Инициализация указателя
константой NULL эквивалентна инициализации значением 0, но в C++
принято инициализировать указатели нулем. Когда присваивается значение 0, оно
преобразуется в указатель соответствующего типа. Нуль — единственное
целое значение, которое можно непосредственно присвоить
переменной-указателю, не приводя предварительно целое к типу указателя.
Добавлено через 4 минуты
Дело, как я понял, в том, что NULL в С++ это целочисленная переменная. При присваивании получается неявное преобразование типа NULL к типу указателя.
Yandex
Объявления
25.03.2012, 17:11     Сделать указатель на указатель NULL
Ответ Создать тему
Опции темы

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