- Код: Выделить всё
#include <stdlib.h> // Если не вписать..
#define F_CPU 4 // ...эти две строки
//то на форуме код будет отображаться криво (скрипт не видит что это Код СИ)
char buffer[] = "\r\nMEMORY_FULL\r\n\r\nERROR\r\n"; //Строка в буффере из которой
//нужно получить состояние (сейчас это будет "ERROR")
//и описание состояния (сейчас это описание ошибки "MEMORY_FULL")
char info1[32]; // Сюда нужно поместить описание состояния
//(в конце программы тот должно быть "MEMORY_FULL"
char status1[10];// Сюда нужно поместить состояние
//(в конце программы тот должно быть "ERROR"
////////////////////////////////
void filtr(char *tmpch){ //Функция ФИЛЬТР, в неё передаём массив который нужно отфильтровать
int ind=0;
intcc=0;
int*m; // указатель для my_memo[]
intmy_memo[4]={-1,-1,-1,-1}; //Хранилище номеров первого и последнего символа для каждого слова в массиве
char *s;
m=&my_memo[0]; // Указываем на адрес первой ячейки в массиве
while(*tmpch){ //перебираем массив buffer[]
if((*tmpch != '\r')&&(*tmpch != '\n')&&(*tmpch != '\0')){ //Если текущий символ не \0 \r \n
if(ind==0){ *m++=cc; ind=1;} // и если он первый то добавляем
//его порядковый номер в my_memo[]
//устанавливаем ind=1; Пока ind=1 то в my_memo[0] ничего не записываем
}else{
//Если это любой символ из \0 \r \n
if(ind==1){ *m++ = (cc-1); } // И если в my_memo[] была запись номера первого символа
// Записываем в следующую ячейку my_memo[] номер последнего символа слова
//(фактически это номер первого символа разделителя \r минус 1)
ind=0; // разрешаем новую запись в my_memo[] если попадается символ слова
}
cc++; // Инкреминируем порядковый номер символа в buffer[]
*tmpch++; //перемещаем указатель
}
if(ind==1){ *m=cc-1; } // Если последний символ слова не отмечен
//(в случае когда в конце строки в буффере нет символов разделителей \r\n)
////////////
// заполняем массивы info1[] status1[] в зависимости от номеров в my_memo[]
if(my_memo[0]!=-1 && my_memo[1]!=-1 && my_memo[2]!=-1 && my_memo[3]!=-1 ){
//Если my_memo[] заполнен полностью, т.е есть и состояние и описание
cc=0;
for (int tmp=my_memo[2];tmp<=my_memo[3];tmp++){
status1[cc++]=rx_buffer[tmp];
}
cc=0;
for (int tmp=my_memo[0];tmp<=my_memo[1];tmp++){
info1[cc++]=rx_buffer[tmp];
}
}else if(my_memo[0]!=-1 && my_memo[1]!=-1){// если в my_memo[] "координаты" только одного слова из строки
//т.е. состояние без его описания (например buffer[] = "READY\r\n";)
cc=0;
for (int tmp=my_memo[0];tmp<=my_memo[1];tmp++){
status1[cc++]=rx_buffer[tmp];
}
}
int main(void){
filtr(buffer);
//После вызова функции массивы info1 и status1 содержат
//info1[] = MEMORY_FULL
//status1[] = ERROR
buffer[] = "READY\r\n"; // меняем строку в буффере
filtr(buffer);
//После вызова функции массивы info1 и status1 содержат
//info1[] = "";
//status1[] = READY
}
В общем может ктото предложит другое решение, или оптимизирует это???!!!