C 언어 변수 초기화 관련 질문입니다.

gata102의 이미지

너무 쉬운 질문을 하는 게 아닌지 모르겠네요.
프로그래밍을 정식으로 배운건 아니고... 전공에서 필요하다가 보니... 필요한 부분만 조금 아는 C유저 입니다. ㅡ_ㅡ;;
전 주로 MCU를 이용해 시스템 제어 코드를 많이 짜는데, 범용성을 올리기 위해 프로그램을 수정하고 있습니다.

제가 하고 싶은 기능은 define을 통해 몇몇 파라미터를 바꾸면 컴파일러가 미리 계산해서 변수를 초기화 하는 코드를 만들고 싶습니다.

예)

#define param1 1.2

const float Coeff1 = param1 * param1 ;

... 뭐 이런 형식으로 수정중인데요... define에 길게 늘어서 쓰면 ... 연산시간이 그대로 쭉 늘어지더군요 ㅠ_ㅠ..

1차적인 파라미터 연산은 위처럼 해결되는 데요.. 문제는...

const float Coeff1_s = Coeff1 * Coeff1 ;

... 이렇게 또 선언해야 할 일이 많은데 에러를 뿜내요... error #28: expression must have a constant value...

두세번 변수를 갖다써서 초기화 하면 코드가 상당히 많이 정리될 거 같은데... ^^;;

즉 제 질문은 .... --> 상수화된 변수를 이용해 또 상수를 선언하고 싶어요... ( 컴파일러가 꼭 미리 계산해서 빌딩해야됨 ..... )

방법이 있을까요? ..

고수분들 도와주세요 ~_~;;

익명 사용자의 이미지

말씀하시는 "미리 계산하는" 과정은 컴파일러가 아닌 전처리기(pre-processor)에 의해서 이루어 집니다.

 const float Coeff1_s = Coeff1 * Coeff1;

가 에러가 나는 이유는 우항에 상수가 아닌 상수형변수가 왔기 때문입니다.

원하시는 결과를 얻기 위해서는

#define param1 1.2
#define Coeff1 (param1 * param1)
#define Coeff1_s (Coeff1 * Coeff1)

위와 같이 작성하시면 될 거 같습니다.

gata102의 이미지

답글 감사합니다.

전처리기가... 빌딩이 끝나면 코드 실행시간에 영향을 안 미치는 건 같은 거죠?.. ^^; 제가 잘 이해했나 모르겠네요. 위의 변수들을 ISR에서 파라미터들을 많이 불러서 쓰는데...

문제는 define은 연산을 해서 들어가는 게 아니라... 그 부분이 그대로 copy되는 걸로 알고 있습니다.
덕분에 연산시간이 전부 늘어나버리는 문제가 발생하더군요...

const 는 연산 시간이 일단 늘어나지는 않는데... define 처럼 중복해서 쓸수가 없더군요...

define처럼 중복해서 쓰면서... const처럼 계산이 미리 됐으면 좋겠네요 ..
제대로된 질문인지도 모르겠네요 ㅠㅠ..

엉겁결에C유저

klara의 이미지

최적화 옵션 아예 안쓰시나요? 보통 컴파일러는 상수 계산은 컴파일타임에 알아서 처리하는 최적화를 합니다.

gata102의 이미지

ISR 코드가 nop()가 좀 많고... timing이 매우 중요한 코드라서요..

최적화는 --; 전혀 안 시켰습니다.

거의 기계어라고 보셔도 무방할 정도입니다.

최적화 시키면 파형이 좀 깨져서... --> 시스템 돌리면 아마 폭발할듯

... 원체 기계어같은 코드라서 최적화 없이 하고 싶은데 ...

최적화를 부분적으로 시키는 방법은 찾아봐야 겠네요.

답변 고맙습니다.

엉겁결에C유저

댓글 달기

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