String to char

raptoridze
Offline
Зарегистрирован: 10.01.2014

Добрый день

в целях экономия места для скетча пытаюсь уйти от переменных типа String, так как они тянут за собой большую библиотеку WString.cpp

есть к примеру функция
 
void ds_printString(String Str, char X, char Y){

if ( X >= 0 )
setCursorXY(X, Y);


char count=0;
    while(Str[count]) ds_printChar(Str[count++]);  


}

вызов этой функции происходит так

char s[5];
float f=5.5;
dtostrf(f, 5, 2, s);    
ds_printString(s,x,y);

 

в таком виде все замечатлеьно работает

переделываю первую функцию на 

void ds_printString(char* Str, char X, char Y)

 

и все глючит, и ардуина перезагружается сама ... что я неправильно делаю?

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

dtostrf тоже вроде в WString определена, тоже надо избавляться от неё. ds_printChar что в качестве параметра принимает? Потому что всё остальное нормально написано, если только dtostrf всё правильно делает, я её просто убрал и вручную задал строку для проверки на дуе все работает если ds_printChar принимает именно char а не указатели или еще что-нибудь.

raptoridze
Offline
Зарегистрирован: 10.01.2014

dtostrf  нет, она не определена в WString

это проект бк для авто, в коде много параметров которые выводятся из флоата на экран... 

вы правы на счет того что функция принимает указатели

вот точнее мой код

char* str_podp[] = {

"time trip",//  "время поездки",             //0
  "trip,km",                //1
  "tank,L/100",            //2
  "tank,L"                 //3
} 


void ds_printString(char* Str, char X, char Y){

if ( X >= 0 )
setCursorXY(X, Y);


char count=0;
    while(Str[count]) ds_printChar(Str[count++]);  


}



void setup() {
 

}

void loop() {
  
ds_printString(str_podp[0],0,0);

}

как быть в таком случае?

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

т.е. printString и printChar принимают в качестве параметра char*?

raptoridze
Offline
Зарегистрирован: 10.01.2014

printchar уже принимает конкретно каждый символ

void ds_printChar(uint8_t C)

а вот printString действительно char*

подскажите как правильно исправить?

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Тогда тот код что во втором сообщении (#2) будет работать, только что проверил на дуе. Быдет выводить "time trip". Что бы вывести оставшиеся три строки надо в цикле их выодить и всё, изменяя индекс и координату Y. char* str_podp[] это по сути массив строк, тут с указателями даже заморачиваться не надо, оно само всё делает. Если виснет и перезагружается это из-за чего-то другого.

raptoridze
Offline
Зарегистрирован: 10.01.2014

спасибо!!! нашел проблему

так как у меня много переменных конвертируется перед выводом в массивы чаров, след. образом

char s[5];
float f=5.5;
dtostrf(f, 5, 2, s);    
ds_printString(s,x,y);

когда ds_printString был со Stringом все было ок

пришлось расширить массив чаров char s[6];

почему? что то читал что в конце добавляется "/0" к массиву?

 

в итоге почти 5 кб скетча освободил, тем более у меня совсем туго...

Sketch uses 27 684 bytes (90%) of program storage space. Maximum is 30 720 bytes.