Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

rosでstrtolが動かない

解決したいこと

ROSで16進数文字列を2進数(uint8_t)のデータに変換しようとしたところ、"process has died"とエラーが出て終了してしまいました。

解決方法をおしえていただけると幸いです。

発生している問題・エラー

[SendDevice-1] process has died [pid 46350, exit code -11, cmd /home/user/catkin_ws/devel/lib/SendDevice/SendDevice __name:=SendDevice __log:=/home/user/.ros/log/16b6485e-1d25-11ee-9cfb-b3e43a8360f6/SendDevice-1.log].
log file: /home/user/.ros/log/16b6485e-1d25-11ee-9cfb-b3e43a8360f6/SendDevice-1*.log

該当するソースコード

著作権の関係から該当部分のみ掲載します。

uint8_t SendCallback::ExtractData( const std::string RxDataInString, std::vector<uint8_t>& Data )
{

    uint8_t DataLength = stoi( RxDataInString.substr( 4, 1 ) );
    
    for( int i = 0; i < DataLength; i++ )
    {
        try
        {
            std::string message = RxDataInString.substr( 5 + i * 2, 2 ); 
            Data[ i ] = strtol( message.c_str() , NULL, 16 );
        }
        catch(const std::out_of_range& e)
        {
            ROS_INFO( "Not Received Correctly!" );
        }
        catch(const std::invalid_argument& e)
        {
            ROS_INFO( "It's not valid!" );
        }
        
    } 

    return DataLength;

}

自分で試したこと

いろいろと探ってみましたが、strtolの部分が悪さしていることしかわかりませんでした。
またこの関数はros timerで呼び出されており(1000Hz)、呼び出しのレートを小さくしても結果は変わりませんでした。

0

1Answer

strtol そのものはエラーを返す可能性はあるにしても問答無用でプロセスが落ちる原因になるとは思えません。

Data は十分な大きさが確保できていますか?

std::vectoroperator[] はインデクスが範囲外だったときに勝手に伸長することはないですし例外も出しません。 (未定義動作です。)

1Like

Comments

  1. Dataを適当な数値でreserveしたら動きました。ありがとうございました。

  2. reserve はキャパシティを変更します。 サイズを変更する場合は resize を使ってください。

  3. そうなんですか!勘違いしてました。ありがとうございます。

Your answer might help someone💌