質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.76%

  • C

    3459questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    3255questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

標準ライブラリ関数と自作関数に関して

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 479

carnage0216

score 120

今、opencvを勉強中に好奇心で質問したいのですがよろしいでしょうか?
もちろん、勉強中の画像処理とはほぼ関係がないため怒られるかもしれませんが、一度好奇心をもってしまうと知りたくなってしまうのです。

関数にprintfがあります。
この関数はディスプレイに文字を表示する関数ですが、このprintfを改造したりいじったり出来るのでしょうか?(メリットはないと思いますが。)
また、printfとは別にprintfのような関数を自作する上で、コンパイラを自作関数を使うためにいじるのでしょうか?
(標準ライブラリ関数を利用しないで一から自作関数を作るとなると使うcpuの構造の理解をしないといけないのでしょうか?)
過去の回答で自作関数をコンパイラに通すならば、使っているcpuの構造を理解していないと難しいと言われたのですが、使っているcpuの構造を理解していなくても自作関数を動かす方法はあるのでしょうか?

以上のように勉強中の画像処理とは全く無関係ですが、画像処理のプログラムで使われる標準ライブラリ関数などを勉強していたら、気になって仕方なくなりました。
どうかよろしくお願い致します。
詳しく書いてあるような書物がありましたら教えて頂けると嬉しいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yohhoy

    2018/01/26 22:51 編集

    闇雲に質問を繰り返すよりも、まずはコンピュータの仕組みやOS・CPUが担う役割分担について学習された方が結果的に近道になるのではないでしょうか?(mkgreiさんコメントにある書籍など)

    キャンセル

回答 3

checkベストアンサー

+2

このprintfを改造したりいじったり出来るのでしょうか?(メリットはないと思いますが。)

やり方次第で、可能性はいろいろあります。例えば、vprintfといって、(多少の)引数の制御をできるようなprintf系の関数もありますし、逆にOSレベルでフックを仕掛けることで出力としての挙動を変えることも可能です(ユーザーレベルでごく簡単にできることとして、「出力先のリダイレクト」なんてこともあります)。

ただ、

自作関数をコンパイラに通すならば、使っているcpuの構造を理解していないと難しい

それではコンパイラの意味がありません。C言語で書かれた関数であればきちんと機械語に直してくれるのがコンパイラです。もっとも、C言語は「文字コード」から「変数の大きさ」まで実装依存なので、状況によってはそれらを吸収できる構造にしておく、あるいは特定の環境に決め打つ必要がある例もあります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/26 21:31

    いつもありがとうございます。
    わたしは勘違いしているかもしれないのですが、コンパイルされたあとの出力がどこへ働くかを把握できていなければ自作関数を作っただけで、ちゃんと動く関数ではないのではしょうか?

    cpuから出力された機械語がディスプレイに文字を表示する装置へ入力されるような働きをする関数を作るにはどうしたら良いのでしょうか?
    標準ライブラリ関数を利用するしかないのでしょうか?

    キャンセル

  • 2018/01/26 21:32

    また、以上のような関数を考えるためにハードレベルまで考える必要はあるのでしょうか?
    質問が多くなりましたが、どうかよろしくお願い致します。

    キャンセル

  • 2018/01/26 21:35

    ワンチップマイコンとかMS-DOSのように自分でハードウェアを完全に制御できる環境であれば話は別ですが、LinuxやWindowsのような現代的なOS環境では、ハードウェアの直接制御は基本的に「やってはいけません」。無理やりやってしまうと、OSの認識しているマシンの状態と実際の状態がずれてしまい、メチャクチャな動作になることもあります。

    ふつうのOS上で動くプログラムを書く場合、ハードウェアはOSのAPI経由で制御します。

    キャンセル

  • 2018/01/26 21:36

    たとえばprintfのソースを手に入れて丹念に辿っていけば、最終的にはOSが提供する出力ルーチンに辿り着くと思うよ。そこから先はOSのコードを読むことになるやろね。

    キャンセル

  • 2018/01/26 21:38 編集

    https://www.amazon.co.jp/コンピュータはなぜ動くのか~知っておきたいハードウエア&ソフトウエアの基礎知識~-矢沢-久雄/dp/4822281655/ref=pd_sim_14_8?_encoding=UTF8&psc=1&refRID=4YHHZXKQC238NE1NPVDJ

    https://www.amazon.co.jp/プログラムはなぜ動くのか-第2版-知っておきたいプログラムの基礎知識-矢沢久雄/dp/4822283151/ref=pd_sim_14_1?_encoding=UTF8&psc=1&refRID=8AVMDCGRNDATR6E4J2QZ

    https://www.amazon.co.jp/ハロー“Hello-World-OSと標準ライブラリのシゴトとしくみ-坂井-弘亮/dp/4798044784/ref=sr_1_2?s=books&ie=UTF8&qid=1516970289&sr=1-2&keywords=hello+world

    このような本をお読みなってみてはいかがでしょうか。

    キャンセル

