IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

initialisation d'une liste de structure


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 209
    Points : 105
    Points
    105
    Par défaut initialisation d'une liste de structure
    Bonjour
    j'étudie le tutu Cours de C/C++ Christian Casteyde et dans la partie 4.12.1. Allocation dynamique de mémoire en C dans le programme proposé
    je ne comprend pas les instructions suivantes:
    dans la fonction main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    People p;
    init_list(&p);
    appel de la fonction init_list(&p) avec en paramètre un pointeur de People
    dans la fonction void init_list(People *lst)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void init_list(People *lst)
    {
       *lst = NULL;
    }
    le pointeur *lst est-il vu maintenant par l'ensemble du programme ?
    Merci pour vos lumières

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Salut
    Citation Envoyé par luchet Voir le message
    je ne comprend pas les instructions suivantes
    C'est exactement la même chose que ceci
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main() {
    	int xxx;
    	init(&xxx, 123);
    	printf("%d\n", xxx);
    }
     
    void init(int *pt, int v) {
    	(*pt)=v;
    }

    Toute variable locale à une fonction disparait quand la fonction se termine. La variable ainsi que sa valeur. Et ça vaut aussi pour les paramètres de la fonction.
    Toutefois comme la mémoire (la RAM) est globale pour tout le programme, toute fonction peut taper dans n'importe quelle partie de cette RAM pourvu qu'elle sache où taper
    Ainsi la seule façon de pouvoir faire modifier par une fonction une variable qu'on veut lui passer est de lui passer son adresse. La fonction reçoit cette adresse qu'elle stocke dans une variable locale mais maintenant peut aller à cette adresse modifier ce qui s'y trouve. Ensuite la fonction se termine et ses variables disparaissent mais pas ce qui a été mis à l'adresse en question qui se répercute par ricochet sur la variable qu'on voulait modifier ("xxx" dans mon exemple).

    Citation Envoyé par luchet Voir le message
    le pointeur *lst est-il vu maintenant par l'ensemble du programme ?
    Absolument pas, il est local à la fonction donc il disparaitra quand la fonction se termine. Mais comme il a reçu l'adresse de "p", ce qui a été mis à cette adresse a été mis dans "p" par ricochet. Petit bémol, NULL sous-entend que "p" serait un pointeur donc que le type "People" serait un type qui contient (et masque) une étoile style typedef char* People signifiant que tout type "People" est en fait un type "char*". Bon déjà les conventions veulent que les types se préfixent "t_" (typedef ... t_People) pour pouvoir les repérer facilement dans un code mais surtout il est très malsain de cacher les pointeurs car d'une part cela ne les cache que sur un niveau (il apparait malgré tout dans la fonction "init_list()") et d'autre part, les pointeurs sont un élément essentiel du C. Un programmeur C a besoin de savoir qu'il est en train de manipuler un pointeur Et en le cachant, on nuit à sa compréhension du code sans vraiment gagner quoi que ce soit.
    Généralement ceux qui cachent un pointeur derrière un type sont des programmeurs qui ne savent pas gérer un pointeur et qui, telle l'autruche cachant sa tête dans le sable, essayent de s'en affranchir (sans y arriver en plus). Et c'est encore pire si ça vient d'un prof...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 209
    Points : 105
    Points
    105
    Par défaut
    Bonjour
    merci pour votre explication j'ai compris le rôle de cette fonction
    en résumé elle initialise le pointeur " p " avec la valeur NULL
    mais quelle est l'utilité de cette fonction on aurait pu directement faire ceci
    dans la fonction main p=NULL;
    j'ai essayé cela fonctionne
    Au sujet de votre remarque concernant le type de p People il est défini comme
    un pointeur typedef Person *People; sur la structure Person

    Merci encore je vais pouvoir continuer mon apprentissage du C++

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par luchet Voir le message
    mais quelle est l'utilité de cette fonction on aurait pu directement faire ceci
    dans la fonction main p=NULL;
    j'ai essayé cela fonctionne
    Oui bien sûr, on peut parfaitement écrire l'initialisation dans le main() tout comme j'aurais pu écrire de mon côté xxx=123.
    L'utilité d'une fonction est de pouvoir être appelée dans différents contextes. Si par exemple demain il y a un menu avec un choix "0 - Réinitialiser la mémoire" alors le choix 0 pourra faire appel à cette fonction, chose qui n'est plus possible si la fonction disparait. C'est un petit peu en "prévision" de comment peut évoluer le programme. Et plus une fonction est minimaliste, mieux on peut la réutiliser dans différents contextes. Comme les légos qui ne sont que des carrés et des rectangles. Sauf qu'en mettant 3 rectancles de largeur "1" bout à bout on forme un triangle alors que si on a des légos en forme de triangles, on ne peut pas former un rectangle quelle que soit la façon de les positionner.

    Citation Envoyé par luchet Voir le message
    Au sujet de votre remarque concernant le type de p People il est défini comme un pointeur typedef Person *People; sur la structure Person
    Hé oui, encore un pointeur masqué par un prof incompétent qui préfère cacher les choses plutôt que devoir les expliquer...

    Citation Envoyé par luchet Voir le message
    je vais pouvoir continuer mon apprentissage du C++
    Oui enfin attention, ici c'est un forum C.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par luchet Voir le message
    mais quelle est l'utilité de cette fonction on aurait pu directement faire ceci
    ....
    Merci encore je vais pouvoir continuer mon apprentissage du C++
    c'est pour faire 1 classe comme en C++, mais en C il n'y a pas de notion d'objet (c'est 1 langage procédural)

    Donc, on fait 1 structure (ou plusieurs) avec tous les membres et à côté il y a 1 ensemble de fonctions qui manipulent cette structure.
    L'utilisateur n'est pas censé ni savoir ce qu'elle contient ni la manipuler directement (il n'y a pas d'encapsulation)
    Cette fonction init_list fait office de constructeur, mais elle n'est pas appelée automatiquement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] Initialisation d'une liste déroulante à l'aide du SQL
    Par lil404 dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 10/04/2009, 09h47
  2. Initialisation d'une liste avec une classe
    Par Poischack dans le forum Général Python
    Réponses: 2
    Dernier message: 26/12/2007, 23h52
  3. [STL] Initialisation d'une list
    Par franc82 dans le forum SL & STL
    Réponses: 2
    Dernier message: 23/07/2007, 08h20
  4. Récupération d'une liste de structures Oracle via Java
    Par MagikMarcel dans le forum Langage
    Réponses: 2
    Dernier message: 29/06/2006, 16h34
  5. Réponses: 7
    Dernier message: 18/04/2006, 17h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo