Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   D. P. Mitchell & J. A. Reeds - ayuda para portar este SRC a delphi (https://www.clubdelphi.com/foros/showthread.php?t=82073)

mastersolid 23-01-2013 21:17:12

D. P. Mitchell & J. A. Reeds - ayuda para portar este SRC a delphi
 
buenos dias, espero que alguien me ayude a portar de lenguaje c a delphi este pequeño código. llego a portar una parte pero me esta dando lucha rng_feed = rng_vec+LEN-TAP; no logro hacer funcionar.

lo declare rng_vec: array [1..LEN] of Integer; en delphi, no se si estoy desclarando bien.
gracias

Cita:

#define LEN 607
#define TAP 273
#define MASK 0x7fffffffL
#define A 48271
#define M 2147483647
#define Q 44488
#define R 3399

unsigned int rng_vec[LEN];
unsigned int * rng_tap = rng_vec;
unsigned int * rng_feed = 0;

unsigned int isrand(unsigned int _seed)
{
unsigned int result;
unsigned int seed;
unsigned int lo, hi, x;
signed int i;

seed=(long)_seed;
rng_tap = rng_vec;
rng_feed = rng_vec+LEN-TAP;
seed = seed%M;
if(seed < 0)
seed += M;
if(seed == 0)
seed = 89482311;
x = seed;
/*
* Initialize by x[n+1] = 48271 * x[n] mod (2**31 - 1)
*/
for(i = -20; i < LEN; i++) {
hi = (long) ( x / Q );
lo = (long) ( x % Q );
x = (long) ( A*lo - R*hi );
if(x < 0)
x += M;
if(i >= 0)
rng_vec[i] = x;
}
}


unsigned int lrand()
{
int x,v0;
unsigned int result;

rng_tap--;
if(rng_tap < rng_vec) {
if(rng_feed == 0) {
isrand(1);
rng_tap--;
}
rng_tap += LEN;
}

rng_feed--;
if(rng_feed < rng_vec)
rng_feed += LEN;

x = (unsigned long) (*rng_feed + *rng_tap) & MASK;
*rng_feed = x;

return x;
}

Casimiro Notevi 24-01-2013 12:50:35

¿Y el título ese?

ecfisa 24-01-2013 15:18:13

Hola mastersolid.

Cita:

espero que alguien me ayude a portar de lenguaje c a delphi este pequeño código.llego a portar una parte.
Así, a primera vista, la función isrand tiene indefinido el valor de retorno.

Cita:

lo declare rng_vec: array [1..LEN] of Integer; en delphi, no se si estoy desclarando bien
Yo lo declararía:
Código Delphi [-]
 rng_vec : array [0..LEN] of Cardinal;

Cita:

pero me esta dando lucha rng_feed = rng_vec+LEN-TAP; no logro hacer funcionar.
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.

cmm07 24-01-2013 17:05:05

Otra solución podría ser crear desde c un dll y llamarla desde delphi

mastersolid 24-01-2013 22:11:36

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 (Mensaje 453967)
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 (Mensaje 453970)
Otra solución podría ser crear desde c un dll y llamarla desde delphi


ecfisa 24-01-2013 22:38:14

Hola mastersolid.

Ignoro los valores de prueba que utilizaste, pero fijate si de este modo te sigue dando diferencias:
Código Delphi [-]
...
const
  LEN  = 607;
  TAP  = 273;
  MASK = $7FFFFFFF;
  A    = 48271;
  M    = 2147483647;
  Q    = 44488;
  R    = 3399;

var
  rng_vec : array [0..LEN] of Cardinal;
  rng_tap : ^Cardinal = @rng_vec;
  rng_feed: ^Cardinal;



function isrand(_seed:Integer):Cardinal;
var
  seed,lo,hi,x: Cardinal;
  i: Integer;
begin
  seed     := _seed;
  rng_tap  := @rng_vec;
  rng_feed := @rng_vec[LEN - TAP];
  seed     := seed mod M;
  if seed < 0 then Inc(seed,M);
  if seed = 0 then seed := 89482311;
  x := seed;
  i := -20;
  while i < LEN do
  begin
    hi :=  x div Q;
    lo :=  x mod Q;
    x  :=  A*lo - R*hi;
    if x < 0 then Inc(x, M);
    if i >= 0 then rng_vec[i] := x;
    Inc(i);
  end;
  Result:= x; // ???? (sin return en la función C)
end;
...

Saludos

ozpaladin 16-12-2013 23:21:31

Pregunta
 
Compañero mastersolid serias tan amable de colaborarme el codigo completo de la calculadora he seguido tu post de hace
rato y por mas que he buscado no encuentro el codigo completo agradecería mucho que me ayudaras con eso saludos!


La franja horaria es GMT +2. Ahora son las 06:50:12.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi