Bueno amigo,
hice la prueba en mi equipo y comiló perfecto... estos problemas me sucedian en Delphi 4 y 5(hace años)...
La explicación que encontré en su momento fue que el compilador intenta trabajar de "forma inteligente", eliminando variables basura, es decir, la que el considera que son inoficiosas por que se declaran, se asignan pero no se usan realmente para nada...
En tu caso no debería ser asi, pues la sentencia:
deberia forzar al compilador a que se tuviera en cuenta... ¿que version de Delphi Utilizas?...
No se si alguien mas tenga una idea sobre esto, tal vez alguna opcion del compilador que haya que ajustar???
intenta algo diferente, para forzar al compilador a que tenga en cuenta tu variable...:
Código Delphi
[-]
function intercalar( var a,b,c:cnumeronatural):integer;
var aux,pos:integer;
begin
pos:=1;
aux:=0;
while pos < = a.numerodigitos do
begin
inc(aux);
if (aux mod 2) = 0 then
begin
c.asignarvalor((c.obtenervalor * 10) + a.digito(pos)));
end else
begin
c.asignarvalor((c.obtenervalor * 10) + b.digito(pos)));
pos:=pos+1;
end;
end;
end;
end;
Por otro lado, para la proxima, recuerda que cada nuevo hilo es una hstoria nueva y debes entregar toda la información posible... me refiero a que no todos saben que tienes una unidad llamada Caja1, que es la base de tus tareas...
Código Delphi
[-]
Unit Caja1;
Interface
Uses
SysUtils,dialogs;
Type
CEMNumeroNatural = Class(Exception);
CNumeroNatural = Class
Private
Valor : Cardinal;
Public
Constructor Crear;
Procedure AsignarValor( NuevoValor : Cardinal);
Procedure InsertarDigito( Posicion : Byte ; Digito : Byte);
Procedure EliminarDigito( Posicion : Byte );
Procedure Invertir;
Function ObtenerValor : Cardinal;
Function NumeroDigitos : Byte;
Function Digito( Posicion : Byte ) : Byte;
Function EsPrimo : Boolean;
Function EsPar : Boolean;
Function SumarDigitos : Byte;
Function DigitosPares : Byte;
Function DigitosImpares : Byte;
End;
Implementation
Constructor CNumeroNatural.Crear;
Begin
inherited create;
Valor := 0;
End;
Procedure CNumeroNatural.AsignarValor( NuevoValor : Cardinal);
Begin
Valor := NuevoValor;
End;
Procedure CNumeroNatural.InsertarDigito ( Posicion : Byte ; Digito : Byte);
Var
Aux , Aux2 , Digi :Cardinal;
Begin
Aux := Valor;
If( Posicion > 0)and( Posicion <= NumeroDigitos )Then
Begin
Aux2 := 0; Digi := 0;
While( Digi <= NumeroDigitos-Posicion )do
Begin
Aux2 := ( Aux2 * 10 ) + Aux Mod 10; Aux := Aux Div 10; Inc( Digi );
End;
Aux := ( Aux * 10 ) + Digito; While( Digi > 0 )do
Begin
Aux := ( Aux * 10 ) + ( Aux2 Mod 10 ); Aux2 := Aux2 Div 10; Dec( Digi );
End;
Valor := Aux;
End
Else
Raise CEMNumeroNatural.Create
('CNumeroNatural.InsertarDigito: Error Fuera de RANGO...');
End;
Procedure CNumeroNatural.EliminarDigito( Posicion : Byte );
Var
Aux , Aux2 , Digi :Cardinal;
Begin
Aux := Valor;
If( Posicion > 0)and( Posicion <= NumeroDigitos )Then
Begin
Aux2 := 0;
Digi := 0;
While( Digi < NumeroDigitos-Posicion )do
Begin
Aux2 := ( Aux2 * 10 ) + Aux Mod 10;
Aux := Aux Div 10;
Inc( Digi );
End;
Aux := ( Aux Div 10 ); While( Digi > 0 )do
Begin
Aux := ( Aux * 10 ) + ( Aux2 Mod 10 );
Aux2 := Aux2 Div 10;
Dec( Digi );
End;
Valor := Aux;
End
Else
Raise CEMNumeroNatural.Create
('CNumeroNatural.EliminarDigito: Error Fuera de RANGO...');
End;
Procedure CNumeroNatural.Invertir;
Var
Aux , Aux2 , i :Cardinal;
Begin
Aux2 := Valor;
Aux := 0;
i := 0;
While( i < NumeroDigitos )do
Begin
Aux := ( Aux * 10 ) + Aux2 Mod 10;
Aux2 := Aux2 Div 10;
Inc( i );
End;
Valor := Aux;
End;
Function CNumeroNatural.ObtenerValor : Cardinal;
Begin
Result := Valor;
End;
Function CNumeroNatural.NumeroDigitos : Byte;
Var
Aux : Cardinal;
Cant : Byte;
Begin
Aux := Valor;
Cant := 0;
Repeat
Aux := Aux Div 10;
Inc( Cant );
Until(Aux = 0);
Result := Cant;
End;
Function CNumeroNatural.Digito( Posicion : Byte ) : Byte;
Var
Aux : Cardinal;
Digi , Digito : Byte;
Begin
Aux := Valor;
Digi := 0;
if( Posicion > 0 )and( Posicion <= NumeroDigitos )then
Begin
Repeat
Digito := Aux Mod 10;
Aux := Aux Div 10;
Inc( Digi );
Until( Digi > NumeroDigitos-Posicion );
Result := Digito;
End
Else
Raise CEMNumeroNatural.Create
('CNumeroNatural.Digito: Error Fuera de RANGO...');
End;
Function CNumeroNatural.EsPrimo : Boolean;
Var
i , n : word;
sw : boolean;
Begin
sw := true;
i := 2;
while(i <= ( Valor div 2 ) ) and ( sw = true ) do
Begin
n := Valor mod i;
if( n = 0 )then
sw := false;
i := i + 1 ;
End;
result := sw;
End;
Function CNumeroNatural.EsPar : Boolean;
Begin
Result := (valor mod 2)= 0 ;
End;
Function CNumeroNatural.SumarDigitos : Byte;
Var
Aux , Suma : Cardinal;
Begin
Aux := Valor;
Suma := 0;
Repeat
Suma := Suma +( Aux Mod 10 );
Aux := Aux Div 10;
Until( Aux = 0 );
Result := Suma;
End;
Function CNumeroNatural.DigitosPares : Byte;
Var
Aux : Cardinal;
Cant , Digito : Byte;
Begin
Aux := Valor;
Cant := 0;
Repeat
Digito := Aux Mod 10;
Aux := Aux Div 10;
If( Digito mod 2 = 0 )Then
Inc( Cant );
Until( Aux = 0 );
Result := Cant;
End;
Function CNumeroNatural.DigitosImpares : Byte;
Begin
Result := NumeroDigitos-DigitosPares;
End;
End.
y aqui la prueba que hice:
Código Delphi
[-]
uses Caja1;
{$R *.dfm}
function intercalar( var a,b,c:cnumeronatural):integer;
var aux,pos:integer;
begin
pos:=1;
aux:=0;
while pos <= a.numerodigitos do
begin
if aux = 0 then
begin
c.asignarvalor((c.obtenervalor * 10) + a.digito(pos));
aux:=1;
end else
begin
c.asignarvalor((c.obtenervalor * 10) + b.digito(pos));
pos:=pos+1;
aux:=0;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c : CNumeroNatural;
begin
Try
a := CNumeroNatural.Crear;
b := CNumeroNatural.Crear;
c := CNumeroNatural.Crear;
a.AsignarValor(StrToInt(Edit1.Text));
b.AsignarValor(StrToInt(Edit2.Text));
intercalar(a,b,c);
Edit3.Text := IntTostr(c.ObtenerValor);
Finally
a.free;
b.free;
c.free;
End;
end;
Un saludo,