Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

demande au Christian ASTOR

20 réponses
Avatar
programmation
Bonsoir,

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

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


J'ai remarqu=E9 que votre solution marche sur des exemples et non sur
d'autres.
en cas o=F9 la solution ne me donne pas le bon r=E9sultat il y a une
exception dans l'ex=E9cution.

Lorsque je fais le d=E9boguer, j'obtiens:


Windows a d=E9clench=E9 un point d'arr=EAt dans sup_col.exe.

Cela peut =EAtre d=FB =E0 une d=E9faillance du tas qui indique un bogue dan=
s
sup_col.exe ou l'une des DLL charg=E9es.

Cela peut =E9galement =EAtre d=FB =E0 l'appui sur la touche F12 lorsque
sup_col.exe a le focus

La fen=EAtre Sortie peut contenir des informations de diagnostic
suppl=E9mentaires.


Voici le contenu de feutre de sortie:


'sup_col.exe' : Charg=E9 'C:\sup_col\Debug\sup_col.exe', Les symboles
ont =E9t=E9 charg=E9s.
'sup_col.exe' : Charg=E9 'C:\WINDOWS\system32\ntdll.dll'
'sup_col.exe' : Charg=E9 'C:\WINDOWS\system32\kernel32.dll'
'sup_col.exe' : Charg=E9 'C:\WINDOWS\WinSxS
\x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-
ww_597c3456\msvcr90d.dll', Les symboles ont =E9t=E9 charg=E9s.
'sup_col.exe' : Charg=E9 'C:\Program Files\SuperCopier2\SC2Hook.dll', Le
fichier binaire n'a pas =E9t=E9 g=E9n=E9r=E9 avec les informations de d=E9b=
ogage.
'sup_col.exe' : Charg=E9 'C:\WINDOWS\system32\user32.dll'
'sup_col.exe' : Charg=E9 'C:\WINDOWS\system32\gdi32.dll'
'sup_col.exe' : Charg=E9 'C:\WINDOWS\system32\advapi32.dll'
'sup_col.exe' : Charg=E9 'C:\WINDOWS\system32\rpcrt4.dll'
'sup_col.exe' : Charg=E9 'C:\WINDOWS\system32\oleaut32.dll'
'sup_col.exe' : Charg=E9 'C:\WINDOWS\system32\msvcrt.dll'
'sup_col.exe' : Charg=E9 'C:\WINDOWS\system32\ole32.dll'
'sup_col.exe' : Charg=E9 'C:\WINDOWS\system32\imm32.dll'
'sup_col.exe' : Charg=E9 'C:\WINDOWS\system32\lpk.dll'
'sup_col.exe' : Charg=E9 'C:\WINDOWS\system32\usp10.dll'
HEAP[sup_col.exe]: Heap block at 00332AF0 modified at 00332CB0 past
requested size of 1b4
Windows a d=E9clench=E9 un point d'arr=EAt dans sup_col.exe.

Cela peut =EAtre d=FB =E0 une d=E9faillance du tas qui indique un bogue dan=
s
sup_col.exe ou l'une des DLL charg=E9es.

Cela peut =E9galement =EAtre d=FB =E0 l'appui sur la touche F12 lorsque
sup_col.exe a le focus

La fen=EAtre Sortie peut contenir des informations de diagnostic
suppl=E9mentaires.
HEAP[sup_col.exe]: Invalid Address specified to RtlValidateHeap
( 00330000, 00332AF8 )
Windows a d=E9clench=E9 un point d'arr=EAt dans sup_col.exe.

Cela peut =EAtre d=FB =E0 une d=E9faillance du tas qui indique un bogue dan=
s
sup_col.exe ou l'une des DLL charg=E9es.

Cela peut =E9galement =EAtre d=FB =E0 l'appui sur la touche F12 lorsque
sup_col.exe a le focus

La fen=EAtre Sortie peut contenir des informations de diagnostic
suppl=E9mentaires.
'sup_col.exe' : Charg=E9 'C:\WINDOWS\system32\uxtheme.dll'
'sup_col.exe' : Charg=E9 'C:\WINDOWS\system32\MSCTF.dll'
'sup_col.exe' : Charg=E9 'C:\WINDOWS\system32\version.dll'
'sup_col.exe' : D=E9charg=E9 'C:\WINDOWS\system32\version.dll'
'sup_col.exe' : Charg=E9 'C:\WINDOWS\system32\MSCTFIME.IME'


Que proposez vous ?

Merci.

10 réponses

1 2
Avatar
Christian ASTOR
On 26 sep, 20:49, programmation wrote:

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, ..)
Avatar
programmation
On 27 sep, 05:19, Christian ASTOR wrote:
On 26 sep, 20:49, programmation wrote:

> 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 <stdio.h>
#include <string.h>
#include <stdlib.h>


#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.
Avatar
Christian ASTOR
On 27 sep, 09:52, programmation wrote:

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...
Avatar
programmation
> 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.
Avatar
Christian ASTOR
On 27 sep, 15:26, programmation wrote:

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;
Avatar
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 c'est à dire vous
mettez le code complet avec les modifications que vous introduisez
pour que je puisse mieux comprendre votre idée ?


Merci.
Avatar
programmation
Bonjour,

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

Voici le code :


#include <stdio.h>
#include <string.h>
#include <stdlib.h>


#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.
Avatar
Christian ASTOR
On 27 sep, 17:12, programmation wrote:
> 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;
Avatar
programmation
> 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.
Avatar
Christian ASTOR
On 28 sep, 15:57, programmation wrote:

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
(???)
1 2