C 또는 C++에서 컴파일시간에 결정가능한 상수에 대해 질문드립니다.

twinwings의 이미지

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
 
 
static unsigned int arr[UCHAR_MAX][UCHAR_MAX];
 
void main()
{
    for (int i = 0; i < UCHAR_MAX; i++)
    {
        for (int j = 0; j < UCHAR_MAX; j++)
            arr[i][j] = i*j;
    }
}

제목이 요상하군요. 뭐라고 적어야 할 지..

매우 간단합니다. 그냥 큰배열이 미리 계산해놓은 값들을 저장하려고 하는데요.
(정적인 라우팅 테이블이라던가..뭐 그런것이 되겠지요..)

이렇게 하면 문제점이 매번 실행시 똑같은 배열을 초기화 한다는 겁니다.

즉, 제가 원하는것은 어차피 런타임에 바뀌는 자료가 아니니, 컴파일시간에 계산을 완료하고

실행파일에 그 정보를 넣고싶은겁니다.

제가아는 해결법은 TMP 기법이 있지만..다른 쉬운 방법이 없을까요?

mirheekl의 이미지


결과를 바이너리 값이나 기타 공간에 한 번 저장한뒤에 이걸 배열 초기화용 소스코드로 변환시켜주는 툴을 사용하거나 자작하든지.

결과값을 저장하는 바이너리를 리소스 형태로 실행파일에 포함시켜버리든지

처음 실행했을때 계산값을 임시파일에 저장하고 다음번부터는 그 임시파일을 읽는다든지 (데이터를 유출하면 안되거나 단순한 계산일 경우에는 의미가 없겠지만..)

프리프로세서로 해결하든지 (루프를 구현해둔 예제를 쉽게 찾을 수 있습니다) 등등.

--

kukyakya의 이미지

TMP를 제외시킨 이유가 있으신가요? objcopy로 실행 파일에 넣는 방법도 어렵진 않지만 컴파일러가 해당 데이터를 컴파일 타임에 알 수가 없어 최적화에 다소 손해를 보지 않을까 싶습니다. 프리프로세서로 처리하는 방법은 거의 Write once, read never 수준이라 추천해드리고 싶지가 않네요.

kaeri17의 이미지

D에서는 쉽게 되는데... C++은 TMP가 제일 나을것 같네요.

cinsk의 이미지

$ echo "What do you want?" > tmp.bin
$ xxd -i tmp.bin
unsigned char tmp_bin[] = {
  0x57, 0x68, 0x61, 0x74, 0x20, 0x64, 0x6f, 0x20, 0x79, 0x6f, 0x75, 0x20,
  0x77, 0x61, 0x6e, 0x74, 0x3f, 0x0a
};
unsigned int tmp_bin_len = 18;
$ _

댓글 달기

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