[C] td4 - ex10 a)

Voir le sujet précédent Voir le sujet suivant Aller en bas

resolu [C] td4 - ex10 a)

Message  I.AM.BACK le Mer 02 Nov 2011, 12:55

bonjour lorsque je compile ça:
Code:
void setSuivantBM(BMaillon * m, const BMaillon * suivant){
   m->suivant = suivant;
}
j'obtiens l'erreur suivante:
Code:
..\src\maillon.c: In function 'setSuivantBM':
..\src\maillon.c:38:13: error: assignment discards qualifiers from pointer target type

une idée de ce qui ne va pas ? parce que je comprend pas du tout le message d'erreur...


Dernière édition par I.AM.BACK le Mer 02 Nov 2011, 18:18, édité 1 fois

I.AM.BACK

Nombre de messages : 56
Age : 25
Prénom : Victor
Statut : étudiant indu 2ème année
Localisation : http://en.wikipedia.org/wiki/Armenia
Date d'inscription : 21/07/2011

Revenir en haut Aller en bas

resolu Re: [C] td4 - ex10 a)

Message  Wark le Mer 02 Nov 2011, 13:53

suivant est un pointeur aussi ?

Si c'est une variable automatique... je dirais plutôt ...

m->suivant = &suivant;

mais sans certitude... c'est déjà loin :-)

Wark

Nombre de messages : 682
Age : 29
Prénom : Cédric
Statut : Diplômé 2010
Localisation : Braine l'alleud
Date d'inscription : 04/02/2008

Revenir en haut Aller en bas

resolu Re: [C] td4 - ex10 a)

Message  I.AM.BACK le Mer 02 Nov 2011, 15:15

oui suivant est un pointeur aussi (voir la signature de la fonction)

I.AM.BACK

Nombre de messages : 56
Age : 25
Prénom : Victor
Statut : étudiant indu 2ème année
Localisation : http://en.wikipedia.org/wiki/Armenia
Date d'inscription : 21/07/2011

Revenir en haut Aller en bas

resolu Re: [C] td4 - ex10 a)

Message  Wark le Mer 02 Nov 2011, 15:51

Je ne parle pas du paramètre mais bien de la variable contenue dans la structure BMaillon :-)

Ceci dit, après réflexion, je ne vois pas l'intérêt d'avoir une variable automatique ici...

Wark

Nombre de messages : 682
Age : 29
Prénom : Cédric
Statut : Diplômé 2010
Localisation : Braine l'alleud
Date d'inscription : 04/02/2008

Revenir en haut Aller en bas

resolu Re: [C] td4 - ex10 a)

Message  aro le Mer 02 Nov 2011, 16:10

I.AM.BACK a écrit:une idée de ce qui ne va pas ? parce que je comprend pas du tout le message d'erreur...
Tu assignes un paramètre suivant qualifié const à m -> suivant qui n'est pas qualifié const

aro

Nombre de messages : 557
Prénom : Anne
Statut : Prof
Date d'inscription : 06/09/2008

Revenir en haut Aller en bas

resolu Re: [C] td4 - ex10 a)

Message  I.AM.BACK le Mer 02 Nov 2011, 16:33

Ok merci Smile J'ai donc été chercher dans "suivant" l'adresse de son précédent, duquel j'ai repris l'adresse du suivant (qui cette fois n'est plus une constante.)

est-ce bon comme solution ? (sachant que je teste bien si le précédent ne vaut pas NULL)

I.AM.BACK

Nombre de messages : 56
Age : 25
Prénom : Victor
Statut : étudiant indu 2ème année
Localisation : http://en.wikipedia.org/wiki/Armenia
Date d'inscription : 21/07/2011

Revenir en haut Aller en bas

resolu Re: [C] td4 - ex10 a)

Message  smb le Mer 02 Nov 2011, 17:21

Et ceci n'est-il pas plus simple ?
Code:

void setSuivantBM (BMaillon * m , const BMaillon * suivant )
{
if ( m != NULL )
    m->suivant = (BMaillon *) suivant ;
}
En effet, que viendrait faire un const BMaillon dans une chaîne de BMaillon ?
On ne pourrait pas modifier ni sa valeur, ni les chaînages vers son suivant et vers son précédent.
Ici, le const BMaillon dans le prototype signifie que la fonction setSuivant est supposée (*) ne pas modifier le BMaillon pointé par suivant, à l'intérieur de la fonction, rien de plus. Ce qui se passe après est une autre histoire.

(*) ... mais ce n'est pas toujours vrai, cf strcpy !


smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

resolu Re: [C] td4 - ex10 a)

Message  I.AM.BACK le Mer 02 Nov 2011, 17:33

Pour le const je comprend très bien son rôle dans le prototype, mais je ne savais pas qu'on pouvait transtyper une constante en une "non-constante" Very Happy
Merci

I.AM.BACK

Nombre de messages : 56
Age : 25
Prénom : Victor
Statut : étudiant indu 2ème année
Localisation : http://en.wikipedia.org/wiki/Armenia
Date d'inscription : 21/07/2011

