[질문] #define의 선언 문제인데요... 이유를 모르겠습니다.

minonnet의 이미지

다음의 예와 같이 define을 1번과 같이 할 경우에는 이상이 없지만.
2번과 같이 할 경우에는 모터의 동작이 이상하게 동작합니다.
둘다 컴파일 에러는 없지만, 1번에서만 다음과 같은 warning은 발생합니다.
"warning: integer operation result is out of range"

//==============================================
// 1번
#define MOTOR_INTERPOLATOR			64
#define MOTOR_POLES				12
#define MOTOR_STANDARD_LINECOUNTS		9000
#define MOTOR_POLE_PAIRS			(MOTOR_POLES * 0.5)
#define MOTOR_RESOLUTION			(MOTOR_STANDARD_LINECOUNTS * MOTOR_INTERPOLATOR)
#define MOTOR_HALF_OF_RESOLUTION		(MOTOR_RESOLUTION * 0.5)
#define MOTOR_QPOSINIT				(MOTOR_RESOLUTION * 2)
#define MOTOR_QPOSMAX				(MOTOR_QPOSINIT * 2)
 
//================================================
// 2번
#define MOTOR_INTERPOLATOR			64
#define MOTOR_POLES				12
#define MOTOR_STANDARD_LINECOUNTS		9000
#define MOTOR_POLE_PAIRS			6
#define MOTOR_RESOLUTION			576000
#define MOTOR_HALF_OF_RESOLUTION		288000
#define MOTOR_QPOSINIT				1152000
#define MOTOR_QPOSMAX				2304000

위의 1번과 2번은 똑같다라고 생각되는데 다른 점이 있나요?

참고적으로 작업환경은 다음과 같습니다.
OS: Windows XP (sp3)
컴파일러: CCStudio <-- TI에서 만든 DSP 칩을 통합 컴파일러 환경
사용 MCU: TMS320F28335
모터 : 서보 모터

--------------------------------
즐거운 하루 되세요...
아~자~~!

라스코니의 이미지

타켓이 16 bit 시스템인가 보네요

2^16-1 은 65535 이므로 warning이 나는 듯 합니다.

#define MOTOR_RESOLUTION (MOTOR_STANDARD_LINECOUNTS * MOTOR_INTERPOLATOR) 등을

#define MOTOR_RESOLUTION (long 또는 long long)(MOTOR_STANDARD_LINECOUNTS * MOTOR_INTERPOLATOR)

으로 해주면 될 듯 합니다.

minonnet의 이미지

타켓은 32bit 입니다. 라스코니님 께서 말씀하신데로 뒷 부분을 형변환하는 것이 맞는 것 같아서 다음과 같이 바꿨습니다.
하지만 예전히 동일한 warning 메세지와 이상한 동작을 하네요...

#define MOTOR_POLE_PAIRS				(int)(MOTOR_POLES * 0.5)
#define MOTOR_RESOLUTION				(unsigned long)(MOTOR_STANDARD_LINECOUNTS * MOTOR_INTERPOLATOR)
#define MOTOR_HALF_OF_RESOLUTION		(unsigned long)(MOTOR_RESOLUTION * 0.5)
#define MOTOR_QPOSINIT					(unsigned long)(MOTOR_RESOLUTION * 2)
#define MOTOR_QPOSMAX					(unsigned long)(MOTOR_QPOSINIT * 2)
#define MOTOR_ANGLE_PER_RESOLUTION		(float)(360 / MOTOR_RESOLUTION)

--------------------
즐거운 하루 되세요...
아~자~~!

eungkyu의 이미지

#define MOTOR_RESOLUTION				((unsigned long) MOTOR_STANDARD_LINECOUNTS * MOTOR_INTERPOLATOR)

이렇게 하면요?

라스코니의 이미지

unsigned long은 unsigned 와 같은 경우가 많습니다.

unsigned long long 으로 해 보세요.

ifree의 이미지

(unsigned long)MOTOR_STANDARD_LINECOUNTS * (unsigned long)MOTOR_INTERPOLATOR

타이프의 문제 등으로 상수를 #define 으로 정의하는 것은 바람직하지 않습니다.
const 로 명확하게 정의하는게 좋지 않을까요?

dosuser의 이미지

int 와 double 의 연산결과는 double입니다.
근데 그 결과에 명시적 캐스팅을 해도 warning이 나는건가요? 해당 컴파일러를 사용해보지 않아서;;; warning 발생 위치도 알면 좋을텐데요

해당 상수값들을 사용하는 다른곳에서도 int가 double로 바뀌었을 수 있습니다.
그리고 타입이 double이다 보니 정밀도 같은게 문제가 될수도 있고요

상수 선언부가 아닌, 값을 사용하는 곳에 문제가 있어서 1번은 실수 했는데 동작하는 경우고 2번이 올바른데 오작동하는 경우는 아닐까요? 저는 그런 경우가 종종있었어서;;
저도 옛날에 만들어진 전기분야 C소스들 보니 1번같은 코드가 많아서 계산식은 코멘트로 옆에 붙여 놓고 값은 직접 써 넣는 걸로 바꾸었습니다.
실제 값을 사용하는 곳에서 올바른 값을 사용하고있는지 보는게 좋을것같습니다.

프로그래머 다운 프로그래머가 되고 싶습니다. 많은 지도 편달 부탁드립니다^^

프로그래머 다운 프로그래머가 되고 싶습니다. 많은 지도 편달 부탁드립니다^^

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.