Pointeurs et copie de caractères

Vaughn018 Messages postés 55 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 14 janvier 2005 - 18 déc. 2003 à 11:45
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 18 déc. 2003 à 15:07
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 déc. 2003 à 11:57
Verifie d'abord ou pointe 'chaine' parce que tu dis 'remplie' mais c'est un pointeur.
BruNews, ciao...
0
jockos Messages postés 321 Date d'inscription dimanche 22 octobre 2000 Statut Membre Dernière intervention 14 mai 2005 2
18 déc. 2003 à 11:57
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...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 déc. 2003 à 11:59
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...
0
jockos Messages postés 321 Date d'inscription dimanche 22 octobre 2000 Statut Membre Dernière intervention 14 mai 2005 2
18 déc. 2003 à 12:04
Bien vu...
;)
0

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

Posez votre question
Vaughn018 Messages postés 55 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 14 janvier 2005
18 déc. 2003 à 12:11
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...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 déc. 2003 à 12:18
Pas compris ta question, situe moi exactement le probleme.
BruNews, ciao...
0
jockos Messages postés 321 Date d'inscription dimanche 22 octobre 2000 Statut Membre Dernière intervention 14 mai 2005 2
18 déc. 2003 à 12:20
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...
0
Vaughn018 Messages postés 55 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 14 janvier 2005
18 déc. 2003 à 12:27
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...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 déc. 2003 à 12:35
place un exemple avec qlques chaines bidons, les pointeurs dessus et surtout le resultat escompte, alors je pourrai faire la boucle.
BruNews, ciao...
0
Vaughn018 Messages postés 55 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 14 janvier 2005
18 déc. 2003 à 12:44
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...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 déc. 2003 à 12:59
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...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 déc. 2003 à 13:00
OUPS else *d++ = *c++;
BruNews, ciao...
0
Vaughn018 Messages postés 55 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 14 janvier 2005
18 déc. 2003 à 13:06
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...
0
Vaughn018 Messages postés 55 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 14 janvier 2005
18 déc. 2003 à 13:07
une idée jokos?

Vaughn018, Siaïeï handler...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 déc. 2003 à 13:08
Fais voir ton affectation de 'chaine' !!!
BruNews, ciao...
0
Vaughn018 Messages postés 55 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 14 janvier 2005
18 déc. 2003 à 13:11
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...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 déc. 2003 à 13:16
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...
0
jockos Messages postés 321 Date d'inscription dimanche 22 octobre 2000 Statut Membre Dernière intervention 14 mai 2005 2
18 déc. 2003 à 13:19
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...
0
Vaughn018 Messages postés 55 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 14 janvier 2005
18 déc. 2003 à 13:21
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...
0
Vaughn018 Messages postés 55 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 14 janvier 2005
18 déc. 2003 à 13:25
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...
0
Rejoignez-nous