• 締切済み

左側がクラス、構造体、共用体、ジェネリック型への

VS2008 でVC++のコンパイルをしたときに、 「error C2227: '->SetValueXyzwpr2' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。」のエラーがでました。ネット上で、このエラーを探すと、GetValueXyzwprが定義していないとありますが、同じソース上の違う関数の中で使っているところではエラーがでません。今回新たに記述したところで発生しています。 【ソース】frrjiftestDlg.cpp void CFrrjiftestDlg::PrintFrameOfData(FILE *handle, sFrameOfData *FrameOfData)    pSysVarPos->SetValueXyzwpr2(X,Y,Z,W,P,R,E1,E2,E3,C1,C2,C3,C4,C5,C6,C7,UF,UT); ←ここでエラーがでます。 同じ、cpp 上で、 void CFrrjiftestDlg::OnButtonSetSysvar()  ←ここの中でも同じ使い方をしていますが、こちらではエラーはでません。 まったく、理由が分からず困り果てています。

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

> _DataSysVarPos *pSysVarPos; では、_DataSysVarPosの定義は? typedefとか#defineとかだったら、更にその元を辿って、「クラス、構造体、共用体、ジェネリック型」になってるか確認してください。 あとは ・そのエラーの前後に別のエラーは出てませんか? ・警告のレベルはどうなってますか? レベルを上げたら警告が増えると思いますが、そのエラー周辺や、_DataSysVarPos,pSysVarPosなどでなにか出てませんか?

ichigo61
質問者

補足

