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
programmation
Voici le code après la modification faite:

#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);
while (fgets(sLine, MAXLINE, pFile))
{

memset(&dataTabString[nCpt], 0, sizeof(dataStruct));
sscanf(sLine,"%d%s",&dataTabString[nCpt].sNum,dataTabString
[nCpt].sAttrib);
if (strlen(dataTabString[nCpt].sAttrib) > 0)
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;
}




Est ce que c'est bon ?


Si le fichier texte 'in.txt' ne contient pas des lignes vides et des
colonnes vides à supprimer alors est ce que votre solution se passe
bien ? votre solution est valable pour tous les cas ?


Merci.
Avatar
programmation
j'ai testé votre solution alors elle marche sur sur des exemples et
non sur autres.
par exemple soit le fichier 'in.txt':
1 11010
2 11000
3 01010
4 00110
5 10100
6 01100
7 10000
8 00010

Après l'exécution de programme, on obtient le fichier 'out.txt':
1 111
2 110
3 011
4 001
5 100
6 010
7 100
8 001

et comme fichier 'position.txt' :
2
4

Mais comme vous voyez la position 2 ne présente pas une colonne vide.

Or le résultat souhaité obtenu est :

le fichier 'out.txt'
1 1101
2 1100
3 0101
4 0011
5 1010
6 0110
7 1000
8 0001

et comme fichier 'position.txt' :
4

Que proposez vous comme solution ?

Merci.
Avatar
Christian ASTOR
On 29 sep, 00:40, programmation wrote:

Que proposez vous comme solution  ?



Mais pourquoi tu ne débugges pas avec VS ?
Si tu ne fais que copier-coller sans comprendre la moindre ligne, tu
ne vas jamais progresser :-(

Surtout vu que tu sais que ce sont les colonnes qui ne sont pas
bonnes.
Donc tu mets un Breakpoint dans la boucle, tu avances pas à pas dans
le code en visualisant toutes les variables et tu vois qu'il faut
remplacer
if (dataTabString->sAttrib[i]
== '0')
nColumn[i]+=1;
par
if (dataTabString[nCpt].sAttrib[i]== '0')
nColumn[i]+=1;
Avatar
programmation
> remplacer
    if (dataTabString->sAttrib[i]
== '0')
                                                nColumn[i]+=1;
par
 if (dataTabString[nCpt].sAttrib[i]== '0')
                                                nColumn[i]+=1;




Merci beaucoup pour votre aide.

J'ai deux question :

1)
J'ai remarqué que la solution se passe bien même si on n'ajoute pas :
memset(&dataTabString[nCpt], 0, sizeof(dataStruct));
et le test :
if (strlen(dataTabString[nCpt].sAttrib) > 0)
nAttribLength = strlen(dataTabString[nCpt].sAttrib)+ 1;

donc quel est le rôle de ces deux ajouts ?

2) Dans la solution vous mettez nColumn[32] = {0}
mais on peut avoir que le deuxième champs contient plus que 32
colonnes ou bien moins.
Dans mon cas, on peut avoir plus que 32.
En général on ne sait pas en avance le nombre nColumn de deuxième
champ.

La même chose pour 'char sAttrib[32] ' qui fait partie de la
déclaration de structure.

Quelle est la modification à ajouter dans la solution suivante pour
éviter le problème de cette taille fixe de nColumn ?

Voici 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, 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));

while (fgets(sLine, MAXLINE, pFile))
{

memset(&dataTabString[nCpt], 0, sizeof(dataStruct));
sscanf(sLine,"%d%s",&dataTabString[nCpt].sNum,dataTabString
[nCpt].sAttrib);
if (strlen(dataTabString[nCpt].sAttrib) > 0)
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[nCpt].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++)
{

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;

}



je souhaite que vous m'aidez et je n'oublierai vos aides.

Merci.
Avatar
nico
programmation wrote:

