CS+ strtokの動作がおかしい?

お世話になります

strtokの動作ですが

int main(void)
{
        char str[] = "ABCD ef.1234.G";
        char *tp;

        /* スペース.を区切りに文字列を抽出 */   
        tp = strtok( str, " ." );
        puts( tp );
        while ( tp != NULL ) {
                tp = strtok( NULL," ." );
                if ( tp != NULL ) puts( tp );
        }
        
        return 0;
}

【実行結果】

ABCD
ef
1234
G
であろうと思います、が区切り\0が出力されません(下記ダンプは下を実行後です)
FFF049AE 39 36 30 30 20 45 20 38 : 20 31 00 20 2C 0D 09 00 9600 E 8 1 ,
FFF049BE 25 73 20 25 73 20 25 73 : 20 25 73 0D 00 20 2E 2C %s %s %s %s .,
str[strlen(str)]=' ';
str=strtok(str," ,\r\t");
本来ならば39 36 30 30 00 45 であると思うのですが
昨今のエラー発生で
_s1ptr=NULL; // Remove the comment when you use strtok()
(E) E0562310 E0562310:Undefined external symbol "__s1ptr" referenced in "DefaultBuild\resetprg.obj" gen.mtpj
_s1ptr=NULL;をコメントアウトにしていることが関係しているのでしょうか?
教えていただけないでしょうか、よろしくお願いします。
Parents
  • であろうと思います、が区切り\0が出力されません(下記ダンプは下を実行後です)
    FFF049AE 39 36 30 30 20 45 20 38 : 20 31 00 20 2C 0D 09 00 9600 E 8 1 , 
    FFF049BE 25 73 20 25 73 20 25 73 : 20 25 73 0D 00 20 2E 2C %s %s %s %s .,
    str[strlen(str)]=' ';
    str=strtok(str," ,\r\t");
    本来ならば39 36 30 30 00 45 であると思うのですが
    

    メモリをダンプされる箇所が全然違ってると思います。"9600 E 8 1~" とかってのはシリアル通信のパラメータかなんかでは? 

Reply
  • であろうと思います、が区切り\0が出力されません(下記ダンプは下を実行後です)
    FFF049AE 39 36 30 30 20 45 20 38 : 20 31 00 20 2C 0D 09 00 9600 E 8 1 , 
    FFF049BE 25 73 20 25 73 20 25 73 : 20 25 73 0D 00 20 2E 2C %s %s %s %s .,
    str[strlen(str)]=' ';
    str=strtok(str," ,\r\t");
    本来ならば39 36 30 30 00 45 であると思うのですが
    

    メモリをダンプされる箇所が全然違ってると思います。"9600 E 8 1~" とかってのはシリアル通信のパラメータかなんかでは? 

