انجمن کاربران لینوکس ایران - تکنوتاکس سابق

نسخه ي کامل: یه مشکل در tyepdef
شما در حال مشاهده نسخه ي متني اين صفحه هستيد. مشاهده نسخه کامل تر با قالب بندي صحيح
با سلام خدمت دوستان محترم.
من یه برنامه با کامپایلر gcc برای پلتفرم PIC مینویسم که به مشکل جدیدی برخوردم البته امیدوارم با راهنمایی اساتید بر طرف بشه.
همونطور که میدونید برای استفاده از یه متغیر عمومی در زبان c در کل برنامه باید از کلمه کلیدی extern اتفاده کرد(استفاده در فایلهای مختلف)
حالا اگه این نوع از انواع ساختگی خودمون باشه باید چه کار کرد .به عنوان مثال در برنامه من این دو نوع داده به برنامه اضافه شده
typedef struct
{
unsigned char Time[7];
unsigned char Date[7];
unsigned char Lon_str[10];
unsigned char Lat_str[10];
unsigned char Alt_str[8];
unsigned char Speed_str[7];
unsigned char Course_str[6];
unsigned char Gps_Ant_str[3];
unsigned char Gsm_Ant_str[4];
unsigned char Sim_Charge_Value_str[8];
unsigned char Bat_Charg_Value_str[5];
}SYSTEM_INFO;
typedef enum {GPRMCMode=1, GPGGAMode=2, GPGSVMode=3} GPS_INGO_MODE;
حالا ما دو نوع جدید GPS_INGO_MODE و SYSTEM_INFO رو داریم.
مشکل اینه که این انواع چطوری برای همه فایلها باید به کامپایلر معرفی بشن.
به عنوان مثال استفاده از دو خط زیر در فایلهای مختلف error میده.
SYSTEM_INFO INFO;
GPS_INGO_MODE GpsInfoMode;

ممنون میشم اگه کمک کنید
کسی نیست ما رو کمک بکنه؟

مهمان

فکر کنم اون تعریف struct رو باید توی یک فایل h. بگذاری . توی تمام فایلات include کنی البته مطمئن نیستم ولی اینم تستش کن
همینی که بالایی گفتند درسته!
بله بنده هم همین کار رو کردم فقط میخواستم ببینم که مشکلی نداشته باشه
حالا اگه توی فایلهای دیگه از این نوع که تو یک فایل ساخته شده با extern استفاده کنم بهش دسترسی دارم یعنی همونه.
چی شد خودمم نفهمیدیم!!!
مطمئن باشم که درسته؟
vahidmusic_eshgh نویسنده :بله بنده هم همین کار رو کردم فقط میخواستم ببینم که مشکلی نداشته باشه
حالا اگه توی فایلهای دیگه از این نوع که تو یک فایل ساخته شده با extern استفاده کنم بهش دسترسی دارم یعنی همونه.
چی شد خودمم نفهمیدیم!!!
مطمئن باشم که درسته؟

اگه اشتباه نکنم نباید در همه فایل های c بصورت extern تعریف بکنی... در یکی باید معمولی تعریف بکنی تا اون مقدار فضا داخل stack برای متغیر کنار گذاشته بشه و در بقیه بصورت extern. اون موقع وقتی همه فایل های compile شده رو به همدیگه link میکنی داخل stack اون مقدار حافظه برای متغیرت کنار گذاشته میشه ولی آدرس ابتدای اون محدوده در فضای stack برای تمام متغیر ها در تمام فایل های object یکی هستش.

مثلا متغیر MYVARIABLE بصورت extern تعریف شده و در فایل A.C تعریف شده و دارای یک مقدار خاص پوینتر شده. وقتی در فایل B.C بصورت extern تعریف میکنی دقیقا همون مقدار پوینتر مال فایل A.C رو بهش میده و همون متغیر در هر دو فایل به یک نقطه اشاره میکنن.

STRUCT هم با این مساله تناقض نداره. چون اگه STRUCT دارای دو فیلد X و Y باشه اون موقع:
(مثلا اسمش MYSTRUCT است)

MYSTRUCT=آدرس ابتدای STRUCT در STACK
MYSTRUCT.X = *MYSTRUCT
MY.STRUCT.Y = *(MYSTRUCT+sizeof(X))

حله؟
فقط یک نکته، اینکه هنگام تعریف فایل هیدری که این انواع را در داخلش تعریف می‌کنید یادتان نرود که از Include Guard استفاده کنید.
<!-- m --><a class="postlink" href="http://en.wikipedia.org/wiki/Include_guard">http://en.wikipedia.org/wiki/Include_guard</a><!-- m -->


راستی، مگر GCC برای میکروکنترلرهای PIC هم پورت شده است ؟