#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().