C言語に関する問題です。

関数へのポインタを標準出力へ出力する移植性の高い方法(プログラム)を示してください。

回答の条件
  • 1人1回まで
  • 登録:2007/07/22 13:17:36
  • 終了:2007/07/26 20:21:15

回答(1件)

id:garyo No.1

garyo回答回数1782ベストアンサー獲得回数962007/07/22 13:40:50

「関数へのポインタ」の「何」を標準出力へ出力するのか良く分かりませんが、関数へのポインタのアドレスを標準出力へ出力してみました。

#include<stdio.h>

void func()
{
        puts("func()\n");
}

int main()
{
        void (*funcp)(void);

        funcp=func;
        (*funcp)();

        printf("%p\n",funcp);
        return 0;
}
id:Bookmarker

× "%p"は void へのポインタを変換する変換指定子である

× sizeof(void*)==sizeof(funcp) とは限らない

採点結果: 10ポイント

2007/07/26 20:18:27
  • id:rafile
    ポインタって抽象なのでそのまま出力はできませんよ。アドレスっていう具体が見たいのか、それともある変数に入っている関数の名前が見たいのか。ポインタの常として、ポインタがみたいのかポインタの中身が見たいのかというのはいつでも混乱の元ですし。

    出力時の出力サンプルを提示するか、今何をして何に困っているか示さないと、移植性の前に答えが出ない気がします
  • id:Bookmarker
    混乱しますか?「関数へのポインタ」って一般的に使われていると思ったんですけど…。
    例えば、
    int (*fp)() = func;
    とした時の、fp の値です。

    困ってて聞いているわけではありません。答えはだいたいわかっています。
    ただ、あるオープンソースソフトウェアのソースコードを読んでいて、関数へのポインタを出力するコードがバグっていて直そうと思ったんですけど、そういえば標準規格として関数へのポインタを出力する方法がないことに改めて気がついたので、質問というか問題にしました。

    という訳で、書き忘れていましたが、回答は途中で開封せず、締め切り後一斉に開封します。
    各回答は、50ポイント満点で(独断で)採点します。
    予想以上の回答には、最高50ポイントを上乗せします。
  • id:ttamo
    わざと曖昧に出題なさっているのだと思いますが、

    >C言語に関する

    どの C 言語なのか、および、

    >関数へのポインタを標準出力へ出力する移植性の高い方法

    0-パッディングまで一致した表示が必要なのか、
    というあたりで色々な答えが出そうですね。楽しみです。

    void* に入れて ANSI C の printf で %p を使うのかな、と思いますが……それは安易すぎるのかなぁ?

  • id:Bookmarker
    > どの C 言語なのか

    明記してませんでしたけど、「移植性の高い」は ISO C を想定しています。
    現在だと、ISO C90 の範囲内で書けば(書ければ)、最も移植性が高いのではないかと思います。
    # 早く C99 が普及して欲しいですが…

    > void* に入れて ANSI C の printf で %p を使うのかな、と思いますが……

    もごもご……
  • id:garyo
    >ついたので、質問というか問題にしました。
    問題なら問題と書いて欲しいな。
    何を悩んでるのだろうと真面目に回答して馬鹿をみた気分だ。
    とりあえず回答を開示しておく。
    ポイントは要らない。

    #include<stdio.h>

    void func()
    {
    puts("func()\n");
    }

    int main()
    {
    void (*funcp)(void);

    funcp=func;
    (*funcp)();

    printf("%p\n",funcp);
    return 0;
    }
  • id:Bookmarker
    > 問題なら問題と書いて欲しいな。

    「質問です~教えてください」ではなく、「問題です~示してください」と書いてはいるんですが、意図が伝わらなかったようですね。
    失礼しました。
  • id:pyopyopyo
    結局 printf で %p 使うだけですよね?
  • id:Bookmarker
    なかなか回答が増えないので、このままだと早く締め切るかもしれません。

    お手数ですが、回答を予定していらっしゃる方は、コメントをお願いいたします。
  • id:Bookmarker
    私なりの回答は日記へ。
    http://d.hatena.ne.jp/Bookmarker/20070726/1185448927
  • id:zzz_1980
    関数のポインタ使いますよね。qsortの引数とか。
    一応ポインタが64bit幅であることも考えて、こんな感じですかね。
    x86アーキテクチャのラージモデルには対応していません。(苦笑)
    大昔の68kアーキテクチャ用のemacs (version 18の頃)はユーザー空間は 0x00000000-0x7fffffff でかつメモリなんてそんなに使わないだろうということでポインタの上位3bitを lisp の type を格納するのに流用していて、RISC アーキテクチャのマシンに移植しようとしてこけました。(ユーザー空間の仮想アドレスが 0x80000000-0xffffffff だった。)
    #include<stdio.h>
    void func()
    {
    printf("func()¥n");
    }
    int main(int argc,char *argv[])
    {
    void (*funcp)(void) = func;
    (*funcp)();
    printf("%lx¥n",(long int)*funcp);
    return 0;
    }

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません