const char* 어레이를 갖고 있는 구조체 초기화 질문입니다.
글쓴이: parkon / 작성시간: 월, 2014/01/27 - 2:49오후
제가 하려고 하는 건
예를 들어
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 };
이렇게 하니까 컴파일 에러가 뜨고요.
제 문제에 대한 조언 주시면 감사하겠습니다.
Forums:
에러가 뜨면 어떤 에러가 뜨는지를 알려주셔야 다른
에러가 뜨면 어떤 에러가 뜨는지를 알려주셔야 다른 분들이 답변하기 좋을 것 같습니다.
제 환경이 보통의 컴파일러가 아니라 ROOT의 C++
제 환경이 보통의 컴파일러가 아니라 ROOT의 C++ 인터프리터인 cint라고 불리는 조금 이상한 녀석이어서
에러 메시지를 뺐었는데요,
조금전에 위 내용을 포함하는 프로그램을 만들어서 실행해 보니
c++로 컴파일 하면 (적어도 컴파일은) 아무 에러 없이 잘 되는데
cint 환경에서는
Syntax Error: {"",{"",""},{"",""}} Maybe missing ';' b2.C:12:
*** Interpreter error recovered ***
이런 메시지가 뜨는 군요.
어쩌면 제 첫번째 시도가 사실상 C++의 문법에는 맞지만,
C++의 대부분을 지원한다는 cint가 위의 경우만 예외적으로 지원을 못하는 것일지도 모르겠네요.
보니 멤버가 전부 const 인데 아예 이렇게 하면
보니 멤버가 전부 const 인데 아예 이렇게 하면 안되나요?
struct MyStruct {
char* name;
};
const struct MyStruct myData[] = { "name1", ,,, };
말씀하신대로 해 봤는데 잘 안되는 군요 ...
말씀하신대로 해 봤는데 잘 안되는 군요 ...
이렇게 해보세요 struct MyStruct {
이렇게 해보세요
struct MyStruct {
char* name;
};
char SSS[] = "name1";
const struct MyStruct myData[] = { SSS, ,,, };
말씀하신대로 각각의 문자열에 char* (혹은
말씀하신대로 각각의 문자열에 char* (혹은 const char*)변수를 할당해서 하면 아마
잘 될듯 싶은데요, 코드가 너무 길어지고 지저분해 질것 같아
일단 저 struct array를 아예 안쓰는 방향으로 코드 수정했습니다.
답변 감사드립니다.
CINT의 버그같네요. 제일 처음에 올리신 방법이
CINT의 버그같네요. 제일 처음에 올리신 방법이 적법한 방법입니다. 그냥 하나씩 멤버찍어서 초기화하셔야 할듯합니다.
cint에 대해 잘 알지 못해 아직 자신할 수
cint에 대해 잘 알지 못해 아직 자신할 수 없지만
저도 cint의 버그 혹은 한계가 아닐까 생각하고 있습니다.
우선은 저 struct에 해당하는 클래스를 만들고,
저 데이타 어레이의 각 데이타를 이에 해당하는 생성자를 호출하고 생성된 녀석들을 컨테이너에 넣는 방식으로
임기응변 하니, 완전 삽질이긴 하지만, 일단 코드는 잘 도는 군요.
답변 감사 드립니다.
댓글 달기