ошибка C2109: индекс требует типа массива или указателя - PullRequest
2 голосов
/ 11 декабря 2010
#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; Я просто пытаюсь построить список смежности из текстового файла. Я не понимаю, что я делаю не так. Спасибо.

РЕДАКТИРОВАТЬ: Поскольку люди спрашивают об этом, это мой файл графика. Первая строка - количество вершин и количество ребер (бесполезно imo) Следующие строки - мои края, я использую первую строку для выделения памяти для графа 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

Ответы [ 3 ]

2 голосов
/ 11 декабря 2010

int *matrice; означает, что matrice является указателем на int (или int), поэтому matrice[a] даст вам int.Указатель не имеет никакой информации о размерах массива, поэтому вы не можете сделать двумерный доступ.

Вы хотите сохранить измерения вашего массива, а затем выполнить

matrice[nbr1 * numberOfColumns + nbr2] = 1;

Примечания:

  • Доступ к необработанному массиву через указатели может быть ОЧЕНЬ опасным, если вы не будете осторожны с проверкой границ.Рассмотрим std :: vector <>.
  • Возможно, вы имели в виду new int[nbr1 * nbr2]?
1 голос
/ 11 декабря 2010

matrice[x] - это то же самое, что и *(matrice+x), а matrice[x][y] - это то же самое, что и *(*(matrice+x)+y).

Так что проблема в том, что когда вы пишете matrice[nbr1][nbr2], это то же самое, что инаписание *(*(matrice+nbr1)+nbr2).Поскольку matrice является только указателем, а не указателем на указатель, это, конечно, не работает.

1 голос
/ 11 декабря 2010

matrice объявлен как int *, что делает его массивом знаковых размеров.К нему нельзя получить доступ как многомерный массив matrice[nbr1][nbr2].Также проверьте код выделения памяти.Это должно быть new int[nbr1 * nbr2], а не new int(nbr1 * nbr2).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...