• Publicidad

Perl a Fortran (punteros)

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Perl a Fortran (punteros)

Notapor alain_fyf » 2010-10-22 10:26 @476

Hola, me llamo Alain y estoy traduciendo un programa de Perl a Fortran, y hay varias cosas que me confunden y he buscado en el foro y en los tutoriales y algunas cosas las he aclarado pero hay otras en las que no encuentro nada.

Esta vez es sobre este trozo de código

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
@refp = (\$fracs);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Tembién he encontrado esto

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @refp = (\$fracs, \$cltime);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Según yo, refp es un array que apunta a fracs. Lo que no entiendo y he buscado por todos sitios es la notación de \$; esta notación la usan para referirse a un puntero, porque dentro del programa que tengo aparece casi siempre $fracs sin '\'.
y otra cosa puede un puntero apuntar a dos variables?

Sé que les parecerá una duda muy simple, y por eso lo pongo en este foro de Perl básico.

Un saludo y gracias.
Última edición por alain_fyf el 2010-10-22 11:10 @507, editado 1 vez en total
alain_fyf
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2010-10-22 09:51 @452

Publicidad

Re: Perl a Fortran (punteros)

Notapor danimera » 2010-10-22 11:03 @502

Hola, bienvenido.

Para mi esta línea lo único que hace es una referencia a otra referencia, podríamos decir
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
@refp = (\$fracs);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


En ese caso mira el uso de las referencias, no sé si se le llame punteros en otros lenguajes a lo que en Perl es referencia.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
                $ra = \$a;  # referencia a escalar
                $rb = \@b;  # referencia a arreglo
                $rc = \%c;  # referencia a hash
                $rx = \$rb; # referencia a referencia
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


En todo caso el '\' solo se usa cuando se quiere hacer referencia a un valor...
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Perl a Fortran (punteros)

Notapor explorer » 2010-10-22 11:12 @508

Bienvenido a los foros de Perl en Español, alain_fyf.

La línea

@refp = (\$fracs);

inicializa el valor del array @refp con una referencia a la variable escalar $fracs.

No sabemos qué contiene $fracs, pero en $refp[0] quedará almacenado una referencia a lo que contiene. Para obtener el valor que contiene $fracs lo escribiríamos así: ${$refp[0]}

Sí que podríamos decir que las referencias son punteros, con la diferencia que la dirección que obtenemos no corresponde con una dirección física de la máquina, sino a una dirección de la máquina virtual Perl.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Perl a Fortran (punteros)

Notapor alain_fyf » 2010-10-22 11:13 @509

Muchas gracias, danimera.

¿Y hacer referencia es, en otras palabras, asignar ese valor? ¿O esa dirección de memoria como un puntero, es decir, que en mi caso @refp tendrá el valor de $fracs?
alain_fyf
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2010-10-22 09:51 @452

Re: Perl a Fortran (punteros)

Notapor alain_fyf » 2010-10-22 11:20 @513

Muchas gracias, Explorer.

Es decir, que @refp tendrá el valor de $fracs, eso lo he entendido, ahora dices que @refp[0] tendrá el valor de $fracs, entiendo que @refp es un arreglo unidimensional pero ¿cuántos elementos tiene? ¿Hay que declararlo antes o puedes meter tantos como quieras para @refp[1],@refp[2]...@refp[n-1] sin declararlos antes?
alain_fyf
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2010-10-22 09:51 @452

Re: Perl a Fortran (punteros)

Notapor alain_fyf » 2010-10-22 11:29 @520

Ya he aclarado mis dudas en este punto, muchas gracias a los dos.

Dejo esta referencia que encontré sobre punteros por si alguien más aparece por aquí con dudas.
http://ist.marshall.edu/ist334/perl_pointers.html


Pronto regresaré con más preguntas.

Un saludo,

Alain.
alain_fyf
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2010-10-22 09:51 @452

Re: Perl a Fortran (punteros)

Notapor explorer » 2010-10-22 11:38 @526

No, no las entendido bien o nos hemos explicado mal...

Para que quede más claro: "referencia" == "puntero".

Entonces, @refp = (\$fracs) hará que el array @refp contenga un valor: una referencia (puntero) a la variable $fracs. Estamos, efectivamente, guardando un puntero a la variable $fracs, dentro del array @refp.

Para acceder a los elementos de un array, NO hay que usar la nomenclatura @refp[0], @refp[1].

En Perl, el primer carácter que antecede a una variable, indica el tipo de dato que queremos obtener de esa variable. Si vemos un '$' obtenemos un escalar, mientras que si vemos un '@', obtenemos una lista de valores.

Así, para obtener UN valor de @refp, lo llamamos así: $refp[0]. Si quisiéramos obtener DOS (o más) valores de @refp, lo escribiríamos así: @refp[0,1,2].

$refp[0] contendrá la referencia a $fracs. Para obtener el valor que contiene $fracs lo podríamos escribir como ${ $refp[0] }. Estamos desreferenciando, y como ponemos un '$' delante, estamos indicando que queremos obtener un valor escalar.

Para ver el contenido de las variables, puedes usar el módulo Data::Dumper:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
@refp = (\$fracs);
use Data::Dumper;
print Dumper \@refp;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Actualización: enviado antes del último mensaje de alain_fyf.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Perl a Fortran (punteros)

Notapor alain_fyf » 2010-10-26 10:18 @471

Vale entonces usar '$' me devuelve el escalar.
Ahora una cosa, supongamos que ahora tengo el arreglo @refp y tengo la expresión

@refp=(\$fracs,\$cltime)

Según entiendo este array está apuntando a dos escalares: $fracs y $cltime. ¿Cómo es posible apuntar a dos sitios? ¿o es que el arreglo tiene dos elementos y cada uno de ellos apunta a un escalar $fracs y $cltime respectivamente? Como dije mi intención es "traducir" esto a Fortran y Fortran no permite arrays punteros así que tengo que hacer un puntero para cada escalar, es decir puede ser que

@refp=(\$fracs,\$cltime) es igual que $refpf=\$fracs y $refpc=\$cltime

En términos prácticos, ¿harían lo mismo, no?
alain_fyf
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2010-10-22 09:51 @452

Re: Perl a Fortran (punteros)

Notapor explorer » 2010-10-26 10:46 @490

Un array almacena una lista de valores. En el ejemplo que pones, sí, almacena dos referencias a dos escalares.

Me pica la curiosidad de porqué quieres pasar esto a Fortran... Si quieres velocidad, lo pasaría a C o incluso lo podrías hacer desde dentro del propio Perl con el módulo Inline::C.

Si se trata de cálculo matemático, sin duda pensaría en usar PDL, aunque sea muy difícil de aprender.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Perl a Fortran (punteros)

Notapor alain_fyf » 2010-10-26 11:02 @501

Es porque otra parte del programa (un simulador) está en Fortran y lo que hace el programa de Perl tenía un simulador muy sencillo, básicamente un tanque; y lo que quiero hacer es más complejo y ya está en Fortran; y era o pasar lo de Fortran a Perl o lo de Perl a Fortran. Lo que usaré del programa de Perl será todo menos el simulador y en lugar de llamar al simulador del tanque llamará al mio :)

Ya lo he resuelto como Fortran, no acepta arrays de punteros; los he separado en dos punteros apuntando cada uno a su correspondiente Target que así se llaman en Fortran.

Tengo otra duda pero no sé si es el sitio o abrir otro hilo así que si algún moderador ve que no pega en este hilo por favor que lo cambie.

Me he encontrado con esto
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
        for ($ind = 0; $ind <= $#refp; $ind++)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Traducido a Fortran es un DO con valor inicial ind=0 hasta un valor final refp con incrementos de 1.

La pregunta es qué es $#refp; sé que $ antes es un escalar pero # estaba reservado para comentarios, ¿qué hace aquí?

Gracias por todo y disculpad la molestia que les estoy dando.
alain_fyf
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2010-10-22 09:51 @452

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 52 invitados