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
0181デフォルトの名無しさん
垢版 |
2018/05/27(日) 11:20:24.54
言うほどひどい変更か?
RHEEとCentOSと同じだろ
0182デフォルトの名無しさん (ワッチョイ 399f-DqgS)
垢版 |
2018/05/27(日) 16:17:28.83ID:cn9TbCYJ0
>>178
Windowsの場合はこことか読めばわかるんじゃないかな。
http://blog.fieldnotes.jp/entry/install-openjdk-on-windows
https://qiita.com/ykubota/items/582caa8621a5fc86d0a1

Linux の場合は何も考えなくても最初から入ってるディストリビューション結構あるのではないか?
少なくとも RHEL, CentOS, Ubuntu のような主要なディストリビューションにはある。
なくても yum や apt で追加可能。
0183デフォルトの名無しさん (ワッチョイ 399f-DqgS)
垢版 |
2018/05/27(日) 16:22:56.43ID:cn9TbCYJ0
しかし Windows のコマンドプロンプトから curl や tar が使えるようになっていたのは知らなかった。
これは良いな。一々余計なアーカイブソフトを後から入れなくても済む。
0185デフォルトの名無しさん (アウアウカー Sa95-NVy/)
垢版 |
2018/05/28(月) 12:09:22.29ID:0ow6THVWa
苔のむすまで
0190デフォルトの名無しさん (アウアウウー Sadd-DqgS)
垢版 |
2018/05/30(水) 23:22:02.29ID:TSp4NAvfa
とりあえず、値を取得する系の関数では副作用を起こすような記述はやめような
例えばグローバル変数をいじるとかポインタをいじるとか標準入力・標準出力・ファイル操作するとかはやめろよな

int getValue(int x, int y) {
 …
 return ○○;
}

こういう関数で printf とかするのは論外

あっ、ちなみに setter でも値の設定だけを行い、標準入力・標準出力・ファイル操作などはするなよ

void setValue(struct MyClass *obj, int x, int y) {
 obj->r = x * x + y * y;
 obj->theta = atan2(y, x);
}

みたいな感じで
0196デフォルトの名無しさん (ワッチョイ 4161-tKKY)
垢版 |
2018/06/01(金) 21:19:49.50ID:L4m1DFki0
バッチなのですがスペースの問題にぶち当たってます
素敵仕様って言うんですかね?

フルパスから拡張子を抜いたファイル名を取得したいんですが
%^n1でファイル名を取得しているんですが
ファイル名に全角スペースが入っているため完全なファイル名が取得できなく困っています
""で囲っても取得できないです 全角スペースと半角スペースが混ざっていると取得できるのですがなにかいい方法ありますか?

"D&Dで渡したファイルのパスが欲しい"に拘らなければ、テキストファイルにパスリストを書いて読み込むみたいな外部ファイルを使う方法にするとか
Powershellみたいに.Net Framwork呼ぶとか
もしくはファイル名取得用のコンパイルファイルをかますとか

Google先生以上の回答は出ないでしょうか?
0201デフォルトの名無しさん (アウアウウー Sa09-44S8)
垢版 |
2018/06/03(日) 17:20:37.50ID:DGByVz/ba
スマホでポチポチ入力してたら既に書かれてるけど

>>198-199
とりあえずrestrictは無視するとして
>char *const ary
aryが定数。ary=0はコンパイルエラー。*ary=0はOK
>const char* aryまたは char const* ary
aryの参照先が定数。ary=0はOK、*ary=0はエラー
0202デフォルトの名無しさん (ワッチョイ d59f-NLsb)
垢版 |
2018/06/03(日) 17:23:51.40ID:m3SIxw/I0
>>198>>199
func() の中の *(any + 1) = '\0' がコンパイルエラーにならない理由は const が any に対するものであって
*any に対するものではないから。そのプログラムの場合 any そのものを変化させる any = NULL や any++
みたいな記述があるとエラーになる。

restrict はコンパイラの最適化に対するヒントで、そのポインタが別のポインタによって指されていないことを
前提とした最適化をして良いことをコンパイラに伝えるためのものだ。伝えられた側のコンパイラはそのような
最適化をやってもいいしやらなくても良い。
0203 ◆QZaw55cn4c (ワッチョイ da60-667V)
垢版 |
2018/06/03(日) 17:24:22.63ID:5RsKIUxf0
>>201
>スマホでポチポチ入力してたら既に書かれてるけど
どうして、書いている時点でそれがわかるのですか?高性能な専用ブラウザなんでしょうか
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() でメモリ確保するなら考える必要ないよな。
■ このスレッドは過去ログ倉庫に格納されています

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