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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2009, 12:26   #1
GonZaleZ
Пользователь
 
Регистрация: 19.06.2009
Сообщений: 57
По умолчанию Возвращение функцией массива

Подскажите пожалуйста, как можно осуществить возвращение функцией массива deliteli[].
Есть фрагмент кода:
Код:
*** del (int c) {
    int deliteli[1000];
    int n;
    for (int i = 1; i <= c; i++) {
        if (c%i = 0) {
            deliteli[n] = i;
            n++;
        }
    }
return ***;
}

int main() {
...
mass[] = del(25);
...
}
Это функция нахождения делителей числа.

Но ведь в с++ нельзя напрямую присваивать массив массиву. Но что тогда нужно написать в return и какого типа должна быть функция, чтобы можно было это осуществить?

Последний раз редактировалось GonZaleZ; 21.09.2009 в 15:49.
GonZaleZ вне форума Ответить с цитированием
Старый 21.09.2009, 12:45   #2
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Код:
*** del (int c) {
    int deliteli[1000];
    int n;
    for (int i = 0; i <= c; i++) {
        if (c%i = 0) {
            del[n] = i;
            n++;
        }
    }
return ***;
}
А зачем вам массив deliteli, если вы его нигде не используете?

Предлагаю вам в функцию передать указатель на массив.
Код:
void del (int c, const int* deliteli, int deliteliSize)
В функции при такой передаче не будет известен размер массива, поэтому лучше передать еще и его размер.

Шаманство же, которое вы просите мне не известно. Не факт, что оно вообще есть.
mMAg вне форума Ответить с цитированием
Старый 21.09.2009, 12:46   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну пусть функция возвращает указатель на массив...
Я бы так делал.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.09.2009, 12:52   #4
mYziK
Пользователь
 
Регистрация: 18.09.2009
Сообщений: 38
По умолчанию

Два способа могу предложить:
1) Динамический массив, т.е. возвращать указатель на массив.
Код:
int *del( int c)
{
    int *deliteli = new int[1000];
    ...
    return deliteli;
}
Но надо незабыть освободить память в вызывающей функции
Код:
int *mas = del(50);
/*Работа с mas*/
delete [] mas;
2) Передавать указатель на массив в качестве параметра:
Код:
bool del(int c, int *deliteli, int size)
{
    /*...*/
    /*Неплохо проверять, если
       делителей больше, чем size, возвращать false, иначе - true*/
}
В этом случае вся ответственность за память ложится на вызывающую функцию:
Код:
  //В вызывающей функции
  int deliteli[1000];
  bool res = del(50, deliteli, 1000);
  if(res)
  {
     //Работа с deliteli
  }else
  {
     //Вывод сообщения об ошибке 
  }
Так же можно во втором варианте динамически выделять память под deliteli,
и если не хватает - перевыделять больше =)
mYziK вне форума Ответить с цитированием
Старый 21.09.2009, 12:54   #5
mYziK
Пользователь
 
Регистрация: 18.09.2009
Сообщений: 38
По умолчанию

Ааа, как раз написал после предложения обоих =))
mYziK вне форума Ответить с цитированием
Старый 21.09.2009, 13:25   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от mYziK Посмотреть сообщение
Два способа могу предложить:
1) Динамический массив, т.е. возвращать указатель на массив.
Код:
int *del( int c)
{
    int *deliteli = new int[1000];
    ...
    return deliteli;
}
Но надо незабыть освободить память в вызывающей функции
Код:
int *mas = del(50);
/*Работа с mas*/
delete [] mas;
Невозможно будет определить размер массива mas. Как с ним в итоге работать, если неизвестно сколько в нём элементов? Так что этот вариант неудобен. Либо второй вариант, либо возвращать vector или какой-либо другой контейнер.
pu4koff вне форума Ответить с цитированием
Старый 21.09.2009, 13:39   #7
mYziK
Пользователь
 
Регистрация: 18.09.2009
Сообщений: 38
По умолчанию

Цитата:
Невозможно будет определить размер массива mas. Как с ним в итоге работать, если неизвестно сколько в нём элементов?
Ну да. Но примерно такая же ситуация и во втором варианте. Было бы неплохо возвращать количество найденных делителей.

Код:
int del (int c, int *deliteli, int size) {
    int n = 0;
    for (int i = 0; i <= c; i++) {
        if (c%i = 0) {
            if(size == n)
               return 0;
            deliteli[n] = i;
            n++;
        }
    }
return n;
}
И при нахождении делителей не обязательно делать цикл пока i<=c,
достаточно пока i<=c/2, ибо дальше будет только один делитель - само "c"

Последний раз редактировалось mYziK; 21.09.2009 в 19:08.
mYziK вне форума Ответить с цитированием
Старый 21.09.2009, 13:56   #8
GonZaleZ
Пользователь
 
Регистрация: 19.06.2009
Сообщений: 57
По умолчанию

Код исправил, просто ошибся в названии.
Дело в том, что функция должна получать в значение только число, а не массив.
Попробую с указателем на массив и возвращением самого массива, надеюсь, это сработает))
если получится, отпишусь
GonZaleZ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возвращение функциями указателей Golovastik Общие вопросы C/C++ 2 14.09.2009 23:04
Возвращение назад в меню K[Lanc]N Помощь студентам 5 22.02.2009 11:14
Возвращение массива символов char ActioNs Общие вопросы C/C++ 3 10.01.2009 02:33
Возвращение стража.... Манжосов Денис :) Софт 0 18.09.2008 22:57