Langage C

Discutez d'informatique ici !
Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 31 Oct 2013, 16:53

Essaye de lire un cours (sur le site du zero par exemple) pour apprendre tout cela car c'est délicat d'expliquer en profondeur et leur utilisation les pointeurs ici.



Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 31 Oct 2013, 17:01

ampholyte a écrit:Essaye de lire un cours (sur le site du zero par exemple) pour apprendre tout cela car c'est délicat d'expliquer en profondeur et leur utilisation les pointeurs ici.


Je pense que je ferais ça à mes heures perdu car c'est vrai que ça pose des problème dès que l'on commence à toucher à des tableaux. Je m'y penche dès que possible.

Malgré tout sans explication pourrais tu me donner la syntaxe qu'il faut utiliser dans ce cas là ?



je pense que je vais devoir rajouter *devant mon nom de fonction et faire un return &; intuitivement c'est ce que je dirais mais une nouvelle fois c'est sans connaître la syntaxe ><

Dois je faire intervenir la longueur du tableau avec le return etc etc
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 31 Oct 2013, 17:10

Je te donne un exemple.

Code: Tout sélectionner
#include
#include

void traitementTab(int tab[][2], int size);

int main(void) {
    int tab[100][2] = {{0}};
    int j = 0;
    int i = 0;

    traitementTab(tab, 100);

    for (j = 0; j < 2; j++) {
        for (i = 0; i < 100; i++) {
            printf("%d\n", tab[i][j]);
        }
    }

    return(0);
}

void traitementTab(int tab[][2], int size) {
    int i = 0;
    int j = 0;
   
    for (j = 0; j < 2; j++) {
        for (i = 0; i < size; i++) {   
           tab[i][j] = 2; 
        }
    }
}


Personnellement je préfère manipuler des pointeurs que des tableaux mais bon ...

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 31 Oct 2013, 17:18

Oui; mais là dans ton exemple ça ne répond pas vraiment au problème; ton traitement tab est un void donc il ne retourne rien par définition.

Tu n'écris donc pas quelque chose du style return Tableau dans traitemenTableau.

Ou alors ce que tu voudrais me dire c'est que l'on est obligé de faire un void pour que le tableau ne soit pas effacé ?
Je comprends la solution; et je pense que ça marche, je vais surement tester; mais là on contourne le problème par rapport à ma question de base^^

J'ai vu plusieurs solution traîné sur le web...la plupart parle de calloc malloc / structure de données...des choses que je n'ai encore jamais vu donc...d'autre parle de passer le tableau directement en paramètre. Je pense que ça revient à l'exemple que tu m'as montré; bien qu'ici on ne fasse aucun return.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 31 Oct 2013, 17:24

C'est dur à expliquer il faudrait vraiment que tu lises un cours sur les pointeurs.

Ce n'est pas grace au void que le tableau ne soit pas effacé. Le void signifie simplement que je ne retourne rien, j'aurais très bien pu renvoyer un nombre.

Tu cherches une fonction qui retourne un tableau si j'ai bien compris, il te faut donc une fonction de ce style.

Code: Tout sélectionner
int * ma_fonction(int size) {
    int *tab = NULL;
    int i = 0;

    tab = calloc(size, sizeof(int));
    if (tab == NULL) {
        return NULL;
    }

    for (i = 0; i < size; i++) {
         tab[i] = i;
    }
   
    return tab;
}

int main(void) {
    int *test = NULL;

    test = ma_fonction(100);

    free(test);
    test = NULL;
}

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 31 Oct 2013, 17:27

Je vais suivre ton conseil et aller voir un cours là dessus; tout cela est bien trop vague là.

Pour cette fois je vais opter pour le void; j'essaierais d'appliquer autrement plus tard.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 31 Oct 2013, 18:12

Bonsoir;


pour reprendre le passage du tableau en paramètre du void; je ne comprends pas pourquoi le compilateur n'aime pas ceci

Code: Tout sélectionner
void fonction (int Tab[], int N);

int main()
{
int Tab[N]={0} /* N constante définit au préalable*/
fonction(Tab[],N);

return 0;
}

void fonction (int Tab[], int N)
{
/*traitement*/
}


