Pointeurs et copie de caractères

Signaler
Messages postés
55
Date d'inscription
mardi 18 novembre 2003
Statut
Membre
Dernière intervention
14 janvier 2005
-
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
Bonjour,
La mémoire ne peut etre 'written', un grand classique mais dans mon cas j'ai du mal à comprendre. Mieux vaut du code que des explications, alors trouvez l'erreur svp :

char * pt1,pt2,chaine;
char *Tabchaine[30];
// on suppose la variable chaine remplie sans erreurs.

pt1 = chaine;
pt2 = Tabchaine[i] // je vous épargne la boucle, d'ou
// la présence du 'i'.

// CE QUI POSE PROBLEME :
*pt1++ = *pt2++; // une copie de caractères toute bête non?

merci pour votre aide.

Vaughn018, Siaïeï handler...

32 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Verifie d'abord ou pointe 'chaine' parce que tu dis 'remplie' mais c'est un pointeur.
BruNews, ciao...
Messages postés
321
Date d'inscription
dimanche 22 octobre 2000
Statut
Membre
Dernière intervention
14 mai 2005
2
Tu connais pas strcpy apparemment.
C'est pourtant ce qu'il faut utiliser...

il y aussi strlen qui peut t'être utile (retourne la taille en octet d'un Char*) ...

strcpy(pt2,pt1);

C'est plus simple...
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
OUPS, non seulement pt1 est pointeur, les 2 autres sont 8 bits char, normal que plante.
char *pt1, *pt2, *chaine; devrait aller mieux s'ils sont affectes correctement.
BruNews, ciao...
Messages postés
321
Date d'inscription
dimanche 22 octobre 2000
Statut
Membre
Dernière intervention
14 mai 2005
2
Bien vu...
;)
Messages postés
55
Date d'inscription
mardi 18 novembre 2003
Statut
Membre
Dernière intervention
14 janvier 2005

euh déjà jockos, si j'utilise pas strcpy() c'est que je peux vraiment pas faire autrement dans la situation qui m'est donnée, mais merci de t'inquiéter à ce point pour mon savoir!

Pour ce qui est de chaine, brunews, il pointe bien vers le premier caractère d'une longue liste (obtenue sur un serveur et je pense exempte de défauts).
La ou tu as raison c'est pour l'incrémentation que je fais, je retombe pas sur le caractère suivant c'est bien ça? comment incrémenter de la bonne manière alors? sans faire de listes chainées bien sur, les spécifications du serveur étant ce qu'elle sont.
Merci

Vaughn018, Siaïeï handler...
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Pas compris ta question, situe moi exactement le probleme.
BruNews, ciao...
Messages postés
321
Date d'inscription
dimanche 22 octobre 2000
Statut
Membre
Dernière intervention
14 mai 2005
2
ne t'mporte pas stp.
Je pensais que tu ne connaissais pas strcpy et que tu voulais réinventer la roue comme bon nombre de programmeur.

chaine ne pointe pas vers le premier caractère d'une chaine car chaine, déclaré comme tu l'as fait n'est pas un pointeur sur un caractère mais c'est un caractère.

regarde ta déclaration :
char * pt1,pt2,chaine;

Erreur classique qui revient à cela :
char * pt1;
char pt2;
char chaine;

(apparement, il y a effectivement de quoi s'inquiéter pour ton savoir ;)...

Bon courage...
Messages postés
55
Date d'inscription
mardi 18 novembre 2003
Statut
Membre
Dernière intervention
14 janvier 2005

Ok j'ai été un peu vite sur les déclarations, mais en fait dans le vrai fichier j'ai tout déclaré ligne par ligne, avec char * sans oublier le *... c'est ma faute j'ai mal expliqué t'as raison!!

Pour situer le problème, il s'agit de copier la variable chaine sous forme de sous-chaines qui correspondent à Tabchaine[i]. Je réexplique quand meme lol : Tabchaine[i] doit recevoir à chaque fois qu'une boucle est répétée, une sous-chaine différente (la suivante) de la variable chaine. ça impose donc de copier caractère par caractère chaque sous-chaine dont on connait les séparateurs dans Tabchaine[i].
voila j'espère ke je sui pa tro confus et je m'emporte pas du tout je suis du sud c tout ;-)

Vaughn018, Siaïeï handler...
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
place un exemple avec qlques chaines bidons, les pointeurs dessus et surtout le resultat escompte, alors je pourrai faire la boucle.
BruNews, ciao...
Messages postés
55
Date d'inscription
mardi 18 novembre 2003
Statut
Membre
Dernière intervention
14 janvier 2005