ヘッダーファイルのクラス定義のところで、static void をvoid に変更したら、コンパイルが通りました。 class CFrrjiftestDlg : public CDialog { static void PrintFrameOfData(FILE *handle, sFrameOfData *FrameOfData); ~~~~~~このstatic をとったら、OKとなりました。 みなさん、ご協力ありがとうございました

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

> GetValueXyzwprが定義していない ではなくて、「左側(つまり「pSysVarPos」)がクラス、構造体、共用体、ジェネリック型へのポインタではありません」 というエラーです。 pSysVarPosの宣言はどうなっていますか?

ichigo61
質問者

補足

pSysVarPos は、インクルードしている先で定義しています。 // frrjiftestDlg.cpp : implementation file #include "frrjiftestDlg.h"  ← このヘッダファイルの中で定義している。 // frrjiftestDlg.h : header file _DataSysVarPos *pSysVarPos; ← ここで定義 このヘッダファイルは、他プログラムからコピペしたままの状態なので、定義はあっているはずなのです。

関連するQ&A

  • 通常関数とメンバー関数のやりとりでコンパイルエラー

    下記にあるようなプログラムをコンパイルしたら、下記のエラーになりました。 どこに問題があるのでしょうか? 「error C2227: '->SetValueXyzwpr2' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。」 //frrjif.h class _DataPosReg : public COleDispatchDriver { // Operations public: BOOL SetValueXyzwpr2(long Index, float X, float Y, float Z, float W, float P, float R, float E1, float E2, float E3, short C1, short C2, short C3, short C4, short C5, short C6, short C7, short UF, short UT); }; //frrjiftestDlg.h #include "frrjif.h" class CFrrjiftestDlg : public CDialog { public: CFrrjiftestDlg(CWnd* pParent = NULL); // standard constructor virtual ~CFrrjiftestDlg(); protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation _Core *pCore; _DataPosRegXyzwpr *pPosRegXyzwpr; _DataSysVarPos *pSysVarPos; }; //frrjiftestDlg.cpp #include "frrjiftestDlg.h" void MyDataHandler(sFrameOfData* FrameOfData) { CFrrjiftestDlg::pSysVarPos->SetValueXyzwpr2(X,Y,Z,W,P,R,E1,E2,E3,C1,C2,C3,C4,C5,C6,C7,UF,UT); //↑ここでコンパイルエラー //↑error C2227: '->SetValueXyzwpr2' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。 } void CFrrjiftestDlg::OnBnClickedButton1() { Cortex_SetDataHandlerFunc(MyDataHandler); }

  • 共用体の配列 [C言語]

    今C言語のプログラムを組んでいたのですが、共用体の配列あるわけないと思いつつ共用体の配列を宣言したソースをコンパイルして見ました。そしたら普通にコンパイルできてしまったんです。びっくりしてその配列に値を代入したのですが、それはコンパイルエラーが出ました。共用体の配列なんてあるのでしょうか?回答よろしくお願いします。

  • Visual C++ 2005 MFCアプリのクラス作成について

    Windows XP SP3 Visual C++ 2005 pro MFCアプリケーション シングルドキュメント 以上の環境でアプリケーションを作りたいと思っています。 C++は、C言語をベースという意味ではそれなりにはわかっているつもりです(自信はないですが...)。 本当はSDKを学んだ方がよろしいんでしょうが、時間の都合上MFCでやることにしました。 ちなみに、VC++を使ったプログラミングは初めてのものです。 そこで質問なのですが、 通常のC++においてクラスを作るときは、cppファイルとhファイルで分けてつくってmainのcppでインクルードしますよね。 VC++ MFCも 「C++クラスの追加」 でウィザードを利用してあるクラスAを作成てみまして、わかる方にはわかるでしょうけど、もちろん以下のように出力されました。 A.h------------------ #pragma once class A { public: A(void); public: ~A(void); }; A.cpp---------------------- #include "A.h" #include "StdAfx.h" A::A(void) { } A::~A(void) { } そしてとりあえず、その状態で何も手を加えずにとりあえずコンパイルにかけてみたところいきなり以下のようなエラーが出ました。 error C2653: 'A' :識別子がクラス名でも名前空間名でもありません。 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません warning C4508: 'A' : 関数に戻り値の型が指定されていません。戻り値を void 型と見なします。 error C2653: 'A' : 識別子がクラス名でも名前空間名でもありません fatal error C1903: 直前のエラーを修復できません。コンパイルを中止します 何も手を加えていない状態でこのようなエラーが出るということは、どこかでこのhやcppをインクルードする必要があるのだろうとは思います(でもそういう類のことはウィザードで作成した際に、VC++が自動でコーディングしてくれたりしないのでしょうかね...)。 むしろ、MFCでこのような単純なC++クラスを作ること自体があまり好まれないことなのでしょうか。 もちろんこのクラスを作っていってから、ある処理をさせていこうと思っているので、自分としては以前から行っていたC++のようにコーディングしていきたいと思うのですが、もし好ましくないようならどのファイルにMFC的ではない、ただのC++的なクラスを定義したりすればよろしいのでしょうか。 もしくは、好ましくなくても何らかの対処方法があれば教えていただきたく思います。 Webで調べても MFCクラスの作成などのことしか書いてないので、ちょっとわからなくて困っています。よろしくお願いします。

  • 構造体のアドレス渡し

    構造体をmain()からアドレス渡しで別関数(test.cpp)に渡し、その関数の中だけでの別関数test1()にその構造体を、値渡しでもアドレス渡しでも、渡せるのでしょうか? ちなみにmain.cppと、test.cppと、myhead.hとして分割コンパイルでやりました。 /*---------main.cpp--------*/ //ヘッダファイルで構造体宣言、test()のプロトタイプ宣言済み void main() { struct data dt[10]; ・・・・・・ test(dt); //test.cppのtest関数に構造体を渡す。 } /*---------test.cpp---------*/ void test1(??????); //test1()のプロトタイプ宣言 void test(struct data *p) //構造体をアドレス渡しで受け取った { ・・・・・ test1(?????); //test.cppで宣言したtest1関数に構造体を渡したい } どうかよろしくお願いします。

  • 共用体のサイズをsizeofで

    共用体の全体のサイズを調べようと、 printf("%u",sizeof(test)); //testは共用体の型名です としたら、コンパイルエラーが出ました。エラーの内容は「'test':定義されていない識別子です」でした。共用体のサイズはsizeofですることができると聞いたのですがどうやるのでしょう?特に共用体全体のサイズを知りたいです。回答よろしくお願いします。

  • 構造体の初期設定 (C++)

    構造体の初期設定 (C++) C++言語にて以下のコードをコンパイルすると9行目でERROR(E2188 構文エラー)がでます。 【質問】  9行目をどう直せばいいのでしょうか。 -------------------------------------- struct strData{ int a; int *b; }; void main(void) { struct strData *strc; *strc = {5,(int*)6}; /* 9行目 */ } -------------------------------------- 参考書やネットで調べたのですが解説が見つかりませんでしたので。。

  • C#の構造体に関して

    C#の構造体に関して C#で構造体で配列を持ちたいと思い、宣言の仕方や使い方を 勉強していますが、どうしてもコンパイルは通るもののエラーと なってしまいます。 《ソース》 単純に構造体で宣言した"a"という配列に、"ABC"という文字列を 代入したいだけですが。。。 namespace テスト環境 { struct test { public string []a; } class Program { static void Main(string[] args) { test aaa = new test(); aaa.a[0] = "ABC"; } } } 配列の初期化等は、ようやく理解したつもりではいますが、構造体 が絡むとどうしてもわかりません。 どこをどのように修正したら良いかを教えて下さい。 初歩的な質問で申し訳ありませんが、よろしくお願いします。

  • 「LOCAL」って構造体?共用体?それとも別物?

    ついおととい質問したばかりで気が引けるのですが、 またわからない部分がでてきましたので、 できればご回答お願いします。 現在、他人の作ったC言語のソースを解析しているのですが、 その中に : : LOCAL int abc(x,y); void main() { : : こういった行がありました。 ぱっとみ構造体とかと同じような使われ方をされているのですが、 どう調べてみてもLOCALといった命令文がでてきません。 というわけで、 1.LOCALという命令文があるのかどうか 2.もしあるのなら具体的な使い方を、 もしないのならこれはいったい何である可能性があるのか 以上2点、ご回答よろしくおねがいします。

  • stringクラスのオブジェクト

    C++にて下記のソースをVC++にてコンパイルすると「'string'定義させていない識別子です。」などどエラーがでてしまいます。BC++では何も問題ないのですが・・・。なぜなのでしょうか? #include <iostream.h> #include <string.h> void main(){ string s; cout << "貴方の名前は?" <<endl; cin >> s; cout << s <<"さん、こんにちは"<<endl; }

  • 構造体を引数とする、クラス間のデータの受渡し方法について

    現在、C++の構造体を理解しようと努めていますが、どうしても理解できない点があり、 なにとぞ、ご指導・ご助言のほどよろしくお願い致します。 1.質問内容  a.構造体を引数とする、クラス間のデータの受渡し方法について ・主プロ(主クラス)側の構造体のメンバ変数を、サブプロ(サブクラス)側で更新するのに、 メンバ変数を一つずつ引数として渡せば、正しく更新できるのですが、構造体を引数として渡すと    コンパイルエラーになります。   ・どのように定義すれ場良いのかをご助言お願い致します。 2.プログラムの内容を簡単に記載します。  全部を記載する事は出来ないので、一部を省略して簡単に必要な所だけを記載します。  a.Main.cpp int main() { CMain main; CSub sub; //Main_Classの関数に、Sub_Classクラスのポインタを引数として渡し、Sub_Classクラスの関数を呼び出す main.Main_FuncCall(&sub); return 0; } b.CMain_Class.h class CMain { public: //コンストラクタ 省略 //デストラクタ 省略 typedef struct CHAR1 { int m_chx; int m_chy; bool m_chValidFlag; }; CHAR1 *pc; //データの受け渡し(ポインタ) void Main_FuncCall( CSub* cs ); };  c.CMain_Class.cpp void CMain::Main_FuncCall( CSub* cs ) { //メインクラスの構造体を引数として、サブクラスの関数を呼び出す //サブプロ側の構造体を更新する cs->Sub_FuncCall4( pc ); } d.CSub_Class.h class CSub { public: //コンストラクタ 省略 //デストラクタ 省略 typedef struct CHAR_S { int m_chx; int m_chy; bool m_chValidFlag; }; CHAR_S *ps; void Sub_FuncCall( CHAR_S *pc ); }; e.CSub_Class.cpp void CSub::Sub_FuncCall( CHAR_S *pc ) { pc[1].m_chx += ps[1].m_chx; } 3.コンパイルする  a. cs->Sub_FuncCall4( pc ); -> 1 番目の引数を 'struct CMain::CHAR1 *' から 'struct CSub::CHAR_S *' に変換できません。 (新しい機能 ; ヘルプを参照) 指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。 b.色々と試してみましたが、現在の私の知識ではコンパイルができません。   アドバイスのほど、よろしくお願いします。

専門家に質問してみよう