3

私はCでプログラムに取り組んでおり、8051アーキテクチャデバイス用のSDCCコンパイラを使用しています。フラッシュメモリから8文字を読み取り、文字配列を何らかの形式で返すGetNameという関数を作成しようとしています。Cで配列を返すことはできないことを知っているので、次のような構造体を使用してそれを実行しようとしています。

//********************FLASH.h file*******************************
MyStruct GetName(int i);  //Function prototype

#define NAME_SIZE  8

typedef struct
{
    char Name[NAME_SIZE];
} MyStruct;

extern MyStruct GetName(int i);


// *****************FLASH.c file***********************************
#include "FLASH.h"

MyStruct GetName( int i)
{
     MyStruct newNameStruct;

     //...
     // Fill the array by reading data from Flash 
     //...

     return newNameStruct;
}

この関数への参照はまだありませんが、何らかの理由で、「関数は集計を返すことができません」というコンパイラエラーが発生します。これは、私のコンパイラが構造体を返す関数をサポートしていないことを意味しますか?それとも私は何か間違ったことをしているだけですか?

4

4 に答える 4

14

SDCC は代入と戻り構造体をまだサポートしていません(Wiki が最新の場合):

sdcc にはまだ実装されていません:

  • データ型 double。
  • 構造体と共用体を割り当てたり、関数パラメーターとして渡したり、値を返したりすることはできません。
  • 関数のパラメータにストレージ クラス指定子を登録します。

多分あなたは

void GetName(MyStruct* ret_name, int i);

代わりに機能します。


つまり、関数プロトタイプは の前後に配置する必要あります。プロトタイプがない場合、関数は を返すと見なされます。mainMyStructint

MyStruct GetName(int i);
void main(void) { ...

(また、main関数はint main(void)orである必要がありint main(int argc, char** argv)ます。 return であってはなりませんvoid。)

于 2010-03-10T19:12:33.090 に答える
6

すべての ANSI C89/90 以降のコンパイラでは、構造体オブジェクトを返すことができます。古典的な (ペダンティックな) K&R C コンパイラはそうではありません。

ただし、いずれにせよ、最初に関数を宣言する必要があります。つまり、呼び出す前に。そしてchar[8] Name、あなたの構造体の中には有効な宣言がありません。有効な形式はchar Name[8].

配列へのポインタを返す関数が正しく宣言されています。壊れているのはサイズ マクロです。する必要があります

#define NAME_SIZE 8 

注:=キャラクターはありません。

于 2010-03-10T19:15:12.873 に答える
1

はい、関数はCで構造体を返すことができます。上記のコードにはいくつかのエラーがあります。いくつかの変更を加えると、gccで正しくコンパイルされます(試してみるためにsdccがインストールされていませんが、以下のコードを試してください。

 struct MyStruct
 {
   char Name[8];
 }; 

 struct MyStruct GetName( int i)
 {
      struct MyStruct newNameStruct;

      //...
      // Fill the array by reading data from Flash 
      //...
     return newNameStruct;
 } 


 int main(void)
 {
     int NameIndex = 3;
     struct MyStruct testStruct;
     testStruct = GetName(NameIndex);
     return 0;  
 }
于 2010-03-10T19:19:38.813 に答える
0

KennyMT が示唆しているように、構造呼び出しと値渡しを実装していない C コンパイラを使用したくありません。実際、そのようなコンパイラは実際には C コンパイラと呼ばれるべきではありません。コンパイラが構造体を実装している場合、値渡しの実装は難しくありません。

とにかく、コンパイラで作業するには、次のようなものが必要です。

typedef struct
{
    char Name[NAME_SIZE];
} MyStruct;

void f( MyStruct * m ) {
   strcpy( m->Name, "foo" );
}

int main() {
    MyStruct ms;
    f( & ms );
    return 0;
}
于 2010-03-10T19:55:04.260 に答える