unsigned short int와 char간 형 이동의 오류 문제
글쓴이: raphael4 / 작성시간: 목, 2020/08/20 - 5:18오후
unsigned short int a; 선언 후
a에 값을 쓴 후
A(a); A함수 호출할 때 a변수 넣고
A(unsigned short int a)
{
B((char)a); A함수 안에서 다시 B함수 호출
}
B(char b)
{
b 변수 처리 중 죽는 현상 발생
}
위와 같은 상황에서 문제가 발생되는데
아래 처럼 변경 하면 문제가 발생 안됩니다.
unsigned short int a; 선언 후
a에 값을 쓴 후
char c = (char)a;
A(c); A함수 호출할 때 c변수 넣고
A(unsigned short int a)
{
B((char)a); A함수 안에서 다시 B함수 호출
}
B(char b)
{
b 변수 처리 이상 없음
}
A함수 호출전 unsigned short int값을 char 변수 c에 넣은 후
함수 A를 호출할때 C를 넣으면 프로그램이 정상 작동합니다.
임베디드 장비이고 chip은 STM32F를 쓰고 있습니다.
현재 추측으로는 컴파일러 옵션에 따른 메모리 문제가 아닐까 싶습니다만...
아무리 찾아도 왜 이런 문제가 생기는지 이해가 안되 여기에 문의 드립니다.
Forums:
char는 컴파일러, 프로세서에 따라 signed
char는 컴파일러, 프로세서에 따라 signed char 또는 unsigned char 일수 있습니다.
unsigned short int (unsigned) --> char (signed or unsigned???) 로의 흐름이 분명하지는 않네요.
(unsigned char)a 로 해보시면 어떨까요?
올려주신 코드 만으로는 딱히 문제가 생기면 안됩니다.
올려주신 코드 만으로는 딱히 문제가 생기면 안됩니다. 컴파일러가 두 케이스 모두 call by value로 파라메터를 넘긴다면 최종적으로 B() 함수가 받는 b 변수는 같은 값이어야 합니다.
아마도 b 변수 처리 코드 때문인것 같은데 b 변수를 어떻게 처리하는지 코드를 올려주시면 도움이 될 듯 합니다. 혹은 전역변수 c를 통해서 보내면 파라메터를 다르게 보낸다는 뜻인데.. 이거는 최종 변환된 어셈블리 코드를 보고 차이를 확인해야 합니다.
해당 코드를 모두 어셈블리어로 뽑아서 diff로 비교해보면 명확히 알 수 있을 겁니다.
----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라
설마 함수의 프로토타입을 미리 알려주지 않아서 그런건
설마 함수의 프로토타입을 미리 알려주지 않아서 그런건 아니겠지요?
함수 프로토타입을 미리 알려주지 않으면 arm
함수 프로토타입을 미리 알려주지 않으면 arm gcc는 그냥 int로 넘기게 됩니다. 내부 코드에 따라 다르겠지만 함수 B()의 원래 코드의 char 보다 더 큰 타입으로 넘기니까 아마 문제 없지 않을까 싶습니다.
----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라
댓글 달기