0

こんにちは、単一の IR センサーを備えたライン フォロワー ロボットに取り組んでいます。

シミュレーション クライアントとハードウェアが提供されました。迷路でトークンが見つかるまで、有効なパスに沿ってロボットを移動する必要があるシミュレーション部分を現在試しています。次に、停止して座標 x, y を次のように指定します: 「x , y で見つかったトークン」。グローバル座標系 (東、西など) に基づいてサーバー アプリケーションによって提供される座標。ロボットにはローカル座標系 (左、右、前方など) があります。開始時のロボットの向きを選択し、実際の座標も画面に表示します。すべての動きがサーバー アプリケーションに送信される前に、画面上で必要なロボットの向きの修正 (「左へ」、「前方へ」、「右へ」、「向きを変える」) が示され、座標がサーバーに送信されます。 . 例:

プログラムをローカルまたはリモートサーバーでシミュレートするには2つの方法があります.ローカルマシンでは迷路を見ることができますが、リモートサーバーでは常に未知の迷路が表示されます.

私は2つのCファイルを持っています

ロボプロキシ.c

    #include <stdarg.h>
#include "../h/RobotProxy.h"

/// initialized with ROBOT_FAIL
int currentIntersection = ROBOT_FAIL;

#if !defined(vasprintf)
static int vasprintf(char **s, const char *format, va_list ap) {
    /* Guess we need no more than 100 bytes. */
    int n, size = 100;
    va_list save_ap;

    if ((*s = (char*) malloc(size)) == NULL)
        return -1;
    while (1) {
        /* work on a copy of the va_list because of a bug
         in the vsnprintf implementation in x86_64 libc
         */
#ifdef __va_copy
        __va_copy(save_ap, ap);
#else
        save_ap = ap;
#endif
        /* Try to print in the allocated space. */
#ifdef _vsnprintf
        n = _vsnprintf(*s, size, format, save_ap);
#else
        n = vsnprintf(*s, size, format, save_ap);
#endif
        va_end(save_ap);
        /* If that worked, return the string. */
        if (n > -1 && n < size) {
            return n;
        }
        /* Else try again with more space. */
        if (n > -1) { /* glibc 2.1 */
            size = n + 1; /* precisely what is needed */
        } else { /* glibc 2.0 */
            size *= 2; /* twice the old size */
        }
        if ((*s = (char*) realloc(*s, size)) == NULL) {
            return -1;
        }
    }
}
#endif

#if !defined(asprintf)
static int asprintf(char **s, const char *format, ...) {
    va_list vals;
    int result;

    va_start(vals, format);
    result = vasprintf(s, format, vals);
    va_end(vals);
    return result;
}
#endif

/// Set the robot to the specified position
/// @ returns ROBOT_SUCCESS, ROBOT_FAIL or ROBOT_TOKENFOUND
int Robot_Move(int x, int y) {
    char* buffer;
    asprintf(&buffer, "{\"x\":%d,\"y\":%d}", x, y);
    char* query = url_encode(buffer);
    free(buffer);
    char* response = sendAndRecieve(concat(URL, query));

    if (response == NULL) {
        puts("Connection to server failed!");
        return ROBOT_FAIL;
    }

    if (contains(response, "\"code\":1")) {
        puts("Connection declined!");
        return ROBOT_FAIL;
    }

    if (contains(response, "\"code\":2")) {
        puts("Connection blocked!");
        return ROBOT_FAIL;
    }

    if (contains(response, "\"code\":3")) {
        printf("Invalid position! (x=%d, y=%d)\n", x, y);
        return ROBOT_FAIL;
    }

    int foundIntersection = 0;
    bool token = false;

    if (contains(response, "\"north\":true"))
        foundIntersection |= D_N;
    if (contains(response, "\"east\":true"))
        foundIntersection |= D_E;
    if (contains(response, "\"south\":true"))
        foundIntersection |= D_S;
    if (contains(response, "\"west\":true"))
        foundIntersection |= D_W;

    if (contains(response, "\"token\":true"))
        token = true;

    free(query);

    currentIntersection = foundIntersection;
    if (token)
        return ROBOT_TOKENFOUND;

    return ROBOT_SUCCESS;
}

/// Get the intersections of the current node that the robot is at
/// @ returns always the intersection at position x=0,y=0 if Robot_Move was not called first
int Robot_GetIntersections() {
    if (currentIntersection == ROBOT_FAIL)
        Robot_Move(0, 0);
    return currentIntersection;
}

Roboclientsim.C

    #include "../h/Configuration.h"

int main(void) {

    printf("Token: %d\n", Robot_Move(1, 0));
    printf("Intersection: %d\n", Robot_GetIntersections());

    return EXIT_SUCCESS;
}

コンソールでプログラムを実行すると、トークンが1であることがわかり、トークンを見つけると2になります。

そのため、roboclientsim.c に「

 If (Robot_Move()==2) //as Robot_move is returning the %d value for Token
printf("another token found ");

"

しかし、私のコンパイラは、robot_move に対する引数がほとんどないという問題を引き起こしています。

誰でもこれを行う方法を手伝ってもらえますか?

4

2 に答える 2

1

Robot_Move2 つの引数を取ります:

int Robot_Move(int x, int y);

そして、引数なしで呼び出します。

If (Robot_Move()==2)

それがエラーです。あなたがやりたかったことは次のとおりだと思います:

int main(void) {
    int token = Robot_Move(1, 0);
    printf("Token: %d\n", token);
    printf("Intersection: %d\n", Robot_GetIntersections());

    if (token == 2) 
       printf("another token found ");

    return EXIT_SUCCESS;
}

または多分:

int main(void) {
    int token = Robot_Move(1, 0);

    if (token == 2) {
       printf("Token: %d\n", token);
       printf("Intersection: %d\n", Robot_GetIntersections());
    } else {
       printf("another token found ");
    }

    return EXIT_SUCCESS;
}
于 2013-11-03T11:19:03.627 に答える
0

メソッドのプロトタイプを確認してください int Robot_Move(int x, int y) 。呼び出すときに 2 つのパラメーターを指定する必要があります。

于 2013-11-03T11:22:16.840 に答える