2012-01-28 5 views
0

PIC18F67J60 용 마이크로 칩 C18 컴파일러에 이상한 문제가 있습니다.마이크로 칩 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은 실제로 멀리 포인터를 사용합니까? –

+0

예 참으로 : 서명 된 char memcmppgm2ram (자동 void * s1, 자동 const MEM_MODEL rom void * s2, 자동 sizeram_t n); MEM_MODEL은 멀리까지 정의됩니다. – JakobJ

답변

0

memcmppgm2ram()은 첫 번째 인수로 데이터 메모리 (ram)에 대한 포인터를 필요로합니다. 프로그램 리터럴 (rom)에있는 문자열 리터럴에 대한 포인터를 전달하고 있습니다.

대신 memcmppgm()을 사용하거나 memcpypgm2ram() 또는 strcpypgm2ram()을 사용하여 다른 문자열을 램에 복사 할 수 있습니다.

이 컴파일러에 대한 액세스 권한이 없으므로 불행히도 테스트 할 수 없습니다.