UTNianos

Versión completa: Consulta sobre InsertaNodo
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola!! Queria saber si me pueden ayudar con esto, tengo que ordenar una lista de forma creciente, el primer nodo lo crea bien porque lo fui verificando con puntos de break en el programa, el problema es en el segundo nodo, cuando llega a "AntP^.Sgte:= PtrN;" despues del while final. Resulta que el programa me tira run time error SIGSEGV, jamas me habia aparecido. :/ gracias por leer![/code]




procedure InsertaNodo(VAR Lista: TLista; RValor: TInfo); {Ordena de menor a mayor}
var
PtrN: TLista;
Ptr: TLista;
AntP: TLista;
begin
New(PtrN);
PtrN^.Info:= RValor;
if (Lista=NIL) or (RValor.FacTotal<Lista^.Info.FacTotal) {Si lo que se quiere meter es menor al primero o si es el primer nodo a insertar}
then begin
PtrN^.Sgte:=Lista;
Lista:= PtrN;
end
else begin
Ptr:= Lista;
while (Ptr<>NIL) and (RValor.FacTotal>Ptr^.Info.FacTotal) do {Mientras lo que se quiere meter sea mayor al siguiente y no sea el fin de lista}
begin
AntP:= Ptr;
Ptr:= Ptr^.Sgte;
end;
AntP^.Sgte:= PtrN;
PtrN^.Sgte:= Ptr;
end;
end;



[code=plain]
Buenas, te borre los otros 3 threads que eran lo mismo que este.
Saludos.
Perdon, me aparecia un error en la pagina y pense que no se publicaba. Gracias!
Un aporte que tiene que ver mas con este thread en si.

¿Estas usando pascal en linux? (o freepascal) Porque SIGSEV es algo que te tira POSIX y, segun wikipedia, te lo tira por una violacion de segmento. Eso, en castellano significa que estas accediendo a memoria invalida (te pasaste del segmento, por ej, cuando reservas memoria para un array de 10 posiciones y haces arr[11] esa posicion de memoria cae fuera de tu segmento).
Acá te dejo los algoritmos para Insertar nodos con y sin repetición.

INSERTA CON REPETICIÓN:

[attachment=5215]

INSERTA SIN REPETICIÓN:
aclaración: en este caso lo que hace es insertar un nodo vacio y te devuelve un puntero y una booleana donde esta última en tu respectivo programa principal tendrás que evaluarla con un if
para saber si fue o no insertado, usando en casi positivo el puntero que apunta a dicho nodo, que es devuelto por el mismo procedimiento, para cargar los datos en el mismo.

[attachment=5214]
(05-12-2012 11:25)rulo escribió: [ -> ]Un aporte que tiene que ver mas con este thread en si.

¿Estas usando pascal en linux? (o freepascal) Porque SIGSEV es algo que te tira POSIX y, segun wikipedia, te lo tira por una violacion de segmento. Eso, en castellano significa que estas accediendo a memoria invalida (te pasaste del segmento, por ej, cuando reservas memoria para un array de 10 posiciones y haces arr[11] esa posicion de memoria cae fuera de tu segmento).

No, no estoy usando linux y ya habia visto que ese error es por el tema de la memoria reservada, pero pense que no podia ser eso.


(05-12-2012 17:25)ClauQ3 escribió: [ -> ]Acá te dejo los algoritmos para Insertar nodos con y sin repetición.

INSERTA CON REPETICIÓN:



INSERTA SIN REPETICIÓN:
aclaración: en este caso lo que hace es insertar un nodo vacio y te devuelve un puntero y una booleana donde esta última en tu respectivo programa principal tendrás que evaluarla con un if
para saber si fue o no insertado, usando en casi positivo el puntero que apunta a dicho nodo, que es devuelto por el mismo procedimiento, para cargar los datos en el mismo.

El ultimo if del de "con repeticion" no seria lo mismo preguntar si Lista=nil ? Ese es el que estaria usando, pero el error no viene por el lado del algoritmo me parece
(06-12-2012 04:56)Thron1 escribió: [ -> ]El ultimo if del de "con repeticion" no seria lo mismo preguntar si Lista=nil ? Ese es el que estaria usando, pero el error no viene por el lado del algoritmo me parece

La expresión LISTA = B contempla 2 casos por el TRUE:

1) LISTA = NiL
2) LISTA apunta al primer nodo y B también.

Es decir por el TRUE inserto el nodo al principio si la lista está vacia o bien el nodo q quiero insertar es menor o igual al que tengo al principio de la estructura. Por tanto la respuesta es que NO está
bien contemplar solo 1 de los casos ( LISTA = NiL ) porque en realidad son 2 y me estaría perdiendo esa posibilidad.

Si querés clarificar la estrategia te dejo estos 2 videos para que lo analises.







(06-12-2012 05:54)ClauQ3 escribió: [ -> ]
(06-12-2012 04:56)Thron1 escribió: [ -> ]El ultimo if del de "con repeticion" no seria lo mismo preguntar si Lista=nil ? Ese es el que estaria usando, pero el error no viene por el lado del algoritmo me parece

La expresión LISTA = B contempla 2 casos por el TRUE:

1) LISTA = NiL
2) LISTA apunta al primer nodo y B también.

Es decir por el TRUE inserto el nodo al principio si la lista está vacia o bien el nodo q quiero insertar es menor o igual al que tengo al principio de la estructura. Por tanto la respuesta es que NO está
bien contemplar solo 1 de los casos ( LISTA = NiL ) porque en realidad son 2 y me estaría perdiendo esa posibilidad.

Si querés clarificar la estrategia te dejo estos 2 videos para que lo analises.








Los vi, muy interesantes. Lo pude solucionar, en esta parte "while (Ptr<>NIL) and (RValor.FacTotal>=Ptr^.Info.FacTotal) do" tenia que poner >= y habia puesto solo > entonces el AntP no se creaba si se salia del while con el primer nodo. Pude solucionarlo pero el error SIGSEGV ahora me lo tira en una BusquedaBinaria en vector que jamas me lo habia tirado, creo que el compilador tiene algun problema, creo diferentes archivos de datos y con cada uno el error salta en un lugar distinto, los var no tienen nada que ver.
Si te tira un error de segmento es eso, estas violando tu segmento (bueno, chocolate por la noticia no?).
Los punteros son una manera de manejar la memoria. Pero si intentas acceder afuera del espacio de memoria que se te asigno, te va a tirar ese error.
En el caso de AntP que vos mencionas, si no te lo crea, entonces esta en null y no podes acceder a los miembros de algo que es null.

Yo te recomendaria detallar el error antes de asumir que el que se equivoca es el compilador. Fijate si nos podes dar mas detalles de eso. O al menos, proba con otro compilador, si te siguen tirando el mismo error, es mas probable que el error este en tu codigo.
El problema con AntP era justamente ese! Estaba en null. Lo pude solucionar. Ahora el problema es este: tengo un archivo de productos ordenado por codigo de producto y uno de ventas sin orden, la idea es modificar el stock del de productos con el de ventas. Pase el archivo de productos a un vector y cada vez que lee el archivo de ventas, hace una busqueda binaria en el vector de productos para modificar el stock. Ahora el error de segmento me lo tira en la busqueda binaria! Gracias a todos por las respuestas!!
Probablemente estés manejando mal otra vez la estructura y por eso el error. Quizás estás intentando acceder a una posición que no hay, que está por fuera. O sea, si mi array es [1..100] y quizás en algún momento hace un vec[101], ponele
Pasá el código si no lo podés solucionar
URLs de referencia