2015-01-05 2 views
0

나는 sprintf를sprintf를 코드

#include <reg52.h> 

char output_arr[7]; 

void print_to_arr(float val) 
{ 
    int integer, fractional, temp = 0, i, ni = 2; 
    float fract; 

    integer = (int)val; 

    fract = val - (float)integer; 
    fract = fract *1000; 
    fractional = (int)fract; 

    for(i=0; i<=2; i++) 
    { 
    temp = integer%10; 
    integer = integer/10; 
    output_arr[ni - i] = temp+48; 
    } 
    temp = 0; 

    output_arr[3] = '.'; 

    for(i=0; i<=2; i++) 
    { 
    temp = fractional%10; 
    fractional = fractional/10; 
    output_arr[(ni+4) - i] = temp+48; 
    } 
    temp = 0; 
} 

을 위해 다음과 같은 기능을 작성하고이를 위해 코드 크기는

Program Size: data=36.0 xdata=0 code=1112 

사람이 줄이는 방법으로 나를 간염 주실 것입니다 (임베디드) 가능한 최소한의 밸류에 코드 크기?

+0

나는'gcc가 -Os' AMD64에서 컴파일하고는 명령 텍스트의 111 바이트로 제공됩니다. 1111 (바이트, 아마도)를 얻기 위해 사용하는 컴파일러와 옵션은 무엇입니까? –

+0

'대상 1' 컴파일 sprintf_test.c ... 가 연결 ... 프로그램 크기 내가 카일의 C 를 사용하고 여기에 그것이 빌드 대상을 표시 무엇 : 데이터 = 36.0 XDATA = 0 코드 = 1112 "sprintf_test" - 0 오류 (들), 0 경고 (들). –

+2

'OPTIMIZE (11, SIZE)'시도해 보셨습니까? 여기 참조 : http://www.keil.com/support/man/docs/c51/c51_optimize.htm를 실제 알고리즘을보고하지 –

답변

3

없이 부동 소수점 하드웨어 장치에서 부동 소수점 연산을 수행하고, 특히 8 비트 디바이스 자체 코드 상당량 (모든 동작 기능보다는 단일 명령어에 의해 지원되어야한다)를 소개한다. 제한된 임베디드 타겟에 대한 대부분의 stdio 구현에는 정확히 그 이유에 대한 부동 소수점 지원을 생략하는 옵션이 있습니다. 8 비트 타겟 정수 모듈 (%) 및 분열 (/)에도 부동 소수점없이

종종 고가이다. 이 경우 8051은 8 비트 나누기 연산 만 가지므로 더 큰 형식의 경우 나누기는 여러 명령어에서 합성됩니다. 당신이 정말로 부동 소수점 지원해야합니다 경우

는, 그 다음은 크기에 작은 영향을 미칠 수 있습니다. 변경은 부동 소수점 연산을 최소화 불필요한 변수의 박멸, 초기화를 사용하기보다는 가변 초기 값을 할당하고, 루프 불변 ni + 4 동작의 제거를 포함한다. 이것들은 아무런 영향을 미치지 않을 수도 있고, 옵티 마이저가 더 작은 코드를 생성하는 것을 더 쉽게 만들 수도 있습니다. 당신은 실험을해야 할 것입니다. 구현 최종 소수 자리를 반올림하고 음수 값 완전히 실패하지 않는

void print_to_arr(float val) 
{ 
    int integer = (int)val ; 
    int fractional = (int)(val * 1000.0f) - (integer * 1000) ; 
    int i ; 

    for(i = 0; i < 3; i++, integer /= 10) 
    { 
    output_arr[2 - i] = integer % 10 + '0' ; 
    } 

    output_arr[3] = '.'; 

    for(i = 0; i < 3; i++, fractional /= 10) 
    { 
    output_arr[6 - i] = (fractional % 10) + '0' ; 
    } 
} 

참고. 이러한 문제를 해결하려면 더 많은 코드가 필요합니다.

관련 문제