Children
  • ひょっとして以下の画面コピーに書き込んだように全く別のプログラム(=本来動かしたいもの)の話に突然話が飛んでいるのではないでしょうか?更に、このアドレス領域はRXではROM領域だと思います。str=0xFFF049AEであるならば当然str[strlen(str)]=' ';やstrtok(str," ,\r\t");で書き換わることは無いと思います。

    fujita nozomu様wrote: said:
    であろうと思います、が区切り\0が出力されません(下記ダンプは下を実行後です)
    FFF049AE 39 36 30 30 20 45 20 38 : 20 31 00 20 2C 0D 09 00 9600 E 8 1 , 
    FFF049BE 25 73 20 25 73 20 25 73 : 20 25 73 0D 00 20 2E 2C %s %s %s %s .,
    str[strlen(str)]=' ';
    str=strtok(str," ,\r\t");
    本来ならば39 36 30 30 00 45 であると思うのですが
    

    メモリをダンプされる箇所が全然違ってると思います。"9600 E 8 1~" とかってのはシリアル通信のパラメータかなんかでは? [引用終]


    [画面コピー]

  • fujita nozomuさん
    今気が付きました、そうですわ、sci("9600 E 8 1");やってますからROMに割り付けられているんですよ!、ははーとんだ大失敗、RAMに一度コピーしてからでないといけません、!皆様初心者だからかんべんしてくださいねー。
  • NoMaYさん
    お手数おかけしまして、申し訳ございません、前のfujita nozomuさんの質問で間違いに気が付きました、sci2("9800 E 8 1");としていたのでconstでした、strtokは動作はするが、RAMじゃないので変更不可能ですよね、小さな間違いで、大変なご迷惑おかけしました、どうもすみません。
  • strtokのこの問題、わわいさんを始め全て回答してくださった方々に感謝します、完全に解決ですのでよろしくお願いします。
  • 早速修正しまして、正しく動作いたしました、おこられるかもしれませんがソース載せます
    //////////////////////////////////////////////////////////////////////
    //SCI2 9600/19200/31250/38400 E/O/N 7/8 1/2
    ///////////////////////////////////////////////////////////////////////
    //sci2("9600 E 8 1")
    int sci2(char *str)
    {
    int i;
    char buf[32];//---------------------------------------→修正箇所
    if((str==NULL)||(strlen(str)==0)){
    if(!sci2_enable){
    return CMD_Invalid_Value_Parameter;
    }
    printf("%s %s %s %s\r",
    sci2f.param.baudrate,
    sci2f.param.parity,
    sci2f.param.chars,
    sci2f.param.stop);
    return CMD_OK;
    }
    strcpy(buf,str);//---------------------------------------→修正箇所
    str=(char*)&buf;//---------------------------------------→修正箇所
    str[strlen(str)]=' ';
    str=strtok(str," ,\r\t");
    SYSTEM.PRCR.WORD=0xA50B; //プロテクトOFF
    SYSTEM.MSTPCRA.BIT.ACSE=0;
    MSTP(SCI2)=0;//これここでないとダメ
    SYSTEM.PRCR.WORD=0xA500; //プロテクトON
    SCI2.SCR.BYTE=0;
    PORT5.PMR.BIT.B0=0; //P50初期化 B0WIを設定するため0
    PORT5.PMR.BIT.B2=0; //P52初期化 B0WIを設定するため0
    MPC.PWPR.BIT.B0WI=0; //PFSWEビットへの書き込みを許可
    MPC.PWPR.BIT.PFSWE=1; //PFSレジスタへの書き込みを許可
    MPC.P50PFS.BYTE=0x0A; //P50 TXD2
    MPC.P52PFS.BYTE=0x0A; //P52 RXD2
    MPC.PWPR.BIT.PFSWE=0; //PFSWEビットへの書き込みを禁止
    MPC.PWPR.BIT.B0WI=1; //PFSレジスタへの書き込みを禁止
    PORT5.PDR.BIT.B0=1; //TXD2->W
    PORT5.PDR.BIT.B2=0; //RXD2->R
    PORT5.PMR.BIT.B0=1; //TXD2->peripheral.
    PORT5.PMR.BIT.B2=1; //RXD2->peripheral.
    //シリアルコミュニケーションとして使用
    SCI2.SCMR.BIT.SMIF=0;
    //全停止
    (void)SCI2.SSR.BYTE;
    SCI2.SSR.BYTE=0;
    SCI2.SMR.BYTE=0;
    memset((char*)&sci2f.param,0,sizeof(SCI_PARAM));
    //ボーレート
    SCI2.BRR=48000000/((64/2)*atoi(str))-1;
    strcpy(sci2f.param.baudrate,str);
    for(i=0; i>4992; i++){
    nop();
    }
    //パリティ
    str=strtok(NULL," ,\r\t");
    if(str==NULL) return CMD_Invalid_Value_Parameter;
    switch(str[0]){
    case 'E':
    SCI2.SMR.BIT.PE=1;
    SCI2.SMR.BIT.PM=0;
    break;
    case 'O':
    SCI2.SMR.BIT.PE=1;
    SCI2.SMR.BIT.PM=1;
    break;
    case 'N':
    SCI2.SMR.BIT.PE=0;
    break;
    default: return CMD_Invalid_Value_Parameter;
    }
    sci2f.param.parity[0]=str[0];
    sci2f.param.parity[1]=0;
    //文字ビット幅
    str=strtok(NULL," .,\r\t");
    if(str==NULL)return CMD_Invalid_Value_Parameter;
    switch(str[0]){
    case '7': SCI2.SMR.BIT.CHR=1; break;
    case '8': SCI2.SMR.BIT.CHR=0; break;
    default: return CMD_Invalid_Value_Parameter;
    }
    sci2f.param.chars[0]=str[0];
    sci2f.param.chars[1]=0;
    //ストップビット
    str=strtok(NULL," .,\r\t");
    if(str==NULL) return CMD_Invalid_Value_Parameter;
    switch(str[0]){
    case '1': SCI2.SMR.BIT.STOP=0; break;
    case '2': SCI2.SMR.BIT.STOP=1; break;
    default: return CMD_Invalid_Value_Parameter;
    }
    sci2f.param.stop[0]=str[0];
    sci2f.param.stop[1]=0;

    (void)SCI2.SSR.BYTE;
    SCI2.SSR.BYTE=0;
    //Clear IR bits for TIE and RIE
    IR(SCI2,RXI2)=0;
    IR(SCI2,TXI2)=0;
    IEN(SCI2,RXI2)=1;
    //IEN(SCI2,TXI2)=1;
    IPR(SCI2,TXI2)=5;//プライオリティ
    IPR(SCI2,RXI2)=5;//プライオリティ
    //RXDにはDMAC3を使用する
    dmac3();
    SCI2.SCR.BIT.CKE=1;//クロックイネーブル
    SCI2.SCR.BIT.TEIE=0;//トランスミットエンドインタラプトイネーブル
    SCI2.SCR.BIT.MPIE=0;//マルチプロセッサインタラプトイネーブル
    SCI2.SCR.BIT.RE=1;//レシーブイネーブル
    SCI2.SCR.BIT.TE=1;//トランスミットイネーブル
    SCI2.SCR.BIT.RIE=1;//レシーブインタラプトイネーブル
    SCI2.SCR.BIT.TIE=0;//トランスミットインタラプトイネーブル
    sci2_enable=TRUE;
    return CMD_OK;
    }
    //////////////////////////////////////////////////////////////////////
    //SCI2 9600/19200/31250/38400 E/O/N 7/8 1/2
    ///////////////////////////////////////////////////////////////////////