2015-01-28 10 views
1

구조체를 함수에 전달하려고합니다. 가능한가요?struct 속성을 인수로 전달하는 방법

typedef struct 
{ 
    int maximumSpeed; 
    int leftMotorSpeed; 
    int rightMotorSpeed; 
    int timesAboveMaximumSpeed; 
    int batteryLevel; 
    int collisions; 

}robot; 

void setLeftMotorSpeed(int *speed, int *leftMotorSpeed, int *rightMotorSpeed) 
{ 
    *leftMotorSpeed = *speed; 
} 

void chooseRequest(int *command, int *speed, robot RP6) 
{ 
    switch(*command) 
    { 
     case 1: 
      setMaximumSpeed(speed, &RP6.maximumSpeed); 
      break; 
     case 2: 
      getMaximumSpeed(speed, &RP6.maximumSpeed); 
      break; 
     case 3: 
      setLeftMotorSpeed(speed, &RP6.leftMotorSpeed, &RP6.rightMotorSpeed); 
      moveAtSpeed(RP6.leftMotorSpeed, RP6.rightMotorSpeed);  
      break; 
     case 4: 
      setRightMotorSpeed(speed, &RP6.leftMotorSpeed, &RP6.rightMotorSpeed); 
      moveAtSpeed(RP6.leftMotorSpeed, RP6.rightMotorSpeed); 
      break; 
     case 5: 
      break; 
     case 6: 
      break; 
     case 7: 
      break; 
     default: 
      break; 
    } 
} 
+6

'c' 또는'C++'? 둘 다 아닙니다. – UmNyobe

+0

'& (RP6.some_part)'를 사용하는 것이 더 좋지 않습니까? – ForceBru

+0

그게 네가하는 것처럼 보인다. 코드의 문제점은 무엇입니까? – molbdnilo

답변

1

구조체에 포인터를 전달하고 함수가 필요한 필드를 수정하도록하면 코드가 더 간단 해집니다. 함수가 둘 이상의 로봇에서 정보를 가져와야하는 경우 개별 필드 (또는 해당 포인터) 만 전달하십시오. 이것은 물론, 사소한 예입니다

void setLeftMotorSpeed(robot *rptr, int speed) 
{ 
    rptr->leftMotorSpeed = speed; 
} 

: 귀하의 setLeftMotorSpeed 기능은 같은 것을 볼 수 있었다. moveAtSpeed 함수는 해당 함수의 의도가 특정 로봇 하나만 이동하려는 경우 로봇 포인터를 사용할 수도 있습니다.

이것은 객체 지향 사고의 시작입니다. 로봇을 설명하는 구조체를 만들었습니다. 다음 단계는 로봇 구조체 중 하나에서 작동하는 함수를 전체 로봇에 대한 논리적 연산으로 생각하여 로봇에게 "속도 향상"을 요청하는 코드를 비트별로 자세히 기록하지 않고도 작성할 수 있습니다. 어떻게 끝내 죠.

추신 : command에 대한 포인터를 사용하는 것은 좋지 않습니다. 간단한 읽기 전용 값은 일반 인수로 전달되어야합니다. 포인터를 "참조 해제"하기 위해 각 사용시에 추가 시간과 코드가 필요하며 추가 소스 코드 복잡성은 필요하지 않습니다. 이것은 약간의 차이이지만 전체 프로그램에서 이와 같은 일을하는 누적 효과가 중요 할 수 있습니다.

3

그냥

robot my_robot; 

setLeftMotorSpeed(&speed, &my_robot.leftMotorSpeed, &rightMotorSpeed); 
: 나는이 경우 내가 포인터

예를 통해 robot.leftMotorSpeed을 설정해야합니다 아래 setLeftMotorSpeed 같은 일반적인 함수를 생성하고 그들에게 내가 원하는 것을 전달하려는

이 작업을 수행하고 명시 적으로 요구하는대로 my_robot.leftMotorSpeed 값을 설정합니다.

2

chooseRequest() 함수는 수정할 수 있도록 robot에 대한 포인터를 가져야합니다.

작성한대로 함수를 종료 할 때 존재하지 않는 로컬 복사본을 수정하는 것입니다.

관련 문제