X



C言語なら俺に聞け 146
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ 839f-AnMQ)
垢版 |
2018/04/30(月) 04:47:37.50ID:XX4FB8lc0
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/


C言語なら俺に聞け 144
https://mevius.5ch.net/test/read.cgi/tech/1514025223/

次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512
-
※前スレ
C言語なら俺に聞け 145
http://mevius.5ch.net/test/read.cgi/tech/1519046038/
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
0205デフォルトの名無しさん (ワッチョイ 7aca-NLsb)
垢版 |
2018/06/03(日) 17:29:03.88ID:xPBqnvux0
>>198-199
俺C言語詳しくない素人だけど、
ポインタに const 修飾子をつけるとき、
修飾子の位置によって定数化されるのが「ポインタ」か「ポインタの指す値」かが異なる。

char *const ary の場合はポインタ(アドレス)を書き換え不可。
++ary; は不可
*ary = 'A'; はOK

const char *ary の場合は値(文字列)を書き換え不可。
++ary; はOK
*ary = 'A'; は不可

restrict 修飾子は初めて見たけど、ググった限りは最適化に使うもので、
プログラムの意味は変わらないので無視してよかろう。
0209デフォルトの名無しさん
垢版 |
2018/06/03(日) 22:02:08.16
いつかどこかで見たこの流れ
0215 ◆QZaw55cn4c (ワッチョイ d360-EqDK)
垢版 |
2018/06/08(金) 00:06:11.65ID:+kkHvNSG0
関係ないけれども、今日から「民法」を勉強しはじめました、民法20条まで進みました
こういうのも新鮮でおもしろいなあ、と思いました
0217デフォルトの名無しさん (アウアウカー Sa2d-22KU)
垢版 |
2018/06/08(金) 09:37:11.15ID:1PlqYTvda
そうか。じゃあ俺は拳法始めよう。
0219 ◆QZaw55cn4c (ワッチョイ d360-EqDK)
垢版 |
2018/06/09(土) 00:34:01.58ID:BV3WmSRm0
>>215
民法94条に到達して手が止まりました
これは難しい…条文は簡潔ですが判例が複雑怪奇でパターン抽出できないでいます

>>216
直に法文文面や判例にアタックしていますが弾き返されていますね…特に判例は裁判官の個性が見える気がします、当初考えていたほど「画一的」ではなかったのです
0221デフォルトの名無しさん (アウアウカー Sa93-r4GM)
垢版 |
2018/06/21(木) 21:10:00.20ID:uId0yWCha
配列の中身を一つずつ見て0じゃなかったら0にするみたいなプログラムがあります。

中身を見て代入するか分岐するのと、
投機的に0を代入する方法のどちらが速いのでしょうか
0224デフォルトの名無しさん (ワッチョイ 9fbd-yRyg)
垢版 |
2018/06/21(木) 21:24:54.22ID:sKPxBIBt0
>>221
もちろん見ないほうが早い。
memsetで一気に0にするのが最速。

気になるなら測定しましょう。測定しない効率化なんてありえないよ。

それと、こいつを壁に飾っとくべし。
「プログラム最適化の第一法則:最適化するな」
0226デフォルトの名無しさん (ワッチョイ 1f9f-6R0o)
垢版 |
2018/06/21(木) 21:52:50.57ID:+L4M88hA0
最適化されたらどう書いても memset 使ったのと同じになるかも知れないけどな
0227デフォルトの名無しさん (アウアウカー Sa93-tQU5)
垢版 |
2018/06/21(木) 22:26:17.21ID:iolQTPDna
なんで開発要件も聞かないうちから見ないほうが速いに決まってるって言いきれるの?
0以外が入ってる可能性が低くて、書くより読むのが圧倒的に速いハードだったら責任取れんのかよ!
0228デフォルトの名無しさん (ワッチョイ 1f9f-GwbS)
垢版 |
2018/06/21(木) 22:39:37.01ID:+L4M88hA0
そんな特殊な環境なら最初からそう書いてくれない限りまともな回答はなくて当然
0231デフォルトの名無しさん (ワッチョイ 1f50-ddCb)
垢版 |
2018/06/22(金) 01:43:13.95ID:Hssdw/9K0
>>227
これおれも思った
圧倒的じゃなくても0率がたかくて書くのが遅ければそう
組み込みならメモリマップでメモリ以外のデバイスがつながってるかも知れないし

あとはコードがそうなってる可能性としては
0じゃない個数を数えるコードを入れやすいようにとか
SFRで書く命令が決まってるとか
キャッシュの関係でなるべく書きたくないとか

C言語スレだからな
組み込みの可能性も当然考えなければ

あと、
条件が整えばmemcpyより速いコードは作れる
アラインメントが事前にわかってるとか
SIMD命令が使える事がわかっているとか
DMAが有効とか
0237デフォルトの名無しさん (アウアウカー Sa93-ndvs)
垢版 |
2018/06/22(金) 09:40:17.18ID:TLETRHnoa
自分は特殊な状況を考えられる特別な人と思いたいんですね。わかります。
0239デフォルトの名無しさん (アウアウカー Sa93-ndvs)
垢版 |
2018/06/22(金) 10:10:27.57ID:TLETRHnoa
なんとしてでも自分以外をアホということにしておきたい。わかります。
0246デフォルトの名無しさん (ワッチョイ 7ffe-GwbS)
垢版 |
2018/06/22(金) 19:40:06.51ID:SPkT+A/00
今回だけじゃないだろ。

「xxxでどうなんですか?」
「(基本的な環境では)xxxだよ」
「いや、xxxxという稀な環境だと当てはまらないからそれは間違いだ!!」

しょっちゅう見かけるわ。
0250デフォルトの名無しさん (ワッチョイ 1f9f-GwbS)
垢版 |
2018/06/23(土) 00:38:49.81ID:EFPp8pY40
極稀な事を思いつく自分は頭が良くて偉いと言いたいのでしょう。仕方のない事です。
彼はこれまでずっと馬鹿にされ蔑まされてきたのですから。このような機会がなければ
うっぷんを晴らすことができません。もしここで人を罵倒する事が出来なければ彼は
益々ストレスを溜め鉈を持って新幹線に乗ってしまうかも知れません。もはや誰でも
良いのです。掲示板でこの程度のやり取りで大事件が防げるのならば安いものです。
0255デフォルトの名無しさん (ブーイモ MM43-/QFz)
垢版 |
2018/06/23(土) 10:41:43.05ID:VDaSN7SRM
普通は>>222>>224で終わりだと思うわ
その先は蛇足
0263デフォルトの名無しさん (ワッチョイ 1f50-ddCb)
垢版 |
2018/06/23(土) 12:44:28.88ID:UiVIxiJp0
ライブラリや開発環境
使える命令やハード
コア数、キャッシュサイズ、アーキテクチャ
クリアするサイズ
アラインメント
クリアするデバイス
データの出現率

こんなことで最速は変わる

memsetが1バイトずつちまちま代入するようなライブラリも世の中にはたくさんある
小規模組み込みの環境では大抵そう
0264デフォルトの名無しさん (ワッチョイ 1f9f-6R0o)
垢版 |
2018/06/23(土) 13:39:04.42ID:EFPp8pY40
この頃のCPUだと特定の領域を0にする命令自体が最初からあったりしないのかね?ありそうな感じするんだけど。で、最適化されるとmemsetがその命令一つに置き換わって終わり。
0266デフォルトの名無しさん (ワッチョイ 1f50-ddCb)
垢版 |
2018/06/23(土) 14:05:45.27ID:UiVIxiJp0
遅くていいならREP STOSD命令

CPUを使わない方法もいくつか
DMAを使ったり
SRAMの場合デバイスリセットで0クリアされたり
FLASHだとイレースコマンドとか

PCでDMAを使う簡単な方法は
GPUのメモリをゼロクリアしておいて転送する
0272デフォルトの名無しさん (ブーイモ MM43-/QFz)
垢版 |
2018/06/23(土) 14:42:28.77ID:VDaSN7SRM
>>271
妄想で生きてる奴には何言っても無駄だよ
0275デフォルトの名無しさん (ワッチョイ ff23-GwbS)
垢版 |
2018/06/25(月) 12:44:11.34ID:UNYa6OHo0
というか、高速化しなきゃなやばいかなー と思ったのなら
void SAKUJO(dst,size){ memset(dst,0,size); }
くらいクソ適当に書いておいて、「あとで」 ごちゃごちゃいじればよろしい

