Questions sur le langage en C
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

Questions sur le langage en C



  1. #1
    invitedb41dd00

    Arrow Questions sur le langage en C


    ------

    Bonjour

    J'étudie a l'université la programmation en C et j'ai du mal a comprendre certains mots-clés, ou du moins je n'arrive pas à savoir quand il faut les utiliser.

    Typedef :
    J'avais l'impression qu'il ne fallait l'utiliser que lorsqu'on définissait une structure (image 1). Mais j'ai ensuite vu qu'il était utilisé dans d'autres situations telle que celle-ci (image 2).
    Capture4.PNG
    Capture3.PNG

    Matrice :
    Pourriez-vous m'expliquer de quelle manière je dois définir une matrice, car j'ai vu différentes possibilités :
    Capture5.PNG
    Capture6.PNG

    Structure :
    Comment peut-on réutiliser une structure définie de la manière suivante, dans la suite du programme ?
    Capture7.PNG
    Car j'ai vu sur un site qu'on pouvait ensuite utiliser patient1, patient2... or je ne vois pas comment... Est-ce juste une indication pour l'utilisateur ?

    J'espère que des questions similaires n'ont pas été postées trop récemment (j'ai regardé un peu mais je il y en a tellement^^)
    Merci d'avance pour ceux qui vont prendre le temps de lire et peut-être de répondre

    Bonne journée :*
    Aluno

    -----

  2. #2
    Jack
    Modérateur

    Re : Questions sur le langage en C

    J'avais l'impression qu'il ne fallait l'utiliser que lorsqu'on définissait une structure (image 1). Mais j'ai ensuite vu qu'il était utilisé dans d'autres situations telle que celle-ci (image 2).
    Oui, comme son nom l'indique, le mot clé typedef permet de définir de nouveaux typse personnalisés et n'existant pas de base dans le langage.
    Pourriez-vous m'expliquer de quelle manière je dois définir une matrice, car j'ai vu différentes possibilités :
    Comme sur l'image que tu viens de donner.
    Comment peut-on réutiliser une structure définie de la manière suivante, dans la suite du programme ?
    Car j'ai vu sur un site qu'on pouvait ensuite utiliser patient1, patient2... or je ne vois pas comment... Est-ce juste une indication pour l'utilisateur ?
    Patients_List patient1, patient2; // pour définir 2 patients

  3. #3
    polo974

    Re : Questions sur le langage en C

    1. merci d'insérer le code dans des zones code sous forme texte (quitte à le recopier à la main quand c'est court). (aller en édition avancée et utiliser le bouton "#")

    2. typedef permet de définir un type simple, pas seulement des structures.

    3. Patients_List défini une (fausse) liste de patients la structure patient étant définie auparavant (n'est-ce pas Jack )

    pour la question "patient1, patient2...", il faudrait avoir le contexte...

    sinon, il faut savoir qu'en C, il y a la notion de pointeur qui est très importante:
    un pointeur, c'est en gros un doigt qui indique la direction où se trouve éventuellement un élément (de type simple ou structure).
    en fait, un pointeur, c'est l'adresse de la donnée pointée (et si personne n'habite à l'adresse indiquée, on est mal...).
    un pointeur peut donc pointer vers n'importe où, et donc vers une zone de donnée non valide ! ! !
    dit autrement: ce n'est pas parce qu'on a un pointeur qu'il existe des données derrière ! ! !

    là dessus, pour enquiquiner les gens:
    char blabla[64];
    déclare un tableau de char de 64 caractères, mais blabla tout seul est l'adresse du premier caractère de ce tableau, on peut alors le voir comme un pointeur constant: on ne peut pas faire:
    blabla++;
    mais on peut écrire blabla[5] pour avoir le 6ème caractère (indice commence à 0).

    un "vrai" pointeur se déclare:
    char * ptblibli;

    et on à le droit d'écrire:
    ptblibli = blabla; /* pointe au début du tableau blabla */
    et d'incrémenter le pointeur:
    ptblibli++; /* case suivante */
    et de l'utiliser:
    ptblibli[0] = 'x'; /* 0 ou plus loin) */
    ou
    *ptblibli = 'y';

    mais attention, si on le fait plus que 64 fois (cf exemple ci-dessus), on déborde du tableau, et on risque:
    • d'écraser ou lire une data qui n'a rien à voir avec le contenu de blabla (vu qu'on regarde à coté).
    • d'écraser la pile de retour (c'est à dire de gravement planter le programme en le faisant éventuellement exécuter des choses pas du tout prévue (un des principe d'attaque des hackers)).
    • de taper vers une zone mémoire qui n'est pas allouée et de planter "proprement" le programme (le système détecte le pb avant de tout casser...).
    (et un cachet d'aspirine, un...)
    Jusqu'ici tout va bien...

  4. #4
    invitedb41dd00

    Re : Questions sur le langage en C

    Woa merci beaucoup à tous les deux ! (et désolée pour les codes)

    oui j'avais vu quelques trucs sur les pointeurs mais ca m'avait l'air bien compliqué ^^ Mais quand on utilise un pointeur pour faire comme tu dis *ptblibli = 'y'; est-ce que dans ce cas on accède à une case qui a pour adresse y ou à l'adresse de la case qui contient y ? (je sais pas si c'est très clair..) Et pour ptblibli[0] = 'x' pourquoi il faut [0] avant ptbibli? c'est pour remplacer l'étoile ou ca veut dire qu'il existe aussi ptiblibli[1], ptiblibli[2]... qui seront défini grâce à "l'endroit" se trouve ptiblibli[0] ?
    Merci encore

  5. A voir en vidéo sur Futura
  6. #5
    Jack
    Modérateur

    Re : Questions sur le langage en C

    3. Patients_List défini une (fausse) liste de patients la structure patient étant définie auparavant (n'est-ce pas Jack )
    Arghhh! J'avais loupé le tableau.

  7. #6
    Jack
    Modérateur

    Re : Questions sur le langage en C

    Mais quand on utilise un pointeur pour faire comme tu dis *ptblibli = 'y'; est-ce que dans ce cas on accède à une case qui a pour adresse y ou à l'adresse de la case qui contient y ?
    *ptblibli correspond à la donnée située à l'adresse ptblibli.
    Et pour ptblibli[0] = 'x' pourquoi il faut [0] avant ptbibli?
    Avant ou après?
    c'est pour remplacer l'étoile ou ca veut dire qu'il existe aussi ptiblibli[1], ptiblibli[2]... qui seront défini grâce à "l'endroit" se trouve ptiblibli[0] ?
    ptblibli[0] est une facilité syntaxique permettant d'éviter d'écrire *ptblibli, de même que ptblibli[2] est plus facile à lire que *(ptblibli + 2)

  8. #7
    polo974

    Re : Questions sur le langage en C

    Citation Envoyé par Aluno Voir le message
    Woa merci beaucoup à tous les deux ! (et désolée pour les codes)

    oui j'avais vu quelques trucs sur les pointeurs mais ca m'avait l'air bien compliqué ^^
    non, c'est juste une indirection...
    tu peux voir la mémoire comme un énorme tableau de char.
    mais il y a des endroits qui sont déjà utilisés (ou carrément interdit d'utilisation par le système).
    si tu utilises des variables, c'est le compilateur et le système qui se débrouillent pour ranger ça dans ce tableau.
    si tu utilises un pointeur, tu peux le positionner pour pointer n'importe où (avec des résultats genre "n'importe quoi ou pire").
    mais si tu prends garde à initialiser ton pointeur correctement et à ne pas aller plus loin que ce que tu as le droit, c'est super sympa:
    imagine que tu doives gérer une liste de trucs:
    soit tu fixes un maximum et tu déclares un tableau d'une taille max (et tu seras limité à cette taille (voir la "fausse liste" de ton exemple))
    soit tu gères une vraie liste et quand tu as besoin de place tu demandes au système (malloc par exemple), là tu démarres petit et tu ne sera limité que par le système (il faut tester les codes de retour des fonctions...).

    (pour la liste, on verra plus tard...)

    tout ça pour dire qu'un pointeur n'est pas compliqué, c'est juste très puissant (et donc on peut faire de très grosses co...ries)...

    Mais quand on utilise un pointeur pour faire comme tu dis *ptblibli = 'y'; est-ce que dans ce cas on accède à une case qui a pour adresse y ou à l'adresse de la case qui contient y ? (je sais pas si c'est très clair..)
    avant de faire *ptblibli = 'y';
    il faut avoir positionné ptblibli pour pointer vers un endroit valide.
    c'est cette étape que le débutant oublie très souvent.

    ensuite, on peut faire par exemple ptblibli++; pour pointer sur l'élément suivant d'un tableau déclaré et alloué.
    et là, il faut aussi s'assurer qu'on ne déborde pas de l'endroit valide. et ça même les vieux routiers de l'info oublient parfois de faire...

    pour revenir à ta question:
    si ton pointeur est initialisé correctement, *ptblibli = 'y'; va ranger le caractère 'y' à l'adresse pointée par ptblibli.
    ptblibli contient l'adresse, c'est une variable (de type pointeur sur char), on peut la modifier.
    *ptblibli correspond à la mémoire se trouvant à l'adresse pointée ( tout comme ptblibli[0] ), c'est normalement aussi une variable (de type char).

    Et pour ptblibli[0] = 'x' pourquoi il faut [0] avant ptbibli? c'est pour remplacer l'étoile ou ca veut dire qu'il existe aussi ptblibli[1], ptblibli[2]... qui seront défini grâce à "l'endroit" se trouve ptblibli[0] ?
    Merci encore
    comme dit par jack, ptiblibli[0] est équivalent à *ptblibli.
    et on peux effectivement écrire ptblibli[2] pour taper 2 char plus loin que ptblibli[0]. mais il faut comme toujours être sûr qu'on ne va pas déborder...

    Bref, encore une fois, un pointeur, c'est une variable qui indique un endroit, mais cet endroit peut ne pas exister. c'est à la charge du programmeur de le faire pointer vers une zone de donnée valide.
    Dernière modification par polo974 ; 07/01/2016 à 09h11. Motif: précision...
    Jusqu'ici tout va bien...

  9. #8
    invitedb41dd00

    Re : Questions sur le langage en C

    oui apres pour ptbibli[0] ^^

    ok merci beaucoup à vous deux pour vos réponses c'est gentil
    il me reste plus qu'à m’entraîner un peu (ou peut-être beaucoup)
    bonne fin de semaine!

Discussions similaires

  1. Postez ici vos questions concernant le langage Latex de ce forum
    Par Médiat dans le forum Mathématiques du supérieur
    Réponses: 47
    Dernier message: 11/09/2023, 08h25
  2. Differences entre le langage C et le langage Arduino
    Par invitef8e520ed dans le forum Électronique
    Réponses: 7
    Dernier message: 19/03/2015, 22h44
  3. Questions sur le langage C/C++
    Par invited7e4cd6b dans le forum Programmation et langages, Algorithmique
    Réponses: 16
    Dernier message: 03/04/2012, 11h56
  4. Questions sur le langage de commande UNIX
    Par inviteb4fcae87 dans le forum Logiciel - Software - Open Source
    Réponses: 19
    Dernier message: 18/11/2007, 18h53