Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
 Аватар для art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141

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

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

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

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

Добавлено через 51 секунду
Точнее с указателем на этот массив.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.04.2013, 14:23
Ответы с готовыми решениями:

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

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

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

13
 Аватар для Rifle
30 / 30 / 13
Регистрация: 15.11.2012
Сообщений: 93
14.04.2013, 14:39
В качестве параметра укажите type** (type - имя типа). Тот же тип и в возвращаемом значении.
1
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,859
14.04.2013, 14:40
Есть программа, где куча методов должны работать с одни массивом указателей. Как мне сделать, чтобы в функции передавать указатель на этот массив, возвращать указатель с тем же именем, но который может измениться?
в чём проблема конкретно?
допустим массив указателей
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  [ТС]
Цитата Сообщение от 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
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,859
14.04.2013, 16:58
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  [ТС]
Сделал. Просто будет у меня 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
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,859
14.04.2013, 17:17
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  [ТС]
Цитата Сообщение от 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
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
14.04.2013, 17:53
выделять динамически а не создавать на стеке.
еще лучше пользоваться стандартными контейнерами. В вашем случае вектор подойдет:
std::vector<House*> array;
1
 Аватар для art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
14.04.2013, 20:19  [ТС]
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
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
14.04.2013, 20:40
Цитата Сообщение от 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  [ТС]
Спасибо.
А как обратится через к интересующему меня методу. То есть мы же присваиваем в вектор указатель, а как потом через этот указатель вызвать метод? Надеюсь понятно объяснил.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
14.04.2013, 21:20
Цитата Сообщение от 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  [ТС]
Благодарю =)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.04.2013, 00:10
Помогаю со студенческими работами здесь

Трудности с выводом указателя на массив из указателей
Привет, встретился с проблемой. Сколько гуглил - не помогло. Среда разработки Visual Studio. Насколько я знаю, вернуть двумерный...

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

Возврат указателя
Написать функцию возвращающую ссылку на элемент глобального массива. #include &lt;stdio&gt; #include &lt;conio&gt; #include...

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

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru