c - Microchip C18 - 奇怪的代码行为(可能与扩展模式/非扩展模式相关)

标签 c microchip pic18

我在使用 PIC18F67J60 的 Microchip C18 编译器时遇到了这个奇怪的问题。

我创建了一个非常简单的函数,它应该返回较大字符串中子字符串的索引。

我不知道出了什么问题,但该行为似乎与是否启用扩展模式有关。

在 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); 
}

最佳答案

memcmppgm2ram()期望一个指向数据存储器(ram)的指针作为其第一个参数。您正在传递一个指向字符串文字的指针,该字符串位于程序内存 (rom) 中。

您可以使用memcmppgm()相反,或者使用 memcpypgm2ram() 将其他字符串复制到 ram 中或strcpypgm2ram() .

不幸的是,我无法对此进行测试,因为我目前无法访问此编译器。

关于c - Microchip C18 - 奇怪的代码行为(可能与扩展模式/非扩展模式相关),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9047400/

相关文章:

c - 错误: Stack around the variable 'ptemp' was corrupted

c - 字符串的动态内存分配

c - 从二进制文件中读取静态变量

C18 将 char 数组传递给函数

timer - Timer1 RD16 位在 PIC18 微 Controller 上有什么作用?

c - 如果字符串数组在 C 中以 null 结尾,为什么其他数据类型的数组不以 null 结尾?

c - 为什么在写入寄存器时选择补码

c - XC8 错误 224 : illegal # directive (first line)

C:简单代码未按预期工作(PIC micro)

c - 跨端口拆分时 PIC18 读/写数据