Ver Mensaje Individual
  #5  
Antiguo 24-01-2013
mastersolid mastersolid is offline
Registrado
NULL
 
Registrado: ene 2012
Posts: 2
Reputación: 0
mastersolid Va por buen camino
gracias me sirvio he hecho esta parte y la he probado los primeros valores de X me lo a igual en c pero despues me lo va dando diferente. no se que he hecho mal.
gracias ecfisa por tu ayuda.
Código Delphi [-]
const LEN = 607;
const TAP = 273;
const MASK = LongInt($7fffffff);
const A = 48271;
const M = 2147483647;
const Q = 44488;
const R = 3399;


var
rng_vec : array[0..LEN-1] of ulong;
rng_tap:PULONG = @rng_vec;
rng_feed:PULONG = 0;

function isrand(_seed:LongInt):Integer;
var
  lo, hi, x, seed:LongInt;
  i:Integer;
begin
  seed:=LongInt(_seed);
  rng_tap := @rng_vec;
  rng_feed := @rng_vec[LEN - TAP];
  seed := seed mod M;
  if(seed < 0) then
    seed:=  seed + M;
  if(seed = 0) then
    seed := 89482311;
  x := seed;
  i:= -20;
  while i < LEN do
    begin

    hi := LongInt(trunc( x / Q));

     lo := LongInt(x mod Q);
     x := LongInt((A*lo) - (R*hi));

    if(x < 0) then
       x:= x+M;

    if(i >= 0) then
      rng_vec[i]:= x;
         i:=i+1;
   end;
 end;
Cita:
Empezado por ecfisa Ver Mensaje
Hola mastersolid.


Así, a primera vista, la función isrand tiene indefinido el valor de retorno.


Yo lo declararía:
Código Delphi [-]
 rng_vec : array [0..LEN] of Cardinal;


En C un nombre de array sin especificar índice, hace referencia a la posición cero ([0]) del mismo, creo entonces, que el equivalente Delphi podría ser:
Código Delphi [-]
   rng_feed := @rng_vec[LEN - TAP];

Saludos.
gracias por la sugerencia. Ya lo hice en dll, pero quiero pornerlo mas pro. y quiero integrarlo al delphi y no estar en dll. es una meta que me he puesto de portar ese codigo a delphi. asi aprendo mas de ambos lenguaje.

gracias.

Cita:
Empezado por cmm07 Ver Mensaje
Otra solución podría ser crear desde c un dll y llamarla desde delphi

Última edición por ecfisa fecha: 24-01-2013 a las 22:27:35. Razón: etiquetas [delphi]
Responder Con Cita