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

Возврат указателя на массив указателей - C++

Восстановить пароль Регистрация
 
art3330
 Аватар для art3330
9 / 9 / 1
Регистрация: 16.12.2012
Сообщений: 141
14.04.2013, 14:23     Возврат указателя на массив указателей #1
Доброго времени суток. Есть программа, где куча методов должны работать с одни массивом указателей. Как мне сделать, чтобы в функции передавать указатель на этот массив, возвращать указатель с тем же именем, но который может измениться? Как-то так. Надеюсь мысль ясна.

Добавлено через 6 минут
И вот еще. Есть у меня пару модулей в программе, и все они должны работать с этим массивом. Где его лучше объявить?

Добавлено через 51 секунду
Точнее с указателем на этот массив.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rifle
 Аватар для Rifle
25 / 25 / 5
Регистрация: 15.11.2012
Сообщений: 93
Завершенные тесты: 4
14.04.2013, 14:39     Возврат указателя на массив указателей #2
В качестве параметра укажите type** (type - имя типа). Тот же тип и в возвращаемом значении.
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
14.04.2013, 14:40     Возврат указателя на массив указателей #3
Есть программа, где куча методов должны работать с одни массивом указателей. Как мне сделать, чтобы в функции передавать указатель на этот массив, возвращать указатель с тем же именем, но который может измениться?
в чём проблема конкретно?
допустим массив указателей
C++
1
void * p[10];
указатель на этот массив доустим так
C++
1
void *  * z = p;
его и передавать в функции вида
C++
1
2
3
4
void * * myfunc(void * * ptr)
{
     return ptr;
}
через
C++
1
z = myfunc(z);
возвращать указатель с тем же именем, но который может измениться?
не ставьте const и сделайте ссылку:
C++
1
2
void myfunс2(void * * & ptr)
{
если запишите myfinc2(mypointer)
то функция myfunc будет разботать напрямую с этим указателем на массив указателей и все изменения в mypointer не подвергнуться деструкции

Есть у меня пару модулей в программе
в C++ нет модулей, одна из причин почему я его не люблю и почему он долго компилирует

и все они должны работать с этим массивом. Где его лучше объявить?
если лучше - то сделать класс ) и в его видимости - все действия

если вопрос принципиальный -
если во многих файлах нужно - сделать отдельный .h/.hpp файл с вашими массивами указателей и указателями эти массивы и подключать его во всех местах где он нужен (естественно не забыв поставить сторожевой механизм pragma once или IFNDEF)

если используется не слишком часто - а двух-трёх файлах и вдальнейшим больше нигде использовать в проекте не собираетесь - можно обойтись без лишнего файла, а подключить их в тех местах где нужны, а не описаны через extern
art3330
 Аватар для art3330
9 / 9 / 1
Регистрация: 16.12.2012
Сообщений: 141
14.04.2013, 16:58  [ТС]     Возврат указателя на массив указателей #4
Цитата Сообщение от abit Посмотреть сообщение
в C++ нет модулей, одна из причин почему я его не люблю и почему он долго компилирует
Я имел ввиду заголовочные файлы.

Ну вроде все понятно. Сейчас попробую сделать. Спасибо.

Добавлено через 2 часа 1 минуту
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include "includs_list.h"
 
using namespace std;
 
class Array_File{
    
    
    public:
        
        House** pointer;
        
        House** New_Array(House** ptr){
            int n=0;             //количество элементов массива
            int number;          //переменная для выбора пункта меня
            House* array[0];     //объявление указателя на пустой массив
            House* temp_array[0];//объявление указателя на пустой массив
            for(;;){
                n++;
                for(int i=1; i<=n; i++){*temp_array[i]=*array[i];};
                House* array[n];
                for(int i=1; i<=n; i++){*array[i]=*temp_array[i];};
                cout<<"Выберите тип дома, который вы хотите ввести \n"
                <<"1.Обычный \n"
                <<"2.Кооперативный \n"
                <<"3.Малосемейный \n"
                <<"4.Другой \n";
                cin>>number;
                while(number>4 || number<1);
                switch (number){
                    case 1: 
                        array[n]=new Usual; array[n]->read(); break;
                    case 2: 
                        array[n]=new Cooperative; array[n]->read(); break;
                    case 3: 
                        array[n]=new Small_families; array[n]->read(); break;
                    case 4:
                        array[n]=new Other; array[n]->read(); break;
                };
            };
            for (int i=1;i<=n;i++){array[i]->write();}
            return ptr=array;
        };
    
};
 
