LINUX.ORG.RU

Как из функции вернуть 2 значения?

 , ,


2

0

Привет. Есть функция из которой возвращается указатель, в ней же происходит расчёт количества элементов для нового массива.

Так вот вопрос, как из неё вернуть количество элементов?

Или подскажите, как отдельно посчитать кол-во элемов в массиве чисел.

Пробовал добавить параметр в функции Int *count_new. И делать в функции вот так: count_new = &count, но не работает нифига.



Последнее исправление: CYB3R (всего исправлений: 1)

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

IvanR ★★★
()

Вариант №1: int *f(int *n);
Вариант №2: f(int **array, int *n);
Вариант №3: int f(int **array);
Вариант №4: struct {int *array; int n;} f();
Вариант №5: ...

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 2)

И делать в функции вот так: count_new = &count, но не работает нифига.

void f(int *count_new) {
  int count = 2;
  *count_new = count;
}
i-rinat ★★★★★
()

Через параметр функции по указателю или по ссылке.

// По указателю
int*
allocate( int * count )
{
  int * buff, bcount;
  //...
  if( count ) *count = bcount;
  return buff;
}
// По ссылке
int*
allocate( int & count )
{
  int * buff, bcount;
  //...
  count = bcount;
  return buff;
}
tekilla
()
Ответ на: комментарий от i-rinat

Ваш метод пробовал, не работает, вылазит варнинг, о том что указатель не инициализирован.

ChuCha
() автор топика
Ответ на: комментарий от tekilla

По ссылке ?

Мы тут, вообще-то о C толкуем. Не вводи чела в заблуждения. ;)

beastie ★★★★★
()
Ответ на: комментарий от tekilla

Я так пробовал, он пишет, что указатель не инициализирован.

ChuCha
() автор топика
Ответ на: комментарий от ChuCha
int *
func(int *n)
{
    int *a = calloc(*n, sizeof(int));
    *n *= sizeof(int);
    return a;
}

int
main()
{
    int n = 10;
    int *a = func(&n);
    printf("%d\n", n);
    return 0;
}

Но 3-й вариант будет всё ж лучше. Т.е. массив — в параметры, новое значение кол-ва — через return.

int
func(int **a, int n)
{
    *a = calloc(n, sizeof(int));
    return n * sizeof(int);
}

int
main()
{
    int n = 10;
    int *a;
    n = func(&a, n);
    printf("%d\n", n);
    return 0;
}

В общем — use imagination.

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от beastie

я код покажу, понятней будет. Я из функции уже возвращаю буфер. Мне нужно отсюда num_of_elem_without_zeros

char *normalize_number(int count, char *res) {
	int num_of_zeros = 0;
	int i = 0;
	while (res[i] == 0) {
		num_of_zeros++;
		i++;
	}

	int num_of_elem_without_zeros = count - num_of_zeros;

	char *normalize_res = malloc(sizeof(char) * (num_of_elem_without_zeros));

	for (int i = num_of_elem_without_zeros, j = 0; i < count; i++, j++)
		normalize_res[j] = res[i];


	return normalize_res;
}

ChuCha
() автор топика
Ответ на: комментарий от ChuCha

Предлагаю тебе следующий вариант:

int
normalize_number(char **data, int count)
{
        int n;

        for (n = 0; data[n] == 0; n++)
                ;

        *data = data[n];

        return count - n;
}

Возвращает остаток, массив входных и выходных данных через указатель на data.

beastie ★★★★★
()
Ответ на: комментарий от unt1tled

это так, к слову об указателях на int, без отношения к вопросу ТС, ибо он тупит и его вопрос не имеет смысла

unt1tled ★★★★
()
Ответ на: комментарий от unt1tled

не?

А, ты про вообще. Тут не вопрос дизайна. Человек просто пытается сделать

void f(int *out) {
  int v = 1;
  out = &v;
}

но работает оно не совсем так, как он того ожидает.

i-rinat ★★★★★
()
Ответ на: комментарий от unt1tled

Я вообще, когда заголовок прочитал, вспомнил диалог откуда-то:

— You can't return values of different types from a function.
— Yes, you can.
— How?
— You throw.

i-rinat ★★★★★
()
Ответ на: комментарий от beastie

А можно отдельно посчитать количество элементов в массиве? int count_elem(char *buf), вот только я не знаю как реализовать. У меня проблемы с указатель на указатель.

ChuCha
() автор топика
Ответ на: комментарий от ChuCha

Количество элементов в динамически выделенном массиве нельзя посчитать.

kvap
()
Ответ на: комментарий от kvap

Я уже избавился от этого кода. Значит буду юзать структуру

ChuCha
() автор топика
Ответ на: комментарий от beastie

Дабы не забивать всем голову - реализовал через структуру. Как собственно в начале и советовали.

ChuCha
() автор топика
Ответ на: комментарий от ChuCha

Попробуйте реализовать. Скажите о результатах

Ты меня настолько огорошил, что я таки попробовал реализовать. Результат — успешно. Было бы странно, если не сработало.

i-rinat ★★★★★
()

Костылями. Это же C, здесь так принято.

quantum-troll ★★★★★
()

В высокоуровневых языках для такого случая используют кортежи. В Си кортежей нет, поэтому можно использовать такие варианты:

1) создать с помощью malloc структуру, куда помещаются результаты и вернуть указатель на нее (потом надо будет не забыть удалить)

2) вернуть значения через аргументы, передаваемые по ссылке (с помощью указателей)

3) передать функции указатель на структуру и внутри функции заполнить ее

4) комбинированный способ: одно из значений возвращается функцией, другие - через аргументы

В твоем случае подойдет последний способ, определи функцию примерно так:

int *make_array(int param1, int param2, int paramN, int *psize)

И в *psize заноси размер массива (проверив перед этим, что psize != NULL).

Den_Zurin
()

можно еще использовать побочный эффект, внешнюю переменную

anonymous
()
Ответ на: комментарий от ChuCha

Все читали книжечку, вместо тупления по форумам, а кому не помогло — успокоились. Вот и тебе предлагается этот путь.

anonymous
()

Как тебе уже верно посоветовали, используй структуру, причём твой массив должен быть частью структуры.

no-such-file ★★★★★
()
Ответ на: комментарий от Den_Zurin

В высокоуровневых языках для такого случая используют кортежи

ЛОЛ. В высокоуровневых языках используют множественные возвращаемые значения. Кортежи это костыль, ни разу не лучше чем возврат структуры, или просто массива значений.

no-such-file ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.