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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
noeine
0 / 0 / 0
Регистрация: 31.07.2013
Сообщений: 45
#1

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

20.08.2013, 14:54. Просмотров 1177. Ответов 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
Для продолжения нажмите любую клавишу . . .
Первое число совпадает, а дальше пошло поехало. Помогите решить проблему
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.08.2013, 14:54     При попытке вернуть одномерный массив чисел из функции, данные искажаются
Посмотрите здесь:

Вернуть массив из функции C++
Как вернуть массив из функции? C++
Вернуть указатель на массив из функции C++
При передаче в функцию динамического массива, в массиве искажаются данные C++
Как вернуть массив из функции? C++
C++ Как вернуть массив из функции?
C++ Как вернуть массив из функции?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
palva
2509 / 1731 / 229
Регистрация: 08.06.2007
Сообщений: 6,796
Записей в блоге: 4
20.08.2013, 14:58     При попытке вернуть одномерный массив чисел из функции, данные искажаются #2
Вы возвращаете указатель на локальные автоматические данные, которые формально исчезают при выходе из функции. Память под ними считается свободной, и они оказываются затертыми при печати первого же числа.
0x10
2456 / 1628 / 238
Регистрация: 24.11.2012
Сообщений: 4,003
20.08.2013, 14:58     При попытке вернуть одномерный массив чисел из функции, данные искажаются #3
Потому что не надо возвращать указатель на локальный объект...
Байт
Эксперт C
15547 / 9889 / 1486
Регистрация: 24.12.2010
Сообщений: 18,494
20.08.2013, 15:01     При попытке вернуть одномерный массив чисел из функции, данные искажаются #4
Простейший выход
C++
1
static int Return[5];
palva
2509 / 1731 / 229
Регистрация: 08.06.2007
Сообщений: 6,796
Записей в блоге: 4
20.08.2013, 15:03     При попытке вернуть одномерный массив чисел из функции, данные искажаются #5
Передавайте в функцию указатель на область памяти, которая функция должна заполнить вашими числами.
Другой вариант объявить массив Return статическим, но это дурной тон.

Добавлено через 1 минуту
Можно объявить массив внутри структуры и вернуть структуру. Тогда она при возврате функции скопируется в главную функцию.
eocron
Кактус
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
20.08.2013, 15:04     При попытке вернуть одномерный массив чисел из функции, данные искажаются #6
Как уже было сказано Ваш массив объявляется в функции и поэтому когда происходит выход из нее, Ваш массив уже не Ваш, а пошел под другие нужды. Чтобы этого избежать нужно объявить массив ДО выполнения этой функции и передать его в Вашу функцию или сделать глобальным/статичным и свободно к нему обращаться.
Байт
Эксперт C
15547 / 9889 / 1486
Регистрация: 24.12.2010
Сообщений: 18,494
20.08.2013, 15:06     При попытке вернуть одномерный массив чисел из функции, данные искажаются #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от palva Посмотреть сообщение
Другой вариант объявить массив Return статическим, но это дурной тон.
Прошу прощения. Как говаривал полковой командир поручика Ржевского "Что поделаешь, мадам, три месяца в походе, только с козами и общаемся..."
noeine
0 / 0 / 0
Регистрация: 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 Посмотреть сообщение
Передавайте в функцию указатель на область памяти, которая функция должна заполнить вашими числами.
Подскажите пожалуйста вариант с указателем
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6411 / 3050 / 300
Регистрация: 04.12.2011
Сообщений: 8,239
Записей в блоге: 3
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");
}
palva
2509 / 1731 / 229
Регистрация: 08.06.2007
Сообщений: 6,796
Записей в блоге: 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");
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2013, 15:49     При попытке вернуть одномерный массив чисел из функции, данные искажаются
Еще ссылки по теме:

C++ Вернуть двумерный массив из функции
Вернуть массив из функции C++
C++ Вернуть двумерный массив их функции
C++ Как из функции вернуть массив символов?
C++ Вернуть из функции массив символов

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

Или воспользуйтесь поиском по форуму:
noeine
0 / 0 / 0
Регистрация: 31.07.2013
Сообщений: 45
20.08.2013, 15:49  [ТС]     При попытке вернуть одномерный массив чисел из функции, данные искажаются #11
Всем огромное спасибо! http://smayly.ru/gallery/anime/EmoAnime/90.gif
Yandex
Объявления
20.08.2013, 15:49     При попытке вернуть одномерный массив чисел из функции, данные искажаются
Ответ Создать тему
Опции темы

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