Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
noeine
1 / 1 / 1
Регистрация: 31.07.2013
Сообщений: 45
#1

При попытке вернуть одномерный массив чисел из функции, данные искажаются

20.08.2013, 14:54. Просмотров 1301. Ответов 10
Метки нет (Все метки)

Добрый вечер. Хочу чтобы функция возвращала мне одномерный массив содержащий в себе (int) числа. Но даже при такой конструкции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int * testfunc(){
    int Return[5];
    Return[0] = 123456789;
    Return[1] = 234567891;
    Return[2] = 345678912;
    Return[3] = 456789123;
    Return[4] = 567891234;
    return Return;
}
 
int main(){
    int *testarr = testfunc();
    std::cout << testarr[0] << endl;
    std::cout << testarr[1] << endl;
    std::cout << testarr[2] << endl;
    std::cout << testarr[3] << endl;
    std::cout << testarr[4] << endl;
    std::system("pause");
}
Я в место того что пытаюсь вернуть получаю следующее:
123456789
257183445
1637312
257257572
257868768
Для продолжения нажмите любую клавишу . . .
Первое число совпадает, а дальше пошло поехало. Помогите решить проблему
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.08.2013, 14:54
Ответы с готовыми решениями:

При передаче в функцию динамического массива, в массиве искажаются данные
Мне необходимо построить код Шеннона, на основе псевдокода, предложенного в...

Функция: создать динамический массив, состоящий из n натуральных чисел и вернуть его из функции
Пришёл к вам за советом. Вот задание. Напишите функцию int* naturals(int n),...

Одномерный массив (Ввести массив из 10 вещественных чисел.Найти сумму чисел,стоящих на чётных местах)
Ввести массив из 10 вещественных чисел.Найти сумму чисел,стоящих на чётных...

Преобразовать одномерный массив вещественных случайных чисел в массив целых чисел
Преобразовать одномерный массив вещественных случайных чисел в массив целых...

Вернуть массив из функции
Помогите пожалуйста, не получается вернуть массив #include &lt;iostream&gt; using...

10
palva
3099 / 2232 / 449
Регистрация: 08.06.2007
Сообщений: 8,131
Записей в блоге: 4
20.08.2013, 14:58 #2
Вы возвращаете указатель на локальные автоматические данные, которые формально исчезают при выходе из функции. Память под ними считается свободной, и они оказываются затертыми при печати первого же числа.
0
0x10
2571 / 1751 / 288
Регистрация: 24.11.2012
Сообщений: 4,377
20.08.2013, 14:58 #3
Потому что не надо возвращать указатель на локальный объект...
0
Байт
Эксперт C
17935 / 11926 / 2478
Регистрация: 24.12.2010
Сообщений: 24,007
20.08.2013, 15:01 #4
Простейший выход
C++
1
static int Return[5];
0
palva
3099 / 2232 / 449
Регистрация: 08.06.2007
Сообщений: 8,131
Записей в блоге: 4
20.08.2013, 15:03 #5
Передавайте в функцию указатель на область памяти, которая функция должна заполнить вашими числами.
Другой вариант объявить массив Return статическим, но это дурной тон.

Добавлено через 1 минуту
Можно объявить массив внутри структуры и вернуть структуру. Тогда она при возврате функции скопируется в главную функцию.
1
eocron
Кактус
66 / 66 / 19
Регистрация: 23.05.2012
Сообщений: 342
20.08.2013, 15:04 #6
Как уже было сказано Ваш массив объявляется в функции и поэтому когда происходит выход из нее, Ваш массив уже не Ваш, а пошел под другие нужды. Чтобы этого избежать нужно объявить массив ДО выполнения этой функции и передать его в Вашу функцию или сделать глобальным/статичным и свободно к нему обращаться.
1
Байт
Эксперт C
17935 / 11926 / 2478
Регистрация: 24.12.2010
Сообщений: 24,007
20.08.2013, 15:06 #7
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от palva Посмотреть сообщение
Другой вариант объявить массив Return статическим, но это дурной тон.
Прошу прощения. Как говаривал полковой командир поручика Ржевского "Что поделаешь, мадам, три месяца в походе, только с козами и общаемся..."
4
noeine
1 / 1 / 1
Регистрация: 31.07.2013
Сообщений: 45
20.08.2013, 15:27  [ТС] #8
Спасибо за подсказки, проверьте пожалуйста правильно ли я реализовал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void testfunc(int Return[]){
    //int Return[5];
    Return[0] = 123456789;
    Return[1] = 234567891;
    Return[2] = 345678912;
    Return[3] = 456789123;
    Return[4] = 567891234;
    //return Return;
}
 
int main(){
    int Return[5] = {0};
    testfunc(Return);
    std::cout << Return[0] << endl;
    std::cout << Return[1] << endl;
    std::cout << Return[2] << endl;
    std::cout << Return[3] << endl;
    std::cout << Return[4] << endl;
    std::system("pause");
}
И можно ли как-то оформить код в более привычный мне вид:
C++
1
2
3
4
5
6
testarr = testfunc();
cout << testarr[0] << endl;
cout << testarr[1] << endl;
cout << testarr[2] << endl;
cout << testarr[3] << endl;
cout << testarr[4] << endl;
Добавлено через 58 секунд
Цитата Сообщение от palva Посмотреть сообщение
Передавайте в функцию указатель на область памяти, которая функция должна заполнить вашими числами.
Подскажите пожалуйста вариант с указателем
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7045 / 3346 / 452
Регистрация: 04.12.2011
Сообщений: 9,304
Записей в блоге: 5
20.08.2013, 15:43 #9
Цитата Сообщение от noeine Посмотреть сообщение
Подскажите пожалуйста вариант с указателем
Ваш код по сути и есть передача указателя. Чтобы это было явно, так можно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
 
void testfunc(int *Return){
    Return[0] = 123456789;
    Return[1] = 234567891;
    Return[2] = 345678912;
    Return[3] = 456789123;
    Return[4] = 567891234;
   }
 
int main(){
    const int n = 5;
    int Return[n] = {0};
    testfunc(Return);
    cout << Return[0] << endl;
    cout << Return[1] << endl;
    cout << Return[2] << endl;
    cout << Return[3] << endl;
    cout << Return[4] << endl;
    system("pause");
}
1
palva
3099 / 2232 / 449
Регистрация: 08.06.2007
Сообщений: 8,131
Записей в блоге: 4
20.08.2013, 15:46 #10
Цитата Сообщение от noeine Посмотреть сообщение
Подскажите пожалуйста вариант с указателем
Точно также, как у вас.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void testfunc(int * Return){
    //int Return[5];
    Return[0] = 123456789;
    Return[1] = 234567891;
    Return[2] = 345678912;
    Return[3] = 456789123;
    Return[4] = 567891234;
    //return Return;
}
 
int main(){
    int Return[5];
    testfunc(Return);
    std::cout << Return[0] << endl;
    std::cout << Return[1] << endl;
    std::cout << Return[2] << endl;
    std::cout << Return[3] << endl;
    std::cout << Return[4] << endl;
    std::system("pause");
}
2
noeine
1 / 1 / 1
Регистрация: 31.07.2013
Сообщений: 45
20.08.2013, 15:49  [ТС] #11
Всем огромное спасибо! http://smayly.ru/gallery/anime/EmoAnime/90.gif
0
20.08.2013, 15:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2013, 15:49

Вернуть массив из функции
Допустим есть класс Test: class Test { private: float point; };

Вернуть указатель на массив из функции
Дан массив из 20 элементов, который заполняется в функции, причем заполнение...

Как вернуть массив из функции?
Please! #include &lt;iostream&gt; using namespace std; int _plus1 (int array ...


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

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

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