2010-12-11 10 views
2
#include <stdio.h> 
#include <iostream> 

using namespace std; 

    int main(void) 
    { 
bool premiereLignefaite = false; 
//Lire le fichier 
FILE * graphe = fopen("graphe.txt", "r"); 
//Fichier de sortie 
FILE * resultat = fopen("resultat.txt", "w"); 
int nbr1, nbr2; 
int *matrice; //pointeur vers la matrice d'adjacence 

//Ligne lue 
static char ligne[50]; 

while (fgets(ligne, 50, graphe) != NULL) //retourne 0 quand on a end-of-file 
{ 
    //La premiere ligne est différente 
    if (premiereLignefaite == false) { 
     //Initialiser une matrice d'adjacence NxN 
     sscanf(ligne, "%d %d", &nbr1, &nbr2); 
     matrice = new int(nbr1 * nbr1); //Memoire dynamique pour la matrice dadjacence n x n 
     premiereLignefaite = true; 
     continue; 
    } 
    //On construit notre matrice d'adjacence 
    sscanf(ligne, "%d %d", &nbr1, &nbr2); 
    matrice[nbr1][nbr2] = 1; 
} 

int u = 2+2; 


return 0; 
} 

配列やポインタのタイプを必要とします。 MATRICE [NBR1] [NBR2] = 1; 私は、テキストファイルから隣接リストを作成しようとしています。私は何が間違っているのか分かりません。ありがとうございました。エラーC2109:添字は、だから私は、この行のエラーを取得しています

EDIT:人々はそれについて尋ねるので、これは私のグラフファイルです。最初の行は頂点の数と辺の数です(有用ではありません) 次の行は私の端です。最初の行はNxNグラフのためのメモリを割り当て、次の行は隣接行列を埋めます。

9 20 
0 1 
0 2 
1 0 
1 2 
1 3 
1 5 
2 0 
2 1 
2 3 
3 1 
3 2 
3 4 
4 3 
5 1 
5 6 
5 7 
6 5 
6 8 
7 5 
8 6 

答えて

2

int *matrice; MATRICEがint(またはint型)へのポインタであるので、matrice[a]はあなたにint型を与えることを意味します。ポインタには配列の次元に関する情報がないため、2次元のアクセスはできません。あなたが境界を持つように注意いないのであれば、ポインタを経由して

  • 生の配列アクセスは非常に危険なことができます:

    はあなたの配列の次元を保存しませんし、その後

    matrice[nbr1 * numberOfColumns + nbr2] = 1; 
    

    サイドノートをやりたいですチェック。 std :: vector <>を検討してください。

  • おそらくnew int[nbr1 * nbr2]を意味しますか?
+0

* sizeof(int)を追加する必要はありません。なぜならC++は自動的にそれを受け取りますか? – toto

+0

あなたのテクニックを使って私のマトリックスを手に入れました。多次元の動的配列に[] []構文を使用できないのは残念です!私はそれができることを本当に望んでいた。 – toto

+0

それがうまくいって聞いてよかった!あなたの質問に答えるために、newは自動的にsizeof(type)に要素の数を乗じて割り当てます。 Cの 'malloc()'を使用する場合、sizeof()を使用する必要があります。 – EboMike

1

と宣言されており、signle-dimensional配列になっている。int *。多次元配列matrice[nbr1][nbr2]としてアクセスできませんでした。また、メモリ割り当てコードを確認してください。 new int(nbr1 * nbr2)ではなく、new int[nbr1 * nbr2]である必要があります。

1

matrice[x]*(matrice+x)と同じものであり、matrice[x][y]*(*(matrice+x)+y)と同じものです。

したがって、問題は、matrice[nbr1][nbr2]と書くと、*(*(matrice+nbr1)+nbr2)と同じです。 matriceはポインタだけであり、ポインタへのポインタではないので、もちろんこれは動作しません。

+0

展開してくれてありがとう! – toto

関連する問題