Questions sur le langage C/C++
Répondre à la discussion
Affichage des résultats 1 à 17 sur 17

Questions sur le langage C/C++



  1. #1
    yootenhaiem

    Questions sur le langage C/C++


    ------

    Bonjour les gens,
    J'ai quelques questions a propos du langage C/C++:

    1- Peut-on allouer la mémoire a un pointeur bien avant la fonction main()?
    2- Comment définir une structure de tableaux (Une structure qui contient des tableaux) dont on ne connait point la taille(selon l’énoncé, c'est un certain n que l'utilisateur choisira après dans la fonction main() )?
    3- Un exemple de syntaxe pour avoir une fonction qui prend comme paramètre un pointeur, avec sa taille également et qui nous renvoie un tableau ou un autre pointeur.
    4- L'allocation dynamique peut-elle se faire au sein d'une fonction? i.e. pour allocation pour un pointeur que la fonction utilisera durant son exécution?
    5- Si je dois utiliser une fonction prédéfinie, au sein d'une fonction, et que cette-ci doit appeler un tableau, qui figure dans l'argument de la fonction sous la forme d'un pointeur. Comment faire?

    Merci de m'aider a comprendre.

    -----
    «Il faut toute la vie pour apprendre à vivre.»

  2. #2
    JPL
    Responsable des forums

    Re : Questions sur le langage C/C++

    À tout hasard je t'invite à lire http://forums.futura-sciences.com/pr...ces-forum.html
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  3. #3
    yootenhaiem

    Re : Questions sur le langage C/C++

    Bonsoir M'sieur,
    Je connais la charte du forum: j'y suis depuis plus d'un an et activement. Mais en informatique, je n'ai pas trouve quoi répondre a ces questions qui me paraissent dans les limites du programme de CPGE. Que me proposez vous, pour avoir des réponses? discuter de quoi?
    «Il faut toute la vie pour apprendre à vivre.»

  4. #4
    invite4492c379

    Re : Questions sur le langage C/C++

    Citation Envoyé par donkishot Voir le message
    Bonjour les gens,
    J'ai quelques questions a propos du langage C/C++:

    1- Peut-on allouer la mémoire a un pointeur bien avant la fonction main()?
    Hello,
    Je suppose que tu parles d'allocation dynamique (malloc,calloc,alloca,new,new[],....).
    Réponse courte : oui et non.
    Réponse simple : dans ton cas non, main est le point d'entrée de ton programme : c'est là que pour toi tout commence.
    Si tu ne parles pas d'allocation dynamique : oui, les variables globales sont initialisées avant l'entrées dans main :
    Code:
    static int i;
    static int* ptr_i=&i;
    static char* str="bonjour";
    static int tab[2]={0,1};
    Réponse un peu plus complexe : parfois oui, selon les architectures, l'OS et le compilateur. Par exemple via les extensions GCC pour l'initialisation de bibliothèques, mais cela ne devrait pas te concerner dans l'immédiat.

    Citation Envoyé par donkishot Voir le message
    2- Comment définir une structure de tableaux (Une structure qui contient des tableaux) dont on ne connait point la taille(selon l’énoncé, c'est un certain n que l'utilisateur choisira après dans la fonction main() )?
    Si je te mets sur la voie ... quelle lien existe-t-il entre tableau et pointeurs ?
    À quoi servent les fonctions comme malloc,calloc, new[] ?

    Citation Envoyé par donkishot Voir le message
    3- Un exemple de syntaxe pour avoir une fonction qui prend comme paramètre un pointeur, avec sa taille également et qui nous renvoie un tableau ou un autre pointeur.
    Une fonction se définit ainsi :

    [type retour] nom_de_fonction( type_param1 nom_param1, type_param2 nom_param2, ...)

    tu arrives à construire la fonction ?

    Citation Envoyé par donkishot Voir le message
    4- L'allocation dynamique peut-elle se faire au sein d'une fonction? i.e. pour allocation pour un pointeur que la fonction utilisera durant son exécution?
    Une drôle de question ... comment alloues-tu dynamiquement de la mémoire ? la réponse en découle. (cf question 2)

    Citation Envoyé par donkishot Voir le message
    5- Si je dois utiliser une fonction prédéfinie, au sein d'une fonction, et que cette-ci doit appeler un tableau, qui figure dans l'argument de la fonction sous la forme d'un pointeur. Comment faire?

    Merci de m'aider a comprendre.
    cf question 2.

  5. A voir en vidéo sur Futura
  6. #5
    whoami

    Re : Questions sur le langage C/C++

    Bonjour,
    Citation Envoyé par donkishot Voir le message
    J'ai quelques questions a propos du langage C/C++
    Bien que C++ soit une évolution de C, ce sont 2 langages différents, et les confondre est une erreur (hélas très répandue ).

  7. #6
    yootenhaiem

    Re : Questions sur le langage C/C++

    Bonsoir Photon57,
    1- J'ai bien compris ce que vous vouliez dire.
    Pour les autres je vois ou vous voulez en venir, cela résume les autres questions en deux:
    1- float *tab1, *tab2; cela signifie qu'on a définit un tableau dynamique de longueur quelconque. sauf si on alloue de la mémoire, et cela se fait dans main car c'est la que tout commence. C'est bien ça?
    2- Quand j'appelle nom_fonction(tab), je met le tableau dynamique en argument. Mais si je veux retourner un tableau c'est a dire. tab1=Nom_Fonction(tab2), comment je definis dans ce cas la fonction? (a la fin je définis le pointeur dans la fonction puis je met return (tab) ?)
    Whoami j'avoue que je ne fais pas beaucoup de différence, puisque je ne connais que quelques notions sur C. Merci de me l'avoir signalé
    «Il faut toute la vie pour apprendre à vivre.»

  8. #7
    invite4492c379

    Re : Questions sur le langage C/C++

    Citation Envoyé par donkishot Voir le message
    Bonsoir Photon57,
    1- J'ai bien compris ce que vous vouliez dire.
    Pour les autres je vois ou vous voulez en venir, cela résume les autres questions en deux:
    1- float *tab1, *tab2; cela signifie qu'on a définit un tableau dynamique de longueur quelconque. sauf si on alloue de la mémoire, et cela se fait dans main car c'est la que tout commence. C'est bien ça?
    Hello,

    Les pointeurs sont une notion fondamentale en c, et c'est pas forcément évident de s'y mettre. Un pointeur est juste une variable qui va contenir une adresse mémoire. Déréférencer un pointeur (= y accéder en le faisant précéder d'un *) signifie accéder à la valeur stockée dans la mémoire qui est pointée par ton pointeur. Pour récupérer l'adresse mémoire (là où est stocké la valeur) d'une variable il suffit de faire précéder cette variable par un &.
    Exemple :

    int entier=12; // On déclare entier comme étant une variable de type int valant 12
    int* pointeur_entier=&entier; // On déclare pointeur_entier comme étant une variable de type pointeur sur un int et on lui dit que ce pointeur pointe là où on stocke la valeur de la variable entier

    pointeur_entier vaudra un valeur qui ne signifie rien de particulier pour toi (du genre 0X0080FF80) mais *pointeur_entier vaudra 12.
    Si tu modifie entier en faisant entier++ par exemple alors entier vaudra 13 (=l'endroit où est stocké la valeur de la variable entier contient 13) et si tu affiches *pointeur_entier (càd la valeur où pointeur_entier pointe = entier) alors tu obtiendras aussi 13.

    Est-ce que cela est clair pour toi ?

    Ensuite il faut parler de l'arithmétique des pointeurs. Quand tu fais entier++, cela revient à incrémenter la valeur de entier de 1. Si tu fais pointeur_entier++, tu ne vas pas ajouter 1 à la valeur de pointeur_entier mais stu vas ajouter sizeof(int) (la taille en octet que prend un int en mémoire) soit communément 4. En gros tu passes toutes les cases mémoires qui sont utilisées pour stocker ton entier pour te retrouver sur la première non utilisée en quelquesorte.
    Si tu as double* pointeur_double, un pointeur_double++ ajoutera sizeof(double) (souvent 8 parfois 4 ou 16 ça dépend du compilo et de l'OS).
    Tu peux également écrire pointeur_entier=pointeur_entie r+2 (pour «sauter» un entier), ou bien accéder à l'entier stocké en mémoire juste après l'entier pointé par pointeur_entier en faisant *(pointeur_entier+1). Cette dernière notation est équivalente à pointeur_entier[1].

    Est-ce clair ?

    Un malloc réserve de la mémoire, en fait un bloc contigu de mémoire d'une certaine taille (que tu donnes en paramètre). Par exemple malloc(10*sizeof(int)) réserve un bloc contigu de RAM suffisant pour stocker 10 int, malloc te renvoie l'adresse de début de ce bloc.
    Donc quand tu écris :
    float* tab1=malloc(sizeof(float)*10);
    Ce qui se passe est :
    un float est stocké sur 4 octets, malloc réserve un bloc contigu de 40 octets en RAM et te renvoie l'adresse du début.
    Tu peux donc écrire *tab1=10.0 pour mettre la valeur 10.0 au début de ce bloc, remarque que *tab est équivalent à *(tab+0)=tab[0].
    Pour écrire 20.0 en troisième position un simple tab[2]=20.0 convient, mais tu aurais pu aussi écrire *(tab+2)=20.0

    C'est pile poil le comportement que l'on désire pour un tableau

    Mais attention !!!! si tu écris
    int tab_entier[20];
    alors tab_entier est un tableau déjà alloué => pas de malloc ou de free !!!!!
    la variable tab_entier est assimilable à un pointeur sur le premier élément.


    Quelques remarques :
    a/ Ne jamais accéder à de la mémoire non allouée : dans le meilleur des cas tu as un plantage, dans le pire un heisenbug.
    b/ Toujours libérer la mémoire quand on en a plus besoin, elle ne se libère pas toute seule.
    c/ Ne jamais essayer d'accéder à de la mémoire déjà libérée ou de la relibérer encore une fois, même effet que a

    Maintenant en c (pour faire très simple) dès que tu veux passer un tableau en paramètre tu passes simplement l'adresse de son premier élément. Par si tu as une fonction qui prend un tableau d'entier tab_in et qui doit retourner un autre tableau tab_out mais avec les éléments de tab_in triés en ordre croissant tu pourra définir :

    Code:
    int* tri_bubblesort(int* tab_in, int taille)
    {
      int* tab_out=malloc(taille*sizeof(int));
    
      ....
    
      return tab_out; // l'adresse du premier élément du tableau est &(tab_out[0])=&(*tab_out+0)=&(*tab_out)=tab_out
    }

    Pour ton niveau tu peux considérer que pointeurs et tableaux sont interchangeables.


    Toujours pour faire simple : non, tu ne peux rien comme action avant que main soit exécuté (aux assignations de variables globales près, ...).

    Citation Envoyé par donkishot Voir le message
    2- Quand j'appelle nom_fonction(tab), je met le tableau dynamique en argument. Mais si je veux retourner un tableau c'est a dire. tab1=Nom_Fonction(tab2), comment je definis dans ce cas la fonction? (a la fin je définis le pointeur dans la fonction puis je met return (tab) ?)
    Whoami j'avoue que je ne fais pas beaucoup de différence, puisque je ne connais que quelques notions sur C. Merci de me l'avoir signalé
    Bon, j'ai répondu dans le paragraphe précédent ...

    N'hésite pas à poser des questions, mais aussi à lire des cours et faire des tuto que tu trouveras un peu partout sur le net

  9. #8
    yootenhaiem

    Re : Questions sur le langage C/C++

    Rebonsoir,
    Je vous remercie vraiment de votre aide. La rigueur que la rigueur.
    J'ai également un petit problème sur Dev C++, je compile avec succès, mais quand j’exécute, le programme n'est fait qu'a quelques étapes, et on m'indique que le programme a rencontre un problème et doit fermer. Se peut-il que j'aie commis une faute, car j'ai vérifié ce point en utilisant une fonction super simple et le problème persiste. J'ai également désinstallé et réinstaller, mais en vain. Auriez vous une idée de ce qui se passe?
    «Il faut toute la vie pour apprendre à vivre.»

  10. #9
    Jack
    Modérateur

    Re : Questions sur le langage C/C++

    Je ne comprends pas pourquoi on utilise toujours DEV C++ dont le développement est abandonné depuis de nombreuses années, alors qu'il existe des IDE gratuits, performants et stables. Même si j'ai des affinités pour visual studio, Code::Blocks et Qt ont l'avantage d'être multiplateforme et en constant développement.

    A+

  11. #10
    yootenhaiem

    Re : Questions sur le langage C/C++

    Ah bon, ça pourrait expliquer le problème. Merci Jack.
    «Il faut toute la vie pour apprendre à vivre.»

  12. #11
    polo974

    Re : Questions sur le langage C/C++

    Citation Envoyé par donkishot Voir le message
    Ah bon, ça pourrait expliquer le problème. Merci Jack.
    Trop facile de mettre le bug sur le dos d'un vieux soft...

    La plupart du temps (99.99% des cas), le programme fait ce que tu lui as demandé à ne pas confondre avec ce que tu crois que tu lui as demandé...

    Mais ne t'en fais pas, on est tous passé par là (avec des rechutes plus ou moins graves)...
    Jusqu'ici tout va bien...

  13. #12
    yootenhaiem

    Re : Questions sur le langage C/C++

    Oui vous avez un pied sur la raison, et l'autre dans l'erreur.
    Mais un programme qui ne compile pas un simple printf, scanf cela veut dire deux choses:
    1- Mes cours sont erronés.
    2- Le programme est en bug.
    Les chances pour que la première soit la bonne sont minimes.
    Merci en tout cas pour votre précieuse intervention, vous m'encouragez .
    «Il faut toute la vie pour apprendre à vivre.»

  14. #13
    Jack
    Modérateur

    Re : Questions sur le langage C/C++

    Un peu plus haut tu disais que la compilation se passait avec succès ...

    A+

  15. #14
    yootenhaiem

    Re : Questions sur le langage C/C++

    Je voulais dire exécution. Désolé
    «Il faut toute la vie pour apprendre à vivre.»

  16. #15
    polo974

    Post Re : Questions sur le langage C/C++

    Citation Envoyé par donkishot Voir le message
    Oui vous avez un pied sur la raison, et l'autre dans l'erreur.
    ...
    Marrant comme expression, je ne la connaissais pas...

    Bon, pour le bug à l'exécution, il faut voir :
    1. quels sont les warning lors de la compil
    2. s'il n'y a pas un pointeur orphelin ou 2...
    3. ou un petit mélange pointeur /data

    petite piste:
    scanf et printf sont de faux amis:
    Code:
    int data;
    scanf("%d, &data);
    printf ("%d", data);
    donc le copié/collé est mortel...
    (le scanf a besoin d'un pointeur pour aller ranger la data.
    le printf a juste besoin de la data.)
    Jusqu'ici tout va bien...

  17. #16
    Dlzlogic

    Re : Questions sur le langage C/C++

    Bonjour,
    Chapeau l'explication de Photon.
    A propos de scanf(...), on m'a appris à éviter de l'utiliser. C'est à dire qu'il vaut mieux lire une ligne avec gets() par exemple, puis utiliser sscanf(...).
    Je peux vous faire un programme de 2 lignes, qui compile parfaitement mais ne s'exécute pas.
    Probable que vous ayez plus d'un pied dans l'erreur.
    Contrairement aux humains, l'age d'un programme, compilateur ou exécutable, n'a pas grand-chose à voir dans vos soucis.

  18. #17
    yootenhaiem

    Re : Questions sur le langage C/C++

    Bonjour,
    Je vous remercie pour votre explication.
    «Il faut toute la vie pour apprendre à vivre.»

Discussions similaires

  1. Questions sur le langage de commande UNIX
    Par inviteb4fcae87 dans le forum Logiciel - Software - Open Source
    Réponses: 19
    Dernier message: 18/11/2007, 17h53
  2. pb de langage c sur pic
    Par monsieurcontacte dans le forum Électronique
    Réponses: 14
    Dernier message: 14/12/2006, 18h42
  3. question sur le langage C
    Par invite0b0ee8b7 dans le forum Logiciel - Software - Open Source
    Réponses: 32
    Dernier message: 11/06/2005, 13h44
  4. Tpe sur le langage
    Par invite8ccf8497 dans le forum TPE / TIPE et autres travaux
    Réponses: 1
    Dernier message: 19/11/2004, 18h30