+2

公開されているprintfのソースを入手すれば、修正は可能です。
また、ゼロから自分で作る事もできます。全部Cで書けば、CPUの命令を知る必要はありません。

自分で書いたprintfを使うためにコンパイラ自体を修正する必要はありません。
例えば、printf.cに自作printfを書いて、program.cから使うためには、
一度、
gcc -o printf.o printf.c
しておいて、
gcc -o program program.c printf.o
で自分の書いた方を使うことが出来ます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/26 21:21

    貴重な情報、ありがとうございます。
    ちなみに、標準ライブラリ関数を作った方々は全くの一から、アセンブリ言語から作ったのでしょうか?
    個人的にはcpuの違いを考慮しながら作ったと思うので大変だとは思います。

    キャンセル

  • 2018/01/26 21:24

    Linuxで動くCコンパイラであれば、glibcといってLinux自体にC言語のライブラリが事実上付属しているので、基本的にはそれを呼ぶだけです。

    他のOSでも、C言語のライブラリはOSのシステムコールを呼ぶようになっているので、ハードウェアレベルまで考える必要はそれほどありません。

    キャンセル

  • 2018/01/26 21:49

    標準ライブラリ関数の多くはCだけで書かれているので、それらはCPUには依存しません。

    キャンセル

  • 2018/01/26 22:56

    otnさんに質問なのですが、コンパイルされたあとの出力がどこへ働くかを把握できていなければ自作関数を作っただけで、ちゃんと動く関数ではないのではしょうか?
    cpuから出力された機械語がディスプレイに文字を表示する装置へ入力されるような働きをする関数を作るにはどうしたら良いのでしょうか?
    標準ライブラリ関数を利用するしかないのでしょうか?
    私には 標準ライブラリを利用しないでコンパイルされたあとの出力(機械語)がどこへ働くかを把握しなくても自作関数が作れる理由がいまいちわかりません。

    キャンセル

  • 2018/01/26 23:16

    別回答でも書いていますが、ライブラリ関数も通常はOSのAPI(システムコールなど)を呼ぶように書かれますので、そこさえ知っていれば実際のハードウェアがわからなくても全く問題ありません。

    もとろん、C言語用語の「フリースタンディング環境」のような、OSからの支援が期待できない環境でコードを書く場合は、自力でハードウェアをアクセスする必要があります。

    キャンセル

  • 2018/01/26 23:22

    ということは、CPUから出力された機械語を意図的にCPU外の装置へ働かせるにはOSのAPI(システムコールなど)の情報を参考にして自作関数(Ⅽ言語のソースコード)を書けばよいということでしょうか?
    わかりにくい質問ですがどうかよろしくお願いします。

    キャンセル

  • 2018/01/26 23:29

    前の文はわかりにくいので修正しました。
    OSのAPI(システムコールなど)の情報を参考にして、例えばwindowsのAPIのソースコードを読んで、出力がどこへ働くなどを把握してAPIのソースコードの情報を基にC言語で自作関数を作るということでしょか?

    キャンセル

  • 2018/01/26 23:32

    Windows APIも、おそらく実際のハードウェアアクセスの大半はデバイスドライバに投げているだけだと思います。

    デバイスドライバが実際にデバイスとやり取りする部分は、まさしく機器によって千差万別です。

    キャンセル

  • 2018/01/26 23:47

    そうなんですか…。
    たしかOSは出力されたデータがどこへ働くかの指示を与える存在だったと思うのでが、
    ならばWindowsのOSのソースコードからprintfの関数が来たらこのような動きをするようにとか書いてあるのでしょうか? 書いてあるならばOSがどこへ動くのかを参考にして自作関数が作れると思うのですがどうでしょか?
    APIからいきなり離れてしまい申し訳ありませんがどうかよろしくお願いいたします。

    キャンセル

  • 2018/01/27 07:54

    そのあたりまで興味があるのなら、OSの機能についての本を読まれるといいかと思います。

    キャンセル

  • 2018/01/27 07:57

    標準ライブラリ関数は、strlen() sin() のようにOSの機能を呼び出さないものと、printfのようにシステムコールwrite等を呼び出すものがあります。システムコールwriteはOSのAPIです。APIの先のファイルや端末に書くのはOSの機能なので、OSの本を読みましょう。

    キャンセル

  • 2018/01/28 03:57

    わかりました。どうもありがとうございます。

    キャンセル

0

ご質問の内容から、OpenCVにはまだほど遠いと感じました。CやC++の入門書で勉強をしてください。とにかくたくさんプログラムを打ち込んで動かしてみてください。私はそれ以外の上達方法を知りません。CやC++の理解を深めれば、多くの疑問は自ずと解消していくはずです。もしその過程でプログラムの組み方など判らないところが出たりしたら、teratailで質問すれば良いでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/27 00:39

    そうですね。経験なしには難しいですね。
    わかりました。勉強に戻ります! どうもありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3459questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    3255questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。