Revenir en haut Aller en bas

resolu Re: [C] td4 - ex10 a)

Message  nvs le Mer 02 Nov 2011, 20:25

smb a écrit:
(*) ... mais ce n'est pas toujours vrai, cf strcpy !
c'est-à-dire ?







Question

_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

resolu Re: [C] td4 - ex10 a)

Message  smb le Mer 02 Nov 2011, 23:06

nvs a écrit:
smb a écrit:
(*) ... mais ce n'est pas toujours vrai, cf strcpy !
c'est-à-dire ?
Question
Rappel du prototype :
Code:

char * strcpy ( char * dest, const char * src ) ;
... et la zone pointée par src est modifiée dans ce cas ...
Code:

  char t[] = "012456789";
  strcpy(t,t+2);
... non ?

O'Reilly a beau dire dans C: In a Nutshell ...
"You must also make sure that the locations that strcpy( ) reads from and writes to do not overlap."
... le prototype me semble être un leurre pour un public non averti !

smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

resolu Re: [C] td4 - ex10 a)

Message  nvs le Jeu 03 Nov 2011, 10:33

smb a écrit:
nvs a écrit:
smb a écrit:
(*) ... mais ce n'est pas toujours vrai, cf strcpy !
c'est-à-dire ?
Question
Rappel du prototype :
Code:

char * strcpy ( char * dest, const char * src ) ;
... et la zone pointée par src est modifiée dans ce cas ...
Code:

  char t[] = "012456789";
  strcpy(t,t+2);
... non ?
oui, mais via dest et non src. dans le code de strcpy, il n'y a pas de transtypage de src depuis (const char *) vers (char *). pas de triche ou d'offre de service frauduleux donc, à mon sens Smile

smb a écrit:O'Reilly a beau dire dans C: In a Nutshell ...
"You must also make sure that the locations that strcpy( ) reads from and writes to do not overlap."
... le prototype me semble être un leurre pour un public non averti !
cette contrainte est liée à la non garantie donnée par strcpy de bien copier en cas de recouvrement :
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    printf("après\n");
    {
        char tabStr[15] = "0123456789";
        printf("\ntabStr  : %s\n", tabStr);
        strcpy(tabStr + 2, tabStr);
        printf("strcpy  : %s\n", tabStr + 2);
    }

    printf("\navant\n");
    {
        char tabStr[15] = "xx0123456789";
        printf("\ntabStr  : %s\n", tabStr + 2);
        strcpy(tabStr, tabStr + 2);
        printf("strcpy  : %s\n", tabStr);
    }

    return EXIT_SUCCESS;
}
donne :
Code:
après

tabStr  : 0123456789
strcpy  : 0101056569

avant

tabStr  : 0123456789
strcpy  : 0123456789
à rapprocher de memcpy et memmove Smile











Basketball


_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

resolu Re: [C] td4 - ex10 a)

Message  smb le Jeu 03 Nov 2011, 11:40

nvs a écrit:
(...)
oui, mais via dest et non src. dans le code de strcpy, il n'y a pas de transtypage de src depuis (const char *) vers (char *). pas de triche ou d'offre de service frauduleux donc, à mon sens Smile
(...)

Entièrement d'accord !

Quid dès lors de setSuivantBM ?

smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

resolu Re: [C] td4 - ex10 a)

Message  nvs le Jeu 03 Nov 2011, 12:26

smb a écrit:
nvs a écrit:
(...)
oui, mais via dest et non src. dans le code de strcpy, il n'y a pas de transtypage de src depuis (const char *) vers (char *). pas de triche ou d'offre de service frauduleux donc, à mon sens Smile
(...)

Entièrement d'accord !

Quid dès lors de setSuivantBM ?
dans setSuisuivantBM, on est à la limite... le const indique que setSuivantBM ne modifie pas suivant... mais suite à son effet, suivant pourrait être modifié... si on vire le const, je ne suis pas choqué. c'est même probablement mieux. j'ai un exemple pour illustrer ce dernier point, mais là, il faut s'occuper du manger Wink







monkey

_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

resolu Re: [C] td4 - ex10 a)

Message  smb le Jeu 03 Nov 2011, 12:46

nvs a écrit:
smb a écrit:
nvs a écrit:
(...)
oui, mais via dest et non src. dans le code de strcpy, il n'y a pas de transtypage de src depuis (const char *) vers (char *). pas de triche ou d'offre de service frauduleux donc, à mon sens Smile
(...)

Entièrement d'accord !

Quid dès lors de setSuivantBM ?
dans setSuisuivantBM, on est à la limite... le const indique que setSuivantBM ne modifie pas suivant... mais suite à son effet, suivant pourrait être modifié... si on vire le const, je ne suis pas choqué. c'est même probablement mieux. j'ai un exemple pour illustrer ce dernier point, mais là, il faut s'occuper du manger Wink

monkey

... je crois aussi que c'est mieux ...

... allez, donne bien la becquée !

smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

resolu Re: [C] td4 - ex10 a)

Message  Contenu sponsorisé Aujourd'hui à 01:12


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum