0

特定の入力順序で循環リンクリストをトラバースしたいのですが、(v1->v2->v3)次のように言いましょう

{v1,v3,v2,v2,v1,v3,v2,v1,v1,v3,v2,v2,v1,v2,v3}.

以下のプログラムは 3 つのノードのテストとして作成し、8、64、512、4096 などのノードに対して段階的にスケーリングしたいと考えています。

私の実装の考えでは、以下のプログラムAbstract State Machineは、以下の関数のみを処理の入力として受け入れる上でのみ実行する必要があります。engine_spin_at_gear()私は基本的に、トラバース中のループ回数を最小限に抑えたいと考えています。私は、non-blockingそのような非常識なものを使用して、rpm などの測定単位でabstraction模倣/仮想化process-executionするモードにあるかもしれませんengine-spinが、機能のデバッグに関する提案が本当に欲しいengine_spin_at_gear()です。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MILES 15

struct package
{
        // ... other members data ...
        struct package *next;
}*v1, *v2, *v3;

int input_arr[MILES] = {1,3,2,2,1,3,2,1,1,3,2,2,1,2,3};

struct package *base(struct package *_vN)
{
        if (_vN)
                return _vN;
        else
                return NULL;
}

struct package *deliver(struct package *_vNP)
{
        if (_vNP)
                return base(_vNP->next);
        else
                return NULL;
}

void shift_gear(struct package *_feed)
{
        _feed->next = NULL;
}

struct package *engine_spin_at_gear(struct package *_init_cycle0, int countSession)
{
        while (countSession--) {
                shift_gear(_init_cycle0);
                return deliver(base(_init_cycle0));
        }
        return NULL;
}

struct package *journey(struct package *_current_frame, int _start, int _end)
{
        int rpm = (_end > _start)?_end-_start:_start-_end;
        if (rpm)
                return engine_spin_at_gear(_current_frame, rpm);
        else
                return v1;
}

struct package *ignition_phase(int _batteryS, int _chargedL)
{
        return journey(v1, _batteryS, _chargedL);
}


void transmit_in_order(int*input_arr)
{
        struct package *v6;
        int i;

        for (i=0; i<MILES-1; i++) {
                v6 = ignition_phase(input_arr[i], input_arr[i+1]);
                printf("%p\n", v6);
        }
}

int main()
{
        v1 = malloc(sizeof(struct package));
        v2 = malloc(sizeof(struct package));
        v3 = malloc(sizeof(struct package));

        v1->next = v2;
        v2->next = v3;
        v3->next = v1;

        printf("v1=%p\tv2=%p\tv3=%p\n", v1, v2, v3);
        transmit_in_order(input_arr);
        return 0;
}

Linux でプログラムの GCC 実行可能ファイルを実行すると、次の出力が得られます。

v1=0x918b008    v2=0x918b018    v3=0x918b028
(nil)
(nil)
0x918b008
(nil)
(nil)
(nil)
(nil)
0x918b008
(nil)
(nil)
0x918b008
(nil)
(nil)
(nil)
(nil)

または、機能を変更する必要がありshift_gear()ますか? そのまま維持しながら、さらに最適化できますscalability-factorか? 前もって感謝します。C++これらすべての機能をasClass Engineおよびに入れたい場合Class Gearbox、プロトタイプを見せてもらえますか?

4

2 に答える 2

1

より多くのアイテムへのスケーリングについて言及しましたが、ここでは 100 にスケーリングする一部のパーツを示します。

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

typedef struct package_s
{
    // ... other members data ...
    struct package_s* next;
} package; //being lazy, I avoid typing struct everywhere...

#define HOWMANY (100)
package* v[HOWMANY];

#define MILES 15
int input_arr[MILES] = {1,3,2,2,1,3,2,1,1,3,2,2,1,2,3};

package*
journey(package* _current_frame, int _start, int _end)
{
    int rpm = (_end > _start) ? (_end-_start) : (_start-_end);
    if (rpm)
        return engine_spin_at_gear(_current_frame, rpm);
    else
        return v[0];
}

package*
ignition_phase(int _batteryS, int _chargedL)
{
    return journey(v[0], _batteryS, _chargedL);
}

これにより、input_arr の末尾のアドレス指定が修正されます (おそらく、ゼロに戻りたいですか?)

void
transmit_in_order(int*input_arr)
{
    package *v6;
    int i;

    for (i=0; i<MILES-2; i++) {
        v6 = ignition_phase(input_arr[i], input_arr[i+1]);
        printf("%p\n", v6);
    }
}

そして、構成可能な数のメインv[n]

int main()
{
    int ndx;
    for(ndx=0; ndx<HOWMANY; ++ndx)
    {
        v[ndx] = malloc(sizeof(package));
    }

    for(ndx=0; ndx<HOWMANY; ++ndx)
    {
        v[ndx]->next = v[(ndx+1)%HOWMANY];
        printf("v[%d]=%p\t", ndx, v[ndx]);
    }
    printf("\n", ndx, v[ndx]);

    transmit_in_order(input_arr);
    return 0;
}
于 2013-10-19T02:14:46.453 に答える
1

最適化はさておき、input_arr に問題があります。

int input_arr[MILES] = {1,3,2,2,1,3,2,1,1,3,2,2,1,2,3}; //has 15 elements   

次のループには 16 が必要です。

for (i=0; i<MILES-1; i++) { //[edited] so i goes from 0 to 13
        v6 = ignition_phase(input_arr[i], input_arr[i+1]);  //otherwise, i goes to 14, +1 == 15 - 1 too big
        printf("%p\n", v6);
}

より大きな配列を作成するか、ループを 1 インクリメント早く停止します。

このコードについて:

struct package *engine_spin_at_gear(struct package *_init_cycle0, int countSession)
{
        while (countSession--) {
                shift_gear(_init_cycle0);  // }
                return deliver(base(_init_cycle0));
        }
        return NULL;
}  //move this one to after shift_gear(_init_cycle0); 

閉じているwhileループ }をコメントで示されている場所に移動する必要がありますか? (あなたとチャーリーの観察による)returnステートメントをそこに保持すると、最初のループを通過することはありません。

コードのマイナーな変更による出力の変更: toの
変更後for (i=0; i<MILES; i++) {for (i=0; i<MILES-1; i++) {
ここに画像の説明を入力

変更後

while (countSession--) {
        shift_gear(_init_cycle0);
        return deliver(base(_init_cycle0));
}

に:

while (countSession--) {
        shift_gear(_init_cycle0);}
        return deliver(base(_init_cycle0));

// }

ここに画像の説明を入力

したがって、何らかの効果があるように見えますが、この出力をどのように解釈するかはわかりません。つまり、これらの変更が意味する重要性。

于 2013-10-18T23:09:50.983 に答える