ورود به حساب ثبت نام جدید فراموشی کلمه عبور
برای ورود به حساب کاربری خود، نام کاربری و کلمه عبورتان را در زیر وارد کرده و روی «ورود به سایت» کلیک کنید.





اگر فرم ثبت نام برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.









اگر فرم بازیابی کلمه عبور برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.





کاربران برچسب زده شده

نمایش نتایج: از 1 به 10 از 10

موضوع: مشكل با C++

  1. #1
    2010/04/05
    92
    0

    مشكل با C++

    تو برنامه CodeBlocks وقتي مي نويسم void main () برنامه error مي ده :
    E:\Elec\CodeBlocks Project\000\0.2\main.c|3|error: `main' must return `int'|
    لطفا بهم بگيد مشكل از كجاست؟
  2. #2
    2009/08/11
    682
    80

    پاسخ : مشكل با C++

    بنویس int main
    استاندارد جدید (البته دیگه قدیمی شده) میگه تابع main حتما باید int باشه و یه مقداری رو برگردونه (return 0 هم میخواد)
    https://www.linkedin.com/in/mohammadhosseini69

    http://zakhar.blog.ir
  3. #3
    2008/09/02
    اصفهان
    1,897
    39

    پاسخ : مشكل با C++

    جسارتا این استاندارد جدید یا قدیم ممکنه یک مورد منطقی پشتش باشه. main اجرا کننده اصلی برنامه است و یک برنامه پس از اختتام کدی رو به سیستم عامل تحویل میده که میشه از نحوه اجرای برنامه توسط این کد اطلاع پیدا کرد.
    در حالتی که برنامه جای دیگه ای غیر از main تموم بشه مثلا استفاده از exit یا abort این کد مشخصه. فکر میکنم abort برنامه رو با کد 3 تموم میکنه. حالا وقتی برای main مقدار برگشتی قرار داده نمیشه مسلما ما در انتهای تابع main مقداری برنمیگردونیم. اما این به این معنی نیست که مقداری برنگرده. چون در روال startup مقدار برگشتی تابع main مهم تلقی شده و باهاش کار میشه. و در این حالت معلوم نیست که main چه مقداری برگردونده.

    بذارین اینجوری بگم:

    فرض کنین روال startup اینجوری باشه:


    ....
    exit( main(argc, argv, envp) );
    ....


    اگر ما این تابع رو به این صورت تعریف و استفاده کنیم:


    void main(void)
    {
    }


    برنامه کامپایل و اجرا میشه اما تابع exit با چه مقداری برنامه رو تموم میکنه؟ در یک ساختار x86 محتوای رجیستر ax و در avr محتوای جفت رجیستر r25:r24. این رجیستر(ها) که نمیتونن مقداری نداشته باشن. ولی معلوم نیست چی توشونه. و ما داریم با یک زبان با قابلیت انعطاف بالاو قدرتمند کار میکنیم. پس باید کامپایلر بهمون گیر بده که int بذار تا مجبور شی مقدار برگشتی رو دانسته بهم برگردونی.

    امیدوارم دقیقا متوجه شده باشین منظورم چیه.
  4. #4
    2010/08/10
    175
    1

    پاسخ : مشكل با C++

    میشه یکم ساده تر توضیح بدین؟ :-/
    کار بسیار ظریفی است که انسانی را ببخشیم، بی آنکه ارزشش را در نظر خود او و خودمان پایین بیاوریم
  5. #5
    2008/09/02
    اصفهان
    1,897
    39

    پاسخ : مشكل با C++

    وقتی شما یک تابعی مثل getchar رو صدا میکنین باید بدونین که این تابع یک مقدار عددی برمیگردونه که کد کاراکتر خونده شده هست و اگر کوچکتر از صفر باشه یعنی نتونسته چیزی رو بخونه. بنا بر این کد زیر با اینکه ممکنه از لحاظ منطقی درست بنظر بیاد اما غلطه:


    char c = (char)getchar();


    چرا؟ چون اغلب قریب به اتفاق مواقع ایرادی در خوندن اطلاعات پیش نمیاد و متغیر c حاوی کاراکتر خونده شده هست. اما اگر به هر دلیلی این تابع نتونه چیزی بخونه مقدار (منفی یک) رو برمیگردونه که با کدی که نوشتیم براحتی با کاراکتر 255 اشتباه میشه. چرا؟ چون char عموما به صورت علامتدار اگر به یک int تبدیل بشه مقدار (منفی یک) رو داره. میگین نه این کد رو اجرا کنین:


    signed char c = (signed char)0xff;
    printf("%d\n", (int)c);



    منظورم اینه که ما اینجا فرضی رو استفاده کردیم که خیلی از مواقع درسته و نه تمام مواقع!

    حالا مورد ما.
    یک برنامه از main شروع به اجرا میشه و یک جایی یا با تموم شدن تابع main یا توسط صدا زده شدن یکی از توابع exit یا abort برنامه تموم میشه. اگه به سورس توابع ذکر شده نگاه کنین یه چیزی مشابه زیر میبینین:


    void exit(int exit_code)
    {
    _exit(exit_code);
    }


    void abort(void)
    {
    _exit(3);
    }


    همونطور که میبینین این دو تابع مقداری رو به عنوان نتیجه اجرای برنامه به سیستم عامل برمیگردونن. حالا اگه ما برنامه رو با تموم شدن کد تابع main تموم کنیم چه اتفاقی میفته؟ در هر صورت سیستم عامل به یک کد برگشتی احتیاج داره. abort همواره کد 3 رو برمیگردونه. exit کدی رو که ما بهش گفتیم. ولی main چی؟ اگر کدی برنگردونیم روتین startup که وظیفه صدا کردن تابع main رو بر عهده داره یک کدی که معلوم نیست چیه رو به سیستم عامل برمیگردونه. و این برای برنامه ای که برنامه ما رو اجرا میکنه ممکنه یک سردرگمی ایجاد کنه. بعضی وقتها برنامه ما کدی برمیگردونه که ما میدونیم چنده و بقیه مواقع نمیدونیم. این چیزیه که ما بهش میگیم شانس و ما در کار با کامپیوتر به این مورد نه تنها احتیاجی نداریم بلکه عنوان کردنش نشون از ماست مالی کردن و بی برنامگی ما هست.

    مطمئنا پیش خودتون میگین "برو بابا حال داری" ولی اگر در هر برنامه سه چهار تا از این موردها ایجاد کنین واقعا برنامه نویس خوبی نمیشین چون برنامه تون صد در صد قابل اعتماد و پیش بینی نیست. اینو یادتون باشه: خیلی ها برنامه مینویسن. اما تعداد برنامه نویس های خوب واقعا کمه.
  6. #6
    2008/10/07
    تهران
    157
    9

    پاسخ : مشكل با C++

    سلام
    با توجه به دستور زیر هر جا x داشته باشیم چه بلایی سرش میاد ؟


    #define hi(x) (*((int8 *)&x+1))

    ممنون
    زمان تنها واحد حقیقی اندازه گیریه
    زمان وجود ماده رو اثبات میکنه
    بدون زمان هیچکدوم ما وجود نخواهیم داشت
    زمان یکتاست
  7. #7
    2008/09/02
    اصفهان
    1,897
    39

    پاسخ : مشكل با C++

    هیچی! چون اینجا x آرگومان ماکرو است. ربطی به بقیه برنامه ندارد. اصلا بیرون از توصیف این ماکرو xی وجود ندارد.
    اما اگر قرار باشه زمانی که این ماکرو استفاده میشه عملش تفسیر بشه؛ این ماکرو بایت دوم یک متغیر رو برمیگردونه که در ماشینهای با ساختار عددی BigEndian مثل پروسسورهای اینتل مقدار بایت پر ارزش عدد رو برمیگردونه. ولی در ماشینهایی با ساختار LittleEndian مثل مک اینتاش مقدار بایت کم ارزش رو برمیگردونه.

    ضمنا بهتره ماکرو به صورت زیر نوشته بشه:


    #define hi(x) (*(((int8 *)&(x))+1))


    مثلا اگر متغیری از نوع short داشته باشیم با مقدار 0x1234 این ماکرو روی اینتل مقدار 0x12 و در مک اینتاش مقدار 0x34 رو برمیگردونه.
  8. #8
    2008/10/07
    تهران
    157
    9

    پاسخ : مشكل با C++

    نقل قول نوشته اصلی توسط reza_agha
    مثلا اگر متغیری از نوع short داشته باشیم با مقدار 0x1234 این ماکرو روی اینتل مقدار 0x12 و در مک اینتاش مقدار 0x34 رو برمیگردونه.
    حالا اگه این ماکرو روی یه عدد 16 بیتی اعمال بشه یعنی 8 بیت دوم رو بر می گردونه ؟
    مثلا اگه data=oxCF باشه( lsb=hi(data به من مقداره رو میده 1111دیگه ؟
    با توجه به اینکه oxcfبرابر11001111هست !

    من اینو توی کتابخونه ی CCS دیدم
    http://www.4shared.com/file/AtusY6lN/9366.html

    زمان تنها واحد حقیقی اندازه گیریه
    زمان وجود ماده رو اثبات میکنه
    بدون زمان هیچکدوم ما وجود نخواهیم داشت
    زمان یکتاست
  9. #9
    2008/10/07
    تهران
    157
    9

    پاسخ : مشكل با C++

    نقل قول نوشته اصلی توسط reza_agha
    این ماکرو بایت دوم یک متغیر رو برمیگردونه
    میشه لطفا تحلیلش کنید چه جوری این کارو انجام میده ؟

    نقل قول نوشته اصلی توسط reza_agha
    که در ماشینهای با ساختار عددی BigEndian مثل پروسسورهای اینتل مقدار بایت پر ارزش عدد رو برمیگردونه. ولی در ماشینهایی با ساختار LittleEndian مثل مک اینتاش مقدار بایت کم ارزش رو برمیگردونه.
    میکرو کنترلر ها ی AVR و PIC چه ساختاری دارند ؟
    ممنون
    زمان تنها واحد حقیقی اندازه گیریه
    زمان وجود ماده رو اثبات میکنه
    بدون زمان هیچکدوم ما وجود نخواهیم داشت
    زمان یکتاست
  10. #10
    2008/09/02
    اصفهان
    1,897
    39

    پاسخ : مشكل با C++

    مقدار عددی 0xCF در حقیقت به فرم 16 بیتی 0x00CF نگهداری میشه. در سیستمهایی مثل Intel و AVR و بعضی نسخ ARM عددی مثل این به صورت دوبایت پشت سر هم شامل 0xCF و 0x00 ذخیره میشن که چون این ماکرو بایت دوم عدد رو برمیگردونه پس مقدار 0x00 برمیگرده. این مقدار چون در 8051 و 68000 عکس این نوع ذخیره میشه پس ترتیب بایتها به صورت 0x00 و 0xCF هست. بنا براین بایت دوم عدد در این سیستمها برابر با 0xCF میشه.

    این ماکرو برای دسترسی به بایت دوم یک حافظه بکار میره که بهتره حالت کلی استفاده بشه که کامپایلر بتونه اپتیممش کنه به صورت زیر:


    #define hi(n) ((unsigned char)(((unsigned short)(n))>>8))


    که این ماکرو در هر محیطی مقدار 0x00 رو برمیگردونه. ضمنا میتونه با عدد ثابت هم کار کنه.

    - من ساختار pic رو نمیشناسم.
    - ماکرویی گه شما قید کردین به کامپایلر میگه:

    *** فرض کن که x یک متغیری از نوع آرایه بایتی هست. حالا بایت دومش رو در نظر بگیر.

    این ماکرو بر خلاف اونی که من پیشنهاد دادم میتونه برای تغییر مقدار بایت بالایی یک متغیر هم استفاده بشه:


    short n = 0x1234;

    hi(n) = 5; // n = 0x0534


    که البته معادل قابل فهم ترش میشه:


    short n = 0x1234;

    unsigned char *p = (unsigned char *)&n;
    p[1] = 5;

نمایش نتایج: از 1 به 10 از 10

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

  1. مشكل با 555
    توسط paramis در انجمن آموزش نرم افزارهاي آناليز و شبيه ساز
    پاسخ: 0
    آخرين نوشته: 2011/04/29, 12:43
  2. مشكل در سيم كشي ؟؟
    توسط hrbaban در انجمن Proteus
    پاسخ: 2
    آخرين نوشته: 2010/05/20, 18:28
  3. مشكل با ارت
    توسط khoshtip118 در انجمن حفاظت سیستمهای قدرت
    پاسخ: 2
    آخرين نوشته: 2009/12/24, 14:20
  4. يه مشكل با AVR
    توسط hess در انجمن میکروکنترلرهای AVR
    پاسخ: 1
    آخرين نوشته: 2007/12/18, 11:03
  5. مشكل با 555
    توسط nex2004 در انجمن مدارهای آنالوگ و مدارهای مجتمع
    پاسخ: 8
    آخرين نوشته: 2007/07/11, 23:14

کلمات کلیدی این موضوع

علاقه مندي ها (Bookmarks)

علاقه مندي ها (Bookmarks)

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

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