0

ここに私の問題があります:関数でmallocする2d charマトリックスがあります。その後、ファイルからマップを取得したいのですが、そこにセグメンテーション違反があり、その理由がわかりません...コードサンプルは次のとおりです。

// struct where I put the map and others informations from the  
typedef struct problem_t
{
    char *nom;
    Coordonnees arrivee, depart;
    int nb_ligne, nb_col;
    char **     
} Problem;

// Function wich malloc the map
int mallocCarte( char *** carte, int nbLigne, int nbCol )
{
    *carte = malloc( nbLigne * sizeof( char* ) );

    if ( *carte == NULL )
    {
        return false;
    }

    int i;
    for ( i = 0; i < nbLigne ; ++i )
    {

        (*carte) [i] = malloc( nbCol * sizeof( char ) );
        if ( (*carte) [i] == NULL )
        {
            return false;
        }
    }

    return true;

} // mallocCarte  ()

// Code sample, I've already got the others informations, now, I'd like to get the map
// On commence par reserver l'espace memoire reserve à la carte.
int res = mallocCarte( &problem->carte, problem->nb_ligne, problem->nb_col );

// Si l'allocation s'est mal passée, on renvoie un message
if ( res == false )
{
    exc.num_Exc = MALLOC_ERROR;
    exc.msg_Err = "Erreur lors de l'allocation mémoire de la carte";
    return exc;
}

printf( "Recuperation de la carte 2 ...%d %d\n", problem->nb_ligne,
        problem->nb_col );
int nbLi = 0;
int nbCol = 0;
while ( fgets( fromFile, 1, file ) != NULL && nbLi < problem->nb_ligne )
{
    if ( fromFile [0] == '\n' )
    {
        nbCol = 0;
        ++nbLi;
        continue;
    }

    if ( nbCol == problem->nb_col )
    {
        printf( "malformed input file!\n" );
        exit( -1 );
    }


    ( problem->carte ) [nbLi] [nbCol++] = fromFile [0];
}

何日も経ちましたが、本当にどうすればいいのかわかりません... 誰かが私を助けてくれたらとても嬉しいです!

ありがとうございます

(ここに情報を取得するソース ファイルがあります。最初に問題名、次に座標、最後にマップ サイズです。ファイルの最後にマップがあります https://dl.dropbox.com/u/56951442/ map.txt )

4

2 に答える 2

1

をインクリメントnbLiするときは、ゼロmainにリセットする必要があります。nbCol列が無限に増加し続け、配列のサイズを超えることを許可しています。

また、C でキャストしないでくださいmalloc

さらに、 &problem->carte を割り当て関数に渡す必要があります...

// Function wich malloc the map
int mallocCarte( char *** carte, int nbLigne, int nbCol )
{
    *carte = malloc( nbLigne * sizeof( char* ) );
...
    (*carte)[i] = malloc( nbCol * sizeof( char ) );
...
}

main()
{
   ...
   int res = mallocCarte( &problem->carte, problem->nb_ligne, problem->nb_col );
   ...
}

入力ファイルの形式が正しくない場合に、列の末尾から外れないようにするために、おそらくテストも追加する必要があります...

   if ( isspace( fromFile [0] ) )
   {
       nbCol = 0;
       ++nbLi;
       continue;
   }

   if( nbCol == problem->nb_col )
   {
       printf( "malformed input file!\n" );
       exit( -1 );
   }

本当に使用するつもりですfgets( fromFile, 1, file )か?? 以下の説明は、 がファイルの最後まで常に空の文字列を返し、常にそれまででfgets()あることを意味します。あなたが使用している必要がありますfromFile[0]'\0'EOFfgets( fromFile, 2, file )

fgets() は、stream から最大で size 未満の 1 文字を読み取り、 s が指すバッファーに格納します。EOF または改行の後、読み取りは停止します。改行が読み取られると、バッファに格納されます。'\0' は、バッファー内の最後の文字の後に格納されます。

于 2013-04-09T17:12:50.873 に答える
-1

problem は構造体 problem_t のオブジェクトです。ポインタではありません。次のような構造体変数にアクセスする必要があります

problem.carte,
problem.nb_ligne
problem.nb_col

私のシステムであなたのコードを試しました。あなたのコードは、指定されたmap.txtでうまく機能しています。char fromFile[2]; を宣言しました。While(fgets(fromFile,2,file) != NULL) {//印刷ファイル}. その印刷ファイルは私にとって適切です。

于 2013-04-09T17:40:44.110 に答える