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 :

les Astuces du C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 131
    Par défaut les Astuces du C
    Bonsoir,

    J ai cree ce poste pour montrer des choses que j ai une chose il n y a pas tres longtemps :

    Comment declarer rapidement un pointeur sur un entiers et de l initialiser a 0 par exemple?

    Reponse :
    Super pratique non ?
    Tres franchement c est tellement logique que je n y avait jamais pense :p

    Attention ceci reste une declaration static donc pas de free a la fin merci

    Si vous avez d autre code comme ca je suis preneur.

  2. #2
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    mais qu'est-ce que t'as contre:
    c'est pas plus lisible?

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 116
    Par défaut
    Utiliser la syntaxe de façon non standard est plus un moyen d'introduire la confusion dans l'esprit du relecteur si l'utilisation ne se justifie pas pour la compression du code, et encore même si àa se justifie, c'est difficile à relire à moins d'être entraîné à la relecture.
    ______________________________________________________
    (Vous pouvez toujours aller faire un tour sur ce site si ça vous intéresse, il y a des chances que vous y trouviez votre bonheur.)

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    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 berg
    Super pratique non ?
    L'art de compliquer les choses... De plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `main':
    main.c:4: warning: ISO C90 forbids compound literals
    main.c:4: warning: unused variable `p'
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 1 seconds)
    0 errors, 2 warnings
    Je ne vois pas ce qui me ferais changer de

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par berg
    Reponse :
    Super pratique non ?
    Pourquoi faire simple quand on peut faire compliqué Si c'est ta devise y'a que toi que ca regarde
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 116
    Par défaut
    Citation Envoyé par Franck.H
    Pourquoi faire simple quand on peut faire compliqué Si c'est ta devise y'a que toi que ca regarde
    Mon lien est vraiment très bon si vous avez un esprit de compétiteur dans ce domaine.

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    en général la façon normale d'utiliser l'initialiseur global de C est pour les structures ou les tableaux ayant des valeurs constantes...

    voir http://c.developpez.com/cours/bernar...gne/node80.php ou
    http://c.developpez.com/cours/bernar...00000000000000

    mais mêler une telle déclaration (déjà impossible réellement puisque dimension inconnue) à une initialisation relève au minimum de l'inconscience...

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 131
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    L'art de compliquer les choses... De plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `main':
    main.c:4: warning: ISO C90 forbids compound literals
    main.c:4: warning: unused variable `p'
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 1 seconds)
    0 errors, 2 warnings
    Je ne vois pas ce qui me ferais changer de

    Cela ne met pas le pointeur a NULL ...
    Cela sert tout simplement a reserver un morceau de memoire egale a 0 ou p pointe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main() {
            int *p = (int[]){0};
     
            if (p == NULL) printf("NULL\n");
            else printf("%d\n", *p);
     
            return 0;
    }
    cela me donne :
    De plus je suis sous linux, je compile avec -Wall je n ai pas aucun warning.
    Moi je trouvais que c etait une maniere elegante de creer un pointeur sur entier et de l initialiser a 0...

  9. #9
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par berg
    Cela ne met pas le pointeur a NULL ...
    Cela sert tout simplement a reserver un morceau de memoire egale a 0 ou p pointe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main() {
            int *p = (int[]){0};
     
            if (p == NULL) printf("NULL\n");
            else printf("%d\n", *p);
     
            return 0;
    }
    cela me donne :
    De plus je suis sous linux, je compile avec -Wall je n ai pas aucun warning.
    Moi je trouvais que c etait une maniere elegante de creer un pointeur sur entier et de l initialiser a 0...
    En fait, ce que tu fais, lors de la déclaration du pointeur *p,c'est de l'initialiser avec l'adresse à laquelle se trouve le premier élément du tableau ne contenant qu'un seul élément de type int...L'élément unique étant initialisé à 0...

    Le pire de l'histoire, c'est qu'il est fort vraissemblable que tant p[0](car cela revient en fait à cela) que p en tant que pointeur se trouvent dans la mémoire "read-only" avec les différentes limites que cela impose

    Bref, ce n'est ni élégant, ni facile à relire, et très limité d'utilisation...

    Autant dire tout de suite que je préférerais encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int entier=0;
    int *p=&entier;
    qui aura au moins l'avantage de rester cohérent avec ce que l'on veut réellement
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    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 berg
    Cela ne met pas le pointeur a NULL ...
    Cela sert tout simplement a reserver un morceau de memoire egale a 0 ou p pointe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main() {
            int *p = (int[]){0};
     
            if (p == NULL) printf("NULL\n");
            else printf("%d\n", *p);
     
            return 0;
    }
    cela me donne :
    Je ne suis pas sûr que ce code soit correct. Je pense que c'est plutôt une extension de gcc.
    De plus je suis sous linux, je compile avec -Wall je n ai pas aucun warning.
    Insuffisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -Wall -Wextra -ansi -pedantic
    Moi je trouvais que c etait une maniere elegante de creer un pointeur sur entier et de l initialiser a 0...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    {
       int x = 0;
       char *p = &x;
    }
    Je ne sais pas si c'est élégant, mais c'est au moins correct. Ce que tu veux faire est une sorte d'extension du mécanisme de définition de pointeurs sur chaines, via un tableau anonyme.
    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
     
    #include <stdio.h>
     
    int main (void)
    {
       int *p = (int[]) { 123, 456 };
     
       if (p == NULL)
          printf ("NULL\n");
       else
       {
          printf ("%d\n", p[0]);
          printf ("%d\n", p[1]);
       }
       return 0;
    }
    L'idée est intéressante, mais à ma connaissance, ce n'est pas supporté par le langage C.

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Par défaut
    Ce qui est valide:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int p0[] = {123,456};
    int *p = p0;
    C'est moins concis que la forme proposée par berg mais même si on comprend bien ce que cette dernière signifie, elle n'est pas acceptée par tous les compilateurs.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 131
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    ...
    Insuffisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -Wall -Wextra -ansi -pedantic
    ....
    effectivement cela me donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    test.c: In function ‘main’:
    test.c:4: warning: ISO C90 forbids compound literals
    Donc ok a proscrire ... Dommage ^^ .

  13. #13
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par berg
    effectivement cela me donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    test.c: In function ‘main’:
    test.c:4: warning: ISO C90 forbids compound literals
    Donc ok a proscrire ... Dommage ^^ .
    Et puis de toute manière NULL c'est quoi, c'est simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define NULL ((void *) 0)
    Du moins sur Linux, cela peut dépendre de l'implémentation !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 131
    Par défaut
    Citation Envoyé par berg
    Cela ne met pas le pointeur a NULL ...
    Cela sert tout simplement a reserver un morceau de memoire egale a 0 ou p pointe.
    ....
    Pourtant je l avais deja dit, comme quoi ca ne doit pas etre vraiement facile a lire pour le commun des mortels

  15. #15
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Je suis en train d'étudier Blender, me gave de tutos depuis ce matin 10h donc on va mettre ca sur le compte de l'inattention
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/04/2015, 11h33
  2. Toutes les astuces pour un e-mailing qui fait réagir
    Par Bovino dans le forum E-Mailing
    Réponses: 0
    Dernier message: 14/02/2012, 14h03
  3. Toutes les astuces pour un e-mailing qui fait réagir
    Par Bovino dans le forum Général Conception Web
    Réponses: 0
    Dernier message: 14/02/2012, 14h03
  4. Les astuces pour alléger et optimiser Eclipse
    Par Invité dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 13/06/2007, 12h23

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