8

出力を表示したいと思います-番号1から5、その後に4-5が無限に続きます。goto1 の文字 i の代わりに i(4) の値を渡す方法はありますか。または、スイッチのようにすべてのオプションを説明せずにこれを実現する他の効率的な方法はありますか (つまり、ケース 1: goto1(c1) など)。

主な目的は、プログラム内で計算されたラベルを持つステートメントにジャンプすることです。

#define goto1(i) \
goto c##i

int main(){    
    c1 : printf(" num is 1 \n");
    c2 : printf(" num is 2 \n");
    c3 : printf(" num is 3 \n");
    c4 : printf(" num is 4 \n");
    c5 : printf(" num is 5 \n");

    int i=4;
    goto1(i);
}
4

5 に答える 5

6

ジャンプ台を求めていますか?gcc を使用している場合: ジャンプ テーブル機構があります。

#include <stdio.h>

int main()
{
    unsigned char data[] = { 1,2,3,4,5,4,5,0 };
    // data to "iterate" over, must be 0-terminated in this example

    void *jump_table[] = { &&L00, &&L01, &&L02, &&L03, &&L04, &&L05 };
    // you should fill this with all 256 possible values when using bytes as p-code

    unsigned char *p = data;

    begin:
        goto *jump_table[ *p ];

    L00:
        return 0; // end app
    L01:
        printf("num %i\n", (int)*p);
        goto next;
    L02:
        printf("num %i\n", (int)*p);
        goto next;
    L03:
        printf("num %i\n", (int)*p);
        goto next;
    L04:
        printf("num %i\n", (int)*p);
        goto next;
    L05:
        printf("num %i\n", (int)*p);
        goto next;
    L06:
    L07:
    // ...
    LFF:
        goto next;

    next:
        ++p;            // advance the data pointer to the next byte
        goto begin;     // start over

    return 0;
}

この方法の長所は、大きな switch ステートメントを省けることです。

于 2013-03-29T14:12:20.547 に答える
3

なぜこのようにしないのですか?

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    printf(" num is 1 \n");
    printf(" num is 2 \n");
    printf(" num is 3 \n");

    for (;;){
        printf(" num is 4 \n");
        printf(" num is 5 \n");
    }

    /* Not reachable, but will silence any compiler warnings about main
     * not returning a value. */
    return EXIT_SUCCESS;
}
于 2013-03-29T11:31:21.343 に答える
3

あなたはこれを間違った (クリエイティブな) 方法でやりたいと思っているので、トランポリンを考えたことはありますか?

#include <stdio.h>

typedef void (*generic)(void);
typedef generic (*continuation)(void);

generic first(void);
generic second(void);

int main(void) {
    continuation fubar = first;
    for (;;) {
        fubar = (continuation) fubar();
    }
}

generic first(void) {
    printf(" num is 1 \n"
           " num is 2 \n"
           " num is 3 \n");
    return (generic) second;
}

generic second(void) {
    printf(" num is 4 \n"
           " num is 5 \n");
    return (generic) second;
}

関数ポインターを使用するというアイデアから続けて (私がそこで何をしたか見てください? Giggity!)、関数ポインターの配列を使用できます。

#include <stdio.h>

typedef size_t (*function)(size_t);

size_t first(size_t);
size_t second(size_t);

int main(void) {
    function function[] = { first, first, first, first, second };
    size_t index = 0;

    for (;;) {
        index = function[index](index);
    }
}

size_t first(size_t index) {
    printf(" num is %d \n", ++index);
    return index;
}

size_t second(size_t index) {
    printf(" num is %d \n", index+1);
    return index-1;
}
于 2013-03-29T12:04:56.163 に答える
2

スイッチは同じことを達成しませんか?

int main()
{
    int i = 1;
    while (1)
    {
        switch (i)
        {
            case 1:
                printf(" num is 1 \n");
            case 2:
                printf(" num is 2 \n");
            case 3:
                printf(" num is 3 \n");
            case 4:
                printf(" num is 4 \n");
            case 5:
                printf(" num is 5 \n");
            default:
                break;
        }

        // code to calculate i
        i = 4;
        // end code to calculate i
    }
    return 0;
}
于 2013-03-29T17:13:18.670 に答える