Prise de tête avec un char [C++] - Programmation
Marsh Posté le 18-12-2001 à 08:31:25
Comment faire pour avoir un char* pour une variable qui doit être char[] car elle doit contenir plusieurs caractères?
Marsh Posté le 18-12-2001 à 08:41:48
bah, en fait ça:
char szChaine[ENTIER];
C exactement la même chose que ça:
char* lpszChaine = malloc (ENTIER);
puis free(lpszChaine); // qd t'en as plus besoin
pour accèder aux différente caractères:
szChaine[0] <=> *(lpszChaine)
szChaine[1] <=> *(lpszchaine + 1)
szChaine[i] <=> *(lpszChaine + i);
EDIT: mais en fait, ton pb est encore plus simple que je croyais il me semble, en fait quand tu fait
char szChaine[ENTIER];
tu voudrais un char* vers ce char[] !? hé bah szChaine est un char* (il pointe en fait vers szChaine[0]). étonnant, non ?
[edtdd]--Message édité par El_Gringo--[/edtdd]
Marsh Posté le 18-12-2001 à 08:52:49
Oki, bon déjà ça c'est cool.
Deuxième problème, j'initialise un char[200] pour être sûr qu'il y aura assez de place pour mettre tout le chemin du fichier, le problème c'est qu'après avoir copier la string dedans, j'ai le chemin du fichier PLUS plein de caractère aléatoire... D'où est-ce que ça peut venir?
Marsh Posté le 18-12-2001 à 08:54:22
C'est du genre:
"C:\Mon Fichier\test.txt" ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ
ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ
ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ"
Marsh Posté le 18-12-2001 à 08:56:35
tu copies avec quelle commande ?
EDIT: logiquement, c pas gênant (si ce n'est que ça fait pas très propre), parce que les fonction de copie vont mettre un '\0' (caractère null) à la fin de ta chaine. toutes les fonctions qui exploitent les chaines de char utilisent ce charactère comme marque de fin de chaine
[edtdd]--Message édité par El_Gringo--[/edtdd]
Marsh Posté le 18-12-2001 à 09:03:05
Alload a écrit a écrit : Deuxième problème, j'initialise un char[200] pour être sûr qu'il y aura assez de place pour mettre tout le chemin du fichier |
hum dangereux ça...
normalement c'est [256]
[edtdd]--Message édité par antp--[/edtdd]
Marsh Posté le 18-12-2001 à 09:04:14
j'connais pas cette fonction, mais ça te pose un pb lors de l'execution le fait qu'il ai rempli ça !?
et si ça te gène vraiement, fait un
memset(szChaine, 0, sizeof (szChaine); // ou un ZeroMemory
Marsh Posté le 18-12-2001 à 09:04:38
Avec [256] ça fait la même chose, mais si c'est mieux de le mettre à 256 je le met
Marsh Posté le 18-12-2001 à 09:04:56
antp a écrit a écrit : hum dangereux ça... normalement c'est [256] |
tu parles... on s'en tape ça ! 200, 256, c pareil !
c de la maniaquerie de développeur de vouloir absoluement mettre des puissances de 2 !
[edtdd]--Message édité par El_Gringo--[/edtdd]
Marsh Posté le 18-12-2001 à 09:05:00
strncpy, il me semble qu'elle ne met rien à la fin !
Pour certaines fonctions, il faut ajouter le '\0' terminal à la bonne position, sinon chaîne "infinie" en mémoire (y a la zone de mémoire réservée, mais y a pas le "fin de chaîne" qui sert de "butée" ).
Pour transformer les chemins longs en chemins courts (avec des ~), il y a une API 32 bits qui sait le faire. On entre le nom long (avec espaces, etc..) et elle code à la mode 16 bits (certaines API n'acceptent pas les noms longs => coïncés sans elle). Faut que je retrouve son nom. Ca m'échappe pour l'instant.
Marsh Posté le 18-12-2001 à 09:06:17
Il me semble que la longueur maxi est de 256. Si on y arrive mais qu'il n'y a que 200 octets réservés, ça écrase les variables qui suivent en mémoire !!! Vaut mieux trop que pas assez.
Marsh Posté le 18-12-2001 à 09:07:22
Ca marche avec un ZeroMemory(), tain j'aurais du penser que les variables sont jamais initialisées à zéro à part les string... Quel âne desfois.
Enfin, merci beaucoup!!!
Marsh Posté le 18-12-2001 à 09:58:56
El_Gringo a écrit a écrit : la longueur maxi de quoi !? |
longueur maxi d'un nom de fichier, répertoire compris !!
c'est pas juste pour dire que c'est une puissance de 2
tu peux mettre 257 je m'en fous.
Si tu ne mets que 200, il se peut que ça plante avec un long nom de fichier, alors qu'avec 256 ça passera. (tiens c'est une limite de la FAT/FAT32, ou une limite dans Windows ? que se passe-t-il en NTFS ?)
[edtdd]--Message édité par antp--[/edtdd]
Marsh Posté le 18-12-2001 à 10:01:17
Longueur maxi d'un path + nom de fichier. C'est 128 sous Win16 je crois, 67 caractères max pour un path sous DOS
J'ai un collègue qui a accumulé des sous-sous-répertoires (sous Win3.11) qu'on ne peut même plus sauver because trop de caractères dans les noms et de sous-niveaux ). C'est le défaut des jeunes qui sont habitués à Win98/2000 dès le biberon
Marsh Posté le 17-12-2001 à 23:42:37
Déjà, est-il possible de mettre plusieurs caractère dans un char?
Puis, voilà comment se présente une partie du fichier avec lequel je dois charger le chemin du fichier:
*BITMAP "Mon fichier/monfichier.txt" *MAP_TYPE
Pour le moment j'utilise ce code:
string buffer
ZeroMemory(&buffer, sizeof(buffer));
while (1)
{
string buffer2;
ZeroMemory(&buffer2, sizeof(buffer2));
file >> buffer2;
if (buffer2 == "*MAP_TYPE" ) //Car on ne lit alors plus le chemin de la texture
break;
else
buffer += buffer2 + " ";
}
char pPath;
copy(buffer.begin() + 1, buffer.end() - 2, &pPath); //On enlève les " "
Le problème c'est que je ne peux pas charger des chemins de fichiers contenant des espaces. Le deuxième problème c'est que je ne peux pas utiliser un char[] car une fonction que j'utilise demande un char.
Donc si vous pouviez m'aider un peu.