IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Fonction strlen (segmentation fault)


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 126
    Par défaut Fonction strlen (segmentation fault)
    Bonjour à tous,

    j'ai un programme Pro*C qui compile bien mais quand je l'exécute j'ai un segmentation fault :

    LABEL: CORE_DUMP
    IDENTIFIER: A63BEB70

    Date/Time: Tue Jul 22 14:46:17 CDT 2008
    Sequence Number: 626
    Machine Id: 0057246A4C00
    Node Id: tls03
    Class: S
    Type: PERM
    Resource Name: SYSPROC

    Description
    SOFTWARE PROGRAM ABNORMALLY TERMINATED

    Probable Causes
    SOFTWARE PROGRAM

    User Causes
    USER GENERATED SIGNAL

    Recommended Actions
    CORRECT THEN RETRY

    Failure Causes
    SOFTWARE PROGRAM

    Recommended Actions
    RERUN THE APPLICATION PROGRAM
    IF PROBLEM PERSISTS THEN DO THE FOLLOWING
    CONTACT APPROPRIATE SERVICE REPRESENTATIVE

    Detail Data
    SIGNAL NUMBER
    11
    USER'S PROCESS ID:
    409648
    FILE SYSTEM SERIAL NUMBER
    14
    INODE NUMBER
    2048
    PROCESSOR ID
    0
    CORE FILE NAME
    /u001/appli/ss10_dev/sh/core
    PROGRAM NAME
    ss10_SAP_extract
    STACK EXECUTION DISABLED
    0
    ADDITIONAL INFORMATION
    strlen 24
    fSetHv F8
    fExtractS B58
    main 248
    __start 94

    Symptom Data
    REPORTABLE
    1
    INTERNAL ERROR
    0
    Ce programme fonctionnait en 32 bits mais maintenant qu'on est passé en XL C/C++ Runtime for AIX 5.2 (64 bits) ça ne marche plus...

    voici le code de la fonction qui je pense pose pb :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    /****************************************************************/
    /*                                                              */
    /* Function : fSetHv                                            */
    /*                                                              */
    /* Description    : Initialize the value and the length         */
    /*                                                              */
    /****************************************************************/
     
    int fSetHv(phvHvName, piIndicator, pcValue)
    VARCHAR *phvHvName;
    short *piIndicator;
    char *pcValue;
    {
     
    if(pcValue == NULL)
       {
       strcpy((char *)phvHvName->arr, "");
       phvHvName->len = 0;
       if(piIndicator != NULL)
          {
          *piIndicator = -1;
          }
       }
    else
       {
       if(piIndicator != NULL) *piIndicator = 0;
       phvHvName->len = strlen(pcValue);
       strncpy((char *)phvHvName->arr, pcValue, phvHvName->len);
       }
    return((piIndicator != NULL)? *piIndicator : 0);
    }
    je sais qu'il y a peut-être cette histoire de pointeur et d'allocation mémoire...mais j'avoue ne pas trop maîtriser ce concept.

    j'ai pensé ajouté ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    phvHvName->arr[phvHvName->len] = '\0';
    mais reste à savoir à quel moment et s'il ne faut pas modifier le code initial.

    Pouvez-vous m'aider svp ?

    Cat

  2. #2
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 126
    Par défaut
    autre chose, lorsque je fais appel à cette fonction dans mon programme main, je passe en paramètre ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    fSetHv(&hvD##Var, &ind_D##Var,\
                    fGetHv(&hvD_ENTR_##Table[iRang], &ind_D_ENTR_##Table[iRang]));\
    qui appelle une autre fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    /****************************************************************/
    /*                                                              */
    /* Function : fGetHv                                            */
    /*                                                              */
    /* Description    : Return a pointer on string value            */
    /*                                                              */
    /****************************************************************/
     
    char *fGetHv(phvHvName, piIndicator)
    VARCHAR *phvHvName;
    short *piIndicator;
    {
    phvHvName->arr[phvHvName->len] = '\0';
    return((piIndicator != NULL &&
            *piIndicator == -1)? NULL : (char *)phvHvName->arr);
    }
    et ici on retrouve bien la ligne
    phvHvName->arr[phvHvName->len] = '\0';

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2008
    Messages : 17
    Par défaut
    Salut,

    Etant donné la pile d'appel, çà ne serait pas plutôt la chaîne pcValue qui poserait pb ?

    ++

  4. #4
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 126
    Par défaut
    je ne sais pas...

    tu veux dire qu'il faudrait modifier la longueur de pcValue? comment faire dans ce cas-là?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pcValue->len = strlen(pcValue) + 1;
    c'est possible ça ? je rappelle que pcValue est déclaré de la manière suivante:

    ou bien peut-être ajouter le caractère de fin de ligne dans pcValue?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pcValue->arr[pcValue->len] = '\0';
    je ne sais même pas si c'est possible...

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 966
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 966
    Par défaut
    Hoe,

    Je ne vois aucune initialisation pour tes 3 pointeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    VARCHAR *phvHvName;
    short *piIndicator;
    char *pcValue;

  6. #6
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    Citation Envoyé par droggo Voir le message
    Hoe,

    Je ne vois aucune initialisation pour tes 3 pointeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    VARCHAR *phvHvName;
    short *piIndicator;
    char *pcValue;
    C'est la declaration des parametres de la fonction selon le style K&R (Kernighan et Ritchie), c'est vrai que ca fait longtemps que j avais pas vu ca

  7. #7
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 966
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 966
    Par défaut
    Hai,
    Citation Envoyé par BainE Voir le message
    C'est la declaration des parametres de la fonction selon le style K&R (Kernighan et Ritchie), c'est vrai que ca fait longtemps que j avais pas vu ca
    effectivement, je n'avais pas fait attention aux noms des paramètres.

    Comme tu le dis, ça fait longtemps que plus personne n'utilise le style K&R, et je suis d'ailleurs étonné d'en trouver ici dans un programme fait par une débutante, qui est donc sur une mauvaise voie.

  8. #8
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 126
    Par défaut
    bien attendu ce code n'est pas le mien ;-)

    je dois juste le reprendre pour le faire marcher en 9i 64 bits...

    mais ton "qui est donc sur une mauvaise voie" me fait un peu peur

  9. #9
    Membre chevronné

    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Par défaut
    Bon c'est pas facile a suivre tout ca....

    On dirait que la variable piIndicator est destinee a eviter que la variable phvHvName soit modifiee par un autre thread, c'est bien ca? vu que c'est teste a plusieurs reprises alors que cette fonction ne le change pas.

    Tu es sure qu'un autre thread n'a pas modifie la variable au mauvais moment?

    Ensuite, d'ou vient le type VARCHAR? Est-ce que il y a assez de place dedans pour placer le zero final, si bien que cette ligne marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pcValue->arr[pcValue->len] = '\0';
    Finalement la grande difference entre 32 bit et 64 bit c'est la taille des pointeurs (2x plus grands). Est-ce que tu es sure que le pointeur dans VARCHAR est 64 bits? Celui-la:


  10. #10
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 966
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 966
    Par défaut
    Gao,
    Citation Envoyé par Cathy Voir le message
    bien attendu ce code n'est pas le mien ;-)

    je dois juste le reprendre pour le faire marcher en 9i 64 bits...

    mais ton "qui est donc sur une mauvaise voie" me fait un peu peur
    On a créé les prototypes de fonctions pour, entre autres, éviter ce style de déclarations, et on a ainsi supprimé de très nombreux bugs...

  11. #11
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 126
    Par défaut
    j'ai plusieurs programmes qui plantent, à chaque fois ce sont des fonctions différentes...

    pour l'histoire du VARCHAR je n'arrive pas à savoir où est-ce qu'il est défini...

    malheureusement je ne maîtrise pas assez pour vous donner les infos qui vont bien :-(

    et je ne sais pas si le pointeur dans VARCHAR est 64 bits !!

    voici le code de mon programme main, je ne vous demande pas de tout lire bien entendu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
     
    /* Includes files */
    /******************/
     
    #include <stdio.h>
    #include <string.h>
    #include <time.h>
    #include <ctype.h>
    #include <stdlib.h>
     
    /* Include the SQL communication Area */
    #include <sqlca.h>
     
    #include <ss10_common.h>
    #include <ss10_common_db.h>
    #include <ss10_SAP_extract.h>
     
    /* Constantes variables */
    /************************/
    #define kiNB_LINES             500
     
    /*------------------------------------------------*/
    /* Macro for finding date plan event              */
    /*                                                */
    /* - APC restriction Table name where the select  */
    /*   has been perform                             */
    /* - Planning event code wanted                   */
    /* - Local Host variable restriction name         */
    /* - Code Table                                   */
    /* - Date type (ENTR : entry or DELI : delivery)  */
    /*------------------------------------------------*/
    #define fREAD_PLAN_EVENT(Table, CodePlan, Var, Type) \
       {\
       int bFound = 0;\
       int iRang = 0;\
       for(iRang = 0; iRang < kiNBR_PLANEVENTS; iRang++) \
          {\
          if(ind_C_PLAN_EVENT_##Table[iRang] != -1 &&\
             strncmp((char *)hvC_PLAN_EVENT_##Table[iRang].arr, CodePlan, hvC_PLAN_EVENT_##Table[iRang].len) == 0)\
             {\
             bTrouve = 1;\
             bFound = 1;\
             break;\
             }\
          }\
    \
       if(bFound)\
          {\
          if(strcmp(Type, "ENTR") == 0)\
             fSetHv(&hvD##Var, &ind_D##Var,\
                    fGetHv(&hvD_ENTR_##Table[iRang], &ind_D_ENTR_##Table[iRang]));\
          else\
             fSetHv(&hvD##Var, &ind_D##Var,\
                    fGetHv(&hvD_DELI_##Table[iRang], &ind_D_DELI_##Table[iRang]));\
          }\
       }
     
    /* Globals variables */
    /*********************/
    static char gacTemp[500];
     
    /* SQL declare section */
    EXEC SQL BEGIN DECLARE SECTION;
     
    /*--- RECORD CIN ---*/
    VARCHAR hvPGM[kiNB_LINES][kiPGM + 1];        
    VARCHAR hvPGM_current[kiPGM + 1];        
    VARCHAR hvMSN[kiNB_LINES][kiMSN + 1];        
    VARCHAR hvMSN_current[kiMSN + 1];        
    VARCHAR hvCUST[kiNB_LINES][kiCUST + 1];       
    VARCHAR hvCUST_RNK[kiNB_LINES][kiCUST_RNK + 1];   
    VARCHAR hvCONT_RNK[kiNB_LINES][kiCONT_RNK + 1];   
    VARCHAR hvMODEL[kiNB_LINES][kiMODEL + 1];      
    VARCHAR hvMODEL_current[kiMODEL + 1];      
    VARCHAR hvINDVAR[kiNB_LINES][kiINDVAR + 1];     
    VARCHAR hvSERRNK[kiNB_LINES][kiSERRNK + 1];     
    VARCHAR hvSERRNK_current[kiSERRNK + 1];     
    VARCHAR hvSTD_RNK[kiNB_LINES][kiSTD_RNK + 1];    
    VARCHAR hvVERS_CUST[kiNB_LINES][kiVERS_CUST + 1];  
    VARCHAR hvVERS_RNK[kiNB_LINES][kiVERS_RNK + 1];   
    VARCHAR hvDFOKKER[kiDFOKKER + 1];    
    VARCHAR hvDSTATION40[kiNB_LINES][kiDSTATION40 + 1]; 
    VARCHAR hvDALENIA[kiDALENIA + 1];    
    VARCHAR hvDTHFF[kiNB_LINES][kiDTHFF + 1];      
    VARCHAR hvDINDUST[kiNB_LINES][kiDINDUST + 1];    
    VARCHAR hvDCUSACC[kiNB_LINES][kiDCUSACC + 1];    
    VARCHAR hvDENGINE[kiDENGINE + 1];    
    VARCHAR hvDNACELLE[kiDNACELLE + 1];   
    VARCHAR hvENGTYPE[kiNB_LINES][kiENGTYPE + 1];    
    VARCHAR hvACTLIV[kiNB_LINES][kiACTLIV + 1];     
    VARCHAR hvACDLIV[kiNB_LINES][kiACDLIV + 1];     
    VARCHAR hvACSTAT[kiNB_LINES][kiACSTAT + 1];     
    VARCHAR hvM_PROJ_SER[kiNB_LINES][kiM_PROJ_SER + 1];      
    VARCHAR hvM_PROJ_SER_current[kiM_PROJ_SER + 1];      
    VARCHAR hvC_COAC[kiNB_LINES][kiC_COAC + 1];      
    VARCHAR hvC_COAC_current[kiC_COAC + 1];      
     
    VARCHAR hvLMODEL[kiLMODEL + 1];      
    VARCHAR hvSERNAM[kiSERNAM + 1];
    VARCHAR hvVERBASE[kiVERBASE + 1];    
    VARCHAR hvBATCH[kiBATCH + 1];      
     
    /* Arrays of hosts variables for Planning events */
    VARCHAR hvC_PLAN_EVENT_ACHV[kiNBR_PLANEVENTS][kiC_PLAN_EVENT + 1];
    VARCHAR hvD_ENTR_ACHV[kiNBR_PLANEVENTS][kiD_ENTR + 1];
    VARCHAR hvD_DELI_ACHV[kiNBR_PLANEVENTS][kiD_DELI + 1];
    VARCHAR hvC_PLAN_EVENT_FIX[kiNBR_PLANEVENTS][kiC_PLAN_EVENT + 1];
    VARCHAR hvD_ENTR_FIX[kiNBR_PLANEVENTS][kiD_ENTR + 1];
    VARCHAR hvD_DELI_FIX[kiNBR_PLANEVENTS][kiD_DELI + 1];
    VARCHAR hvC_PLAN_EVENT_THEO[kiNBR_PLANEVENTS][kiC_PLAN_EVENT + 1];
    VARCHAR hvD_ENTR_THEO[kiNBR_PLANEVENTS][kiD_ENTR + 1];
    VARCHAR hvD_DELI_THEO[kiNBR_PLANEVENTS][kiD_DELI + 1];
     
    /* Declare indicators */
     
    /*--- RECORD SAP ---*/
    short ind_PGM[kiNB_LINES];
    short ind_PGM_current;
    short ind_MSN[kiNB_LINES];
    short ind_MSN_current;
    short ind_CUST[kiNB_LINES];
    short ind_CUST_RNK[kiNB_LINES];
    short ind_CONT_RNK[kiNB_LINES];
    short ind_MODEL[kiNB_LINES];
    short ind_MODEL_current;
    short ind_INDVAR[kiNB_LINES];
    short ind_SERRNK[kiNB_LINES];
    short ind_SERRNK_current;
    short ind_STD_RNK[kiNB_LINES];
    short ind_VERS_CUST[kiNB_LINES];
    short ind_VERS_RNK[kiNB_LINES];
    short ind_DFOKKER;
    short ind_DSTATION40[kiNB_LINES];
    short ind_DALENIA;
    short ind_DTHFF[kiNB_LINES];
    short ind_DINDUST[kiNB_LINES];
    short ind_DCUSACC[kiNB_LINES];
    short ind_DENGINE;
    short ind_DNACELLE;
    short ind_ENGTYPE[kiNB_LINES];
    short ind_ACTLIV[kiNB_LINES];
    short ind_ACDLIV[kiNB_LINES];
    short ind_ACSTAT[kiNB_LINES];
    short ind_M_PROJ_SER[kiNB_LINES];
    short ind_M_PROJ_SER_current;
    short ind_C_COAC[kiNB_LINES];
    short ind_C_COAC_current;
     
    short ind_LMODEL;
    short ind_SERNAM;
    short ind_VERBASE;
    short ind_BATCH;
     
    /* For planning events */
    short ind_C_PLAN_EVENT_ACHV[kiNBR_PLANEVENTS];
    short ind_D_ENTR_ACHV[kiNBR_PLANEVENTS];
    short ind_D_DELI_ACHV[kiNBR_PLANEVENTS];
    short ind_C_PLAN_EVENT_FIX[kiNBR_PLANEVENTS];
    short ind_D_ENTR_FIX[kiNBR_PLANEVENTS];
    short ind_D_DELI_FIX[kiNBR_PLANEVENTS];
    short ind_C_PLAN_EVENT_THEO[kiNBR_PLANEVENTS];
    short ind_D_ENTR_THEO[kiNBR_PLANEVENTS];
    short ind_D_DELI_THEO[kiNBR_PLANEVENTS];
     
    EXEC SQL END DECLARE SECTION;
     
     
    /*--------------------------------------------------------------*/
    /*                                                              */
    /* Function : fPlanningEvents                                   */
    /*                                                              */
    /* Description    : Planning event code and entry/delivery      */
    /*                  assignment                                  */
    /*                                                              */
    /*--------------------------------------------------------------*/
     
    int fPlanningEvents(pcErrOra)
    char *pcErrOra;
    {
    int iRang;
     
    /* Init tableau de resultat */
    for(iRang = 0; iRang < kiNBR_PLANEVENTS; iRang++)
       {
       ind_C_PLAN_EVENT_ACHV[iRang] = -1;
       ind_D_ENTR_ACHV[iRang] = -1;
       ind_D_DELI_ACHV[iRang] = -1;
     
       ind_C_PLAN_EVENT_FIX[iRang] = -1;
       ind_D_ENTR_FIX[iRang] = -1;
       ind_D_DELI_FIX[iRang] = -1;
     
       ind_C_PLAN_EVENT_THEO[iRang] = -1;
       ind_D_ENTR_THEO[iRang] = -1;
       ind_D_DELI_THEO[iRang] = -1;
       }
     
    EXEC SQL WHENEVER SQLERROR GOTO ERR;
    EXEC SQL WHENEVER NOT FOUND GOTO STEP2;
     
    EXEC SQL SELECT C_PLAN_EVENT, 
                    TO_CHAR(D_ACHVDATE_ENTR, 'YYYY-MM-DD'),
                    TO_CHAR(D_ACHVDATE_DELI, 'YYYY-MM-DD')
             INTO   :hvC_PLAN_EVENT_ACHV:ind_C_PLAN_EVENT_ACHV,
                    :hvD_ENTR_ACHV:ind_D_ENTR_ACHV,
                    :hvD_DELI_ACHV:ind_D_DELI_ACHV
             FROM   SS10_ACHVDATE
             WHERE  C_PROG = :hvPGM_current
             AND    C_APCMSN = :hvMSN_current
             AND    C_PLAN_EVENT in ('TR-FokkerTLS', 'AV-S14A',
                                     'EngineAvail', 'AV-PropSystm');
     
    STEP2:
     
    EXEC SQL WHENEVER NOT FOUND GOTO STEP3;
     
    EXEC SQL SELECT C_PLAN_EVENT,
                    TO_CHAR(D_FIXDATE_ENTR, 'YYYY-MM-DD'),
                    TO_CHAR(D_FIXDATE_DELI, 'YYYY-MM-DD')
             INTO   :hvC_PLAN_EVENT_FIX:ind_C_PLAN_EVENT_FIX,
                    :hvD_ENTR_FIX:ind_D_ENTR_FIX,
                    :hvD_DELI_FIX:ind_D_DELI_FIX
             FROM   SS10_FIXDATE
             WHERE  C_PROG = :hvPGM_current
             AND    C_APCMSN = :hvMSN_current
             AND    C_PLAN_EVENT in ('TR-FokkerTLS', 'AV-S14A',
                                     'EngineAvail', 'AV-PropSystm');
     
    STEP3:
     
    EXEC SQL WHENEVER NOT FOUND CONTINUE;
     
    EXEC SQL SELECT C_PLAN_EVENT,
                    TO_CHAR(D_THEODATE_ENTR, 'YYYY-MM-DD'),
                    TO_CHAR(D_THEODATE_DELI, 'YYYY-MM-DD')
             INTO   :hvC_PLAN_EVENT_THEO:ind_C_PLAN_EVENT_THEO,
                    :hvD_ENTR_THEO:ind_D_ENTR_THEO,
                    :hvD_DELI_THEO:ind_D_DELI_THEO
             FROM   SS10_THEODATE
             WHERE  C_PROG = :hvPGM_current
             AND    C_APCMSN = :hvMSN_current
             AND    C_PLAN_EVENT in ('TR-FokkerTLS', 'AV-S14A',
                                     'EngineAvail', 'AV-PropSystm');
     
    return(0);
     
    ERR:
       if(sqlca.sqlcode < 0)
          {
          sprintf(pcErrOra, "%*s %s", sqlca.sqlerrm.sqlerrml, 
                                      sqlca.sqlerrm.sqlerrmc,
                                      "(fPlanningEvents)");
          return(sqlca.sqlcode);
          }
       else return(0);
    }
     
    /*--------------------------------------------------------------*/
    /*                                                              */
    /* Function : fExtractSAP                                       */
    /*                                                              */
    /* Description    : CIN citter extraction loop                  */
    /*                                                              */
    /*--------------------------------------------------------------*/
     
    int fExtractSAP(pcErrOra, pfResult, pcDebug)
    char *pcErrOra;          /* Error message */
    FILE *pfResult;          /* Id of result file */
    char *pcDebug;           /* Debug variable */
     
    {
    int iRangInv;
    int iErr = 0;
     
    int bTrouve = 0;
     
    RECORD sRecord;
    SAP *psSAP;
     
    long iLine = 0;
    long iLineCurrent = 0;
    long iLineBefore = 0;
     
    time_t sDate;
     
    EXEC SQL WHENEVER SQLERROR GOTO ERR;
    EXEC SQL WHENEVER NOTFOUND CONTINUE;
     
    /* Cursor SS10_SAP */
    EXEC SQL DECLARE CursSAP CURSOR FOR
       SELECT a.C_PROG_M58,
              a.C_MSN_RNK_M58,
              a.C_THIRD,
              b.C_COAC_CUST_RNK,
              b.C_COAC_RANK_CNT,
              a.M_MODEL_AIPL,
              a.C_SER_RNK_M210,
              a.C_INDVAR_RNK_M210,
              a.C_STD_RNK_M56,
              a.C_VERSION_RNK_M106,
              a.C_CUSTAC_RNK_M102,
              TO_CHAR(a.D_STATION_40, 'YYYY-MM-DD'),
              TO_CHAR(a.D_FIRST_FLIGHT, 'YYYY-MM-DD'),
              TO_CHAR(a.D_IND_DEL, 'YYYY-MM-DD'),
              TO_CHAR(a.D_CUST_ACCEPT, 'YYYY-MM-DD'),
              a.C_ENG,
              TO_CHAR(a.D_COAC_TRANSF_TITL, 'YYYY-MM-DD'),
              TO_CHAR(a.D_COAC_DELI, 'YYYY-MM-DD'),
              a.M_PROJ_SER,
              a.C_COAC
       FROM   SS10_AC_CONTRACTUAL a, SS10_COAC b
       WHERE  a.C_PROG_M58 IS NOT NULL
       AND    a.C_MSN_RNK_M58 IS NOT NULL
       AND    a.D_COAC_CANC IS NULL
       AND    b.C_COAC = a.C_COAC
       ORDER BY a.C_PROG_M58, a.C_MSN_RNK_M58;
     
    /*=========================================================================*/
    /*=             FILL RECORD SAP                                           =*/
    /*=========================================================================*/
     
    psSAP = (SAP *) &sRecord;
     
    memset(&sRecord, ' ', sizeof(RECORD));
     
    EXEC SQL OPEN CursSAP;
     
    if(pcDebug){
       time(&sDate);
       printf("=>Entre dans la boucle SAP at %s", ctime(&sDate));
       }
     
    iLineCurrent = kiNB_LINES;
     
    while(iLineCurrent == kiNB_LINES)
       {
       EXEC SQL FETCH CursSAP INTO
                    :hvPGM:ind_PGM,
                    :hvMSN:ind_MSN,
                    :hvCUST:ind_CUST,
                    :hvCUST_RNK:ind_CUST_RNK,
                    :hvCONT_RNK:ind_CONT_RNK,
                    :hvMODEL:ind_MODEL,
                    :hvSERRNK:ind_SERRNK,
                    :hvINDVAR:ind_INDVAR,
                    :hvSTD_RNK:ind_STD_RNK,
                    :hvVERS_CUST:ind_VERS_CUST,
                    :hvVERS_RNK:ind_VERS_RNK,
                    :hvDSTATION40:ind_DSTATION40,
                    :hvDTHFF:ind_DTHFF,
                    :hvDINDUST:ind_DINDUST,
                    :hvDCUSACC:ind_DCUSACC,
                    :hvENGTYPE:ind_ENGTYPE,
                    :hvACTLIV:ind_ACTLIV,
                    :hvACDLIV:ind_ACDLIV,
                    :hvM_PROJ_SER:ind_M_PROJ_SER,
                    :hvC_COAC:ind_C_COAC;
     
       /* Init Var */
       iLineCurrent = sqlca.sqlerrd[2] - iLineBefore;
       iLineBefore = sqlca.sqlerrd[2];
       iLine = 0;
     
       while(iLine < iLineCurrent)
          {
          /* Initialization of loop dependant fields whith blanks */
          memset(&sRecord.DATA_RCD, ' ', sizeof(sRecord.DATA_RCD));
     
          SETHV(PGM_current, GETHV(PGM[iLine]));
          SETHV(MSN_current, GETHV(MSN[iLine]));
          SETHV(M_PROJ_SER_current, GETHV(M_PROJ_SER[iLine]));
          SETHV(C_COAC_current, GETHV(C_COAC[iLine]));
          SETHV(MODEL_current, GETHV(MODEL[iLine]));
          SETHV(SERRNK_current, GETHV(SERRNK[iLine]));
     
          SETHV(DFOKKER, "");
          SETHV(DALENIA, "");
          SETHV(DENGINE, "");
          SETHV(DNACELLE, "");
          SETHV(LMODEL, "");
          SETHV(SERNAM, "");
          SETHV(VERBASE, "");
          SETHV(BATCH, "");
     
          /*--- PROJ info ---*/
          EXEC SQL SELECT L_PROJ_NAM
                   INTO   :hvVERBASE:ind_VERBASE
                   FROM   SS10_PROJ
                   WHERE  C_PROJ = :hvM_PROJ_SER_current:ind_M_PROJ_SER_current;
     
          /*--- AIPL info ---*/
          EXEC SQL SELECT C_AIPL_BTCH_P
                   INTO   :hvBATCH:ind_BATCH
                   FROM   SS10_AIPL
                   WHERE  C_AIPL_HIST = 'N'
                   AND    M_COAC_AIPL = :hvC_COAC_current:ind_C_COAC_current;
     
          /*--- MODEL info ---*/
          EXEC SQL SELECT L_MODEL
                   INTO   :hvLMODEL:ind_LMODEL
                   FROM    SS10_MODEL
                   WHERE   C_MODEL = :hvMODEL_current:ind_MODEL_current;
     
          /*--- SER info ---*/
          EXEC SQL SELECT C_SER_CODE_2
                   INTO   :hvSERNAM:ind_SERNAM
                   FROM   SS10_SER
                   WHERE  C_PROG = :hvPGM_current:ind_PGM_current
                   AND    C_SER_RNK = :hvSERRNK_current:ind_SERRNK_current;
     
          /*--- Calcul PLANNING EVENTS DATES ---*/
          if((iErr = fPlanningEvents(pcErrOra) != 0)) return (iErr);
     
          /* Fokker */
          bTrouve = 0;
          if (hvM_PROJ_SER[iLine].arr[0] == 'A' || 
              hvM_PROJ_SER[iLine].arr[0] == 'B' ||
              hvM_PROJ_SER[iLine].arr[0] == 'C')
             {
             fREAD_PLAN_EVENT(ACHV, "TR-FokkerTLS", FOKKER, "ENTR");
             if(!bTrouve)
                {
                fREAD_PLAN_EVENT(FIX, "TR-FokkerTLS", FOKKER, "ENTR");
                }
             if(!bTrouve)
                {
                fREAD_PLAN_EVENT(THEO, "TR-FokkerTLS", FOKKER, "ENTR");
                }
             }
     
          /* Section 14A availability planning event */
          bTrouve = 0;
          if (hvM_PROJ_SER[iLine].arr[0] == 'D' || 
              hvM_PROJ_SER[iLine].arr[0] == 'E' ||
              hvM_PROJ_SER[iLine].arr[0] == 'J')
             {
             fREAD_PLAN_EVENT(ACHV, "AV-S14A", ALENIA, "ENTR");
             if(!bTrouve)
                {
                fREAD_PLAN_EVENT(FIX, "AV-S14A", ALENIA, "ENTR");
                }
             if(!bTrouve)
                {
                fREAD_PLAN_EVENT(THEO, "AV-S14A", ALENIA, "ENTR");
                }
             }
     
          /* Engine Availability planning event */
          bTrouve = 0;
          if (hvM_PROJ_SER[iLine].arr[0] == 'D' || 
              hvM_PROJ_SER[iLine].arr[0] == 'E' ||
              hvM_PROJ_SER[iLine].arr[0] == 'J')
             {
             fREAD_PLAN_EVENT(ACHV, "EngineAvail", ENGINE, "ENTR");
             if(!bTrouve)
                {
                fREAD_PLAN_EVENT(FIX, "EngineAvail", ENGINE, "ENTR");
                }
             if(!bTrouve)
                {
                fREAD_PLAN_EVENT(THEO, "EngineAvail", ENGINE, "ENTR");
                }
             }
     
          /* Propulsion system availability planning event */
          bTrouve = 0;
          fREAD_PLAN_EVENT(ACHV, "AV-PropSystm", NACELLE, "ENTR");
          if(!bTrouve)
             {
             fREAD_PLAN_EVENT(FIX, "AV-PropSystm", NACELLE, "ENTR");
             }
          if(!bTrouve)
             {
             fREAD_PLAN_EVENT(THEO, "AV-PropSystm", NACELLE, "ENTR");
             }
     
          /* Writing Data */
          FILL_RECORD(SAP, PGM, "%-*.*s", GETHV(PGM[iLine]));
          FILL_RECORD(SAP, MSN, "%-*.*s", GETHV(MSN[iLine]));
          FILL_RECORD(SAP, CUST, "%-*.*s", GETHV(CUST[iLine]));
          FILL_RECORD(SAP, CUST_RNK, "%-*.*s", GETHV(CUST_RNK[iLine]));
          FILL_RECORD(SAP, CONT_RNK, "%-*.*s", GETHV(CONT_RNK[iLine]));
          FILL_RECORD(SAP, MODEL, "%-*.*s", GETHV(MODEL[iLine]));
          FILL_RECORD(SAP, LMODEL, "%-*.*s", GETHV(LMODEL));
          FILL_RECORD(SAP, SERRNK, "%-*.*s", GETHV(SERRNK[iLine]));
          FILL_RECORD(SAP, SERNAM, "%-*.*s", GETHV(SERNAM));
          FILL_RECORD(SAP, INDVAR, "%-*.*s", GETHV(INDVAR[iLine]));
          FILL_RECORD(SAP, VERBASE, "%-*.*s", GETHV(VERBASE));
          FILL_RECORD(SAP, STD_RNK, "%-*.*s", GETHV(STD_RNK[iLine]));
          FILL_RECORD(SAP, VERS_CUST, "%-*.*s", GETHV(VERS_CUST[iLine]));
          FILL_RECORD(SAP, VERS_RNK, "%-*.*s", GETHV(VERS_RNK[iLine]));
          FILL_RECORD(SAP, DFOKKER, "%-*.*s", GETHV(DFOKKER));
          FILL_RECORD(SAP, DSTATION40, "%-*.*s", GETHV(DSTATION40[iLine]));
          FILL_RECORD(SAP, DALENIA, "%-*.*s", GETHV(DALENIA));
          FILL_RECORD(SAP, DTHFF, "%-*.*s", GETHV(DTHFF[iLine]));
          FILL_RECORD(SAP, DINDUST, "%-*.*s", GETHV(DINDUST[iLine]));
          FILL_RECORD(SAP, DCUSACC, "%-*.*s", GETHV(DCUSACC[iLine]));
          FILL_RECORD(SAP, DENGINE, "%-*.*s", GETHV(DENGINE));
          FILL_RECORD(SAP, DNACELLE, "%-*.*s", GETHV(DNACELLE));
          FILL_RECORD(SAP, ENGTYPE, "%-*.*s", GETHV(ENGTYPE[iLine]));
          FILL_RECORD(SAP, ACTLIV, "%-*.*s", GETHV(ACTLIV[iLine]));
          FILL_RECORD(SAP, ACDLIV, "%-*.*s", GETHV(ACDLIV[iLine]));
          FILL_RECORD(SAP, ACSTAT, "%-*.*s", "");
          FILL_RECORD(SAP, BATCH, "%-*.*s", GETHV(BATCH));
     
          fprintf(pfResult, "%-*.*s\n", sizeof(RECORD), sizeof(RECORD),
                                                 (char *) &sRecord);
          fflush(pfResult);
     
          iLine++;
          }
       if(pcDebug){
          printf("=>%.10d\r", iLineBefore);
          fflush(stdout);
          }
       }
    if(pcDebug) printf("=>%.10d\n", iLineBefore);
     
    if(pcDebug){
       time(&sDate);
       printf("=>Sortie boucle CIN        at %s", ctime(&sDate));
       }
     
    EXEC SQL CLOSE CursSAP;
     
    return (0);
     
    ERR:
       if(sqlca.sqlcode != 1403)       /* Not found */
          {
          sprintf(pcErrOra, "%*s %s", sqlca.sqlerrm.sqlerrml,
                                      sqlca.sqlerrm.sqlerrmc,
                                      "(fExtractSAP)");
          return(sqlca.sqlcode);
          }
       else return (0);
    }
    ce qui est intéressant serait ces deux parties-là...

    Partie 1 : au début lors des déclaration de variable c'est ici qu'on appelle la fonction qui semble poser pb, à savoir
    fSetHv
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    /*------------------------------------------------*/
    /* Macro for finding date plan event              */
    /*                                                */
    /* - APC restriction Table name where the select  */
    /*   has been perform                             */
    /* - Planning event code wanted                   */
    /* - Local Host variable restriction name         */
    /* - Code Table                                   */
    /* - Date type (ENTR : entry or DELI : delivery)  */
    /*------------------------------------------------*/
    #define fREAD_PLAN_EVENT(Table, CodePlan, Var, Type) \
       {\
       int bFound = 0;\
       int iRang = 0;\
       for(iRang = 0; iRang < kiNBR_PLANEVENTS; iRang++) \
          {\
          if(ind_C_PLAN_EVENT_##Table[iRang] != -1 &&\
             strncmp((char *)hvC_PLAN_EVENT_##Table[iRang].arr, CodePlan, hvC_PLAN_EVENT_##Table[iRang].len) == 0)\
             {\
             bTrouve = 1;\
             bFound = 1;\
             break;\
             }\
          }\
    \
       if(bFound)\
          {\
          if(strcmp(Type, "ENTR") == 0)\
             fSetHv(&hvD##Var, &ind_D##Var,\
                    fGetHv(&hvD_ENTR_##Table[iRang], &ind_D_ENTR_##Table[iRang]));\
          else\
             fSetHv(&hvD##Var, &ind_D##Var,\
                    fGetHv(&hvD_DELI_##Table[iRang], &ind_D_DELI_##Table[iRang]));\
          }\
       }
    Partie 2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
          /* Fokker */
          bTrouve = 0;
          if (hvM_PROJ_SER[iLine].arr[0] == 'A' || 
              hvM_PROJ_SER[iLine].arr[0] == 'B' ||
              hvM_PROJ_SER[iLine].arr[0] == 'C')
             {
             fREAD_PLAN_EVENT(ACHV, "TR-FokkerTLS", FOKKER, "ENTR");
             if(!bTrouve)
                {
                fREAD_PLAN_EVENT(FIX, "TR-FokkerTLS", FOKKER, "ENTR");
                }
             if(!bTrouve)
                {
                fREAD_PLAN_EVENT(THEO, "TR-FokkerTLS", FOKKER, "ENTR");
                }
             }

    prenons la variable nommée
    FOKKER
    c'est là qu'on fait appel à la fonction
    fREAD_PLAN_EVENT
    du début qui à son tour appelle celle qui nous intéresse, à savoir
    fSetHv
    le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fREAD_PLAN_EVENT(ACHV, "TR-FokkerTLS", FOKKER, "ENTR");
    FOKKER est donc le 3ème paramètre de la fonction fREAD_PLAN_EVENT (donc c'est "Var") qui semble correspondre au paramètre
    phvHvName
    de la fonction fSetHv (celui qui est défini en tant que VARCHAR)

    -->mais comment savoir si c'est du 64 bits ???

    Et voilà comment on fait le post le + casse-tête du forum ;-)

    Merci à tous ceux qui auront eu le courage de lire ça

    biz

Discussions similaires

  1. Erreur (segmentation fault) dans une fonction
    Par med1001 dans le forum C
    Réponses: 2
    Dernier message: 16/04/2012, 09h47
  2. Réponses: 1
    Dernier message: 10/06/2011, 10h13
  3. Réponses: 3
    Dernier message: 21/01/2008, 14h38
  4. Réponses: 13
    Dernier message: 13/07/2004, 15h41
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 13h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo