[완료] #define X Y*2를 하면 Y+2값이 들어가네요 ;;;
글쓴이: turbo978 / 작성시간: 금, 2009/11/27 - 1:53오전
안녕하세요~
C로 짠 코드를 g++에서 컴파일 하여 돌렸더니...
array(float [174])를 읽기만 하는데도...
몇번 반복 연산하다보면 array내용이 변경되어버립니다 ;;;
근데 문제는 gcc로 컴파일해서 돌리면 아무 문제가 없다는 거죠...;;;
파일 확장자만 .cpp로 바꿔서 g++로 컴파일 한 것밖에는 없는데도...;;;
이 난감한 사태를 어쩌면 좋을까요?
어디서 부터 확인해야할까요? ;;;
어떤 함수를 몇번 정도 실행후에 바뀌는데...
그 함수는 바뀐 array를 참고하지도...바꾸지도 않는단 말이죠 ㅠㅠ
icc로 해봐도 그렇고...다른 리눅스에서 해봐도 그렇네요 ㅠㅠ
난감하네요 ;;;
Forums:
C 언어 코드는 100%
C 언어 코드는 100% 완벽하게 C++과 호환되는 것이 아니므로, 코드를 보지 않는한 뭐라 말하기가 힘드네요.
그런데 궂이 잘 동작하는 소스를 g++로 컴파일할 필요가 있나요?
C++ application에서 필요하다면, 해당 소스만 gcc로 컴파일하고, 같이 링크하면 될텐데요.
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
C로 짜여진 코드를 수정해서 써야...ㅠㅠ
전적으로 동의합니다...만...ㅠㅠ
메인 코드를 수정해서 mpi를 붙여서 쓰려는데...C++만 지원해서요...ㅡㅜ
메인코드에서 바껴버리는거라...컴파일, 링크해서 쓰는게 불가능한 상황입니다 ㅠㅠ
간단하게 보자면...;;;;
float x[174];
func(&x[0]);
//여기서 확인해보면 다 제대로 있습니다...
for {
y=x[i];
// (1)
func2(y);
// (2)
}
이런식인데도...func2부분을 돌다가 x가 바껴버린다는거죠 ;;;;
1, 2번에서 체크를 해보면...몇번 돌다가 참조도 하지 않는 x의 내용이 바껴버립니다 ;;
소스를 봐야 알겠습니다만...
메모리 쓰는 부분에서 다른 영역을 침범해서, x부분을 바꿔버리는게 아닐까 하는 생각도 들고...
네...그러게요...;;;
근데 메모리영역을 침범해서 바꿔버리는게...훔 ;;;;;
C에서는 아무 문제 없다가...
C++에서는 허용범위가 늘어나서 그런걸까요? ㅠㅠ
인덱스를 다 찍어봐야겠네요 ㅠㅠ
func2에서 stack 에
func2에서 stack 에 할당되는 변수에 대해서 buffer overflow가 일어나는지 확인해 보세요.
함수가 복잡하거나 하면, valgrind같은거 돌려보면 쉽게 알수 있을겁니다.
..음..
static float x[174]; 으로 선언한뒤에 해보셨어요?
음...
이런 황당한 ㅡㅡ;;;;;;;;;
#define X Y*2
를 했는데...
X에 Y+2...값이 들어가네요 ;;;;
이런 황당한 일이 ;;;;
이놈때문에 포인터가 날라다녀서 다른 메모리 값이 엉망이 되었던 거였네요 ;;;;
Y가 뭔지
Y가 뭔지 모르겠지만,
#define X ((Y)*2)
로 했으면 정확히 동작하지 않았을까요?
expression 사이에 X 쓰셔서 그런것 같은데...
Y도...
Y도 #define에서 계산했던 값이었어요...ㅠㅠ
#define Y Z+2
였었어요 ㅠㅠ
결과적으로 X = Z+2*2
결과적으로 X = Z+2*2 로 될 것 같네요.
아하...
그렇게 컴파일링...할수도 있겠군요 ;;;;;;
좋은 정보 감사합니다~ ^0^/
C++ 에 이런 #define
C++ 에 이런 #define 문법은 없는 것으로 보시면 됩니다.
변수 타입이 제대로 정의되지 않기 때문에 실행을 보장할 수 없죠.
상수를 정의할 때도 const 를 사용하는 것이 좋습니다.
그러게요 ㅠㅠ
원래는 info class로 따로 만들어서 쓰는데...
컨버팅 귀찮아서 그냥 썼더니...저렇게 되어버렸네요 ㅠㅠ
대대적인 수정을 다시 해야할꺼 같아요 ㅠㅠ
...
그보다도... 저렇게 썼는데 C에서는 제대로 동작했다는 게... 더더욱 미스테리인데요?
왠지 판도라의 상자를 보는 듯한...
댓글 달기