32bit -> 64bit 전환시 에러
글쓴이: alwaysN00b / 작성시간: 목, 2004/12/30 - 3:22오후
안녕하세요.
질문이 2가지 입니다.
SunFire 6800 입니다.
컴파일러는 최신버젼이라는데.. 확실히는... (sun workshop 라이센스 산겁니다)
첫번째로
함수 호출후 리턴할때 stack을 정리해 버리던데
정리 안하는 방법은 없을까요?(윈도우에서는 __fastcall 인가 하는.. 하여튼 그렇게 만들어 놓은 함수가 한두개가 아닙니다.)
두번째로
이것땜에 머리가 다아픔니다.
함수에 char 2차원배열중에 하나의 값을 넘겨줍니다.
함수 호출전에 주소를 출력하니 9자리입니다.(%p)
char * 로 받으니 8byte 라 사용할려구 하니 세그폴트 나버립니다.
넘겨줄 변수가 전역변수 인데 주소값이 잘려서 넘어가는게 이해가 안됩니다.
(index를 넘겨줄수도 있지만 프로그램이 조금 지저분해서 수정할게 아주 많습니다.)
ex)
함수 호출전 ==> 0x100027ac8
함수 호출, 함수내 ==> 0x27ac8
dbx로 확인했고 코드내에 삽입해서도 확인했습니다.
조언 바랍니다.
ps. pm되시는 분이.. "웬만하면 포인터는 쓰지마.." 하시고 용역은
기초적인 링크드 리스트 이해가 안된다고 저보고 잘난척한다고 합니다. --;;왜 포인터 쓰냐고.. 정말 일할 맛이 안나네요...
Forums:
코드로 얘기해보지요?
코드로 얘기해보지요?
말로 설명하는 것보다는 코드를 직접 올리시는 편이 답을 얻기 쉬울 것 같
말로 설명하는 것보다는 코드를 직접 올리시는 편이 답을 얻기 쉬울 것 같습니다.
아.. 죄송합니다. 망이 틀려서.. 급하게 올리느라.. 용서해주시길.
아.. 죄송합니다.
망이 틀려서.. 급하게 올리느라.. 용서해주시길..
:oops:
결과가
main에서 선언한 변수와 전역에서 선언한 변수 주소 확인 해봐야겠습니다. .. 퇴근이라.. 급해서.
급하게 쓰느라 성의가 없군요. 죄송합니다. 내일 출근해서 테스트 하고 추가적인 질문 올리겠습니다.
언제나 시작
..
확실히 이 코드만으로 이러한 문제가 생기나요?
혹시나 해서 컴파일 되게 소스좀 고쳐서 해봤는데
역시나 문제는 없고요...
생략한 부분들도 좀 올려주시면 안되실련지..?
기초적인 에러이군요.
정확히 비교를 할려면,
Exch(och, Cp_data[0]); 를 Exch(och, &Cp_data[0]); 로 바꾸어야 겠죠.
그리고 죽는 이유는 아직 값이 할당안되어서 Null 찾을때까지 일 하느라 바빠서 이겠죠.
[code:1]char Cp_data[14][6
올려 주신 코드만으로 테스트 해볼 곳은 2군데 입니다.
단일 파일내에 Exch()와 main()있다는 가정하에서는,
첫번째, 라이브러리 수준의 버퍼크기를 0으로 놓고 출력하는것입니다.(printf()이후 fflush(stdout);을 써주는것과 동일효과)
두번째, printf()에 대한 고민
Re: 기초적인 에러이군요.
글로벌변수라서 0으로 초기화될텐데요?
Re: 기초적인 에러이군요.
아닙니다. Cp_data[0]의 형은 char[61]이고 인자로 전달되면서 char*로
변환되므로 Exch의 프로토타입과 일치합니다.
그러나 &Cp_data[0]은 char(*)[61]이므로 char*와 호환되는 형이 아닙니다.
%p로 출력할 때는 void*로 변환해야 하며, 그렇지 않을 때의 결과는 정의되지 않습니다.
(이 때문에 세그폴트가 났을 가능성은 아주 적습니다만.)
Re: 기초적인 에러이군요.
답변 주신 분들 감사드립니다.
doldori 님의 말씀이 맞고 %x로 하니 8자리 까지 출력되더군요.
9자리부터는 짤려서 나옵니다.
코드 올린부분 테스트 해보니 char * 로 주소 잘 받아집니다.
혹시나 다른 라이브러리가 32bit로 컴파일 되었나 해서 확인하니 그것도 아니고..
답은 좀 황당했습니다.
라이브러리 헤더를 include 안해놨더군요.( 그부분 확인을 안한 제 잘못도 있지만요)
특정 라이브러를 사용하는데 헤더를 include 안했는데 컴파일은 잘되었습니다(워닝도 없습니다). 그런데, 64bit로 전부 컴파일해도 헤더 파일 include 안하니 9자리의(16진수) 주소가 함수에서 받을때는 8자리만 받아지더군요.
다시한번 답변 감사합니다.
ps. 정말 거의 모든 테스트를 했는데... 헤더파일 하나 빠져서 그러니 맥이 빠지더군요..
아 그렇군요.. 몰랐습니다. :)
언제나 시작
Re: 기초적인 에러이군요.
64bit 환경에서 int 가 32bit 인게 영향을 미친 듯 싶네요.
대부분의 컴파일러들은 프로토타입 선언 없이 함수 호출이 일어나는 경우,
리턴값은 int, 아규먼트들도 모두 int 로 생각하고 컴파일 하기 때문에
32bit 환경에서는 sizeof(int) == sizeof(char *) 여서 별 문제 없었지만,
64bit 에서는 sizeof(int) < sizeof(char *) 라서 문제가 된 것인가 보네요;;
gcc 에서는 -Wall 옵션을 주면 프로토타입 선언 없이 함수 호출이
일어나는 경우 경고 메세지를 뿌려줍니다.
SUN 의 cc 에도 비슷한 옵션이 있지 않을까 싶네요.
Re: 기초적인 에러이군요.
정확히 11년전에 pc환경에서(dos) 코딩하다가 동일 문제로 고생했던 기억이 있습니다.
질문에서 처럼 32->64는 아니었는데, 다시 생각하게 되는군요.
어쨋거나, 버그를 2년 :twisted: 끌고가지 않아서 다행입니다. 새해에도 건승하세요.
Re: 기초적인 에러이군요.
저도 걱정 했습니다. 2년.. ㅋ
언제나 시작
이 문제에 대해서는
32->64bit 변환할때 는 반드시 다음의 문서를 필독 하시기 바랍니다.
http://developers.sun.com/solaris/articles/solarisupgrade/64bit/Convert.html
여기서 발생한 문제는 위의 Document 에서 Implicit Duplication 문제 입니다.
Hyo-Sung Lee(李曉星/Mark Lee)
KRSF Certified Inline Skate Instructor
Fitness Inline Skate Trainer
Mogul&Freeride Skier
IDOne ski rider
Cafe MogulBuddy/KoreaMogul
E-Leader(C) Programmer
Re: 이 문제에 대해서는
감사합니다. 많은 도움이 되었습니다. :)
언제나 시작
댓글 달기