0

간단한 정수와 memsize를 사용하는 올바른 방법은 무엇입니까? 정확히 말하면 저는 32 비트 아키텍처 용으로 처음 작성된 C 코드가 있습니다. 지금은 모두 아키텍처에 실행할 수있다, 그래서 나는 memsize와, intptr_tuintptr_t를 사용하는 경고를 제거하기 위해 노력하고간단한 정수와 memsize를 사용하는 올바른 방법

warning: cast to pointer from integer of different size 

64 비트 아키텍처에서 실행하는 동안 다음과 같은 경고를 얻을 수있는 명백한 이유가있다. 하지만 우리가 혼합 된 단순한 정수와 memsize를 사용한다면 제대로 작동한다면 의심 스럽습니다. 나는 그것을 사용하는 적절한 방법을 알고 싶다. 다음은 코드 샘플입니다. 여기

compllits = list_Cons((POINTER) predindex, compllits); 

compllits는 링크 된리스트이며 pointer으로 정의된다. list_Cons 포인터를 반환합니다.

list_Cons(POINTER x, LIST y); 

그리고, int preindex : list_Cons는 다음과 같이 정의된다. 포인터를 정수로 변환합니다. 내가 64 비트 컴퓨터에서 실행, 나는이 경고를 해결하려면 경고

이제
: warning: cast to pointer from integer of different size 

을 얻을 것이다, 나는

 Method 1: changing the int preindex into intptr_t preindex. 

    Method 2. Keeping int preindex unchanged but doing following 

     compllits = list_Cons((POINTER)(intptr_t)predindex, compllits); 

모두를 내가 사용하고있는 두 가지 방법에 혼란 liitle 비트입니다 방법이 효과적이다. 그러나 어느 방법이 합법적이고 최선인지 확실하지 않습니다. 몇 가지 제안을 찾고 있습니다.

감사합니다.

+0

** intptr_t **를 사용하면 정수 크기가 기준에 따라 결정됩니다 하드웨어 아키텍처에 대해 언급하고 나는이 질문에서 언급 한 경고를 얻지 못할 것이다. – thetna

답변

0

preindex는 실제로 포인터입니까? 그렇다면 문제는 int를 포인터 유형으로 사용하는 것입니다. int *를 사용하십시오.

또한 intptr_t 대신 int *를 사용하는 것이 좋습니다. intptr_t는 포인터를 담을만큼 충분히 넓은 정수이지만 의미 상으로는 여전히 정수입니다.

32 비트 시스템에서 int는 32 비트 폭이고 int *는 32 비트 폭입니다. 64 비트 컴퓨터에서 int는 여전히 32 비트 폭이지만 int *는 64 비트입니다.

+0

사전 색인은 ** 정수 **가 아닙니다. – thetna

2

큰 문제는 포인터와 정수를 실제로 섞어야한다는 것입니다. (이 경우가 리스프와 유사한 일반 데이터 구조를 처리하는 경우는 거의 없습니다.) 그렇지 않은 경우 올바른 유형과 해당 유형 만 사용해야합니다.

그러나이 경우 실제로 동일한 기능을 사용하여 처리해야합니까? 예를 들어 list_Cons_pointerlist_Cons_int에는 각각 preindexed과 일치하는 실제 포인터와 정수 유형을 사용할 수 있습니다.

preindexed 유형을 변경해야하는지 여부는 실제로 프로그램에서 무엇을 나타내는 지에 따라 다릅니다.

intptr_t은 포인터를 보유 할만큼 충분히 클 것이지만 더 클 수도 있습니다. 이것은 모든 가능한 환경에서 모든 경고를 제거 할 수있는 방법이 없다는 것을 의미합니다. (48 비트 포인터를 생각하면 ...)

+0

네, 포인터와 정수를 섞어야한다는 것이 사실입니다. LISP와 유사한 데이터 구조를 가지고 있습니다. 링크 된 목록과 이진 트리는 데이터 구조이므로 동일한 함수를 사용해야합니다. 이 경우 가장 최적화 된 방법은 무엇입니까? – thetna

관련 문제