Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

20.08.2013, 14:54. Просмотров 1249. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос При попытке вернуть одномерный массив чисел из функции, данные искажаются (C++):

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

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

Преобразовать одномерный массив вещественных случайных чисел в массив целых чисел - C++
Преобразовать одномерный массив вещественных случайных чисел в массив целых чисел больших исходных на два порядка. Напечатать массивы в два...

Вернуть массив из функции - C++
Помогите пожалуйста, не получается вернуть массив #include &lt;iostream&gt; using namespace std; int input (int*array2) { int n; ...

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

Как вернуть массив из функции? - C++
В общем есть функция: ? foo() { array&lt;array&lt;double, N&gt;, 10&gt; Wave; .... return ?; } Как правильно написать return?

10
palva
2655 / 1882 / 276
Регистрация: 08.06.2007
Сообщений: 7,229
Записей в блоге: 4
20.08.2013, 14:58 #2
Вы возвращаете указатель на локальные автоматические данные, которые формально исчезают при выходе из функции. Память под ними считается свободной, и они оказываются затертыми при печати первого же числа.
0
0x10
2480 / 1655 / 248
Регистрация: 24.11.2012
Сообщений: 4,100
20.08.2013, 14:58 #3
Потому что не надо возвращать указатель на локальный объект...
0
Байт
Диссидент
Эксперт C
16574 / 10844 / 1652
Регистрация: 24.12.2010
Сообщений: 20,972
20.08.2013, 15:01 #4
Простейший выход
C++
1
static int Return[5];
0
palva
2655 / 1882 / 276
Регистрация: 08.06.2007
Сообщений: 7,229
Записей в блоге: 4
20.08.2013, 15:03 #5
Передавайте в функцию указатель на область памяти, которая функция должна заполнить вашими числами.
Другой вариант объявить массив Return статическим, но это дурной тон.

Добавлено через 1 минуту
Можно объявить массив внутри структуры и вернуть структуру. Тогда она при возврате функции скопируется в главную функцию.
1
eocron
Кактус
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
20.08.2013, 15:04 #6
Как уже было сказано Ваш массив объявляется в функции и поэтому когда происходит выход из нее, Ваш массив уже не Ваш, а пошел под другие нужды. Чтобы этого избежать нужно объявить массив ДО выполнения этой функции и передать его в Вашу функцию или сделать глобальным/статичным и свободно к нему обращаться.
1
Байт
Диссидент
Эксперт C
16574 / 10844 / 1652
Регистрация: 24.12.2010
Сообщений: 20,972
20.08.2013, 15:06 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от palva Посмотреть сообщение
Другой вариант объявить массив Return статическим, но это дурной тон.
Прошу прощения. Как говаривал полковой командир поручика Ржевского "Что поделаешь, мадам, три месяца в походе, только с козами и общаемся..."
4
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 Посмотреть сообщение
Передавайте в функцию указатель на область памяти, которая функция должна заполнить вашими числами.
Подскажите пожалуйста вариант с указателем
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,673
Записей в блоге: 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
2655 / 1882 / 276
Регистрация: 08.06.2007
Сообщений: 7,229
Записей в блоге: 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
0 / 0 / 0
Регистрация: 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
Привет! Вот еще темы с ответами:

Вернуть из функции массив символов - C++
Здравствуйте! Не получается никак решить задачу. Напишите функцию merge, которая соединяет две строки в одну так, чтобы символы двух...

Как вернуть массив из функции? - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; int mass(int n) { int* Mass = new int; //здесь...

Вернуть указатель на массив из функции - C++
Дан массив из 20 элементов, который заполняется в функции, причем заполнение можно прервать. Функция должна вернуть ссылку на следующий...

Вернуть двумерный массив их функции - C++
допустим есть в функции двумерный массив int** foo(){ int a; return // a; } как его собственно вернуть? чтобы...


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

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

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