2014-04-01 2 views
0

동일한 코드와 관련된 몇 가지 질문이 있습니다. 이 코드에서는 "submerged_volume"함수에서 V, Ug1, Ug2, Vg1 및 Vg2의 값을 반환하려고합니다. 그런 다음이 값을 "centre_of_buoyancy"함수에 사용하고 싶습니다. 이 함수에서 Uc와 Vc의 두 값을 반환하고 싶습니다. 마지막으로, 필자는 메인에서 헤더 파일을 사용하여이 함수를 호출하고 함수에서 반환 된 값을 사용하여 추가 계산을 수행합니다. 내가 반환 할 수 없으므로이 작동하지 않습니다 이해헤더 파일에 여러 값 반환

#ifndef DATE_H_ 
#define DATE_H_ 

double submerged_volume(double L1, double L2, double Lavg, double H) { 

    //Boat parameters 
    double V1, V2; 
    double Ug1, Ug2, Vg1, Vg2;  //lengths in U and V direction in relation to gravity 
    double V;      //Submerged volume 

    //Initialising V, the value to calculate 
    V = 0; 

    //Volume Calculations 
.... 
.... 

return V, Ug1, Ug2, Vg1, Vg2, V1, V2; 
    } 

double centre_of_buoyancy(double Ug1, double Ug2, double Vg1, double Vg2, double V1, double V2); 
//Calculations for Uc and Vc 
..... 
..... 
return Uc, Vc; 

} 

#endif 

: 그냥 긴 계산을 가지고 있으므로 공간을 위해, 여기에 요약 내 코드의 버전의 나는 본체를 포함하지 않은 여러 변수. 제 질문은, 제가 할 수있는 방법이 있습니까? 나는 C에 매우 익숙하며 정확히 이런 것들을 사용하는 방법을 정확히 모르겠다!

답변

0

이것을하는 방법이 있고, struct이라고합니다. struct을 사용하면 데이터를 집계하여 단일 유형으로 보게됩니다.

struct boat_params 
{ 
    double submerged_volume; 
    double length_in_U1, 
      length_in_U2, 
      length_in_V1, 
      length_in_V2; 
    /* etc */ 
}; 

한 다음이 정보를 작성하고 반환 :

struct boat_params submerged_volume(double L1, double L2, double Lavg, double H) { 

    //Boat parameters 
    struct boat_params params; 

    //Initialising V, the value to calculate 
    params.submerged_volume = 0; 

    //Volume Calculations (params.<fields>) 
    .... 
    .... 

    return params; 
} 

그것은 의미가를 만들 수 있습니다 당신은 데이터의 각 부분에 이름을 줄 수 있기 때문에 즉, 아주 좋다 함수의 인수도 구조체가 많기 때문에 모두 유사합니다 (모두 double). 매개 변수가 많은 경우 struct을 만들면 임의의 순서가 아닌 매개 변수 이름에 매개 변수 값을 쉽게 할당하여 함수 (및 자신)의 사용자가 정상적으로 유지하는 데 도움이됩니다.예를 들어

:

struct boat_data 
{ 
    double L1, L2; /* of course, give better names */ 
    double Lavg; 
    double H; 
}; 

struct boat_params submerged_volume(struct boat_data boat); 

사용자는 할 것이다 : 당신이 포인터에 대해 배울되면

struct boat_data boat; 
struct boat_params params; 

boat.L1 = ...; 
boat.L2 = ...; 
.... 

params = submerged_volume(boat); /* look how nice this looks */ 

, 당신은 포인터를 전달보다는 대량 복사하여 좀 더 효율적으로 만들 수 있습니다 데이터의 :

void submerged_volume(struct boat_data *boat, struct boat_param *params); 

    //Initialising V, the value to calculate 
    params->submerged_volume = 0; 

    //Volume Calculations (params-><fields>) 
    .... 
    .... 
} 

이상 :

struct boat_data boat; 
struct boat_params params; 

boat.L1 = ...; 
boat.L2 = ...; 
.... 

submerged_volume(&boat, &params); /* less nice, but efficient and still short */ 
+0

