C++相談室 part152
■ このスレッドは過去ログ倉庫に格納されています
>>501
さらにいえば二次元配列の場合、宣言は、
int a[3][2]; //C。使う場合は a[i][j]
DIM a(3,2); //BASIC。使う場合は、a(i,j)
となるが、もしCで型を全て左に書くとすれば、
int[3][2] a;
となると思うかもしれないが、これは、数学的な統一性からすれば
間違いで、正しくは、
int[2][3] a;
となり、前後を逆に書くのが「正しい」。
これが即座に理解できる人が数学的才能が有る人で、
教えてもらわないと分からない人才能が無い。 >>502
Cの記法は、物理学で言うところの「組立単位」に相当する「組み立て型」を
一般的に表現するためには、かなり美しく正しい選択をしている。
int *a[10]; // (1)
int (*a)[10]; // (2)
と
は、物理学のように言えば、int-ptr-array-aとint-array-ptr-aの違いを
表しているが、Cの表現はとても理にかなっており非常に分かり易い。
これらの型を全てまとめて左に書こうとすれば、書くことは出来て、
int*[10] a; // int-ptr-array-a, (10)
int[10]* a; // int-array-ptr-a, (11)
となるが、果たしてこれが分かり易いかどうかと言う問題となる。
それぞれを使う際の a[i] や、*a の表記と(1), (2)に上手く対応しているので、
(10),(11)よりも統一が取れており、数学的には「美しい」状態となっている。 >>502
それは、>>503 や >>504 のようなことがあるから。 >>502
C言語のように「書くべき」ことが分かる一番分かり易い例は、Cで
int a[1][2][3][4];
と書くものが、全部左に型を書く記法だと
int[4][3][2][1] a;
と書かないと、組み立て型(物理学における「組立単位」に相当)における
一般性を失うが、それだと、使う際の a[i1][i2][i3][i4]と要素数の指定とが
直感的に逆さまになってしまう問題が起きる。
もし、
int[1][2][3][4] a;
のように書くと、一般性を失い、組み立て型としては破綻しまい、その場しのぎの
記法となってしまう。
もしこれが理解できないのなら、悪いけど、数学的才能や、コンパイラを設計する才能が無い。 じじいはこういう語りつくされた古い話題しか話せないからな 大工が金槌はこうでなくてはならない(家を作ったことない) クソみたいなマウント合戦を繰り広げる老害であることを自覚しろ >>504
数学的・物理的な美しさを (仮に (あくまでも仮に) その主張が妥当だとしても) C++ スレで根拠にするのが不思議。
そんな美しさなんてどうでもいいもの。
こちらの主張は
宣言の文法が型名とは別にある
→ その時点で一貫性なんてないよ
→ どちらを軸にすることもありうる
→ でもまあ C++ の発展の様子からすると型名を軸にしたさが見えるね
って話で、現時点で無い文法を導入したいとか思っているわけでもないし、
存在する文法を絶対に駄目だというわけでもない。
とはいえ (話の大元に戻るが) 現在の C++ が typedef を冷遇しているので、
なるべく using を使ったほうがいいよねってだけ。 わしのFormatterは
int* a;
int *a, *b, c;
のように整形しよる。これが落とし所として妥当であろう >>500
https://github.com/fmtlib/fmt
でしょうか?github になれてなくて、これを使う方法もよくわからないし…
20年使っている sprintf() でもういいや…って妥協してしまいました
手元のコンパイラは g++17, 職場のは g++11 だけれども、セキュリティが堅くて「無断で」cygwin をアップデートさせてもらえない…
必要に迫られて徹夜して間に合わせたけれども、プログラミングへの集中力はずいぶんと落ちてしまいました…
コメントありがとうございました >>506
auto signal(int, void(*fp)(int)) -> decltype(fp); //こう書かれたら「破綻」で読めなくなるのか? おまえさんは
それこそC++11のグラマーが読めない、つまり数学的才能に乏しいことになるぞ >>512
あいつ結局Cの文法と設計思想を説明してるだけだよな
それをC++11の文法と設計思想を否定する根拠にしようとしているようだが
筋違いというか脈絡がない
ぼくはusing使いたくないんだーtypedef使うのを邪魔すんなー
僕はものすごく数学と物理に詳しいんだーセンスないやつうるせー 数学や物理学は、2000年以上も続く巨大なエコシステムを持っており、
それ以上簡潔にならないくらいな表現方法を発明済み。
それとは別の表現をしてもそれらを超えることはまず不可能で、文系の人達の
自己満足に過ぎない。 思っクソ関係ない
話せば面白そうな気がしたがそっちへ行くのね
あーあ残念 最近の「モダン」言語は、既存のものを知らずに新しいものを作ろうとする傾向が目立つ。
彼らは、今までの理論などそのメリットが理解出来ておらず、効率の悪い、
分かりにくい、整合性の無い、その場しのぎで、一般性が無い記法を導入する。 >>503
えっ?
そもそも
int a[2][3]; //C。使う場合は a[j][i]
DIM a(3,2); //BASIC。使う場合は、a(i,j)
じゃないのかな
>>499 は支持する >>506
ここもおかしい
元々
int a[4][3][2][1];
と書くべき 分かりにくい文法で自爆ってダサすぎるなw
そもそもC++なのに素の多重配列使うって
センスなさすぎだし >俺は数学が好きで、学生時代、ほぼ満点だった。
数物系が得意な人が、こんな馬鹿っぽくて曖昧な書き方するのかね?
この情報でどうやってお前の能力を推し量れと >>493
なんでもテンプレートに書き直せばいいってもんでもない CでもそうだけどC++を使うからにはC++らしく使いたいね
C訛りのたどたどしいC++からは早く脱したい Cで憶えたことがとりあえず使えるのがC++に用意された入りやすい門ではあるけどね
そこは振り出しでしかないんだよ >>493みたいなのをC++らしい、と思ってるならだいぶアレだけどな 仕事で使うならBetter Cで留めるのが正しいC++の使い方。 >>493
> std::add_pointer_t<int()> f;
> std::decay_t<int()> f;
(´・∀・`)ヘー
そんなんあるんですね
勉強になりました
>>529
凄くC++らしいと思うけどw
意地でもテンプレートで何とかしようというのは >>524
確かに、数物系に「特異」な人のコメントにしては貧弱だなあと、私も思いました
たとえばガロア理論、とか、相対性理論、超弦理論、とか、を熱っぽく語って欲しいです
個人的にはエルゴート理論について薀蓄を知りたいですね >>527
でも iostream は失敗作という気がふつふつと…(略) c++らしいって言っても時代によってかなり変わるし無意味な言い回しだわ。 時代によってかなり変わるの?
C++98以降しか知らないけど
C++らしさ=テンプレート
と断言していいほどの一点張りだと思うけど(個人の感想です) ここまで喧喧諤諤の多くの意見が飛びかっておるが
iostream は要らん子、というのは一致しておるな
とくに operator << >> 系のやつ coutで出力するよりstd::stringに一旦文字列化してからprintf()で出した方が速いという時点で以下略 個人的には iostream をそこそこ好きなんだが、
今だったらこんな設計はしないだろうなというのはとてもよくわかる。 >>535
互換性を捨てられない以上は汚い部分も捨てられないんだよね。
だからどうやって抽象化層をかぶせるか、もっと直接に言えば
汚い部分をどう隠すかというのが C++ らしさじゃないかな。
そして型 (または型の表記) に関して汚い部分を隠す道具としては
テンプレートは特に有用なもののひとつだとは思う。
ただ、一点張りは言い過ぎで、取れる手段、手数の多さも C++ らしさだというのが私の感想。
組み合わせよう。 printfで%dとか%zとか指定するのめんどいやん printfはバッファオーバーフローの脆弱性を産みやすい >>531
>意地でもテンプレートで何とかしよう
"自分でテンプレート書いて"色々どうにかしてる人が言うならまだ説得力もあるけどね
add_pointer_tとかdecayは基本的に標準ライブラリの実装(のためのメタプログラミング)の上での副産物だろ
テンプレートの文脈(=受け取った型に、場合により変換を施す必要がある)でもないとこでそんなん使って
「C++らしい」とか、だいぶ痛々しい
まぁ別に使用を禁止されてるわけでもないから使いたきゃ好きにすればいいけどね・・・ >>533
まあね、俺も禿1からの付き合いだけど
未だによくわからんところはある
iostreamに限ったことじゃなく古株のクラスライブラリって
だいたい今作るならこうはしないってところが何かあるね
大きな実害なければ我慢するし
困る場合はそれこそ腕が鳴るチャンス >>535
たとえばだけど、二次元配列がいるならクラス化するとかね
人によるだろうけどvector<vector<int>>は俺あんまりやりたくない 用意されているものを使っただけだろ
意地でもとかバイアスが入るのはコンプレックスの顕れだからこそ
ギャンギャン強弁してくるわけだ >>542
printfでバッファオーバーフロー?
お前器用なやつだな decayに_t付けるの忘れてた
>>548
それ誰に向けて言ってるの? なんか口調でわかるわ、いつものアホか・・・
「>」これが付いてるのは引用箇所だからな、覚えとくといいよw printf, scanf系はtypedef型の正体を知っておかねばならないとかクラス型を基本型と同等に扱えないとかモロモロあるのに
いつまでもマンセーしててもしゃーないで >>549
いや普通にありえるからググってわかる程度のこと聞くなよ >>555
typedefの正体を意識してprintf/scanfを使うのは
privateでデータメンバを隠す話と真っ向逆だね 最終出力がわかりにくいとかロケール対応しにくいとかあるわけだけど
引数順にしか出力できない時点でprintfもロケール対応のやりにくさは変わらん ググりかたから教えなきゃならんの?
相手にしてられんわ >>558
そんなあなたにput_money, put_time >>561
ロケールと書いたのが悪かったな
多言語化だな
語順を変えるとかやりにくい
Pythonのようにフォーマット文に引数の順番をかければ
言語による語順の違いもフォーマット文の差し替えだけで済む >>556
ググれー
で逃げる気マンマンでワロタ
おとなしくsprintfでした、ごめんなさい
って言ってりゃいいのにw >>547
boost::numeric::ublasとか使えばいい。 >>562
ああ確かに語順の変え方はprintfと変わらんな
auto time_v = time(nullptr);
cout << put_time(localtime(&time_v), "%m/%d/%y %H.%M'%S"); >コールスタック上のリターンアドレスを書き換えて不正なコードを実行させる 自分の過ちを認めろと言う割に自分は謝らず図々しく更に無駄な質問を重ねるとは >>570
バッファオーバーフローさせるだけではコールスタック上のリターンアドレスは狙えないぜ
同じ記憶域期間を持つ他のオブジェクトを破壊する可能性があるというだけだ
コールスタック上のリターンアドレスを狙うなら配列でないオブジェクトのアドレスにオフセットかけるだけでもできるしな
逆に自動変数のアドレスを確実に得る技術が必要になる
printf/scanfといえばバッファオーバーフローという固定観念に囚われているから
そういう読みになっちまうんだよ まともに日本語の文章も読めないようじゃプログラムは君には難しいよ メモリ位置にあるデータを確認できると書いてあることすら読めてない おとなしく、日本語もググるのも難しくてひとつずつ教えてもらわなきゃできません
ごめんなさいって言ってりゃいいのにw >>575
俺、自動変数のアドレスを確実に得る技術って言ったけど
おまえさんは、これが何のことかわかってる?
printf/scanf関係ないんだがw Wikipediaまで引用してあげたのにまだごねるのか
本当にわがままだな > printfはバッファオーバーフローの脆弱性を産みやすい
重箱の隅な記事では、最後の「やすい」という主張の裏付けにはならないってことだ
粗暴な罵倒語も裏付けになるわけがないな そんなにprintf好きなら勝手に使えばいいんじゃない? おまいら printf の戻り値は毎回チェックしろよ printfの書式にユーザ入力を使うことなんてあるか?
SQLインジェクションとはワケが違うぞ バッファ使ってるsprintfと
バッファ使ってないprintfの
違いもわからんのか 確かにprintfの書式文字列に関するメモリ破壊の脆弱性が示されてるが、これを「バッファオーバーフロー」と呼ぶのは違和感があるな >バッファ使ってるsprintfと
それ勝手に持ち出したのお前だからなw 結局のところ、>>542が恥ずかしい奴だったという結論でok? >>591
お前みたいな頭悪いやつが多くて
何も有益な話にならないから解散
という結論 cout << ...
がダサいだのprintfが早いだの
程度が低いんだよ >>592
ん?
バッファーオーバーフローとメモリー破壊の区別もつかないアホがドヤって撃沈だろ?
ダサすぎるw 適当に脳内で読み替えとけや無能
こっちはprintfなんてそもそも使わんから詳しいことに興味はない
だからググれって最初に伝えたんだわ >>594
じゃあメモリ破壊とバッファオーバーフロー
でリターンアドレスの書き換え方が
どう違うのか説明してみ >>595
詳しいこと知らんのに
>>542で参戦してくるの?
振られたネタならともかく自分で振っといてwwww printfに脆弱性ある
というのが重要な点なのにあくまでも上げ足取りをするのか
本当にごみしかいないな ■ このスレッドは過去ログ倉庫に格納されています