数组下标C++无效类型"int[int]"的错误



我对这段代码有一个问题。我不知道为什么这是错的。我不知道怎么修理它。我最近才开始学习c++,所以如果这个问题很愚蠢,我很抱歉。这是一个大学的数学练习,我们有一个老师什么也没解释。

注:Visual Studio Code,编译器MinGW

谢谢~

输入图片描述

#include <iomanip>
#include <conio.h>
#include <stdlib.h>
#include <string>
#include <fstream>
#include <windows.h>
using namespace std;
int **matriceAdiacenta;
int matriceAdiacentaLungime = 0;
int **matriceIncidenta;
int matriceIncidentaLungime = 0,
matriceIncidentaArcs = 0;
int **ListAdiacentaiacenta;
int ListAdiacentaiacentaLungime = 0;
int meniu, tipcitireMeniu;
int **Virfulmatrice;
int virfmatrice=0;
fstream citireadinFisier;
void displayMtrAdiacenta()
{
system("cls");
if (matriceAdiacentaLungime < 1)
cout << "Va rugam sa introduceti o matrice adiacenta" << endl;
else
{
int i, j;
cout << "Matricea de adiacenta:" << endl;
for (i = 1; i <= matriceAdiacentaLungime; i++)
{
for (j = 1; j <= matriceAdiacentaLungime; j++)
cout << matriceAdiacenta[i][j] << " ";
cout << endl;
}
}
cout << endl
<< "Tastati oricare buton pentru revenirea la meniu";
getch();
}
void displayMatriceaIncidenta()
{
system("cls");
if (matriceIncidentaLungime < 1)
cout << "Va rugam sa introduceti o matrice de incidenta" << endl;
else
{
int i, j;
cout << "Matricea de incidenta:" << endl;
for (i = 1; i <= matriceIncidentaArcs; i++)
{
for (j = 1; j <= matriceIncidentaLungime; j++)
cout << matriceIncidenta[i][j] << " ";
cout << endl;
}
}
cout << endl
<< "Tastati oricare buton pentru revenirea la meniu";
getch();
}
void displayListAdiacentaiacenta()
{
system("cls");
if (ListAdiacentaiacentaLungime < 1)
cout << "Va rugam sa introduceti o lista de adiacenta" << endl;
else
{
cout << "Lista de adiacenta:" << endl;
for (i = 0; i < ListAdiacentaiacentaLungime; i++)
{
cout << i + 1 << " - ";
j = 0;
while (ListAdiacentaiacenta[i][j] != 0)
{
cout << ListAdiacentaiacenta[i][j] << " ";
j++;
}
cout << "0" << endl;
}
cout << endl << "Apasa orice pentru a merge la meniul principal";
getch();
}
}
void StergereArc(){
int i,x,y,j,m;
virfmatrice=0;
matriceIncidentaArcs=0;
return;
for (i=0;i<m;i++) {
matriceIncidentaArcs[x][y]=matriceIncidentaArcs[x+1][y+1];
virfmatrice[y][j]=virfmatrice[y+1][j+1];
}
x=x-1;
y=y-1;
i=i-1;
j=j-1;
}
void StergereVirf(){
int i,j,p,n;
matriceIncidentaArcs=0;
for (i=0;i<n;i++) {
for (j=0;j<n;j++){
matriceIncidentaArcs[j][p]=0;
matriceIncidentaArcs[i][p]=0;
matriceIncidentaArcs[p][j]=0;
}
}
}
void insertMatriceAdiacenta(int tip)
{
int i = 0,
j = 0;
if (tip == 1)
{
citireadinFisier.open("matrAd.txt", ios::in);
citireadinFisier >> matriceAdiacentaLungime;
matriceAdiacenta = new int *[matriceAdiacentaLungime + 1];
for (i = 1; i <= matriceAdiacentaLungime; i++)
{
matriceAdiacenta[i] = new int[matriceAdiacentaLungime];
for (j = 1; j <= matriceAdiacentaLungime; j++)
{
citireadinFisier >> matriceAdiacenta[i][j];
}
}
citireadinFisier.close();
displayMtrAdiacenta();
}
else
{
cout<<"Lungimea: ";
cin >> matriceAdiacentaLungime;
matriceAdiacenta = new int *[matriceAdiacentaLungime + 1];
for (i = 1; i <= matriceAdiacentaLungime; i++)
{
matriceAdiacenta[i] = new int[matriceAdiacentaLungime];
for (j = 1; j <= matriceAdiacentaLungime; j++)
{
cin >> matriceAdiacenta[i][j];
}
}
displayMtrAdiacenta();
}
}
void insertMatriceIncidenta(int tip)
{
int i = 0,
j = 0;
if (tip == 1)
{
citireadinFisier.open("matrInc.txt", ios::in);
citireadinFisier >> matriceIncidentaLungime >> matriceIncidentaArcs;
matriceIncidenta = new int *[matriceIncidentaArcs];
for (i = 1; i <= matriceIncidentaArcs; i++)
{
matriceIncidenta[i] = new int[matriceIncidentaLungime];
for (j = 1; j <= matriceIncidentaLungime; j++)
citireadinFisier >> matriceIncidenta[i][j];
}
citireadinFisier.close();
displayMatriceaIncidenta();
}
else
{
cout << endl<< "Apasa orice pentru a merge la meniul principal";
getch();
}
}
void insertListAdiacenta(int tip)
{
int i = 0,
j = 0;
if (tip == 1)
{
citireadinFisier.open("LstInc.txt", ios::in);
citireadinFisier >> ListAdiacentaiacentaLungime;
ListAdiacentaiacenta = new int *[ListAdiacentaiacentaLungime];
while (!citireadinFisier.eof())
{
ListAdiacentaiacenta[i] = new int[ListAdiacentaiacentaLungime];
j = 0;
do
{
citireadinFisier >> ListAdiacentaiacenta[i][j];
j++;
}
while (ListAdiacentaiacenta[i][j - 1] != 0);
i++;
}
citireadinFisier.close();
displayListAdiacentaiacenta();
}
else
{
cout << "Lungimea: ";
cin >> ListAdiacentaiacentaLungime;
ListAdiacentaiacenta = new int *[ListAdiacentaiacentaLungime];
for (i = 0; i < ListAdiacentaiacentaLungime; i++)
{
ListAdiacentaiacenta[i] = new int[ListAdiacentaiacentaLungime];
j = 0;
cout << i << " - ";
do
{
cin >> ListAdiacentaiacenta[i][j];
if (ListAdiacentaiacenta[i][j] <= ListAdiacentaiacentaLungime)
j++;
} while (ListAdiacentaiacenta[i][j] != 0);
}
citireadinFisier.close();
}
}
void matriceAdiacenta_ListAdiacenta()
{
system("cls");
if (matriceAdiacentaLungime == 0)
{
cout << "Va rugam sa introduceti o matrice adiacenta" << endl;
}
else
{
int i, j;
for (i = 1; i <= matriceAdiacentaLungime; i++)
{
cout << i << " - ";
for (j = 1; j <= matriceAdiacentaLungime; j++)
{
if (matriceAdiacenta[i][j] == 1)
{
cout << j << " ";
}
}
cout << "0" << endl;
}
}
cout << endl<< "Apasa orice pentru a merge la meniul principal";
getch();
}
void matriceAdiacenta_MatriceIncident()
{
system("cls");
if (matriceAdiacentaLungime == 0)
{
cout << "Va rugam sa introduceti o matrice adiacenta" << endl;
}
else
{
int arcs = 0, i, j, currArc = 1, **matr;
for (i = 1; i <= matriceAdiacentaLungime; i++)
for (j = 1; j <= matriceAdiacentaLungime; j++)
if (matriceAdiacenta[i][j] == 1)
arcs++;
matr = new int *[arcs];
for (i = 1; i <= arcs; i++)
{
matr[i] = new int[matriceAdiacentaLungime];
for (j = 1; j <= matriceAdiacentaLungime; j++)
matr[i][j] = 0;
}
for (i = 1; i <= matriceAdiacentaLungime; i++)
for (j = 1; j <= matriceAdiacentaLungime; j++)
if (matriceAdiacenta[i][j] == 1)
{
matr[currArc][i] = -1;
matr[currArc][j] = 1;
currArc++;
}
for (i = 1; i <= arcs; i++)
{
for (j = 1; j <= matriceAdiacentaLungime; j++)
cout << matr[i][j] << " ";
cout << endl;
}
}
cout << endl
<< "Apasa orice pentru a merge la meniul principal";
getch();
}
void matriceIncidenta_matriceAdiacenta()
{
system("cls");
if (matriceIncidentaLungime == 0)
{
cout << "Va rugam sa introduceti o matrice de incidenta" << endl;
}
else
{
int **matr, matr_out, matr_in, i, j;
matr = new int *[matriceIncidentaLungime];
for (i = 1; i <= matriceIncidentaLungime; i++)
{
matr[i] = new int[matriceIncidentaLungime];
for (j = 1; j <= matriceIncidentaLungime; j++)
matr[i][j] = 0;
}
for (i = 1; i <= matriceIncidentaArcs; i++)
{
for (j = 1; j <= matriceIncidentaLungime; j++)
if (matriceIncidenta[i][j] == -1)
matr_out = j;
else if (matriceIncidenta[i][j] == 1)
matr_in = j;
matr[matr_out][matr_in] = 1;
}
//afisare
for (i = 1; i <= matriceIncidentaLungime; i++)
{
for (j = 1; j <= matriceIncidentaLungime; j++)
cout << matr[i][j] << " ";
cout << endl;
}
}
cout << endl<< "Apasa orice pentru a merge la meniul principal";
getch();
}
void matriceIncidenta_ListAdiacenta()
{
system("cls");
if (matriceIncidentaLungime == 0)
{
cout << "Va rugam sa introduceti o matrice de incidenta" << endl;
}
else
{
int i, j, k;
for (j = 1; j <= matriceIncidentaLungime; j++)
{
cout << j << " - ";
for (i = 1; i <= matriceIncidentaArcs; i++)
if (matriceIncidenta[i][j] == -1)
for (k = 1; k <= matriceIncidentaLungime; k++)
if (matriceIncidenta[i][k] == 1)
{
cout << k << " ";
break;
}
cout << "0" << endl;
}
}
cout << endl<< "Apasa orice pentru a merge la meniul principal";
getch();
}
void ListAdiacenta_matriceIncidenta()
{
system("cls");
if (ListAdiacentaiacentaLungime == 0)
{
cout << "Va rugam sa introduceti o matrice adiacenta" << endl;
}
else
{
int k = 0, i, j, **matr;
for (i = 0; i < ListAdiacentaiacentaLungime; i++)
{
j = 0;
while (ListAdiacentaiacenta[i][j] != 0)
{
k++;
j++;
};
}
matr = new int *[k];
for (i = 1; i <= k; i++)
{
matr[i] = new int[ListAdiacentaiacentaLungime];
for (j = 1; j <= ListAdiacentaiacentaLungime; j++)
{
matr[i][j] = 0;
}
}
k = 1;
for (i = 0; i < ListAdiacentaiacentaLungime; i++)
{
j = 0;
while (ListAdiacentaiacenta[i][j] != 0)
{
matr[k][i + 1] = -1;
matr[k][ListAdiacentaiacenta[i][j]] = 1;
k++;
j++;
};
}
for (i = 1; i <= k - 1; i++)
{
for (j = 1; j <= ListAdiacentaiacentaLungime; j++)
cout << matr[i][j] << " ";
cout << endl;
}
}
cout << endl<< "Apasa orice pentru a merge la meniul principal";
getch();
}
void ListAdiacenta_matriceAdiacenta()
{
system("cls");
if (ListAdiacentaiacentaLungime == 0)
{
cout << "Va rugam sa introduceti o lista de adiacenta" << endl;
}
else
{
int **matr, i, j;
matr = new int *[ListAdiacentaiacentaLungime];
for (i = 1; i <= ListAdiacentaiacentaLungime; i++)
{
matr[i] = new int[ListAdiacentaiacentaLungime];
for (j = 1; j <= ListAdiacentaiacentaLungime; j++)
matr[i][j] = 0;
}
for (i = 0; i < ListAdiacentaiacentaLungime; i++)
{
j = 0;
while (ListAdiacentaiacenta[i][j] != 0)
{
matr[i + 1][ListAdiacentaiacenta[i][j]] = 1;
j++;
};
}
for (i = 1; i <= ListAdiacentaiacentaLungime; i++)
{
for (j = 1; j <= ListAdiacentaiacentaLungime; j++)
cout << matr[i][j] << " ";
cout << endl;
}
}
cout << endl<< "Apasa orice pentru a merge la meniul principal";
getch();
}
int main()
{
bool stop = false;
while (!stop)
{
cout << "1 - Introduceti un graf" << endl;
cout << "2 - Afisarea grafului" << endl;
cout << "3 - Afisati alt tip prin schimbarea celui existent" << endl;
cout << "4 - Stergere" << endl;
cout << "5 - Iesire" << endl;
cin >> meniu;
if (meniu == 1)
{
system("cls");
cout << "1 - Matrice de adiacenta" << endl;
cout << "2 - Matrice de incidenta" << endl;
cout << "3 - Lista de adiacenta" << endl;
cin >> meniu;
system("cls");
cout << "1 - Din fisier" << endl;
cout << "2 - De la tastatura" << endl;
cin >> tipcitireMeniu;
if (meniu == 1)
insertMatriceAdiacenta(tipcitireMeniu);
else if (meniu == 2)
insertMatriceIncidenta(tipcitireMeniu);
else if (meniu == 3)
insertListAdiacenta(tipcitireMeniu);
system("cls");
}
else if (meniu == 2)
{
system("cls");
cout << "1 - Matrice de adiacenta" << endl;
cout << "2 - Matrice de incidenta" << endl;
cout << "3 - Lista de adiacenta" << endl;
cout << "next ";
cin >> meniu;
if (meniu == 1)
displayMtrAdiacenta();
if (meniu == 2)
displayMatriceaIncidenta();
if (meniu == 3)
displayListAdiacentaiacenta();
system("cls");
}
else if (meniu == 3)
{
system("cls");
cout << "1 - Matrice Adiacenta -> Lista Adiacenta" << endl;
cout << "2 - Matrice Adiacenta -> Matrice Incidenta" << endl;
cout << "3 - Matrice Incidenta -> Matrice Adiacenta" << endl;
cout << "4 - Matrice Incidenta -> Lista Adiacenta" << endl;
cout << "5 - Lista Adiacenta -> Matrice Incidenta" << endl;
cout << "6 - Lista Adiacenta -> Matrice Adiacenta" << endl;
cin >> meniu;
switch (meniu)
{
case 1:
matriceAdiacenta_ListAdiacenta();
break;
case 2:
matriceAdiacenta_MatriceIncident();
break;
case 3:
matriceIncidenta_matriceAdiacenta();
break;
case 4:
matriceIncidenta_ListAdiacenta();
break;
case 5:
ListAdiacenta_matriceIncidenta();
break;
case 6:
ListAdiacenta_matriceAdiacenta();
break;
default:
break;
}
system("cls");
}
else if (meniu == 4)
{
cout << "1 - Stergerea arcului" << endl;
cout << "2 - Stergerea virfului" << endl;
cin >> meniu;
switch (meniu)
{
case 1:
StergereArc();
break;
case 2:
StergereVirf();
break;
default:
break;
}
system("cls");}
else
{
stop = true;
}
}
return 0;
}

你的代码有多个问题,但你问的是这个:

在顶部的声明中,您有:

int matriceIncidentaLungime = 0,
matriceIncidentaArcs = 0;

声明了两个不同的整型数,并将它们初始化为0。使用逗号在一行中声明多个变量是合法的,但是您应该立即停止这样做——这是一种真正的代码气味。相反,您应该这样写:

int matriceIncidentaLungime = 0;
int matriceIncidentaArcs = 0;

但真正的bug,是你使用的是matriceincidentaarc,因为它被声明为一个二维数组,而不是一个普通的int:

matriceIncidentaArcs[x][y]=matriceIncidentaArcs[x+1][y+1];

为此工作,matriceincidentaarc需要是一个2d数组(最好是vector,而不是int[][])。

但这只是你代码中众多问题之一。

你声明的指针和双指针,会在你运行代码的时候引发bug的尖叫。在你知道自己在做什么之前,不要使用指针。相反,开始学习std::vector或std::array

通过这样做,您将能够使用基于范围的for循环,而不是您也误用的原始for循环。

最新更新