좋아, 이것을 시도해 볼게! 자세한 설명 주셔서 감사합니다 ... 나는 "프로그래머의 마음"이 – user3460758

+0

@ user3460758을 통해 일할 필요가 있다고 생각하지 않는다면 거기에 도착할 것이다 :) [C 책 ] (http://stackoverflow.com/q/562303/912144)를 참조하십시오. – Shahbaz

+0

걱정하지 마세요. 나는 가능한 한 많은 피드백을 얻으려고합니다! 귀하의 도움을 다시 주셔서 감사합니다 – user3460758

1

이러한 값을 보유하는 struct을 정의한 다음 함수에서 반환 할 수 있습니다. (struct의 문서를 보려면 C 참조를 확인하십시오.)

현재 "헤더에서"아무 것도 반환하지 않으면 "함수에서"무엇인가 반환됩니다. 그리고 헤더 파일에 함수를 정의하면 에 문제가 발생합니다. 아이디어는 헤더에있는 함수를 선언하고 소스 (.c) 파일에 정의합니다.

나는 당신이하려고하는 것을 정말로 이해하지 못했기 때문에, 내 자신의 예를 사용하여 실례합니다.

헤더 :

#ifndef POINT_H_ 
#define POINT_H_ 

struct point_t 
{ 
    int x; 
    int y; 
}; 

struct point_t move_horizontal(struct point_t point, int offset); 
struct point_t move_vertical(struct point_t point, int offset); 

#endif 

출처 :

#include "point.h" 

struct point_t move_horizontal(struct point_t point, int offset) 
{ 
    point.x += offset; 
    return point; 
} 

struct point_t move_vertical(struct point_t point, int offset) 
{ 
    point.y += offset; 
    return point; 
} 

홈페이지 :

#include "point.h" 

int main() 
{ 
    struct point_t some_point = { 0, 0 }; 
    struct point_t other_point = move_horizontal(some_point, 42); 
    return 0; 
} 

물론 비 sensical,하지만 당신은 아이디어를 얻을 수 있습니다. Source와 Main은 두 개의 별개의 컴파일 단위 인이며 둘 다 말하는 내용을 알기위한 머리글을 포함합니다. 그런 다음 링커는 이들을 결합하여 런타임 지원을 추가하고 바이너리를 생성합니다. (선택의 당신의 C 책 는 진짜로는 너에게 말 했어야한다.)

+0

아, 함수는 별도로 작성해야하며 헤더 파일의 목적은 주 파일에서 쉽게 사용할 수 있도록 함께 가져 오는 것입니다. 죄송합니다. 아마도 이것이 바보 같은 질문 일 수 있습니다. 구조체를 반환하는 방법을 연구했지만 아직 얻지 못했습니다 .. – user3460758

+0

@ user3460758 : 업데이트 된 답변보기. – DevSolar

+0

흠 ...이 다음과 같은 문제가 생겼습니다 ... 저는 프로그래밍에 새로운 것이므로 포인터와 모든 것을 이해하는 데 큰 도움이되지 않습니다! 나는 그걸로 좀 더 돌아 다닐 것이고 당신의 제안으로 어디든 갈 수 있는지 알아 보겠습니다. – user3460758

0

일반적으로 헤더 파일에 함수 프로토 타입을 정의하고 .c 파일에 구현을 정의합니다.

마찬가지로 @DevSolar는 구조체를 정의하고 함수에서이를 반환 할 수 있다고 말했습니다.

struct Boat 
{ 
    double V1, V2; 
    double Ug1, Ug2, Vg1, Vg2; 
}; 

다른 방법으로 참조로 인수를 전달하고 포인터를 통해 메모리에서 직접 변수를 수정할 수 있습니다.

+0

이 작업을 수행하려고하는데 혼란 스럽습니다 ... submerged_volume에 대한 입력 값으로 사용되는 값 L1, L2 등이 내 main, submerged_volume 함수에서 계산 된 값으로 구조체를 채우는 방법을 간단한 예를 들어 설명해 줄 수 있습니까? – user3460758

+0

@Visa는 인종 차별주의가 그의 답변에 상세한 예를 제공하고 있습니다. – CatsLoveJazz