2017-02-13 63 views
1

Я пишу программу Microcontroller с помощью Keil-Compiler. Программа создает несколько CSV-подобных строк (Logging-Lines). Например: «A; 001; ERROR; C05; ... \ n» . Чтобы сэкономить место, теперь я хочу уменьшить данные, просто зарегистрировав различия. Поэтому я сохраняю последнюю записанную строку и сравниваю ее с новой. Если значение в столбце одинаковое, я хочу просто опустить его. Например: "A; 001; ОШИБОК; C05; ... \ п" < - предыдущая LogTokenizing multiple String в C с компилятором KEIL

"A; 002; ОШИБКА; С06; ... \ п" < - новый Вход

приведет к «; 002 ;; C06; ... \ n"

Сначала я только что включил <string.h> и использовал 'strtok' для перехода через мою CSV-линию. Поскольку мне нужно сравнить 2 строки/строки, мне нужно будет использовать их одновременно на двух разных строках, которые не работают. Поэтому я перешел на «strtok_r», который, кажется, не работает:

token1 = strtok_r(m_cActLogLine, ";", pointer1); 
while (token1 != NULL) { 
    token1 = strtok_r(NULL, ";", pointer1); 
} 

Это просто дает мне странное поведение. Обычно второй вызов 'strtok_r' просто возвращает NULL, и цикл остается. Так может быть, еще один способ добиться желаемого поведения?

EDIT:

Чтобы пояснить, что я имею в виду, это то, что я в настоящее время пытается добраться до работы: Мой Input (m_cMeasureLogLine) является «M; 0001; 001; 01; 40; 1000,00; 0,00; 1000,00; 0,00; 360,00; 0,00; 400,00; 24,90; 400,00; -9999,00; -9999,00; -9999,00; 0; LED ;;;;; 400,00; 34,40; 25,41; 27,88; 29,01; 0,00; 0,00; 0,00; - 100,00; 0,00; -1000,00; -1000,00; -103,032; -70,192; 19; 8192,00; 0,00; 0;»

char m_cActLogLine[MAX_SIZE_PARAM_LINE_TEXT]; 
char* token1; 
char* token2; 
char** pointer1; 
char** pointer2; 
void vLogProtocolMeasureData() 
{ 
    strcpy(m_cActLogLine, m_cMeasureLogLine); 
    token1 = strtok_r(m_cActLogLine, ";", pointer1); 
    while (token1 != NULL) { 
    token1 = strtok_r(NULL, ";", pointer1); 
    } 
} 

функция является частью более крупного проекта, внедренного поэтому я не имею консольный вывод, но использовать отладчик, чтобы проверить содержимое моих переменные. В приведенном выше примере после первого вызова 'strtok_r' token1 является 'M', что является правильным. Однако после второго вызова (в цикле) токен 1 становится 0x00000000 (NULL).

Если я вместо этого использовать 'strtok' вместо:

strcpy(m_cActLogLine, m_cMeasureLogLine); 
token1 = strtok(m_cActLogLine, ";"); 
while (token1 != NULL) { 
    token1 = strtok(NULL, ";"); 
} 

итерации цикла просто отлично. Но таким образом я не могу обработать две строки за раз и сравнить значения по столбцам.

В string.h функции объявлены как:

extern _ARMABI char *strtok(char * __restrict /*s1*/, const char * __restrict /*s2*/) __attribute__((__nonnull__(2))); 
extern _ARMABI char *_strtok_r(char * /*s1*/, const char * /*s2*/, char ** /*ptr*/) __attribute__((__nonnull__(2,3))); 
#ifndef __STRICT_ANSI__ 
extern _ARMABI char *strtok_r(char * /*s1*/, const char * /*s2*/, char ** /*ptr*/) __attribute__((__nonnull__(2,3))); 
#endif 
+2

Нам нужно больше кода, прежде чем мы можем посоветовать вам, предпочтительно [mcve], и, конечно, * * заявления и любые применимые инициализацию переменных, участвующих. –

+0

См. Http: // stackoverflow.com/questions/15961253/c-correct-use-of-strtok-r и сравнить с тем, что вы делаете –

+0

(думаю, вы не передаете char ** в качестве последнего параметра strtok_r()) –

ответ

2

Вам нужно передать указатель на действительный char* для последнего параметра strtok_r(). Вы передаете указатель на указатель с указателем1, но это NULL (потому что это переменная с глобальным охватом, которой не присвоено значение), поэтому, когда strtok_r() отправляется на хранение итерационного указателя по адресу указателю, который вы передаете , он пытается написать что-то по адресу 0x00000000.

Try ...

char m_cActLogLine[MAX_SIZE_PARAM_LINE_TEXT]; 
char* token1; 
char* pointer1; 

void vLogProtocolMeasureData() 
{ 
    strcpy(m_cActLogLine, m_cMeasureLogLine); 
    token1 = strtok_r(m_cActLogLine, ";", &pointer1); 
    while (token1 != NULL) { 
    token1 = strtok_r(NULL, ";", &pointer1); 
}