int maib(){
    Array_File a;
    pointer=a.New_Array(pointer);
    return 0;
};

Вот такая ерунда получилась. Ругается, что нет декларации «pointer» в этой области видимости (это в главной функции)

Добавлено через 4 минуты
То что делал массивом, так это так надо. По заданию =)

Добавлено через 58 секунд
int maib

это исправил, та же самая ошибка
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
14.04.2013, 16:58     Возврат указателя на массив указателей #5
1)
вы уверены в этой строчке:
C++
1
while(number>4 || number<1);
?
подозреваю ; там не нужно, т.к. в таком случае отсутствует тело цикла

C++
1
2
3
int maib(){
    Array_File a;
    pointer=a.New_Array(pointer);
2)
pointer у вас определён в классе и находится в его зоне видимости, надо

C++
1
 a.pointer=a.New_Array(a.pointer);
art3330
 Аватар для art3330
9 / 9 / 1
Регистрация: 16.12.2012
Сообщений: 141
14.04.2013, 17:10  [ТС]     Возврат указателя на массив указателей #6
Сделал. Просто будет у меня House** pointer глобальной перменной

Добавлено через 1 минуту
Цитата Сообщение от abit Посмотреть сообщение
вы уверены в этой строчке:
В этой строчке уверен.
Цитата Сообщение от abit Посмотреть сообщение
pointer у вас определён в классе и находится в его зоне видимости, надо
Вы полностью правы.
Вот пока было так не работало.
C++
1
2
3
  for(int i=1; i<=n; i++){*temp_array[i]=*array[i];};
  House* array[n];
  for(int i=1; i<=n; i++){*array[i]=*temp_array[i];};
Сделал так, теперь работает. Можете объяснить разницу.
C++
1
2
3
  for(int i=1; i<=n; i++){temp_array[i]=array[i];};
  House* array[n];
  for(int i=1; i<=n; i++){array[i]=temp_array[i];};
Добавлено через 2 минуты
Я понимаю, что глобальные переменные это зло. Но здесь как нельзя pointer подходит чтобы стать такой =)

Добавлено через 3 минуты
Правильно ли я там делаю return?
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
14.04.2013, 17:17     Возврат указателя на массив указателей #7
art3330,
В этой строчке уверен.
тогда смело выкидывайте эту конструкцию
C++
1
while(number>4 || number<1);
она абсолютна ничего не делает вообще

Я понимаю, что глобальные переменные это зло. Но здесь как нельзя pointer подходит чтобы стать такой =)
зачем?
вам просто нужно в main создать свой собственный объект для main типа House ** и орудовать с ним, методы класса его будут понимать

Можете объяснить разницу.
разница огромна... в первом случае у вас перекидывались разыменованные указатели массива указателей, а во втором просто указатели на массив указателей

Добавлено через 1 минуту
Правильно ли я там делаю return?
я не разбирался в вашем алгоритме, что вам нужно вернуть, но возвращаете вы именно то, что нужно по сигнатуре функции
art3330
 Аватар для art3330
9 / 9 / 1
Регистрация: 16.12.2012
Сообщений: 141
14.04.2013, 17:47  [ТС]     Возврат указателя на массив указателей #8
Цитата Сообщение от abit Посмотреть сообщение
тогда смело выкидывайте эту конструкцию
Эта конструкция нужна, чтобы пользователь не нажал не то что надо.


Цитата Сообщение от abit Посмотреть сообщение
зачем?
вам просто нужно в main создать свой собственный объект для main типа House ** и орудовать с ним, методы класса его будут понимать
C++
1
2
3
4
5
6
int main(){
    Array_File a;
    House** pointer;
    pointer=a.New_Array(pointer);
    return 0;
};
Если делать так, то ничего не работает. Выдает "«pointer» is used uninitialized in this function [-Wuninitialized]";
Еще такой вопрос. Как нам через pointer обратится к элементу массива. Так ? pointer->array[i]->read(); ?

Добавлено через 19 минут
Вот же блин. Я пытаюсь через pointer обратится к уже несуществующему array. Так как он удаляется по выходу из цикла. Как же быть ?
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
14.04.2013, 17:53     Возврат указателя на массив указателей #9
выделять динамически а не создавать на стеке.
еще лучше пользоваться стандартными контейнерами. В вашем случае вектор подойдет:
std::vector<House*> array;
art3330
 Аватар для art3330
9 / 9 / 1
Регистрация: 16.12.2012
Сообщений: 141
14.04.2013, 20:19  [ТС]     Возврат указателя на массив указателей #10
DU, Вы правы. Нечего мучатся с этой ерундой. Как я понимаю vector это тот же массив?

Добавлено через 21 минуту
А вот такой нюанс. Написано, что вектор работает с пользовательским типом. А как сделать, чтобы была возможность выбора между четырьмя наследниками одного класса?

Добавлено через 26 минут
Понял. Мы просто делаем вектор указателей.

Добавлено через 3 минуты
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
#include "includs_list.h"
 
using namespace std;
 
int main() {
    vector<House*> myvector;
 
    House* pointer;
    pointer=new Usual;
    myvector.push_back(pointer);
    pointer=new Usual;
    myvector.push_back(pointer);
    pointer=new Usual;
    myvector.push_back(pointer);
    pointer=new Usual;
    myvector.push_back(pointer);
 
    for (vector<House*>::const_iterator it = myvector.begin(); it != myvector.end(); ++it) {
        pointer->read();
    };
    for (vector<House*>::const_iterator it = myvector.begin(); it != myvector.end(); ++it) {
        pointer->write();
    }
    return 0;
}
Почему на выводе он выводит четыре раза последний элемент? Вроде же все правильно

Добавлено через 22 минуты
Понял. Я четыре раза записываю информацию по последнему указателю. А как сделать, чтобы вводил информацию конкретно по элементу вектора?

Добавлено через 19 минут
Ведь можно так ?

Добавлено через 26 минут
Или как здесь надо делать ?

Добавлено через 8 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "includs_list.h"
 
using namespace std;
 
int main() {
    vector<House*> myvector;
 
    House* pointer;
    pointer=new Usual;
    pointer->read();
    myvector.push_back(pointer);
    pointer=new Other;
    pointer->read();
    myvector.push_back(pointer);
 
    for (vector<int>::const_iterator it = myvector.begin(); it != myvector.end(); ++it) {
        it->write();
    }
    return 0;
}
Так пробовал. И пробовал обращение типа myvector[it]->write();
Как заставить его работать ?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.04.2013, 20:40     Возврат указателя на массив указателей #11
Цитата Сообщение от art3330 Посмотреть сообщение
Как заставить его работать ?
Если у Вас контейнер типа vector<House*>, то итератор должен быть типа - vector<House*>::const_iterator.
А вообще используйте auto (и range-for), если C++11 поддерживает компилятор.
art3330
 Аватар для art3330
9 / 9 / 1
Регистрация: 16.12.2012
Сообщений: 141
14.04.2013, 20:51  [ТС]     Возврат указателя на массив указателей #12
Спасибо.
А как обратится через к интересующему меня методу. То есть мы же присваиваем в вектор указатель, а как потом через этот указатель вызвать метод? Надеюсь понятно объяснил.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.04.2013, 21:20     Возврат указателя на массив указателей #13
Цитата Сообщение от art3330 Посмотреть сообщение
А как обратится через к интересующему меня методу.
C++
1
2
3
for (vector<House*>::const_iterator it = myvector.begin(); it != myvector.end(); ++it) {
        (*it)->write();
    }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2013, 00:10     Возврат указателя на массив указателей
Еще ссылки по теме:

C++ Возврат указателя
Возврат указателей объектов из функций C++
C++ Разадресация указателя в массив из указателей

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

Или воспользуйтесь поиском по форуму:
art3330
 Аватар для art3330
9 / 9 / 1
Регистрация: 16.12.2012
Сообщений: 141
15.04.2013, 00:10  [ТС]     Возврат указателя на массив указателей #14
Благодарю =)
Yandex
Объявления
15.04.2013, 00:10     Возврат указателя на массив указателей
Ответ Создать тему
Опции темы

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