C/Visual C - Error en c...

 
Vista:

Error en c...

Publicado por Brujilla (2 intervenciones) el 31/10/2005 14:49:06
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;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Error en c...

Publicado por fernando.gomez (1603 intervenciones) el 31/10/2005 22:35:25
Me cuesta muuuuuuuuuuuuuucho trabajo creerte eso de que el código anterior compila en VSNET. Como sabrás, funciones como clrscr y gotoxy NO SON ESTANDARES, y VSNET no las incluye. Pero para estar seguro, revisé en la documentación del MSDN y éstas no aparecen ahí. Por ello, dudo mucho que el código anterior te compile en VSNET.

En fin, pasando a lo importante. En el main, creas un objeto llamado ref_llista de tipo tipus_llista*. Pero nunca lo inicializas, por lo que cuando haces la llamada:

crear_llista(ref_llista);

pues le estas pasando basura a la función, y ahí se genera un comportamiento indefinido, que en el caso de VSNET si no mal recuerdo, te lanza una excepción. Entonces o bien creas la estructura de forma normal, es decir, no creas el puntero:

struct tipus_llista ref_llista;

o bien la inicializas antes con malloc:

struct tipus_llista* ref_llista;
ref_llista = malloc(sizeof(struct tupus_llista));
//... haces lo que tengas que hacer, y al final del programa:
free(ref_llista);

Por cierto, nota que cuando declaras un objeto en C, tienes que precederlo con "struct", como en "strcut ref_llista". Lo anterior te compila porque VSNET por default es un compilador de C++, y en C++ sí está permitido que omitas el "struct" o el "class". Pero en C esto es incorrecto. De hecho, puedes convertir el compilador de C++ a C sólo con incluir el siguiente switch como parámetro de la línea de comandos del compilador: "/TC". De hecho, si estás aprendiendo C, te sugeriría que así lo hicieses, para que el compilador sea más estricto y puedas percatarte de tus errores y aciertos.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Error en c...

Publicado por brujilla (2 intervenciones) el 01/11/2005 19:06:09
Muchas gracias, pero creeme, si que compila en VSNET. Simplemente le meto las funciones que hay abajo indicadas y rula, ;).

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!!!!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar