هل تسمح جميع المترجمين C بوظائفهن بإرجاع الهياكل؟

StackOverflow https://stackoverflow.com/questions/2419763

  •  19-09-2019
  •  | 
  •  

سؤال

أنا أعمل على برنامج في C واستخدام مترجم SDCC لجهاز هندسة 8051. أحاول كتابة وظيفة تسمى GetName التي ستقرأ 8 أحرف من ذاكرة الفلاش وإرجاع صفيف الأحرف في شكل ما. أعلم أنه من غير الممكن إرجاع صفيف في 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;
}

ليس لدي أي إشارات إلى هذه الوظيفة حتى الآن ولكن لسبب ما، أحصل على خطأ مترجم يقول "لا يمكن أن تعذر الدالة إرجاعها." هل هذا يعني أن مترجمي لا يدعم الوظائف التي تعود الهيكل؟ أم أنا فقط أفعل شيئا خطأ؟

هل كانت مفيدة؟

المحلول

SDCC لا يدعم المهمة وإعادة الهياكل حتى الآن (إذا كان Wiki الخاص بهم محدث):

لم يتم تنفيذها بعد في SDCC:

  • نوع البيانات مزدوجة.
  • لا يمكن تعيين الهياكل والنقابات، مرت كمعلمات وظيفة أو قيم العودة.
  • تسجيل محدد فئة التخزين في معلمات الوظائف.

ربما يجب أن تجعل

void GetName(MyStruct* ret_name, int i);

وظيفة بدلا من ذلك.


ومع ذلك، يجب عليك وضع النموذج الأولي وظيفة قبل ال main و بعد ال MyStruct. وبعد إذا لم تكن هناك نماذج أولية ستحصل على وظيفة للعودة int.

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

(أيضا، main الوظيفة يجب أن تكون int main(void) أو int main(int argc, char** argv). وبعد لا ينبغي أن يعود void.)

نصائح أخرى

تسمح جميع برامج التحويل البرمجيات Post-ANSI C89 / 90 بجائزة عودة الكائنات. الكلاسيكية (محادثات) K & R C مترجمين لا.

ومع ذلك، في أي حال عليك أن تعلن الوظيفة أولا. بمعنى آخر قبل أنت تسميها. و char[8] Name داخل بنية الخاص بك ليس إعلان صالحا. النموذج صالح هو char Name[8].

تم الإعلان عن وظيفة مؤشر إلى حد صفيف بشكل صحيح. إنه ماكرو حجمك المكسور. يجب ان يكون

#define NAME_SIZE 8 

ملاحظة: لا = حرف.

نعم، يمكن أن تعود الوظائف من الهياكل في C. التعليمات البرمجية أعلاه لديها العديد من الأخطاء. مع بعض التغييرات، يتم تجميعها بشكل صحيح تحت دول مجلس التعاون الخليجي (ليس لدي 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;  
 }

أنا حقا لا أريد استخدام مترجم C الذي لم ينفذ مكالمة الهيكل والعودة حسب القيمة، كما يقترح Kennymt الخاص بك لا. في الواقع، يجب ألا يسمى مثل هذا المترجم مترجم 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