본문 바로가기
WORK/Sotfware

[Error] lvalue required as left operand of assignment

by KANG Stroy 2021. 5. 31.
728x90
728x90

요즘 주식에 주린이가 되어서 본업에 충실하지 못했내요. 그래서 컴파일을 돌렸더니 에러가 파바바바박 하고 발생했습니다. 아직도 공부를 하고 있다는것이 문제이기는 하지만, 그래도 배우는것은 즐거움이 아니겠습니까? 

주식도 공부하다 보니, 정보의 홍수속에서 옥석을 찾는게 필요한 부분으로 보입니다. 워렌이 말한 법칙 절대 잃지 말아라. 일어버리지 않기 위해서는 아마도 무수한 공부가 필요 하지 않겠습니까? 

위의 에러는 대입연산자에 피연산자를 넣었다 이런 글들이 보이는군요. 대입연산자는 무엇이고 피연산자는 무엇일까요? 

연산자 : 『수학』 벡터 공간, 함수 공간의 원소를 다른 원소에 대응시키는 변환. 수에 수를 대응시키는 보통의 함수 개념을 확장한 것이다.

피연산자 : 「1」 『정보·통신』 어떠한 연산을 할 때 연산의 대상이 되는 데이터.

「2」 『정보·통신』 연산의 대상이 되는 데이터의 주소를 갖는 부분.

대입 : 「1」 대신 다른 것을 넣음.

「2」 『수학』 대수식에서 문자 대신 특정한 수치를 바꾸어 넣는 일.

한글이 이렇게 어렵습니다. 

다 필요 없고 

대입연산자 = 피연산자 라고 보시면 됩니다. 

무언가 입력을 하려고 하는데 대입연산자와 피연산자가 서로 같은곳에 있을 수 없다는거. 예를 들어서 

10 = 20 

둘이 같을 수 있을까요? 상식적으로 같을 수가 없는 것입니다. 

아래와 같이 에러가 납니다.

int at; 

at + 1 = 20;

위와 같은 수식도 역시 에러가 발생하죠. 같을 수 없는 조건이 되는거죠. 

그런데 마이컴에서 이와 같은 형태가 종종 보이기도 합니다. 그러나 그것은 레지스터의 값에 접근하기 때문에 적용이 가능한 부분입니다. 

#define CLEAR_BIT(REG, BIT)   ((REG) &= ~(BIT))

엄밀히 말하면 왼쪽에 상수가 들어가면 안되는 겁니다. 

위의 define의 보면 (ST) 레지스터에 접근을 하도록 설정이 되어 있습니다. 

#define __HAL_FLASH_INSTRUCTION_CACHE_DISABLE() CLEAR_BIT(FLASH->ACR, FLASH_ACR_ICEN)
#define FLASH               ((FLASH_TypeDef *) FLASH_REG_BASE)

FLASH->ACR 은 레지스터 부분이고 

FLASH_ACR_ICEN 은 비트를 셋팅 하는 부분 입니다. 

#define FLASH_ACR_ICEN_Pos                  (9U)                               
#define FLASH_ACR_ICEN_Msk                  (0x1UL << FLASH_ACR_ICEN_Pos)      /*!< 0x00000200 */
#define FLASH_ACR_ICEN                      FLASH_ACR_ICEN_Msk

위의 Define을 사용하기 위해서 예를 들면

char a = 0x10;
printf("check %x \r\n",CLEAR_BIT(a,0x010));

이렇게 설정이 되면 

check 0    이 됩니다. 

만약 둘다 상수를 넣어 버리면 에러가 발생하겠지요? 

728x90

댓글