2016-03-27 20 views
4

Şu anda bir GSM/GPRS modülü üzerinden bir metin mesajı olarak gönderilmek üzere jeolojik koordinatlar (şamandıra olarak) gerektiren bir trafik izleme sistemi üzerinde çalışıyorum. Bu float değerlerini dizelere dönüştürmek için şu kodu kullandım, ancak derlemede "uyarı: (1393) olası donanım yığını taşması algılandı; tahmini yığın derinliği: 10" açılır. PIC 16f877A kullanıyorum ve bu MCU'yu değiştirmek dışında bunu önlemek için ne yapabilirim?PIC16f877A projemde dize dönüştürme için float olan yığın taşması nasıl önlenir?

void reverse(char *str, int len) 
{ 
int i=0, j=len-1, temp; 
    while (i<j) 
    { 
     temp = str[i]; 
     str[i] = str[j]; 
     str[j] = temp; 
     i++; j--; 
    } 
} 

int intToStr(int x, char str[], int d) 
{ 
    int i = 0; 
    while (x) 
    { 
     str[i++] = (x%10) + '0'; 
     x = x/10; 
    } 
    while (i < d) 
     str[i++] = '0'; 

    reverse(str, i); 
    str[i] = '\0'; 
    return i; 
} 

void ftoa(float n, char *res, int afterpoint) 
{ 
    int ipart = (int)n; 
    float fpart = n - (float)ipart; 
    int i = intToStr(ipart, res, 0); 
    if (afterpoint != 0) 
    { 
     res[i] = '.'; 
     fpart = fpart * pow(10, afterpoint); 
     intToStr((int)fpart, res + i + 1, afterpoint); 
    } 
} 
+0

Kodun geri kalanı olmadan söylemek zor ama muhtemelen çok derine iniyorsunuz. Bu fotoğrafta sadece 8 yığınlı mesafe var. Tüm programınızı daha az derin aramak için yeniden yapılandırın, herhangi bir özyineleme kullanmayın ve bir kesme yordamından (kesmeler kullanıyorsanız) alt program çağırma. – Unimportant

+0

Sınırın çarpan faktörü olan (bir kütüphane işlevi ise), 'pow''in çağrı gereksinimlerini görmeyiz. Aksi takdirde, çok basit olan 'reverse' işlevinin 'intToStr'ün bir parçası olmamasının bir nedeni var mı? Bu 1 yığın seviyesini koruyacaktı. Ancak, gösterilen kodda 10 yığın derinliğiniz yok, bu yüzden daha verimli hale getirin. –

cevap

1
siz "sprintf" fonksiyonu inşa kullanmak olabilir

, böyle bir şey (pic16f1705 ile Tamam derler ve senin pic ile aynı olmalıdır): XC8 derleyici için yardım dosyasına

char array[64]; 
float myvalue=2.0f; 
sprintf(array, "%f", myvalue); 

görünüm, yardım -> XC8 Toolchain-> MPLAB XC8 Compiler-> kütüphane functions-> sprintf Ayrıca

Eğer printf kullanarak USART1 doğrudan yazdırabilirsiniz:

printf("my message to GSM transitter %f", myvalue); 
+0

Harika! Aslında pic16f887a ile çalıştı. Desteğiniz için çok teşekkürler! – TheShark