Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2011, 00:38   #1
Neolit1819
Пользователь
 
Регистрация: 28.03.2011
Сообщений: 51
По умолчанию c++ возврат указателя из функции

Доброго дня изучаю С++ пару дней помогите разьяснить нюанс, как понимаю функция не может вернуть массив, но может вернуть указатель на массив. Пытаюсь реализовать не оплучается. Задача пользователь вводит число - число передается в функцию, функция образует массив из 5 элементов где каждое число на 3 больше предыдущего, начиная с параметра функции. Собственно код, но что то не то
Код:
int *byThress(int i);
int _tmain(int argc, _TCHAR* argv[])
{
	int i,k;
	int *p;
	cout << "Enter chislo ";
	cin >> i;
	cout << " \n ";
	p = byThress[i];
	for(k=0;k<5;k++) cout << p[k] << " ";
	
	return 0;
}

int *byThress(int i) 
{
	int k ;
	int *p;
	int mas[5];
	mas[0] = i;
	for(k=1;k<5;k++) mas[k]=mas[k-1]+3;
	return mas;
Neolit1819 вне форума Ответить с цитированием
Старый 28.03.2011, 01:20   #2
Alt
Лжец и смутьян
Форумчанин
 
Аватар для Alt
 
Регистрация: 03.04.2009
Сообщений: 194
По умолчанию

Код:
const stdsize = 5;
const stdinc = 3;

void GenArray(int, int, int, int*);

int main()
{
int v;
cout << "Enter int value: ";
cin >> v;
cout << endl;
int *p = NULL; //куда записываем массив
GenArray(v, stdinc, stdsize, p);
for (int i = 0; i < stdsize; i++)
cout << p[i] << " ";
cout << endl;
return 0;
}

void GenArray(int value, int inc, int size, int* result)
{
if (size <= 0)
return;
result = new int [size];
result[0] = value;
for (int i = 1; i < size; i++)
result[i] = result[i-1]+inc;
return;
}
Помогли тебе - помоги другому.
Alt вне форума Ответить с цитированием
Старый 28.03.2011, 01:40   #3
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

ну как вариант
Код:
int *GenArray(int value, int inc, int size, int* result)
...
return result;
оно и изменит массив и в добавок и вернет указатель.
многие стандартные функции так поступают для удобства, например memmove, strcpy...
onewho вне форума Ответить с цитированием
Старый 28.03.2011, 12:45   #4
Neolit1819
Пользователь
 
Регистрация: 28.03.2011
Сообщений: 51
По умолчанию

Цитата:
Сообщение от Alt Посмотреть сообщение
Код:
const stdsize = 5;
const stdinc = 3;

void GenArray(int, int, int, int*);

int main()
{
int v;
cout << "Enter int value: ";
cin >> v;
cout << endl;
int *p = NULL; //куда записываем массив
GenArray(v, stdinc, stdsize, p);
for (int i = 0; i < stdsize; i++)
cout << p[i] << " ";
cout << endl;
return 0;
}

void GenArray(int value, int inc, int size, int* result)
{
if (size <= 0)
return;
result = new int [size];
result[0] = value;
for (int i = 1; i < size; i++)
result[i] = result[i-1]+inc;
return;
}
К сожелению код не работает, все компилируется но после ввода чила программа вызывает исключение. К тому же не совсем понятна одна вещь - ведь функцию обызвают Void если она ничего не возвращает? разве не так? Код самой функции думаю коректен, думаю ошибка в применение возвращаемого указателя в теле главной программы, может проблема в том, что после выполнения функции генерации массива, все данные в памяти затираются и указатель указывает на уже не существующий массив?))

Последний раз редактировалось Neolit1819; 28.03.2011 в 12:56.
Neolit1819 вне форума Ответить с цитированием
Старый 28.03.2011, 14:37   #5
Neolit1819
Пользователь
 
Регистрация: 28.03.2011
Сообщений: 51
По умолчанию

Не много подразобрался функция
Код:
int *byThress(int i, int *result) 
{
	int k ;
	int mas[5];
	mas[0] = i;
	for(k=1;k<5;k++) mas[k]=mas[k-1]+3;
	result = mas;
	return result;
возвращает корректный указатель на массив, НО далее какой то бред! Записываю в int *p = NULL; p = byThress(i,p); где i число исходя из которого генерируется массив. Методом cout << p[2] << " "; проверяю корректность значений указателя. Все хорошо уже радуюсь...попытавшись засунуть в
Код:
for(i=1;i<5;i++) 
	cout << p[i] << " ";
происходит нечно странное
на пример при i=1, указатель указывает на массив содержащий 1,4,7,11 и тд что обсолютно верно, но в цикле программа выводи 4,-058993460, 058993460, 0. Получается указатель возвращает верный ответ только один раз =( почему не понимаю
Neolit1819 вне форума Ответить с цитированием
Старый 28.03.2011, 14:43   #6
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

Цитата:
все данные в памяти затираются и указатель указывает на уже не существующий массив?))
все верно! память выделяется для результата в фукции, а следовательно по выходу из функции затирается

предварительно нужно выделить память для массива
Код:
void GenArray(int value, const int inc, const int size, int * res) {
  if (size <= 0)
    return;
  if (!res)
    return;
  for (int i = 0; i < size; i++) {
    res[i] = value;
    value += inc;
  }
}
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 28.03.2011, 15:37   #7
Neolit1819
Пользователь
 
Регистрация: 28.03.2011
Сообщений: 51
По умолчанию

Благодарю за помощь
Neolit1819 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мини бэйсик:объявление функции, вызов функции , возврат. AL_LORD Помощь студентам 2 14.10.2010 17:48
Язык Си. Не возвращается значение указателя из функции. agronomchek Помощь студентам 1 29.08.2010 22:47
Как сделать возврат из функции VladimirVB Общие вопросы Delphi 5 28.08.2009 15:03
Возврат значения функции по ссылке(подскажите новичку) Malkovich Общие вопросы C/C++ 11 14.07.2009 08:48
Возврат результата функции по ссылке gladov Общие вопросы C/C++ 2 24.06.2008 22:48