Martes 19 de Noviembre de 2024, 05:26
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
CLR: .Net / Mono / Boo / Otros CLR
»
C#
(Moderador:
ProfesorX
) »
Código Unsafe
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Código Unsafe (Leído 2290 veces)
patpite
Nuevo Miembro
Mensajes: 15
Código Unsafe
«
en:
Domingo 10 de Abril de 2005, 21:07 »
0
Hola,
¿Alguien podría decirme cómo se introduce código de c++ en una aplicación c#? ¿tiene muchos inconvenientes?
Saludos,
Patricia.
Tweet
JuanK
Miembro de ORO
Mensajes: 5393
Nacionalidad:
Re: Código Unsafe
«
Respuesta #1 en:
Domingo 10 de Abril de 2005, 22:14 »
0
y... para que?
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io
patpite
Nuevo Miembro
Mensajes: 15
Re: Código Unsafe
«
Respuesta #2 en:
Domingo 17 de Abril de 2005, 21:06 »
0
Pues a ver... tengo que meter en un programa que he hecho yo una parte de código que ya ha sido creada (en concreto, el algoritmo
amoeba
, del Numerical Recipes). Este código lo tengo escrito en Visual Basic, Fortran y C. Y el de C lleva punteros.
Tengo que "adaptarlo" para C#, y como no me funciona, he pensado que posiblemente sea porque necesita del uso del punteros. Pero el caso es que ni en VB ni en Fortran los emplea.
¿Alguna sugerencia?
Gracias.
Patri.
JuanK
Miembro de ORO
Mensajes: 5393
Nacionalidad:
Re: Código Unsafe
«
Respuesta #3 en:
Martes 19 de Abril de 2005, 14:22 »
0
cualuier cosa has ta donde se.. que este hecha con punteros la puedes convertir al uso de arrays o colecciones en C#, seria interesante revisar el codigo de C que debes pasar a C# a ver que hiciste mal y que se peude hacer.
El codigo unsafe es muy poco recomendable.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io
patpite
Nuevo Miembro
Mensajes: 15
Re: Código Unsafe
«
Respuesta #4 en:
Sábado 23 de Abril de 2005, 19:49 »
0
Bueno... esta es la página donde viene el algoritmo que he empleado. Se llama "amoeba": sirve para minimizar funciones. Aquí viene codificado en Fortran y en C. (También lo encontré en VB).
Algortimo Amoeba
Y mi codificación en C# del amoebilla ha sido la siguiente (al que se moleste en echarle un vistazo y me diga si hay un error o algo que no cuadre, le hago un monumento!!!!)
Código: Text
using System;
using System.Data;
using System.Data.OleDb;
using System.ComponentModel;
using System.Windows.Forms;
using Andromeda.clases;
namespace Andromeda.clases
{
/// <summary>
/// Descripción breve de Amoeba.
/// </summary>
public class Amoeba
{
/* Definiciones de Variables y Constantes*/
public Amoeba(){}
/* Devuelve punto de evaluacion*/
public static void Get_Msum(int n,double[] Msum)
{
int ndim = n; // Curva oscuridad, n = 6; mpts = 7
int mpts = ndim + 1;
double sum;
int i;
for(int j=0;j<=ndim-1;j++) // Recorre las 6 columnas de M
{
for(sum = 0.0, i=0;i<=mpts-1;i++) // Recorre las 7 filas de M
sum = sum + Andromeda.clases.comun.M[i,j];
Msum[j]=sum; //Msum tiene 6 posiciones
}
}
/* Intercambio de valores*/
public static void SWAP(double a, double B)
{
double aux = 0;
aux = a;
a = b;
b = aux;
}
/* Función "Amotry"*/
public static double amotry(int ident,double cte,double[,] M,double[] y,double Msum,int n,int ihi,int nfunk,double fac)
{
int j;
double fac1; double fac2;
double ytry;
double[] ptry;
int ndim = n;
ptry = new double[ndim+1];
fac1 = (1.0-fac)/ndim;
fac2 = fac1-fac;
for(j=0;j<=ndim-1;j++)
ptry[j]=Msum[j]*fac1-M[ihi,j]*fac2;
ytry = Andromeda.clases.comun.funcionE(ident,cte,ptry); //Función a minimizar
if(ytry < y[ihi])
{
y[ihi]=ytry;
for(j=0;j<=ndim-1;j++)
{
Msum[j] = Msum[j] + ptry[j]-M[ihi,j];
M[ihi,j]= ptry[j];
}
}
return ytry;
}//endmethod
/*FUNCION "amoeba" */
public static void amoeba(int ident,double cte,double[,] M,double[] y,int ndim,double ftol)
{
// Zona de declaración de variables
int i,ihi,ilo,inhi,j,mpts;
double rtol,ysave,ytry; // sum?
int nfunk;
// Zona de declaración de constantes
const int NMAX = 5000;
const int ITMAX = 100;
const double TINY = 1.0E-10;
// Zona de inicialización de variables
double[] Msum = new double[ndim+1];
mpts = ndim +1;
nfunk = 0;
Get_Msum(ndim,Msum);
for(;;)
{
ilo = 0;
if(y[0]>y[1])
{
inhi = 1;
ihi = 0;
}
else
{
inhi = 0;
ihi = 1;
}
for(i=0; i<=mpts-1; i++)
{
if(y[i] <= y[ilo]) ilo = i;
if(y[i]>y[ihi])
{
inhi = ihi;
ihi = i;
}else if(y[i]>y[inhi] && i!=ihi) inhi = i;
}//endfor
rtol = 2.0*Math.Abs(y[ihi]-y[ilo])/(Math.Abs(y[ihi])+Math.Abs(y[ilo])+TINY);
if(rtol < ftol)
{
SWAP(y[0],y[ilo]);
for(i=0; i<=ndim-1; i++)
SWAP(M[0,i],M[ilo,i]);
break;
}//endif
if( nfunk >= NMAX)
{
// EN CASO DE ERROR:
return;
}
nfunk= nfunk+2;
// Aquí comienza una nueva iteración
ytry = amotry(ident,cte,M,y,Msum,ndim,ihi,nfunk,-1.0);
if(ytry <= y[ilo])
{
ytry = amotry(ident,cte,M,y,Msum,ndim,ihi,nfunk,2.0);
}
else if(ytry >= y[inhi])
{
ysave = y[ihi];
ytry = amotry(ident,cte,M,y,Msum,ndim,ihi,nfunk,0.5);
if(ytry >= ysave)
{
for(i=0; i<=mpts-1; i++)
{
if(i!=ilo)
{
for(j=0; j<=ndim-1; j++)
M[i,j] = Msum[j]=0.5*(M[i,j]+M[ilo,j]);
y[i] = Andromeda.clases.comun.funcionE(ident,cte,Msum);
}//endif
}//endfor
nfunk = nfunk + ndim;
Get_Msum(ndim,Msum);
}//endif
}//endif
else --nfunk;
}//endfor
}
}
patpite
Nuevo Miembro
Mensajes: 15
Re: Código Unsafe
«
Respuesta #5 en:
Lunes 25 de Abril de 2005, 10:24 »
0
Otro detalle: la función que ese algoritmo trata de minimizar es la siguiente (aunque he quitado código que entorpecería ver la "esencia" de la función):
Código: Text
/***********************************************************************************
* Método que implementa la función error: E *
***********************************************************************************/
public static double funcionE(int ident,double cte,double p1,double p2,double p3,double
p4,double p5,double p6)
{
double Iteor = 0;
double Err = 0;
double T = Temperatura;
double Vexp;
double Iexp;
for(int j=0; j<Mpuntos-N;j++)
{
Vexp = (double)puntosGrupo[ident][0,j];
Iexp = (double)puntosGrupo[ident][1,j];
// Calculo la Iteor
Iteor = Math.Abs(cte - ( p1*(Math.Exp((e*Vexp-p5*Iexp)/p3*k*T)-1) +
p2*(Math.Exp((e*Vexp-p5*Iexp)/p4*k*T)-1) + (Vexp-p5*Iexp)/p6 ));
// Calculo el error para ese punto concreto
Err = Math.Pow(((Iexp-Iteor)/Iexp),2);
// Lo sumo a la func. error global para el grupo tratado
funcE = funcE + Err;
}//endfor
return funcE;
}//endmethod
He visto que no parece cargar bien en "funcE" lo que calcula en "Err". He hecho alguna prueba relacionada con "limpiar" el contenido de algunas variables, pero no doy con la solución. ¿Alguna sugerencia, por favor?
Saludos,
Patricia, a punto de ahorcarse con el cable de red.
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
CLR: .Net / Mono / Boo / Otros CLR
»
C#
(Moderador:
ProfesorX
) »
Código Unsafe