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 :

Pointeur qui n'est pas vu comme un pointeur par le compilateur


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut Pointeur qui n'est pas vu comme un pointeur par le compilateur
    Bonjour,

    J'ai un probleme bizarre en C avec un pointeur. Voici mon code:

    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
    double* ConstruitParametres (int Dimension, int NbPoints, VecteurPtr Q[]) //Q contient NbPoints vecteurs de dimension Dimension
    {
    	int i;
    	double t[NbPoints];
    	double* p=t;
    	t[0]=0;
    	for (i=0; i<NbPoints-1; i++)
    	{
    		t[i+1]=t[i]+DistancePoints(Q[i+1],Q[i]);
    	}
    	return p;
    }
    
    CourbeBezierPtr ConstruitCourbe (int Dimension, int NbPoints, int Degre, VecteurPtr Points[])
    {
    	if (NbPoints==Degre+1)
    	{
    		CourbeBezierPtr C = CourbeBezierConstructeur(Dimension, Degre);
    		MatricePtr M = MatriceConstructeur(Dimension,NbPoints);
    		int i,j,k;
    		for (i=0; i<Dimension; i++)
    		{
    			for (j=0; j<NbPoints; j++)
    			{
    				double* A = ConstruitParametres(Dimension, NbPoints, Points);
    				M[i][j] = EvalueBernstein(C->Ordre, NbPoints, A[i]);
    			}
    		}
    //Ainsi de suite...
    Le compilateur s'acharne a me dire ca sur le A[ i ]:
    subscripted value is neither array nor pointer
    Pourtant, tout dans la methode precedente prouve le contraire! Je precise que le dernier parametre de EvalueBernstein doit etre un double.

    Merci de votre aide!

  2. #2
    Membre actif Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Points : 223
    Points
    223
    Par défaut
    Bonsoir,

    Il y a quelque chose d'étrange dans votre programme:
    -la fonction ConstruitParametres prend un argument "Dimension" qu'elle n'utilise pas(peut-être devrait il être utilisé dans la fonction "DistancePoints"?)
    -Votre tableau pointé par p est de dimension NbPoints donc A est de dimension NbPoints, or on évalue A[i] avec i allant jusqu'à Dimension

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 897
    Points : 219 630
    Points
    219 630
    Billets dans le blog
    125
    Par défaut
    Bonjour,

    En fait, je pense pas qu'il s'acharne sur A[I] mais plus sur C->Ordre
    Sachant que c'est est un CourbeBezierPtr qui est surement un typedef ...
    Mais si c'est une classe / structure ... alors le compilateur a raison (il a toujours raison) et vous ne pouvez pas faire '->' dessus (ce qui explique le message d'erreur).

    Sinon, dans la globalité, votre code est assez bizarre, surtout dans la fonction ConstruitParametres et votre histoire de 'p' et 't'

    Sinon, si vous ne trouvez pas l'erreur, j'aimerai bien avoir connaissance de la déclaration de:
    CourbeBezierPtr
    et la définition de EvalueBernstein

    Merci

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    A moins qu'il ne râle sur le M[i] ou le M[i][j]. Mais comme on ne connait pas la définition d'un MatricePtr....

    De toute façon, la fonction ConstruitParametres() renvoie l'adresse d'une variable locale (t[]) -> plantage assuré.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut
    Pour rpondre vos questions:

    - J'ai tres souvent fait une -> avec un CourbeBezierPtr et je n'ai jamais eu de problemes!

    Voici les definitions de CoubeBezierPtr et de MatricePtr

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct courbe_bezier
    {
      int Degre;
      int Dimension;	
      int Ordre;
      VecteurPtr Poles[3];
    } CourbeBezier, *CourbeBezierPtr;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct Mat 
    {
      int C;
      int L;
      int Taille;
      double * Coef;
      double ** Coef2d;
    } Matrice, *MatricePtr;
    Et mon code d'origine existait sans le p:
    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
    double* ConstruitParametres (int Dimension, int NbPoints, VecteurPtr Q[]) //Q contient NbPoints vecteurs de dimension Dimension
    {
    	int i;
    	double* t;
    	t[0]=0;
    	for (i=0; i<NbPoints-1; i++)
    	{
    		t[i+1]=t[i]+DistancePoints(Q[i+1],Q[i]);
    	}
    	return t;
    }
     
    CourbeBezierPtr ConstruitCourbe (int Dimension, int NbPoints, int Degre, VecteurPtr Points[])
    {
    	if (NbPoints==Degre+1)
    	{
    		CourbeBezierPtr C = CourbeBezierConstructeur(Dimension, Degre);
    		MatricePtr M = MatriceConstructeur(NbPoints,Dimension);
    		int i,j,k;
    		for (i=0; i<NbPoints; i++)
    		{
    			for (j=0; j<Dimension; j++)
    			{
    				double* A = ConstruitParametres(Dimension, NbPoints, Points);
    				M->Coef2d[i][j] = EvalueBernstein(C->Ordre, NbPoints, A[i]);
    			}
    		}
    //...
    ...c'est bon j'ai trouve! Il fallait ecrire M->Coef2d[i][j] et non M[i][j] (confusion avec Java!).
    Autre chose: Il fallait effectivement inverser NbPoints et Dimension dans deux boucles for de i et j. Merci a tous!

    Edit: Tu dis que le compilateur a toujours raison, mais il ne m'a pourtant pas donne la vraie cause de l'erreur...

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 897
    Points : 219 630
    Points
    219 630
    Billets dans le blog
    125
    Par défaut
    Citation Envoyé par User Name Voir le message
    ...c'est bon j'ai trouve! Il fallait ecrire M->Coef2d[i][j] et non M[i][j] (confusion avec Java!).
    Autre chose: Il fallait effectivement inverser NbPoints et Dimension dans deux boucles for de i et j. Merci a tous!

    Edit: Tu dis que le compilateur a toujours raison, mais il ne m'a pourtant pas donne la vraie cause de l'erreur...
    Ah oui ? O_o étonnant O_o
    subscripted value is neither array nor pointer
    Car cela veut exactement dire votre erreur (comme quoi l'utilisation de la variable est complètement foireuse)
    Après, il se peut que le compilateur donne un tas d'erreurs, et là en regardant la première, nous savons d'où cela vient (mais ça, c'est à cause que c'est un processus d'analyse syntaxique).

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut
    Hmm, finalement tu avais raison: comme l'erreur etait signalee a la meme ligne, je n'ai pas reflechi! ^^

    Merci de m'avoir debloque!

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

Discussions similaires

  1. pointeur sur un childframe qui n'est pas active
    Par moooona dans le forum MFC
    Réponses: 1
    Dernier message: 05/10/2010, 07h44
  2. Réponses: 1
    Dernier message: 20/08/2010, 17h40
  3. Réponses: 8
    Dernier message: 04/08/2004, 14h17
  4. LIKE de tout ce qui n'est pas compris entre a<-&
    Par DjinnS dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/07/2003, 13h09
  5. [VB6] générer un recordset qui n'est pas lier à un bdd
    Par damyrid dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 05/06/2003, 17h48

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