2) Dans la solution vous mettez nColumn[32] = {0}
mais on peut avoir que le deuxième champs contient plus que 32
colonnes ou bien moins.
Dans mon cas, on peut avoir plus que 32.
En général on ne sait pas en avance le nombre nColumn de deuxième
champ.

La même chose pour 'char sAttrib[32] ' qui fait partie de la
déclaration de structure.



Un format de fichier est toujours défini à l'avance.
Si 32 peut ne pas etre suffisant, mets une valeur plus grande, genre 512
Avatar
programmation
> Un format de fichier est toujours défini à l'avance.
Si 32 peut ne pas etre suffisant, mets une valeur plus grande, genre 512



Je ne sais pas en avance la taille de deuxième champs en avance car le
fichier est généré automatiquement dans le programme.
Si je mis la taille 512 alors que la taille réelle est 50.
Est ce que c'est bon de mettre nColumn[512] = {0} ? pas une mauvaise
gestion de l'espace mémoire ?
Avatar
nico
programmation wrote:
Un format de fichier est toujours défini à l'avance.
Si 32 peut ne pas etre suffisant, mets une valeur plus grande, genre 512



Je ne sais pas en avance la taille de deuxième champs en avance car le
fichier est généré automatiquement dans le programme.
Si je mis la taille 512 alors que la taille réelle est 50.
Est ce que c'est bon de mettre nColumn[512] = {0} ? pas une mauvaise
gestion de l'espace mémoire ?



Si tu alloue plus grand que la taille reçue, pourquoi ça ne serait pas bon ?
C'est toujours l'inverse qui pose problème.
Avatar
programmation
On 30 sep, 19:36, nico wrote:
programmation wrote:
>> Un format de fichier est toujours défini à l'avance.
>> Si 32 peut ne pas etre suffisant, mets une valeur plus grande, genre 5 12

> Je ne sais pas en avance la taille de deuxième champs en avance car l e
> fichier est généré automatiquement dans le programme.
> Si je mis la taille 512 alors que la taille réelle est 50.
> Est ce que c'est bon de mettre nColumn[512] = {0}  ? pas une mauvai se
> gestion de l'espace mémoire  ?

Si tu alloue plus grand que la taille reçue, pourquoi ça ne serait pa s bon ?
C'est toujours l'inverse qui pose problème.



Je voulais allouer la taille exacte ni plus ni moins. Comment faire
ceci dans le code au dessus ?
Avatar
Bertrand Lenoir-Welter
> Je voulais allouer la taille exacte ni plus ni moins. Comment faire
ceci dans le code au dessus ?



Réfléchissez. Si vous êtes absolument sûr que ce que vous mettez dans
votre chaîne ne dépassera *jamais* 50 caractères, il suffit de déclarer
une taille de 51 (en comptant le zéro terminal). Mais c'est à vous de ne
pas en déborder lorsque vous faites des opérations dessus, sinon
plantage assuré. Utilisez strncpy() au lieu de strcpy(), par exemple, ou
bien memmove.

Si vous voulez allouer l'espace mémoire correspondant *exactement* à ce
que vous allez mettre dans la chaîne, alors passez à l'allocation
dynamique avec malloc() et free(). Mais pour une chaîne unique ou
empilée, a fortiori d'une cinquantaine de caractères, ça ne vaut pas
vraiment la peine.
Avatar
programmation
>Utilisez strncpy() au lieu de strcpy(), par exemple, ou
bien memmove.



Est ce que strncpy() et memmove() résoudre le problème ? Si oui
comment les exploiter ?

Si vous voulez allouer l'espace mémoire correspondant *exactement* à ce
que vous allez mettre dans la chaîne, alors passez à l'allocation
dynamique avec malloc() et free(). Mais pour une chaîne unique ou
empilée, a fortiori d'une cinquantaine de caractères, ça ne vaut pa s
vraiment la peine.



Donc, Quelles sont les modifications à ajouter dans le programme au
dessus ?

Merci.
1 2