0

こんにちはVisualStudio2008でこのコードを試しているときに、コンパイルエラーの原因を見つけることができませんでした。関数によるchar*の戻り値の例を見ようとしていました。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static char* getActiveModuleType(void);
void main()
{
char getActiveModuleBuff[128];
//error C2106: '=' : left operand must be l-value
getActiveModuleBuff = getActiveModuleType();
printf("Active module in well formatted (2): %s\n",getActiveModuleBuff);

    exit(0);
 }
 char* getActiveModuleType(void)
 {
char activeModule[128];
int tempBuffLen=0;
int nbActivemodule = 0;
char moduleA        = 1;
char moduleB        = 1;
char moduleC        = 0;
char moduleD        = 1;
int i = 0;
if(moduleA==1) {activeModule[i] ='A'; activeModule[i+1]=','; i= i+2;}
if(moduleB==1) {activeModule[i] ='B'; activeModule[i+1]=','; i= i+2;}
if(moduleC==1) {activeModule[i] ='C'; activeModule[i+1]=','; i= i+2;}
if(moduleD==1) {activeModule[i] ='D'; activeModule[i+1]=','; i= i+2;}

printf(" Active module in : %s\n",activeModule);
//let get get the last ',' value trucated
tempBuffLen = strlen(activeModule);
nbActivemodule = tempBuffLen/2;
if((tempBuffLen == 0) && (nbActivemodule ==0)){
        memcpy(activeModule,"NoActiveModule",14);
        return activeModule;
}
if(activeModule[tempBuffLen-1]==',')
    activeModule[tempBuffLen-1] = '\0';
printf(" Active module in well formatted : %s\n",activeModule);

return activeModule;
}

このコードでこのエラーC2106が発生する理由を見つけることができません。
ヘルプが必要です。
ありがとう

4

2 に答える 2

2
char getActiveModuleBuff[128];
getActiveModuleBuff = getActiveModuleType();

Cの配列に値を割り当てることはできません。

memcpy配列をコピーする場合、またはstrcpy/を使用しstrncpyて文字列をコピーする場合に使用します。

また:

 char* getActiveModuleType(void)
 {
     char activeModule[128];
     /* ... */
     return activeModule;
 }

activeModule配列オブジェクトは、関数の終了時に破棄されます。関数が戻った後にアクセスするのは未定義の動作です。

于 2012-08-24T17:02:39.077 に答える
1

ouahが言ったことへの追加。

配列を返さないでください。代わりに、関数に引数として渡された配列に書き込み、代わりに結果コードを返します。

getActiveModuleType関数のプロトタイプをに変更しvoid getActiveModuleType(char *activeModule)ます。これにより、関数は配列をパラメーターとして受け取り、何も返しません。

次に、activeModulefromgetActiveModuleTypeの宣言を削除します。これは、すでにパラメータとして宣言されているためです。

の後に、関数が何も返さない(void)ので、memcpy(activeModule,"NoActiveModule",14);に置き換えます。これにより、失敗時に関数が終了します。return activeModule;return;

関数が何も返さないため、最後の行getActiveModuleTypeを削除します。return activeModule;

そして、あなたのmain関数で、に置き換えgetActiveModuleBuff = getActiveModuleType();てくださいgetActiveModuleType(getActiveModuleBuff);

于 2012-08-24T18:11:15.390 に答える