Merci de ta réponse
Alors voila le code du fichier "1.c" qui fait le fetch en appelant une procédure plsql pour récupérer les valeurs des attributs puis qui appelle la fonction "MRXBgen_optchange" pour traiter les attributs d'un produit:
CODE "1.c": (il vient en fait d'une source .pc car je ne vais pas te mettre tous les détails sql)
while ((pc_done_fetch == proFAUX) && (*etat == proINITIALISE) &&
(cr == crOK))
{ /* Fetch des éléments dans des variables c */
EXEC SQL EXECUTE
BEGIN
PLMRXBbrc.PLMRXBget_optchange(
:pc_batch_size,
:pc_done_fetch,
:pc_found,
:pc_t_cgel_indi_bloq,
:pc_t_numero_deal,
:pc_t_contrepartie,
:pc_t_code_contrepartie,
:pc_t_date_deal,
:pc_t_date_echeance,
:pc_t_type_option,
:pc_t_style_option,
:pc_t_type_exercice,
:pc_t_date_reglement,
:pc_t_sens_deal,
:pc_t_book,
:pc_t_nominal_1,
:pc_t_nominal_2,
:pc_t_devise_1,
:pc_t_devise_2, :pc_t_npv_1,
:pc_t_devise_3,
:pc_t_tofx_inst,
:pc_t_strike,
:pc_t_product_code_crisp,
:pc_t_crisp_basic_deal_type,
:pc_t_gele_elsi_cle,
:pc_t_gele_indi_trf_sele,
:pc_t_gele_nint,
:pc_t_gele_rel_oper_code,
:pc_t_ffr,
:pc_t_is_mxg,
:pc_t_settlement_risq,
:pc_t_indi_modelis_crisp);
END;
END-EXEC;
if ((cr = BDDctrl_sqlcode(errERR_EXECUTE, func)) == crOK)
{ i = 0;
while ((cr == crOK) && (i < pc_found))
{
/*Appel de la fonction c de traitement des éléments*/
cr = MRXBgen_optchange( p_brc,
p_trad,
&elem_ok,
sinf_code,
pc_t_numero_deal[i],
pc_t_contrepartie[i],
pc_t_code_contrepartie[i],
pc_t_date_deal[i],
pc_t_date_echeance[i],
pc_t_type_option[i],
pc_t_style_option[i],
pc_t_type_exercice[i],
pc_t_date_reglement[i], pc_t_sens_deal[i],
pc_t_book[i],
pc_t_nominal_1[i],
pc_t_nominal_2[i],
pc_t_devise_1[i],
pc_t_devise_2[i],
pc_t_npv_1[i],
pc_t_devise_3[i],
pc_t_tofx_inst[i],
pc_t_strike[i],
pc_t_product_code_crisp[i],
pc_t_crisp_basic_deal_type[i],
pc_t_gele_elsi_cle[i],
pc_t_gele_nint[i],
pc_t_gele_indi_trf_sele[i],
pc_t_gele_rel_oper_code[i],
pc_t_ffr[i],
pc_t_settlement_risq[i],
pc_t_indi_modelis_crisp[i]);
}
i++;
}
Comme tu peux le voir les attributs récupérés sont tous les tableaux pc_...
et il y en a plus que 11 par produit mais c'était juste pour l'exemple.
Toutes les variables pc_... sont initialisées bien plus haut dans le code et le problème ne vient pas de la car j'ai testé toutes les valeurs de chacun de ces tableaux (un paquet) et elles sont toutes OK.
Le code plante tout de suite pour i=0;
Puis voila le code de la fonction en question situé dans le fichier "2.c"
jusqu'à l'erreur de segmentation.
CODE "2.c"

bon il n'y a pas que des chaines de caractères quelques int short et deux structures en premiers paramètres):
int MRXBgen_optchange(
p_brc,
p_trad,
elem_ok,
sinf_code,
numero_deal,
contrepartie,
code_contrepartie,
date_deal,
date_echeance,
type_option,
style_option,
type_exercice,
date_reglement,
sens_deal,
book,
nominal_1,
nominal_2,
devise_1,
devise_2,
devi1_cref,
devi2_cref,
npv_1,
devise_3,
tofx_inst,
tofx_strike,
product_code_crisp,
basic_deal_type,
gele_elsi_cle,
gele_nint,
gele_indi_trf_sele,
gele_rel_oper_code,
ffr,
settlement_risq,
indi_modelis_crisp)
BRCbrc *p_brc;
traTRAD *p_trad;
short *elem_ok;
char *sinf_code;
char *numero_deal;
char *contrepartie;
char *code_contrepartie;
char *date_deal;
char *date_echeance;
char *type_option;
char *style_option;
char *type_exercice;
char *date_reglement;
char *sens_deal;
char *book;
char *nominal_1;
char *nominal_2;
char *devi1_cref;
char *devi2_cref;
char *devise_1;
char *devise_2;
char *npv_1;
char *devise_3;
char *tofx_inst;
char *tofx_strike;
char *product_code_crisp;
char *basic_deal_type;
char *gele_elsi_cle;
int gele_nint;
short gele_indi_trf_sele;
short gele_rel_oper_code;
char *ffr;
char *settlement_risq;
char *indi_modelis_crisp;
{
/*Initialisation des variables necessaries à la fonction*/
BRCbrcd brcd;
short elem_ok2 = proOUI;
short inversion;
float rapport;
short trouve;
int cr = crOK;
int *svel_nint[30];
int relp_nint;
int acti;
char temp_inst[8];
char strike_theo[relRELA_LEN+1];
char relp_code[65] = "\0";
char book_out[65] = "\0";
char objid[120] = "\0";
char anoe_libe[ANOE_LIBE_LEN+1];
char libe_util_add[ANOE_LIBE_UTIL_LEN+1];
char libe_info_add[ANOE_LIBE_INFO_LEN+1];
char func[] = "<MRXBRC.C> MRXBgen_optchange";
/* Init du rapport */
rapport=0;
/*Initialisation de la structure brcd*/
BRCini_brcd(&brcd);
/* Création de l'identifiant de l'objet*/
sprintf(objid,"%s",gele_elsi_cle);
Et donc le code plante en segm fault au sprintf de la fin car si dans "1.c" pc_t_gele_elsi_cle[0]="FXO_701120080\000\000\000\000\000\000"
et bien on a dans "2.c"
gele_elsi_cle=0x2b2a00000002 <Address 0x2b2a00000002 out of bounds>
d'ou bye bye le sprintf...
J'ai aussi basic_deal_type=0x1c26b <Address 0x1c26b out of bounds>
alors que pc_t_basic_deal_type[0]="OP999\000\000\000\000"
Et donc "ce ne sont pas" ces deux paramètres qui plantent mais bien "leurs positions" dans l'appel de la fonction car en changeant l'ordre des paramètres ce sont toujours les 27 et 28emes paramétres qui prennent des valeurs incohérentes.
Voila pffffiouuuuuuu...
Partager