関数で

void * Get???() const

というものを見つけました。
通常voidは戻り値なしと認識しています。

しかし、Getと付くようにこの関数の説明文を読むと値が返ってくると書いてある気がします。
(英文なので絶対とは言い切れないのですが・・・)

この【void *】の関数はどのように扱えるのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (1件)

確かに * なしの void が戻り値となっている場合は、その関数の戻り値が無いことを意味します。


しかし void * というのは、何らかの型のポインタを表します。
ですから、それが戻り値という事は、何の型のポインタかはこれだけではわからないけどとにかくポインタが返ってくることを表します。
何型のポインタかは事情があって決められない場合によく使われます(例:malloc())。ですのでその型が具体的になんなのかを決める方法は関数の説明文にあると思われます。

これ以上は関数の説明文を読まないと何とも言えません。説明文を提示いただければさらにアドバイスできると思うのですが。
    • good
    • 0
この回答へのお礼

ありがとうございます!
説明文には
Get property value.
しか書いてないので多分なんとも言えないかと・・・

でも疑問は解決しました。
ありがとうございました!

お礼日時:2014/08/21 18:07

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q戻り値を返す関数の前に(void)を付ける

今日会社で

変数 = (void)戻り値のある関数
#具体的な例としては下記一例を参照

と、ソースで書かれているものがあったのですが、
コメント等では、

「戻り値を明示しないときに(void)を付けて使用する」

と、書いてあります。
戻り値のある関数の前で(void)を付けると、戻り値が明示されなくなるのでしょうか??
または、このような動作にはならないのでしょうか。

自分自身、ソースの内容をうる覚えになっておりますので、
確認をしながらアップしていきたいと思いますので、
宜しくお願い致します。

/*一例*/

・num1とnum2を足した値を返す
int PlusPoint(int num1 , num2);

・PlusPointの値を格納する
int Sum

◇ソース◆

#include <stdio.h>
#include "Plus.h"
int main(void)
{
int Sum;

Sum = (void)PlusPoint;
if(Sum == 2)
{
printf("false");
exit(0);
}
printf("true");
return 0;
}
*PlusPoint関数は外部で定義されている
*プロトタイプ宣言はPlus.hに定義されいるものとする

今日会社で

変数 = (void)戻り値のある関数
#具体的な例としては下記一例を参照

と、ソースで書かれているものがあったのですが、
コメント等では、

「戻り値を明示しないときに(void)を付けて使用する」

と、書いてあります。
戻り値のある関数の前で(void)を付けると、戻り値が明示されなくなるのでしょうか??
または、このような動作にはならないのでしょうか。

自分自身、ソースの内容をうる覚えになっておりますので、
確認をしながらアップしていきたいと思いますので、
宜しくお願...続きを読む

Aベストアンサー

「戻り値を明示しないときに(void)を付けて使用する」

昨今では、あまり流行のスタイルではないと思いますが、
こういうコーディング規約の文化は、実際にありました。
lint(ソースのチェックツール)等で、(void)にキャストしていないと警告をあげるものもありました。
「冗長な記述」と見る向きも、「表明的な記述」と見る向きもあります。

> 戻り値のある関数の前で(void)を付けると、戻り値が明示されなくなるのでしょうか??

動作的には、戻り値を(void)にキャストしてるのですね。
だから「明示的に『使わない』という表明」してるという意図です。
# 何も書いてないと、ミスで戻り値をチェックしてないのか、
# 分かった上でチェックの必要がないのか分かりにくい、と考えます。

Sum = (void)PlusPoint;
とはいえ、こういう書き方はしない(できない)です。
コンパイル通らないでしょう?

あくまで、例えばこんな感じで使います。
(void)PlusPoint(1, 2);

Qエラー「invalid conversion from `void (*)()' to `void (*)(int)'」

皆様、よろしくお願いしたします。RedHat9上で
次のような「鬼ごっこのプログラム」server.cをコンパイルしています。

$ g++ -o server server.c
server.c: function 内の `void session_init(int, char, int, int, char, int,
int)':
server.c:134: invalid conversion from `void (*)()' to `void (*)(int)'

というエラーが出てしまいます。
134行というと
「 signal(SIGINT, die);」
なのですが何が間違っているんでしょうか?

Aベストアンサー

die の宣言を
void die(int sig);
にしたのであれば, session_loop の中で die を呼出すときにも引数は必要ですよ.

また, 最後の die の定義のところでも引数を取るようにしていますよね? ←念の為.

Qvoid (*signal(int signum, void (*handler)(int)))(int);

の解釈を教えてください
最後の「(int)」については詳しくお願いします

Aベストアンサー

signalが

(1)1つ目の引数の型:int
(2)2つ目の引数の型:引数がintで戻り値がvoidである関数へのポインタ
(3)戻り値の型:引数がintで戻り値がvoidである関数へのポインタ(2と同じ)

を満たす関数である事を宣言しています。最後の(int)はsignalの戻り値の
関数ポインタがint型の引数を持つ事を示しています。

「引数がintで戻り値がvoidである関数へのポインタ」の型をHANDLERと表すと

HANDLER signal(int signum, HANDLER handler);

となります。

Q「void ( *signal(int sig, void (*func)(int)) ) (int)」の (int)

signal関数の書式についてですが、

  void ( *signal(int sig, void (*func)(int)) ) (int);

最後に付く(int)は一体何でしょうか?
このような関数の書式ははじめて見ました。
UNIX系の何かでしょうか。
回答よろしくお願いします。

Aベストアンサー

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);
より後半部分のtypedefを置き換えると
sighandler_t signal(int signum, void (*sighandler)(int));
つぎに戻り値の部分のtypedefを置き換えると
void (*signal(int signum, void (*sighandler)(int)))(int);
となります。
(
sighandler_t signal(int signum, void (*sighandler)(int));
の「signal(int signum, void (*sighandler)(int))」をAと置き換えて
sighandler_t A;
からtypedefを置き換えると
void (*A)(int);
となり、Aを戻すと
void (*signal(int signum, void (*sighandler)(int)))(int);
となる。
)

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);
より後半部分のtypedefを置き換えると
sighandler_t signal(int signum, void (*sighandler)(int));
つぎに戻り値の部分のtypedefを置き換えると
void (*signal(int signum, void (*sighandler)(int)))(int);
となります。
(
sighandler_t signal(int signum, void (*sighandler)(int));
の「signal(int signum, void (*sighandler)(int))」をAと置き換えて
sighandler_t A;
からtypedefを置き換...続きを読む

Qdequeue(BYTE *x)関数の戻り値について

以前、キューに関する質問をさせていただいた時に、回答者の方から、


BYTE dequeue(void)
{
BYTE x;
if(Head==Tail){
QueueState = QSTATE_EMPTY;
return;
}
Head=(Head+1)%MAX_BUF_NUM;
x=UartSendBuf[Head];
UartSendBuf[Head]=0x00; //出力し終わったら0x00でクリアしておく。
return x;
}


私のdequeue関数でエラーが発生している場合に単なる”return”で戻しているということでご指摘頂いたのですが、下記する文章で回答者の方が教えて頂いた内容で理解できない部分があり、困っております。

----(回答者さんの文章)-------------------------------------

その他、気づいた点。dequeue()はBYTE型の値を返す関数なのに、異常時に単にreturn;してます。こういう事をしてると後で痛い目に遭います(笑)。

このようなケースでは次のどちらかの方法をとります。
(a)正常時には決して返すことの無い値(0とか-1など)をエラーとして返す。
しかし表現可能なすべての値がデータとしてありうる場合はこの方法をとれないので、
(b)関数が返す値を成功か失敗か(或いはエラーの種類)だけにする。
データを返すためのポインタを引数として渡してもらい、例えば
int dequeue(BYTE *x)
として、*x = UartSendBuf[Head]; でデータを返します。

--------------------------------------------------------------
確かにコンパイラはreturnだけで返すのはまずいとワーニングを出しているので、作り変えてみたのですが、


BYTE dequeue(BYTE *x)
{

if(Head==Tail){
QueueState = QSTATE_EMPTY;
return 0xFF;
}
Head=(Head+1)%MAX_BUF_NUM;
*x=UartSendBuf[Head];

return *x;
}

このポインタ変数が入ってくるのがよくわからず困っています。*xがreturnとなっていますが、どのような戻り値が返ってくるのでしょうか?


あと、この関数を使う場合、

dequeue(Head);

このような引数を入れてあげればよいのでしょうか?

また、キューからデータを取り出したい場合は、

testBuf[i]=UartSendBuf[Head];
test = dequeue(Head);

このようにdequeue関数の前でデータを取り出してから、dequeue関数の戻り値で判定するという処理をするようにしなければいけないでしょうか?

以前、キューに関する質問をさせていただいた時に、回答者の方から、


BYTE dequeue(void)
{
BYTE x;
if(Head==Tail){
QueueState = QSTATE_EMPTY;
return;
}
Head=(Head+1)%MAX_BUF_NUM;
x=UartSendBuf[Head];
UartSendBuf[Head]=0x00; //出力し終わったら0x00でクリアしておく。
return x;
}


私のdequeue関数でエラーが発生している場合に単なる”return”で戻しているということでご指摘頂いたのですが、下記する文章で回答者の方が教えて頂いた内容で理解できない部分があり、困っておりま...続きを読む

Aベストアンサー

作り変えたdequeue関数をぱっとみただけでも、戻り値と引数の2つで値を返しているように見えます。おそらく(a)と(b)の内容をごちゃ混ぜにしてしまっているのだと推測します。

(a)にならって書くのならば以下のような感じだと思います。
BYTE dequeue(void)
{
BYTE x;
if(Head==Tail){
QueueState = QSTATE_EMPTY;
return 0xFF;
}
Head=(Head+1)%MAX_BUF_NUM;
x=UartSendBuf[Head];
UartSendBuf[Head]=0x00; //出力し終わったら0x00でクリアしておく。
QueueState = QSTATE_VALID;
return x;
}

// 呼び元
BYTE x;
x = dequeue(); // xが0xFFかどうかで成否判断


(b)にならって書くのならば以下のような感じだと思います。
(QueueStateの型がわからないのでint型と仮定)
int dequeue(BYTE *x)
{
if(Head==Tail){
*x=0xFF;
return QSTATE_EMPTY;
}
Head=(Head+1)%MAX_BUF_NUM;
*x=UartSendBuf[Head];
return QSTATE_VALID;
}

// 呼び元
BYTE x;
QueueState = dequeue(&x); // QueueStateがQSTATE_VALIDかどうかで成否判断

>このポインタ変数が入ってくるのがよくわからず困っています。*xがreturnとなっていますが、どのような戻り値が返ってくるのでしょうか?

この疑問が出てくるということは、まだポインタについて理解ができていないのだと思います。そのあたりをしっかり理解されたほうが後々ためになるでしょう。

最後に、前回の質問を締め切らずに質問を繰り返すのはマナー違反です。気をつけましょう。

作り変えたdequeue関数をぱっとみただけでも、戻り値と引数の2つで値を返しているように見えます。おそらく(a)と(b)の内容をごちゃ混ぜにしてしまっているのだと推測します。

(a)にならって書くのならば以下のような感じだと思います。
BYTE dequeue(void)
{
BYTE x;
if(Head==Tail){
QueueState = QSTATE_EMPTY;
return 0xFF;
}
Head=(Head+1)%MAX_BUF_NUM;
x=UartSendBuf[Head];
UartSendBuf[Head]=0x00; //出力し終わったら0x00でクリアしておく。
QueueState = QSTATE_VALID;
return x;
}

...続きを読む


人気Q&Aランキング

おすすめ情報