ok :
char *Tabchaine[] passé en paramètre de la fonction, c'est ce que l'on veut remplir (une sous-chaine par case du tableau).

//var locales :
int Nb; // nombre de sous-chaines
char *pts;
char *ptd;
char *Chaine;
// on suppose que Chaine reçoit "Dun;Ddeux;Dtrois;"
// Nb est automatiquement mis à la valeur 3.

pts = Chaine; // avant la boucle

ptd = Tabchaine[i]; // dans la boucle étant donné le i.

// Résultat attendu :
// Tabchaine[0] == Dun
// Tabchaine [1] == Ddeux... etc
voila c tout je crois.

Vaughn018, Siaïeï handler...
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
char *c;
char *d;
char *Chaine;
int n;
chaine = ???? doit pointer sur un buffer, OK ?
c = Chaine;
n = 0;
d = Tabchaine[0];
while(*c) {

if(*c == ';') {
if(++n >= 30) break; // limite sinon tu enleves
*d = 0;
d = Tabchaine[n];
}

else *d++ = *d++;

}

*d = 0; // pour finir la derniere

devrait aller.

BruNews, ciao...
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
OUPS else *d++ = *c++;
BruNews, ciao...
Messages postés
55
Date d'inscription
mardi 18 novembre 2003
Statut
Membre
Dernière intervention
14 janvier 2005

Retour au point de départ... *d++ = *c++ ne marche pas car la mémoire ne peut pas être 'written', meme le debugger me montre cette instruction pour me dire que ça va pas!

Vaughn018, Siaïeï handler...
Messages postés
55
Date d'inscription
mardi 18 novembre 2003
Statut
Membre
Dernière intervention
14 janvier 2005

une idée jokos?

Vaughn018, Siaïeï handler...
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Fais voir ton affectation de 'chaine' !!!
BruNews, ciao...
Messages postés
55
Date d'inscription
mardi 18 novembre 2003
Statut
Membre
Dernière intervention
14 janvier 2005

l'adresse de 'chaine' (&chaine) est passé en paramètre à une fonction qui la fait donc pointer sur un buffer, je pense pas que le problème soit la. Et me demande pas cette fonction, c'est une requete sur un serveur!!

Vaughn018, Siaïeï handler...
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Bon il manquait c++;
char *c;
char *d;
char *Chaine;
int n;
chaine = ???? doit pointer sur un buffer, OK ?
c = Chaine;
n = 0;
d = Tabchaine[0];
while(*c) {

if(*c == ';') {
if(++n >= 30) break; // limite sinon tu enleves
*d = 0; c++;
d = Tabchaine[n];
}

else *d++ = *c++;

}

*d = 0; // pour finir la derniere

Si plante faut voir la taille d'affectation de chaque Tabchaine.
Si Tabchaine est initialise correctement alors aucune raison.

BruNews, ciao...
Messages postés
321
Date d'inscription
dimanche 22 octobre 2000
Statut
Membre
Dernière intervention
14 mai 2005
2
d = Tabchaine[0];

d va être égal au 1er caractère de la chaine Tabchaine.
Par exemple, si Tabchaine est égal "Bonjour", alors d va valoir 'B'.
Et *d va donc aller voir la valeur de type Char (8 bits) se trouvant à l'adresse 'B' dans la RAM.

Essaye avec ça plutôt :
d = TabChaine;

A mon avis, ça devrait déjà mieux marcher... ;)

Bon courage...
Messages postés
55
Date d'inscription
mardi 18 novembre 2003
Statut
Membre
Dernière intervention
14 janvier 2005

le c++ y était déjà, mais je l'ai mis à l'extérieur du while.
J'ai aussi un *d++ = '\0' au meme endroit que mon c++.
La dernière chose qui n'est pas dans ton code est l'allocation de Tabchaine :
(Tabchaine)[i] = (char *) GlobalLock(GlobalAlloc GMEM_MOVEABLE, PREPASIZE + 1));
PREPASIZE étant une constante fait maison bien sur.
je désespère de plus en plus la... lol

Vaughn018, Siaïeï handler...
Messages postés
55
Date d'inscription
mardi 18 novembre 2003
Statut
Membre
Dernière intervention
14 janvier 2005

jockos> ton d = Tabchaine n'est pas conforme, on a deux types différents la... j'ai essayé malgré le warning et ça plante bien effectivement ;-)

Vaughn018, Siaïeï handler...