2

コードをコンパイルしようとすると、次のエラーが発生します。

error #2168: Operands of '=' have incompatible types 'char [255]' and 'char *'.
error #2088: Lvalue required.

同じ行(つまり1044)で、複数の行でこれらのエラーが発生するので、1つを修正することで他の行を修正できると考えているので、コードをコピーします。スキップして、コメントが**で始まり<で終わる行のみを読むことができます:)コード内のコメントがうまく機能することを願っています:最初に、タイプPRINTOPTを定義することから始めましょう

typedef struct {
    //UsePl signifies if the user would like to see the graphs without having to export data
    //Thanks to PlPlot library. 
    int usePl;

    //Feel free to customize and add to this struct
    //for any simulation program you create.
    //---- Note2self: probably change the graph bool to an array,
    //as later you will have to print around 20 graphs or so

    int thetaGraph;     //Plot Theta VS Time
    int omegaGraph;     //Plot Omega VS Time


    char filename[255]; //**I have declared it to be a 255 char. <============
    int matlab;     //0 no, not 0 yes;
} PRINTOPT;

エラーを発生させる関数intReadPrintOpt(PRINTOPT * opt){int input;

    int usePl;
    int thetaGraph;     
    int omegaGraph;

    //**The result behind this def, i would like the user to input a filename
    //To save his data in,  <========================================================
    char filename[255] = "Osc Motion and Chaos- Results"; //I have declared filename as char [255]

    int matlab;
    printf("\n----Print Options----\n");
    printf("\nMENU (choose one of the following commands)\n");
    printf("\n\t 1 - Display Graphs after Simulation\t\t\tCurrent Val\t\"%d\"",opt->usePl);
    printf("\n\t 2 - Enable Theta vs Time Graph\t\tCurrent Val\t\"%d\"",opt->thetaGraph);
    printf("\n\t 3 - Enable Omega vs Time Graph\t\tCurrent Val\t\"%d\"",opt->omegaGraph);
    printf("\n\t 4 - Save Data in Matlab Format\t\tCurrent Val\t%d",opt->matlab);
    printf("\n\t 5 - Filename for exported files\t\tCurrent Val\t%s",opt->filename);
    printf("\n\n\t 0 - <DONE>\n>>");
    scanf("%d",&input);

    switch(input) {
        case 0: 
            return 0;
        case 5:
            printf("Enter Filename: ");     
            fgets(filename, 255, stdin);    //**i've been told to use this, saw it on another question
            opt->filename = filename;   //**In this part, opt is of type PRINTOPT
            //I have been told that the name of an array, is actually 
            //a pointer to the first element, so why does this part 
            //give me this error -- Operands of '=' have incompatible types 'char[255] and [char*]
            //although i've declared both as char[255]; 
            break;
        case 4:
            printf("Enable Matlab (0 no, else yes): ");
            scanf("%d",&matlab);
            opt->matlab = matlab;
            break;
        case 1:
            printf("Use this program to display plots (0 no, else yes): ");
            scanf("%d",&usePl);
            opt->usePl = usePl;
            break;
        case 2:
            printf("Record Data for Graph of Theta (0 no, else yes): ");
            scanf("%d",&thetaGraph);
            opt->thetaGraph = thetaGraph;
            break;
        case 3:
            printf("Record Data for Graph of Omega (0 no, else yes): ");
            scanf("%d",&omegaGraph);
            opt->omegaGraph = omegaGraph;
            break;
        default:
            printf("Invalid Input!");
            break;
    }
    return 1;
}

とにかく、私は両方のファイル名を255文字として宣言したと信じています..コンパイラは間違いを犯しません..だから私はそれが私だと思いました:)どこで間違ったのですか?アイデアは、駆動力などのパラメーターのスイープを作成する関数があるということです。そのデータのファイルをダンプするためのシミュレーションが必要です。--results1.txt --results2.txt --results3.txt

これは別の質問を提起しますが、私は確かにそれに対する答えを見つけます、グーグル...どうすればcでintからcharに変換できますか?おそらく簡単なキャスト?

再度、感謝します

4

1 に答える 1

5

配列識別子がsizeof_Alignofまたは単項演算子として使用されていない場合&、ポインターに減衰し、左辺値ではありません。opt->filenameこれは、次の行で行っているように、=演算子で代入できないことを意味します。

opt->filename = filename;

解決策が 2 つあります。

  • として定義opt->filenamechar *ます。opt->filenameの寿命以外では使用しないことに注意してくださいfilename。それ以外の場合、動作は未定義です。
  • opt->filanameasと定義して(from )char[256]を使用します。strcpy<string.h>

例えば:

#include <string.h>

strcpy(opt->filename, filename);

参考文献:

  • 配列と左辺値:

C11 (n1570)、§ 6.3.2.1 左辺値、配列、および関数指定子

sizeof演算子、_Alignof演算子、または単項演算子のオペランドである場合、または配列の初期化に使用される文字列リテラルである場合を除き、&''array of type'' 型の式は '' 型の式に変換されます。配列オブジェクトの最初の要素を指し、左辺値ではないtype'' へのポインター。

  • 代入演算子:

C11 (n1570)、§ 6.5.16 代入演算子

代入演算子は、左オペランドとして変更可能な左辺値を持つものとします。

于 2013-03-23T09:03:34.100 に答える