demande au Christian ASTOR

Le
programmation
Bonsoir,

j'ai besoin que 'Christian ASTOR' m'aidez dans mon problème car il
sait bien ce problème.
Voici le lien:

http://groups.google.fr/group/fr.comp.os.ms-windows.programmation/browse_th=
read/thread/a253d400f7f3286a?hl=fr#


J'ai remarqué que votre solution marche sur des exemples et non sur
d'autres.
en cas où la solution ne me donne pas le bon résultat il y a une
exception dans l'exécution.

Lorsque je fais le déboguer, j'obtiens:


Windows a déclenché un point d'arrêt dans sup_col.exe.

Cela peut être dû à une défaillance du tas qui indique un bogue dan=
s
sup_col.exe ou l'une des DLL chargées.

Cela peut également être dû à l'appui sur la touche F12 lorsque
sup_col.exe a le focus

La fenêtre Sortie peut contenir des informations de diagnostic
supplémentaires.


Voici le contenu de feutre de sortie:


'sup_col.exe' : Chargé 'C:sup_colDebugsup_col.exe', Les symboles
ont été chargés.
'sup_col.exe' : Chargé 'C:WINDOWSsystem32tdll.dll'
'sup_col.exe' : Chargé 'C:WINDOWSsystem32kernel32.dll'
'sup_col.exe' : Chargé 'C:WINDOWSWinSxS
x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-
ww_597c3456msvcr90d.dll', Les symboles ont été chargés.
'sup_col.exe' : Chargé 'C:Program FilesSuperCopier2SC2Hook.dll', Le
fichier binaire n'a pas été généré avec les informations de déb=
ogage.
'sup_col.exe' : Chargé 'C:WINDOWSsystem32user32.dll'
'sup_col.exe' : Chargé 'C:WINDOWSsystem32gdi32.dll'
'sup_col.exe' : Chargé 'C:WINDOWSsystem32advapi32.dll'
'sup_col.exe' : Chargé 'C:WINDOWSsystem32pcrt4.dll'
'sup_col.exe' : Chargé 'C:WINDOWSsystem32oleaut32.dll'
'sup_col.exe' : Chargé 'C:WINDOWSsystem32msvcrt.dll'
'sup_col.exe' : Chargé 'C:WINDOWSsystem32ole32.dll'
'sup_col.exe' : Chargé 'C:WINDOWSsystem32imm32.dll'
'sup_col.exe' : Chargé 'C:WINDOWSsystem32lpk.dll'
'sup_col.exe' : Chargé 'C:WINDOWSsystem32usp10.dll'
HEAP[sup_col.exe]: Heap block at 00332AF0 modified at 00332CB0 past
requested size of 1b4
Windows a déclenché un point d'arrêt dans sup_col.exe.

Cela peut être dû à une défaillance du tas qui indique un bogue dan=
s
sup_col.exe ou l'une des DLL chargées.

Cela peut également être dû à l'appui sur la touche F12 lorsque
sup_col.exe a le focus

La fenêtre Sortie peut contenir des informations de diagnostic
supplémentaires.
HEAP[sup_col.exe]: Invalid Address specified to RtlValidateHeap
( 00330000, 00332AF8 )
Windows a déclenché un point d'arrêt dans sup_col.exe.

Cela peut être dû à une défaillance du tas qui indique un bogue dan=
s
sup_col.exe ou l'une des DLL chargées.

Cela peut également être dû à l'appui sur la touche F12 lorsque
sup_col.exe a le focus

La fenêtre Sortie peut contenir des informations de diagnostic
supplémentaires.
'sup_col.exe' : Chargé 'C:WINDOWSsystem32uxtheme.dll'
'sup_col.exe' : Chargé 'C:WINDOWSsystem32MSCTF.dll'
'sup_col.exe' : Chargé 'C:WINDOWSsystem32version.dll'
'sup_col.exe' : Déchargé 'C:WINDOWSsystem32version.dll'
'sup_col.exe' : Chargé 'C:WINDOWSsystem32MSCTFIME.IME'


Que proposez vous ?

Merci.
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Christian ASTOR
Le #20234911
On 26 sep, 20:49, programmation
Voici le lien:
http://groups.google.fr/group/fr.comp.os.ms-windows.programmation/browse_ thread/thread/a253d400f7f3286a?hl=fr#
J'ai remarqué que votre solution marche sur des exemples et non sur
d'autres.



On ne sait pas quel code, quels exemples, etc...
Et quel que soit le cas, utiliser le deboggeur de VS (F5) en faisant
du pas à pas (F11, F10, ..) et visualisant les diverses variables
(Watch 1, ..)
programmation
Le #20235211
On 27 sep, 05:19, Christian ASTOR
On 26 sep, 20:49, programmation
> Voici le lien:
>http://groups.google.fr/group/fr.comp.os.ms-windows.programmation/bro...
> J'ai remarqué que votre solution marche sur des exemples et non sur
> d'autres.

On ne sait pas quel code, quels exemples, etc...
Et quel que soit le cas, utiliser le deboggeur de VS (F5) en faisant
du pas à pas (F11, F10, ..) et visualisant les diverses variables
(Watch 1, ..)



Bonjour,

Je vous remercie pour votre aide. et je n'oublierai pas jamais vos
conseils et vos propositions.

Comme vous savez mon projet C contient des module.
J'ai un module qui permet de faire un traitement spécial sur un
fichier. Ce traitement consiste à supprimer des lignes vides et des
colonnes vides de ce fichier.

J'ai un fichier texte bien formé contient deux champs: objet et
attribut.
tous les objets sont des entiers et tous les attributs sont de chaines
de caractères de même taille.
chaque ligne contient un objet et son attribut par exemple:

in.txt:

1 01011
2 01001
10 00011
4 01000
15 00000
6 00001


Je voudrais supprimer les 0 de même position dans chaque chaine de
caractère.
Par exemple dans notre cas, nous allons supprimer les 0 dans la
position 0 de chaque chaine car dans cette position nous avons toutes
les chaines sont à 0 et aussi supprimer les 0 dans la position 2 de
chaque chaine car dans cette position nous avons toutes les chaines
sont à 0.
De plus, l faut aussi supprimer des lignes où l'objet possède un
attribut vide (chaine de caractère toute à 0)

le résultat souhaité obtenu est un fichier 'out.txt' :

1 111
2 101
10 011
4 100
6 001



De plus à part ce fichier résultat, j'ai besoin de sauvegarder dans un
fichier par exemple les positions 0 et 2 qui sont les positions de
suppression car j'ai besoin de cette information.
Dans notre cas nous obtenons le fichier 'position.txt':

0
2

Voici le code de la solution :

#include #include #include

#define MAXLINE 1024
#define STEP 10

typedef struct dataStruct
{
int sNum;
char sAttrib[32];
int nombre;

} dataStruct;


int main()
{


FILE *pFile, *pFileOut,*pCol;
char sLine[MAXLINE];
int i,j,h=0,k=0,nColumn[32] = {0}, nCpt = 0, nAttribLength= 0 ,
nMaxAttribLength = 0;
int dataTabStringMax = STEP;
int nShift = 0;
int nbO=0;
dataStruct *dataTabString;
pFile = fopen("in.txt","r");
pFileOut = fopen("out.txt","w+");
pCol = fopen("position.txt","w+");

if (pFile && pFileOut)
{
dataTabString = (dataStruct *) malloc(dataTabStringMax
* sizeof(dataStruct));
fgets(sLine, MAXLINE, pFile);
//sscanf(sLine,"%s%s",dataTabString[nCpt].sNum,dataTabString
[nCpt].sAttrib);
sscanf(sLine,"%d%s",&dataTabString[nCpt].sNum,dataTabString
[nCpt].sAttrib);
nAttribLength = strlen(dataTabString[nCpt].sAttrib);
printf("%d %s :%dn",dataTabString[nCpt].sNum,dataTabString
[nCpt].sAttrib,nAttribLength);
rewind(pFile);
while (fgets(sLine, MAXLINE, pFile))
k++;
printf("%dn",k);
rewind(pFile);
while (fgets(sLine, MAXLINE, pFile))
{

sscanf(sLine,"%d%s",&dataTabString
[nCpt].sNum,dataTabString[nCpt].sAttrib);
nAttribLength = strlen(dataTabString[nCpt].sAttrib)+ 1;

if (nAttribLength>0)
{

sscanf(sLine,"%d%s",&dataTabString[nCpt].sNum,dataTabString
[nCpt].sAttrib);
for (i = 0; i<nAttribLength; i++)
{
if (dataTabString->sAttrib[i]
== '0')
nColumn[i]+=1;
}
nCpt+=1;
if (nAttribLength > nMaxAttribLength)
nMaxAttribLength =
nAttribLength;
}
if (nCpt == dataTabStringMax)
{
dataTabStringMax += STEP;
dataTabString = (dataStruct *) realloc
(dataTabString,
dataTabStringMax * sizeof
(dataStruct));
if (dataTabString == NULL)
exit(1);
}
}



// Lecture tableau de structures pour supprimer les
"0"
for (j = 0; j<nCpt; j++)
{
//int nShift = 0;
nShift = 0;
for (i = 0; i<nMaxAttribLength; i++)
{
if (nColumn[i] == nCpt)
{
memmove(&dataTabString
[j].sAttrib[i-nShift], &dataTabString[j].sAttrib[i-nShift+1], strlen
(&dataTabString[j].sAttrib[i-nShift+1]) + 1);
nShift+=1;
if (j == 0)
{
printf("pos = %dn",i);
fprintf(pCol,"%dn",i);
}
}
}
if (strcspn (dataTabString[j].sAttrib, "1")
<strlen(dataTabString[j].sAttrib))

{
fprintf(pFileOut, "%d %sn", dataTabString[j].sNum,dataTabString
[j].sAttrib);

nbO++;

}
}

free(dataTabString);

}



fclose(pFileOut);
fclose(pCol);
fclose(pFile);

return 0;
}


Cette solution marche sur beaucoup des exemples.
Mais sur l'exemple suivant l'exécution ne passe pas bien comme c'est
décrite au dessus.
c'est exemple de fichier 'in.txt' est :
1 01011
2 01001
3 00011
4 01000
5 00000
6 00001

le programme m'affiche sur l'écran:

1 01011 : 5
7
pos = 0
pos = 2
pos = 34

puis il stoppe l'exécution.

si vous remarquez ce programme lit la première ligne de fichier
'in.txt'
1 01011 puis il affiche 5 qui est le nombre de caractère formant la
chaine "01011 "
ensuite 7 pour dire le nombre des lignes de fichier or ceci n'est pas
juste car on a 6 et n'est pas 7.

et par la suite le programme affichage les positions des colonnes
supprimées
la position 0 et 2 sont justes mais 34 est faut et je ne sais pas
comment il a affiché 34.

on a seulement des colonnes à supprimées sont à la position 0 et 2 .

J'ai remarqué que ce programme marche sur des exemples et non sur
autres. je ne sais pourquoi malgré tous les exemples ont le même
format.
Je crois que nous avons bien libérer l'espace mémoire louée .

S'il vous plait, j'ai besoin de votre aide car le reste de mon travail
se base sur cette solution.

Merci.
Christian ASTOR
Le #20235641
On 27 sep, 09:52, programmation
S'il vous plait, j'ai besoin de votre aide car le reste de mon travail
se base sur cette solution.



Mais pourquoi ne débugges-tu pas pas-à-pas ?!
On ne programme jamais sans débugger !
Tu vois immédiatement l'erreur : le fichier a 2 lignes vide à la fin,
d'où 7 lignes, et tu ne fermes pas sAttrib, d'où une valeur bidon pour
nAttribLength...
programmation
Le #20236611
> Tu vois immédiatement l'erreur : le fichier a 2 lignes vide à la fin,
d'où 7 lignes,


le fichier contient 6 lignes et le curseur est à la fin de dernier
ligne de fichier.
Avec quel format de fichier utilisé pour le test c'est à dire le
premier champ sur combien de caractère de même le deuxième champ ? Es t
ce que les deux champs sont séparées par un seul espace ?


et tu ne fermes pas sAttrib, d'où une valeur bidon pour
nAttribLength...



Où exactement dans le code que je dois fermer 'sAtirib' ?


Est ce que le code en dessus est complète et valable pour tous les
cas c'est il n ' y pas des cas spéciales à vérifier ?


Merci.
Christian ASTOR
Le #20236871
On 27 sep, 15:26, programmation
le fichier contient 6 lignes et le curseur est à la fin de dernier
ligne de fichier.



S'il affiche k = 7, c'est qu'il passe 7 fois
Mets un Break sur while (fgets(sLine, MAXLINE, pFile))
et tu regardes les variables (sLine notamment)

Où exactement dans le code que je dois fermer 'sAtirib' ?



Avant que nAttribLength soit renseigné forcément...
Ou alors tu initialises avant ton sscanf() par
memset(&dataTabString[nCpt], 0, sizeof(dataStruct));
et tu testes si sAttrib a été rempli pour calculer nAttribLength :
if (strlen(dataTabString[nCpt].sAttrib) > 0)
nAttribLength = strlen(dataTabString[nCpt].sAttrib)+ 1;
programmation
Le #20237001
> Avant que nAttribLength soit renseigné forcément...
Ou alors tu initialises avant ton sscanf() par
memset(&dataTabString[nCpt], 0, sizeof(dataStruct));
et tu testes si sAttrib a été rempli pour calculer nAttribLength :
if (strlen(dataTabString[nCpt].sAttrib) > 0)
        nAttribLength = strlen(dataTabString[nCpt].sAttrib)+ 1;



S'il vous plait, pouvez vous mettre les modifications à faire
directement dans le code qui j'ai posé au dessus c'est à dire vous
mettez le code complet avec les modifications que vous introduisez
pour que je puisse mieux comprendre votre idée ?


Merci.
programmation
Le #20242551
Bonjour,

Quelles sont les modifications à faire dans le code suivant pour
obtenir le bon résultat ?

Voici le code :


#include #include #include

#define MAXLINE 1024
#define STEP 10

typedef struct dataStruct
{
int sNum;
char sAttrib[32];
int nombre;

} dataStruct;


int main()
{

FILE *pFile, *pFileOut,*pCol;
char sLine[MAXLINE];
int i,j,h=0,k=0,nColumn[32] = {0}, nCpt = 0, nAttribLength= 0 ,
nMaxAttribLength = 0;
int dataTabStringMax = STEP;
int nShift = 0;
int nbO=0;
dataStruct *dataTabString;
pFile = fopen("in.txt","r");
pFileOut = fopen("out.txt","w+");
pCol = fopen("position.txt","w+");

if (pFile && pFileOut)
{
dataTabString = (dataStruct *) malloc(dataTabStringMax
* sizeof(dataStruct));
fgets(sLine, MAXLINE, pFile);
sscanf(sLine,"%d%s",&dataTabString[nCpt].sNum,dataTabString
[nCpt].sAttrib);
nAttribLength = strlen(dataTabString[nCpt].sAttrib);
printf("%d %s :%dn",dataTabString[nCpt].sNum,dataTabString
[nCpt].sAttrib,nAttribLength);
rewind(pFile);
while (fgets(sLine, MAXLINE, pFile))
k++;
printf("%dn",k);
rewind(pFile);
while (fgets(sLine, MAXLINE, pFile))
{

sscanf(sLine,"%d%s",&dataTabString
[nCpt].sNum,dataTabString[nCpt].sAttrib);
nAttribLength = strlen(dataTabString[nCpt].sAttrib)+ 1;

if (nAttribLength>0)
{

sscanf(sLine,"%d%s",&dataTabString[nCpt].sNum,dataTabString
[nCpt].sAttrib);
for (i = 0; i<nAttribLength; i++)
{
if (dataTabString->sAttrib[i]
== '0')
nColumn[i]+=1;
}
nCpt+=1;
if (nAttribLength > nMaxAttribLength)
nMaxAttribLength =
nAttribLength;
}
if (nCpt == dataTabStringMax)
{
dataTabStringMax += STEP;
dataTabString = (dataStruct *) realloc
(dataTabString,
dataTabStringMax * sizeof
(dataStruct));
if (dataTabString == NULL)
exit(1);
}
}



// Lecture tableau de structures pour supprimer les
"0"
for (j = 0; j<nCpt; j++)
{
//int nShift = 0;
nShift = 0;
for (i = 0; i<nMaxAttribLength; i++)
{
if (nColumn[i] == nCpt)
{
memmove(&dataTabString
[j].sAttrib[i-nShift], &dataTabString[j].sAttrib[i-nShift+1], strlen
(&dataTabString[j].sAttrib[i-nShift+1]) + 1);
nShift+=1;
if (j == 0)
{
printf("pos = %dn",i);
fprintf(pCol,"%dn",i);
}
}
}
if (strcspn (dataTabString[j].sAttrib, "1")
<strlen(dataTabString[j].sAttrib))

{
fprintf(pFileOut, "%d %sn", dataTabString[j].sNum,dataTabString
[j].sAttrib);

nbO++;

}
}

free(dataTabString);

}



fclose(pFileOut);
fclose(pCol);
fclose(pFile);

return 0;
}



Que proposez vous ?

Merci.
Christian ASTOR
Le #20243261
On 27 sep, 17:12, programmation
> Avant que nAttribLength soit renseigné forcément...
> Ou alors tu initialises avant ton sscanf() par
> memset(&dataTabString[nCpt], 0, sizeof(dataStruct));
> et tu testes si sAttrib a été rempli pour calculer nAttribLength :
> if (strlen(dataTabString[nCpt].sAttrib) > 0)
>         nAttribLength = strlen(dataTabString[nCpt].sAttrib)+ 1;

S'il vous plait, pouvez vous mettre les modifications à faire
directement dans le code qui j'ai posé au dessus



Ce que j'ai dit (c'est juste une soluton parmi d'autres...):
- avant ton sscanf() :
memset(&dataTabString[nCpt], 0, sizeof(dataStruct));
- et rajouter le test :
if (strlen(dataTabString[nCpt].sAttrib) > 0)
nAttribLength = strlen(dataTabString[nCpt].sAttrib)+ 1;
programmation
Le #20244051
> Ce que j'ai dit (c'est juste une soluton parmi d'autres...):
- avant ton sscanf() :
memset(&dataTabString[nCpt], 0, sizeof(dataStruct));
- et rajouter le test :
if (strlen(dataTabString[nCpt].sAttrib) > 0)
  nAttribLength = strlen(dataTabString[nCpt].sAttrib)+ 1;



il y a beaucoup des 'scanf' dans le code où je vais ajouter 'memset
(&dataTabString[nCpt], 0, sizeof(dataStruct));'

De plus où on ajoute exactement dans le code le test suivant : ?

if (strlen(dataTabString[nCpt].sAttrib) > 0)
nAttribLength = strlen(dataTabString[nCpt].sAttrib)+ 1;

Quel est le rôle de ces deux ajouts ?

Merci.
Christian ASTOR
Le #20244921
On 28 sep, 15:57, programmation
il y a beaucoup des 'scanf' dans le code où je vais ajouter 'memset
(&dataTabString[nCpt], 0, sizeof(dataStruct));'



Forcément dans la boucle fgets(), avant de lire dataTabString, pour
initialiser dataTabString[nCpt], avant de le remplir avec sscanf(),
puisque nAttribLength a une valeur farfelue quand la ligne est vide et
que dataTabString[nCpt] n'est pas initialisé...

De plus où on ajoute exactement dans le code le test suivant : ?
if (strlen(dataTabString[nCpt].sAttrib) > 0)
  nAttribLength = strlen(dataTabString[nCpt].sAttrib)+ 1;



Tu as :
nAttribLength = strlen(dataTabString[nCpt].sAttrib)+ 1;
Où veux-tu rajouter le test sur cette ligne ailleurs qu'à cette ligne
(???)
Publicité
Poster une réponse
Anonyme