C言語なら俺に聞け 146
■ このスレッドは過去ログ倉庫に格納されています
>>198-199
俺C言語詳しくない素人だけど、
ポインタに const 修飾子をつけるとき、
修飾子の位置によって定数化されるのが「ポインタ」か「ポインタの指す値」かが異なる。
char *const ary の場合はポインタ(アドレス)を書き換え不可。
++ary; は不可
*ary = 'A'; はOK
const char *ary の場合は値(文字列)を書き換え不可。
++ary; はOK
*ary = 'A'; は不可
restrict 修飾子は初めて見たけど、ググった限りは最適化に使うもので、
プログラムの意味は変わらないので無視してよかろう。 >>204
俺なんかゆっくり書いてる間に回答が3つも… ポインタも値もどっちも書き換え不可にするには
const 型* const 変数名;
としないといけなそうだな。 型 const * const 変数名; でも良い。 *const 変数名
って書くより
変数名[ ]
って書く方が好き モノクロA4レーザープリンタが、値段も含めていい感じになっていますね… >>205
>>206
でも一番わかりやすい!
まぁ、よく見る
const char **
の大半は意図した通りに機能してないよな
誰も中み書き換えないから表面化しないけど。。。 >>213
const 修飾子を型指定より前にもってくる書き方は正直いってなじめないですよね 関係ないけれども、今日から「民法」を勉強しはじめました、民法20条まで進みました
こういうのも新鮮でおもしろいなあ、と思いました 民法総則からキチンと基本原理を体型立ててやらないと理解できんぞ >>215
民法94条に到達して手が止まりました
これは難しい…条文は簡潔ですが判例が複雑怪奇でパターン抽出できないでいます
>>216
直に法文文面や判例にアタックしていますが弾き返されていますね…特に判例は裁判官の個性が見える気がします、当初考えていたほど「画一的」ではなかったのです >>219
さあ、適切なスレに移動してそこで10年くらい引きこもっていようか。 配列の中身を一つずつ見て0じゃなかったら0にするみたいなプログラムがあります。
中身を見て代入するか分岐するのと、
投機的に0を代入する方法のどちらが速いのでしょうか >>221
もちろん見ないほうが早い。
memsetで一気に0にするのが最速。
気になるなら測定しましょう。測定しない効率化なんてありえないよ。
それと、こいつを壁に飾っとくべし。
「プログラム最適化の第一法則:最適化するな」 最適化されたらどう書いても memset 使ったのと同じになるかも知れないけどな なんで開発要件も聞かないうちから見ないほうが速いに決まってるって言いきれるの?
0以外が入ってる可能性が低くて、書くより読むのが圧倒的に速いハードだったら責任取れんのかよ! そんな特殊な環境なら最初からそう書いてくれない限りまともな回答はなくて当然 DRAMは読み書き同じ速度だけど
MRAMとかは書くのが遅いんで
チェックして書くのを最低限にするのが常識になる時代が来るかも >>227
>>224
> 気になるなら測定しましょう。測定しない効率化なんてありえないよ。
> それと、こいつを壁に飾っとくべし。
> 「プログラム最適化の第一法則:最適化するな」 >>227
これおれも思った
圧倒的じゃなくても0率がたかくて書くのが遅ければそう
組み込みならメモリマップでメモリ以外のデバイスがつながってるかも知れないし
あとはコードがそうなってる可能性としては
0じゃない個数を数えるコードを入れやすいようにとか
SFRで書く命令が決まってるとか
キャッシュの関係でなるべく書きたくないとか
C言語スレだからな
組み込みの可能性も当然考えなければ
あと、
条件が整えばmemcpyより速いコードは作れる
アラインメントが事前にわかってるとか
SIMD命令が使える事がわかっているとか
DMAが有効とか 経験の無さ自慢?
特殊なコードに対して特殊な状況を考えられないアホ自慢? 自分は特殊な状況を考えられる特別な人と思いたいんですね。わかります。 なんとしてでも自分以外をアホということにしておきたい。わかります。 特殊な環境でしか生きられないなら、そこから出てくるなよ 実測が基本で、実測が出来ないなら
一般的な環境を想定してシンプルに記述するのが基本じゃないの Q.xxとxxどっちの書き方が速いですか?
A.環境依存 まあ明らかな場合もあるけどね
特定の環境用コードなら実測が基本
でも仕事だと全てのパターンを実測してる暇は無い
そこでプロの勘を使う 大多数に当てはまるならそれでいい派 VS 1例でも当てはまらないならダメ派 今回だけじゃないだろ。
「xxxでどうなんですか?」
「(基本的な環境では)xxxだよ」
「いや、xxxxという稀な環境だと当てはまらないからそれは間違いだ!!」
しょっちゅう見かけるわ。 「極稀に当てはまらない場合がある」
↓
「だから気を付けよう」→穏便に話が終わる
「そんなことも知らない(思いつかない)のか!!」→荒れる 極稀な事を思いつく自分は頭が良くて偉いと言いたいのでしょう。仕方のない事です。
彼はこれまでずっと馬鹿にされ蔑まされてきたのですから。このような機会がなければ
うっぷんを晴らすことができません。もしここで人を罵倒する事が出来なければ彼は
益々ストレスを溜め鉈を持って新幹線に乗ってしまうかも知れません。もはや誰でも
良いのです。掲示板でこの程度のやり取りで大事件が防げるのならば安いものです。 「hogeとfugaのどちらが速いのでしょうか?」
「推測するな、計測せよ」
「極稀に当てはまらない場合がある」
「えっ???」 まあ>>227の指摘はアリだと思うし>>232辺りまでの対応はまあ普通
要するに>>233が無駄に荒らしてるだけ >>227も、指摘の内容はいいんだけど、責任とれるのかよなんて攻撃的な言い方するのは余計なんだよね。 普通は>>222と>>224で終わりだと思うわ
その先は蛇足 >>221が速さしか考えてないってのがそもそも素人 >>254
そこら辺は各人の取り方だけど無条件に代入が速いとか言ってる>>223-224が部下だったら俺も同じように言うと思う 素人素人と連呼してるやつ
自分が言われて傷ついているんだなw
memsetは速いぜ?
逆汗までしなくとも
ベンチマークくらいしてみたか ライブラリや開発環境
使える命令やハード
コア数、キャッシュサイズ、アーキテクチャ
クリアするサイズ
アラインメント
クリアするデバイス
データの出現率
こんなことで最速は変わる
memsetが1バイトずつちまちま代入するようなライブラリも世の中にはたくさんある
小規模組み込みの環境では大抵そう この頃のCPUだと特定の領域を0にする命令自体が最初からあったりしないのかね?ありそうな感じするんだけど。で、最適化されるとmemsetがその命令一つに置き換わって終わり。 >>262
memcpy って言ってるのは一人だけだしあまり賢くないみたいだから無視していいかと 遅くていいならREP STOSD命令
CPUを使わない方法もいくつか
DMAを使ったり
SRAMの場合デバイスリセットで0クリアされたり
FLASHだとイレースコマンドとか
PCでDMAを使う簡単な方法は
GPUのメモリをゼロクリアしておいて転送する >>262
あ、ごめんコピーじゃなくてクリアの間違い >>267
普通は無いだろ
REP STOSDだって単なるループ レジスタからメモリにコピーすると考えれば
コピーでも間違いではないけど >>271
妄想で生きてる奴には何言っても無駄だよ >>221の回答なら
「環境依存、実測しないとわからない」
で終わり というか、高速化しなきゃなやばいかなー と思ったのなら
void SAKUJO(dst,size){ memset(dst,0,size); }
くらいクソ適当に書いておいて、「あとで」 ごちゃごちゃいじればよろしい
それか、>>274のように 事前に済ませておく かだな ま、しかし、よくよく考えてみれば全てを同じ値で埋めておかねばならない状況はあまりないのではないか?
面倒だから一気に全て0にしておいて後から必要な所を埋めるなんてのはよくあるかも知れないが。
そういうのでも calloc() でメモリ確保するなら考える必要ないよな。 誰がどんな意図で書いたかわからないもの
わざわざ変えなくていいよ
問題があるとわかった時点で考えればいい 0クリアの話題でると思い出す事件があったな
某サイトでは業務Gと制御Gの2グループがあって
制御Gは業務Gの処理(データ値)には介入しないという建前があった
あるレコードを更新する時、その整合性の確認をとるため、
制御Gは、キーとなる構造体をmemcmpして一致の判定していた
業務Gは、処理関数の中で構造体を自動変数として確保し、
メンバーに一つ一つ値を設定していた
キーを指定し更新処理を呼んでも一致するデータが見つからないと
エラーが返される結果となった
何故エラーにされるのか、しばらくの間、原因が分からなかった。 >>278
Paddingのゴミだろ
構造体をmemcmpの時点でダメ みんなわかってるからそんな事いちいち書かなくて良いんだよ すいません質問です
C言語の勉強をしようと思っているのですがIDE?というのが沢山ありすぎてどれを選べばいいのか分かりません!
迷える子羊に何卒ご教授下さいませ・・・ >>284
MSVC(VS)
沢山あるってのがよく分からないが、「入門用」とかいうのは全てゴミだから止めとけ >>284
WindowsならVisual Studio Community
LinuxならEclipse CDT
Macなら標準のXCode
最初はIDE使わないでテキストエディタでやるのがいいとは思うがね >>284
> 最初はIDE使わないでテキストエディタでやるのがいいとは思うがね (>>286)
これは絶対無いから止めとけ。
環境整備は初心者では無理なので、もし先生がいるのならIDEの立ち上げまではやってもらえ。
そして最初からIDEを使って、ブレークポイント貼りまくってステップ実行し、
納得いくまで変数をウオッチしろ。
C#のIDEなら文法エラーはサジェストが出てOK押すだけで治る。
(C系でそこまでやってくれるものがあるのかは知らん)
括弧の対応すらしてくれないテキストエディタなんて、
今時原稿用紙と手書きで草案を練れ、というようなもの。
勿論それが合う人もいるが、普通はないよ。 IDEもよくわからん状態からCをやるのはよした方がいいと思うけどなあ >>288
これはその通り。Cは入門用の言語ではない。
Cしかなかった昔ならさておき、今Cから始める必要はない。 >>284
IDEでクエスチョンがつくということは、プログラミング初心者と見た。もしそうなら、Cはオススメしない。もっといい言語がたくさんあるので、プログラミングがどういったものであるかを、他の言語でざっくり掴んでから、Cに取り組むことをお勧めする。
その頃には、IDEがなんであるか、どのIDEが自分に向いているかは、もうわかっているはずだ。
どうしてもCに今すぐ取り掛からなければならないという事情があるなら、
MFCを使わなくてはならないなら、visual studio。
そうでなければ、またはターゲットがWindowsでなければ、Eclipse
どちらにせよ、タップリ不幸になれるので覚悟すること。 >>285-290
皆様遅い時間なのに丁寧に答えて下さり感激の至りですありがとうございます
C言語を勉強しようと思っているのは使う予定があるからなんですすいません・・・
取り敢えず教えてもらったものDLして勉強します、重ね重ねありがとうございます! >>291
> 使う予定があるから
こんなところで聞かずに先生(先輩/上司)に聞け。
IDEの善し悪しも自分で判断出来ない奴が自分だけで「使う」つもりなら事故るから止めとけ。 Visual StudioにもLinuxターゲットがある。 ターゲットの問題ではなくて動作環境の問題だろ
LinuxにVisualStudioは入れられないよ いい悪いではなくてただの事実
自分もVisualStudioは使っているよ
Windows環境では最良のIDEだと思ってる ポエムや日記用にもテキストエディタの2〜3は入れてていいんじゃないの
それとコマンドプロンプトの併用も考えてるんじゃない
今の時代の「C言語をやる初心者」は、CUIを知らないんだよ
コマンドを使ってみないと、何を何のために作ってるか分からなくなる
巷で言うスマホの「アプリ」とかのGUIじゃなくて、圧倒的に古いCUIなんだから、今の若いモンには明らかに異質なものを作らせるんだよ
出来上がってくるソフトウェアは「黒い窓」なる謎の儀式でしか動かない極めつけの謎だ つかそもそもEclipseっていいのか?
あれ、Linuxだと他選択肢がないから使われてるだけでは?
Cで使ったことはないが、Windows/NetBeans/PHPはだいぶ酷かったぞ。
もっさりしてるし、不安定だし。
この組み合わせが最悪なだけかもしれんが。
そして一応EclipseとNetBeansは検討対象らしいからな。
(俺的には比較するまでもなくVS>>>NetBeans)
VSとEclipse両方使っている奴いる?いたら感想を。 今のところvsと肩を並べられるIDEなんてないので当然eclipseもvsより劣るわけだが、
リファクタリング機能だけは圧倒的にeclipseのほうが優秀だった。
独自環境用の多数のIDEがオープンソースのeclipseから派生して作成されてるので、個々に使い方を覚えなくていいのもメリットかもしれない。
使い始めた頃はプロジェクトとビルドルールの管理と、日本語が独特なのが、取っ付きにくかったかな。
まあ言いたかったことは、vscode輝け >>301
> リファクタリング機能だけは圧倒的にeclipseのほうが優秀だった。
それってCについてだよな。MSはVSについてはC#しかやる気出して無いから。なお、
Q. どうしてVC++のエディタはC#に比べて糞なのですか
A. だってお前らどうせemacsとか使ってエディタ機能使わないじゃん(なお公式)
だったはず。
そのとき、「え?そんなに違うんか?」と思って試し、その差に愕然とした覚えがある。
俺は最新環境を使ってはいないが、最新でもだいぶ見劣りしたと記憶している。
リファクタリング機能とかはユーザがアドオン書けた方がいいから、
それもあってVSCodeなのだろうね。 まずvimの操作を覚えて、開発するならそれなりのプラグイン入れなきゃならないんですがそれは ■ このスレッドは過去ログ倉庫に格納されています