Précédent   Forum du club des développeurs et IT Pro > Général Développement > Programmation système > Embarqué
Embarqué Forum d'entraide sur la programmation des systèmes embarqués
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 28/08/2012, 08h24   #1
megamario
Membre actif
 
Avatar de megamario
 
Homme
VB6/VB.net/C/C++/C#
Inscription : septembre 2008
Messages : 551
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France, Indre et Loire (Centre)

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

Informations forums :
Inscription : septembre 2008
Messages : 551
Points : 176
Points : 176
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
megamario est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2012, 09h49   #2
Bktero
Expert Confirmé Sénior
 
Avatar de Bktero
 
Ingénieur systèmes embarqués
Inscription : juin 2009
Messages : 1 694
Détails du profil
Informations personnelles :
Âge : 25
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 : 1 694
Points : 4 130
Points : 4 130
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 renseigner 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é !
Bktero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2012, 10h40   #3
megamario
Membre actif
 
Avatar de megamario
 
Homme
VB6/VB.net/C/C++/C#
Inscription : septembre 2008
Messages : 551
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France, Indre et Loire (Centre)

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

Informations forums :
Inscription : septembre 2008
Messages : 551
Points : 176
Points : 176
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.
megamario est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2012, 11h01   #4
Bktero
Expert Confirmé Sénior
 
Avatar de Bktero
 
Ingénieur systèmes embarqués
Inscription : juin 2009
Messages : 1 694
Détails du profil
Informations personnelles :
Âge : 25
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 : 1 694
Points : 4 130
Points : 4 130
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 renseigner 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é !
Bktero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2012, 11h15   #5
megamario
Membre actif
 
Avatar de megamario
 
Homme
VB6/VB.net/C/C++/C#
Inscription : septembre 2008
Messages : 551
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France, Indre et Loire (Centre)

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

Informations forums :
Inscription : septembre 2008
Messages : 551
Points : 176
Points : 176
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;
	}

	
}
megamario est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2012, 14h30   #6
Bktero
Expert Confirmé Sénior
 
Avatar de Bktero
 
Ingénieur systèmes embarqués
Inscription : juin 2009
Messages : 1 694
Détails du profil
Informations personnelles :
Âge : 25
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 : 1 694
Points : 4 130
Points : 4 130
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 renseigner 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é !
Bktero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2012, 15h02   #7
megamario
Membre actif
 
Avatar de megamario
 
Homme
VB6/VB.net/C/C++/C#
Inscription : septembre 2008
Messages : 551
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France, Indre et Loire (Centre)

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

Informations forums :
Inscription : septembre 2008
Messages : 551
Points : 176
Points : 176
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.
megamario est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2012, 15h59   #8
megamario
Membre actif
 
Avatar de megamario
 
Homme
VB6/VB.net/C/C++/C#
Inscription : septembre 2008
Messages : 551
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France, Indre et Loire (Centre)

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

Informations forums :
Inscription : septembre 2008
Messages : 551
Points : 176
Points : 176
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.
megamario est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2012, 10h58   #9
megamario
Membre actif
 
Avatar de megamario
 
Homme
VB6/VB.net/C/C++/C#
Inscription : septembre 2008
Messages : 551
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France, Indre et Loire (Centre)

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

Informations forums :
Inscription : septembre 2008
Messages : 551
Points : 176
Points : 176
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.
megamario est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 04h18.


 
 
 
 
Partenaires

Hébergement Web