const char* 어레이를 갖고 있는 구조체 초기화 질문입니다.

parkon의 이미지

제가 하려고 하는 건
예를 들어

struct MyStruct {
   const char* name;
   const char* case1[2];
   const char* case2[2];
} my_data[] = {
   {"name1", {"aa1", "ab1"}, {"ba1","bb1"}},
   {"name2", {"aa2", "ab2"}, {"ba2","bb2"}},
// ...
   {"", {"", ""}, {"",""}} // end of data
};

입니다.
근데 이렇게 하니까 에러가 뜨면서 컴파일이 안되는군요.
(좀 더 정확히는 제가 맥 OSX 상에서 ROOT라는 툴킷의 cint라는 놈을 쓰고 있습니다.)

그래서

struct MyStruct {
   const char* name;
   const char* case1[2];
   const char* case2[2];
} my_data[] = {
   {"name1", "aa1", "ab1", "ba1","bb1"},
   {"name2", "aa2", "ab2", "ba2","bb2"},
// ...
   {"", "", "", "",""} // end of data
};

이렇게 하니까 컴파일은 되는데
런타임때 제대로 실행이 안되는 걸 알 수 있습니다.
예를 들어, 첫번째 원소의 경우, case1[1]이 "ab1"이 아니고 0으로 되더군요 (이것 말고도 프로그램이 아주 이상히 돌아요).

그래서 세번째 시도로

struct MyStruct {
   const char* name;
   const char* case1[2];
   const char* case2[2];
} my_data[] = {
   {"name1", (const char*[2]){"aa1", "ab1"}, (const char*[2]){"ba1","bb1"}},
   {"name2", (const char*[2]){"aa2", "ab2"}, (const char*[2]){"ba2","bb2"}},
// ...
   {"", {"", ""}, {"",""}} // end of data
};

이렇게 하니까 컴파일 에러가 뜨고요.

제 문제에 대한 조언 주시면 감사하겠습니다.

kukyakya의 이미지

에러가 뜨면 어떤 에러가 뜨는지를 알려주셔야 다른 분들이 답변하기 좋을 것 같습니다.

parkon의 이미지

제 환경이 보통의 컴파일러가 아니라 ROOT의 C++ 인터프리터인 cint라고 불리는 조금 이상한 녀석이어서
에러 메시지를 뺐었는데요,

조금전에 위 내용을 포함하는 프로그램을 만들어서 실행해 보니
c++로 컴파일 하면 (적어도 컴파일은) 아무 에러 없이 잘 되는데
cint 환경에서는

Syntax Error: {"",{"",""},{"",""}} Maybe missing ';' b2.C:12:
*** Interpreter error recovered ***

이런 메시지가 뜨는 군요.

어쩌면 제 첫번째 시도가 사실상 C++의 문법에는 맞지만,
C++의 대부분을 지원한다는 cint가 위의 경우만 예외적으로 지원을 못하는 것일지도 모르겠네요.

라스코니의 이미지

보니 멤버가 전부 const 인데 아예 이렇게 하면 안되나요?

struct MyStruct {
char* name;
};

const struct MyStruct myData[] = { "name1", ,,, };

parkon의 이미지

말씀하신대로 해 봤는데 잘 안되는 군요 ...

라스코니의 이미지

이렇게 해보세요

struct MyStruct {
char* name;
};

char SSS[] = "name1";

const struct MyStruct myData[] = { SSS, ,,, };

parkon의 이미지

말씀하신대로 각각의 문자열에 char* (혹은 const char*)변수를 할당해서 하면 아마
잘 될듯 싶은데요, 코드가 너무 길어지고 지저분해 질것 같아
일단 저 struct array를 아예 안쓰는 방향으로 코드 수정했습니다.
답변 감사드립니다.

klara의 이미지

CINT의 버그같네요. 제일 처음에 올리신 방법이 적법한 방법입니다. 그냥 하나씩 멤버찍어서 초기화하셔야 할듯합니다.

parkon의 이미지

cint에 대해 잘 알지 못해 아직 자신할 수 없지만
저도 cint의 버그 혹은 한계가 아닐까 생각하고 있습니다.
우선은 저 struct에 해당하는 클래스를 만들고,
저 데이타 어레이의 각 데이타를 이에 해당하는 생성자를 호출하고 생성된 녀석들을 컨테이너에 넣는 방식으로
임기응변 하니, 완전 삽질이긴 하지만, 일단 코드는 잘 도는 군요.
답변 감사 드립니다.

댓글 달기

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