| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
brujilla
Registrado: 11 Oct 2005 Mensajes: 14 Ubicación: Palma de Mallorca
| Publicado: 31/10/2005 2:50 am | | | Título: Problema con listas!!!!!!! Ayuda por favor!!! |
| Buenas a todos!!!! Antes que nada, gracias a quien mire esto o se interese por ello. Tengo un problemilla con un prograna que estoy realizando. Trabajo con el Visual Studio.NET en modo consola. Consiste en crear una lista que tenga un nodo con dos campos iguales que apunten unoo al principio de la lista y otro al último. Mi problema está al ejecutar, ya que compila como yo necesito. Por favor, si alguien puede mirarmelo se lo agradecería enormemente. Me da error de evaluación de expresión, dice que la variable está siendo definida mientras se usa. El código al que me refiero es el siguietne:
struct tipus_node { char element; tipus_node *seg; }; struct tipus_llista { tipus_node *primer; tipus_node *darrer; } ;
void crear_llista(tipus_llista *L);
void main() { tipus_llista *ref_llista; tipus_node *p; char x; x='a'; int opcion=0; do//Realizamos menú principal hasta que la opción sea Salir { clrscr(); gotoxy(20, ; printf("MENU PRINCIPAL\n"); gotoxy(20,10); printf("1. Crear lista\n"); gotoxy(20,12); printf("2. Salir\n"); opcion=getch(); switch(opcion) { case'1'://Crear la lista clrscr(); crear_llista(ref_llista); break; case'2'://Salida del programa clrscr(); sleep(1); break;
} void crear_llista(tipus_llista *L) { L->primer=NULL; L->darrer=NULL; }
Ultima edición por brujilla el 02/11/2005 5:53 am; editado 2 veces |
| | Volver arriba | |  | fralex
Registrado: 11 Jul 2005 Mensajes: 112
| Publicado: 31/10/2005 7:19 am | | | Título: re |
| hola.
Publicaste tu código completo? porque no lo parece, sería bueno que lo hicieras, de todos modos que es lo que hace la función crear lista, lo pregunto por que en realidad no estás creando ningun nodo (no estás alocando memoria).
El error que teda es de linker? osea al intentar correr el programa?
bueno publica el código completo y se un poco ma´s especifico con tu duda quizas así se te pueda ayudar !  _________________ Que viva el che,el lenguaje c y la banda ancha... |
| | Volver arriba | |  | brujilla
Registrado: 11 Oct 2005 Mensajes: 14 Ubicación: Palma de Mallorca
| Publicado: 31/10/2005 7:59 am | | | Título: |
| Buenas!! No puse el codigo completo porque pensé que confundiría. Lo que realmente me ocurre es que me da un error de este tipo "Run-Time Check Failure #3 - The variable 'ref_llista' is being used without being defined." refiriéndose a la función crear lista. Ésta función realmente lo que hace es inicializar a NULL las variables para tener el prinicpio y fin de la lista. El código completo es el siguiente:
// examen8.cpp: define el punto de entrada de la aplicación de consola. // #include "stdafx.h" #include "iostream" #include "stdio.h" #include "conio.h" #include "windows.h" #include "dos.h" using namespace std;
void clrscr()//Función limpiar pantalla { system ("cls"); } void gotoxy(int x, int y)//Función para situar gráficamente { HANDLE hConsole = GetStdHandle (STD_OUTPUT_HANDLE); if (INVALID_HANDLE_VALUE !=hConsole) { COORD pos= {x,y}; SetConsoleCursorPosition(hConsole, pos); } } void sleep (int ms)//Funcion para parar el programa { Sleep(ms*1000); } struct tipus_node { char element; tipus_node *seg; }; struct tipus_llista { tipus_node *primer; tipus_node *darrer; } ;
void crear_llista(tipus_llista *L); void insereix(tipus_llista *&L, char x, tipus_node *&p); void suprimeix(tipus_llista *&L, tipus_node *&p);
void main() { tipus_llista *ref_llista; tipus_node *p; char x; x='a'; int opcion=0; do//Realizamos menú principal hasta que la opción sea Salir { clrscr(); gotoxy(20, ; printf("MENU PRINCIPAL\n"); gotoxy(20,10); printf("1. Crear lista\n"); gotoxy(20,12); printf("2. Insertar un nodo\n"); gotoxy(20,14); printf("3. Eliminar un nodo\n"); gotoxy(20,16); printf("4. Salir\n");
opcion=getch(); switch(opcion) { case'1'://Crear la lista clrscr(); crear_llista(ref_llista); break; case'2'://Insertar un nodo clrscr(); p=ref_llista->primer; insereix(ref_llista, x, p);//Función que inserta un nodo break; case'3'://Elimina un nodo clrscr(); p=ref_llista->primer; suprimeix(ref_llista, p); break; case'4'://Salida del programa clrscr(); sleep(1); break; default: clrscr(); gotoxy(20, ; printf("La tecla es erronea. Por favor introduce una elección del menu"); } }while (opcion!='4'); } void crear_llista(tipus_llista *L) { L->primer=NULL; L->darrer=NULL; }
void insereix(tipus_llista *&L, char x, tipus_node *&p) { tipus_node *q; q=p->seg; p->seg=new(tipus_node); p->seg->element=x; p->seg->seg=q; if(p==L->darrer) { L->darrer=p; } if(p==L->primer) { L->primer=p; } } void suprimeix(tipus_llista *&L, tipus_node *&p) { tipus_node *q; if(p==NULL) { printf("Error"); } else { q=p->seg; p->seg=p->seg->seg; free(q); if(p==L->darrer) { L->darrer=q; } if(p==L->primer) { L->primer=q; } } }
Muchas gracias nuevamente y un saludo |
| | Volver arriba | |  | | fralex
Registrado: 11 Jul 2005 Mensajes: 112
| Publicado: 31/10/2005 10:21 am | | | Título: re |
| En realidad no estoy muy seguro de que sea porque viendolo asi por ensimita me doy cuenta que si la declaras, pero no puedo estar seguro del error porque hay un par de librerias que no uso ("windows.h" y "stdafx.h" que supongo es hecha por ti). Prueba colocando el operador '&' cuando envies como parametro al puntero *ref_llista, quizas sea eso.
suerte... _________________ Que viva el che,el lenguaje c y la banda ancha... |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 5853 Ubicación: Mexico
| Publicado: 31/10/2005 2:42 pm | | | Título: |
| | Código: | #include "stdafx.h" #include "iostream" #include "stdio.h" #include "conio.h" #include "windows.h" #include "dos.h" |
Sin comentarios. No, no vale la pena ...
| Código: | void main() { tipus_llista *ref_llista; |
OK. Declaras la variable ref_llista, hay que tener cuidado con este puntero ya que todavia no apunta a una direccion valida de memoria.
| Código: | case'1'://Crear la lista clrscr(); crear_llista(ref_llista); break; |
OK. Lo primero es crear la lista, a esta funcion le pasas el valor de ref_llista, ¿Cual es este valor?
| Código: | void crear_llista(tipus_llista *L) { L->primer=NULL; L->darrer=NULL; } |
Y dentro de esta funcion se accede al valor de la variable ref_llista mediante el argumento L, este es el problema ya que el valor de ref_llista no esta definido.
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | brujilla
Registrado: 11 Oct 2005 Mensajes: 14 Ubicación: Palma de Mallorca
| Publicado: 01/11/2005 10:09 am | | | Título: |
| Muchísmimas gracias a todos, pero todavía no consigo que me funcione. Otro ejemplo en otro programa de lo que me pasa es el sigueinte:
/ Examen4.cpp: define el punto de entrada de la aplicación de consola. // #include "stdafx.h" #include "iostream" #include "stdio.h" #include "conio.h" #include "windows.h" #include "dos.h" using namespace std;
void clrscr()//Función limpiar pantalla { system ("cls"); } void gotoxy(int x, int y)//Función para situar gráficamente { HANDLE hConsole = GetStdHandle (STD_OUTPUT_HANDLE); if (INVALID_HANDLE_VALUE !=hConsole) { COORD pos= {x,y}; SetConsoleCursorPosition(hConsole, pos); } } void sleep (int ms)//Funcion para parar el programa { Sleep(ms*1000); }
struct L_llista { char info;//Info del nodo. L_llista *seg;//Apunta a siguiente nodo. };
void purga(L_llista *&cap); void insertar_cap(L_llista *&cap); void listar(L_llista *&cap); void suprimeix(L_llista *&cap, L_llista *&p); void encontrar_x(L_llista *&cap); void main() { int opcion=0; L_llista *cap; cap=NULL;
do//Realizamos menú principal hasta que la opción sea Salir { clrscr(); gotoxy(20, ; printf("MENU PRINCIPAL\n"); gotoxy(20,10); printf("1. Dar de alta un nodo por CAP\n"); gotoxy(20,12); printf("2. Listar todos los nodos\n"); gotoxy(20,14); printf("3. Ejercicio 4\n"); gotoxy(20,16); printf("4. Ejercicio 6\n"); gotoxy(20,1 ; printf("5. Salir\n");
opcion=getch(); switch(opcion) { case'1': clrscr(); insertar_cap(cap);//Función que inserta por cap break; case'2': clrscr(); listar(cap);//Función que lista todos los nodos break; case'3': clrscr(); purga(cap);//Función que purga los elementos con info repetido break; case'4': clrscr(); encontrar_x(cap);//Función que encuentra x y lo borra break; case'5'://Salida del programa clrscr(); sleep(1); break; } }while (opcion!='5'); } void insertar_cap(L_llista *&cap)//Función que inserta por cap { L_llista *nou; nou=new(L_llista);//Creamos nodo nou
nou->seg=cap;//Que nou apunte donde apunta cap cap=nou;//Que cap apunte a nou
gotoxy(20,10);//A partir de ahora introducimos los datos del vendedor printf("Dime el info del nodo: "); cin>>nou->info; fflush(stdin);//borramos memoria de entrada } void listar(L_llista *&cap) { L_llista *aux; aux=cap; while (aux!=NULL)//Vamos recorriendo la lista y enseñando los nodos { printf("%c\n", aux->info); aux=aux->seg; } sleep(3); } void purga(L_llista *&cap) { L_llista *p; L_llista *q; char cadena;
p=cap; while(p!=NULL) { q=p->seg; cadena=p->info; while(q!=NULL) {
if(q->info==cadena) { suprimeix(cap, p); } else { q=q->seg; } p=p->seg; }
} }
void suprimeix(L_llista *&cap, L_llista *&p) { L_llista *q;
if(p==NULL) { printf("Error"); } else { q=p->seg; p->seg=p->seg->seg; free(q); } } void encontrar_x(L_llista *&cap) { L_llista *aux; L_llista *aux2; aux=cap; if (cap==NULL) { printf("No hay ningún nodo"); } else { if(cap->info=='x') { suprimeix(cap, aux); } aux=aux->seg; aux2=cap; while(aux!=NULL) { if(aux->info=='x') { suprimeix(cap, aux); } else { aux=aux->seg; aux2=aux2->seg; } } } } Me da porblemas en void suprimeix, en la línea p->seg=p->seg->seg;. El error que me dice es de ""Excepción no controlada en 0x004184ed en Examen4.exe: 0xC0000005: Infracción de acceso al leer la ubicación 0x00000004."" y me dirige el problema a esa frase. Alguien sabría decirme cual es el problema? Siempre me pasa lo mismo, y cuando veo las variables, me pone "Error30CXX0000: no se puede evaluar la expresión". Estoy ya casi deseperada. Si alguien me lo sabría solucionar se lo agradecería-
Un Abrazo a todos los ineresados!!!!!! |
| | Volver arriba | |  | | brujilla
Registrado: 11 Oct 2005 Mensajes: 14 Ubicación: Palma de Mallorca
| Publicado: 11/11/2005 7:11 am | | | Título: |
| Buenas!!! Muchas gracias a todos por vuestra ayuda. Al final me di cuenta que el problema que tenía era que perdía un puntero.
Gracias por todo a los interesados!!!!!!!
Salu2 |
| | Volver arriba | |  | Floweer
Registrado: 26 Dic 2010 Mensajes: 1 Ubicación: Gdl, Jalisco, Mexico
| Publicado: 26/12/2010 12:39 pm | | | Título: Error30CXX0000: no se puede evaluar la expresión |
| Hooola tengo el mismo error creo pero no logro encontrarlo... Publica como lo encontraste o mas o menos un ejemplo de donde estaba porq este error me esta volviendo loca... GRacias de antemano _________________ Gracias a todos los colaboradores  |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 5853 Ubicación: Mexico
| Publicado: 27/12/2010 3:34 pm | | | Título: |
| Hola Floweer
Bienvenido a los foros. Por favor lee sus reglas.
Si tienes un problema con tu programa lo mejor es publicar el codigo fuente completo e indicar la parte en que tienes dificultades.
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |