C++静态队列程序报错:invalid types 'int[int]' for array subscript 问题排查求助
解决
invalid types 'int[int]' for array subscript错误及循环队列代码问题 嘿,我来帮你排查这个错误和代码里的其他问题。首先说你遇到的核心错误:
错误原因:变量名冲突
在你的Cola::queve方法里,参数名datos和类的私有成员数组datos重名了!这就导致编译器把datos[final]里的datos解析成了传入的int类型参数(因为TIPO_DATO定义的是int),而不是你想访问的数组。用一个int变量作为数组下标,自然会报invalid types 'int[int]' for array subscript这个错误。
接下来我们一步步修正代码,顺便解决队列逻辑里的其他问题:
1. 修复变量名冲突
把queve方法的参数名改成和成员数组不冲突的名字,比如nuevoDato:
void Cola::queve(TIPO_DATO nuevoDato){ // 后续用nuevoDato代替原来的datos参数 }
2. 修正队列空/满的判断逻辑
你的循环队列当前的空、满判断逻辑是错的,而且vacia()里return之后的cout语句永远不会执行,这是个低级错误:
修正vacia()方法
循环队列的空判断应该是(final + 1) % TAM == frente(初始化状态也符合这个条件),并且把输出语句放在return之前:
bool Cola::vacia(){ if((final + 1) % TAM == frente){ cout<<"La cola se encuentra vacia"<<endl; system("PAUSE"); menu(); return true; }else{ cout<<"La cola no esta vacia"<<endl; system("PAUSE"); menu(); return false; } }
实现llena()方法
循环队列要留一个空位置来区分空和满,所以满的判断是(final + 2) % TAM == frente:
bool Cola::llena(){ return (final + 2) % TAM == frente; }
3. 修正queve的核心逻辑
你现在的queve里判断“如果队列空就添加元素”,这完全搞反了!应该是队列未满时才能入队,否则提示队列已满:
void Cola::queve(TIPO_DATO nuevoDato){ if(!llena()){ final = (final + 1) % TAM; datos[final] = nuevoDato; cout<<"元素已成功入队"<<endl; }else{ cout<<"No hay espacios en la cola"<<endl; } system("PAUSE"); menu(); }
4. 修复其他未实现/逻辑错误的方法
实现deque()方法
void Cola::deque(){ if(!vacia()){ frente = (frente + 1) % TAM; cout<<"元素已成功出队"<<endl; }else{ cout<<"Error: La cola esta vacia, no se puede desencolar"<<endl; } system("PAUSE"); menu(); }
修正front()方法
空队列时不要直接返回,要处理错误情况:
TIPO_DATO Cola::front(){ if((final + 1) % TAM != frente){ return datos[frente]; } else{ cout<<"Error: La cola esta vacia"<<endl; return -1; // 返回一个默认值,你可以根据需求调整 } }
实现imprimir()方法
void Cola::imprimir(){ if((final + 1) % TAM == frente){ cout<<"La cola esta vacia"<<endl; system("PAUSE"); menu(); return; } cout<<"Elementos de la cola: "; int i = frente; while(i != (final + 1) % TAM){ cout<<datos[i]<<" "; i = (i + 1) % TAM; } cout<<endl; system("PAUSE"); menu(); }
5. 完善菜单逻辑
菜单里的很多case没有实现功能,比如入队需要让用户输入元素,判断队列满需要调用llena():
void menu(){ int opc; int a; cout<<"\t \t ***** MENU PRINCIPAL *****"<<endl; cout<<"Selecciona la opcion deseada"<<endl; cout<<"1. Verificar si la cola esta vacia"<<endl; cout<<"2. Verificar si la cola esta llena"<<endl; cout<<"3. Ver el elemento del frente"<<endl; cout<<"4. Encolar un elemento"<<endl; cout<<"5. Desencolar un elemento"<<endl; cout<<"6. Imprimir todos los elementos"<<endl; cout<<"7. Anular la cola"<<endl; cout<<"8. Salir"<<endl; cin>>opc; cout<<endl; switch(opc){ case 1: cola1.vacia(); break; case 2: if(cola1.llena()){ cout<<"La cola se encuentra llena"<<endl; }else{ cout<<"La cola no esta llena"<<endl; } system("PAUSE"); menu(); break; case 3: { TIPO_DATO valor = cola1.front(); if(valor != -1){ cout<<"El elemento del frente es: "<<valor<<endl; } system("PAUSE"); menu(); break; } case 4: cout<<"Ingrese el valor a encolar: "; cin>>a; cola1.queve(a); break; case 5: cola1.deque(); break; case 6: cola1.imprimir(); break; case 7: cola1.anular(); cout<<"Cola anulada correctamente"<<endl; system("PAUSE"); menu(); break; case 8: exit(0); break; default: cout<<"Opcion invalida, intente nuevamente"<<endl; system("PAUSE"); menu(); break; } }
修正后的完整代码
#include <iostream> #include <stdlib.h> using namespace std; #define TAM 10 #define TIPO_DATO int void menu(); class Cola{ private: TIPO_DATO datos[TAM]; int frente; int final; public: void inicializa(); bool vacia(); bool llena(); TIPO_DATO front(); void queve(TIPO_DATO nuevoDato); void deque(); void imprimir(); void anular(); }; int main(){ menu(); return 0; } Cola cola1; void menu(){ int opc; int a; cout<<"\t \t ***** MENU PRINCIPAL *****"<<endl; cout<<"Selecciona la opcion deseada"<<endl; cout<<"1. Verificar si la cola esta vacia"<<endl; cout<<"2. Verificar si la cola esta llena"<<endl; cout<<"3. Ver el elemento del frente"<<endl; cout<<"4. Encolar un elemento"<<endl; cout<<"5. Desencolar un elemento"<<endl; cout<<"6. Imprimir todos los elementos"<<endl; cout<<"7. Anular la cola"<<endl; cout<<"8. Salir"<<endl; cin>>opc; cout<<endl; switch(opc){ case 1: cola1.vacia(); break; case 2: if(cola1.llena()){ cout<<"La cola se encuentra llena"<<endl; }else{ cout<<"La cola no esta llena"<<endl; } system("PAUSE"); menu(); break; case 3: { TIPO_DATO valor = cola1.front(); if(valor != -1){ cout<<"El elemento del frente es: "<<valor<<endl; } system("PAUSE"); menu(); break; } case 4: cout<<"Ingrese el valor a encolar: "; cin>>a; cola1.queve(a); break; case 5: cola1.deque(); break; case 6: cola1.imprimir(); break; case 7: cola1.anular(); cout<<"Cola anulada correctamente"<<endl; system("PAUSE"); menu(); break; case 8: exit(0); break; default: cout<<"Opcion invalida, intente nuevamente"<<endl; system("PAUSE"); menu(); break; } } //Prototipos de la cola void Cola::inicializa(){ frente = 0; final = TAM-1; } bool Cola::vacia(){ if((final + 1) % TAM == frente){ cout<<"La cola se encuentra vacia"<<endl; system("PAUSE"); menu(); return true; }else{ cout<<"La cola no esta vacia"<<endl; system("PAUSE"); menu(); return false; } } bool Cola::llena(){ return (final + 2) % TAM == frente; } void Cola::queve(TIPO_DATO nuevoDato){ if(!llena()){ final = (final + 1) % TAM; datos[final] = nuevoDato; cout<<"元素已成功入队"<<endl; }else{ cout<<"No hay espacios en la cola"<<endl; } system("PAUSE"); menu(); } void Cola::deque(){ if(!vacia()){ frente = (frente + 1) % TAM; cout<<"元素已成功出队"<<endl; }else{ cout<<"Error: La cola esta vacia, no se puede desencolar"<<endl; } system("PAUSE"); menu(); } TIPO_DATO Cola::front(){ if((final + 1) % TAM != frente){ return datos[frente]; } else{ cout<<"Error: La cola esta vacia"<<endl; return -1; } } void Cola::imprimir(){ if((final + 1) % TAM == frente){ cout<<"La cola esta vacia"<<endl; system("PAUSE"); menu(); return; } cout<<"Elementos de la cola: "; int i = frente; while(i != (final + 1) % TAM){ cout<<datos[i]<<" "; i = (i + 1) % TAM; } cout<<endl; system("PAUSE"); menu(); } void Cola::anular(){ frente = 0; final = TAM-1; }
现在你的代码应该能正常运行,核心错误也解决了。
内容的提问来源于stack exchange,提问作者Luis 24
相关产品推荐
相关产品推荐

