Discussion:
recomendación de compilador
(demasiado antiguo para responder)
iDeafix
2004-11-09 22:21:55 UTC
Permalink
Hola

Necesito hacer un programilla en C para una práctica de la universidad (que
abandoné hace años y ahora he vuelto).

En aquellos años usaba un compilador de borland en msdos.

El caso es que ahora necesito usar las librerías smpl y no consigo que
reconozca la función "ranf()"

¿Podeis recomendarme algún pequeño compilador de C para w2k?


Me he bajado el borlandc++ 5.2. Pero no consigo que compile un programa del
que parto (creo recordad que "real" estaba definido en la librería smpl):

-----------
float ciclos(struct sprocesador *maquina, int instruccion, int numtoken) {

real p;

float prob_inst_cache = 0.60;
float prob_oper_memoria = 0.70;
float prob_almacenar_mem = 0.65;
iDeafix
2004-11-09 22:31:18 UTC
Permalink
¿por que me da "declaration terminated incorrectly" detrás de "real x"?
(esto está en el fichero "rand.c" proporcionado por el profesor)

real expntl(x)
real x;
{ /* 'expntl'returns a psuedo-random variate from a negative */
/* exponential distribution with mean x. */
return(-x*log(ranf()));
}
J.A. Gutierrez
2004-11-10 08:30:00 UTC
Permalink
iDeafix <***@amena.es> wrote:
: ¿por que me da "declaration terminated incorrectly" detrás de "real x"?
: (esto está en el fichero "rand.c" proporcionado por el profesor)

: real expntl(x)
: real x;
: { /* 'expntl'returns a psuedo-random variate from a negative */
: /* exponential distribution with mean x. */
: return(-x*log(ranf()));
: }

y por que no haces

#define expntl(x) (-(x)*log((float)rand()/RAND_MAX))

que es mas sencillo, y, asi, a ojo, hara lo mismo?
--
PGP and other useless info at \
http://webdiis.unizar.es/~spd/ \
finger://daphne.cps.unizar.es/spd \ Timeo Danaos et dona ferentes
ftp://ivo.cps.unizar.es/pub/ \ (Virgilio)
iDeafix
2004-11-10 09:46:58 UTC
Permalink
Post by J.A. Gutierrez
Post by iDeafix
¿por que me da "declaration terminated incorrectly" detrás de "real
x"? (esto está en el fichero "rand.c" proporcionado por el profesor)
real expntl(x)
real x;
{ /* 'expntl'returns a psuedo-random variate from a negative
*/ /* exponential distribution with mean x. */
return(-x*log(ranf()));
}
y por que no haces
#define expntl(x) (-(x)*log((float)rand()/RAND_MAX))
que es mas sencillo, y, asi, a ojo, hara lo mismo?
Es que es código del "profe", entonces debería funcionarnos sin problemas...
y algo debo tener mal, cuando no va.

Pienso que debo tener alguna opción mal en el compilador. Básicamente es lo
que preguntaba. De C recuerdo lo justito y no me acuerdo de nada de los
distintos C's que había : ansi, etc...
Lepton
2004-11-10 17:13:13 UTC
Permalink
On Wed, 10 Nov 2004, iDeafix wrote:

# J.A. Gutierrez wrote:
# > iDeafix <***@amena.es> wrote:
# >> ¿por que me da "declaration terminated incorrectly" detrás de "real
# >> x"? (esto está en el fichero "rand.c" proporcionado por el profesor)
# >
# >> real expntl(x)
# >> real x;
# >> { /* 'expntl'returns a psuedo-random variate from a negative
# >> */ /* exponential distribution with mean x. */
# >> return(-x*log(ranf()));
# >> }
# >
# > y por que no haces
# >
# > #define expntl(x) (-(x)*log((float)rand()/RAND_MAX))
# >
# > que es mas sencillo, y, asi, a ojo, hara lo mismo?
#
# Es que es código del "profe", entonces debería funcionarnos sin problemas...
# y algo debo tener mal, cuando no va.

El tipo 'real' no existe en C. Puedes usar 'float' o 'double', pero
a menos que definas 'real' en algun sitio (eg.

#define real double

o

typedef double real;

no te funcionara. Pregunta a tu profesor, y si te dice que 'real'
es un tipo valido, pues cambiate de clase :)

Lo mismo para la funcion 'ranf'..

# Pienso que debo tener alguna opción mal en el compilador. Básicamente es lo
# que preguntaba. De C recuerdo lo justito y no me acuerdo de nada de los
# distintos C's que había : ansi, etc...

Para el caso, C solo hay uno, y ni 'real' ni 'ranf' existen en C..

Lepton.
iDeafix
2004-11-10 18:36:50 UTC
Permalink
"real" es que viene definido en smpl.h como typedef double real;

No me preguntes para qué ni porqué pero si recuerdo que la librería smpl
siempre ha tenido "real".

y "ranf" viene en rand.c

los tres ficheros smpl.h smpl.c y rand.c son típicos, para simular
procesadores.

#if CPU==8086
/*-------------- UNIFORM [0,1] RANDOM NUMBER GENERATOR------------------*/
/* */
/* this implementation is for the Intel 8086/8 and 80286/386 CPUs using */
/* C compilers with 16-bit short integers and 32 bit long integers. */
/* */
/*----------------------------------------------------------------------*/
real ranf()
{
short *p,*q,k; long Hi,Lo;
/* generate product using double precision simulation (comments */
/* refer to In's lower 16-bits as "L", its upper 16 bits as "H") */
p=(short *)&In[strm]; Hi=*(p+1)*A; /* 16807*H->Hi */
*(p+1)=0; Lo=In[strm]*A; /* 16807*L->Lo */
p=(short *)&Lo; Hi+=*(p+1); /* add high-order bits of Lo to Hi */
q=(short *)&Hi; /* low order bits of Hi-> LO */
*(p+1)=*q&0X7FFF; /* clear sign bit */
k=*(q+1)<<1; if (*q&0X8000) then k++; /* Hi bits 31-45->k */
/* form Z + K [-M] (where Z=Lo) : presubtract M to avoid overflow */
Lo-=M; Lo+=k; if (Lo<0) then Lo+=M;
In[strm]=Lo;
return((real)Lo*4.656612875E-10); /* Lo x 1/(2**31-1) */
}
#endif




/***************************************************************************
/
/*
*/
/* File "smpl.h" */
/* Includes,defines, & extern declarations for simulation programs
*/
/*
*/
/***************************************************************************
/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

typedef double real;
#define then

extern real Lq(), U(), B(), time();
extern char *fname(), *mname();
extern FILE sendto();

extern real ranf(), uniform(), expntl(), erlang(), hyperx(), normal();
extern long seed();
Lepton
2004-11-10 23:49:09 UTC
Permalink
On Wed, 10 Nov 2004, iDeafix wrote:

# "real" es que viene definido en smpl.h como typedef double real;
#
# No me preguntes para qué ni porqué pero si recuerdo que la librería smpl
# siempre ha tenido "real".
#
# y "ranf" viene en rand.c
#
# los tres ficheros smpl.h smpl.c y rand.c son típicos, para simular
# procesadores.

Coño, pues si escribes un modulo que necesita esa libreria, no te
olvides de #include "smpl.h", y luego linkearlo con smpl.o[bj] y
rand.o[bj].

Aunque esto no tiene nada que ver con C (excepto por el uso del
#include..), leete el manual de tu compilador y arreglado!

Lepton.
Zephryn Xirdal
2004-11-11 14:23:22 UTC
Permalink
Es muy posiblemente que le tengas que decir al compilador que utilice la
antigua sintaxis de K&R, porque el implementar una función con paso de
parámetros como

real expntl(x)
real x;
{
}

es tremendamente obsoleto.

Lo correcto sería

real expntl(real x)
{
}

Teniendo en cuenta, claro está, que la palabra reservada "real" sea visible
pro el compilador como un #define o un typedef.
Post by Lepton
# "real" es que viene definido en smpl.h como typedef double real;
#
# No me preguntes para qué ni porqué pero si recuerdo que la librería smpl
# siempre ha tenido "real".
#
# y "ranf" viene en rand.c
#
# los tres ficheros smpl.h smpl.c y rand.c son típicos, para simular
# procesadores.
Coño, pues si escribes un modulo que necesita esa libreria, no te
olvides de #include "smpl.h", y luego linkearlo con smpl.o[bj] y
rand.o[bj].
Aunque esto no tiene nada que ver con C (excepto por el uso del
#include..), leete el manual de tu compilador y arreglado!
Lepton.
Loading...