Обработка функций с более чем одним выходным параметром

#c

#c

Вопрос:

Как мы обрабатываем более одного выходного параметра в C .Я новичок в C , и в настоящее время я пытаюсь написать функцию A, которая вызывает другую функцию B какого-то другого класса, функция B состоит всего из 6 параметров, из которых три являются входными параметрами, а остальные три — выходными параметрами.Как я могу получить доступ ко всем трем выходным параметрам в моей функции A? Я попытался сделать это следующим образом…Кто-нибудь может помочь мне исправить мой код, если я ошибся ..?Пожалуйста, помогите мне, друзья..

 class A ::functionA()
   {
      int in_a=1;
      string in_b= "name";
      int in_c=3; 
      int ot_a=0;
      int ot_b=0;
      string ot_s1="" 

      ClassB *classB();
      classB = classB.functionB(in_a,in_b,in_c,ot_a,ot_b,ot_s1); //is this way correct?
      ot_a= ? ;
      ot_b=? ;
      ot_s1=?
    }
  

могу ли я использовать что-то вроде ot_a=ClassB.ot_a?Пожалуйста, помогите мне…

Комментарии:

1. Что произошло, когда вы попробовали это? Это сработало или выдало вам сообщение об ошибке?

2. пожалуйста, покажите подпись для B::functionB, или это то, что вам интересно о том, как написать functionB?

3. если это домашнее задание, пожалуйста, добавьте к нему тег homework.

Ответ №1:

Вы неправильно поняли базовый синтаксис C . ClassB *classB(); не создает никакого объекта, он объявляет прототип функции function, classB который возвращает ClassB* . Чтобы создать объект, вы должны сделать ClassB b; , а затем использовать b , как вы уже сделали. Выходные переменные будут корректно заполнены функцией, если она принимает свой параметр по ссылке.

Ответ №2:

Для нескольких возвращаемых значений у вас обычно есть два варианта:

  • возвращайте a struct , содержащий ваши возвращаемые значения
  • передавайте возвращаемые значения по каждой ссылке.

Оба примера продемонстрировали:

 // first approach, struct return
struct myReturns{
  int int_return;
  float float_return;
};

myReturns MyFunc(int param1, char* param2, ...){
  // do some stuff with the parameters
  myReturns ret;
  ret.int_return = 42;
  ret.float_return = 13.37f;
  return ret;
}

// calling it:
myReturns ret = MyFunc(/*pass your parameters here*/);
int i = ret.int_return;
float f = ret.float_return;

// second approach, out parameters
void MyFunc(int inParam1, char* inParam2, intamp; outInt, floatamp; outFloat){
  // do some stuff with the parameters
  outInt = 42;
  outFloat = 13.37f;
}

// calling it:
int i;
float f;
MyFunc(/*your parameters here*/,i,f);
// i and f are now changed with the return values
  

Комментарии:

1. @Victor: Я исключил указатель, поскольку OP, похоже, не очень опытен в C . 🙂 И кыш, глобальные переменные!

Ответ №3:

Как упоминалось в ответе Xeo, вы можете использовать возвращаемые структуры или ссылки. Есть и другая возможность — использовать указатели. Указатели позволяют вам сделать одну вещь: если вызываемая вами функция может использоваться для вычисления нескольких сведений, но вам не нужны все из них, вы можете передать NULL в качестве значения указателя, чтобы функция знала, что ей не нужно заполнять эти сведения.

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

 void f()  
{   
    type1* p1 = new type1();  
    type2* p2 = NULL
    g(p1, p2);
}

void g(type1* param1, type2* param2)  
{
    //Do some computation here
    if (param1 != NULL)
    {
        //Do something here to fill param1
    }
    if (param2 != NULL)
    {
        //Do something here to fill param2
    }
}
  

Но, как общее правило, лучше использовать ссылки, когда это возможно, и указатели, когда это необходимо. Если функция не обрабатывает случай, когда переданный ей указатель равен NULL, вы закончите с аварийным завершением. Ссылки не могут быть нулевыми, поэтому они позволяют избежать этой проблемы.

Ответ №4:

Ответ: ссылки.

Ответ №5:

 ClassB *classB();
classB = classB.functionB(in_a,in_b,in_c,ot_a,ot_b,ot_s1);
  

Просматривая . оператор после classB , я предполагаю, что вы думаете, classB что это объект. Нет, это не так.

 ClassB *classB();
  

В приведенном выше заявлении говорится — classB() это функция, которая не принимает параметров, а возвращаемый тип является ссылкой на ClassB .

Комментарии:

1. @Als — Я ничего не упоминал в этих строках в своем посте.

2. @Als — Нет того места, где я привел свой код. Это всего лишь код OP в вопросе, и я объясняю, что это на самом деле означает.

3. @Als — Что еще я могу сказать оператору, кроме того, что то, что он / она создает, не является объектом. Любой способ рассмотрит ваше предложение здесь после. Спасибо.

4. Мне кажется, что я был слишком занят, или я неправильно истолковал чей-то ответ как ваш… Прошу прощения.. Продолжайте в том же духе.

Ответ №6:

Если вы можете изменить функцию B(), тогда используйте указатели в качестве параметров. Таким образом, вы можете изменить значения внутри functionB(), и они будут изменены непосредственно в functionA().