Vaughn018
Messages postés55Date d'inscriptionmardi 18 novembre 2003StatutMembreDernière intervention14 janvier 2005
-
18 déc. 2003 à 11:45
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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...
Vaughn018
Messages postés55Date d'inscriptionmardi 18 novembre 2003StatutMembreDernière intervention14 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
jockos
Messages postés321Date d'inscriptiondimanche 22 octobre 2000StatutMembreDernière intervention14 mai 20052 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 ;)...
Vaughn018
Messages postés55Date d'inscriptionmardi 18 novembre 2003StatutMembreDernière intervention14 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
Messages postés55Date d'inscriptionmardi 18 novembre 2003StatutMembreDernière intervention14 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
Messages postés55Date d'inscriptionmardi 18 novembre 2003StatutMembreDernière intervention14 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
Messages postés55Date d'inscriptionmardi 18 novembre 2003StatutMembreDernière intervention14 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!!
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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) {
jockos
Messages postés321Date d'inscriptiondimanche 22 octobre 2000StatutMembreDernière intervention14 mai 20052 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.
Vaughn018
Messages postés55Date d'inscriptionmardi 18 novembre 2003StatutMembreDernière intervention14 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