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 :

Quelques précisions. . .


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Par défaut Quelques précisions. . .
    Bonjour,

    J'apprends en ce moment le C, et j'adore coder et tout le reste . . .
    Cependant, j'aimerais que l'on m'apporte certaines précisions, car j'admet être un peu perdu.

    Voici ce que je voudrais savoir -> :

    1) J'ai récemment vu un exemple de source en C, et j'y ai noté quelque chose. De cet exemple, j'ai sauté à une conslusion : Lorsque l'on communique entre fonctions, la fonction appelée ne peut modifier une variable de la fonction appelante. Toutefois, cette règle ne s'applique pas pour les tableaux.
    À titre d'exemple :
    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
    23
    24
     
    #include <stdio.h>
     
    void copy(char from[], char to[]);
     
    int main(void) {
    	char devon[6];
    	char shire[6];
    	devon[0]='h';
    	devon[1]='e';
    	devon[2]='l';
    	devon[3]='l';
    	devon[4]='o';
    	devon[5]='\0';
    	copy(devon, shire);
    	printf("%s\n", shire);
    	return 0;
    }
     
    void copy(char from[], char to[]) {
    	int i;
    	for (i = 0; i <= 5; ++i)
    		to[i] = from[i];
    }
    Lorsque l'on appelle copy(devon, shire), from[] et to[] se trouvent à opérer directement sur devon et shire.

    Es-ce exact???

    2) '\0' doit être présent dans un tableau de caractères, car il indique la fin de ce tableau.

    3) On peut déclarer un tableau sans spécifier sa taille seulement dans une déclaration d'argument propre à une fonction.

    Par exemple, si c'est exact, je ne pourrais faire cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include <stdio.h>
     
    int main(void) {
        char devon[];
        int shire[];
     
        . . .
     
    }

    Voilà, ce ne sont que de simple questions afin de m'assurer que je ne me trompe pas. Si vous pouviez me donner vos réponses en spécifiant le numéro de la question correspondante, j'en serais enchanté, simplement pour plus de clarté.

    Sincèrement,

    Array

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Citation Envoyé par Array
    1) J'ai récemment vu un exemple de source en C, et j'y ai noté quelque chose. De cet exemple, j'ai sauté à une conslusion : Lorsque l'on communique entre fonctions, la fonction appelée ne peut modifier une variable de la fonction appelante. Toutefois, cette règle ne s'applique pas pour les tableaux.
    La différence entre les tableaux et les valeurs normales, c'est que les tableaux ne sont jamais copié contrairement aux autres valeurs, on transmet l'adresse du premier élément ce qui fait qu'une fonction agit directement sur le tableau et non pas sur une copie. Cela correspond à modifier les données pointées par un pointeur passé en paramètre. Le pointeur étant une variable "normale" sa valeur est copiée dans l'espace mémoire de la fonction appelée, mais comme deux pointeurs ayant la même valeur pointent sur le même espace, l'espace pointée peut-être modifiée par la fonction appelée et les modifications seront visible dans la fonction appelante.

    Citation Envoyé par Array
    2) '\0' doit être présent dans un tableau de caractères, car il indique la fin de ce tableau.
    Pas exactement, en fait '\0' correspond au caractère final d'une chaîne de caractère C, le tableau peut faire 800 caractères, si le 5ème caractères et un '\0', alors la chaîne ne fait que 4 caractères (le caractère NUL n'est pas comptée).

    Citation Envoyé par Array
    3) On peut déclarer un tableau sans spécifier sa taille seulement dans une déclaration d'argument propre à une fonction.
    Oui, mais à condition de l'initialiser, ce que tu mets dans tes exemples est faux et risque de se retourner contre toi. En revanche, si tu écris ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int monTableau[] = {5, 10, 15, 0, 2, 4};
    Alors le compilateur créera un tableau de taille 6 et y mettra les valeurs que tu indiques. De même, si tu écris ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char maChaine[] = "awezgaga";
    Tu auras un tableau de char de longueur 9, c'est-à-dire 8 caractères imprimables + le caractère NUL final. Mais ceci :

    a sans doute un comportement indéfini, et les comportements indéfinis sont à fuir comme la peste...

  3. #3
    Membre confirmé Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Par défaut
    Ah, je vous remercie. J'y vois plus lucidement.

    Cependant, à la question 3, j'aimerais simplement avoir une précision :

    Voici deux exemples :

    Ex.1.:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <stdio.h>
     
    int main(void) {
    int array[];
     
    . . .
     
    }
    Ex.2.:
    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
    #include <stdio.h>
     
    int newfunc(char fmaintab[], char regdb[]);
     
    int main(void) {
     
    . . .
     
    }
     
    int newfunc(char fmaintab[], char regdb[]) {
     
    . . .
     
    }
    Le compilateur GCC acceptera l'exemple #2, cependant, il refusera le #1.
    C'est pour cela que je demandais si la déclaration de tableaux sans définition de sa taille était uniquement autorisée pour les arguments de fonctions.

    Pourquoi GCC refuse le premier exemple, mais acccepte le deuxième!?

  4. #4
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    peut etre qu'il aurait fallu ajouter une ou deux lignes dans ton exemple de code pour que tu puises comprendre :
    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
    #include <stdio.h>
     
    int newfunc(char fmaintab[], char regdb[]);
     
    int main(void) {
     
     char C_fmaintab[10] , C_regdb[5];
     newfunc(C_fmaintab , C_regdb);
    . . . 
    }
     
    int newfunc(char fmaintab[], char regdb[]) {
     
    . . .
     
    }
    La je pense que c'est un peu plus clairs la taille de fmaintab sera 10 et celle de regdb sera 5, donc pas besoin de la définir ... tu pourra écrire ce que bon te semble le compilateur ne prendra en charge que la taille déclarer ...
    ceci ne sert a rien :
    int newfunc(char fmaintab[10], char regdb[5])
    int newfunc(char fmaintab[6899], char regdb[8])
    encore une fois essaye de compiler pour voir le résultats .

  5. #5
    Membre confirmé Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Par défaut
    Non, bien entendu, j'avais du code . . .
    Je suis conscient que le compilateur aurait fait une erreur à cause d'une fonction main() totalement vide.



    Bon... reprenons devonshire :

    Ex.1.:
    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
    23
    24
     
    #include <stdio.h>
     
    void copy(char from[], char to[]);
     
    int main(void) {
    	char devon[];
    	char shire[];
    	devon[0]='h';
    	devon[1]='e';
    	devon[2]='l';
    	devon[3]='l';
    	devon[4]='o';
    	devon[5]='\0';
    	copy(devon, shire);
    	printf("Shire is \"%s\"\n", shire);
    	return 0;
    }
     
    void copy(char from[], char to[]) {
    	int i;
    	for (i = 0; i <= 5; ++i)
    		to[i] = from[i];
    }
    Ex.2.:
    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
    23
    24
     
    #include <stdio.h>
     
    void copy(char from[], char to[]);
     
    int main(void) {
    	char devon[6];
    	char shire[6];
    	devon[0]='h';
    	devon[1]='e';
    	devon[2]='l';
    	devon[3]='l';
    	devon[4]='o';
    	devon[5]='\0';
    	copy(devon, shire);
    	printf("Shire is \"%s\"\n", shire);
    	return 0;
    }
     
    void copy(char from[], char to[]) {
    	int i;
    	for (i = 0; i <= 5; ++i)
    		to[i] = from[i];
    }
    La compilation échoue à l'exemple #1 mais se déroule sans encombre pour l'exemple #2.

    Le erreurs reportées à l'exemple #1 :

    Citation Envoyé par compilateur_mingw

    devonshire.c:6: error: array size missing in 'devon'
    devonshire.c:7: error: array size missing in 'shire'
    Pourquoi accepte-t-il des tableaux avec taille inconnue dans les déclarations de fonctions et refuse de tels tableaux au sein des fonction!?

    MingW . . . GCC . . .

  6. #6
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Pourquoi accepte-t-il des tableaux avec taille inconnue dans les déclarations de fonctions et refuse de tels tableaux au sein des fonction!?
    Elle n'est pas inconnu puisque c'est celle des tableaux passés en arguments, suivant ton exemple la taille de from sera celle de devon et celle de to sera celle de shire .
    je ne sais pas si je me trompe mais je pense que lors du passage d'un tableaux il ni y'a que l'adresse du premier élément que tu fait passer (un pointeur) donc pas de nouvel espace alloué pour ce tableaux .
    Je suis conscient que le compilateur aurait fait une erreur à cause d'une fonction main() totalement vide.
    je n'ai pas parler de sa ...enfin bref

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Array
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <stdio.h>
     
    int main(void) {
    int array[];
     
    . . .
     
    }
    -Pas du C. Un tableau doit être défini avec une taille explicite ou une initialisation qui définisse sa taille implicitement. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main(void) {
    int array[4];
     
    . . .
     
    }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main(void) {
    int array[] = {4,6,2 0};
     
    . . .
     
    }
    La forme 'T id[]' utilisée comme paramètre de fonction est une autre forme de 'T *id'. C'est un pointeur et non un tableau.

    Tout cela est basique et expliqué dans ton livre de C qu'il ne faut pas hésiter à ouvrir et même à lire !

  8. #8
    Membre confirmé Avatar de Beldom
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 63
    Par défaut
    C'est ce que je voulais dire ^^
    Mais c'est plus clair dit comme ca

    /me va prendre des cours pour apprendre à expliquer simplement.

    Si tu as d'autres questions, n'hésite pas à fouiller ton livre de code puis à demander

  9. #9
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    La fonction est quand même compilée, appellée ou pas -_-"
    Le compilo passe dans tous les fichiers qu'on lui indique et vérifie toutes les fonctions.
    OUPS c'est totalement vrai ,j'eviterai de dire des bêtises la prochaine fois ....

  10. #10
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Salut,
    Lorsque l'on communique entre fonctions, la fonction appelée ne peut modifier une variable de la fonction appelante. Toutefois, cette règle ne s'applique pas pour les tableaux.
    -Pas tout a fait la fonction appelée peut changer une variable de la fonction appelante dans les cas suivants :
    *la variable est passée en paramètre (passage par adresse)
    *la variable est déclarée comme variable générale
    -Pour ce qui est des tableaux leurs noms désigne l'adresse de la première case
    TAB=&TAB[0] ,donc quand tu écrit : copy(char from[], char to[]) from et to sont passées par adresse .
    REMARQUE :
    devon[0]='h';
    devon[1]='e';
    devon[2]='l';
    devon[3]='l';
    devon[4]='o';
    devon[5]='\0';
    Peut être remplacer simplement par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      devon[6]="hello";   /*le '\0' est ajouté par défaut*/
    2) '\0' doit être présent dans un tableau de caractères, car il indique la fin de ce tableau.
    Exact...
    #include <stdio.h>

    int main(void) {
    char devon[];
    int shire[];

    . . .

    }
    Je craint que ceci soit faux ,mais ton compilateur te le dira de toute facon essaye de le compiler ce sera la meilleurs des réponses .
    Voila j'espère avoir répondu a tes question je débute en C aussi donc il se peut que je dise des bêtises

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/12/2007, 20h44
  2. Entrées.. Sorties.. quelques précisions..
    Par Djef-69 dans le forum SL & STL
    Réponses: 2
    Dernier message: 29/11/2007, 00h16
  3. [Fabrique] Quelques Précisions
    Par djflex68 dans le forum Design Patterns
    Réponses: 8
    Dernier message: 20/12/2006, 14h34
  4. Quelques "précisions" sur Struts
    Par Atma_ dans le forum Struts 1
    Réponses: 19
    Dernier message: 03/11/2006, 16h20

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