- ベストアンサー
#define文等について質問です
表題の件ですが、 プログラム読んでいて分からないことありましたので、 C言語の文法的なことですが、教えて下さいませ。 全然自信ないですが、自分の解釈も付けてみました… 質問(1) #define MP_RELEASEWIN(p) MP_FreeWin((IWindow **)&(p)) 中略 static void MP_FreeWin(IWindow ** ppif); 中略 static void MP_FreeWin(IWindow ** ppif) { 中略 } このような場合、最初の#defineは、 MP_RELEASEWIN(p)は、MP_FreeWin((IWindow **)&(p))だよ と定義しているけど、前方宣言にはなっていないから static voidでプロトタイプ宣言して、 最後に関数の定義を書いているって解釈で 合っているのでしょうか? 質問(2) #define MP_IWINDOW_SETVTBL(pVtbl, pfnEn, pfnRd, pfnHE, pfnDel) \ (pVtbl)->Enable = (pfnEn); \ (pVtbl)->Redraw = (pfnRd); \ (pVtbl)->HandleEvent = (pfnHE); \ (pVtbl)->Delete = (pfnDel) これって、 MP_IWINDOW_SETVTBL(pVtbl, pfnEn, pfnRd, pfnHE, pfnDel) を (pVtbl)->Enable = (pfnEn); \ (pVtbl)->Redraw = (pfnRd); \ (pVtbl)->HandleEvent = (pfnHE); \ (pVtbl)->Delete = (pfnDel) の4行部分で置き換えているのでしょうか? あと、(pfnDel)の最後だけ、「;」がないのは 約束事って理解でいいのでしょうか? 質問(3) #define CMediaPlayer_CancelRedraw(p) { CALLBACK_Cancel(&(p)->m_cbRedraw); (p)->m_bRedraw = FALSE; } こんなのがあるのですが、 これは質問(2)と同じ意味なのでしょうか? こっちにはカッコが付いているのですが、 これは、何か意味があるのでしょうか? 質問(4) QINTERFACE(IWindow) { // Releases the window resources void (*Delete)(IWindow * po); }; この void (*Delete)(IWindow * po); の部分は、どういう風に理解すればいいのでしょうか? カッコとか、*がついてますが… Delete(IWindow * po); とかいう関数に何かしているという意味なのでしょうか@@; 教えて下さい。 なんか、たくさん質問してますが、 よろしくお願い致しますm(__)m
- みんなの回答 (6)
- 専門家の回答
関連するQ&A
- #defineについて
#define STATIC_ASSERT(expr) { \ char __STATIC_ASSERTION[(expr) ? 1 : -1]; \ (void)__STATIC_ASSERTION; \ } /* 符号付き整数の右シフトが算術シフトかどうか */ #define SHIFT_LEFT_SINGNED_USES_SAL \ (((signed int)0xffffffff >> 1) == 0xffffffff) /* 符号無し整数の右シフトが論理シフトかどうか */ #define SHIFT_LEFT_UNSIGNED_USES_SHL \ (((unsigned int)0xffffffff >> 1) == 0x7fffffff) とは一体どういう意味なのでしょうか? なぜ、ブロックの中にchar型が宣言されているのでしょうか? なぜ、(void)とキャストされているのでしょうか? できたらわかりやすくご教授よろしくお願いします。
- ベストアンサー
- C・C++・C#
- C++ クラス名の前のdefine
C++ クラス名の前のdefine 初めまして、質問させてください。 C++の作法?でクラス宣言時にクラス名の前につけるdefineには なんお意味があるのでしょうか? コード例 #define DEFINE class DEFINE Hoge{ }; 以上になります。 ご教授宜しくお願い致します。
- 締切済み
- C・C++・C#
- javaの基本的な質問
java初心者です。 サンプルプログラム等の宣言部分が下記の2通りで記載されていることがありますが、 カギ括弧の位置が違うこの2つは何か意味があるのでしょうか? それとも同じ意味ですか? ----------------------------------------- public static void main (String args[]) public static void main (String[] args) ----------------------------------------- よろしくお願いします。
- ベストアンサー
- Java
- 解説をお願いします。
#define ast_test_flag(p,flag) ({ \ typeof ((p)->flags) __p = (p)->flags; \ typeof (__unsigned_int_flags_dummy) __x = 0; \ (void) (&__p == &__x); \ ((p)->flags & (flag)); \ }) あるソースコードを読んでいると上のような記述に当たりました。 何をしているのか解説していただけませんか。 __xとか¥記号とか宣言していないものも多く、皆目見当がつきません。
- ベストアンサー
- C・C++・C#
- (続)エラー「invalid conversion from `void (*)()' to `void (*)(int)'」
お手数をお掛けしています。 > die の宣言を > void die(int sig); > にしたのであれば, session_loop の中で die を呼出すときにも引数は必要ですよ. > また, 最後の die の定義のところでも引数を取るようにしていますよね? ←念の為. えーと、下記のように static void die(int); : (中略) : signal(SIGINT, die(1)); : (中略) : /* 端末属性を復旧して終わる */ die(1); } : (中略) : static void die(int) { endwin(); /* 端末属性の復旧 */ exit(0); } としてみたのですが $g++ -o server server.c server.c: function 内の `void session_init(int, char, int, int, char, int, int)': server.c:134: void の値が本来の意味通りに無視されませんでした となってしまいました。 何か勘違いしてますでしょうか??
- ベストアンサー
- C・C++・C#
- staticと+=の意味を・・・
いろいろ調べたのですが、staticはクラスフィールドやクラスメソッドの宣言などに使うと書いてありますが、public static void mainとか以外に見たことありませんし使ったこともないんです・・・。 なのでイマイチ理解できません・・・。使い方を教えてください。あと、+=加算代入と書いてありますが、これもよくわかりません・・・。 なんか一語一語「これってどういう意味なんだろう?」とかって思うと調べても漠然とした説明ばかりで理解に苦しみます。 なにかいいアドバイスがあれば教えてください。よろしくお願いします。
- ベストアンサー
- Java
- #define F_CPU という設定
現在Atmel Studio6.1 + JTAGICE3でATmega88Pのプログラミングを行っています。 https://sourceforge.jp/projects/cc1101driver/scm/svn/tree/head/branches/test002_AVRS6_20140819/test02/ このプロジェクト内で、リアルタイムデバッグを行っているソースコードで、無線モジュールIC CC1101がある端末出力されて受信したデータがあった場合、SPI通信でATmega88PマイコンにSPI通信割り込みでデータを送信して、データ内容で条件が適合するとAtmega88pの特定のeepromアドレスへ受信データ内容の一部データ(IDコード)を書き込むようにしている箇所があります。 u8 setup_oper() 関数内の length = cc1101_rx((u8 *)fifo,0); if(length > 0) { gggLength = length; if(length == sizeof(fifo_t) && fifo- ・・・・(中略)・・・・ } リアルタイムデバッグ中に上記のコードで端末側がデータ送信を行っているのに、受信した場合にlength = cc1101_rx((u8 *)fifo,0); のコード部分では受信したデータのlength値が代入されるはずなのですが、それが”0”のままであるため、eepromへの書き込みが行われていないことに気づきました。 いろいろとソースコードの修正を試みたところ、 #define F_CPU 800000UL 元々このように設定されていたコードを #define F_CPU 2000000UL このように変更したところ、正常にCC1101からのSPI通信もeepromへのデータ書き込みもうまくいくことがわかりました。 この”#define F_CPU”というコードはどのような意味があるのかご教示頂きますよう、よろしくお願い致します。 また、現在Atmega88pの元周波数は8MHzを使用したく、8CKDIVのチェックを外しています。 なので、 #define F_CPU 8000000UL このように設定してみたところ、これだとCC1101とのSPI通信ができないようでeeprom書き込みのコードに到達できなくなります。 #define F_CPU 2000000UL これは内部周波数が元の8MHzを4分周した2MHzのことなのだろうか? このように思って2000000ULとしてみたのですが、この考えでよろしいのでしょうか? どうぞ、ご教示頂き増増すよう、よろしくお願い致します。
- ベストアンサー
- その他([技術者向] コンピューター)
- staticなフィールドをstaticじゃないメソッドで使うには?
いつもお世話になっています。よろしくお願いします。 javaで、staticなメインメソッドからも、staticじゃないメソッドからも1つの メンバ変数(フィールド)を処理したいと思います。 private static String nr; というフィールドを宣言しました。 (staticであるmainメソッドの中で使えるようにstaticで宣言しようと思いました。) 次に、 private void Kensaku() { このstaticではないメソッドの中でString nrを使って処理を行いたいです。 } 初歩の初歩なことを質問してすみませんが、調べても分かりませんでした。 どうか、よろしくお願いします。
- ベストアンサー
- Java
- ポインターがさっぱりです><
C言語歴約2週間なのですが、 関数を見ていてさっぱりなので、3点ほど教えて下さい>< (1)CMediaPlayer * pme = (CMediaPlayer *)pi; pmeは、CMediaPlayer型のアドレスを入れる変数だと思うのですが、 正しいでしょうか? また、この部分、何で CMediaPlayer *pme のようにくっつけて書いてないのでしょうか? さらに、 (CMediaPlayer *)piは、一体何なのでしょう?@@; 特にこのカッコが良く分かりません… (2)AEEApplet_New(sizeof(CMediaPlayer), ClsId, pIShell,po,(IApplet**)ppObj,(AEEHANDLER)CMediaPlayer_HandleEvent,(PFNFREEAPPDATA)CMediaPlayer_FreeAppData)); (IApplet**)ppObj<この部分が分かりません。 これも(1)に似ているカッコの付き方なのですが、 **が2つあり、 これは何なのでしょう? (3)CMediaPlayer_CreateInstance(AEECLSID ClsId,IShell * pIShell,IModule * po,void ** ppObj); ここの、void ** ppObjの部分は、 (2)と似ていますが、 何故カッコがないのでしょうか? 文法的な質問ばかりなのですが、 ぜひよろしくお願い致します。
- ベストアンサー
- C・C++・C#
- WEBカメラの動画制御を動的配列で、、
先日「WEBカメラの画像を一定時間溜め込んで、 任意のタイミングで出力するプログラムのメモリ領域の 確保」に関して質問した者です。2次元配列を当初グローバルに宣言したところ、速度が遅くなってしまったため、動的に宣言したところ目標の速度を達成しました。 しかし停止時に例外が出てしまい、何度もプログラムを繰り返しているとどんどん速度が遅くなってしまいます。 原因を探っておりますがわかりません。 プログラムの変更箇所(動的配列の宣言部)を載せました。 これ以外のところは遅くとも正常に動作していた時と同様です。 例外の具体的な内容を明日にでもアップします。 情報不十分かもしれませんが、明らかな不具合等ありましたら、 お教えいただけますでしょうか? -ーーーーーーーーーーーーーーーーーーーーーーーー #define FRAMES 200 #define WX 640 #define WY 480 //int array[FRAMES][WX*WY]; グローバル宣言時のもの void Main(void) { int **array; array = new int*[FRAMES]; for(int i=0;i<FRAMES+1;i++){ array[i] = new int[WX*WY]; } //array[FRAMES][WX*WY]溜め込んで、 //任意のタイミングでディスプレイに出力します。 if(STOP) goto fin; } fin: for(int i=0;i<FRAMES+1;i++){ delete[] latesc[i]; } delete[] latesc; }
- ベストアンサー
- C・C++・C#
補足
回答ありがとうございます! えーと、ちょっと質問させてください。 #define MP_IWINDOW_SETVTBL(pVtbl, pfnEn, pfnRd, pfnHE, pfnDel) \ ((void)( \ ((pVtbl)->Enable = (pfnEn)), \ ((pVtbl)->Redraw = (pfnRd)), \ ((pVtbl)->HandleEvent = (pfnHE)), \ ((pVtbl)->Delete = (pfnDel)) \ )) の部分ですが、 voidをカッコで囲んでいるのは void型にキャストしているという意味で合っていますか? 大変レベルの低い質問ばかりで恐縮ですが よろしくお願いいたします。