결과 int
와 결과를 생성하는 함수가있는 경우 함수 string
에서 둘 다 반환하려면 어떻게해야합니까?
내가 알 수있는 한, 함수 이름 앞의 유형에 의해 결정된대로 한 가지만 반환 할 수 있습니다.
답변
나는 당신 string
이 무엇인지 모르지만 그것이 자체 메모리를 관리한다고 가정 할 것입니다.
두 가지 솔루션이 있습니다.
1 : struct
필요한 모든 유형을 포함 하는 a 를 반환 합니다.
struct Tuple {
int a;
string b;
};
struct Tuple getPair() {
Tuple r = { 1, getString() };
return r;
}
void foo() {
struct Tuple t = getPair();
}
2 : 포인터를 사용하여 값을 전달합니다.
void getPair(int* a, string* b) {
// Check that these are not pointing to NULL
assert(a);
assert(b);
*a = 1;
*b = getString();
}
void foo() {
int a, b;
getPair(&a, &b);
}
어떤 것을 사용하기로 선택하는지는 주로 당신이 더 좋아하는 의미에 대한 개인적인 선호도에 달려 있습니다.
답변
Option 1
: int 및 string을 사용하여 구조체를 선언하고 구조체 변수를 반환합니다.
struct foo {
int bar1;
char bar2[MAX];
};
struct foo fun() {
struct foo fooObj;
...
return fooObj;
}
Option 2
: 포인터를 통해 둘 중 하나를 전달하고 포인터를 통해 실제 매개 변수를 변경하고 다른 하나를 평소와 같이 반환 할 수 있습니다.
int fun(char **param) {
int bar;
...
strcpy(*param,"....");
return bar;
}
또는
char* fun(int *param) {
char *str = /* malloc suitably.*/
...
strcpy(str,"....");
*param = /* some value */
return str;
}
Option 3
: 옵션 2와 유사합니다. 포인터를 통해 둘 다 전달하고 함수에서 아무것도 반환하지 않을 수 있습니다.
void fun(char **param1,int *param2) {
strcpy(*param1,"....");
*param2 = /* some calculated value */
}
답변
결과 유형 중 하나가 문자열 (그리고 C ++이 아닌 C를 사용하고 있음)이므로 포인터를 출력 매개 변수로 전달하는 것이 좋습니다. 사용하다:
void foo(int *a, char *s, int size);
다음과 같이 호출하십시오.
int a;
char *s = (char *)malloc(100); /* I never know how much to allocate :) */
foo(&a, s, 100);
일반적으로 함수 자체가 아닌 호출 함수 에서 할당을 수행하는 것을 선호 하므로 다른 할당 전략에 대해 최대한 개방 될 수 있습니다.
답변
두 가지 접근 방식 :
- 반환 값을 포인터로 전달하고 함수 내에서 수정하십시오. 함수를 void로 선언하지만 포인터로 전달 된 값을 통해 반환됩니다.
- 반환 값을 집계하는 구조체를 정의합니다.
반환 값이 너무 많으면 지루할 수 있지만 # 1은 무슨 일이 일어나고 있는지에 대해 조금 더 분명하다고 생각합니다. 이 경우 옵션 # 2는이 목적을위한 특수 구조체를 만드는 데 정신적 오버 헤드가 있지만 꽤 잘 작동합니다.
답변
구조체를 만들고 내부에 두 개의 값을 설정하고 구조체 변수를 반환합니다.
struct result {
int a;
char *string;
}
char *
프로그램에 공간을 할당 해야합니다.
답변
함수 매개 변수로 포인터를 사용하십시오. 그런 다음이를 사용하여 여러 값을 반환합니다.
답변
함수에 대한 참조로 매개 변수를 전달합니다.
예 :
void incInt(int *y)
{
(*y)++; // Increase the value of 'x', in main, by one.
}
또한 전역 변수를 사용하지만 권장하지 않습니다.
예:
int a=0;
void main(void)
{
//Anything you want to code.
}
