mizoの答えに追加する(私は主にArduino.SEとEE.SEで答えるので、コメントすることはできません)
XC8コンパイラには、実行時に適切なアドレス空間を決定する機能もあります。
そうです、Hi-Tech PICC-18はこれを行いますが、これを行うコンパイラはこれだけではありません。
現時点ではコンパイラの切り替えが不可能かどうかは理解できましたが。
そのため、次の関数を使用することをお勧めしますstring.h
/** @name memcpypgm2ram
* The {\bf memcpypgm2ram} function performs a {\bf memcpy} where
* {\bf s1} points to data memory and {\bf s2} points to program
* memory.
* @param s1 pointer to destination in data memory
* @param s2 pointer to source in program memory
* @param n number of characters to copy
*/
void *memcpypgm2ram (auto void *s1, auto const MEM_MODEL rom void *s2, auto sizeram_t n);
/** @name memcpyram2pgm
* The {\bf memcpyram2pgm} function performs a {\bf memcpy} where {\bf s1}
* points to program memory and {\bf s2} point to data memory.
* @param s1 pointer to destination in program memory
* @param s2 pointer to source in data memory
* @param n number of characters to copy
*/
MEM_MODEL rom void *memcpyram2pgm (auto MEM_MODEL rom void *s1, auto const void *s2, auto sizeram_t n);
そして、あなたはあなたの関数を次のようにすることができます:
void YourStringFunction(ramstring);
void YourStringFunctionAccpetingRom(romstring){
YourStringFunction(memcpypgm2ram(romstring));
}
^これは実際のコードではなく、より多くの疑似コードです。また、それが効率的かどうかもわかりません。