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 :

Des questions de débutante en vrac


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut Des questions de débutante en vrac
    Heu je relis mon titre, ce n'est pas la débutante qui est en vrac, ce sont les questions.

    Je n'ai encore travaillé qu'un tuto en C, tuto assez poussé, mais je ne l'ai pas encore fini...

    Alors je me permets de poser ici mes questions en vrac comme elles viennent :

    1) Quand on utilise plusieurs fois une boucle for avec i, faut-il réinitialiser i à zéro entre deux boucles ?

    2) Existe-t-il une sorte de manuel des librairies standard de C ?

    3) Quand j'utilise une variable qui est affectée directement (par retour d'une fonction par exemple), puis-je sans danger ne pas l'initialiser dans la déclaration ? Il me semblait logique que oui, mais bon...
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  2. #2
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Bonjour,

    1) Ca depend, en fait la structure d'une boucle for est comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for (initialisation ; condition ; pas)
    {
    }
    En general, on rempli ces trois champ, donc l'initialisation est faite. Dans ce cas, il est inutile de remettre i à 0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    for (i=0 ; i<5 ; i++)
    {
        ...
    }
     
    /* Inutile */
    i = 10;
     
    for (i=10 ; i<25 ; i++)
    {
        ...
    }

    Cependant, il est possible de ne pas mettre l'initialisation, condition et pas.
    Ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /* Boucle infini */
    for (;;)
    {
        ...
    }


    2) Une sorte de "manuel" ? Oui, il existe les page "man" qui decrive les fonction des librairie usuelle. Apres, pour une librairie importé style SDL, il y a la doc fourni avec.

    3) Oui, et non. En fait, c'est encore une question de gout. Si tu ne l'initialise pas avant, tu risque de faire une betise.

    Sinon, pourquoi ne pas affecter, quand c'est possible, directement le resultat de la fonction dès la declaration de la variable ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int moyenne = Moyenne (TouteLesNotes, nombreDeNote);

  3. #3
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Merci de tes 3 réponses, elles me vont impec.

    Heu, pour la 2, t'as un lien ? Ou faut que je passe absolument par la commande man sous unix ?

    Oops, j'ai trouvé via Google. Sur ma console, man 3 nom-de-la-fonction

    Une question qui rebondit sur la 3, mais qui touche à l'épineux problème des pointeurs (qui eux, ont vaguement tendance à vouloir me mettre en vrac, mais je me laisse pas faire... )

    Comment déclarer une valeur qui dit

    Je veux l'adresse de ce tableau de 26 lettres ???

    Le compilateur n'aime pas trop la ligne ci-dessous.

    int *mottire[26]=tireMot(pif);
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  4. #4
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Pour le pointeur de tableau :


    En realité, ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int NomTableau[20];
    on aurait dit que NomTableau est un tableau de 20 int.
    En fait, non.
    NomTableau est un pointeur vers le premier element (en l'occurence NomTableau[0]).

    C'est pour cette raison que lors d'un scanf avec un tableau, on ne rajoute pas & puisque c'est deja un pointeur.


    NomTableau[3] == *(NomTableau + 3)
    Si je ne m'abuse.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ce n'est pas exact.

    NomTableau est bel et bien un tableau de 20 int et non un pointeur. La preuve, c'est que ceci ne compile pas:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int NomTableau[20];
    int **pp = &NomTableau;
    Alors que ceci compile:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int NomTableau[20];
    int (*pt)[20] = &NomTableau;
    (Comme tu peux le voir, la syntaxe "pointeur sur tableau" est un peu contre-intuitive: traduit en langage clair, ça donnerait int[20]* pt, mais le compilo n'accepte pas ça).

    En fait, NomTableau peut être converti implicitement en pointeur sur le premier élément. Et là où c'est traitre, c'est que c'est fait automatiquement lors de l'appel d'une fonction.
    Si tu déclares une fonction ainsi:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    void UneFonction(int unTableau[20])
    tu te fais avoir, car en réalité le compilateur ignore le 20, voyant ceci:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    void UneFonction(int unTableau[])
    qu'il considère équivalent à ceci:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    void UneFonction(int *unTableau)

    Donc en fait, un tableau n'est jamais passé directement par valeur à une fonction: Il y a conversion implicite en pointeur à la place. C'est l'une des choses contre-intuitives du C.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par Dendrite Voir le message
    Heu, pour la 2, t'as un lien ? Ou faut que je passe absolument par la commande man sous unix ?
    Par exemple: http://man.developpez.com

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  7. #7
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Merci à tous.

    Concrètement, sur les problèmes de pointeur, je vous mets mon code, vous allez voir où j'achoppe.

    J'ai construit cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    //copie le mot du fichier à la ligne passée en paramètre
    //retourne le pointeur sur le mot copié
     
    int tireMot(ligneAleatoire){
        char ligne[26]={0}, mottire[26]={0};
        int i=0;
     
        FILE *fichier = fopen("liste.txt","r");;
        if (fichier == NULL){
            printf("Le fichier ne peut etre ouvert.");
            return 1;
        }
        while (fgets(ligne,26,fichier)!=NULL){
            i++;
            if(i==ligneAleatoire){
                strcpy(mottire,ligne);
            }
     
        }
        fclose(fichier);
        return *mottire;
    }
    1) Cette façon de renvoyer le pointeur est-elle bonne ?

    2) Par quel code je récupère dans le main le "mot tiré" du coup ?
    Pour l'instant, je parviens au mieux à en récupérer la première lettre... pour les raisons que vous dites bien sûr.

    Suis-je obligée de refaire une boucle ou y a-t-il une syntaxe directe ?
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  8. #8
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Tu fais un return de mottire qui est un char[].

    Or, le return de ta fonction est ... int.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int tireMot(ligneAleatoire);
    ligneAleatoire est un type ?

    Bref, tu as plusieurs possiblité, mais celle la n'est pas bonne.
    Soit tu passe un tableau de caractere en argument a ta fonction, soit tu fais un return d'un tableau de caractere, retour que tu assignera.

Discussions similaires

  1. [W3C] Question de débutant pour remplacement des frames
    Par Grizzzly dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 24/07/2009, 16h44
  2. [Débutant] Des questions pour débutants
    Par Mo_Poly dans le forum ASP
    Réponses: 13
    Dernier message: 12/10/2008, 13h31
  3. Question de débutant au sujet des guillemets
    Par Evocatii dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/03/2008, 13h09
  4. Réponses: 2
    Dernier message: 14/01/2008, 07h32
  5. Débutant se posant des questions sur son futur
    Par Maxi-môme dans le forum Emploi
    Réponses: 25
    Dernier message: 31/08/2007, 23h41

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