اطلاعیه

Collapse
No announcement yet.

سوال در مورد تابع sprintf

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

    سوال در مورد تابع sprintf

    سلام
    چجوری میتونم توسط تابع sprint یک عدد اعشاری با دو رقم غیر اعشار و 3 رقم اعشار رو به رشته تبدیل کنم؟

    #2
    پاسخ : سوال در مورد تابع sprintf

    می تونی از این استفاده کنی

    sprintf(lcd_buff,"data=%2.3f ",read_Data);]
    lcd_puts(lcd_buff);

    دیدگاه


      #3
      پاسخ : سوال در مورد تابع sprintf

      ممنون
      میتونی بگی هر کاراکتر های کنترلی توی این تایع چیکار میکنه؟ مثلا * و % و ....
      متن انگلیسیشو خوندم ولی
      راستی اینو هم امتحان کردم ولی به طور ثابت فقط 3f رو نشون میده

      دیدگاه


        #4
        پاسخ : سوال در مورد تابع sprintf

        کاراکتر های کنترلی که با % شروع می شوند می توانند نوع داده خروجی را تعیین کنند برای مثال f% برای نمایش اعداد اعشاری و d% برای اعداد صحیح و غیره....
        برای اعداد اعشاری می توان برای حذف رقم اعشاری اضافی و رقم صحیح از این قسمت استفاده کرد "data=%**.**f " اعلان این عدد رابه صورت 2 رقم صحیح و دو رقم اعشار نمایش می دهد ..در رابطه با 3f باید بگم که احتمالا % را ننوشته ای و در جای دیگر اشتباه داری .
        اگه بشه برنامتو بزار تا اشکالشو برطرف کنیم .
        باتشکر

        دیدگاه


          #5
          پاسخ : سوال در مورد تابع sprintf

          کد:
          /*****************************************************
          This program was produced by the
          CodeWizardAVR V2.05.3 Standard
          Automatic Program Generator
          © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
          http://www.hpinfotech.com
          
          Project : 
          Version : 
          Date  : 01/29/2012
          Author : ali
          Company : 
          Comments: 
          
          
          Chip type        : ATmega32
          Program type      : Application
          AVR Core Clock frequency: 8.000000 MHz
          Memory model      : Small
          External RAM size    : 0
          Data Stack size     : 1024
          *****************************************************/
          #include <mega32.h>
          #include <stdio.h>
          #include <delay.h>
          #include <stdlib.h>
          #include <alcd.h>
          
          /***************************************************/
          float v;
          unsigned char vs[10]="" ;
          
          /***************************************************/
          void main(void)
          {
          // Declare your local variables here
          
          // Input/Output Ports initialization
          // Port A initialization
          // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
          // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
          PORTA=0x00;
          DDRA=0x00;
          
          // Port B initialization
          // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
          // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
          PORTB=0x00;
          DDRB=0x00;
          
          // Port C initialization
          // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
          // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
          PORTC=0x00;
          DDRC=0x00;
          
          // Port D initialization
          // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
          // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
          PORTD=0x00;
          DDRD=0x00;
          
          // Timer/Counter 0 initialization
          // Clock source: System Clock
          // Clock value: Timer 0 Stopped
          // Mode: Normal top=0xFF
          // OC0 output: Disconnected
          TCCR0=0x00;
          TCNT0=0x00;
          OCR0=0x00;
          
          // Timer/Counter 1 initialization
          // Clock source: System Clock
          // Clock value: Timer1 Stopped
          // Mode: Normal top=0xFFFF
          // OC1A output: Discon.
          // OC1B output: Discon.
          // Noise Canceler: Off
          // Input Capture on Falling Edge
          // Timer1 Overflow Interrupt: Off
          // Input Capture Interrupt: Off
          // Compare A Match Interrupt: Off
          // Compare B Match Interrupt: Off
          TCCR1A=0x00;
          TCCR1B=0x00;
          TCNT1H=0x00;
          TCNT1L=0x00;
          ICR1H=0x00;
          ICR1L=0x00;
          OCR1AH=0x00;
          OCR1AL=0x00;
          OCR1BH=0x00;
          OCR1BL=0x00;
          
          // Timer/Counter 2 initialization
          // Clock source: System Clock
          // Clock value: Timer2 Stopped
          // Mode: Normal top=0xFF
          // OC2 output: Disconnected
          ASSR=0x00;
          TCCR2=0x00;
          TCNT2=0x00;
          OCR2=0x00;
          
          // External Interrupt(s) initialization
          // INT0: Off
          // INT1: Off
          // INT2: Off
          MCUCR=0x00;
          MCUCSR=0x00;
          
          // Timer(s)/Counter(s) Interrupt(s) initialization
          TIMSK=0x00;
          
          // USART initialization
          // USART disabled
          UCSRB=0x00;
          
          // Analog Comparator initialization
          // Analog Comparator: Off
          // Analog Comparator Input Capture by Timer/Counter 1: Off
          ACSR=0x80;
          SFIOR=0x00;
          
          // ADC initialization
          // ADC disabled
          ADCSRA=0x00;
          
          // SPI initialization
          // SPI disabled
          SPCR=0x00;
          
          // TWI initialization
          // TWI disabled
          TWCR=0x00;
          
          lcd_init(16);
           v = 12.345; 
            
          sprintf(vs,"%2.3f volt",v); 
          while (1)
             {
             
          
          
          lcd_clear();
          lcd_puts(vs);
          delay_ms(100);
          
             }
          }

          دیدگاه


            #6
            پاسخ : سوال در مورد تابع sprintf

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

            دیدگاه


              #7
              پاسخ : سوال در مورد تابع sprintf

              طول میدان مقادیر اعشاری به صورت w.df% بیان میشه که در اون w طول کل میدان و d طول قسمت اعشاره.
              به عنوان مثال وقتی میدان رو به صورت 4.1f% بیان میکنیم یعنی دو رقم صحیح و یک رقم برای کاراکتر"." و یک رقم برای اعشار داریم.
              عبارتی که نوشتید یعنی 2.3% کاملاً اشتباه است. چون طول مقدار اعشاری از کل طول میدان بیشتره در نتیجه کامپایلر رقم اعشار رو به طور خودکار گرد میکنه. برای همین ممکنه در ظاهر خروجی درست باشه. ولی در بسیاری موارد ممکنه خروجی اشتباه باشه.

              دیدگاه


                #8
                پاسخ : سوال در مورد تابع sprintf

                راه دیگه ای نداره جز کوچ کردن به کامپایلر دیگر مانند IAR یا avrstudio ....یا اینکه بدون کدویزارد برنامه بنویسی ..کدویزاد تنبل میکنه /....

                دیدگاه


                  #9
                  پاسخ : سوال در مورد تابع sprintf

                  ممنون از همه دوستان
                  بالاخره مشکلم حل شد
                  اشتباهم این بود که طول ارایه کاراکتری رو کم میگرفتم

                  دیدگاه


                    #10
                    پاسخ : سوال در مورد تابع sprintf

                    دوست عزیز در مورد مشکل اول که گویا حل شد اینکه شما می بایستی در تنظیمات کدویژن قسمت مربوط به sprintf رو در حالت مد اعشاری نیز تنظیم کنید .

                    در مورد مشکل دوم که مربوط به ویزارد بود نیز نیازی به کوچ کردن نیست . شما هر بار که قسمتی را تغییر می دهید ان قسمت تغییر یافته را از میزارد کپی کنید و در برنامه خودتان اضافه کنید .

                    دیدگاه

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