2014-11-22 4 views
1

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

, например:

#include <iostream> 
#include <stdio.h> 

using namespace std; 

int global[10] 

//POPULATE THE ARRAY HERE 
int functionReturnArray() 
{ 
int i; 

    for(i=0;i<=9;i++) 
    { 
     global[i] =i; 

     if(i==9) 
     { 
     return global; 
     } 
     } 

}//close function 

int main() 
{ 
     int local = functionReturnArray(); 
     for(int i=0;i<10;i++) 
     local[i];// I WANT TO USE THE ARRAY HERE 
     return 0 
} 

Благодаря

+3

В вашем примере вы должны просто изменить 'int local' на' int * local', но если он находится в том же файле, вам не нужно его возвращать. Вы можете просто ссылаться на него внутри любой из функций этого файла. –

+0

Возможно, мне что-то не хватает, но ваш главный уже имеет доступ к глобальной ... Почему нужно возвращаться? Лучше всего переименовать int functionReturnArray() в void functionInitalizeArray() и забыть о возвращаемых значениях.Кроме того, ваш основной должен прочитать int main (int argc, const char * argv []) – Freddy

+4

@Freddy, нет! 'int main()' отлично, я никогда не понимаю, почему люди настаивают на объявлении параметров 'main', которые они не используют. Фактически, две переносимые объявления для 'main' - это' int main() 'и' int main (int, char **) ', поэтому она определена реализацией независимо от того, является ли' const char * argv [] 'действительным! –

ответ

4

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

Вы не можете вернуть массив в C++ или передать его функции, потому что массивы «распадаются» на указатель на их первый элемент.

Вместо этого вы можете вернуть int*, но, как говорится в вышеприведенных комментариях, если массив массив глобальный, зачем вам его возвращать? Глобалы доступны в глобальном масштабе, просто используйте их напрямую.

3

Если вы хотите вернуть массив, вы можете возвращать указатель только на массив (тип возврата int *).

int global[10] 

int* functionReturnArray() 
{ 
    for(int i=0; i<10; i++) 
    { 
     global[i] = i; 
    } 
    return global 
} 

int main() 
{ 
    int* local = functionReturnArray(); 
    for(int i=0; i<10; i++) 
    { 
     local[i]; // I want to use the array here 
    } 
    return 0 
} 
+0

Этот подход, вероятно, самый простой и самый простой для меня для реализации. Однако моя программа продолжает сбой. Я хочу предоставить больше описания, но не могу сделать это здесь, в разделе комментариев. Должен просто изменить исходный пост? – JayRod

+0

Я верю, да. обновить оригинал (отметьте, что было отредактировано, поэтому другие также знают, что изменилось) – dnsmkl

2

вы должны вернуть указатель на первый элемент в массиве

int* functionReturnArray() 

, то вы можете использовать его в основной функции

int main() 
{ 
     int *local = functionReturnArray(); 
     for(int i=0;i<10;i++) 
     local[i];// I WANT TO USE THE ARRAY HERE 
     return 0 
} 
3

Массивы имеют ни конструктор копирования и не копировать назначения оператор.

Вот некоторые подходы к задаче

Используя локальную ссылку на глобальный массив:

#include <iostream> 

const size_t N = 10; 

int global[N]; 

int (&functionReturnArray())[N] 
{ 
    for (size_t i = 0; i < N; i++) 
    { 
     global[i] = i; 
    } 

    return global; 
} 

int main() 
{ 
    int (&local)[N] = functionReturnArray(); 

    for (int x : local) std::cout << x << ' '; 
    std::cout << std::endl; 

    return 0; 
} 

Выход является

0 1 2 3 4 5 6 7 8 9 

Использование указателя на первый элемент из глобальный массив

#include <iostream> 

const size_t N = 10; 

int global[N]; 

int * functionReturnArray() 
{ 
    for (size_t i = 0; i < N; i++) 
    { 
     global[i] = i; 
    } 

    return global; 
} 

int main() 
{ 
    int *local = functionReturnArray(); 

    for (size_t i = 0; i < N; i++) std::cout << local[i] << ' '; 
    std::cout << std::endl; 

    return 0; 
} 

Выход

0 1 2 3 4 5 6 7 8 9 

Использование стандартного класса зЬй :: массив

#include <iostream> 
#include <array> 
#include <algorithm> 

const size_t N = 10; 

int global[N]; 

std::array<int, N> functionReturnArray() 
{ 
    for (size_t i = 0; i < N; i++) 
    { 
     global[i] = i; 
    } 

    std::array<int, N> a; 

    std::copy(global, global + N, a.begin()); 

    return a; 
} 

int main() 
{ 
    std::array<int, N> local = functionReturnArray(); 

    for (int x : local) std::cout << x << ' '; 
    std::cout << std::endl; 

    return 0; 
} 

Выход

0 1 2 3 4 5 6 7 8 9 

Преимущество первого и третьего подходов является то, что локальные массивы (ссылка и объект типа std :: array) сохраняют информацию об их размерах.

+0

на первом месте Я получаю следующие ошибки: 1. «В функции int main()» 2. «Ожидаемый инициализатор перед»: «токен», 3. ожидаемый ')' до ';' маркер. как я могу это исправить? – JayRod

+0

@ user1774537 Кажется, вы сделали опечатку. Если копировать и вставлять код первого примера, то он компилируется. –