2013-06-27 2 views
1

C에서 첫 번째 X11 응용 프로그램을 작성 중이며 응용 프로그램 창의 크기를 검색하는 중 중대한 문제가 발생했습니다. "캐스트없이 포인터를 정수로 만듭니다"- GCC는 어떻게 만족합니까?

temp.c:30:2 warning: passing argument 3 of 'XGetGeometry' makes pointer from integer without a cast

나는 이것은 단지 경고 알고,하지만 여전히 재미없는 는 segfault 발생합니다. 나는 그런 내 포인터 'N 뭔가 잘못하고 있어요 알고

static void loop(); 
static void initialize(); 
static void cleanUp(); 
static void run(); 

/* Variables */ 

static int screenNumber; 
unsigned long White; 
unsigned long Black; 
long eventMask; 
static Display *currentDisplay; 
static Window currentWindow; 
static unsigned int windowWidth; 
static unsigned int windowHeight; 
static GC graphicsController; 
static XEvent XEvents; 

void loop() { 
     XGetGeometry(currentDisplay, currentWindow, DefaultRootWindow(currentDisplay), NULL, NULL, &windowWidth, &windowHeight, NULL, NULL); 

     XDrawLine(currentDisplay, currentWindow, graphicsController, 0, 0, (int)windowWidth, (int)windowHeight); 
     XDrawLine(currentDisplay, currentWindow, graphicsController, 0, (int)windowHeight, (int)windowWidth, 0); 
} 

void initialize() { 
     currentDisplay = XOpenDisplay(NULL); 
     screenNumber = DefaultScreen(currentDisplay); 

     White = WhitePixel(currentDisplay, screenNumber); 
     Black = BlackPixel(currentDisplay, screenNumber); 

     currentWindow = XCreateSimpleWindow( currentDisplay, 
               DefaultRootWindow(currentDisplay), 
               0, 0, 
               500, 500, 
               0, Black, 
               White); 

     XMapWindow(currentDisplay, currentWindow); 
     XStoreName(currentDisplay, currentWindow, "rGot - X11"); 

     eventMask = StructureNotifyMask; 
     XSelectInput(currentDisplay, currentWindow, eventMask); 

     do{ 
       XNextEvent(currentDisplay, &XEvents); 
     }while(XEvents.type != MapNotify); 

     graphicsController = XCreateGC(currentDisplay, currentWindow, 0, NULL); 

     XSetForeground(currentDisplay, graphicsController, Black); 
} 

void run() { 
     eventMask = ButtonPressMask|ButtonReleaseMask; 
     XSelectInput(currentDisplay, currentWindow, eventMask); 
     do{ 
       XNextEvent(currentDisplay, &XEvents); 
       loop(); 
     }while(1==1); 
} 

void cleanUp() { 
     XDestroyWindow(currentDisplay, currentWindow); 
     XCloseDisplay(currentDisplay); 
} 

int main(){ 
     initialize(); 
     run(); 
     cleanUp(); 
     return 0; 
} 

,하지만 난 이것에 비교적 새로운 해요 ... 여기 내 설정이다 : 여기 내 코드입니다

  • 우분투 -,458,499,893을 활용하는 내 최초의 시도 나중에이를 찾는 사람들을 위해 gcc tempc -o temp -lX11

:로 컴파일 12.04 LTS

  • 210 완전히 틀렸다!

    올바르게 사용하려면, 나는 다음을 수행했다 :

    XGetGeometry(currentDisplay, currentWindow, &currentRoot, &windowOffsetX, &windowOffsetY, &windowWidth, &windowHeight, &windowBorderWidth, &windowDepth);

    은 내 결과 here의 기초한다.

  • +1

    당신이 대답해야 할 질문은 왜 * XGetGeometry를 호출하는지입니다. 뭘하고 싶은지 알지 못하면 전화를 올릴 수 없습니다. –

    +1

    @ n.m., 내 목표는 내 창 크기를 얻는 것입니다. 나는 스크린의 크기를 얻을 수 있었지만, 실제 윈도우가 어떤 크기인지 알 필요가있다. – FreeSnow

    +1

    죄송합니다. 코드를 잘못 읽었습니다. 어떻게 든 & windowWidth, & windowHeight을 놓쳤습니다. 그래서이 부분은 정확하고 나는 방금 바보처럼 보였습니다. 유일한 문제는 루트 윈도우가 반환 인수라는 것입니다. –

    답변

    7

    DefaultRootWindow()Window을 반환하고 XGetGeometry()은 세 번째 인수로 Window*을 반환합니다. 그래서 경고가 말했듯이, 당신은 그 타입에 대한 포인터가 예상되는 일반적인 타입을 전달하고 있습니다.

    +2

    특히,'XGetGeometry'의 세 번째 인자는 루트 윈도우의 윈도우 핸들을 쓰는 변수에 대한 포인터 여야합니다 - 입력이 아닌 출력입니다. –

    +0

    +1, 나는 X11이 부호없는 긴 정수인'XID'를 기반으로한다는 사실을 잊어 버렸습니다. 오류 메시지는 별도의 형식을 사용하는 것처럼 표시되지 않습니다 :) –

    +0

    감사합니다. 틀림없이, 나는 어떤 이유에서, & windowWidth 인수가 잘못되었다고 생각했습니다. 오류 메시지를 명확히 해 주셔서 감사합니다! :) – FreeSnow

    관련 문제