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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

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

C++

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

Q&A

解決済

3回答

914閲覧

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

carnage0216

総合スコア194

C

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

C++

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

0グッド

0クリップ

投稿2018/01/26 12:05

編集2018/01/26 12:18

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yohhoy

2018/01/26 13:54 編集

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

回答3

0

ベストアンサー

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

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

ただ、

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

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

投稿2018/01/26 12:21

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carnage0216

2018/01/26 12:31

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

2018/01/26 12:32

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

2018/01/26 12:35

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

2018/01/26 12:36

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

0

公開されている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 12:17

otn

総合スコア84529

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carnage0216

2018/01/26 12:21

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

2018/01/26 12:24

Linuxで動くCコンパイラであれば、glibcといってLinux自体にC言語のライブラリが事実上付属しているので、基本的にはそれを呼ぶだけです。 他のOSでも、C言語のライブラリはOSのシステムコールを呼ぶようになっているので、ハードウェアレベルまで考える必要はそれほどありません。
otn

2018/01/26 12:49

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

2018/01/26 13:56

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

2018/01/26 14:16

別回答でも書いていますが、ライブラリ関数も通常はOSのAPI(システムコールなど)を呼ぶように書かれますので、そこさえ知っていれば実際のハードウェアがわからなくても全く問題ありません。 もとろん、C言語用語の「フリースタンディング環境」のような、OSからの支援が期待できない環境でコードを書く場合は、自力でハードウェアをアクセスする必要があります。
carnage0216

2018/01/26 14:22

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

2018/01/26 14:29

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

2018/01/26 14:32

Windows APIも、おそらく実際のハードウェアアクセスの大半はデバイスドライバに投げているだけだと思います。 デバイスドライバが実際にデバイスとやり取りする部分は、まさしく機器によって千差万別です。
carnage0216

2018/01/26 14:47

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

2018/01/26 22:54

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

2018/01/26 22:57

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

2018/01/27 18:57

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

0

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

投稿2018/01/26 15:37

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carnage0216

2018/01/26 15:39

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問