2012-01-28 19 views
0

我有用於PIC18F67J60的Microchip C18編譯器的這個奇怪問題。Microchip C18 - 奇怪的代碼行爲(可能與擴展模式/非擴展模式相關)

我已經創建了一個非常簡單的函數,該函數應該返回更大字符串中的子字符串的索引。

我不知道什麼是錯的,但行爲似乎與其他擴展模式是否啓用有關。

隨着MPLAB.X啓用擴展模式,我得到:

  • memcmppgm2ram函數返回零所有的時間。

隨着MPLAB.XI無效擴展模式得到:

  • 迭代變量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); 
} 
+0

不是我確定它可能會導致你的問題,但memcmppgm2ram真的需要一個遠的指針嗎? – 2012-01-28 17:59:56

+0

確實是:signed char memcmppgm2ram(auto void * s1,auto const MEM_MODEL rom void * s2,auto sizeram_t n); MEM_MODEL被定義爲遠 – JakobJ 2012-01-28 19:07:18

回答

0

memcmppgm2ram()需要一個指向數據存儲器(ram)的指針作爲其第一個參數。您傳遞一個指向位於程序存儲器(ROM)中的字符串文字的指針。

您可以改爲使用memcmppgm(),或使用memcpypgm2ram()strcpypgm2ram()將其他字符串複製到RAM。

不幸的是我不能測試這個,因爲我目前還沒有訪問這個編譯器。