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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
noeine
0 / 0 / 0
Регистрация: 31.07.2013
Сообщений: 45
20.08.2013, 14:54     При попытке вернуть одномерный массив чисел из функции, данные искажаются #1
Добрый вечер. Хочу чтобы функция возвращала мне одномерный массив содержащий в себе (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     При попытке вернуть одномерный массив чисел из функции, данные искажаются
Посмотрите здесь:

Одномерный массив вещественных чисел R75 содержит данные о росте группы студентов. Массив заполнить значениями путем ввода с клавиатуры. Вычислить с C++
Вернуть массив из функции C++
Сформировать одномерный массив целых чисел, используя датчик случайных чисел, и распечатать массив. Удалить из массива все элементы, совпадающие с его C++
Вернуть указатель на массив из функции C++
C++ Одномерный массив (Ввести массив из 10 вещественных чисел.Найти сумму чисел,стоящих на чётных местах)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
20.08.2013, 14:58     При попытке вернуть одномерный массив чисел из функции, данные искажаются #2
Вы возвращаете указатель на локальные автоматические данные, которые формально исчезают при выходе из функции. Память под ними считается свободной, и они оказываются затертыми при печати первого же числа.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
20.08.2013, 14:58     При попытке вернуть одномерный массив чисел из функции, данные искажаются #3
Потому что не надо возвращать указатель на локальный объект...
Байт
 Аватар для Байт
13993 / 8824 / 1231
Регистрация: 24.12.2010
Сообщений: 15,990
20.08.2013, 15:01     При попытке вернуть одномерный массив чисел из функции, данные искажаются #4
Простейший выход
C++
1
static int Return[5];
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
20.08.2013, 15:03     При попытке вернуть одномерный массив чисел из функции, данные искажаются #5
Передавайте в функцию указатель на область памяти, которая функция должна заполнить вашими числами.
Другой вариант объявить массив Return статическим, но это дурной тон.

Добавлено через 1 минуту
Можно объявить массив внутри структуры и вернуть структуру. Тогда она при возврате функции скопируется в главную функцию.
eocron
Кактус
 Аватар для eocron
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
20.08.2013, 15:04     При попытке вернуть одномерный массив чисел из функции, данные искажаются #6
Как уже было сказано Ваш массив объявляется в функции и поэтому когда происходит выход из нее, Ваш массив уже не Ваш, а пошел под другие нужды. Чтобы этого избежать нужно объявить массив ДО выполнения этой функции и передать его в Вашу функцию или сделать глобальным/статичным и свободно к нему обращаться.
Байт
 Аватар для Байт
13993 / 8824 / 1231
Регистрация: 24.12.2010
Сообщений: 15,990
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
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,722
Записей в блоге: 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
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 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++ Как вернуть массив из функции?

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

Или воспользуйтесь поиском по форуму:
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     При попытке вернуть одномерный массив чисел из функции, данные искажаются
Ответ Создать тему
Опции темы

Текущее время: 02:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru