0

私は、C ベースのネットワーク シミュレータ OPNET を使用しています。私の C ファイルの 1 つ (プロセス モデルと呼ばれます) には、グローバルにアクセス可能なリンク リスト (objective_list と呼ばれます) があります。以下のコードでは、文字列を含む小さなリストで埋めています。これは問題なく動作しているようで、最後に全体のリストを読み返すことができます。

ただし、後で別の C ファイル (プロセス モデル) からこのリストのグローバル リストにアクセスする必要があります。

このグローバル リンク リストにアクセスしようとすると、380 個のアイテム (正しい) が保持されていることがわかりますが、内部リンク リストにアクセスしようとすると、それらは空です。

初日にリストを作成するときのメモリ割り当ての見落としに違いありません。「input = op_prg_list_create()」という行を使用して内部リストを作成し、strdup を使用してリストのコンテンツにメモリを割り当てると、なぜこれが発生するのかわかりません。

私はこれに非常にこだわっているので、何が起こる可能性があるかについての助けや指針をいただければ幸いです.

どうもありがとう。

fgets(line, sizeof(line), obstaclePositions_traj_file);

obstacle_list = op_prg_list_create();

while (line != OPC_NIL) 
{
token = strtok(line, "\t\n"); //Pull the string apart into tokens using the \t
input = op_prg_list_create();

while (token != NULL)
       {
          test_token = strdup(token);

          if (op_prg_list_size(input) == 0)
           op_prg_list_insert(input,test_token,OPC_LISTPOS_HEAD);
          else
           op_prg_list_insert(input,test_token,OPC_LISTPOS_TAIL);
      token = strtok (NULL, "\t\n");
      }     

       if (op_prg_list_size(obstacle_list) == 0)
    op_prg_list_insert(obstacle_list,input,OPC_LISTPOS_HEAD);
   else
    op_prg_list_insert(obstacle_list,input,OPC_LISTPOS_TAIL);

}


//check the list has been populated correctly below (it has)

/*size_ob_list = op_prg_list_size (obstacle_list);
for (k = 0; k <size_ob_list; k++)
{
line_coord_list = (List*)op_prg_list_access (obstacle_list, k);     
count_inner_list = op_prg_list_size (line_coord_list);
for (j=0; j< count_inner_list; j++)
{
    coords = (char*)op_prg_list_access (line_coord_list, j);
    printf("%c", coords);       
}
}*/
4

1 に答える 1

0

while (line != OPC_NIL) {}疑わしいです。

EOFでは、fgets()はnullを返しますが、バッファーを変更しません(最後の成功した呼び出しの内容は引き続きそこにあります)

obstacle_list = op_prg_list_create();

while (fgets(line, sizeof(line), obstaclePositions_traj_file) )
{
    input = op_prg_list_create();

    for( token = strtok(line, "\t\n"); token ; token = strtok (NULL, "\t\n") )
       {
          test_token = strdup(token);

          op_prg_list_insert(input,test_token
            , (op_prg_list_size(input)==0) ? OPC_LISTPOS_HEAD : OPC_LISTPOS_TAIL
            );
    }     

    op_prg_list_insert(obstacle_list,input
     , (op_prg_list_size(obstacle_list) == 0) ? OPC_LISTPOS_HEAD : OPC_LISTPOS_TAIL
     );

}
于 2013-02-16T13:15:50.087 に答える