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 à 13:27
d = Tabchaine[0];
d pointe sur le 1er octet du 1er index, Tabchaine est un tableau de pointeurs.
*d = ... ok on affecte mais pas avec d=...
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:29
Je fais l'exemple illico, on saura.
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:31
Meme raisonnement que pour jockos (et meme résultat aussi d'ailleurs!). (*d) est un char et Tabchaine est un tableau de char*...
Vaughn018, Siaïeï handler...
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:35
arf...
J'avais zappé que Tabchaine est un tableau de pointeurs...

Désolé...

A l'exécution, il te dit "La mémoire ne pas pas être written" et cela signifie que c'est l'affectation dans la chaine d qui pose problème.

Est-ce que tu es sûr que Tabchaine[0] pointe bien sur un buffer valide ?

A mon avis, le problème vient de la...
Essaye un printf("%s\n", TabChaine[0]) pour voir.

A+
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 à 13:38
disons que j'ai juste alloué la mémoire à chaque Tabchaine (voir comment plus haut dans le roman-dialogue!) et ya encore rien dedans quand je fais l'affectation d = Tabchaine[0] ou d = Tabchaine[i] ensuite.

Vaughn018, Siaïeï handler...
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:41
Attendons les tests de Brunews pour savoir ce qui se passe...
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:43
je suis de retour à 14h je vais m'alimenter ma mémoire interne à moi lol
brunews j'attends de voir le chef-d'oeuvre!!
a+

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:58
http://www.cppfrance.com/code.aspx?ID=18808
C'est fait.
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 à 14:39
Ok mais si ça marche je vois pas où est mon problème... à part les *d = 0, moi je mets plutot *d = '\0' sinon tu as juste rajouté les tests sur *chaine pour etre sur que ça pointe sur quelque chose... je veux pas me répéter mais la chaine pointe bien sur qq choz lol
bon j'essaierai de me débrouiller, merci bcp de ce temps mis à ma disposition :)
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 à 14:41
Je pense ne pas me tromper en disant que ça vient probablement de mon allocation mémoire. C'est la seule grosse différence avec ton programme qui a une mémoire fixe de 30 octets, lui.

Vaughn018, Siaïeï handler...
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 à 14:57
Effectivement, je sens bien le problème venir de ton allocation...

(Tabchaine)[i] = (char *) GlobalLock(GlobalAlloc GMEM_MOVEABLE, PREPASIZE + 1));

Vérifie bien que l'allocation est correct en affichant simplement ton buffer :
printf("%s\n", Tabchaine[i]);

Pourquoi utiliser GlobalLock ??

Le problème vient de cette API windows...

"The GlobalLock function locks a global memory object and returns a pointer to the first byte of the object’s memory block. The memory block associated with a locked memory object cannot be moved or discarded."

Tu ne peux pas écrire dans ce buffer et c'est pour cela que l'instruction *d++ = *c++ plante.
Car d pointe sur la même zone mémoire que Tabchaine[0].
Et ce buffer est LOCK !
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 à 15:07
GlobalLock j'avais pas vu ce truc, OBSOLETE !!!
Tout ce qui est Global... est obsolete.
HANDLE hheap = GetProcessHeap();
pointeur = HeapAlloc(hheap, 0, size) et c'est nickel.
HeapFree(hheap, 0, pointeur);
BruNews, ciao...
0
Rejoignez-nous