0

char配列とifステートメントに問題があります。

私はやろうとします:

void Motors::manualMotion(int CycleDutyAzim,int CycleDutyPitch,char directionAzim[],char directionPitch[]){


    setCycleDutyA(CycleDutyAzim);
    setCycleDutyP(CycleDutyPitch);

    if(directionAzim=="FORW"){
        moveForwAzim();
    }else if(directionAzim=="BACK"){
        moveBackAzim();
    }else{
        Serial.println("FAIL");
        handbreakAzim();
    }

    if(directionPitch=="FORW"){
        moveForwPitch();
    }else if(directionPitch=="BACK"){
        moveBackPitch();
    }else{
        Serial.println("FAILED");
        handbreakPitch();
    }
}

私はいつもserial.printsにメッセージを表示します。配列ではなくcharで動作するようにしました。正しく動作するための構文は何ですか。メソッドを呼び出すと、次のようになります。

Motors::manualMotion(90,50,"FORW","BACK");

動作しません。FやBのような1つの文字を使用すると、正しく動作します。

4

6 に答える 6

4
if (directionPitch == "FORW")

==文字列の比較に は使用できません。

配列を関数に渡すと、最初の要素へのポインターとして減衰します。比較に使用==すると、ポインターのアドレスと文字列リテラル「FORW」のアドレスのみを比較します。これは明らかにあなたがやりたいことではありません。必要なのは、文字列リテラルとポインターが指すコンテンツとの比較です。

C スタイルの文字列を比較する必要があるstrcmp場合に必要です。

別の注意として、とにかく C++char []の代わりに使用するのはなぜですか? std::string手動のメモリ管理の問題をすべて解決し==、文字列オブジェクトの比較に簡単に使用できます。

于 2013-03-20T14:43:55.937 に答える
4

C スタイルの文字列を比較できないため、==を使用する必要がありますstrcmp

ただし、 arduinoにはSTLがありませんが、portがあればSTLを楽しむことができます。もう 1 つの方法はstd::string、C スタイルの文字列の代わりに使用することです。

void Motors::manualMotion(int CycleDutyAzim,int CycleDutyPitch,
const std::string &directionAzim, const std::string &directionPitch) { // ...
于 2013-03-20T14:44:27.327 に答える
1

C/C++char * ==は、あなたが考えていることを実行せず、strcmp/stricmp/strncmp代わりに etc. を使用します。特に固有の文字列型を持つ言語に慣れている場合は、よくある間違いです。

また、文字列を渡す代わりに列挙型を検討することもできます。

于 2013-03-20T14:44:36.090 に答える
0

文字列比較を使用する必要があります。配列比較はそのようには存在しません。char配列が通常nullで終了する文字列であるという理由だけで、C++はnullで終了する文字列の比較を行いません。char[]この件に関しては、これ以上特別な扱いを受けることはありませんint[]

std :: stringのような文字列クラスを使用するか、strcmpを使用します。

于 2013-03-20T14:47:58.140 に答える
0

if (variable == value)単純型、文字、整数の比較にのみ使用できます。文字の配列は単純な型ではないため、比較を行う関数が必要です。strcmpまたはstricmpあなたのために働くでしょう。

于 2013-03-20T14:46:54.473 に答える
0

これは、C スタイルの文字列を比較する方法ではありません。使用する必要がありますstrcmp()。あなたがするとき

directionAzim=="FORW"

ポインタを比較しています。

char directionAzim[]

プロトタイプでは、次のように書くこともできます:

char *directionAzim

"FORW"あり、タイプconst char *です。したがって、合格している場合:

Motors::manualMotion(90,50,"FORW","BACK");

関数がリテラルを変更しようとするのを止めるものがないため、これは安全ではありません (おそらくプログラムがクラッシュします)。プロトタイプは次のようになります。

void Motors::manualMotion(int CycleDutyAzim,int CycleDutyPitch,
   const char directionAzim[], const char directionPitch[]);
于 2013-03-20T14:47:08.013 に答える