Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 18/12/2021, à 13:17

diesel

[RÉSOLU] Variable globale

Bonjour,

J'ai un fichier "variable.c" qui contient la ligne

static int int_taille;

Un fichier "programme.c" qui contient

#include <stdlib.h>

int main ()
{
extern int int_taille;
int_taille = 4;
char tableau[int_taille];
exit (0);
}

que je compile avec gcc variable.c programme.c -o programme.

je n'ai pas d'erreur de compilation mais une erreur d'édition de lien

/usr/bin/ld : /tmp/ccw0SkI0.o : dans la fonction « main » :
programme.c:(.text+0x1e) : référence indéfinie vers « int_taille »
/usr/bin/ld : programme.c:(.text+0x28) : référence indéfinie vers « int_taille »
collect2: error: ld returned 1 exit status

Quelqu'un a une explication ?

Amicalement.

Jean-Marie

Dernière modification par diesel (Le 18/12/2021, à 22:47)


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

En ligne

#2 Le 18/12/2021, à 13:37

iznobe

Re : [RÉSOLU] Variable globale

Bonjour , il me semble qu ' il faut faire :

#include <stdlib.h>

int main ()
{
int_taille = 4;
extern int int_taille;
char tableau[int_taille];
exit (0);
}

Dernière modification par iznobe (Le 18/12/2021, à 13:38)


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#3 Le 18/12/2021, à 13:50

diesel

Re : [RÉSOLU] Variable globale

iznobe a écrit :

Bonjour , il me semble qu ' il faut faire :

#include <stdlib.h>

int main ()
{
int_taille = 4;
extern int int_taille;
char tableau[int_taille];
exit (0);
}

Là, pour le coup, je vais me retrouver avec une erreur de compilation.

Affecter une valeur à une variable avant de l'avoir déclarée ; c'est sûr, le compilo ne va pas aimer.

Amicalement.

Jean-Marie


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

En ligne

#4 Le 18/12/2021, à 14:02

iznobe

Re : [RÉSOLU] Variable globale

et pourquoi extern dans :

extern int int_taille;

en l' enlevant ca ne va pas mieux ?


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#5 Le 18/12/2021, à 14:31

hotnuma

Re : [RÉSOLU] Variable globale

#include <stdlib.h>

int main ()
{
int int_taille = 4;
char tableau[int_taille];
exit (0);
}

Comme ça je dirais.


Xubuntu / GitHub

Hors ligne

#6 Le 18/12/2021, à 14:35

hotnuma

Re : [RÉSOLU] Variable globale

Et comme ça, ça donne quoi ?

gcc -o programme variable.c programme.c

Ou alors enlever static dans variable.c.

Dernière modification par hotnuma (Le 18/12/2021, à 14:39)


Xubuntu / GitHub

Hors ligne

#7 Le 18/12/2021, à 14:45

hotnuma

Re : [RÉSOLU] Variable globale

C'est la 2eme idée, déclarer la variable sans static dans variable.c

int int_taille;

Static defini une variable locale je pense.

Exemple.

variable.c :

int int_taille = 4;

programme.c :

#include <stdio.h>

int main()
{
    extern int int_taille;
    
    printf("valeur = %d\n", int_taille);

    return 0;
}
gcc -o programme variable.c programme.c
./programme

Dernière modification par hotnuma (Le 18/12/2021, à 14:50)


Xubuntu / GitHub

Hors ligne

#8 Le 18/12/2021, à 15:00

diesel

Re : [RÉSOLU] Variable globale

Eh les gars, c'est juste un exemple pour vous montrer le problème.

Je ne me suis pas amusé à déclarer la variable int_taille dans un fichier séparé juste pour le plaisir de faire compliqué.

Cette variable va être utilisée dans pratiquement toutes les fonctions d'un programme plus vaste dans lequel la déclaration "extern int int_taille;" va se retrouver dans quasiment chaque fonction. pour dimensionner des tableaux.

Amicalement.

Jean-Marie


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

En ligne

#9 Le 18/12/2021, à 15:04

iznobe

Re : [RÉSOLU] Variable globale

Dans ce cas pourquoi ne pas passer par un include de ton fichier de variables ?


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#10 Le 18/12/2021, à 15:05

diesel

Re : [RÉSOLU] Variable globale

Merci hotnuma pour ton intérêt.

Alors, effectivement; en supprimant le "static" dans la déclaration de int_taille dans le fichier variable.c, ça fonctionne.

Mais je ne comprends pas pourquoi.

Amicalement.

Jean-Marie


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

En ligne

#11 Le 18/12/2021, à 15:08

diesel

Re : [RÉSOLU] Variable globale

iznobe a écrit :

Dans ce cas pourquoi ne pas passer par un include de ton fichier de variables ?

C'est un exemple.

Dans la vraie vie, ça passe par des "#include" mais le problème est le même.

Amicalement.

Jean-Marie


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

En ligne

#12 Le 18/12/2021, à 15:17

iznobe

Re : [RÉSOLU] Variable globale

Donc , tu as deja defini ta variable int_taille dans variable.c .
pourquoi declarer alors une autre variable locale extern ? dans ta fonction main ?

si tu fais ca :

#include <stdlib.h>

int main ()
{
extern int_taille;
int_taille = 4;
char tableau[int_taille];
exit (0);
}

il dit quoi le compilo ?
ou bien :

int main ()
{
extern int_taille = 4;
char tableau[int_taille];
exit (0);
}

Dernière modification par iznobe (Le 18/12/2021, à 15:19)


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#13 Le 18/12/2021, à 15:22

diesel

Re : [RÉSOLU] Variable globale

iznobe a écrit :

il dit quoi le compilo ?

Ben..., il aime pas bien. Il se plaint que la variable int_taille n'a pas été typée dans le main. Comme la variable est de type int, je m'en sors avec juste un warning, mais ce serait un autre type que ça me générerait une erreur.

Et puis, j'ai toujours le même problème à l'édition de lien.

Amicalement.

Jean-Marie

Dernière modification par diesel (Le 18/12/2021, à 15:25)


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

En ligne

#14 Le 18/12/2021, à 15:23

iznobe

Re : [RÉSOLU] Variable globale

oui ben , pourtant elle l' est là :

static int int_taille;

c ' est donc qu ' il n' utilise pas la " globale " .


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#15 Le 18/12/2021, à 15:28

iznobe

Re : [RÉSOLU] Variable globale


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#16 Le 18/12/2021, à 15:29

diesel

Re : [RÉSOLU] Variable globale

Hotnuma a trouvé une solution.

Supprimer le "static" dans la déclaration de la variable dans le fichier variable.c.

Dans ce cas, ça fonctionne.

Ce qui m'énerve, c'est que je ne comprends pas pourquoi le mot clé "static" vient foutre le brin.

Amicalement.

Jean-Marie


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

En ligne

#17 Le 18/12/2021, à 15:33

iznobe

Re : [RÉSOLU] Variable globale

parcequ ' elle doit etre defini comme externe pour qu ' elle soit globale dans sa definition .
il y a un exemple dans le 1er paragraphe du lien que j ' ai mis precedemment , et elle ne peut a priori pas etre a la fois extern et static .

Dernière modification par iznobe (Le 18/12/2021, à 15:35)


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#18 Le 18/12/2021, à 15:49

diesel

Re : [RÉSOLU] Variable globale

Comprends pô.

La variable est "static" uniquement dans le fichier variable.c

Partout ailleurs, elle est "extern".

Si je suis la suggestion de Hotnuma, la variable est définie juste "int" (au lieu de "static int" et surtout pas "extern") dans le fichier variable.c et "extern" partout ailleurs.

J'ai donc du mal à comprendre pourquoi, cette variable, qui existe dans les deux cas, n'est pas visible par l'éditeur de lien dans le cas de la déclaration "static int".

Amicalement.

Jean-Marie


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

En ligne

#19 Le 18/12/2021, à 15:53

diesel

Re : [RÉSOLU] Variable globale

A la réflexion, ce que je crois comprendre, c'est que "l'édition de lien" est faite directement par le compilateur pour les variables déclarées "static" et que le référencement de ces variables n'est pas communiqué à l'éditeur de lien, ce qui cause l'erreur.

Je crois qu'on va en rester là.

Amicalement.

Jean-Marie


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

En ligne

#20 Le 18/12/2021, à 16:00

iznobe

Re : [RÉSOLU] Variable globale

c' est plutot une question de " portée de variable " a mon avis .
c ' est pas parceque tu as 2 variables ayant le meme nom , que ce sont les memes variables ...

es tu allé voir le lien que j' ai mis dans un message precedent ?

Dernière modification par iznobe (Le 18/12/2021, à 16:01)


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#21 Le 18/12/2021, à 20:22

diesel

Re : [RÉSOLU] Variable globale

iznobe a écrit :

es tu allé voir le lien que j' ai mis dans un message precedent ?

Oui.

Vas voir le mien : https://yard.onl/sitelycee/cours/c/LaPorte.html

Amicalement.

Jean-Marie

Dernière modification par diesel (Le 18/12/2021, à 20:55)


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

En ligne

#22 Le 18/12/2021, à 21:32

Nuliel

Re : [RÉSOLU] Variable globale

Bonjour,
Un extrait d'un de mes cours:

static storage duration
-> The storage duration is the entire execution of the program, and the value stored in the object is initialized only once, prior to main function.
-> All objects declared static and all objects with either internal or external linkage have this storage duration.

external linkage: The identifier can be referred to from any other translation units in the entire program.
-> All non-static functions, all extern variables (unless earlier declared static) and all file-scope non-static variables have this linkage.

En d'autres termes, static permet que la valeur existe dès le début du programme mais son accès est limité au fichier.

Hors ligne

#23 Le 18/12/2021, à 22:45

diesel

Re : [RÉSOLU] Variable globale

Nuliel a écrit :

En d'autres termes, static permet que la valeur existe dès le début du programme mais son accès est limité au fichier.

C'est ce que j'ai finalement compris.

Amicalement.

Jean-Marie


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

En ligne