Передача адресов функциям в C - PullRequest
3 голосов
/ 10 апреля 2011

Я новичок в C, и у меня есть функция, которая вычисляет несколько переменных.Но пока давайте все упростим.Я хочу иметь функцию, которая «возвращает» несколько переменных.Хотя, насколько я понимаю, вы можете вернуть только одну переменную в C. Поэтому мне сказали, что вы можете передать адрес переменной и сделать это таким образом.Это то, как далеко я продвинулась, и мне было интересно, что я могу иметь руку.Я получаю немало ошибок относительно запрещенных вещей в C90 и т. Д. Я почти уверен, что это мой синтаксис.

Скажите, что это моя основная функция:

void func(int*, int*);

int main()
{
    int x, y;
    func(&x, &y);

    printf("Value of x is: %d\n", x);
    printf("Value of y is: %d\n", y);

    return 0;
}

void func(int* x, int* y)
{
    x = 5;
    y = 5;
}

Это, по сути,структура, с которой я работаю.Кто-нибудь может мне здесь помочь?

Ответы [ 5 ]

8 голосов
/ 10 апреля 2011

Вы должны использовать *variable для ссылки на то, на что указывает указатель:

*x = 5;
*y = 5;

В настоящее время вы устанавливаете указатель на адрес 5. Вы можете избежать неприятностей со старыми компиляторами, но хороший компилятор обнаружит несоответствие типов при назначении int переменной int* и не будет позвольте вам сделать это без явного приведения.

3 голосов
/ 10 апреля 2011
void function(int *x, int* y) {
    *x = 5; 
    *y = 5; 
}

изменит значения параметров.

0 голосов
/ 10 апреля 2011

Вы можете вернуть одну переменную типа структуры.

#include <stdio.h>
#include <string.h>

struct Multi {
  int anint;
  double adouble;
  char astring[200];
};

struct Multi fxfoo(int parm) {
  struct Multi retval = {0};
  if (parm != 0) {
    retval.anint = parm;
    retval.adouble = parm;
    retval.astring[0] = parm;
  }
  return retval;
}

int main(void) {
  struct Multi xx;
  if (fxfoo(0).adouble <= 0) printf("ok\n");
  xx = fxfoo(42);
  if (strcmp(xx.astring, "\x2a") == 0) printf("ok\n");
  return 0;
}
0 голосов
/ 10 апреля 2011

Вы не можете пересылать объявление func (int, int), когда на самом деле это func (int *, int *).Кроме того, каким должен быть возвращаемый тип func?Поскольку он не использует return, я бы предложил использовать void func (int *, int *).

0 голосов
/ 10 апреля 2011

В дополнение к изменениям, предложенным другими авторами для вашего тела функции, измените ваш прототип на void func(int *,int *) и измените определение вашей функции (ниже основной), чтобы оно также отражало пустоту.Когда вы не указываете тип возвращаемого значения, компилятор считает, что вы пытаетесь подразумевать возвращение типа int.

...