Dans l'utilisation de la fonction le compilateur me dit qu'il attend une expression avat le crochet fermant dans l'utilisation de la fonction dans le main.

Or je ne comprends absolument pas ce qui ne vas pas dans cette syntaxe; je l'ai déjà utilisé au préalable sans que cela plante, elle m'avait été donné un peu plus tôt par Dzlogic si je me souviens bien.



EDIT: erreur identifié faut vraiment que j'arrête mes copier coller è_é
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 31 Oct 2013, 18:49

@ Rockleader,
Je te conseille vraiment d'étudier un cours, quel qu'il soit.
L'intuition, la logique les déductions ne sont pas utilisables dans ce contexte.
Il y a plusieurs façon de traiter les tableaux, si tu te bloque sur une méthode, c'est à dire une syntaxe, tu vas passer à côté du reste.
Pour l'histoire du return, void ou pas, il faut bien comprendre que une fonction peut retourner une valeur (ou d'autres choses), ou rien, dans ce cas, on utilise void.
Il n'est pas correct et même pas possible de retourner un tableau. Par contre, on peut retourner un pointeur sur ce tableau. C'est le cas général de l'utilisation des chaines.
L'avantage d'un cours, quel qu'il soit, c'est que l'approche est progressive et donc pédagogique. Il faut, je pense, une certaine expérience en informatique pour apprendre le C en autodidacte. Et sans un cours, ça me parait vraiment difficile.

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 31 Oct 2013, 18:54

Dlzlogic a écrit:@ Rockleader,
Je te conseille vraiment d'étudier un cours, quel qu'il soit.
L'intuition, la logique les déductions ne sont pas utilisables dans ce contexte.
Il y a plusieurs façon de traiter les tableaux, si tu te bloque sur une méthode, c'est à dire une syntaxe, tu vas passer à côté du reste.
Pour l'histoire du return, void ou pas, il faut bien comprendre que une fonction peut retourner une valeur (ou d'autres choses), ou rien, dans ce cas, on utilise void.
Il n'est pas correct et même pas possible de retourner un tableau. Par contre, on peut retourner un pointeur sur ce tableau. C'est le cas général de l'utilisation des chaines.
L'avantage d'un cours, quel qu'il soit, c'est que l'approche est progressive et donc pédagogique. Il faut, je pense, une certaine expérience en informatique pour apprendre le C en autodidacte. Et sans un cours, ça me parait vraiment difficile.


Merci pour le conseil effectivement c'est ce que je vais faire.

Pour ce qui est du tableau, sans entrer dans les détails j'ai vu qu'en réalité on pointait toujours sur la première valeur; sachant que les tableaux sont eux même des pointeurs.

Je pense utiliser le site du zéro pour les cours; peut être me conseillerez vous autre chose ?
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 31 Oct 2013, 19:18

Pour les tableaux.
Un tableau est une simple liste de valeurs adressables par leur rang.
De plus, et c'est ça qui est important, un pointeur sur un tableau pointe effectivement sur la première valeur. Si on connait sa longueur et son organisation, on passe simplement un tableau par un pointeur et on peut utiliser la tableau.
Mais attention, je viens de dire en 2 lignes 1/2 ce qui nécessite un chapitre entier et difficile.
Moi, le seul conseil que je puisse donner c'est d'acquérir un bouquin, même d'occase.

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 31 Oct 2013, 20:05

Voici les chapitres les plus importants pour ce que tu cherches à faire :

* http://fr.openclassrooms.com/informatique/cours/apprenez-a-programmer-en-c/a-l-assaut-des-pointeurs

* http://fr.openclassrooms.com/informatique/cours/apprenez-a-programmer-en-c/les-tableaux-2

* http://fr.openclassrooms.com/informatique/cours/apprenez-a-programmer-en-c/l-allocation-dynamique (très peu complet)

Une fois que tu as bien compris ces 3 choses, regarde ceux-ci qui sont un peu plus complet :

* http://fr.openclassrooms.com/informatique/cours/allocation-dynamique-en-c-complement

* http://fr.openclassrooms.com/informatique/cours/la-verite-sur-les-tableaux-et-pointeurs-en-c

* http://fr.openclassrooms.com/informatique/cours/apprenez-a-programmer-en-c/l-allocation-dynamique

Ce sont des notions assez compliquées, pour bien comprendre il n'y a qu'une seule solution => testé, testé et testé.

Fais-toi des schémas.


Voici une autre source que je préfère : http://chgi.developpez.com/pointeur/

N'essaye pas d'aller vite. Si tu n'as pas compris, relis relis et relis et posent des questions.

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 02 Nov 2013, 15:57

ampholyte a écrit:Voici les chapitres les plus importants pour ce que tu cherches à faire :

* http://fr.openclassrooms.com/informatique/cours/apprenez-a-programmer-en-c/a-l-assaut-des-pointeurs

* http://fr.openclassrooms.com/informatique/cours/apprenez-a-programmer-en-c/les-tableaux-2

* http://fr.openclassrooms.com/informatique/cours/apprenez-a-programmer-en-c/l-allocation-dynamique (très peu complet)

Une fois que tu as bien compris ces 3 choses, regarde ceux-ci qui sont un peu plus complet :

* http://fr.openclassrooms.com/informatique/cours/allocation-dynamique-en-c-complement

* http://fr.openclassrooms.com/informatique/cours/la-verite-sur-les-tableaux-et-pointeurs-en-c

* http://fr.openclassrooms.com/informatique/cours/apprenez-a-programmer-en-c/l-allocation-dynamique

Ce sont des notions assez compliquées, pour bien comprendre il n'y a qu'une seule solution => testé, testé et testé.

Fais-toi des schémas.


Voici une autre source que je préfère : http://chgi.developpez.com/pointeur/

N'essaye pas d'aller vite. Si tu n'as pas compris, relis relis et relis et posent des questions.


J'ai lu et compris le premier lien, du moins je pense.

Pour le second, j'en suis arrivé aux exercices de la page suivante: http://fr.openclassrooms.com/informatique/cours/apprenez-a-programmer-en-c/passage-de-tableaux-a-une-fonction

Malheureusement il n'y a pas de corrigé sur ces petits exo, au cas échéant pourrais je vous présenter du code là dessus ?





Ce que j'ai compris pour le moment:

&var se lira adresse de la variable var

*var sera une variable spéciale qui va pointer sur une adresse de variable.

Donc si on fait *&var ça reviendrait à écrire var simplement si j'ai bien compris. cela revient à pointer l'adresse de la variable var.




Je regrette tout de même que le tuto ne montre pas comment faire un return d'un tableau étant donné que c’est tout de même assez complexe à comprendre.
Cela dit c’est peut être parce que je ne suis pas encore allé assez loin.



Donc pour résumé je pense avoir compris (je ne dirais pas encore maîtrisé) le passage en paramètre et sortie de pointeurs en soit; mais pas encore lorsqu'il s'agit de tableau.


Merci pour les liens soit dit en passant; je met la priorité là dessus pour apprendre étant donné mes cours sur le sujet...





En parlant de cela; pourriez vous me répondre en toute honnêteté; les notions de vérification de code lié au pfp; est ce réellement utile ? Concrètement lorsque vous allez écrire un programme; est ce que vous allez systématiquement réaliser des test avec prédicat d'entrée de sorties et pfp de l'action...cela me parait tout de même surréaliste; je comprends l'utilité de la chose afin de pouvoir éventuellement trouver le problème dans un programme qui plante; mais au final c'est un peu le boulot du compilateur ça non ?
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 02 Nov 2013, 16:07

Rockleader a écrit:J'ai lu et compris le premier lien, du moins je pense.

Pour le second, j'en suis arrivé aux exercices de la page suivante: http://fr.openclassrooms.com/informatique/cours/apprenez-a-programmer-en-c/passage-de-tableaux-a-une-fonction

Malheureusement il n'y a pas de corrigé sur ces petits exo, au cas échéant pourrais je vous présenter du code là dessus ?


Pas de problème.


Rockleader a écrit:Ce que j'ai compris pour le moment:

&var se lira adresse de la variable var

*var sera une variable spéciale qui va pointer sur une adresse de variable.



Je suis d'accord.

