2013-08-02 1 views
0

나는이 배열을 요소의 수를 넘어 :사이클링

static const Layout layouts[] = { 
    { "[]=",  tile }, 
    { "><>",  NULL }, 
    { "[M]",  monocle }, 
}; 

이 기능해야 배열을 순환 : 그 다음의 레이아웃 또는 반환을 설정해야합니다라고

int 
cyclelayout(const Arg *arg) { 
    static unsigned short int layout = 0; 
    if (++layout >= sizeof(layouts)/sizeof(layouts[0])) { 
     layout = 0; 
    } 
    setlayout(&((Arg) {.v = &layouts[layout]})); 
} 

배열 요소를 넘어서는 경우 0으로 설정합니다. 하지만 배열 요소를 넘기고 프로그램이 충돌합니다. 나는 틀린 것을 계산할 수 없다?

의 Arg 및 레이아웃 :

typedef union { 
    int i; 
    unsigned int ui; 
    float f; 
    const void *v; 
} Arg; 

typedef struct { 
    const char *symbol; 
    void (*arrange)(Monitor *); 
} Layout; 

전체 프로그램 : dwm-6.0 dwm-6.0-cyclelayout.patch

+1

cyclelayout()은 'int'를 반환해야하지만 아무 것도 반환하지 않습니다. 따라서 무언가를 리턴하는지, 리턴 타입을'int'에서'void'로 변경하십시오. 이것은 귀하의 문제를 해결할 수는 없지만 적어도 귀하가 다른 두 가지 질문 (질문 제목에있는 질문과 질문 자체에있는 질문 중 하나)을 묻는 문제를 해결합니다. –

+1

완전한 프로그램 하나를 올리십시오. 컴파일하고 실행할 수 있습니다. –

+1

진지한가? ** 창 관리자 **입니다. 컴파일하고 ** 실행할 수있는 완전한 프로그램을 게시하십시오. 그것은 완전히 새로운 X11 세션을 시작할 필요없이 코드를 샅샅이 뒤지는 일없이 트로이 목마가 아니며 결과를 재현 할 수 있는지 확인하십시오. –

답변

1
int // This says to return an int. 
cyclelayout(const Arg *arg) { 
    static unsigned short int layout = 0; 
    if (++layout >= sizeof(layouts)/sizeof(layouts[0])) { 
     layout = 0; 
    } 
    setlayout(&((Arg) {.v = &layouts[layout]})); // This doesn't look like valid C to me? 

    return 4; // http://xkcd.com/221/ 
} 

함수는 "배열을 통해주기", 어딘가에 루프가 안되는 경우? 나는 당신의 기능에서 해당 키워드의 어떤가 표시되지

for 
do-while 
while 

, 그래서 나는 아무것도를하지 "주기"를 수행 결론 :

루프 맛에 온다.

+0

함수는 호출 될 때 다음 레이아웃을 설정해야하지만 테이블 요소를 벗어나면 0으로 돌아갑니다. –

0

내 2 센트 :/다른 사람이 만들 경우

  • 당신은, 그것은 실제 오류가 아니지만 당신이 암시하고 누구에게도하지 읽을 수있는 무언가가, setLayoutelse 조항의 일부입니다, 숨겨진
  • 후행 증가 연산자 ++variable을 사용하면 후행 증가 연산자 variable++과 같이 객체의 복사본이 아닌 참조가 반환됩니다.이 값은 비교에 사용하려는 "수량"이 아닙니다.
  • 값을 반환하지 않습니다. 당신이 당신의 기능 또한 Arg와 유형으로 Layout 무엇인지 알고하는 데 도움이 될 것입니다

에 대한 서명의 int를 반환하는 선언 한 점을 고려.