NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 1402 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
صفحه 1 از 2 12 آخرینآخرین
نمایش نتایج: از 1 به 20 از 21

موضوع: تبدیل float به 4 تا بایت

  1. #1
    همکار افتخاری
    تاریخ عضویت
    Jul 2007
    نام
    محمد هادی عبدی
    نوشته ها
    129
    تشکر
    82
    تشکر شده 294 بار در 73 پست

    پیش فرض تبدیل float به 4 تا بایت

    دو تا تابع کار بردی برای تبدیل float به 8 بیتی برای ذخیره کردن در eeprom و خیلی کارای دیگه

    کد:
    //--------------------------------------------------------------------------------- u8 MAKE_8_FLOAT(float var,u8 offset){ union { u8 b[4]; float f; } data; data.f =var; return data.b[offset]; } //--------------------------------------------------------------------------------- float MAKE_FLOAT(u8 var1,u8 var2,u8 var3,u8 var4){ union { u8 b[4]; float f; } data; data.b[0]=var1; data.b[1]=var2; data.b[2]=var3; data.b[3]=var4; return data.f; }

  2. کاربران : 2 تشکر کرده اند از شما hadiabdi برای ارسال این پست سودمند:


  3. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نام
    Advertising world
    نوشته ها
    Many
     

  4. #2
    کاربر دائمی alghasi آواتار ها
    تاریخ عضویت
    Apr 2012
    نام
    سعيد القاصي
    نوشته ها
    467
    تشکر
    22
    تشکر شده 519 بار در 265 پست

    پیش فرض

    سلام دوست عزیز.
    نیاز به نوشتن تابع نبود.
    براحتی با پوینتر ها امکان پذیره. یعنی خیلی انجام میشه . تو کتاب خونه های پایه ای زیاد هست این کاد واسه این تابع براش ننوشتن. مثلا کافیه آدرس متغیر float رو نسبت بدی به یه ارایه چهار تایی. یک خط کد که خیلی سریع انجام میشه. به عبارتی به این روش میگن type cast
    اگه هم دوست نداشتی با pointer ها مستقیم کار نکنی از دستورات کپی حافظه استفاده کن مثه memcopy

  5. تشکرها از این نوشته :


  6. #3
    همکار افتخاری
    تاریخ عضویت
    Jul 2007
    نام
    محمد هادی عبدی
    نوشته ها
    129
    تشکر
    82
    تشکر شده 294 بار در 73 پست

    پیش فرض

    نقل قول نوشته اصلی توسط alghasi نمایش پست ها
    سلام دوست عزیز.
    نیاز به نوشتن تابع نبود.
    براحتی با پوینتر ها امکان پذیره. یعنی خیلی انجام میشه . تو کتاب خونه های پایه ای زیاد هست این کاد واسه این تابع براش ننوشتن. مثلا کافیه آدرس متغیر float رو نسبت بدی به یه ارایه چهار تایی. یک خط کد که خیلی سریع انجام میشه. به عبارتی به این روش میگن type cast
    اگه هم دوست نداشتی با pointer ها مستقیم کار نکنی از دستورات کپی حافظه استفاده کن مثه memcopy
    ادرس تو ارم چند بیتی هستش ؟؟؟؟؟؟؟؟؟؟؟؟

  7. #4
    کاربر دائمی alghasi آواتار ها
    تاریخ عضویت
    Apr 2012
    نام
    سعيد القاصي
    نوشته ها
    467
    تشکر
    22
    تشکر شده 519 بار در 265 پست

    پیش فرض

    آدرس؟ جه فرقی داره؟ به اندازه محدوده کلی که میتونه حافظه ثاپورت کنه. فکر کنم 32 بیتی باشه.
    اما اگه منظورتون اینه که چند بیت یه پوینتر میتونه برگردونه باید بگم بسته به نوع پوینتر داره. اگه موینتر به بایت باشه خوب یه بایت. اگه int باشه 16 .... میتونه پوینتر به ارایه باشه. میتونه حتی پوینتر به یه ساختار باشه مثه یه ساختاری چهار بایتی که بشه چیزی که میخوای.
    این ربطی به arm یا cpu که کد میزنی نداره. Type cast تویه برنامه های سطح وبالا برای تبدیل متغیر هایی که حافظشون دست نمیخوره استفاده میشه.
    چهار تا خونه کنار هم تو ram. حالا میتونی به کامپایلر بگی اینا float هستن یا int هستن یا اصلا چهر تا بایت جدا از هم. فقط نحوخ دست رسی بهشون رو تعریف میکنی

  8. تشکرها از این نوشته :


  9. #5
    همکار افتخاری
    تاریخ عضویت
    Jul 2007
    نام
    محمد هادی عبدی
    نوشته ها
    129
    تشکر
    82
    تشکر شده 294 بار در 73 پست

    پیش فرض

    نقل قول نوشته اصلی توسط alghasi نمایش پست ها
    آدرس؟ جه فرقی داره؟ به اندازه محدوده کلی که میتونه حافظه ثاپورت کنه. فکر کنم 32 بیتی باشه.
    اما اگه منظورتون اینه که چند بیت یه پوینتر میتونه برگردونه باید بگم بسته به نوع پوینتر داره. اگه موینتر به بایت باشه خوب یه بایت. اگه int باشه 16 .... میتونه پوینتر به ارایه باشه. میتونه حتی پوینتر به یه ساختار باشه مثه یه ساختاری چهار بایتی که بشه چیزی که میخوای.
    این ربطی به arm یا cpu که کد میزنی نداره. Type cast تویه برنامه های سطح وبالا برای تبدیل متغیر هایی که حافظشون دست نمیخوره استفاده میشه.
    چهار تا خونه کنار هم تو ram. حالا میتونی به کامپایلر بگی اینا float هستن یا int هستن یا اصلا چهر تا بایت جدا از هم. فقط نحوخ دست رسی بهشون رو تعریف میکنی
    پس یونیون تو سی چیکاره است ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

  10. #6
    کاربر دائمی alghasi آواتار ها
    تاریخ عضویت
    Apr 2012
    نام
    سعيد القاصي
    نوشته ها
    467
    تشکر
    22
    تشکر شده 519 بار در 265 پست

    پیش فرض

    از union هم میشه استفاده کرد اما به شرطی که از قبل تعریف کرده باشی.
    اما روش type cast یه کمی کاربردش متفاوته.
    یه مثال مثل وقتی میخوای header یک فایل wav رو بخونی.
    معمولا 44 بایت هدر یک فایل wave هست. که شامل نوعش، تعداد sample ها. اندازه فایل، چندبیتی بودن نمونه ها، سرعت نمونه برداری، alignment داده ها و.... هست. یا باید یکی یکی متغیر ها رو از فایل بخونی و بهم بچسبونی یا اینکه اول یه structure از فایل wave درست کنی و فقط با معرفی یه پوینتر به اون استراکچر یه جا همه رو باهم باستخراج کنی. این روش معمولی تو برنامه نویسی .
    همون دستور memcopy هم ببینید چطور پیاده سازی شده میتونه کمک کنه. چون براش فرقی نمیکنه چی تو وردیش و خروجی قرار میدین. همه رو بایت بایت میخونه.
    به هر حال type cast یه روشه. Union یه روش دیگه و کتریم که شما انجام دادین یه روش. هر کدوم رو که دوست داشتین استفاده کنید.
    چیزی که خدمتتون عرض کردم یه پیشنهاد بود. شما برنامه تویس هستین و کاری که دوست دارین رو انجام بدین.

  11. تشکرها از این نوشته :


  12. #7
    همکار افتخاری
    تاریخ عضویت
    Jul 2007
    نام
    محمد هادی عبدی
    نوشته ها
    129
    تشکر
    82
    تشکر شده 294 بار در 73 پست

    پیش فرض

    هدف این پست به نظر شما چی بوده ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ من برای کل کل یا ادعای سواد پست زدم یا برای کمک که اگر کسی یک دفعه گیر افتاد از این تابع استفاده کنه من این حرفا رو میذارم پای جوانی شور شوق موفق باشید

  13. #8
    کاربر دائمی alghasi آواتار ها
    تاریخ عضویت
    Apr 2012
    نام
    سعيد القاصي
    نوشته ها
    467
    تشکر
    22
    تشکر شده 519 بار در 265 پست

    پیش فرض

    دوست عزیز منم برای کل کل نزاشتم. منم یه راه پیشنهاد دادم. نمیدونم جرا انقدر تعجب میکنی یا ناراحت شدی. اینم یه راه. همین.

  14. #9
    همکار افتخاری
    تاریخ عضویت
    Jul 2007
    نام
    محمد هادی عبدی
    نوشته ها
    129
    تشکر
    82
    تشکر شده 294 بار در 73 پست

    پیش فرض

    خوب دوست عزیز من که ناراحت نشدم شما خیلی اشتیاق راه پیدا کردن داری
    شما حالا کد تو بزار ما یه چیز جدید یاد بگیریم

  15. #10
    کاربر دائمی alghasi آواتار ها
    تاریخ عضویت
    Apr 2012
    نام
    سعيد القاصي
    نوشته ها
    467
    تشکر
    22
    تشکر شده 519 بار در 265 پست

    پیش فرض

    نقل قول نوشته اصلی توسط hadiabdi نمایش پست ها
    خوب دوست عزیز من که ناراحت نشدم شما خیلی اشتیاق راه پیدا کردن داری
    شما حالا کد تو بزار ما یه چیز جدید یاد بگیریم
    در ابتدا فقط برای تبدیل یه متغیر float به چهار بایت از سه روش استفاده شده که روش دوم type cast است و بسیار سریع برای تبدیل نرخ زیاد اطلاعات استفاده میشود.
    در ادامه برای نشان دادن تبدیل های بزرگ ، فرض شده اطلاعات ولتاژ، دما و شماره دیتا در یک فایل ذخیره شده و شما آن را خوانده اید یا مثلا از کامپیوتر با شبکه دریافت کرده اید. که قدار های پیش فرض در data قرار گرفته است. با استعفاده از memcpy یا type cast به راحتی میتوان به صورت یک جا اطلاعات را کامل خواند ودرمتغیر ها مربوطه قرار داد. باید توجه شود که تایپ کست بسیار سریع انجام میشود زیرا بیشتر رهنمود کامپایلر در زمان کامپایل برای طریقه دسترسی به حافظه در زمان اجراست.
    برای بررسی درستی اطلاعات ، از هایپر ترمینال تحت شبکه استفاده شده است و خروجی آن نیز ارائه گردید.




    /************************* Sample Raw Data class
    __________________________________________________ _________
    |(4 Bytes) Counter|(4 Bytes) float vlot|(1 byte) T |
    |____________________|_______________________|____ __________|
    ********************************************/

    typedef struct //-------9 byte
    {
    int counter; //--4 byte 0-3
    float volt; //--------4 byte 4-8
    char Temp;//--------1 byte 9
    }TestTypeDef;

    void test(float f)
    {
    char* p;
    TestTypeDef t;
    char d[4],i;
    char data[16];


    AS_printf("Val = %f.\r\n",f);
    d[0]=0;d[1]=0;d[2]=0;d[3]=0;
    //-------------------Tabdil float be char ravesh 1
    memcpy(d,&f,4);
    AS_printf("Methood 1: 0x%X ,0x%X ,0x%X ,0x%X.\r\n",d[0],d[1],d[2],d[3]);
    //-------------------Tabdil float be char ravesh 2
    d[0]=0;d[1]=0;d[2]=0;d[3]=0;
    *(float*)d=(f);
    AS_printf("Methood 2: 0x%X ,0x%X ,0x%X ,0x%X.\r\n",d[0],d[1],d[2],d[3]);
    //-------------------Tabdil float be char ravesh 3
    d[0]=0;d[1]=0;d[2]=0;d[3]=0;
    p=(char*)&f;
    for(i=0;i<4;i++)
    d[i]=*p++;
    AS_printf("Methood 3: 0x%X ,0x%X ,0x%X ,0x%X.\r\n",d[0],d[1],d[2],d[3]);
    /*************************************
    bar dashtan etela@t mojod dar yek araye khande shode be form TestType
    **************************************/
    data[0]=8;data[1]=2;data[2]=0;data[3]=0; //------------------2 byte aval az jense 16bit = Counter =0x28 =520
    data[4]=d[0];data[5]=d[1];data[6]=d[2];data[7]=d[3]; //------4 byte badi az jense float, meghadr f dar ghesmat ghabli
    data[8]=25; //-----------------------------------------------1 byte akhar az jense char, dama 25
    data[9]=0;data[10]=0;data[11]=0;data[12]=0;data[13]=0;data[14]=0;data[15]=0;
    // t=(*(TestTypeDef *)data);
    memcpy(&t,data,9);
    AS_printf("Type Cast Reading : Counter = %d, Volt = %f, T = %d.\r\n\r\n",t.counter,t.volt,t.Temp);
    //-------------------------------------
    }
    .
    .
    .
    .
    .
    int main(void)
    {
    float f;
    .
    .
    .
    .

    Set_UDPServer(UDPpcb);
    Set_Terminal_IP(192,168,1,170);
    f=10;
    for(;;)
    {
    f+=0.1;
    test(f);
    _delay(5000000);
    }

    .
    .
    .
    }

  16. کاربران : 3 تشکر کرده اند از شما alghasi برای ارسال این پست سودمند:


  17. #11
    همکار افتخاری
    تاریخ عضویت
    Jul 2007
    نام
    محمد هادی عبدی
    نوشته ها
    129
    تشکر
    82
    تشکر شده 294 بار در 73 پست

    پیش فرض

    این ها همه روش های خوبی هستش و همه هم جواب میده ولی بعضی کامپایلرها مشکلات خاص خودشون و دارن که سازگار با سی نیستن تو بعضی جاهاها برای همین باید بری دستوری و پیدا کنی که خیالت راحت باشه مثلا حالت اشاره گری تو بعضی از کامپایلرها اذیت میکنه

  18. #12
    کاربر دائمی alghasi آواتار ها
    تاریخ عضویت
    Apr 2012
    نام
    سعيد القاصي
    نوشته ها
    467
    تشکر
    22
    تشکر شده 519 بار در 265 پست

    پیش فرض

    بجز memcopy که خودش یه تابع هست. باقی همه دستورات پایه ای c هستن. همه جا کار میکن. تو کد ویژن ، تو gcc تویه c# و c builder که خودم تست کردم.همه جا کار میکن.
    دستوراتی مثه printf با همین شیوه پیاده سازیشدن، نه تنها تویه c بلکه تو زبان های دیگه هم مثه پاسکال و دلفی هم کار میکنن. مثلا وقتی خودم میخوام فایل wave رو باز کنم تویه دلفی از همین روش استفاده میکنم. حتی با qt تویه لینوکس. و keil 8051
    این کار مثه حلقه for میمونه توی همه زبان های برنامه نویسی هست. فقط سینتکسش فرق داره، مگه اینکه اون زبان پوینتر رو پشتیبانی نکنه.کهدیگه زبان نیست.
    یه کارت دا ه برداری داره 20 کانال رو دیتای 32 بیتی با نرخ 100ksp سمت pc میفرسته و ویه هزر بسته 10 نمونه از هر کانال هست، چطور میشه اونا رو خوند و پردازشکرد به صورت realtime ? اگه این کار رو نکنی اصلا وقت نمیکنی دیتاها رو دریافت کنی، چه برسه به پردازش

  19. تشکرها از این نوشته :


  20. #13
    همکار افتخاری
    تاریخ عضویت
    Jul 2007
    نام
    محمد هادی عبدی
    نوشته ها
    129
    تشکر
    82
    تشکر شده 294 بار در 73 پست

    پیش فرض

    افرین افرین ادامه بده همون اولش به جای تفسیر و توضیح همین کدها رو قرار میدادی که 4 نفر هم استفاده کنن من از این روحیت خوشم میاد

  21. #14
    کاربر دائمی alghasi آواتار ها
    تاریخ عضویت
    Apr 2012
    نام
    سعيد القاصي
    نوشته ها
    467
    تشکر
    22
    تشکر شده 519 بار در 265 پست

    پیش فرض

    همون اول خدمتتون عرض کردم و دقیقا هم اسم روش ها رو گفتم هم اسم تابع memcpy.
    مثلا memcpy که خودش تو مثالی که زدم یک خط بیستر نیست.
    فکر نمیکنم گشتن در مورد این تابع یک دقیقه بیشتد تول بکشه.
    باقی توضیحات در جواب صحبت های شما بود. در اخر هموفقط مثال بود در جواب حرف های شما.
    امید وارم این بحث تموم بشه چون خارج از این قوانین این گروه.

  22. #15
    همکار افتخاری
    تاریخ عضویت
    Jul 2007
    نام
    محمد هادی عبدی
    نوشته ها
    129
    تشکر
    82
    تشکر شده 294 بار در 73 پست

    پیش فرض

    والا من هیچ وقت بحث راه نمیندازم کاری هم به چیزی ندارم فقط کار خودم و انجام میدم توابع که شما گفتی تو سی فراوان الحمدالله نت که هست یه سرچ 5 دقیقه ایی میزنی همه چیز پیدا میکنی محدوده علم دیگه گسترده شده کسی از قافله اگر بخواد عقب نمیمونه انشالله که همیشه موفق و موید باشی شما دوست خوب و فعال منی من از این بحث ها اصلا ناراحت نمیشم چون باعث گشایش موضوع میشه

  23. کاربران : 2 تشکر کرده اند از شما hadiabdi برای ارسال این پست سودمند:


  24. #16
    کاربر علاقه مند Shapour_Ardebil آواتار ها
    تاریخ عضویت
    Jun 2007
    نام
    ٍShapour
    نوشته ها
    98
    تشکر
    49
    تشکر شده 104 بار در 49 پست

    پیش فرض

    با سلام

    ضمن تشکر از دوستان من همیشه در اینگونه موارد از روش زیر برای تبدیل Float به Char و برعکس آن استفاده می کنم

    کد:
    unsigned char array[4];
    float f;
    memcpy(array,(unsigned char*)&f,4); //from float to array
    memcpy((unsigned char*)&f,array,4); //from array to float

  25. تشکرها از این نوشته :


  26. #17
    کاربر دائمی alghasi آواتار ها
    تاریخ عضویت
    Apr 2012
    نام
    سعيد القاصي
    نوشته ها
    467
    تشکر
    22
    تشکر شده 519 بار در 265 پست

    پیش فرض

    نقل قول نوشته اصلی توسط Shapour_Ardebil نمایش پست ها
    با سلام

    ضمن تشکر از دوستان من همیشه در اینگونه موارد از روش زیر برای تبدیل Float به Char و برعکس آن استفاده می کنم

    کد:
    unsigned char array[4];
    float f;
    memcpy(array,(unsigned char*)&f,4); //from float to array
    memcpy((unsigned char*)&f,array,4); //from array to float
    اره. منم تو کدی که نوشته بودم فرستادم همینو نوشتم.
    فقط نیاز نیست نوع پوینتر رو تو پرانتز قبلش بهش بگی. خودش تو بدنه تابع اون کارو میکنه.

  27. #18
    کاربر علاقه مند Shapour_Ardebil آواتار ها
    تاریخ عضویت
    Jun 2007
    نام
    ٍShapour
    نوشته ها
    98
    تشکر
    49
    تشکر شده 104 بار در 49 پست

    پیش فرض

    نقل قول نوشته اصلی توسط alghasi نمایش پست ها
    اره. منم تو کدی که نوشته بودم فرستادم همینو نوشتم.
    فقط نیاز نیست نوع پوینتر رو تو پرانتز قبلش بهش بگی. خودش تو بدنه تابع اون کارو میکنه.
    با سلام

    باید همیشه بیاد داشته باشیم که در برنامه نویسی باید استانداردها را رعایت بکنیم و امکان دارد کار ما از راه میانه (غلط) توسط یک کامپایلر خاص (x) راه می افتد چون ما به این راه میانه عادت میکنیم وراه استاندارد را فراموش میکنیم با تعویض کامپایلر دیگر کاری نمی توانیم بکنیم و احساس بلاتکلیفی میکنیم پس بهتر نیست که ما همیشه از راه استاندارد استفاده بکنیم تا به روش درست عادت کنیم

  28. #19
    کاربر دائمی alghasi آواتار ها
    تاریخ عضویت
    Apr 2012
    نام
    سعيد القاصي
    نوشته ها
    467
    تشکر
    22
    تشکر شده 519 بار در 265 پست

    پیش فرض

    نقل قول نوشته اصلی توسط Shapour_Ardebil نمایش پست ها
    با سلام

    باید همیشه بیاد داشته باشیم که در برنامه نویسی باید استانداردها را رعایت بکنیم و امکان دارد کار ما از راه میانه (غلط) توسط یک کامپایلر خاص (x) راه می افتد چون ما به این راه میانه عادت میکنیم وراه استاندارد را فراموش میکنیم با تعویض کامپایلر دیگر کاری نمی توانیم بکنیم و احساس بلاتکلیفی میکنیم پس بهتر نیست که ما همیشه از راه استاندارد استفاده بکنیم تا به روش درست عادت کنیم
    امیدوارم توضیحات بنده رو حمل بر بی ا بی ندونید. هدف اینجا تبادل اطلاعاته.
    دقیقاً بهتره استاندارد ها رو رعایت کنیم. پوینتر ها یکمی گیج کننده هستن.
    1. ورودی تابع رو دقیتر مطالعه بفرماید. پوینتر عمومی هست. که هم به دلیل این هست که همه نوع داده ای رو قبول میکنه تو وردی. دوم بخاطر این پوینتر عمومی هست که همون طور گفتم تویه بدنه تابع خودش مدل خوندن ار از پوینتر رو معرفی کرده.
    2. وردی تابع وقتی پوینتر باشه فقط یک عدد به عنوان آدرس دریافت میکنه. وقتی شما قبل از یک پوینتر پرانتز میزارین تنها کاری که انجام میشه یه رهنمونه که موقع اگه کامپایلر بخواد یه آدرس رو بخونه شما بهش گفتین به چه حالتی اونو بخونه. این کار هیچ اثری بر رویه مقدار عددی آدرس حافظه ذخیره شده در پوینتر نداره. وقتی شما رهنمون برای وردی تابع میزارین تویه پوینتر توسط کامپایلر نادیده گرفته میشه.
    3. هر وقت بخواین اطلاعاتی که پوینتر عمومی داره بهش اشاره میکنه بخونین باید نوعشو معرفی کنین. اما اگه میخواین مقدارش رو به پوینتر دیگه ای ارسال کنین مثه وددی تابع، نوشتن رهنمون توسط کامپایلر نادیده گرفته میشه چون معنی نداره برای آدرس حافظه. خود memcopy وقتی که میخواد اطلاعات رو کپی کنه به نوع پوینترش رو مشخص میکنه. تو کدی گذاشته بودم. روش سوم کد داخل یه دستور مثه memcopy بود.

  29. #20
    کاربر فعال
    تاریخ عضویت
    Apr 2011
    نوشته ها
    108
    تشکر
    34
    تشکر شده 70 بار در 34 پست

    پیش فرض

    دوست عزیز سریع ترین راه حل برای این کار استفاده از یونیون ها در سی هست یه سرچ بکنید جواب می گرید هم خیلی سریع هست هم خیلی دقیق

  30. تشکرها از این نوشته :


صفحه 1 از 2 12 آخرینآخرین

موضوعات مشابه

  1. تبدیل float به binary
    توسط SAMIRR در انجمن برنامه نویسی کامپیوتر/کنترل با کامپیوتر
    پاسخ: 0
    آخرين نوشته: 24-01-2015, 12:53
  2. پاسخ: 14
    آخرين نوشته: 23-04-2014, 11:52
  3. چطور يه متغيير float رو در eeprom ذخيره کنم ؟
    توسط sadeqebrahimi در انجمن میکروکنترلرهای 8و16 بیتی
    پاسخ: 1
    آخرين نوشته: 29-03-2013, 20:27
  4. float در دستور sprintf
    توسط آقاجون در انجمن LPC series (NXP)
    پاسخ: 0
    آخرين نوشته: 20-07-2012, 19:36
  5. ذخیره سازی float در EEPROM خارجی
    توسط Caspian1361 در انجمن AVR
    پاسخ: 1
    آخرين نوشته: 27-04-2012, 20:34

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •