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 :

trop de pointeur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2004
    Messages : 66
    Par défaut Re: ..
    Citation Envoyé par Trap D
    Hum hum, dans le code *x++, la valeur est obtenue AVANT l'incrémentation de x.
    Elle est obtenue mais ce n'est pas elle qui est modifiée, c'est le pointeur qui l'est, donc si tu écris une ligne de code :
    Ça revient à
    Puisque le *x n'est jamais utilisé, c'est donc une instruction inutile .. ou bien un bug dont personne ne s'est aperçu

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2004
    Messages : 66
    Par défaut Re: hehe
    Citation Envoyé par gege2061
    Citation Envoyé par Emmanuel Delahaye
    C'est x++ ou (*x)++, ce qui n'a pas du tout la même signification.
    *x++ a une signification
    Ce qu'il voulait dire c'est que dans le cas utilisé (sur une seule ligne de code ..), ça n'avait aucun sens et il a entièrement raison

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2004
    Messages : 66
    Par défaut
    Citation Envoyé par Caine
    Sauf pour blinder le code par rapport au Multithreading.
    Pas dans l'exemple : la plupart des variables sont définies hors de la fonction, donc ce n'est surement pas utilisé dans un thread !

    Citation Envoyé par Aquadrox
    Ne vous souciez pas de l'exactitude du code, il est juste et marche tres bien
    Difficile à croire avec l'histoire du pointeur incrémenté 3 fois .. ce n'est pas parce qu'un code semble marcher depuis des années qu'il marche réellement

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2004
    Messages : 66
    Par défaut Re: hehe
    Citation Envoyé par Caine
    Citation Envoyé par gege2061
    Citation Envoyé par gege2061
    Mais dans ce cas, on ne garde pas de trace du pointeur d'origine (x[0])
    Aprés réflexion, c'est peut être pour ça qu'il y a un:
    Comme la valeur du paramètre n'est pas modifier!
    Exactement.
    Ben non : passer *X à une fonction et incrémenter X dans la fonction ne modifie pas l'adresse de X à l'origine .. ce n'est pas &X qui est passé en paramètre mais X, donc l'adresse sur laquelle il pointe ! La copie locale est donc inutile ...

  5. #5
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut Re: hehe
    Oulà fatigué moi.

    Oui.

    Quand je parlais de thread-safe c'est par rapprot à la copie de chaque argument dans une variable locale.

    Pour les autres variables, je ne sais pas à priori si elles sont globals, ou si le code est incomplet.

    mais tout à fait d'accord, les variables globales sont anti thread-safe.

    Citation Envoyé par DavG
    Citation Envoyé par Caine
    Citation Envoyé par gege2061
    Citation Envoyé par gege2061
    Mais dans ce cas, on ne garde pas de trace du pointeur d'origine (x[0])
    Aprés réflexion, c'est peut être pour ça qu'il y a un:
    Comme la valeur du paramètre n'est pas modifier!
    Exactement.
    Ben non : passer *X à une fonction et incrémenter X dans la fonction ne modifie pas l'adresse de X à l'origine .. ce n'est pas &X qui est passé en paramètre mais X, donc l'adresse sur laquelle il pointe ! La copie locale est donc inutile ...

  6. #6
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut Re: ..
    Arggggggg les chiens ! Dans l'aide que j'ai rapidement parcouru, la seule ligne à être en rigth to left et non en left to rigth comme les autres était celle contenant '*'!

    Je me disais aussi! Enfin, il faut dire que parfois sur la préséance des opérateurs, je finis par douter, comme je ne code pas que dans les langages C/C++. Merci de cette reprise.
    Citation Envoyé par Trap D
    Citation Envoyé par Caine
    Ha oui,
    si le développeur initial connassait la préséance des opérateurs signifie:
    sino, comme 90 % des newbies, il a cru coder:
    Hum hum, dans le code *x++, la valeur est obtenue AVANT l'incrémentation de x.

    Ce petit programme de démo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
     
    int main(void)
    {
      char *p = "bonjour";
      char *q = p;
     
      char c= *q++;
     
      printf("Valeur de c '%c'\nvaleur de p %p\nvaleur de q %p\n", c, p, q);
      return 0;
    }
    sortie :
    Valeur de c 'b'
    valeur de p 00420054
    valeur de q 00420055

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 20
    Par défaut lol
    Si vous voulez je vous fourni le prog complet pour vous faire les dents??
    La c'est que le sous programme de filtre

  8. #8
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par Caine
    Citation Envoyé par mat.M
    double *temp_a_coefs,*temp_b_coefs;
    comme Emmannuel je ne vois vraiment pas l'intérêt de déclarer des pointeurs
    Totalement inutile et source de plantages si mauvaise gestion
    Sauf pour blinder le code par rapport au Multithreading.
    D'accord ;
    mais en quoi utiliser des pointeurs plutôt que des variables cela permet-il de "blinder" le code dans des multiprocessus ??

    Sinon oopps effectivement il est obligé de déclarer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     double *temp_a_coefs,*temp_b_coefs;
    j'ai lu trop vite

  9. #9
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut Re: ..
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par Trap D
    Ce petit programme de démo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <stdio.h>
     
    int main(void)
    {
      char *p = "bonjour";
      char *q = p;
     
      char c= *q++;
     
      printf("Valeur de c '%c'\nvaleur de p %p\nvaleur de q %p\n", c, p, q);
      return 0;
    }
    Comportement indéfini. Une chaine n'est pas toujours modifiable...
    : : : Où as-tu vu que je modifiais la chaîne : : :
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  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 : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: ..
    Citation Envoyé par Trap D
    : : : Où as-tu vu que je modifiais la chaîne : : :
    Heu, nulle part ! Nettoyage en cours...

  11. #11
    mat.M
    Invité(e)
    Par défaut
    Trap D:
    Où as-tu vu que je modifiais la chaîne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *p = "bonjour";
    En théorie un espace mémoire est alloué de manière statique pour ranger les lettres b,o,n,j,o,u, r + le carctère \0

    q de type char pointe sur la même adresse que p donc q vaut "bonjour" plus le charactère \0

    Sous VC++ 7 NET q a la valeur 50e8c8


    Comme tu l'a dit précédemment la valeur de q qui vaut ="r" ou bien "\0" ( ??? ) est incrémentée .



    Sous VC++ 7 NET q a maintenant la valeur d'adresse 50e8c9
    et vaut "onjour" dans l'info express

  12. #12
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Citation Envoyé par DavG
    Citation Envoyé par Aquadrox
    Ne vous souciez pas de l'exactitude du code, il est juste et marche tres bien
    Difficile à croire avec l'histoire du pointeur incrémenté 3 fois .. ce n'est pas parce qu'un code semble marcher depuis des années qu'il marche réellement
    Je trouve un peu fort de café de juger sans savoir ce que fait exactement le code, on n'a qu'un bout de code il me semble
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  13. #13
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Citation Envoyé par mat.M
    Trap D:
    Où as-tu vu que je modifiais la chaîne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *p = "bonjour";
    En théorie un espace mémoire est alloué de manière statique pour ranger les lettres b,o,n,j,o,u, r + le carctère \0

    q de type char pointe sur la même adresse que p donc q vaut "bonjour" plus le charactère \0

    Comme tu l'a dit précédemment la valeur de q qui vaut ="r" ou bien "\0" ( ??? ) est incrémentée .
    Cela n'exclut pas un effet de bord
    Je deviens fou ou quoi , il n'y a aucun effet de bord à faire c = *q++, c'est (*q)++ qui là fait exploser puisque celà incrémente la valeur pointée par q.
    PS, j'ai du mal comprendre ce que tu écris
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2004
    Messages : 66
    Par défaut
    Citation Envoyé par Trap D
    Je trouve un peu fort de café de juger sans savoir ce que fait exactement le code, on n'a qu'un bout de code il me semble
    Disons qu'il y a au moins 2 lignes dans ce code qui ne font pas ce qu'elles sembleraient vouloir faire, ou bien qui font ce qu'il faut mais d'une façon qui montre qu'elles n'ont pas été comprises ... ce qui nous autorise à ce qu'on pourrait appeler "un doute raisonnable"

  15. #15
    mat.M
    Invité(e)
    Par défaut
    e deviens fou ou quoi Shocked , il n'y a aucun effet de bord à faire c = *q++, c'est (*q)++ qui là fait exploser puisque celà incrémente la valeur pointée par q.
    PS, j'ai du mal comprendre ce que tu écris
    je veux bien te croire mais j'ai fait l'essai avec VC++ .NET et apparemment il ya un effet de bord puisque q en valeur vaut "onjour" ( déboguage pas - à pas avec points d'arrêts )
    Cela peut dépendre peut-être du compilateur utilisé

  16. #16
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Je viens de comprendre ce que tu veux dire , je ne considérais pas la chaîne pointée par q dans son ensemble, uniquement le caractère pointé; avec ta manière d'envisager q, effectivement, il y a un effet de bord.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 20
    Par défaut prog
    Citation Envoyé par Trap D
    Je trouve un peu fort de café de juger sans savoir ce que fait exactement le code, on n'a qu'un bout de code il me semble
    Je te poste le main:

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    _declspec(dllexport) long Filter_Data_Array(long *NoError, 
    	double Filter_Coef_A[], double Filter_Coef_B[], long Filter_Order, 
    	double Filter_Gain, double Sensor_Data_A[], double Sensor_Data_B[], 
    	long Array_Length, double Output_A[], double Output_B[])
    {
    	double *memory_1,*memory_2;
    	long i;
    	int Error=ERR_NONE;
    	long num_coefs;
     
    	if((!(*NoError)) && (Array_Length!=0))
    	{
    //		Error = read_filter_coefs(Coeff_File);
    //		if(Error) {goto End;}
    		order = Filter_Order;
    		gain = Filter_Gain;
     
    		num_coefs = 3 * ((order + 1)/2);
    		a_coefs = new double[num_coefs * sizeof(double)];
    		if (!a_coefs) { return ERR_ALLOC;}
    		b_coefs = new double[num_coefs * sizeof(double)];
    		if (!b_coefs) { return ERR_ALLOC;}
     
     
    		for(i=0; i<num_coefs; i++)
    		{
    			a_coefs[i] = Filter_Coef_A[i];
    			b_coefs[i] = Filter_Coef_B[i];
    		}
     
    		ivec_length = Array_Length;
     
    		a_value = new float[ivec_length-1];
    		if(!a_value) {return ERR_ALLOC;}
    		b_value = new float[ivec_length-1];
    		if(!b_value) {return ERR_ALLOC;}
     
    		for (i=0;i<(ivec_length-1);i++)
    		{
    			a_value[i] = (float)Sensor_Data_A[i];
    			b_value[i] = (float)Sensor_Data_B[i];
    		}
     
    		numb_quads = (order + 1)/2;
     
    		a_out = new float[ivec_length-1];
    		b_out = new float[ivec_length-1];
     
    		memory_1 =(double *)calloc(numb_quads,sizeof(double));
    		memory_2 =(double *)calloc(numb_quads,sizeof(double));
     
    		filter_pwv_data(a_value,a_out,memory_1,memory_2);
    		filter_pwv_data(b_value,b_out,memory_1,memory_2);
     
    		free(memory_1);
    		free(memory_2);
     
    //		out_file = fopen((const char*)Output_File,"w");
    //		if(!out_file) 
    //		{
    //			Error = ERR_FILE;
    //			goto End;
    //		}
    //fprintf(out_file,"%.3f	%.3f\n",samp_rate_a,samp_rate_b);
    //	
    		for(i=0; i<(ivec_length-1); i++)
    		{
    //			fprintf(out_file,"%.3f	%.3f\n",a_out[i],b_out[i]);
    			Output_A[i] = a_out[i];
    			Output_B[i] = b_out[i];
    		}
    //		fclose(out_file);
     
     
    //	End:
    		delete(a_out);
    		delete(b_out);
    		delete(a_value);
    		delete(b_value);
     
    		fcloseall();
     
    		return Error;
    	}
    	else
    	{
    		return ERR_BEVORE;
    	}
    }[/quote]

    Enfin le main, en fait c'est un sous programme d'un sous programme d'un sous... etc...
    Mais je n'ai pas la permission de tout poster

  18. #18
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut Re: hehe
    Oui et non, ça se lity avec un petit effort.

    Mais c'est clair que le mieux est d'écrire du code clair et commenté.

    J'ai déjà vu des ingénieurs écrire bien pire que ça.

    Bon, problème résolu?

    Citation Envoyé par Aquadrox
    Citation Envoyé par Emmanuel Delahaye
    Huh! Et il ecrit *x++ comme ça, sans vergogne ? Demande lui ce qu'il a voulu faire, parce que ce n'est pas clair du tout.
    Malheureusement il est parti dans une autre societe sinon c'est lui qui se serai taper le travail!! lol
    Sinon quand il a ecris ca ou bien il a eu un gros coup de chance pour que ca marche ou bien il avait deja essaye avant, le principal etant que ca marche.
    Pour ce qui est de la clarete je te l'accorde ca laisse a desirer...

  19. #19
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Il a un peu mélangé C et C++, (et c'est reparti )
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 20
    Par défaut oui
    Oui c'est generalement tres simple, je vous ai juste poster ca au cas ou, on sait jamai peut etre que ca pourra vous aider pour le reste.
    Mais celui la est bacle, les autre prog sont commente un peu partout.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Réponses: 7
    Dernier message: 23/09/2013, 15h49
  2. pointeur renvoyant un nombre trop grand
    Par christianf dans le forum Débuter
    Réponses: 4
    Dernier message: 29/07/2010, 01h40
  3. le pointeur de ma souris trop sensible
    Par cdevl32 dans le forum Périphériques
    Réponses: 3
    Dernier message: 24/04/2008, 16h00
  4. djgpp et pointeurs far -2
    Par elvivo dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 29/07/2002, 22h43
  5. djgpp et pointeurs far
    Par elvivo dans le forum C
    Réponses: 2
    Dernier message: 13/07/2002, 00h44

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