자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
C++ Builder 64bit struct 사용 문제
2019.01.18 16:32
도무지 그 원인을 알 수 없는 문제가 생겨 이렇게 올립니다.
32비트로 프로그램을 실행할 경우 문제가 없는데 64비트로 프로그램을 만들어 실행할 경우 아래와 같은 문제가 발생합니다.
아래 이미지 중 위 쪽은 소스고 그 밑은 디버그 워치화면입니다.
보다시피 L, mPV[0], mPV[0]->mgNa 모두 정상적으로 값이 설정이 되어 있습니다.
그런데 희한하게 mPV[L], mPV[L]->mgNa 로 값을 읽어들이면 unknown error라고 뜹니다.
도대체 이 이유가 무엇일까요?
처음 겪는 말이 안되는 경우라 무척 당황스럽군요.
![20190118_161630.jpg](http://tech.devgear.co.kr/F:%5Clchmain%5Ctemp%5C20190118_161630.jpg)
![20190118_161747.jpg](http://tech.devgear.co.kr/./files/attach/images/131/014/450/c9add7625eb1ed8d9e9842d57e222d16.jpg)
![20190118_161630.jpg](http://tech.devgear.co.kr/./files/attach/images/131/014/450/a7ac6c10e6bed75f74590d41cab50a16.jpg)
댓글 9
-
-
한시민
2019.01.18 17:41
include화일에 다음과 같이 struct를 선언했구요
typedef struct PropagationVariable {
long double ainf, iinf, atau, itau, Vm, Vr, INa, IK, Ileak, Itotal, Iin, mVoltage, mgNa, mgK, mgL, malpha_m, malpha_h, malpha_n, mbeta_m, mbeta_n, mbeta_h, Istimulus;
long double S[3];
} PropagationVariable;
프로그램 body에서 아래와 같이 mPV를 선언한 후
struct PropagationVariable ** mPV;
mPV는 다음과 같이 생성하였습니다.
mPV = new PropagationVariable*[ThreadNumber];
for (i = 0; i < ThreadNumber; i++)
mPV[i] = new PropagationVariable;
위 예시에서 L은 매개변수로 int L로 선언되어 있구요.
-
한시민
2019.01.18 17:42
그리고 컴파일 에러가 발생하는 것이 아니라 프로그램 실행 시 해당 부분의 변수값을 읽지 못하는 문제가 있습니다.
-
한시민
2019.01.18 17:47
SteadyState(int L)로 되어 있는 부분의 int L 이 64비트로 전환될 때 문제가 생기나요?
-
한시민
2019.01.18 17:52
아래 간단한 예시 프로그램에서 동일한 문제가 발생하고 있는데 뭘 잘못하고 있는 지 알려주시면 감사하겠습니다.
- TestProject1.cbproj.local [File Size:6.1KB/Download:63]
- TestProject1.cbproj [File Size:36.7KB/Download:70]
- TestProject1.cpp [File Size:873Bytes/Download:68]
- Test.cpp [File Size:1.1KB/Download:76]
- Test.h [File Size:1.1KB/Download:74]
- Test.dfm [File Size:522Bytes/Download:69]
- TestProject1PCH1.h [File Size:40Bytes/Download:68]
-
한시민
2019.01.18 17:59
예시프로그램에서 i값이 0일 때 mPV[i]->Vm으로 보면 unknown error라고 뜨고 mPV[0]->Vm으로 보면 0이라고 나옵니다.
-
한시민
2019.01.18 18:04
Break 건 부분에서 해당 변수값을 본건데 보다시피 이런 문제가 있습니다.
![20190118_180141.jpg](http://tech.devgear.co.kr/./files/attach/images/131/049/450/ed562e8f46e868dc17e9a5e5399608ff.jpg)
-
C++빌더의 64 bit 어플리케이션의 경우 Clang 기반 C++ 컴파일러를 사용하고 있습니다.
작성해 주신 현상을 살펴보니
"디버깅 시 구조체의 값을 Watch List에 표현시 unknown error로 표시"되는 이슈가 있는 것 같습니다.
제가 10.3 리오에서 테스트 해봐도 동일한 이슈가 발생합니다.(32 비트에서 정상, 64 비트에서 unknown error로 표시)
우선 64 bit C++ 컴파일러에서 해당 버그가 발생하는 것으로 보입니다.
해당 이슈는 저도 엠바카데로 측에 레포팅 하도록 할테니
한시민님께서도 버그 리포팅을 해주시기 바랍니다.
우선 디버깅하면서 해당 값을 확인하셔야 할 것 같아 임시 대응방법을 안내해 드립니다.
Watch List에서 구조체배열의 값을 정상 출력하지 못하는 이슈가 발생합니다.
하지만 "Evaluate/Modify" 창에서는 구조체배열의 값을 정상 출력하는 것을 확인했습니다.
![array_structure_cbb.png](https://tech.devgear.co.kr/files/attach/images/131/067/450/0f3145ffd2da797a49397af08574a1b9.png)
사용 방법은 확인하고 싶은 변수(구조체배열 등) 선택 후 Ctrl + F7 단축키를 눌러 해당 값을 확인할 수 있습니다.
Expression 콤보박스에는 이전에 확인했던 내역들도 표시되니 표현식을 변경해 확인 하실 수 있습니다.
Watch List 보다는 조금 불편하시겠지만, 우선 Evaluate/Modify 창을 이용해 디버깅 작업을 진행하시길 안내드립니다.
PS -
혹시, 프로그램 실행(Run-time) 시에도 동일한 증상이 발생하나요?
제가 테스트 해본 바 실행시에는 문제가 없는 것으로 보입니다.
PS2 -
64비트 윈도우즈 에서도 32비트 애플리케이션이 호환성 모드로 아주 잘 동작합니다.^^
혹시, 단순히 64비트 윈도우즈에서 구동이 목적이라면 32비트 애플리케이션으로 배포하는 것도 가능합니다.
단, 메모리를 많이 사용하고, 좀 더 빠르게 동작하기 위한 목적이라면 64비트 애플리케이션 지원도 좋은 솔루션입니다.
참고로 C++ 빌더 64-bit 윈도우 애플리케이션 개발 관련 기술문서도 안내해 드립니다. 참고하시면 아주 좋습니다.
http://docwiki.embarcadero.com/RADStudio/Rio/en/C%2B%2BBuilder_64-bit_Windows_Application_Development
-
한시민
2019.01.24 14:11
보내드린 예시 프로그램은 문제가 없었지만 실제 개발 중인 프로그램에서는 해당 값을 제대로 읽지 못하는 지 프로그램이 서버렸습니다.
int를 size_t로 선언하여 실행하면 문제없이 실행이 됩니다. 아무래도 int로 변수전달 시 주소값이 32비트로 되어 있어 발생되는 문제인 듯 보이긴 합니다.
C++ Builder 64bit struct 사용 문제
2019.01.18 16:32
도무지 그 원인을 알 수 없는 문제가 생겨 이렇게 올립니다.
32비트로 프로그램을 실행할 경우 문제가 없는데 64비트로 프로그램을 만들어 실행할 경우 아래와 같은 문제가 발생합니다.
아래 이미지 중 위 쪽은 소스고 그 밑은 디버그 워치화면입니다.
보다시피 L, mPV[0], mPV[0]->mgNa 모두 정상적으로 값이 설정이 되어 있습니다.
그런데 희한하게 mPV[L], mPV[L]->mgNa 로 값을 읽어들이면 unknown error라고 뜹니다.
도대체 이 이유가 무엇일까요?
처음 겪는 말이 안되는 경우라 무척 당황스럽군요.
댓글 9
-
한시민
2019.01.18 17:41
include화일에 다음과 같이 struct를 선언했구요
typedef struct PropagationVariable {
long double ainf, iinf, atau, itau, Vm, Vr, INa, IK, Ileak, Itotal, Iin, mVoltage, mgNa, mgK, mgL, malpha_m, malpha_h, malpha_n, mbeta_m, mbeta_n, mbeta_h, Istimulus;
long double S[3];
} PropagationVariable;
프로그램 body에서 아래와 같이 mPV를 선언한 후
struct PropagationVariable ** mPV;
mPV는 다음과 같이 생성하였습니다.mPV = new PropagationVariable*[ThreadNumber];
for (i = 0; i < ThreadNumber; i++)mPV[i] = new PropagationVariable;위 예시에서 L은 매개변수로 int L로 선언되어 있구요. -
한시민
2019.01.18 17:42
그리고 컴파일 에러가 발생하는 것이 아니라 프로그램 실행 시 해당 부분의 변수값을 읽지 못하는 문제가 있습니다.
-
한시민
2019.01.18 17:47
SteadyState(int L)로 되어 있는 부분의 int L 이 64비트로 전환될 때 문제가 생기나요?
-
한시민
2019.01.18 17:52
아래 간단한 예시 프로그램에서 동일한 문제가 발생하고 있는데 뭘 잘못하고 있는 지 알려주시면 감사하겠습니다.
- TestProject1.cbproj.local [File Size:6.1KB/Download:63]
- TestProject1.cbproj [File Size:36.7KB/Download:70]
- TestProject1.cpp [File Size:873Bytes/Download:68]
- Test.cpp [File Size:1.1KB/Download:76]
- Test.h [File Size:1.1KB/Download:74]
- Test.dfm [File Size:522Bytes/Download:69]
- TestProject1PCH1.h [File Size:40Bytes/Download:68]
-
한시민
2019.01.18 17:59
예시프로그램에서 i값이 0일 때 mPV[i]->Vm으로 보면 unknown error라고 뜨고 mPV[0]->Vm으로 보면 0이라고 나옵니다.
-
한시민
2019.01.18 18:04
Break 건 부분에서 해당 변수값을 본건데 보다시피 이런 문제가 있습니다.
-
C++빌더의 64 bit 어플리케이션의 경우 Clang 기반 C++ 컴파일러를 사용하고 있습니다.
작성해 주신 현상을 살펴보니
"디버깅 시 구조체의 값을 Watch List에 표현시 unknown error로 표시"되는 이슈가 있는 것 같습니다.
제가 10.3 리오에서 테스트 해봐도 동일한 이슈가 발생합니다.(32 비트에서 정상, 64 비트에서 unknown error로 표시)
우선 64 bit C++ 컴파일러에서 해당 버그가 발생하는 것으로 보입니다.
해당 이슈는 저도 엠바카데로 측에 레포팅 하도록 할테니
한시민님께서도 버그 리포팅을 해주시기 바랍니다.
우선 디버깅하면서 해당 값을 확인하셔야 할 것 같아 임시 대응방법을 안내해 드립니다.
Watch List에서 구조체배열의 값을 정상 출력하지 못하는 이슈가 발생합니다.
하지만 "Evaluate/Modify" 창에서는 구조체배열의 값을 정상 출력하는 것을 확인했습니다.
사용 방법은 확인하고 싶은 변수(구조체배열 등) 선택 후 Ctrl + F7 단축키를 눌러 해당 값을 확인할 수 있습니다.
Expression 콤보박스에는 이전에 확인했던 내역들도 표시되니 표현식을 변경해 확인 하실 수 있습니다.
Watch List 보다는 조금 불편하시겠지만, 우선 Evaluate/Modify 창을 이용해 디버깅 작업을 진행하시길 안내드립니다.
PS -
혹시, 프로그램 실행(Run-time) 시에도 동일한 증상이 발생하나요?
제가 테스트 해본 바 실행시에는 문제가 없는 것으로 보입니다.
PS2 -
64비트 윈도우즈 에서도 32비트 애플리케이션이 호환성 모드로 아주 잘 동작합니다.^^
혹시, 단순히 64비트 윈도우즈에서 구동이 목적이라면 32비트 애플리케이션으로 배포하는 것도 가능합니다.
단, 메모리를 많이 사용하고, 좀 더 빠르게 동작하기 위한 목적이라면 64비트 애플리케이션 지원도 좋은 솔루션입니다.
참고로 C++ 빌더 64-bit 윈도우 애플리케이션 개발 관련 기술문서도 안내해 드립니다. 참고하시면 아주 좋습니다.
http://docwiki.embarcadero.com/RADStudio/Rio/en/C%2B%2BBuilder_64-bit_Windows_Application_Development
-
한시민
2019.01.24 14:11
보내드린 예시 프로그램은 문제가 없었지만 실제 개발 중인 프로그램에서는 해당 값을 제대로 읽지 못하는 지 프로그램이 서버렸습니다.
int를 size_t로 선언하여 실행하면 문제없이 실행이 됩니다. 아무래도 int로 변수전달 시 주소값이 32비트로 되어 있어 발생되는 문제인 듯 보이긴 합니다.
대부분 32비트의 소스코드를 64비트에서 컴파일 시 오류가 발생하는 것은
숫자형 데이터 타입의 미스매치로 인해 발생하는 경우가 많습니다.
위의 코드 중 L과 mPV[]->mgNa의 데이터 타입이 어떻게 선언되어 있는지 확인해 보시기 바랍니다.
해결이 안되셨다면 mPV 배열의 선언부를 올려주시면 검토해 볼 수 있겠습니다.
감사합니다.