それか、>>274のように 事前に済ませておく かだな
0276デフォルトの名無しさん (アウアウカー Sa93-ndvs)
垢版 |
2018/06/25(月) 12:54:48.48ID://DXoKuSa
ま、しかし、よくよく考えてみれば全てを同じ値で埋めておかねばならない状況はあまりないのではないか?
面倒だから一気に全て0にしておいて後から必要な所を埋めるなんてのはよくあるかも知れないが。
そういうのでも calloc() でメモリ確保するなら考える必要ないよな。
0278デフォルトの名無しさん (ワッチョイ 9f8a-cge6)
垢版 |
2018/06/25(月) 13:16:25.31ID:aMpIUa/b0
0クリアの話題でると思い出す事件があったな
某サイトでは業務Gと制御Gの2グループがあって
制御Gは業務Gの処理(データ値)には介入しないという建前があった
あるレコードを更新する時、その整合性の確認をとるため、
制御Gは、キーとなる構造体をmemcmpして一致の判定していた
業務Gは、処理関数の中で構造体を自動変数として確保し、
メンバーに一つ一つ値を設定していた
キーを指定し更新処理を呼んでも一致するデータが見つからないと
エラーが返される結果となった
何故エラーにされるのか、しばらくの間、原因が分からなかった。
0279デフォルトの名無しさん (アウアウカー Sa93-ndvs)
垢版 |
2018/06/25(月) 13:19:21.95ID://DXoKuSa
={0} での初期化を布教した方が良いね
0283デフォルトの名無しさん (ワッチョイ 7fd2-XQuB)
垢版 |
2018/06/26(火) 07:01:33.06ID:tL55F/sw0
H8:EEPMOV
0284デフォルトの名無しさん (ワッチョイ a9d2-JxBb)
垢版 |
2018/07/01(日) 01:54:22.43ID:WAYB1PLl0
すいません質問です
C言語の勉強をしようと思っているのですがIDE?というのが沢山ありすぎてどれを選べばいいのか分かりません!
迷える子羊に何卒ご教授下さいませ・・・
0286デフォルトの名無しさん (ワッチョイ 02d2-ZkQx)
垢版 |
2018/07/01(日) 02:08:06.13ID:T+EQOOQd0
>>284
WindowsならVisual Studio Community
LinuxならEclipse CDT
Macなら標準のXCode
最初はIDE使わないでテキストエディタでやるのがいいとは思うがね
0287デフォルトの名無しさん (ワッチョイ 219f-iScA)
垢版 |
2018/07/01(日) 02:21:34.53ID:8/sCKaWm0
>>284
> 最初はIDE使わないでテキストエディタでやるのがいいとは思うがね (>>286)
これは絶対無いから止めとけ。

環境整備は初心者では無理なので、もし先生がいるのならIDEの立ち上げまではやってもらえ。
そして最初からIDEを使って、ブレークポイント貼りまくってステップ実行し、
納得いくまで変数をウオッチしろ。

C#のIDEなら文法エラーはサジェストが出てOK押すだけで治る。
(C系でそこまでやってくれるものがあるのかは知らん)
括弧の対応すらしてくれないテキストエディタなんて、
今時原稿用紙と手書きで草案を練れ、というようなもの。
勿論それが合う人もいるが、普通はないよ。
0290デフォルトの名無しさん (ワッチョイ 61b3-7NWm)
垢版 |
2018/07/01(日) 02:51:14.35ID:aoQiIM1T0
>>284
IDEでクエスチョンがつくということは、プログラミング初心者と見た。もしそうなら、Cはオススメしない。もっといい言語がたくさんあるので、プログラミングがどういったものであるかを、他の言語でざっくり掴んでから、Cに取り組むことをお勧めする。
その頃には、IDEがなんであるか、どのIDEが自分に向いているかは、もうわかっているはずだ。

どうしてもCに今すぐ取り掛からなければならないという事情があるなら、

MFCを使わなくてはならないなら、visual studio。
そうでなければ、またはターゲットがWindowsでなければ、Eclipse

どちらにせよ、タップリ不幸になれるので覚悟すること。
0291デフォルトの名無しさん (ワッチョイ a9d2-JxBb)
垢版 |
2018/07/01(日) 03:12:41.99ID:WAYB1PLl0
>>285-290
皆様遅い時間なのに丁寧に答えて下さり感激の至りですありがとうございます
C言語を勉強しようと思っているのは使う予定があるからなんですすいません・・・
取り敢えず教えてもらったものDLして勉強します、重ね重ねありがとうございます!
0293デフォルトの名無しさん (ワッチョイ 79b3-HrKv)
垢版 |
2018/07/01(日) 07:33:37.83ID:VIP13YQk0
Visual StudioにもLinuxターゲットがある。
0295デフォルトの名無しさん (ワッチョイ 79b3-HrKv)
垢版 |
2018/07/01(日) 08:04:14.93ID:VIP13YQk0
じゃあWSL使えば。
0297デフォルトの名無しさん (ワッチョイ 79b3-HrKv)
垢版 |
2018/07/01(日) 08:19:16.03ID:VIP13YQk0
Windowsのほうがいいし。
0299デフォルトの名無しさん (ワッチョイ 8212-iScA)
垢版 |
2018/07/01(日) 11:33:42.78ID:s3Ywi94+0
ポエムや日記用にもテキストエディタの2〜3は入れてていいんじゃないの

それとコマンドプロンプトの併用も考えてるんじゃない
今の時代の「C言語をやる初心者」は、CUIを知らないんだよ
コマンドを使ってみないと、何を何のために作ってるか分からなくなる
巷で言うスマホの「アプリ」とかのGUIじゃなくて、圧倒的に古いCUIなんだから、今の若いモンには明らかに異質なものを作らせるんだよ
出来上がってくるソフトウェアは「黒い窓」なる謎の儀式でしか動かない極めつけの謎だ
0300デフォルトの名無しさん (ワッチョイ 219f-iScA)
垢版 |
2018/07/01(日) 12:41:57.93ID:8/sCKaWm0
つかそもそもEclipseっていいのか?
あれ、Linuxだと他選択肢がないから使われてるだけでは?

Cで使ったことはないが、Windows/NetBeans/PHPはだいぶ酷かったぞ。
もっさりしてるし、不安定だし。
この組み合わせが最悪なだけかもしれんが。
そして一応EclipseとNetBeansは検討対象らしいからな。
(俺的には比較するまでもなくVS>>>NetBeans)

VSとEclipse両方使っている奴いる?いたら感想を。
0301デフォルトの名無しさん (ブーイモ MM4d-zt73)
垢版 |
2018/07/01(日) 14:04:36.18ID:iXNUK265M
今のところvsと肩を並べられるIDEなんてないので当然eclipseもvsより劣るわけだが、
リファクタリング機能だけは圧倒的にeclipseのほうが優秀だった。
独自環境用の多数のIDEがオープンソースのeclipseから派生して作成されてるので、個々に使い方を覚えなくていいのもメリットかもしれない。
使い始めた頃はプロジェクトとビルドルールの管理と、日本語が独特なのが、取っ付きにくかったかな。

まあ言いたかったことは、vscode輝け
0302デフォルトの名無しさん (ワッチョイ 219f-iScA)
垢版 |
2018/07/01(日) 14:34:44.13ID:8/sCKaWm0
>>301
> リファクタリング機能だけは圧倒的にeclipseのほうが優秀だった。
それってCについてだよな。MSはVSについてはC#しかやる気出して無いから。なお、

Q. どうしてVC++のエディタはC#に比べて糞なのですか
A. だってお前らどうせemacsとか使ってエディタ機能使わないじゃん(なお公式)

だったはず。
そのとき、「え?そんなに違うんか?」と思って試し、その差に愕然とした覚えがある。
俺は最新環境を使ってはいないが、最新でもだいぶ見劣りしたと記憶している。

リファクタリング機能とかはユーザがアドオン書けた方がいいから、
それもあってVSCodeなのだろうね。
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況