Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

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.044
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


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 04:01:13.


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