unsigned short int와 char간 형 이동의 오류 문제

raphael4의 이미지

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를 쓰고 있습니다.

현재 추측으로는 컴파일러 옵션에 따른 메모리 문제가 아닐까 싶습니다만...
아무리 찾아도 왜 이런 문제가 생기는지 이해가 안되 여기에 문의 드립니다.

라스코니의 이미지

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로 비교해보면 명확히 알 수 있을 겁니다.

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

Anti-Lock의 이미지

설마 함수의 프로토타입을 미리 알려주지 않아서 그런건 아니겠지요?

나빌레라의 이미지

함수 프로토타입을 미리 알려주지 않으면 arm gcc는 그냥 int로 넘기게 됩니다. 내부 코드에 따라 다르겠지만 함수 B()의 원래 코드의 char 보다 더 큰 타입으로 넘기니까 아마 문제 없지 않을까 싶습니다.

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.