Pb c structure et pointeur.
Fermé
macbang
-
30 juin 2009 à 13:57
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 30 juin 2009 à 22:57
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 30 juin 2009 à 22:57
A voir également:
- Pb c structure et pointeur.
- Dans la table des matières de ce document, le chapitre 6 et ses 2 sections n'apparaissent pas. trouvez l'erreur dans la structure du document et corrigez-la. mettez à jour la table des matières. quel est le mot formé par les lettres en majuscules de la table des matières après sa mise à jour ? - Forum Word
- Logiciel calcul structure bois gratuit - Télécharger - Architecture & Déco
- Remplir un tableau de structure en c ✓ - Forum C
- L'importateur de fichiers a détecté une incohérence dans la structure de fichier - Forum Montage vidéo
- Pointeur satellite eutelsat 5wa - Forum Satellite
10 réponses
Nabla's
Messages postés
18149
Date d'inscription
mercredi 4 juin 2008
Statut
Contributeur
Dernière intervention
28 avril 2014
3 220
30 juin 2009 à 14:18
30 juin 2009 à 14:18
tu as raison, le new vient du C++.... généralement, les gens qui travaillent en C utilisent quand meme un compilo c++...
alors en C, il faut utiliser un malloc, et ca donne un truc du genre:
ligne[i]->heure= (char*) malloc (strlen(pointeur)+1);
alors en C, il faut utiliser un malloc, et ca donne un truc du genre:
ligne[i]->heure= (char*) malloc (strlen(pointeur)+1);
Nabla's
Messages postés
18149
Date d'inscription
mercredi 4 juin 2008
Statut
Contributeur
Dernière intervention
28 avril 2014
3 220
30 juin 2009 à 14:08
30 juin 2009 à 14:08
a première vu, il semble que tu utilises un strcpy pour copier uen chaine dans ta structure (sur un char*) ... c'est bien... mais à aucun moment, je ne vois l'allocation mémoire pour la chaine que tu copies!!!
essayes un truc du genre
pointeur = strtok (ligne,sep1);
ligne[i].heure= new char[strlen(pointeur)+1];
strcpy( ligne[i].heure , pointeur);
et ce, à chaque fois que tu vas faire un strcpy ...
bien sur, il ne faudra pas oublier de faire un delete pour chaque allocation qui as été faite, en fin de fonction (pas de ramasse miettes en C !!!)
essayes un truc du genre
pointeur = strtok (ligne,sep1);
ligne[i].heure= new char[strlen(pointeur)+1];
strcpy( ligne[i].heure , pointeur);
et ce, à chaque fois que tu vas faire un strcpy ...
bien sur, il ne faudra pas oublier de faire un delete pour chaque allocation qui as été faite, en fin de fonction (pas de ramasse miettes en C !!!)
comment dois-je déclarer le new char ?
le compilateur me dit que ce dernier (new) n'est pas déclaré.
je tiens à préciser que j'ai fait une petite erreur dans le post d'avant.
La structure étant passé en pointeur, mes lignes sont avec des " -> " et non des " . "
strcpy( ligne[i]->heure , pointeur);
si cela influe sur quelque chose ...
le compilateur me dit que ce dernier (new) n'est pas déclaré.
je tiens à préciser que j'ai fait une petite erreur dans le post d'avant.
La structure étant passé en pointeur, mes lignes sont avec des " -> " et non des " . "
strcpy( ligne[i]->heure , pointeur);
si cela influe sur quelque chose ...
A oui effectivement, un malloc serait le bienvenue.
par contre, ca plante lors de son allocation :
ligne[i]->heure = (char*) malloc (strlen(pointeur)+1);
pourtant la déclaration me parait bien, je comprends pas trop...
par contre, ca plante lors de son allocation :
ligne[i]->heure = (char*) malloc (strlen(pointeur)+1);
pourtant la déclaration me parait bien, je comprends pas trop...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
j'ai déclarer plutot le malloc de cette manière :
ligne[i]->heure = malloc (sizeof (strlen(pointeur)+1) );
mais cette allocation plante toujours...
je passe pourtant bien en argument &infos ...
je comprends pas ce qui cloche.
ligne[i]->heure = malloc (sizeof (strlen(pointeur)+1) );
mais cette allocation plante toujours...
je passe pourtant bien en argument &infos ...
je comprends pas ce qui cloche.
Nabla's
Messages postés
18149
Date d'inscription
mercredi 4 juin 2008
Statut
Contributeur
Dernière intervention
28 avril 2014
3 220
30 juin 2009 à 15:14
30 juin 2009 à 15:14
sizeof(strlen) ne marchera pas: strlen renvoie un entier: 4 octets: il te réservera tjs 4 octets !
type struct infos
{
char IP[500];
char heure[500];
char erreur[500];
char description[500]
}infos;
sans malloc (pour les tests)
type struct infos
{
char IP[500];
char heure[500];
char erreur[500];
char description[500]
}infos;
sans malloc (pour les tests)
Cela ne fonctionne toujours pas.
Par contre dans ma structure, les déclarations des char sont des pointeurs non ?
type struct infos
{
char *IP[500];
char *heure[500];
char *erreur[500];
char *description[500]
}infos;
ensuite
infos ligne[50];
ensuite j'appel
k = decoupage (ligne); (sans &) ?
Par contre dans ma structure, les déclarations des char sont des pointeurs non ?
type struct infos
{
char *IP[500];
char *heure[500];
char *erreur[500];
char *description[500]
}infos;
ensuite
infos ligne[50];
ensuite j'appel
k = decoupage (ligne); (sans &) ?
Nabla's
Messages postés
18149
Date d'inscription
mercredi 4 juin 2008
Statut
Contributeur
Dernière intervention
28 avril 2014
3 220
30 juin 2009 à 15:32
30 juin 2009 à 15:32
non, un tableaud e char est déja de type char*. ce n'était pas une erreur d'avoir enlevé l'étoile
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 329
30 juin 2009 à 16:51
30 juin 2009 à 16:51
essai simplement avec :
int decoupage (infos *lignes);
ne pas oublier que même si c'est pas pareil, un tableau et un pointeur c'est très similaire.
C'est à dire que si lignes est un tableau de 500 infos, alors ligne peut être vu comme un pointeur. Écrire (infos *lignes[]) veux dire que lignes est un tableau de info* (de type pointeurs vers infos).
int decoupage (infos *lignes);
ne pas oublier que même si c'est pas pareil, un tableau et un pointeur c'est très similaire.
C'est à dire que si lignes est un tableau de 500 infos, alors ligne peut être vu comme un pointeur. Écrire (infos *lignes[]) veux dire que lignes est un tableau de info* (de type pointeurs vers infos).
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 817
30 juin 2009 à 22:57
30 juin 2009 à 22:57
Salut,
C'est dommage de te compliquer avec des allocations de pointeurs alors que la taille de l'heure sous la forme hh:mm:ss a une taille fixe et l'IP une taille maximum. Pour le numéro de l'erreur tu peux utiliser un int. Et enfin pour la description, je te conseille d'utiliser un buffer de taille fixe. Néanmoins, si tu souhaites économiser au maximum la mémoire, tu peux utiliser un pointeur pour ce dernier, mais attention à l'allocation.
Je te donne un code bien plus court qui devrait marcher (flemme de tester) ^^ :
<co#include <stdio.h>
typedef struct infos {
char time[9];
char ip[16];
int num;
char description[128];
} infos;
int main(void) {
info mes;
const char* ch="18:02:05 192.168.1.1 \"01234#description\"";
if(sscanf(ch,"%8s %15s \"%d#%127[^\"]",mes.time,mes.ip,&mes.num,mes.description)==4) {
/* il ne te reste plus qu'à afficher */
}
return 0;
}
</code>
Il ne te reste plus qu'à adapter ;-))).
C'est dommage de te compliquer avec des allocations de pointeurs alors que la taille de l'heure sous la forme hh:mm:ss a une taille fixe et l'IP une taille maximum. Pour le numéro de l'erreur tu peux utiliser un int. Et enfin pour la description, je te conseille d'utiliser un buffer de taille fixe. Néanmoins, si tu souhaites économiser au maximum la mémoire, tu peux utiliser un pointeur pour ce dernier, mais attention à l'allocation.
Je te donne un code bien plus court qui devrait marcher (flemme de tester) ^^ :
<co#include <stdio.h>
typedef struct infos {
char time[9];
char ip[16];
int num;
char description[128];
} infos;
int main(void) {
info mes;
const char* ch="18:02:05 192.168.1.1 \"01234#description\"";
if(sscanf(ch,"%8s %15s \"%d#%127[^\"]",mes.time,mes.ip,&mes.num,mes.description)==4) {
/* il ne te reste plus qu'à afficher */
}
return 0;
}
</code>
Il ne te reste plus qu'à adapter ;-))).