Probleme acces

Signaler
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
-
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
-
Bonjour,



Voila j'ai crée la procédure suivante :

----------------------------------------------------------------------------

void ReversD(char *D_ptTextNoReverse)

{

char D_cTextTmp[500]="";

char D_cCar;

int D_iSize,D_ia,D_ib=0;



D_iSize=strlen(D_ptTextNoReverse);

D_ia=D_iSize-1;



//Remise des lettre dans le bon sens.

while(D_ib<=D_iSize)

{

D_cCar=D_ptTextNoReverse[D_ib];

D_cTextTmp[D_ia]=D_cCar;

D_ia--;

D_ib++;

}

strcpy(D_ptTextNoReverse,D_cTextTmp);

}

----------------------------------------------------------------------------



Tous fonctionne, il affiche a l'écrant la variable modifié avec le text
dans le sens inverse et puis pouf juste après mon programme plante
(surement un acces violation) mais je ne vois pas ou. Je l'ai déjà
utiliser dans un de met programme mais la la variable D_ptTextNoReverse
etait déclarée en global (char D_cText[350]) et donc on ne passait pas
en paramettre un pointeur de type char mais bien la variable elle même.
Je soupçone que le problème doit se trouver la mais je ne vois pas
comment. Je voulait juste généraliser ma fonction pour la mettre dans
mon .h snif lol



Merci d'avance.

15 réponses

Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008

Par hasard, as-tu mis le char null a la fin de la chaine ?
Je crois pas moi en regarde ton prog, tiens nous informé
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
non il n'y est pas, mais la n'est pas le problème vu que cette
procédure marche très bien quand je transmet direct une variable et sa
taille (ex :char variable[10]) mais pas avec un pointeur char. je pense
que le problème vient de la. Surtout que j'ai fait ce que tu a dit mais
que le résultat est le même, plantage :'( snif
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
Sur chaine vide '"" tu plantes à tout coup:

char D_cCar;
int D_iSize,D_ia,D_ib=0;

D_iSize=strlen(D_ptTextNoReverse);
D_ia=D_iSize-1;


DONC:
D_iSize = 0
D_ia = -1
D_ib = 0


while(D_ib <= D_iSize) S'EXECUTERA !!!
D_cCar=D_ptTextNoReverse[D_ib]; // OK
D_cTextTmp[D_ia] = D_cCar; // BADABOUM, D_cTextTmp[-1] !!!

Je t'avais pourtant déjà donné une fonction FIABLE et autrement mieux codée:
void __stdcall ReverseStr(char *psz)
{
char *c = psz, a;
while(*c) c++; while(psz < --c) {a *psz; *psz++ *c; *c = a;}
}

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
233
Date d'inscription
jeudi 4 juillet 2002
Statut
Membre
Dernière intervention
5 juillet 2008

bon j'te l'ai faite en un peu plus optimisé je pense



FONCTION :



void Reverse(char *szInput)

{

//vars

char *sPtrStart;

char *sPtrEnd;

char cTmp;

unsigned int uLen;



// while there is letter to exchange

uLen = strlen(szInput); // length of the input string

sPtrStart =
szInput; //
start of the string

sPtrEnd = szInput+uLen-1; // end of the string

while (sPtrStart < sPtrEnd)

{

// exchange letters

cTmp = *sPtrStart;

*sPtrStart = *sPtrEnd;

*sPtrEnd = cTmp;



// move pointers

sPtrStart++;

sPtrEnd--;

}

}



USAGE :

int main (void)

{

//vars

char *szBuff;



szBuff = (char *)malloc(12);

strcpy (szBuff,"1234567890A");

fprintf (stderr,"%s\n",szBuff);

Reverse(szBuff);

fprintf (stderr,"%s\n",szBuff);

free (szBuff);



return (0);

}



marche très bien ici.

enfin test rapide pas que ça à foutre



++
Messages postés
233
Date d'inscription
jeudi 4 juillet 2002
Statut
Membre
Dernière intervention
5 juillet 2008

oupss trop rapide le brunews
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
Oui Brunews, mais je la comprend pas ta solution c'est pour ca, déjà le while(*c) c'est quoi la condition??? lol
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
BrunNews , pk D_iSize = -1, il ne prend pas la taille de la chaine
vide, mais celle qui est passé en paramètre donc D_iSize n'est pas
égale a -1.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
Si chaine vide
D_iSize vaut 0 donc D_ia=D_iSize-1; met bien D_ia à -1, non ?

char *c = buf;
c pointe sur adresse de buf donc sur buf[0]
So buf est "ABC"
c pointe sur adresse du 'A'
donc *c vaut 'A'
while(*c) c++;
tant qu'il ne pointe pas sur 0 final on pousse c, ok ?

Faut absolument étudier les pointeurs si tu veux du code performant.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
BuNews, dezo de te contredire mait j'utilise la chaine vide comme tu
dit est simplement un chaine de car ou je vais mettre le mot
reconstituer temporairement avant de l'affecter a la bonne variable, je
l'initialise a vide c'est tout. Le strlen est la taille de la chaine qu
l'on reçoit a moin d'etre un fiaifait malin personne ne voudrai
inverser un text vide lol ;).



Pour ton exemple j'avai tout compris sauve le while (*c) je ne l'avait
pas vu comme ça. Enfaite si je me trompe pas, la tu utilise
l'arithémitque des pointeurs c'est bien cela? en faisant pas exemple
c++ c'est égale a c+1 fois la taille de c(donc du type) ce qui fait
avancer et donc passe a la lettre suivante c'est bien cela?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
ben oui, c++ vaut c = c+ 1 donc pointe 1 octet plus loin en mémoire.

Nenni pour ton explication, une fonction doit être fiable dans tous les cas, apte à recevoir une chaine vide aussi.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
Croti, le problème n'est mm pas la, ta procédure et la mienne
fonctionne bien, le problème est a l'affichage, je fait un
printf("%s",text); et boum ca plante, si je le supprime en l'aissant
l'apelle de la fonction cela marche, donc c'est ca qui ne va pas, et le
pis c'est que si je le met juste après l'apelle de la procédure ca
m'affiche le texte a l'enver et puis ca plante, mais si je le change de
place, ca met des caractère aléatoire et ca ne plante pas, je comprend
absolument pas le problème.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
Tu écrases une zone mémoire avec ta fonction, tout dépend donc où se trouve l'adresse de départ du buffer à retourner pou savoir ce qui sera écrasé.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
Oki merci BruNews, en faite j'ai retiré l'apelle d'une fonction
randomize que j'avai faite, ca marche impec, je l'ai remise après ca
marche encore impec :s comment pourrai je faire pour que cela ne se
reproduise plus? car ca fait perdre du temps , on croi que c'est
dans le code mais pas du tout.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
Une erreur sur un prog se situe toujours dans son code, quand on ne trouve pas vite fait faut recommencer le tout et on y gagne en temps.
Soit tu utilises un debuggueur pour tracer l'exécution de ton prog.
Soit, comme moi, je fais chaque fonction séparément dans des mini progs de test en essayant de passer absolument nimporte quoi en param et ça ne doit pas planter. Une fois au point je l'intègre au vrai prog. L'avantage est que tu te constitueras un jeu de fonctions solides et prêtes à l'emploi.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
Oui , mais je ne suis pas reponsable du placement des données en
mémoires, donc c'est pas ma faute si ici j'écrasai une zone de mémoire.
héhé BruNews on a du a un moment capter la mm idée, c'est ce que je
fait aussi surtout pour mes fonction et procédure que je généralise et
que je met ds un header perso. Ici j'avai juste vite repris le
programme de test de ma fonction randomize et j'avait ajouter le test
de celle-ci. Ce que je ne comprend pas cette fonction et cette
procédure est crée ca, il n'y a rien pourtant ds ma fonction randomize
qui ferait ca, c'est une bête fonction lol il n'y a rien de spéciale.