2010-12-07 3 views
1

J'essaie d'écrire du code pour optimiser certaines fonctions Open GL pour un programme que j'écris, malheureusement, je ne suis pas vraiment un vétéran C ou C++, mais c'est en partie pourquoi je fais ce projet!Erreur "spécificateur-qualificateur-liste attendu avant" au constructeur struct

Je suis la création d'une structure pour gérer les matrices 3x3 et je suis la définition de la struct comme suit:

#ifndef MATRIX3BY3_H 
#define MATRIX3BY3_H 
struct Matrix3by3 
{ 
    float ix, jx, kx; 
    float iy, jy, ky; 
    float iz, jz, kz; 

    Matrix3by3() {} 

    Matrix3by3(const Matrix3by3 &matrix) 
    { 
     ix = matrix.ix; 
     jx = matrix.jx; 
     kx = matrix.kx; 

     iy = matrix.iy; 
     jy = matrix.jy; 
     ky = matrix.ky; 

     iz = matrix.iz; 
     jz = matrix.jz; 
     kz = matrix.kz; 
    } 

    Matrix3by3 (const float _ix, const float _jx, const float _kx, 
       const float _iy, const float _jy, const float _ky, 
       const float _iz, const float _jz, const float _kz) : 
     ix(_ix), jx(_jx), kx(_kx), 
     iy(_iy), jy(_jy), ky(_ky), 
     iy(_iz), jx(_jz), kz(_kz) {} 
    }; 
#endif 

Et j'obtiens l'erreur (deux fois)

spécificateur-de qualifier- attendu liste avant 'Matrix3by3'

Sur la ligne du premier constructeur. J'ai essayé de chercher des réponses pour cela, et il semble que cela a à voir avec le compilateur ne sachant pas que c'est un type. J'ai donc essayé ce qui suit, je vais enlever les entrailles par souci de concision:

typedef struct Matrix3by3 { ... }; 

struct Matrix3by3 { struct Matrix3by3() {} ... }; 

struct Matrix3by3 { ... } Matrix3by3; 

typdef struct Matrix3by3; 
struct Matrix3by3 { ... }; 

Quelles sont les solutions qui ont été proposées sur les blogs et les articles que j'ai vus pour cette erreur. J'ai également vu que cela peut survenir à cause d'une dépendance circulaire, mais ce fichier n'a aucune inclusion qui inclut autre chose, et je les ai même supprimés juste pour être certain de temps en temps - pas de changement. Je pourrais écrire cela dans une classe d'objectifs-c, j'en suis sûr, mais il faudra probablement un peu plus de mémoire et de cycles, et c'est exactement ce que j'essaie d'éviter. La seule chose que je peux penser à gauche est un réglage de compilateur/projet que j'ai défini par défaut qui empêche mon utilisation de ce type de structure. Entièrement possible, car j'apprends la langue/l'environnement.

Quelqu'un peut-il fournir de l'aide?

Merci!

Répondre

4

C ne supporte pas les constructeurs ou les fonctions membres de struct. Il n'y a aucun moyen que vous obteniez ceci pour compiler comme C ou Objective-C. Vous devez compiler ceci comme C++ ou Objective-C++, à quel point il sera presque compilé: vous avez une erreur dans votre 3ème constructeur, en ce que vous essayez d'initialiser les membres iy et jx plusieurs fois. Une fois que vous avez corrigé ces fautes de frappe, il compile bien.

+0

Ah oui, je vois ces erreurs. Avait été debout pendant un moment quand j'ai haché ça. La chose est, j'ai vu ce type de chose dans plusieurs autres endroits en regardant des exemples de développement iPhone. Donc je ne sais pas pourquoi ça marche là-bas (et même dans les exemples directement téléchargés) mais pas pour moi. Je suppose que c'est un paramètre du compilateur/projet dans xcode, mais je ne suis pas sûr de quoi. Ou je manque la structure équivalente de l'erreur de point-virgule – Kevek

+0

Ah! J'ai pris un deuxième coup d'oeil et j'ai vu où je mettais le projet à compiler comme nom de fichier par défaut, pas à une langue spécifique. Changez-le en Objective-C++ et il a très bien été compilé. À votre avis, devrais-je faire un effort supplémentaire pour rester dans l'espace C et le faire différemment, ou est-ce que Objective-C++ va bien? – Kevek

1
typedef struct { ... } Matrix3by3; 

devrait fonctionner. Il déclare la structure anonyme en tant que type.

et classe d'usage au lieu de struct :)

+0

Je reçois la même erreur dans ce cas, c'est celui que j'ai essayé, plus tôt, je crois aussi. Je pense que c'est parce qu'au moment où le compilateur C/C++ arrive au constructeur "Matrix3by3() {}", il ne sait pas que Matrix3by3 est un type? Pourtant, j'ai vu cela dans un autre exemple de code et je suis confus quant à la raison pour laquelle cela fonctionne dans un et non quand j'ai essayé d'émuler la structure, comme je l'ai dit, je suis nouveau à diriger C, venant de un fond différent. Avez-vous d'autres pensées? – Kevek

0

L'erreur « prévue spécificateur-qualification-liste avant« Matrix3by3 » est un GCC-isme et cela signifie que le jeton « Matrix3by3 » est inconnue. C'est généralement le cas lorsque vous avez un type que le compilateur ne reconnaît pas, soit parce que vous avez mal tapé, soit parce que vous avez oublié un en-tête. Dans votre cas, c'est parce que le type "Matrix3by3" n'existe pas vraiment. Vous avez deux options: à la place

  1. Arrêtez d'utiliser Matrix3by3 directement et commencer à utiliser struct Matrix3by3, comme c'est que vous avez défini le type réel.
  2. Donnez une structure à votre structure.Il ressemblera à quelque chose comme

    typedef struct { 
        // fields here 
    } Matrix3by3 
    
+0

Si je mets "struct Matrix3by3() {}" comme ligne de constructeur (et aussi devant les deux autres) j'obtiens l'erreur "Identifiant attendu ou '(' avant ')' jeton 'ressemble à ceci encore moins. J'ai le sentiment que soit j'ai mis cela en Objective-C sans C++, soit je fais juste quelque chose de purement syntaxiquement faux. – Kevek

+0

En regardant d'autres réponses, et de relire votre question, il semble que le problème sous-jacent ici est que vous écrivez C++ et que vous essayez de l'exécuter en C. –

1

Avec quelle langue/compilateur traduisez-vous votre programme? Je suppose que vous essayez de compiler le code en tant que C, alors que les fonctionnalités de langage que vous essayez d'utiliser sont strictement spécifiques à C++.

+0

Possible. J'utilise les paramètres par défaut de Xcode. Ce qui est étrange est un exemple qui utilise une structure de la même manière que ma tentative originale compile bien. Je ne vois aucun paramètre de projet qui apparaît sur moi. – Kevek

+0

Quand je dis "quels que soient les paramètres par défaut de Xcode" ce que je veux dire, c'est que ce projet est dans l'objectif-c, qui, si je comprends bien, comprend toutes les constructions c très bien. Si je voulais faire quelque chose de similaire en c, qu'est-ce que j'utiliserais? juste une classe? – Kevek

+0

@Kevek: Classe? Il n'y a pas de "classes" dans C. En C, vous utiliseriez une structure simple avec des fonctions autonomes pour l'initialisation et d'autres opérateurs. – AnT

Questions connexes