Probleme acces

deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 - 6 nov. 2005 à 10:48
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 - 6 nov. 2005 à 16:43
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

MuPuF Messages postés 536 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 22 août 2008
6 nov. 2005 à 11:53
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é
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
6 nov. 2005 à 12:03
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 nov. 2005 à 12:26
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++
0
24Karas Messages postés 233 Date d'inscription jeudi 4 juillet 2002 Statut Membre Dernière intervention 5 juillet 2008
6 nov. 2005 à 12:31
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



++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
24Karas Messages postés 233 Date d'inscription jeudi 4 juillet 2002 Statut Membre Dernière intervention 5 juillet 2008
6 nov. 2005 à 12:32
oupss trop rapide le brunews
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
6 nov. 2005 à 13:38
Oui Brunews, mais je la comprend pas ta solution c'est pour ca, déjà le while(*c) c'est quoi la condition??? lol
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
6 nov. 2005 à 13:40
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.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 nov. 2005 à 14:00
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++
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
6 nov. 2005 à 14:49
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?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 nov. 2005 à 15:17
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++
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
6 nov. 2005 à 15:57
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.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 nov. 2005 à 16:07
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++
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
6 nov. 2005 à 16:19
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.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 nov. 2005 à 16:37
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++
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
6 nov. 2005 à 16:43
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.
0
Rejoignez-nous