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 :

Quel est le type de cette variable? (C -> C++ )


Sujet :

C++

  1. #1
    Membre averti Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Points : 341
    Points
    341
    Par défaut Quel est le type de cette variable? (C -> C++ )
    Je cherche à convertir ça en C++:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int *neigh = (int *)malloc(n * sizeof(int)), nn;
    Je vois bien qu'il y a un std::vector<int> neigh(n);, mais je ne comprends pas ce que fait le nn, ni quel est son type. Ca ressemble à un integer, parce que dans la suite du code, on trouve des choses comme:
    • nn = 0;
    • if(j< nn)
    • nn++
    Le débutant, lui, ignore qu'il ignore à ce point, il est fier de ses premiers succès, bien plus qu'il n'est conscient de l'étendue de ce qu'il ne sait pas, dès qu'il progresse en revanche, dès que s'accroît ce qu'il sait, il commence à saisir tout ce qui manque encore à son savoir. Qui sait peu ignore aussi très peu. [Roger Pol-Droit]
    Github
    Mon tout premier projet: une bibliothèque de simulation de génétique des populations

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    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 631
    Points : 10 559
    Points
    10 559
    Par défaut
    Citation Envoyé par Seabirds Voir le message
    Ca ressemble à un integer
    C'est la base du C la variable nn est de type int.

    On utilise l'opérateur virgule pour chaîner les définitions des variables exemple : int x, y, z;.
    Mais dans 1 définition est inclus l'initialisation int x=25, y, z=82;.

    Les variables pointeurs sont assez "vicieuses" parce que l'étoile n'affecte que la variable concernée, mais le type affecte toute la chaîne des définitions.
    C'est pour cela que certains préfèrent "coller" l'étoile à la variable concernée (int *x;) et non au type (int* x;).

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 116
    Points : 32 968
    Points
    32 968
    Billets dans le blog
    4
    Par défaut
    Vu que c'est assigné à un int*, nn est forcément un int*.
    Quant au code, il est juste immonde et génère rien d'autre qu'une fuite mémoire.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre averti Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Points : 341
    Points
    341
    Par défaut
    Aaaah bah décidez-vous les copains! int ou int* ?
    Oui oui, on est bien d'accord, c'est pas du joli code ahahah. Mais je fait le ménage et propage la bonne parole du C++ moderne, t'en fais pas
    Le débutant, lui, ignore qu'il ignore à ce point, il est fier de ses premiers succès, bien plus qu'il n'est conscient de l'étendue de ce qu'il ne sait pas, dès qu'il progresse en revanche, dès que s'accroît ce qu'il sait, il commence à saisir tout ce qui manque encore à son savoir. Qui sait peu ignore aussi très peu. [Roger Pol-Droit]
    Github
    Mon tout premier projet: une bibliothèque de simulation de génétique des populations

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 116
    Points : 32 968
    Points
    32 968
    Billets dans le blog
    4
    Par défaut
    Ce seul code est ambigu sans contexte.
    Soit c'est l'opérateur , donc tout est exécuté et seule la dernière valeur est assignée, donc ça fait le malloc, puis assign nn, donc nn doit être un int* précédemment déclaré, et le malloc est une fuite mémoire.
    Soit la, est juste un délimiteur et c'est une déclaration de neigh comme int* auquel on assigne le malloc et la déclaration de nn comme int non initialisé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nn = 0;
    if(j< nn)
    nn++
    Rien de tout ça n'est interdit sur des pointeurs.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre averti Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Points : 341
    Points
    341
    Par défaut
    Oh mon dieu, mais c'est vraiment vraiment immonde alors!
    Donc de ce que je vois du code, nn n'a jamais été déclarée (ni vers un int, ni vers un *int. Donc c'est ta deuxième option qui l'emporte.
    C'est vrai que ça coute super cher en encre de taper int nn = 0; !
    Le débutant, lui, ignore qu'il ignore à ce point, il est fier de ses premiers succès, bien plus qu'il n'est conscient de l'étendue de ce qu'il ne sait pas, dès qu'il progresse en revanche, dès que s'accroît ce qu'il sait, il commence à saisir tout ce qui manque encore à son savoir. Qui sait peu ignore aussi très peu. [Roger Pol-Droit]
    Github
    Mon tout premier projet: une bibliothèque de simulation de génétique des populations

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    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 631
    Points : 10 559
    Points
    10 559
    Par défaut
    Citation Envoyé par Seabirds Voir le message
    C'est vrai que ça coute super cher en encre de taper int nn = 0; !
    C'est 1 peu stupide ce que tu dis

    Chaîner les définitions cela permet de réduire la taille des blocs des définitions. Alors certes en C++, on peut définir 1 variable n'importe quand.
    Mais ce n'est pas le cas avant le C99 qui oblige de définir en début de bloc.

    Après définir 1 pointeur et 1 variable normale en même temps, ce n'est pas vraiment approprié (parce qu'en définitive ce n'est pas le même type).
    En tout cas, ton debugger/ compilateur (avec 1 printf par exemple) devrait te dire les types.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Comme dit par foetus, nn n'est pas un pointeur, il s'agit d'un int. L'étoile ne s'applique en effet qu'à la seule variable qui suit. Et cette variable nn est bel et bien déclarée sur cette ligne.
    Ton code est équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int *neigh = (int *)malloc(n * sizeof(int));
    int nn;
    Si tu as d'autres interrogations dans le même genre, je peux te conseiller l'excellent site https://cppinsights.io/.

  9. #9
    Membre averti Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Points : 341
    Points
    341
    Par défaut
    Oui c'est une blague un peu stupide
    Je sais bien qu'il y a tout un tas de pratiques qui font du sens en C - et je suis sûr que du joli C ça doit être bien sympa à travailler Mais dans ce cas précis, le code n'en est vraiment pas à la déclaration chaînée près
    Dans mon cas, lire le code de Winjerome m'aurait été plus clair Aussi merci pour le site! C'est la première fois que je me frotte à du C et c'est plein de syntaxe inconnue
    Le débutant, lui, ignore qu'il ignore à ce point, il est fier de ses premiers succès, bien plus qu'il n'est conscient de l'étendue de ce qu'il ne sait pas, dès qu'il progresse en revanche, dès que s'accroît ce qu'il sait, il commence à saisir tout ce qui manque encore à son savoir. Qui sait peu ignore aussi très peu. [Roger Pol-Droit]
    Github
    Mon tout premier projet: une bibliothèque de simulation de génétique des populations

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    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 631
    Points : 10 559
    Points
    10 559
    Par défaut
    C'est 1 spécificité du language C (l'étoile dans 1 définition) ... que ceux qui font les tests pour les entretiens l'utilisent (pour faire des tests vite fait).
    Par exemple : int* a, b, *c, **d, e; Quel est le type de c et de e ?

    En C++, c'est + la place du const :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        size_t i;
     
        const size_t * a;
        size_t const * b;
        size_t * const c = &i;
    C'est soit le pointeur soit le pointé qui est constant.


    @Bousk parle de l'opérateur virgule qui a 2 fonctions : comme séparateur ou comme opérateur.
    comma operator, lien wikipedia en anglais

    L'operateur virgule est surtout utilisé dans la boucle for pour les initialisations et pour les instructions de boucle.
    On peut arriver a du code assez "brutal"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        size_t i,j;
     
        for(i=1, j=11; i < 10; printf("%lu\n", 2*i+j), j=j-1, ++i);
     
        printf("\n****\n");
     
        for(i=1, j=11; i < 10; i=(printf("%lu\n", 2*i+j), j=j-1, i+1));

  11. #11
    Membre averti Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Points : 341
    Points
    341
    Par défaut
    c serait donc un pointeur sur integer, et e un simple integer Ok, une fois qu'on connait le truc c'est facile, mais faut le connaître. Va peut etre falloir que je me décide à lire un cours de C un de ces jours ...

    Daaamn, j'avais jamais pensé au double usage de la virgule Cet extrait de code est remarquablement obscure ahaha Il a fallu que j'utilise compiler explorer pour avoir l'output. Diantre!
    Le débutant, lui, ignore qu'il ignore à ce point, il est fier de ses premiers succès, bien plus qu'il n'est conscient de l'étendue de ce qu'il ne sait pas, dès qu'il progresse en revanche, dès que s'accroît ce qu'il sait, il commence à saisir tout ce qui manque encore à son savoir. Qui sait peu ignore aussi très peu. [Roger Pol-Droit]
    Github
    Mon tout premier projet: une bibliothèque de simulation de génétique des populations

  12. #12
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 621
    Points : 30 645
    Points
    30 645
    Par défaut
    Salut,
    Citation Envoyé par foetus Voir le message
    C'est 1 peu stupide ce que tu dis

    Chaîner les définitions cela permet de réduire la taille des blocs des définitions. Alors certes en C++, on peut définir 1 variable n'importe quand.
    Mais ce n'est pas le cas avant le C99 qui oblige de définir en début de bloc.
    Ouais, mais bon...

    D'abord, je ne suis quand meme pas sur de préférer avoir une ligne par variable, même si elles sont toutes déclarées en début de bloc, avec le types correspondants pour chacune, car cela provoque une moins grande "charge cognitive"

    Et, ensuite, je doute très fort que, même avant 1999, le fait d'avoir trois fois le terme int dans un code au lieu de ne l'avoir une fois ait risqué d'occasionner le moindre problème en terme de taille du fichier sur le disque dur, même lorsque la taille des disques durs s'exprimait encore en Mb

    Il n'y a vraiment que si on remonte vraiment très loin, presque à l'époque où C a été créé, que chaque caractère pouvait effectivement compter dans le code
    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

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

Discussions similaires

  1. Quel est le principe de cette technologie
    Par epock29 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 06/03/2007, 09h54
  2. quel est le type pour une image?
    Par kitiara999 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 06/12/2006, 18h07
  3. [Conception] quel est le type de variable a choisir?
    Par King_T dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 29/05/2006, 00h27
  4. Quel est le type retourné ?
    Par Rupella dans le forum C
    Réponses: 4
    Dernier message: 30/11/2005, 14h01
  5. [langage] "@$" Quel est ce type de variable?
    Par YanK dans le forum Langage
    Réponses: 4
    Dernier message: 21/04/2005, 18h07

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