Espace pile insuffisant

Huguo

XLDnaute Nouveau
Bonjour,

Je souhaite réaliser un programme assez simple (donnant le prix d'une option financière).
J'ai codé une fonction en C. Lorsque j'exécute le .exe issu de ce code, tout fonctionne comme je le souhaite (le prix est cohérent, le calcul ne prend pas de temps, etc.)

Je dois ensuite créer une interface excel permettant de rentrer les différents arguments. Je souhaite donc créer une macro allant chercher ces arguments dans un classeur puis appeler ma fonction codée en C depuis mon code en VBA. Pour cela, j'ai fabriqué une .dll (qui pour l'instant est dans mon dossier System32 pour faciliter la tâche).

Le problème est le suivant : l'appel à la fonction Prix(Arguments) fonctionne quand je l'exécute depuis le .exe de mon code C, mais un message d'erreur "espace pile insuffisant" apparaît lorsque je souhaite y faire appel depuis mon code en VBA (alors que les arguments sont les mêmes).

Quelqu'un a-t-il déjà rencontré ce problème ? Existe-t-il des paramètres Excel à modifier pour allouer plus de mémoire aux calculs ?? (Je programme rarement en VBA)

Merci beaucoup !

Voici mon code VBA :

Code:
Declare Function Prix Lib "BSA.Dll" Alias "_Prix@36" (NbJours As Integer, r As Double, sigma As Double, S0 As Double, K As Double)
'


Sub Exec()
'
' Exec Macro
'
Range("A1").Select
ActiveCell.Value = Prix(100, 0.02, 0.03, 100, 100)
'
End Sub


Et mon code en C :
Code:
#include <math.h>;
#define export __declspec (dllexport)


double pow(double x, int i){
	if (i==0) return 0; 
	else if (i==1) return x; 
	else return x*pow(x, i-1);
}
double max(double x, double y){
	if(x>y) return x;
	else return y;
}

// Valeur intrinseque du call si le sous jacent est monté i fois et descendu t-i
double VI(int i, int t, double S0, double K, double up){
	return max(S0*pow(up,i)*pow(1/up, t-i) - K, 0);
}


// Fonction finale
// NbJours est le nombre de jours ou le ss jacent a pu évoluer

export double __stdcall Prix(int NbJours, double r, double sigma, double S0, double K){
	int americain = 1;
	double G[10000];
	int i,j;

	double DeltaT = 0.004;
	double up = exp(sigma*sqrt(DeltaT));
	double p = (exp(r*DeltaT) - 1/up) / (up - 1/up);
	double coeff = exp(r*DeltaT);
	
	for (i=1; i< NbJours+2; i++) {
		G[i]=VI(NbJours-i+1, NbJours, S0, K, up);
	}
	
	for (i=1; i<NbJours+1; i++){
		for (j=1; j < NbJours -i + 2; j++){
			G[j] = max( coeff*(p*G[j] + (1-p)*G[j+1]),  americain*VI(NbJours - i - j +1, NbJours - i, S0, K, up));
			}
	}

	return G[1];
}

N.B : J'ai notamment essayé de modifier la taille (arbitraire) du tableau G crée dans le code en C, mais meme avec une taille de 2 cases le message réapparaît ...
 

Huguo

XLDnaute Nouveau
Re : Espace pile insuffisant

Bonjour BrunoM45,

On m'a souvent expliqué que faire des calculs en VBA prenait souvent plus de temps qu'en C. Les programmes que j'utilise utilisant des simulations de Monte Carlo avec de nombreux tirages ont pour la plupart une interface excel mais font appel à des fonctions codées en C. Cependant, comme je l'ai précisé, je ne suis pas familier avec le VBA. Et je n'ai jamais vérifié "expérimentalement" ces préjugés sur le VBA ;)

S'il n'y a pas d'autres solutions que de faire l'intégralité du code sous VBA, c'est ce que je ferai. Cependant, je suis beaucoup plus à l'aise en C qu'en VBA. Enfin, j'aurais aimé manier l'intégration de code C++ dans une macro (d'un point de vue professionnel, "ça ferait bien sur mon CV"). Surtout que j'ai l'impression d'être proche du but, ma fonction en C fonctionne, Excel la trouve dans la dll mais a apparemment uniquement un problème de mémoire ... :(

Merci beaucoup !
 
C

Compte Supprimé 979

Guest
Re : Espace pile insuffisant

Re,

On m'a souvent expliqué que faire des calculs en VBA prenait souvent plus de temps qu'en C
C'est fort probable, mais ce serait à tester ;)

De toute façon le problème ne peut se situer qu'au niveau de ta DLL,
du moins je pense :p

et là je ne peux pas t'aider ...

A+
 

Discussions similaires

Statistiques des forums

Discussions
312 506
Messages
2 089 121
Membres
104 038
dernier inscrit
Helpme59