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 :

prob erreur ((*temp).*suivant).suivant;


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 35
    Par défaut prob erreur ((*temp).*suivant).suivant;
    Bonjour,

    Encore une erreur sur les pointeurs :s

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct repertoire
    {
    	char adresse[TAILLE_UN_FICHIER];
    	struct repertoire *suivant;
     
     
    };
    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
    25
    26
    27
    28
    29
    30
    31
    32
    char del_rep(struct repertoire **rep_courant,char rep_to_del[TAILLE_UN_FICHIER])
    {
    	//DECLARATION TEMP
    	struct repertoire *temp_adr;
    	struct repertoire *temp;
    	temp = (struct repertoire*) malloc(sizeof(struct repertoire));
    	temp = *rep_courant;
    	//ON VERIFIE QUE C PAS LA PREMIER
    	if (strcmp((*temp).adresse ,rep_to_del))//c'est le premier
    	{
    		*rep_courant = (*temp).suivant;
    		free(temp);
    		return 1;
    	}
    	//ON BOUCLE POUR TROUVER LE TEMP QUI PRECEDE CE QU'ON CHERCHE
    	do{
    		temp = (*temp).suivant;
    	}while (!strcmp(((*temp).*suivant).adresse,rep_to_del) && (*temp).suivant != NULL);//si suivant ne contient pas l'adresse, ou si ce n'est pas la fin la fin
    	//ON A TROUVE OU NULL
    	if ((*temp).suivant != NULL)
    	{
    		temp_adr = ((*temp).*suivant).suivant;
    		free((*temp).suivant);//on del le suivant
    		(*temp).suivant =temp_adr;
    		return 1;
    	}
    	else
    	{
    		return 0;
    	}
    	
    }
    Je suis en train de chercher sur le web, mais je ne trouve pas d'exemple y ressemblant. Donc si je trouve d'ici là je le signale mais sinon je comprends pas, logiquement j'ouvre un pointeur de type structure qui contient un pointeur que j'ouvre pour optenir l'adresse du pointeur de la structure

    Ah oui, il me met une syntaxte error avant '*'...
    j'ai essayé (*temp).(*suivant).adresse, mais ça ne marche pas plus. :s

    Merci d'avance de m'aider un peu...

  2. #2
    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 janor Voir le message
    Encore une erreur sur les pointeurs :s
    <...>
    Ah oui, il me met une syntaxte error avant '*'...
    j'ai essayé (*temp).(*suivant).adresse, mais ça ne marche pas plus. :s
    Déjà, la syntaxe officielle pour accéder à un élément d'une structure pointée, c'est -> : p->element.

    Ça devrait considérablement simplifier ton codage et retirer automatiquement certaines erreurs de syntaxes trop complexes.

    Toujours rechercher la simplicité.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 35
    Par défaut
    Effectivement,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ((temp)->suivant)->suivant
    fonctionne, mais j'aurai bien aimé comprendre où était l'erreur, car '->' n'est t'il pas une facilité du langage ?

    si *var.element <-> var->element
    où est l'erreur ?

    Merci en tout cas

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    si *var.element <-> var->element
    non, à cause de la priorité des opérateurs : (*var).element n'est pas pareil que *var.element.

    ((*temp).*suivant).suivant;
    où est l'erreur ?
    (*(*temp).suivant).suivant est identique à (temp->suivant)->suivant soit encore à temp->suivant->suivant.

    EDIT: modif petite erreur

  5. #5
    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 janor Voir le message
    Effectivement,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ((temp)->suivant)->suivant
    fonctionne,
    SIMPLICITE
    C'est si difficile d'écrire des choses simples ? Ca fait peur ou quoi ?
    mais j'aurai bien aimé comprendre où était l'erreur, car '->' n'est t'il pas une facilité du langage ?

    si *var.element <-> var->element
    où est l'erreur ?
    Je ne sais pas et je ne veux pas le savoir. Si il existe des 'facilités' dans le langage, c'est justement pour éviter de faire des erreurs. Les choses inutilement complexes ne m'intéressent pas.

    Il y a 40.000 façons de compliquer le code C. En tant que formateur, je ne m'intéresse qu'à celles qui le rendent clair.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 35
    Par défaut
    Citation Envoyé par jeroman Voir le message
    non, à cause de la priorité des opérateurs : (*var).element n'est pas pareil que *var.element.

    (*(*temp).suivant)).suivant est identique à (temp->suivant)->suivant soit encore à temp->suivant->suivant.
    Oki, merci beaucoup !!!
    J'étais pourtant persuadé d'avoir testé cette possibilité, mais j'avais dut laisser une erreur.

    C'est si difficile d'écrire des choses simples ? Ca fait peur ou quoi ?
    ...
    Je ne sais pas et je ne veux pas le savoir. Si il existe des 'facilités' dans le langage, c'est justement pour éviter de faire des erreurs. Les choses inutilement complexes ne m'intéressent pas.

    Il y a 40.000 façons de compliquer le code C. En tant que formateur, je ne m'intéresse qu'à celles qui le rendent clair.
    Oui je comprends, mais comme les pointeurs je veux bien les comprendre, je préfère rester dans des notations simples avec '*' plutôt que d'utiliser des simplifications, qui m'embrouillent car ne sont plus dans la même continuité que le '*'.

    Déjà avec les tableaux, ça m'a laissé un grave problème existentiel avant que je comprenne qu'en fait c'était des pointeurs.

    Une fois que ça sera bien clair, j'utiliserai les facilitées.

    Désolé c'est dans ma nature de vouloir comprendre le fondement parfaitement avant d'avancer. Mais merci beaucoup à vous deux. Je vais méditer sur cette solutions.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 35
    Par défaut Pour ceux qui ont eu le même problème
    En fait il fallait interpréter le problème comme ça:

    temp_adr = (*(*temp).suivant).suivant;
    ici, on ouvre le pointeur temp, puis on ouvre le pointeur (*temp).suivant et on récupérère l’adresse.

    et non pas

    temp_adr = ((*temp).*suivant).suivant;// FAUX

    ici, on ouvre le pointeur temp, puis on ouvre le pointeur *suivant (suivant n'existe pas indépendamment de temp ) et on récupère l’adresse.

    Pour ceux qui rencontreraient le même problème que moi....

    Après coup, c'est vrai que c'est logique

  8. #8
    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 janor Voir le message
    Oui je comprends, mais comme les pointeurs je veux bien les comprendre, je préfère rester dans des notations simples avec '*' plutôt que d'utiliser des simplifications, qui m'embrouillent car ne sont plus dans la même continuité que le '*'.
    Je vois. Tu préfères *(tab + i) à tab[i] et &tab[i] à tab + i ...

    Ben, chacun ses gouts, mais plus c'est simple, pour moi, mieux c'est...

    Tu sais l'écrire avec un tableau à 2 dimensions ?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 35
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Je vois. Tu préfères *(tab + i) à tab[i] et &tab[i] à tab + i ...

    Ben, chacun ses gouts, mais plus c'est simple, pour moi, mieux c'est...

    Tu sais l'écrire avec un tableau à 2 dimensions ?
    Non, je préfère pas, mais comme j'ai commencé par le PHP, j'ai trop l'habitude des facilitées d'utilisation, et en C, bah je galère un peu du coup.

    Mais maintenant que j'ai bien compris les tableaux, j'utilise les [], c'est sûr, plus simple. . Mais bon, le problème c'est que le C est un langage très rigide, et en croyant qu'on manipule un tableau comme en PHP, on peut se retrouver avec des erreurs.

    Ta position est très défendable, je ne la conteste pas, mais je suis dans une optique de bien comprendre le langage, et cela fait longtemps que j'y suis dessus, même si pas régulièrement. Et j'en ai un peu marre de devoir faire de la bidouille, à savoir devoir tester les possibilités jusqu'à ce que ça marche sans comprendre d'où ça marche.

    Forcément quand j'ai commencé le C, j'ai fait
    char mon_nom[10]= "jérôme";

    Et ça marchait pas !! Pourquoi ?
    Maintenant je sais qu'en écrivant ça j'écrivais en fait

    char *mon_nom = "jérôme";

    et que le compilateur s'attendait au pire à trouver une lettre !!

    Et je te parle pas comme tu le dis si bien des tableaux à deux dimensions !!

    Le C n'est pas un langage des plus simple, mais il ne faut pas se voiler la face. On ne peut pas le coder comme du PHP, donc il faut bien saisir son fondement et sa manière de fonctionner.

    Enfin ça reste mon humble avis

  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 : 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 janor Voir le message
    Forcément quand j'ai commencé le C, j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char mon_nom[10]= "jérôme";
    Et ça marchait pas !! Pourquoi ?
    Ben je me le demande aussi, parce que c'est C parfaitement valide.

    http://emmanuel-delahaye.developpez....es.htm#tabchar

    je ne sais pas comment tu t'es formé, mais il est peut être temps de lire quelques articles plus, disons, sérieux...


    Maintenant je sais qu'en écrivant ça j'écrivais en fait

    char *mon_nom = "jérôme";
    Absolument pas.

    Je crois que tu n'as pas du tout compris la différence entre un pointeur et un tableau...

    et que le compilateur s'attendait au pire à trouver une lettre !!
    rien compris...

    Le C n'est pas un langage des plus simple, mais il ne faut pas se voiler la face.
    Tout ce que j'ai à dire, c'est que si on est pas correctement formé, on ne peut pas coder sérieusement en C. Mais je pense que c'est pareil avec tous les langages. Se méfier des langages d'apparence trop intuitive... Le BASIC a failli me tuer (en 1987, j'étais à 2 doigts d'abandonner la programmation à cause du BASIC. Heureusement, le Pascal m'a sauvé!)

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 35
    Par défaut
    Lol, oui, bon hein, je vais rebucher les tableaux, mais comme les listes chaînées dynamique, j'y arrive un peu mieux maintenant,je devrai plus facilement les comprendre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char mon_nom[10]= "jérôme";
    Ne faut t'il pas faire un strcpy ? Peut être pas à l'initialisation...

    J'ai peut être mélangé l'initialisation et les écritures d'opération.

    Mais oui, j'ai pas dit que je codais au mieux, mais si on pratique pas, aussi, ça peut pas marcher. Personnellement à part ma professeur complétement nulle de première année de bts info, j'ai surtout apris avec best of langage C des éditions eyroles (claude delannoy). lol et les articles du net évidemment.

  12. #12
    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 janor Voir le message
    Lol, oui, bon hein, je vais rebucher les tableaux, mais comme les listes chaînées dynamique, j'y arrive un peu mieux maintenant,je devrai plus facilement les comprendre.
    Aucun rapport...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char mon_nom[10]= "jérôme";
    Ne faut t'il pas faire un strcpy ? Peut être pas à l'initialisation...

    J'ai peut être mélangé l'initialisation et les écritures d'opération.
    Tu n'as pas lu mon article, je perds mon temps à essayer de t'expliquer le C ?
    j'ai surtout apris avec best of langage C des éditions eyroles (claude delannoy).
    moyen...
    lol et les articles du net évidemment.
    on peut tomber sur des bons. Il y a à boire et à manger...

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 35
    Par défaut
    En fait j'étais sur mon prog donc plus sur les listes chaînées, pour cela que j'ai pas regardé, j'y vais tout de suite .

    J'ai mis ton lien en marque page, ça a l'air bien intéressant, merci

    J'vais regarder tout ça.

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

Discussions similaires

  1. [PHP 5.3] Erreur d'encodage suivant la possition de l'ECHO
    Par Invité dans le forum Langage
    Réponses: 2
    Dernier message: 22/05/2013, 16h17
  2. [prob] erreur script news
    Par Invité dans le forum 1&1
    Réponses: 1
    Dernier message: 30/08/2012, 01h22
  3. [AC-2003] Erreur accès enregistrement suivant
    Par twitzig dans le forum Access
    Réponses: 1
    Dernier message: 20/10/2011, 19h53
  4. Erreur sur OpenFileDialog suivant framework
    Par ramoud dans le forum Windows Forms
    Réponses: 3
    Dernier message: 19/03/2009, 18h14
  5. [c++]prob de temps
    Par torNAdE dans le forum C++
    Réponses: 3
    Dernier message: 19/10/2006, 10h30

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