C言語なら俺に聞け 151
レス数が900を超えています。1000を超えると表示できなくなるよ。
!!a == TRUE ならセーフになると思われるー 論理演算では1が真なのに終了は1が異常終了なのはなぜですか?
1が正しく0が間違いというイメージなのですが 昔はintを返す習慣が多分にあったのでその習慣によるが、自分は異常終了は-1返してたな。 >>807
いや、boolが戻り値なら真を成功にすることがむしろ多いと思う。
「エラーを返す」関数の需要が多いということではないか。 正常というのは1つの状態しかないが
異常には色々な種類があるのでそれを区別するためにコードとして返したい
というのと
2値しかない真偽をどう値に配分するか
というのを同列に並べるとパニック。 C言語では別のものとして割り切る
なぜC言語では偽を0に割り当てたのか?という問いの答えを求めているのならば…
俺は知らない >>807
正常は 0でいいけど、異常はいろいろな状態の別を報告できるようにでは ソフト会社に長年いて開発者からこの質問は初
OSインストールできませんなんてすごく高度なんだなって思った
コマンドのテストでコマンドの戻り値ってあるんですがなんですか? >>813
windowsの終了ステータスの確認の仕方とか忘れるしなあ。
言葉で出てくる結果しか見れないなんて普通だと思うわ。 0が偽なのにnoerrというイカれた慣習はどうして生まれたんだろうねぇ。 最初に誕生した OS、system/360 の JCLでも、正常は 0、警告が 4だったか 8だったかで、異常が 8だったか 16だったかだったな
z/OSでも同じだろうけど
知らんけど 幸福な戻り値はどれも似たものだが、不幸な戻り値はいずれもそれぞれに不幸なものである。 if (error == 0)
で違和感ないじゃん 0 informational
1 warning
2 error
3 severe
4 critical 返り値0でエラーなしはUNIXのコマンド終了ステータス以来の慣習かな。
「正常終了」は状態が1種類しかないけど、失敗は「どう失敗したか」で
複数の状態があるから、正常で0、他の値はエラーコードってのは便利でしょ。
論理演算子の結果で true false の1と0は、論理学の数値表現を
プログラム言語にそのまま写しこんだからじゃないかと。
関数は一般にエラー状態を返り値で返す、と思っていれば
正常 == 返り値0 == false は違和感ないかと。
このルールから外れてるのは「失敗時にNULLを返す」タイプの関数で、
結構たくさん存在するのが困ったところだけど。 Cでは同一のもとして動かせてしまうが
そもそもエラーコードとboolを同一視してる時点で論外なんだが 論理型を別に設けずに整数型で代用してしまおうというアイデアはBやCの言語仕様をコンパクトに
抑えるのに役立ったが、今となってはプリプロセッサマクロと同じくらいの悪しき遺産だなぁ。 C99以降であれば_Bool型を使えばいいのでは? 正常時1で異常時0を返す関数が混ざってたり
正常時ポインタで異常時ヌルポ返す関数があったり
それらの関数の返り値を全部 if でチェックしててカオスだったことがあります BOOLを返す関数が負数を返したかどうか調べにゃあかんやつとかな ワインバーグの本にあったなあ。ドル紙幣はみんな同じ色、同じサイズで見分けがつきにくいけど、
それが常識だと思っている人は、一定の確率で間違えてしまうことも世界の法則で仕方のない
ことだと思っているとか。 >>827
GetMessage()の悪口はいくら言ってもよいぞ
DWORDにしとけよ >>826
カオスっていうかこれ普通じゃない?
標準ライブラリのラッパー書くとき互換性保つために0成功にするでしょ
で他のオレオレライブラリはboolという 戻り地がboolのときはtrueが成功
intのときは0が成功なんだよ boolぐらいなにもインクルードしなくても使わせてくれぽよ >>830
それのせいでPrelではシステムコールと同名の関数の返り値がいまいち統一取れてなかったりして、結局マニュアル見ながら個別に覚えざるを得なかったりする。
Perlはだいたいは1が成功でundefが失敗なんだけどね。(undefはCでのNULLみたいなもの。未定義を意味する。定義されてて値が0の時とは違うが、書き方によっては同じように扱えることもある)。 今C++にあるoptionalだっけ?
あんな感じの有ってもいいな。かなりうざい感じになるから使わんか。 インクルードをURLで引っ張ってこれたら面白いのに。 >>837
/use/include ディレクトリをNFS マウントでもしとけ。 すみません、質問があります。
環境はlinuxです。
ある共有ライブラリlibA.soをロードするプログラムbがあります。
このプログラムbをlibA.so抜きでgccでビルドすることはできるでしょうか?
もちろん実行時にはlibA.soは用意します。 >>841
リンクされる関数やグローバル変数が全て揃ってれば誤魔化し効くのではないかな。 シンボルだけ定義したsoファイルを用意するのが普通ではないかと ビルド用のsoファイルを用意する、でいこうと思います。ありがとうございました! スタブってやつね。
dlopen使うと基本そうなると思う。
もともと自動的なシンボル解決してる場合は無視できたかも。 たぶん、DLL import, export みたいな定義ファイルさえあれば、コンパイルできるだろ? a) dll import キーワードつきのヘッダでコンパイル
DLLを読み込みシンボル解決する .lib をリンク
実行時には dll 読み込みをやってくれる (無いと文句言う)
b) 自前で DLL読み込んで GetProcAddress で関ポにセットして、
その関ポを呼び出すラップ関数を用意
自前ロードしてるので、実行時に無い時別の処理の記述が可能になるん 大学でc言語を学び始めました
ポインタが意味不明でした
何がわからないのかわからない 現実世界にポインタと同じものを説明する概念がないから簡単な説明のしようがないんだよなぁ。住所録とか余計こんがらがるし。
素直に本を沢山読んでプログラムを組んで慣れるしか無い アドレスは&つけてprintfした時に出てくるやつでしょ?
箱のラベルみたいなのだとかなんとか言われた気がする
メモリは単純に容量?
別関数で計算した値をmain関数に持ってくる時にポインタを使えばreturnがいらないだとかコピーじゃなくて直接数値を変えるから処理が楽だとか書いてあるけど結局普通に代入するのに比べて利点がよくわからない 何かの容量と言ったときの「何か」がメモリです。
利点は基本的にないです。 みんな思い思いのモデルで遊んでるから、パパは箱モデル出しちゃうぞ なんか分からない部分のコード示してもらわないと
ここの有能な人たちもどう説明したらいいか分かんないから雑談始まったがw 1ビットが0か1かの二通りを表せる情報量。
1バイトは0〜255までの256通り(2の8乗)を表せる情報量で8ビットに等しい。
1バイトを複数並べたのがメモリーで、各バイトの位置がアドレス。 アドレスに型情報を加えて、先頭アドレスを起点として配列のようにアクセス可能にしたものがポインタ。
しかし、配列は実体を要求するが、ポインタは実体を要求しない。ヌルポインタは、何も指し示さないポインタ。 ポインタ配列ってやると実体のない配列になるのかなw ポインタ配列?
ポインタの配列 *array[]
配列のポインタ (*array)[] “メモリ”って言葉がフラッシュメモリのような、
ストレージデバイスのイメージになってるのも
説明を難しくしてる要因かもしれないね。
メモリは記憶単位ごとに数字で番地が振られていて…と言っても、
「メモリってディレクトリ構造中のファイルとして記憶するんじゃないの?」
みたいな感じに、互いの言葉の意味がチグハグで。 RAMとROMの違いなんて今の時代説明しても分かる人の方が少ない気がする >メモリは記憶単位ごとに数字で番地が振られていて
キャッシュメモリ「せやろか?」 >>872
磁気コアメモリと、右側はRAMACか? 磁気ドラムだよ
ランダムアクセスでさえないのにメインメモリにしたとかいう >>856
ポインタ=君と感覚を共有してる全く同性能の影分身だ。
君の価値が100万なら、影分身は1円で作れる。
ポインタのメリットは会社が君を働かせたい時、君を直接雇うと100万円かかるが、影分身を雇うと1円で済むわけだ。
影分身が働いてる間、君は家でエロゲでもしてればいい。
気をつけないといけないのは、仕事中、影分身の腕が切断されたら、エロゲやってる君の腕も切断されるし
影分身が死んだら君も死ぬ。
これ以上わかりやすい説明はないと思うが、どうよ?w 例えられても伝わらないとさらに混乱させるのが、ポインタと配列周辺の話 >>875
分身と言ってしまうとそっくりな実体がもう一つあるかのように思ってしまうのではないか?
やはり実体を指し示すものを連想させる何かにした方が良いのではないか?道標とか。 このように、どうわかりやすく書こうとしてもどっかに不都合が生じるのがポインタの説明
素直にコンピュータの仕組みを勉強するしかないんや・・・ ポインタはWindowsのショートカットみたいなもの。
これでもまだ誤解されそうね。 キャッシュは次回のアクセスを高速化するためにデータを一時的に保存しておくこと。
バッファはデータを受け止めるために、保存場所を確保するためのメモリー領域。 >>881
文脈による
汎用機だと二次キャッシュをバッファストレージなんて言ったりすることもあるし >>875
本体がパンツ下ろしたら影分身も職場でパンツ下ろすんですね分かります ポインタがよくわからないんだけど、普通にメモリアドレス==ポインタって認識なの?
int i;
int *p=&i;
の時に変数iのポインタであるpっていういい方は正しいですか メモリアドレスは格納されるけど
メモリアドレス==ポインタっていうのは違う気がする
nullだのvoidだのもあるし iのポインタを格納してるポインタ変数p
値自体を問題にするときはアドレスだが、プログラム中で操作の対象となってる場合はポインタって感じだな。 >>886
ポインタはメモリアドレスと型もってて
メモリアドレスからのデータをその型として解釈する なるほど、なんとなくわかったありがとう。混乱の原因はポインタっていう言葉がいろんな使われ方してるからだった。 こう書くとまた荒れそうだが、ポインターとはアドレスが入った変数である、というのは正しい。
NULLは0番地を特別扱いしてるだけだし、void *もあくまでアドレスだ。 >>887
nullはまだしもvoidは関係なくね? 荒れる要素なくない?
メモリアドレスを保持する整数と型を組合せてあるだけだし
void*はアドレス保持するだけの変数って意味じゃないの void *p;
p++ を許すのは GCC拡張だっけか >>891
「正しい」とか書くと荒れる元にしかならん
(初心者のうちは)…「という理解でいい」ぐらいにしとき >>891
NULLの件はそれ逆だろう。
実際の0番地を特別扱いにしているのではなく、「どこも指さない特殊なアドレス」を表記するために整数0を使用しているだけで、0番地が特別な訳ではないはず。まあ実際にメモリ割り当てで0番地を割り当てることはしないだろうけど。
void*も、型を指定しないポインタを表すのに使っている型の指定であり、アドレスというのはおかしい。 >>897
確かポインタ演算時は1バイト (char) 扱いだったかな? void*なんていらなくね?char*でいいじゃん
構造のわからないものは「バイト列」って意識でしょ? >>900
void *がないとmemcpyに引数を渡すとき面倒。 double * には double * だけを許し char * や strucut foo * を渡したらアカンと
要求される型を厳しくチェックしようとすると
「ポインタだったら実体の型は何でもいい」 という指示を char * に含ますわけにはいかない 汎用ポインタがchar*型になってたらコードレビューは絶対に通さないわ 汎用ポインタというかvoid型という概念そのものが嫌い。
全てを厳密にやれ。言語を作る時点でまず関数に戻り値を強制すべきだったんだ。
ポインタわからん軍の原因はvoid型とかいう曖昧なせいなのがあるせいなのも一理あろうて。 レス数が900を超えています。1000を超えると表示できなくなるよ。