Rockleader a écrit:Donc si on fait *&var ça reviendrait à écrire var simplement si j'ai bien compris. cela revient à pointer l'adresse de la variable var.


Je suis d'accord sauf qu'on utilise jamais cette notation, vu que c'est inutile =).

On utilisera &var pour passer l'adresse d'une variable var.

On utilisera *ptr pour afficher la valeur de la case pointée par ptr.

Rockleader a écrit:Je regrette tout de même que le tuto ne montre pas comment faire un return d'un tableau étant donné que c’est tout de même assez complexe à comprendre.
Cela dit c’est peut être parce que je ne suis pas encore allé assez loin.



Comme expliqué plus haut, il n'est pas possible de retourner un tableau. Tu pourras retourner l'adresse du premier élément de ce tableau. (Donc par exemple un int *).

Rockleader a écrit:Donc pour résumé je pense avoir compris (je ne dirais pas encore maîtrisé) le passage en paramètre et sortie de pointeurs en soit; mais pas encore lorsqu'il s'agit de tableau.


Lorsque tu créés un tableau :
Code: Tout sélectionner
 int tab[10] = {0};


Tu peux afficher le premier élément de deux façon différentes :
Code: Tout sélectionner
fprintf(stdout, "%d\n", tab[0]);
fprintf(stdout, "%d\n", *tab);


Pour le second élément, même combat :
Code: Tout sélectionner
fprintf(stdout, "%d\n", tab[1]);
fprintf(stdout, "%d\n", *(tab + 1)); /* C'est à dire affiche la valeur qui se trouve à la case pointée par tab + 1 */


Rockleader a écrit:Merci pour les liens soit dit en passant; je met la priorité là dessus pour apprendre étant donné mes cours sur le sujet...


Pas de quoi.


Rockleader a écrit:En parlant de cela; pourriez vous me répondre en toute honnêteté; les notions de vérification de code lié au pfp; est ce réellement utile ? Concrètement lorsque vous allez écrire un programme; est ce que vous allez systématiquement réaliser des test avec prédicat d'entrée de sorties et pfp de l'action...cela me parait tout de même surréaliste; je comprends l'utilité de la chose afin de pouvoir éventuellement trouver le problème dans un programme qui plante; mais au final c'est un peu le boulot du compilateur ça non ?


Qu'appelles-tu le pfp ?

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 02 Nov 2013, 16:22

Qu'appelles-tu le pfp ?


Je m'en doutais encore un truc farfelu avec lequel on va nous planter au partiel alors que ça ne sert à rien >< Au final à notre partiel on n'aura pas une seule ligne de code à faire...on aura que des vérification de code/ spécifications.


Nous introduisons dans ce qui suit une méthode de vérification fondée sur
la spécification en triplet et qui consiste à vérifier un programme spécifié
par
/*Pré condition*/
action(E, s)
/*Postcondition*/

• En vérifiant l’implication suivante :
Précondition ;) pfp(’’ action(E, s)’’, Postcondition)
avec
• pfp(’’ action(E, s)’’, Postcondition), qui signifie la plus faible
précondition dans laquelle action s’exécute et satisfait Postcondition.


Voilà grosso modo ce que l'on fait dans nos cours de programmation...



Je suis d'accord sauf qu'on utilise jamais cette notation, vu que c'est inutile =).


ok; c'était juste pour voir si j'avais compris le principe^^


Pour tes exemples d'affichage pas de soucis; j'ai compris pas de soucis là dessus; abus de langage de ma part également quand au fait de retourner un tableau; je voulais dire retourner l'adresse de la première valeur; une fois qu'on a l'adresse de la première; les autres se suivant donc on peut tout retrouver

Ce que j'ai un peu plus de mal à voir; c’est justement comment retourner dans un return par exemple cette première adresse de case.
Il faut que je démystifie tout ça en faisant des exos; il n'y a pas d'autre solution^^ce qui m'énerve c’est que je dois passer plus de temps sur les pseudo bétises du dessus car au final c'est ça qui contiendra le gros de la note; alors qu'il me semble qu'une notion de codage comme les pointeurs ets bien plus essentielles...
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 02 Nov 2013, 16:26

hello,

le pfp c'est ca

et sinon, il vaut bien mieux apprendre cette ****** de pfp que de pointeurs. Parce que les pointeurs tu peux les apprendre seul, alors que le pfp, JAMAIS tu voudras fourrez ton nez dedans en autodidacte. Ou alors faut être maso :D

mais je suis d'accord que de prime abord, ca sert à rien, sauf pe dans quelques cas bien ciblés.
la vie est une fête :)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 02 Nov 2013, 16:32

(Impossible d'ouvrir ton lien fatal^^)

Donc tu me dis qu'il y a bien une utilité à ça ?

Je suis maso mais à ce point là è_é Je comprends qu'on nous le fasse voir en cours mais de là à faire tout un semestre là dessus...
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 02 Nov 2013, 16:39

ben j'ai pas trop lu le cours, parce que la syntaxe était un peu gerbative, mais des quelques secondes que j'y ai passé, j'ai cru comprendre que le pfp permettait de remonter à la plus faible précondition qui permette d'obtenir la sortie désirée.

Effectivement, le plus important c'est la sortie désirée, et si on est capable depuis un résultat de remonter à la précondition nécessaire, c'est quand même sympa pour l'appelant de la fonction qui sait ce qu'il a le droit de passer..

Après j'ai ptet raté plein de choses, j'ai lu que 3 quarts de page...

Le plus important c'est pas tellement le pfp ou les tests, c'est de te sensibiliser à l'importance d'un code fiable, et à ouvrir ton esprit sur les moyens que tu peux utiliser pour t'assurer du bon fonctionnement de ton code.

En ce sens, étudier le pfp, c'est assez intéressant, tu auras tout le loisir d'apprendre les tests unitaires et les méthodologies associées sur le net et dans ta vie professionnelle...
la vie est une fête :)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 02 Nov 2013, 16:56

Le plus important c'est pas tellement le pfp ou les tests, c'est de te sensibiliser à l'importance d'un code fiable, et à ouvrir ton esprit sur les moyens que tu peux utiliser pour t'assurer du bon fonctionnement de ton code.


Je suis d'accord sur ce point là; même plus que d'accord; mais le pfp ça reste encore vraiment trop abstrait pour que j'y trouve un intérêt...


Pour ma part pour m'assurer qu'un code fonctionne j'aurais plutôt tendance à faire des traces en affichant un peu tout ce qui pourrait bloquer.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 03 Nov 2013, 03:36

Rockleader a écrit:Pour ma part pour m'assurer qu'un code fonctionne j'aurais plutôt tendance à faire des traces en affichant un peu tout ce qui pourrait bloquer.


Malheureusement en langage C, les "traces" ne suffisent pas à prouver qu'un programme fonctionne. Les dépassements de buffers sont un exemple parfait de ce qu'une "trace" ne pourra afficher, mais il sera temps d'y revenir plus tard =).

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 17 Nov 2013, 10:13

Bonjour/bonsoir

Je tiens tout d'abord à vous remercier pour votre aide et vos conseils, grâce à votre aide, je pense que j'ai réussi à dé-mystifier les passages de paramètres en pointeur avec le C^^
Donc merci à vous :lol3:



Une question un peu en rapport; lorsque l'on utilise, dans un if par exemple une fonction modifiant une valeur avec l'aide d'un pointeur à titre de comparaisons avec l'un des opérateur égal supérieur etc etc La valeur est elle modifié même lorsque l'on est sorti ?

f(x)=x+x
Un truc qui ferait ce genre de chose a=5 if (f(&a)==f(&a)) premier calcul f retourne 10 mais à ce moment là sachant que la valeur dans f est modifié avec un pointeur est ce que l'on retrouve 5 ou 10 en entrée de la seconde fonction f ???
J'ai eu une question de ce style sur mon exam de mi semestre et j'avoue que cela m'a pas mal bloquée.






Seconde question; quand au type; je vois qu'il est possible de définir une structure afin de faire cee que je comparerais au type enregistrement de ada.

Mais comment fait on pour avoir l'équivalent de ceci:

Type nom_type is new Integer /* on crée un type définit à partir d'un type pré existant*/

Je n'ai pas réussi à trouver la syntaxe pour faire ça en C :help:
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 3 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite