문제

C에서 프로그램을 작업하고 8051 아키텍처 장치에 SDCC 컴파일러를 사용하고 있습니다. Flash Memory에서 8 자에서 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;
}

아직이 기능에 대한 언급이 없지만 어떤 이유로 든 "기능이 집계를 반환 할 수 없습니다"라는 컴파일러 오류가 발생합니다. 이것은 내 컴파일러가 structs를 반환하는 함수를 지원하지 않음을 의미합니까? 아니면 그냥 뭔가 잘못하고 있는가?

도움이 되었습니까?

해결책

SDCC는 아직 과제 및 반환 스트러크를 지원하지 않습니다 (위키키가 최신 인 경우) :

SDCC에서 아직 구현되지 않았습니다.

  • 데이터 유형 더블.
  • 구조 및 노조는 함수 매개 변수 또는 반환 값으로 전달 될 수 없습니다.
  • 기능 매개 변수의 스토리지 클래스 지정자 등록.

어쩌면 당신은 만들어야 할 것입니다

void GetName(MyStruct* ret_name, int i);

대신 기능.


즉, 기능 프로토 타입을 넣어야합니다 ~ 전에 그만큼 main 그리고 ~ 후에 그만큼 MyStruct. 프로토 타입이 없으면 함수가 반환되는 것으로 가정됩니다. int.

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

(또한 main 함수는 an이어야합니다 int main(void) 또는 int main(int argc, char** argv). 돌아 오지 않아야합니다 void.)

다른 팁

ANSI 이후 C89/90 컴파일러를 사용하면 구조물 객체를 반환 할 수 있습니다. 클래식 (Pedantic) K & R C 컴파일러는 그렇지 않습니다.

그러나 어쨌든 기능을 먼저 선언해야합니다. 즉 ~ 전에 당신은 그것을 부릅니다. 그리고 char[8] Name 구조물 내부는 유효한 선언이 아닙니다. 유효한 형태는입니다 char Name[8].

포인터-배열 회복 기능이 올바르게 선언됩니다. 깨진 것은 당신의 크기 매크로입니다. 해야한다

#define NAME_SIZE 8 

참고 : 아니요 = 캐릭터.

예, 기능은 C에서 structs를 반환 할 수 있습니다. 위의 코드에는 몇 가지 오류가 있습니다. 몇 가지 변경 사항으로 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;  
 }

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;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top