Microchip C18 - странное поведение кода (может быть связано с расширенным режимом / без расширенного режима) - PullRequest
0 голосов
/ 28 января 2012

У меня странная проблема с компилятором Microchip C18 для PIC18F67J60.

Я создал очень простую функцию, которая должна возвращать индекс подстроки в большей строке.

Я не знаю, что не так, но поведение, похоже, связано с тем, включен или нет расширенный режим.

С расширенным режимом в MPLAB.X я получаю:

  • Функция memcmppgm2ram постоянно возвращает ноль.

При отключенном расширенном режиме в MPLAB.X я получаю:

  • Значение переменной итератора i считается как: 0, 1, 3, 7, 15, 21

Я думаю о какой-то проблеме со стеком или о чем-то еще, потому что это действительно странно. Полный код показан ниже.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char bigString[] = "this is a big string";

unsigned char findSubStr(char *str, const rom char *subStr, unsigned char n, unsigned char m)
{
    unsigned char i;

    for (i=0; i < n-m; i++)
    {
        if(0 == memcmppgm2ram(&str[i], (const far rom void*)subStr, m))
            return i;
    }
    return n; // not found
}

void main(void)
{
    char n;

    n = findSubStr(bigString, (const rom void*)"big", sizeof(bigString), 3); 
}

1 Ответ

0 голосов
/ 03 февраля 2012

memcmppgm2ram() ожидает указатель на память данных (ram) в качестве первого аргумента. Вы передаете указатель на строковый литерал, который находится в памяти программ (rom).

Вместо этого вы можете использовать memcmppgm() или скопировать другую строку в оперативную память, используя memcpypgm2ram() или strcpypgm2ram().

К сожалению, я не могу проверить это, так как в данный момент у меня нет доступа к этому компилятору.

...