C言語なら俺に聞け 151
レス数が950を超えています。1000を超えると書き込みができなくなります。
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型とかいう曖昧なせいなのがあるせいなのも一理あろうて。 windowsにおいて
setLocale(LC_ALL, "en_US.UTF-8");
が成功する環境と失敗する環境があるのですが何が原因かわかりません。。何かご存じの方いらっしゃらないでしょうか? >>904
お前の好き嫌いなんてどうでもいいし、よくわからん時点ならvoid*なんて無視しとけばいいだけ
この手の人は何故か全部を一気に理解しようとするけど今どきの言語仕様でそれやったら終わらんよ 「俺の考える最強に分かりやすいポインタの説明」
・・・無理 >>908 void君だろ
C言語なら俺に聞け 148
https://mevius.5ch.net/test/read.cgi/tech/1537347410/37
37 名前:デフォルトの名無しさん (ワッチョイ f94f-yqSl)[sage] 投稿日:2018/09/22(土) 01:42:06.64 ID:16ZpsTnK0
>>36
マジでIDE使え。
そして貼るときはlanguageをCにしとけ。シンタックスハイライトが変わるから。
で、どれが分からんの?
> enter
> find
> delete
> show_all
> delete_all
mainはこの際分からなくていい。
最初に理解しないといけないのは show_all だ。
ただし細かいことを言ってもキリがないが、
> void show_all(void)
なんだこれ?引数 void って初めて見たぞ。文法的にありなのかこれ?
さらに酷いのは show_all 内でグローバル変数 address を掴んでいること。
普通は void show_all(tag_address* ta) だよ。
そうじゃないと複数のリストがあったときに使い物にならないだろ。
マジな話、このソースのレベルの本なら捨てた方がいい。
俺は大学の教材がいいと思うぞ。
(読んでないが)リストならググったら東工大とか出てきた。
http://www.is.titech.ac.jp/compview/clang/chap11.html >>910
コメントありがとうございます。
8と10で成功する端末があることを確認しています。失敗する端末は今のところ10だけです。
そして
SetConsoleOutputCP(65001);
を使用することで失敗する端末でもUTF-8をコンソールに表示でき、一応目的は達成できました。
調べてみると、結局のところwindowsではsetlocaleで2バイト以上文字は設定できないとのことだったのですが、ではなぜ成功する端末があるのか…… と、古いシステムの保守なんかやったことねえやつがぬかすか void show_all(); なんて書くやつ見かけたらなるべく距離を置く >>918の場合
C++なら問題ない
C言語だとちょっと不味い おまえからも距離を置きたいぜ
ここをどこだと思っている
C++なら無問題などと言わねばわからぬ者がいるとでも思っているのか とりあえず、シングルステートでも返り値をboolにする俺がやってきましたよ。 >>921
>>918の意図が分かってない者がいるぞ
さあどうする? 大丈夫だよ
ここを見ながらシステム作っている奴はいないから Cはvoid省略すると可変長引数扱いになるんじゃなかったっけ?
C++は省略してもvoidだけど >>927
無指定でどうこう、というのは確か C89 までの話だったかと
C99 では C++ と同じく省略しても void と記憶しています >>928
破壊的変更が行われた仕様が回避できるなら回避すべきだな >>928
記憶違いでしょ。変わってないよ。違うと言うなら出典確認してから来てね。
http://kikakurui.com/x3/X3010-2003-01.html#93
> ...関数定義の一部でない関数宣言子の識別子並びが
> 空の場合,仮引数の個数及び型の情報がないことを指定する。 >>915
新しく作るプログラムでも引数なしならvoidにするよ。
まあこの頃Cで作ることそのものが減ったけどな。 >なんだこれ?引数 void って初めて見たぞ。文法的にありなのかこれ?
こんな汚物が上から目線で何かもの言ってるかと思うと反吐が出る
さっさと消えてほしい DCL20-C. 引数を受け付けない関数の場合も必ず void を指定する
ttps://www.jpcert.or.jp/sc-rules/c-dcl20-c.html
を見ると(かなり読み解きにくいんだけど)…
プロトタイプ宣言では
int func(void); ... 引数0個
int func(); ... 関数呼び出しでの引数の整合をチェックしない
関数定義では
int func(void) {...} ... 引数0個
int func() {...} ... 引数0個
って具合に func() の解釈が一貫していない、
だから引数0個の関数は同じ形になるようにvoidをつけましょう、
という話に思える。
この辺が議論の混乱を生んでるんじゃないかな。
ついでに関数定義の int func() {...} の形式は廃止予定とも出てる。
プロトタイプの方は廃止予定ではない、ってことかな。 そこでjpcertを持ち出すのは興醒めだ
どっかの馬の骨が「こうすべき」と主張してるってだけな話は
現実のマシンの動きとそれ束縛しているiso/iec9899でどうなのかという話とは論点が違う >>936
JPCERTを引用したのは「プロトタイプ宣言と関数定義とで
引数部が空の関数 func() の引数の解釈が違う」って話を
根拠つきで引き出すためでな。 >>927-930 あたりの流れを受けて。
規格の文章が並べて載ってるので都合が良いのだ(読みにくいけど)。
実際のところ、JPCERTのルールっていうか提案には
俺も全面的に賛成してるわけじゃない。むしろ強く反発する部分もあったり。 必要ねえじゃん
iso/iec9899の条文を引用して
その箇所がどのように解釈できると
自分の言葉で言えばいいのを
虎の威を借る形でサボる怠慢を
読まされる側は付き合ってらんねー >>932
そうだね。関数ではないね。しかしCだと処理をまとめる方法が関数しかないから仕方がないね。 まあしかし getchar() みたいにプログラムとは無関係な所から取ってきた値を返すとか、バッファやstatic変数で外部からアクセスできない変数の内容を返すみたいな処理は必要だから引数なしも必要だ。
グローバル変数やハードウエアの初期化処理だけまとめて書きたいなんて時にも使える。 ○○Initialize()
的な関数の存在に違和感ないんだが クラスのメンバーの操作だとしても、だったらそのクラスのコンテキストを渡すのが正しいだろうとは思うけどね。
現実としてはまあ規模による。 プログラムの関数は数学の関数とは微妙に違うから仕方ない
仕方ないと思えない奴らが関数型言語を作った
兎に角Cでは本来の関数に制限するのは事実上不可能 functionって関数の他に機能って意味もあるけど、英語圏の人はどちらの意味で使ってるんだろうね? >>944
多分語義をわざわざ意識していないと思われ >>942
オブジェクト指向言語のクラスだとプロパティでゲッターやセッター作る事があるが、ゲッターは普通は引数なしだな。
で、そういう言語ではだいたいはメソッドの引数なしで ()にしとけばC言語での(void)と同じ意味になる。 機能という意味で言いたいときは、functionalityという単語もある。 ゲッターセッター自体が、本当にそれ要るのかって思うこと多いよ。
手元にインスタンス持ってるわけだしさ。 ゲッターセッターはインスタンス変数を隠蔽化することでインスタンス間の結合強度を下げるのが目的
なんでもなんでもインスタンス内部の構造に直接アクセスするとOOPの意味がない いや、ゲッター使うんだったら隠蔽できてないじゃん。 昔ゲッターセッターってスレッドセーフにするための仕組みだと思ってた。
それくらいしか意味が思いつかなかった… レス数が950を超えています。1000を超えると書き込みができなくなります。