Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-01-2013
mastersolid mastersolid is offline
Registrado
NULL
 
Registrado: ene 2012
Posts: 2
Poder: 0
mastersolid Va por buen camino
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;
}
Responder Con Cita
  #2  
Antiguo 24-01-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Y el título ese?
Responder Con Cita
  #3  
Antiguo 24-01-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 24-01-2013
cmm07 cmm07 is offline
Miembro
 
Registrado: nov 2007
Posts: 526
Poder: 17
cmm07 Va por buen camino
Otra solución podría ser crear desde c un dll y llamarla desde delphi
Responder Con Cita
  #5  
Antiguo 24-01-2013
mastersolid mastersolid is offline
Registrado
NULL
 
Registrado: ene 2012
Posts: 2
Poder: 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
  #6  
Antiguo 24-01-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 16-12-2013
ozpaladin ozpaladin is offline
Registrado
NULL
 
Registrado: dic 2013
Posts: 1
Poder: 0
ozpaladin Va por buen camino
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!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Portar rutina Javascript a Delphi Geta Varios 3 27-11-2011 19:09:20
¿Ayuda con sistema de lotería que puedo hacer para sacar este resultado? Master23 Varios 1 22-05-2010 12:09:53
Portar aplicaciones en Delphi PHP 2 a Unix/Mac jlrbotella PHP 6 18-05-2008 08:39:58
Cómo podría portar a GNU/Linux una aplicación hecha en Delphi nancy Garcia Linux 9 18-09-2006 11:37:14
Portar codigo de Delphi a C++ eliash Varios 4 19-12-2005 15:45:29


La franja horaria es GMT +2. Ahora son las 07:41:49.


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
Copyright 1996-2007 Club Delphi