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

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

Войти
Регистрация
Восстановить пароль
 
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
#1

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

14.04.2013, 14:23. Просмотров 879. Ответов 13
Метки нет (Все метки)

Доброго времени суток. Есть программа, где куча методов должны работать с одни массивом указателей. Как мне сделать, чтобы в функции передавать указатель на этот массив, возвращать указатель с тем же именем, но который может измениться? Как-то так. Надеюсь мысль ясна.

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

Добавлено через 51 секунду
Точнее с указателем на этот массив.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.04.2013, 14:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возврат указателя на массив указателей (C++):

Возврат указателя на массив из функции - C++
День добрый, коллеги по цеху. Не откажите в нужде java программисту в познаниях нативного кода. Запутался я совсем в указателях. Как...

Возврат указателя на массив из функции - C++
Здравствуйте. Пытаюсь вернуть указатель на массив из функции. #include <iostream> using namespace std; int*...

Разадресация указателя в массив из указателей - C++
float *A, **B; A = new float ; B = new float* ; for (int i = 0; i < n; i++) { //*(A + i) = rand()%1000 / 100; *(A + i) = n -...

Добавление нового указателя в конец массива указателей, удаление указанного элемента, добавление указателей - C++
Здравствуйте. Помогите, пожалуйста, разобраться с одним большим заданием. Задание пока в процессе написания, но уже наверное есть ошибки....

Возврат указателя - C++
Написать функцию возвращающую ссылку на элемент глобального массива. #include <stdio> #include <conio> #include <iostream> ...

Возврат функцией указателя на функцию - C++
Всем привет! У меня возникла такая проблема: класс имеет поле-указатель на функцию. В методе, который осуществляет доступ к этуму полю,...

13
Rifle
26 / 26 / 5
Регистрация: 15.11.2012
Сообщений: 93
Завершенные тесты: 4
14.04.2013, 14:39 #2
В качестве параметра укажите type** (type - имя типа). Тот же тип и в возвращаемом значении.
1
abit
271 / 270 / 35
Регистрация: 03.02.2013
Сообщений: 760
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
1
art3330
10 / 10 / 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

это исправил, та же самая ошибка
0
abit
271 / 270 / 35
Регистрация: 03.02.2013
Сообщений: 760
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);
0
art3330
10 / 10 / 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?
0
abit
271 / 270 / 35
Регистрация: 03.02.2013
Сообщений: 760
14.04.2013, 17:17 #7
art3330,
В этой строчке уверен.
тогда смело выкидывайте эту конструкцию
C++
1
while(number>4 || number<1);
она абсолютна ничего не делает вообще

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

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

Добавлено через 1 минуту
Правильно ли я там делаю return?
я не разбирался в вашем алгоритме, что вам нужно вернуть, но возвращаете вы именно то, что нужно по сигнатуре функции
1
art3330
10 / 10 / 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. Так как он удаляется по выходу из цикла. Как же быть ?
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
14.04.2013, 17:53 #9
выделять динамически а не создавать на стеке.
еще лучше пользоваться стандартными контейнерами. В вашем случае вектор подойдет:
std::vector<House*> array;
1
art3330
10 / 10 / 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();
Как заставить его работать ?
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
14.04.2013, 20:40 #11
Цитата Сообщение от art3330 Посмотреть сообщение
Как заставить его работать ?
Если у Вас контейнер типа vector<House*>, то итератор должен быть типа - vector<House*>::const_iterator.
А вообще используйте auto (и range-for), если C++11 поддерживает компилятор.
1
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
14.04.2013, 20:51  [ТС] #12
Спасибо.
А как обратится через к интересующему меня методу. То есть мы же присваиваем в вектор указатель, а как потом через этот указатель вызвать метод? Надеюсь понятно объяснил.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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();
    }
1
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
15.04.2013, 00:10  [ТС] #14
Благодарю =)
0
15.04.2013, 00:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2013, 00:10
Привет! Вот еще темы с ответами:

Возврат указателя на локальный объект - C++
Доброго дня! Заинтересовал процесс возврата указателя на локальный объек, а именно: char* fun() { char *ptr1 = &quot;Hello world!&quot;; ...

Возврат указателя на строку из фукнции - C++
Снова я пришел к вам со строками. Читаю &quot;Как программировать на С++&quot; и там везде пишут про инкапсуляцию, сокрытие данных. Так чтоб мы...

Visual c++ возврат указателя, return *char - C++
есть класс journal, Я передаю в char *name значение &quot;gfg&quot;, а возвращает от мне заименнованное значение name, только первый символ &quot;f&quot;. ...

Происхродит ли здесь возврат указателя на не действительную память? - C++
double *Gaus(double **Matix, double *Frees, int N) { double **DownRow; double *DownFree; int i; double **UpnRow; double...


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

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

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