+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9
  1. #1
    Membre actif Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    septembre 2008
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : septembre 2008
    Messages : 618
    Points : 187
    Points
    187

    Par défaut Crée un cache

    Bonjour,


    Je doit modifier un projet existant pour le porté sur une nouvelle plateforme. Notamment un Module DIGI Connect ME 9210. C'est un petit module Ethernet, permettant de dialoguer sur le réseaux et d’interroger notre supervision par RS232. Il dispose d'un linux embarqué. Dessus nous avons un logiciel qui tourne pour faire du Telnet, SNMP, Http etc.

    C'est ce dernier qui m'occupe. Actuellement nous lisons une page qui contient des codes sous la form ##MODULE1 // DATA/BATTERIE/3## Lorsque l'on lit ce genre de code, ont remplace ce code par la valeur correspondant que l'on interroge à la supervision à travers le RS232, et l'on renvoie la page HTML au client avec les données

    Lorsque l'on interroge par exemple l'information "BATTERIE" la supervision nous renvoie une ligne contenant plusieurs information, la tension, le courant, la température etc..

    Sur la page Html on utilise plusieurs de ces informations donc plusieurs fois le même type de code ##MODULE1 // DATA/BATTERIE/3##, ##MODULE1 // DATA/BATTERIE/4##, ##MODULE1 // DATA/BATTERIE/5##.

    Vu que l'on a récupéré la première fois toutes les informations il est inutile de rappeler la supervision, cela fait perdre du temps.

    Pour cela je doit crée un tableau servant de cache pour 16 paramètres, ce cache doit avoir une durée de 5 secondes, au delà on met à jour le cache donc ont appel de nouveau la supervision si besoin.

    Voila pour la situation.

    Je pensais donc faire un tableau de 16 lignes contenant une structure:

    Code :
    1
    2
    3
    4
    5
    6
    typedef struct sCache
    {
    Char* Commande
    Char* Reponse
    Char* Date  (pas forcement un char* d'ailleurs)
    } LeCache;
    Puis chercher, créer, effacer, modifier, comparer ce tableau. pour faire ce que je souhaite, mais cela ne fait pas longtemps que je fait de l'embarqué j'ai un peu de mal à gérer tout sa.

    Si vous avez une idée se serait sympa, je bosse tout la journée dessus voir plus si besoin. Merci

  2. #2
    Modérateur
    Avatar de Bktero
    Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    2 762
    Détails du profil
    Informations personnelles :
    Âge : 27
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2009
    Messages : 2 762
    Points : 7 393
    Points
    7 393
    Billets dans le blog
    1

    Par défaut

    Salut Megamario,

    Pour résumer, tu as 16 valeurs à mettre à jour toutes les 5 secondes. C'est la seule condition pour mettre à jour les données ? C'est automatiquement et obligatoirement toutes les 4 secondes ? Quelles sont les types de ces 16 variables ?

    Je ne comprends pas trop l'intérêt de la structure que tu as déjà fait. Pourquoi des char* ?

    Souhaites-tu aussi faire des méthodes pour la mise à jour de la structure, à la façon d'une classe ?
    Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseignez ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a

    Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

    Pour vos problèmes d'embarqué, utilisez le forum dédié !

  3. #3
    Membre actif Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    septembre 2008
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : septembre 2008
    Messages : 618
    Points : 187
    Points
    187

    Par défaut

    Citation Envoyé par Bktero Voir le message
    Salut Megamario,

    Pour résumer, tu as 16 valeurs à mettre à jour toutes les 5 secondes. C'est la seule condition pour mettre à jour les données ? C'est automatiquement et obligatoirement toutes les 4 secondes ? Quelles sont les types de ces 16 variables ?

    Je ne comprends pas trop l'intérêt de la structure que tu as déjà fait. Pourquoi des char* ?

    Souhaites-tu aussi faire des méthodes pour la mise à jour de la structure, à la façon d'une classe ?
    Bonjour,

    Alors je met à jour les valeurs uniquement lorsque j'en ai besoin et que celle déposé dans le tableau ont plus de 5 secondes.

    Lorsque je n'utilise pas le service http je ne met pas à jour ces données.

    Chronologie:

    Le client demande la page html.
    -
    Je lit ma page html et recherche les codes entre les ## .....##
    -
    Lorsque je rencontre un code je regarde dans le cache si le code existe et qu'il a moins de 5 secondes (typiquement lors de l'appel de la page html soit il n'y a rien soit il est plus vieux)
    -
    Dans le cas ou il n'y a rien ou plus vieux je demande les données à la supervision. J'entre ces données dans le cache et je rempli à la place des ## ...# la valeur recherché.

    -
    Le continu à lire le html jusqu'au nouveau code.
    -
    je regarde dans le cache s'il est présent et moins de 5 secondes.
    -
    S'il est présent je récupère la donnée associée et remplie le html avec.
    -
    etc...
    -
    Une fois le html lu et rempli je transmet au client le code hmtl modifié


    Voila j’espère que c'est plus clair;

    En ce qui concerne ma structure pour le moment elle contient donc:
    (J'ai fixé les tableau de char et la date est une variable déjà existante dans le projet)

    Char Commande[20]; -> c'est le code de commande recherché, typiquement se sera "/DATA/BATT_1/" pour interroger l'objet batterie 1

    Char Reponse[200]; -> C'est la ligne complète de réponse de la supervision, typiquement se sera /DATA/BATT_1/5448/20/21522/80/" etc...
    Dans cette ligne il est contenu toute les donner de la batterie, la tension, le courant, température, % de charge et plein d'autre truc.

    time_t Date; -> la date de l’acquisition




    le code dans la page html est de ce type

    ##MODULE1 // DATA/BATTERIE/5##

    pour
    MODULE1 ->pour indiquer la supervision utilisé (on a plusieurs modèle)
    DATA/BATTERIE/ -> le code à appeler en RS232
    5 -> La position de la donnée dans la réponse ici dans l'exemple "/DATA/BATT_1/5448/20/21522/80/ " le 5 correspond a 21522.

  4. #4
    Modérateur
    Avatar de Bktero
    Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    2 762
    Détails du profil
    Informations personnelles :
    Âge : 27
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2009
    Messages : 2 762
    Points : 7 393
    Points
    7 393
    Billets dans le blog
    1

    Par défaut

    Pour simplifier le problème, on va faire abstraction de l'histoire du HTML car elle n'apporte rien à la résolution du problème en lui-même, elle est juste utile à comprendre le contexte

    Donc :
    - le client demande des données
    - si tu as des données suffisamment jeunes, tu lui envoies
    - sinon, tu fais une acquisition, tu analyses la réponse de la supervision, tu envoies au client.

    De ce que je comprend, la périodicité n'est pas de 5 secondes obligatoirement et ce ne sera pas forcément les 16 données à chaque fois ?

    La demande des données ce fait par une commande (ex : MODULE1 // DATA/BATT_1/x ) et tu vérifies que cette commande (en enlevant le x) est présente dans ton tableau de structures correspondant à MODULE1.

    Il faut que tu sois très prudent sur la taille du buffer pour stocker la réponse, pour ne pas risquer de buffer overflow.

    Si tu dois interroger la supervision, quel est le surcout en temps ?
    Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseignez ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a

    Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

    Pour vos problèmes d'embarqué, utilisez le forum dédié !

  5. #5
    Membre actif Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    septembre 2008
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : septembre 2008
    Messages : 618
    Points : 187
    Points
    187

    Par défaut

    C'est exactement cela.

    Le temps de réponse de la supervision est de quelques milliseconde, on est limité par la RS232 et bien sur, les 2 traitements des microprocesseurs.

    Je n'est pas mesuré mais lorsque j’appelle à chaque code trouvé, la page html met quelques secondes à s'afficher car il y a plusieurs fois les même demande.
    On pourrais réduire par 4 à 5 fois le nombre de transferts RS232 à chaque rafraîchissement.

    Voila ce que j'ai fait pour le moment: (avec 20 données au lieu de 16)

    Fichier h:
    Code :
    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
    #ifndef SSCTAB_H_
    #define SSCTAB_H_
    
    #ifndef FALSE
     #define FALSE (0)
    #endif
    
    #ifndef TRUE
     #define TRUE (!FALSE)
    #endif
    
    #ifndef BOOL
     #define BOOL int
    #endif
     
     typedef struct _SSCT_internal_tag_tableCache
     {
    	 char mCode[25];
    	 char mBuff[200];
    	 time_t mTime0;
    
     }ssctab;
    
     
     void SSCT_removeAll();
    
     BOOL SSCT_add( char* pCode, char* newDatum, time_t curTime);
    #endif /* SSCTAB_H_ */
    Fichier c:
    Code :
    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
    #include "ssctab.h"
    
    ssctab TableCache[20];
    
    void SSCT_removeAll()
    {
    	int i = 0;
    	for (i = 0; i < 20; i++)
    	{
    		TableCache[i].mBuff[0] = '\0';
    		TableCache[i].mCode[0] = '\0';
    		TableCache[i].mTime0 = 0;
    	}
    }
    
    BOOL SSCT_add( char* pCode, char* newDatum,time_t curTime)
    {
    	int i;
    	int indexT; //index du tableau du code trouvé
    	int indexV; //index du tableau d'un emplacement vide
    	char T;		//Code trouvé
    	char V;		//Emplacement vide trouvé
    	
    	for (i=0; i< 20; i++)
    	{
    		if (strcmp( TableCache[i].mCode,pCode) == 0){
    			T = 1;
    			indexT = i;
    			break;
    		}
    		if (strcmp( TableCache[i].mCode,"\0") == 0){
    			V = 1;
    			indexV = i;
    		}
    	}
    		if ((T == 1) | ( V == 1))
    	{
    		if (T ==1){
    			strcpy(TableCache[indexT].mBuff, newDatum);
    			TableCache[indexT].mTime0 = curTime;
    		}else{
    			strcpy(TableCache[indexV].mCode, pCode);
    			strcpy(TableCache[indexV].mBuff, newDatum);
    
    			TableCache[indexV].mTime0 = curTime;
    		}
    		return 1;
    	}else{
    
    		return 0;
    	}
    
    	
    }

  6. #6
    Modérateur
    Avatar de Bktero
    Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    2 762
    Détails du profil
    Informations personnelles :
    Âge : 27
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2009
    Messages : 2 762
    Points : 7 393
    Points
    7 393
    Billets dans le blog
    1

    Par défaut

    Plusieurs remarques :
    1) Pour la définition du type booléen : http://c.developpez.com/faq/index.ph...ral#TYPES_bool

    2) Les variables globales sont à éviter autant que possible. Si maintenant tu veux 2 tableaux de structures (pour par exemple adresser 2 supervisions), alors tes fonctions sont à refaire. Pourquoi ne pas passer un pointeur vers le premier élément et la taille du tableau en paramètre de la fonction ?

    3) SSCT_removeAll() : pourquoi ne pas faire une fonction renvoyant une structure vide et ainsi réellement écraser chaque case du tableau ?

    4) SSCT_add() : initialise tes index à -1 et si à la fin de ta boucle ils sont à une valeur différentes, c'est qu'un index (V ou T) a été trouvé.

    5) Toujours dans la même fonction : elle est censé renvoyer un BOOL, alors retourne TRUE ou FALSE (sinon, pourquoi s'embêter à les définir ?! )

    6)
    Code :
    1
    2
    3
    4
    5
    typedef struct motCleFacultatif
    {
        int a;
        int b;
    } newType_t;
    Tu n'es pas obligé de nommer la structure pour faire un typedef : http://c.developpez.com/faq/index.ph...STRUCT_typedef. Perso, je trouve ça plus léger.
    Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseignez ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a

    Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

    Pour vos problèmes d'embarqué, utilisez le forum dédié !

  7. #7
    Membre actif Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    septembre 2008
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : septembre 2008
    Messages : 618
    Points : 187
    Points
    187

    Par défaut

    Merci pour ces infos, j'en avais déjà modifié quelque une.


    Réponse au 1)
    Pour cela j'ai gardé ce qui existait dans le code actuel, mais cela m'a surpris aussi.

    Réponse au 2)
    En ce qui concerne le type de supervision. Sa c'est pas un souci car en faite dans celle partie je ne le gère pas. D'ailleurs je n'aurais qu'un seul type à gérer a la fois. La module externe étant connecter a une seul supervision à la fois.

    C'est la partie RS232 qui s'occupe de la transmission qui gère tel ou tel type de supervision.Donc sa on peut l'oublier dans mon cas présent.

    Réponse au 3)
    Bonne idée je vais chercher comment faut faire mais j'ai une vague idée.

    Réponse au 4)
    Effectivement, j'ai déjà fait sa en plus pour d'autre projet.

    Réponse au 5)
    Sa j'ai corrigé

    Réponse au 6)
    Merci pour l'info.

    -------------------------------------
    J'ai commencé mes test mais c'est chaud de reprendre un projet en cours ou le code par dans tout les sens.

    Voici ou j'en suis (j'ai pas encore modifier suivant les indications données)
    Code C :
    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
     
     
    #include <string.h>
    #include <sys/times.h>
     
    #include "ssctab.h"
    #ifndef NULL
     #define NULL ((void POINTER_ATTR*)0)
    #endif
     
    long cacheTTL;
     
    ssctab TableCache[20];
     
     
     
     
    void SSCT_removeAll()
    {
    	int i = 0;
    	for (i = 0; i < 20; i++)
    	{
    		TableCache[i].mBuff[0] = '\0';
    		TableCache[i].mCode[0] = '\0';
    		TableCache[i].mTime0 = 0;
    	}
    }
     
    //Ajout d'une donnée s'il y a de la place ou deja existante
    BOOL SSCT_add( char* pCode, char* newDatum)
    {
    	int i;
    	int indexT; //index du tableau du code trouvé
    	int indexV; //index du tableau d'un emplacement vide
    	char T;		//Code trouvé
    	char V;		//Emplacement vide trouvé
    	time_t curTime;
    	curTime = time(NULL);
     
    	for (i=0; i< 20; i++)
    	{
    		if (strcmp( TableCache[i].mCode,pCode) == 0){
    			T = 1;
    			indexT = i;
    			break;
    		}
     
    		if (strlen(TableCache[i].mCode) == 0){
    			V = 1;
    			indexV = i;
    		}
    	}
    	if ((T == 1) | ( V == 1))
    	{
    		if (T ==1){
    			strcpy(TableCache[indexT].mBuff, newDatum);
    			TableCache[indexT].mTime0 = curTime;
    		}else{
    			strcpy(TableCache[indexV].mCode, pCode);
    			strcpy(TableCache[indexV].mBuff, newDatum);
     
    			TableCache[indexV].mTime0 = curTime;
    		}
    		return TRUE;
    	}else{
     
    		return FALSE;
    	}
    }
    //Supprime une donnee si elle est presente
    BOOL SSCT_remove(char* pCode)
    {
    	int i = 0;
    	for (i = 0; i < 20; i++)
    	{
    		if (strcmp( TableCache[i].mCode,pCode) == 0)
    		{
    			TableCache[i].mBuff[0] = '\0';
    			TableCache[i].mCode[0] = '\0';
    			TableCache[i].mTime0 = 0;
    			return TRUE;
    		}
    	}
    	return FALSE;
    }
     
    //récuperation d'une donnée si elle est pas trop ancienne
    BOOL SSCT_get(char* pCode,char* newDatum)
    {
    	int i = 0;
    	time_t curTime;
    	curTime = time(NULL);
    	for (i = 0; i < 20; i++)
    	{
    		if (strcmp( TableCache[i].mCode,pCode) == 0)
    		{
    			if (TableCache[i].mTime0 + cacheTTL < curTime )
    			{
    				strcpy(newDatum,TableCache[i].mBuff);
    				return TRUE;
    			}else{
    				return FALSE;
    			}
    		}
    	}
    	return FALSE;
     
    }
    //Suppression des données anciennes
    void SSCT_removeOld()
    {
    	int i = 0;
    	time_t curTime;
    	curTime = time(NULL);
     
    	for (i = 0; i < 20; i++)
    	{
    		if (TableCache[i].mTime0 + cacheTTL < curTime )
    		{
    			printf("SSCT_removeOld Buff - %s\n",TableCache[i].mBuff);
     
    			TableCache[i].mBuff[0] = '\0';
    			printf("SSCT_removeOld Key - %s\n",TableCache[i].mCode);
    			TableCache[i].mCode[0] = '\0';
    			TableCache[i].mTime0 = curTime;
    			printf("SSCT_removeOld - %d\n",i);
    		}
    	}
    }
     
    //Constructeur
    void SSCT_Construct(long _cacheTTL)
    {
    	cacheTTL = _cacheTTL;
    	SSCT_removeAll;
    }

    le H:
    Code C :
    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
     
     
    #ifndef SSCTAB_H_
    #define SSCTAB_H_
    #include "ncsdef.h"
     
     
    #ifndef FALSE
     #define FALSE (0)
    #endif
     
    #ifndef TRUE
     #define TRUE (!FALSE)
    #endif
     
     
    #ifndef BOOL
     #define BOOL int
    #endif
     /*
      *
     
      */
    #ifndef NB_CACHE
     #define NB_CACHE 20
    #endif
     
    typedef struct _SSCT_internal_tag_tableCache
    {
    	char mCode[25];
    	char mBuff[200];
    	time_t mTime0;
    }ssctab;
     
     
     
     /*
      *-----------------------------------------
      *  Instance declaration.
      *-----------------------------------------
      */
     
     void SSCT_removeAll();
     
     BOOL SSCT_add( char* pCode, char* newDatum);
     
     BOOL SSCT_remove(char* pCode);
     
     void SSCT_removeOld();
     
     BOOL SSCT_get(char* pCode,char* newDatum);
     
     void SSCT_Construct(long _cacheTTL);
     
    #endif /* SSCTAB_H_ */


    pour le moment il me fait un Add qu'a la fin du tableau je cherche pourquoi..

    [Edit]A si trouvé, c'est normal.

  8. #8
    Membre actif Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    septembre 2008
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : septembre 2008
    Messages : 618
    Points : 187
    Points
    187

    Par défaut

    Il m’énerve il plante, je ne sais pas pourquoi.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    BOOL SSCT_add( char* pCode, char* newDatum)
    {
    	int i;
    	int indexT; //index du tableau du code trouvé
    	int indexV; //index du tableau d'un emplacement vide
    	int T = 0;		//Code trouvé
    	int V = 0;		//Emplacement vide trouvé
    	time_t curTime;
    	curTime = time(NULL);
    	 printf("SSCT_add_Key = %s\n",pCode);
    	 printf("SSCT_add_Donnee = %s\n",newDatum);
    	 printf("Avant boucle");
    	for (i = 0; i< 20; i++)
    	{
    		printf("Dans boucle");
    		if ((strcmp( TableCache[i].mCode,pCode) == 0)&&( T == 0))
    Cela m'affiche bien ma key et ma donnée mais il plante et m'affiche pas le "Avant boucle".

    Je suppose qu'il ne doit pas y avoir le \0. je regarde sa demain.

  9. #9
    Membre actif Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    septembre 2008
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : septembre 2008
    Messages : 618
    Points : 187
    Points
    187

    Par défaut

    Bonjour,

    Bon j'avance et cela fonctionne, mais j'avais un souci avec le printf ou fprintf pour débugger.

    Lorsqu'il rencontrait le caractère 13 (CR) il retournait à la ligne en effaçant ce qu'il venait d'afficher donc rien d'afficher dans la console ou le fichier. Un peu rageant de voir que forcement mon cache fonctionnait puisqu'il ne fessait qu'une requête de la même commande, mais que rien ne s'affichait dans la console.

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •