Programación General > Pascal

 Pregunta Sobre Asignacion De Punteros

(1/1)

Ocean Soul:
Hola de nuevo. Tengo una duda sobre el manejo de punteros de pascal.
En el siguiente codigo:


--- Código: Text --- Type  ptrnodo=^nodo;  nodo=record    info:trotulo;    Hijo,sig:ptrnodo;    end;   TRIE=ptrNodo;  Procedure CrearNodo(var A:PtrNodo; x:trotulo);Begin     New(A); A^.hijo:=nil; A^.sig:=nil; AsignarRotulo(x, A^.info);end;{-------------------------------------------------------------------------------------------}Procedure AgregarClave(var A:Trie; X:trotulo);varI:integer; T,ant:PtrNodo;Begin  I:=1; IF A=nil then New(A);                t:=a^.hijo; { ACA! mi pregunta es: En t que se "pone" la ubicacion de a^.hijo (que puede ser NIL o no) o simplemente un puntero NIL (dado el caso), que no tiene nada que ver con el A?Si sigen leyendo el codigo un poco mas, se van a dar cuenta mejor de lo que pregunto }    While (I<=Length(X)) do  Begin    While (T<>nil) and (IgualRotulo(T^.info, X[I])) do    Begin      Ant:=T;      T:=T^.hijo;      Inc(I);    end;    If T=nil then CrearNodo(T, X[I]) else    Begin      While (T<>nil) and (MenorRotulo(T^.info, X[I])) do      Begin        ant:=T;        T:=T^.sig;      end;      If t=nil then CrearNodo(T, X[I]) else        if Not IgualRotulo(T^.info, x[I]) then        Begin          CrearNodo(Ant^.sig, x[I]);          Ant^.sig^.sig:=T;          T:=ant^.sig;        end;    end;     T:=T^.hijo; Inc(I);  end;        AsignarRotulo(AsignarRotuloNulo, T^.info);end;   Gracias!

Alpha_:

--- Código: Text ---IF A=nil then New(A);                t:=a^.hijo;

Aquí está la diferencia:

-Si A ya existía, entonces no se crea. Por ende, ahora T apuntará al mismo lugar al que apunta el hijo de A.

-Si A no existía, entonces lo creas. Pero los datos dentro de A no están inicializados, incluyendo los punteros que apuntan a los hijos, por ende, al hacer esa asignación, le estás pasando una dirección basura a T, y por ende, apunta a cualquier lado de la memoria.

Saludos.

Navegación

[0] Índice de Mensajes

Ir a la versión completa