[C] Maudites structures.....
Résolu/Fermé
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
-
10 juin 2005 à 19:32
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 - 14 juin 2005 à 20:18
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 - 14 juin 2005 à 20:18
A voir également:
- [C] Maudites structures.....
- Calcul des structures en béton - Forum Logiciels
- Remplir un tableau de structure en c ✓ - Forum C
- [C] Problèmes avec une structure ✓ - Forum C
- Structure pile en c - Astuces et Solutions
- No Man's Sky - Les structures ne chargent pas et crash au lancement du jeu - Forum Jeux vidéo
18 réponses
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
14 juin 2005 à 20:10
14 juin 2005 à 20:10
Re,
Pardonne pour moi, je n'ai pas fait attention Gcc n'accepte pas que l'affectation dans une structure se fasse de manière globale.
Cependant tu peut faire une affectation globale d'une structure en C de cette manière :
Pardonne pour moi, je n'ai pas fait attention Gcc n'accepte pas que l'affectation dans une structure se fasse de manière globale.
Cependant tu peut faire une affectation globale d'une structure en C de cette manière :
#include <stdio.h> struct machin{ int a; char nom[10]; }; /*affectation globale */ struct machin var_machin ={ 3, "kilian" }; main() { printf("%d\n",var_machin.a); printf("%s\n",var_machin.nom); }
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
10 juin 2005 à 22:27
10 juin 2005 à 22:27
Salut,
J'ai simplifié un peut ton code (j'ai enlevé typedef)
J'ai simplifié un peut ton code (j'ai enlevé typedef)
#include <stdio.h> #include <stdlib.h> main() { struct db_integers{ // Octets char *boolean; // 1 bit char *octet; // 1 }; struct db_integers *mysql_integers; // pointeur mysql_integers=malloc(sizeof(struct db_integers)); mysql_integers->boolean="BOOL"; mysql_integers->octet="TINYINT"; printf("%s\n",mysql_integers->boolean); printf("%s\n",mysql_integers->octet); }
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
10 juin 2005 à 22:45
10 juin 2005 à 22:45
et avec typedef
Et ça marche.
J'ai ajouté malloc puisque à l'éxécution j'avais le message Erreur de segmentation
#include <stdio.h> #include <stdlib.h> main() { struct db_integers{ // Octets char *boolean; // 1 bit char *octet; // 1 }; typedef struct db_integers integers; integers *mysql_integers; //pointeur mysql_integers=malloc(sizeof(integers)); mysql_integers->boolean="BOOL"; mysql_integers->octet="TINYINT"; printf("%s\n",mysql_integers->boolean); printf("%s\n",mysql_integers->octet); }
Et ça marche.
J'ai ajouté malloc puisque à l'éxécution j'avais le message Erreur de segmentation
Yakurena
Messages postés
47
Date d'inscription
samedi 27 mars 2004
Statut
Membre
Dernière intervention
1 juillet 2007
10 juin 2005 à 22:45
10 juin 2005 à 22:45
En C, tu ne peux pas affecter des chaînes de caractères avec l'opérateur " = ". Tu es obligé de passer par une fonction de la bibliothèque string.h : strcpy(chaine_destinataire,chaine_source)
Ici,tu dois donc utiliser l'instruction :
strcpy(mysql_integers->boolean,"BOOL")
Idem pour tous les autres champs de ta structure...
Ici,tu dois donc utiliser l'instruction :
strcpy(mysql_integers->boolean,"BOOL")
Idem pour tous les autres champs de ta structure...
sam3000
Messages postés
1225
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
13 juin 2005
144
11 juin 2005 à 12:06
11 juin 2005 à 12:06
si il fait ça, il devra aussi allouer de l'espace pour chaque chaîne de sa structure avat le strcpy,
lui il fait de l'affectation de pointeurs avec "=" et ça marche dans ce cas!
@*
lui il fait de l'affectation de pointeurs avec "=" et ça marche dans ce cas!
@*
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
11 juin 2005 à 00:59
11 juin 2005 à 00:59
Ok, alors j'ai essayé vos conseils.
Tout ceci se trouve dans des fichiers headers en fait, qui sont inclut dans le fichier c principal. Si je continue sur ce principe, ça ne fonctionne toujours pas (avec une ribambelle d'erreurs dans la compilation) même avec la methode de lami20j.
Par contre dans le main, la methode de lami20j marche très bien.
Je ne sais pas pourquoi.... Et je ne comprends pas non plus pourquoi il faut déclarer mysql_integers en pointeur, pourquoi le faire pointer vers un malloc et pourquoi avec tout ça je n'ai pas d'erreur comme avant....
Sinon, Yakurena, apparemment je n'ai pas besoin d'utiliser strcpy(), ça marche bien comme ça.... Enfin, du moins dans mon cas...
Merci.
Tout ceci se trouve dans des fichiers headers en fait, qui sont inclut dans le fichier c principal. Si je continue sur ce principe, ça ne fonctionne toujours pas (avec une ribambelle d'erreurs dans la compilation) même avec la methode de lami20j.
Par contre dans le main, la methode de lami20j marche très bien.
Je ne sais pas pourquoi.... Et je ne comprends pas non plus pourquoi il faut déclarer mysql_integers en pointeur, pourquoi le faire pointer vers un malloc et pourquoi avec tout ça je n'ai pas d'erreur comme avant....
Sinon, Yakurena, apparemment je n'ai pas besoin d'utiliser strcpy(), ça marche bien comme ça.... Enfin, du moins dans mon cas...
Merci.
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
11 juin 2005 à 01:05
11 juin 2005 à 01:05
De même quand j'essaie la methode lami20j dans le fichier c principal mais avant le main() j'ai aussi des erreurs:
Par contre dans le main() ça passe....
Ce langage va me rendre fou O_o
champollion.c:11: error: conflicting types for `mysql_integers' champollion.c:10: error: previous declaration of `mysql_integers' champollion.c:11: attention : data definition has no type or storage class champollion.c:13: error: erreur de syntaxe before '->' token
Par contre dans le main() ça passe....
Ce langage va me rendre fou O_o
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
11 juin 2005 à 01:34
11 juin 2005 à 01:34
Ah déjà pour l'histoire de strcpy() je comprends mieux :-)
http://c.developpez.com/faq/c/?page=strings#STRINGS_string_init
http://c.developpez.com/faq/c/?page=strings#STRINGS_string_init
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
11 juin 2005 à 09:13
11 juin 2005 à 09:13
Salut,
Concernant strcpy Yakurena a raison, de toute façon tu as vu aussi dans les faqs de devoloppez.com.
Maintenant que le code que je t'ai donné fonctionne (malheureusement seul) peut être l'erreur ne viens pas de là.
Voilà j'ai divisé le code dans 2 fichiers : a.c et b.c
---------------------------------------------------------
après je l'ai compilé
Concernant strcpy Yakurena a raison, de toute façon tu as vu aussi dans les faqs de devoloppez.com.
Maintenant que le code que je t'ai donné fonctionne (malheureusement seul) peut être l'erreur ne viens pas de là.
Voilà j'ai divisé le code dans 2 fichiers : a.c et b.c
//a.c #include <stdio.h> #include <stdlib.h> main() { test(); }
---------------------------------------------------------
//b.c test() { struct db_integers { // Octets char *boolean; // 1 bit char *octet; // 1 }; typedef struct db_integers integers; integers *mysql_integers; mysql_integers=malloc(sizeof(integers)); mysql_integers->boolean="BOOL"; mysql_integers->octet="TINYINT"; printf("%s\n",mysql_integers->boolean); printf("%s\n",mysql_integers->octet); }
après je l'ai compilé
gcc -c a.c gcc -c b.c gcc -o ab a.o b.o
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
11 juin 2005 à 16:03
11 juin 2005 à 16:03
Salut Lami20j,
Ca marche bien, extremement bien....
J'ai adapté à mon cas parce que j'ai bien d'autres structures, mais tout passe bien...
Au lieu de déclarer test() je l'ai déclaré comme ceci:
void test(void)
Mais ça marche très bien... Le seul soucis c'est que je ne comprends pas bien pourquoi :-)
Merci à tous encore une fois....
Ca marche bien, extremement bien....
J'ai adapté à mon cas parce que j'ai bien d'autres structures, mais tout passe bien...
Au lieu de déclarer test() je l'ai déclaré comme ceci:
void test(void)
Mais ça marche très bien... Le seul soucis c'est que je ne comprends pas bien pourquoi :-)
Merci à tous encore une fois....
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
12 juin 2005 à 05:02
12 juin 2005 à 05:02
Qui plus est ça m'arrangerais de déclarer ces variables structurées de manière globale. Si je les déclare dans une fonction, la variable sera locale et donc je ne pourrais pas l'utiliser dans une autre fonction...
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
13 juin 2005 à 16:53
13 juin 2005 à 16:53
J'ai en quelque sortes résolu le problème..
J'ai déclar mes structures de manière globale (en dehors de toute fonction). Par contre pour affecter les valeurs dans mes structures, je traite ça dans des fonctions.
Mais je me demande tout de même pourquoi je ne peux pas affecter de valeur dans des structures en dehors de toute fonction.
J'ai déclar mes structures de manière globale (en dehors de toute fonction). Par contre pour affecter les valeurs dans mes structures, je traite ça dans des fonctions.
Mais je me demande tout de même pourquoi je ne peux pas affecter de valeur dans des structures en dehors de toute fonction.
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
13 juin 2005 à 19:20
13 juin 2005 à 19:20
Bonsoir kilian,
toujours en galère je vois.
Je ne sais pas si ça peut t'aider mais voilà ce que j'ai trouvé pour l'opérateur -> , c'est une sorte de définition si tu veut.
toujours en galère je vois.
Je ne sais pas si ça peut t'aider mais voilà ce que j'ai trouvé pour l'opérateur -> , c'est une sorte de définition si tu veut.
L'opérateur flèche -> est un opérateur monadique ([PROG] Caractérise une fonction ou une procédure dont la valeur de retour dépend d'un seul paramètres.) qui ne peut être surchargé que par une fonction membre non statique sans paramètre.
mamiemando
Messages postés
33372
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
22 novembre 2024
7 802
13 juin 2005 à 20:27
13 juin 2005 à 20:27
Pour la première version de son programme ca ne marchait pas car il utilisait des -> au lieu d'utiliser l'opérateur '.' :
1) L'opérateur . permet d'accéder au champ d'une structure.
2) L'opérateur * permet d'accéder au contenu d'une zone pointe (*add_mystructj équivaut à mystruct)
3) Rq : (son opérateur inverse est & : &mystruct équivaut à add_mystrcut).
4) L'opérateur -> est une combinaison des deux opérateurs '*' et '.' .
(*add_mystruct).champ équivaut add_struct->champ
Simple non ?
typedef struct db_integers integers; integers mysql_integers; mysql_integers.boolean="BOOL";
1) L'opérateur . permet d'accéder au champ d'une structure.
2) L'opérateur * permet d'accéder au contenu d'une zone pointe (*add_mystructj équivaut à mystruct)
3) Rq : (son opérateur inverse est & : &mystruct équivaut à add_mystrcut).
4) L'opérateur -> est une combinaison des deux opérateurs '*' et '.' .
(*add_mystruct).champ équivaut add_struct->champ
Simple non ?
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
14 juin 2005 à 00:18
14 juin 2005 à 00:18
Ok ok, merci à tous....
Mais le soucis n'est pas là. Que ce soit un point ou une flêche, Gcc n'accepte pas que l'affectation dans une structure se fasse de manière globale.
Par exemple ceci ne marche pas:
Mais ça, ça passe:
Pour le premier j'ai cette erreur:
Bizzare vous ne trouvez pas?
Mais le soucis n'est pas là. Que ce soit un point ou une flêche, Gcc n'accepte pas que l'affectation dans une structure se fasse de manière globale.
Par exemple ceci ne marche pas:
struct machin{ int a; double b; }; struct machin var_machin; var_machin.a=3; int main() { }
Mais ça, ça passe:
struct machin{ int a; double b; }; struct machin var_machin; void initialize_var_machin(void) { var_machin.a=3; } int main() { initialize_var_machin(); }
Pour le premier j'ai cette erreur:
essai.c:8: error: erreur de syntaxe before '.' token
Bizzare vous ne trouvez pas?
mamiemando
Messages postés
33372
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
22 novembre 2024
7 802
14 juin 2005 à 00:40
14 juin 2005 à 00:40
Mouais c'est vrai que c'est bizarre. En même temps les variables globales c'est mal... Et à la limite faire une fonction qui initialise ta structure c'est une bonne chose :
1) c'est plus propre
2) le jour ou tu feras du c++/java tu verras immédiatement à quoi sert un constructeur.
L'idéal pour programmer proprement c'est de faire ca :
mystruct.h
mystruct.c
etc...
1) c'est plus propre
2) le jour ou tu feras du c++/java tu verras immédiatement à quoi sert un constructeur.
L'idéal pour programmer proprement c'est de faire ca :
mystruct.h
#ifndef MYSTRUCT #define MYSTUCT typedef struct machin * pstruct; pstruct new_struct(); void set_a(pstruct s,int val); void set_b(pstruct s,double vall); void del_struct(pstruct s); #endif
mystruct.c
#include "mystruct.h" struct machin{ int a; double b; }; //....
etc...
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
14 juin 2005 à 01:09
14 juin 2005 à 01:09
C'est vrai, c'est pas mal comme ça.
Du moins, une seule fonction pour attribuer toutes les valeurs ça peut être bien (pour mon cas).
Je pense que je vais faire comme ça.
En quoi c'est mieux finalement de passer l'adresse d'une structure dans les arguments d'une fonction pour en modifier la valeur plutôt que de modifier la structure dans la fonction à partir de son nom global?
Du moins, une seule fonction pour attribuer toutes les valeurs ça peut être bien (pour mon cas).
Je pense que je vais faire comme ça.
En quoi c'est mieux finalement de passer l'adresse d'une structure dans les arguments d'une fonction pour en modifier la valeur plutôt que de modifier la structure dans la fonction à partir de son nom global?
mamiemando
Messages postés
33372
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
22 novembre 2024
7 802
14 juin 2005 à 08:25
14 juin 2005 à 08:25
En C tu ne peux pas modifier un paramètre (plus exactement, à l'appel de la fonction, tu empiles une copie des paramètres, dont la durée de vie est l'appel de cette fonction).
C'est pourquoi tu passes le pointeur (car la copie et l'original pointe tous deux sur la structure que tu veux corriger).
C'est pourquoi tu passes le pointeur (car la copie et l'original pointe tous deux sur la structure que tu veux corriger).
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
14 juin 2005 à 11:14
14 juin 2005 à 11:14
Ok, mais si tu utilises, dans une fonction, le nom d'une structure déclarée en globale, et que tu fais des modification sur cette structure dans la fonction, les changements seront toujours pris en compte après l'appel de la fonction.
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
14 juin 2005 à 19:24
14 juin 2005 à 19:24
Bonsoir kilian et mamiemando,
kilian ça marche mais l'affectation de la variable tu doit la faire à l'intérieur de la procédure. (c'est pour ça que tu as eu le message essai.c:8: error: erreur de syntaxe before '.' token)
kilian ça marche mais l'affectation de la variable tu doit la faire à l'intérieur de la procédure. (c'est pour ça que tu as eu le message essai.c:8: error: erreur de syntaxe before '.' token)
#include <stdio.h> struct machin{ int a; }; struct machin var_machin; main() { var_machin.a=3; printf("%d\n",var_machin.a); }
14 juin 2005 à 20:18