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

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

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

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

24.03.2012, 18:40. Просмотров 2022. Ответов 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++):

Как получить ссылку на указатель или указатель на указатель в массиве? - C++
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив) - C++
Изучаю c++ по одной книжке.Она говорить не умеет.. Так вот понадобилось написать функцию,которая как параметр получает указатель на...

Указатель и NULL - C++
Почему программа выдает сообщение &quot;NOT NULL&quot; ? #include &lt;iostream&gt; using namespace std; void func(int *); int...

Указатель при инициализации не равен NULL - C++
Здравия желаю!:) myClass myClass::operator=(myClass iniOb) { char *temp; //Указатель на копию массива из объекта iniOb ...

Как работает нулевой указатель null - C++
int x = NULL; указывает на то, что память на переменную x выделилась, но она ни на что не указывает(не имеет значения)?

Почему delete не устанавливает автоматически указатель в NULL? - C++
Почему delete не устанавливает автоматически указатель в NULL?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
24.03.2012, 18:46 #2
А зачем в начале NULL, если ты все равно в конструкторе заполняешь?
VenCarbon
32 / 31 / 3
Регистрация: 14.12.2010
Сообщений: 158
24.03.2012, 18:54  [ТС] #3
Nekto, я в начале не заполняю, а просто создаю массив массивов.
Хм...
Да, верно, мне это потом ничем не поможет)
Суть в том, что дальше идет менюшка, что-то вроде
"Нажмите 1, чтобы заполнить матрицу;
нажмите 2, чтобы обработать матрицу
нажмите 3, чтобы вывести матрицу
..."
Если не заполнять матрицу, то (не нажимая 1, сразу нажать 3) выводятся какие-то левые, "мусорные" значения.
Я хочу сделать так, чтобы если не было заполнения матрицы, нельзя было ее выводить; чтобы просто выводилось сообщение "Нет матрицы".
HighPredator
5477 / 1843 / 343
Регистрация: 10.12.2010
Сообщений: 5,435
Записей в блоге: 3
24.03.2012, 18:56 #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 #5
Цитата Сообщение от VenCarbon Посмотреть сообщение
Если не заполнять матрицу, то (не нажимая 1, сразу нажать 3) выводятся какие-то левые, "мусорные" значения.
Я хочу сделать так, чтобы если не было заполнения матрицы, нельзя было ее выводить; чтобы просто выводилось сообщение "Нет матрицы".
Запускай с параметром 0, например. И в конструкторе на случай входа "0" приравнивай к NULL. Я бы создание вообще отдельной функцией написал и в конструкторе вызывал её с нужным параметром. И в этой функции проверку, выделена ли память, если выделена, то освободить, а потом уже выделять.
HighPredator
5477 / 1843 / 343
Регистрация: 10.12.2010
Сообщений: 5,435
Записей в блоге: 3
24.03.2012, 18:58 #6
Цитата Сообщение от VenCarbon Посмотреть сообщение
Если не заполнять матрицу, то (не нажимая 1, сразу нажать 3) выводятся какие-то левые, "мусорные" значения.
Это означает, что плохо написан вывод матрицы. А мусор там потому, что память выделена, но лично вы туда ничего не писали, поэтому как говорится "что бог послал".
VenCarbon
32 / 31 / 3
Регистрация: 14.12.2010
Сообщений: 158
24.03.2012, 19:08  [ТС] #7
HighPredator, да стрёмно как-то выглядит... Не нравится... Кажется, что так никто не делает.

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

Цитата Сообщение от Nekto Посмотреть сообщение
Запускай с параметром 0, например. И в конструкторе на случай входа "0" приравнивай к NULL. Я бы создание вообще отдельной функцией написал и в конструкторе вызывал её с нужным параметром. И в этой функции проверку, выделена ли память, если выделена, то освободить, а потом уже выделять.
Да, наверное... Только тогда не совсем понятно, почему это должна быть отдельная функция.)
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
24.03.2012, 19:11 #8
Цитата Сообщение от VenCarbon Посмотреть сообщение
Да, наверное... Только тогда не совсем понятно, почему это должна быть отдельная функция.)
Привычка
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
24.03.2012, 19:33 #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
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.03.2012, 22:36 #10
Цитата Сообщение от Toshkarik Посмотреть сообщение
Вот так лучше, для обнуления:
достаточно
C++
1
data[i] = new double[size]();
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
25.03.2012, 14:48 #11
Jupiter, то есть автоматически будут нули?
Avazart
Эксперт С++
7151 / 5328 / 277
Регистрация: 10.12.2010
Сообщений: 23,576
Записей в блоге: 17
25.03.2012, 15:00 #12
Вариант
1. В конструкторе присваивать NULL, а в специальном методе устанавливать значения и создавать матрицу
2. В конструкторе присваивать 0 каждому элементу матрицы как предложено выше.
VenCarbon
32 / 31 / 3
Регистрация: 14.12.2010
Сообщений: 158
25.03.2012, 15:13  [ТС] #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
Эксперт С++
7151 / 5328 / 277
Регистрация: 10.12.2010
Сообщений: 23,576
Записей в блоге: 17
25.03.2012, 15:29 #14
Указатели потенциальные места ошибок поэтому рекомендуется писать NULL вместо 0,
для машины может и пофиг, но для человека NULL лучше читается.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
25.03.2012, 17:11 #15
Avazart, дело не в машине. Где то читал, не могу вспомнить, что в C++ принято писать 0 вместо NULL, У Дейтелов вроде читал. Хотя это дело привычки и стиля наверно больше.

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

Функция, принимающая указатель и число байт и выделяющая память под указатель - C++
Здравствуйте. Задача легкая, но почему-то завис Нужно написать функцию, принимающую указатель и число байт и выделяющую память под...

Функция, получающая указатель на обычную функцию, получает указатель на метод класса - C++
Здравтсвуйте. Имеется вопрос по указателям на методы класса. Допустим, есть функция( f ), которая принимает указатель на функцию и...

Как правильно удалять выделенную память под указатель на указатель? - C++
есть код #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; using namespace std; void sort_1(const...

Реализация двоичных деревьев поиска: Зачем в параметрах функции используется указатель на указатель - C++
Всем привет, встретил в книге такой пример добавления узла в дерево: typedef struct tree { int data; tree *left, *right,...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.03.2012, 17:11
Ответ Создать тему
Опции темы

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