اطلاعیه

Collapse
No announcement yet.

کار نکردن یه برنامه ساده

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    کار نکردن یه برنامه ساده

    سلام دوستان
    این برنامه :NO: چرا درست کار نمیکنه؟؟
    [code=c]
    #include <mega128a.h>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>

    void test();

    char str1[]="abcd20151011";
    char Year[], Month[], Day[];
    int Year_int, Month_int, Day_int;

    void main()
    {
    char str2[];

    // USART Settings
    UCSR0A = 0x00;
    UCSR0B = (1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0 );
    UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
    UBRR0H = 0x00;
    UBRR0L = 0x05;
    #asm("sei&quot

    test();
    sprintf(str2,"%04d/%02d/%02d",Year_int,Month_int,Day_int);
    printf("data=%s",str2);
    while(1);
    }

    void test()
    {
    Year[0] = '2';
    Year[1] = '0';
    Year[2] = str1[6];
    Year[3] = str1[7];
    Month[0] = str1[8];
    Month[1] = str1[9];
    Day[0] = str1[10];
    Day[1] = str1[11];
    Year_int = atoi(Year);
    Month_int = atoi(Month);
    Day_int = atoi(Day);
    }
    [/code]
    میخوام اینجوری نشون بده: data=2015/10/11
    ولی اینجوری نشون میده:



    فایل کدویژن + پروتئوس:
    http://s6.picofile.com/file/8226168800/saman.rar.html
    http://www.eca.ir/forum2/index.php?topic=108455.msg777842#msg777842

    #2
    پاسخ : کار نکردن یه برنامه ساده

    بفرما اینم تصحیح شدش:
    کد:
    #include <mega128a.h>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    void test();
    
    char str1[13]="abcd20151011";
    char Year[5], Month[3], Day[3];
    int Year_int, Month_int, Day_int;
    
    void main()
    { 
     char str2[];
     
     // USART Settings
     UCSR0A = 0x00;
     UCSR0B = (1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0);
     UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
     UBRR0H = 0x00;
     UBRR0L = 0x05;
     #asm("sei")
     
     test();
     sprintf(str2,"%04i/%02i/%02i",Year_int,Month_int,Day_int);
     printf("data=%s",str2);
     while(1);
    } 
    
    void test()
    {
     Year[0]  = '2';
     Year[1]  = '0';
     Year[2]  = str1[6];
     Year[3]  = str1[7];
     Month[0] = str1[8];
     Month[1] = str1[9];
     Day[0]  = str1[10];
     Day[1]  = str1[11];
     Year_int = atoi(Year);
     Month_int = atoi(Month);
     Day_int  = atoi(Day);
    }
    برای جوینده ی علم محدودیتی نیست. "ولو بالسین"

    دیدگاه


      #3
      پاسخ : کار نکردن یه برنامه ساده

      ممنون :smile:
      خب وقتی که اندازه اون فایل string رو تعیین نکنیم، خودش میفهمه سایزش چقدره
      این چرا اینجوری شد؟؟ oo:
      ممکنه توضیح بدین؟ :nerd:
      http://www.eca.ir/forum2/index.php?topic=108455.msg777842#msg777842

      دیدگاه


        #4
        پاسخ : کار نکردن یه برنامه ساده

        خواهش میکنم.
        جواب:
        متغیر str1 رو چون بهش مقدار اولیه دادید کامپایلر خودش مقدار آرایه رو تعیین می کنه لذا شما اگر بنویسید str1[13] و یا بنویسید str[] براش فرقی نمیکنه .چون از روی مقدار اولیه رشته ااندازه آرایه رو می فهمه.
        اما
        برای سه متغیر Year و Month و Day چون اندازه آرایه رو تعیین نکردید و بهش مقدار دهی اولیه هم نکردید . کامپایلر اندازه شونو یک در نظر میگیره.
        لذا در تابع test شما که به خانه های 1و2و3 متغیر Year مقدار میدید هشدار میده که شما دارید این متغیر رو از اندازه ش بیشتر مقدار دهی میکنید.
        و برای متغیر های Month و Day هم همینطوره.
        لذا
        در متغیرهای رشته ای که نمی خواید بهش مقدار اولیه بدید باید اندازه رشته رو تعیین کنید.
        برای جوینده ی علم محدودیتی نیست. "ولو بالسین"

        دیدگاه


          #5
          پاسخ : کار نکردن یه برنامه ساده

          نوشته اصلی توسط m52r65

          برای سه متغیر Year و Month و Day چون اندازه آرایه رو تعیین نکردید و بهش مقدار دهی اولیه هم نکردید . کامپایلر اندازه شونو یک در نظر میگیره.
          کامپایلر ها به صورت عمومی اگه برای یک آرایه مقدار سایز اولیه تعیین نکرده باشین، سایز اولین مقدار دهی رو به عنوان سایز آرایه در نطر می گیره.

          دیدگاه


            #6
            پاسخ : کار نکردن یه برنامه ساده

            نوشته اصلی توسط vahid_22002
            کامپایلر ها به صورت عمومی اگه برای یک آرایه مقدار سایز اولیه تعیین نکرده باشین، سایز اولین مقدار دهی رو به عنوان سایز آرایه در نطر می گیره.
            خیر.
            این طور نیست.
            از لحاظ منطقی هم این حرف شما درست نیست. اصلا دلیلی نداره که سایز اولین آرایه دیفالت قرار داده بشه.
            برای اثبات حرف من به کامپایلر اتمل استودیو دقت کنید :

            به کامپایلر WinAVR دقت کنید:
            برای جوینده ی علم محدودیتی نیست. "ولو بالسین"

            دیدگاه


              #7
              پاسخ : کار نکردن یه برنامه ساده

              چون شما تو اولین مقدار دهی فقط 1 بایت براش در نظر گرفتین.
              مثلا این کد رو امتحان کنین
              main()
              {
              char a[];
              a="123456"
              }
              نتیجه رو بگین
              یه بار هم اینو امتحان کنین
              main()
              {
              char a[];
              a='5';
              }

              دیدگاه


                #8
                پاسخ : پاسخ : کار نکردن یه برنامه ساده

                نوشته اصلی توسط vahid_22002
                چون شما تو اولین مقدار دهی فقط 1 بایت براش در نظر گرفتین.
                مثلا این کد رو امتحان کنین
                main()
                {
                char a[];
                a="123456"
                }
                نتیجه رو بگین
                یه بار هم اینو امتحان کنین
                main()
                {
                char a[];
                a='5';
                }
                رشته ها رو نمیشه با باقی آرایه ها مقایسه کرد. رشته ها هر موقع که مقدار بگیرند مقدار خودشونو به اندازه آرایه میدن ولی آرایه های عددی خیر.
                اندازه رشته اولی 6 حرف به همراه کاراکتر NULLهستش البته در صورتی که همونجا مقدار بگیرند. (برنامه اول اشتباهه)
                و کاراکتر تعریفی دومی هم که کلا تعریفش اشتباهه .
                برای جوینده ی علم محدودیتی نیست. "ولو بالسین"

                دیدگاه

                لطفا صبر کنید...
                X