0

私はコードをもっている

distance = (double**)malloc(city_count*sizeof(double*));
for(i=0; i<city_count; i++) 
{
distance[i] = (double*)malloc(city_count*sizeof(double));
}

for(i=0; i<city_count; i++)
{
  for(j=0; j<city_count; j++) 
      {
         distance[i][j] = 1; // fscanf(fp, "%d", &tmp); distance[i][j] = tmp; EDITED

  }
}

次に、Visual Studio でデバッグします。問題なく動作します。しかし、実際のクラスターでは、常にゼロで埋められていました。誰でも私を助けることができますか?

ファイルの読み取りではなく、マトリックスへの割り当てに問題があります。

4

1 に答える 1

0

しかし、実際のクラスターでは、常にゼロで埋められていました。

for(i=0; i<city_count; i++)
{
    for(j=0; j<city_count; j++) 
    {
        fscanf(fp, "%d", &tmp);

アップデート

単純化された問題ステートメント (ありがとうございます) では、malloc によって返されたポインター値をチェックして、それらが NULL でないことを確認する必要があります ( city_count が非常に大きくない限り、これは非常に驚くべきことです)。

古い更新

どっ!さっき気付いた。%d は、&tmp の型と一致しない int を読み取ります。次のようにする必要があります。

        fscanf(fp, "%lf", &tmp);

fscanfタイプセーフではないため、このタイプの不一致は通常問題を引き起こします。

事後編集

そして、「%d」を に渡すのと同じ間違いを犯していないことを確認してくださいprintf。;-)

更新終了

city_countではないことを確認してください0

fscanfの戻り値 (および tmp の値) を確認します。このファイルの読み取りは成功していますか? cplusplus.com のドキュメントから

成功すると、この関数は、正常に埋められた引数リストの項目数を返します。このカウントは、一致の失敗、読み取りエラー、またはファイルの終わりに達したために、予想される項目数と一致するか、それより少ない (0 の場合もある) 可能性があります。

読み取りエラーが発生した場合、または読み取り中にファイルの終わりに達した場合は、適切な標識 (feof または ferror) が設定されます。また、データが正常に読み取られる前にいずれかが発生した場合は、EOF が返されます。

于 2012-12-06T07:46:20.247 に答える