X



C言語なら俺に聞け 145
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ 9381-qput)
垢版 |
2018/02/19(月) 22:13:58.98ID:9/te2eSJ0
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
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
0789デフォルトの名無しさん (ワッチョイ 2d93-SKFW)
垢版 |
2018/04/06(金) 05:54:14.00ID:dKA/BnpB0
>>787
質問にある“配列”てのは、画面に出力される結果のことかな?
表示される文字やその順番は同じだけど、文字の間の空白の数が違う、と。

プログラミング界隈では“配列”って言葉は特定の意味を持った専門用語だし、
問題のプログラムはその意味での配列を使ってないから軽く混乱を招くかと。
0792デフォルトの名無しさん (ワッチョイ 5d9f-vJpg)
垢版 |
2018/04/07(土) 15:06:53.28ID:bMqQKRLP0
>>787
%2c の部分は右詰めで幅2文字の指定になるが c なので常に1文字の指定になり
引数の int 型数値は unsigned char に変換されて出力される。つまり %2c の部分
だけでスペース1文字と引数で与えた1文字が出力される。(もちろん端末によっては
引数の値によって1文字の扱いにならないかも知れないが、その辺は説明が長く
なるので省略)。

後はその前後にスペースを付け加えて出すかだけの問題。そのプログラムには
改行がないので全て繋がって出力される。(1回も改行を出力しないままプログラムが
終わるので実行環境によっては出力の後に続けてシェルのプロンプトが出るかも
知れない)。
0793デフォルトの名無しさん (ワッチョイ 2d23-6Vn5)
垢版 |
2018/04/07(土) 15:19:36.81ID:vVe4gpjb0
判りにくい日本語だな
判るものもかえって判らなくなるくらいひどい
0797デフォルトの名無しさん
垢版 |
2018/04/07(土) 21:49:40.43
Visual BasicとかPerlとかから入った自分としては、
Cのほうが簡単に書ける場面もあれば
VBSやVBAがいい場面もあればPerlがいい場面もあって
要はどの言語でも楽しく書ければそれでええやん
0801デフォルトの名無しさん (ブーイモ MMe7-64l2)
垢版 |
2018/04/15(日) 15:16:14.29ID:iG9vZW44M
上の写真を見る限りjが増えたタイミングでprintfで改行コード入れてるっぽいけどそれならiのforが終わったタイミングで改行コード入れれば動くんじゃないですか?
なぜiが8までしか回さないのかわからないですが…
0802デフォルトの名無しさん (ワッチョイ 93ab-ycE0)
垢版 |
2018/04/15(日) 15:38:09.01ID:MyboI2lC0
しょーもない質問ですいません

vs2017で勉強してるど素人なんですが
コードをミスして修正しようとすると文字が上書きされて
文字を挿入できないん時があるんですが、
なぜでしょうか?
0807デフォルトの名無しさん
垢版 |
2018/04/15(日) 16:17:29.71
>>806
この程度読み取れないようじゃエスパーに向いてないよ

> どこに改行コードがあるのか
予想回答「int c=‘ ‘;」って改行コードですよね?
iが増えるたびに改行コードをprintしたいんですよね?

> iが8までとは何の事か
予想回答:すみません、jの間違いです!
0813デフォルトの名無しさん (ワッチョイ a304-x9ai)
垢版 |
2018/04/15(日) 19:14:55.01ID:7zIgNBcs0
至極の名言教えてやるぜ。受け売りだけどな。
コードを効率的にしたり、最強の最適化だったりするそれが一番効くのは書かないことだ。
書くと何らかの負荷になる、コードもグチャグチャになる。
必要なことだけ書いて後は流れに任せるのが上達の道。
0815デフォルトの名無しさん (ワッチョイ 43bb-LJHW)
垢版 |
2018/04/15(日) 19:59:11.25ID:+NxoeMlk0
うーん・・・人によって考え方が違うから正解なんてないし
2chのこのレスだけでは具体的な提示とか難しいよね

本当に必要な処理だけ書いてたら関数長くなって
見通し悪くなったりメンテし辛くなったりしない?
0816デフォルトの名無しさん (ワッチョイ a39f-/JlG)
垢版 |
2018/04/15(日) 20:03:21.51ID:IgQGrpHk0
>>810
ない。
>>811
関係ない。

君は本質的な「プログラミングの腕前」を上達させる為に、体系的に学べる物を探しているんだろ?
ならそれは言語には全く関係ないことは分かるだろ。

そして、そんな物は今はない。なぜならプログラミングは今もまだ発展途上だから。
そもそも歴史が浅い。プログラミングには100年ほどの歴史しかないし、
プログラミング作法が学問として成立してからは50年ほどしか経ってない。
だから現在でも試行錯誤中なんだよ。
それは今更C#/C++/Javaがラムダを採用したことからも分かるだろ。
ラムダ自体はLispの昔からあった。
そしてこれらの言語はそれを知っていて不採用としたわけだが、
今更の方向転換=間違いを認めた、ということなんだよ。
まだそれくらいあやふやなものだって事。

勿論各自が「オレオレ流スーパーハッカー道」を上梓することは出来るのだけど、
実際そういう奴はいないようだ。

とはいえ、結果的に全ての言語が似たり寄ったりになってきているから、
これは成熟してきていることを意味する。
となると、今後は体系化されていくだろうし、そういうサイトや本が現れてきてもおかしくない。
今は>>813みたいな、一言集みたいなのしかないね。
https://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/
0818 ◆QZaw55cn4c (ワッチョイ 7f60-LJHW)
垢版 |
2018/04/15(日) 20:22:19.20ID:vjxfJMST0
>>816
C++/C#/Java のラムダ式ってラムダ式じゃないと表現できない「何か」を表現する、というよりは、シンタックスシュガーとしてのラムダ式であることが不満です
0828デフォルトの名無しさん (ワッチョイ a39f-/JlG)
垢版 |
2018/04/16(月) 23:38:04.25ID:qQ0bjYjD0
>>820
>>827
お前ら知ってるのならそのメリットを(出来れば具体的に)書いてみてくれないか?
一応Wiki読んだが、
> 明示的に再帰を書かずに再帰を実現する為に用いる事ができる。
> なお、一般にそういった言語では普通に再帰が使えるので、
> プログラミングにおいてはパズル的なテクニック以上の意味は無い。
> https://ja.wikipedia.org/wiki/%E4%B8%8D%E5%8B%95%E7%82%B9%E3%82%B3%E3%83%B3%E3%83%93%E3%83%8D%E3%83%BC%E3%82%BF
なら、いらねえし、採用されることはないと思うが。
0829 ◆QZaw55cn4c (ワッチョイ 7f60-LJHW)
垢版 |
2018/04/17(火) 00:06:31.67ID:gWiyCqxa0
>>828
その wikipedia の解説はちょっと本質からはずれている気がする
「明示的な識別子を含まないで再帰関数が記述できる」くらいか

ラムダ表現を採用している、というのなら不動点コンビネータくらいは記述できないといけないのではないか?
いいかえれば不動点コンビネータを表現できないラムダ表現は「何か大事な部分が欠けている」

ラムダ表現は理論的なモデル(計算可能性を論じるなど)として考案されたもので、実用とか効率とかからは遠く離れている
ラムダ表現を売りにする言語(lisp とか)ならともかく、C#/C++/Java のような実用・効率を求める言語で単に「ラムダ表現ができる」「簡潔だ」くらいの理由で採用されるのは、無目的に言語仕様を拡張しているという理由で個人的には不満

さらにはラムダ表現を老害フィルタがわりに使う者もいたりするが、そういうのには賛同しがたい
0833デフォルトの名無しさん (ワッチョイ a39f-/JlG)
垢版 |
2018/04/17(火) 23:42:23.84ID:Yk52Q7IR0
>>829
今の仕様で不動点コンビネータが記述できるのかどうかは俺には分からないが、
焦点はその先で、「記述できたら何がうれしいのだ?」なのだと思うよ。
実用言語で重視されるのは当然「実用性」であって、「学術性」ではない。

逆に、実用性皆無なら、当該部分が削除された状態で採用されるべきだ。
例えばC#は意図的にインラインアセンブラを禁止している。
ヘルスバーグのインタビューがググッても出てこないのだが、心は、
「C#のコードならメンテできます」の為の必要知識量を抑えること、だった。
これは長期的に要員確保の難易度を下げ、結果的にメンテ性を上げる。
これも実用言語では重要だよ。
アメリカでPythonを使うのも、Python自体が良い言語だと思っている奴は皆無で、
「Pythonならみんな読めるし書けるから」だからね。
そのコードが10年以上使われることが分かっているのなら、
10年後に要員確保できない可能性がある言語を選択するのは間違いだし。

Cは、(時代的に無理ではあったが)何でもありの状態で、
文法は極めて簡単だが問題は中で何をやっているかで、読んでみなければ分からない。
「Cのコードならメンテできます」とか、簡単に言うのは無理だろ。
C#はイミフなコード構成(大体はCでも警告が出るもの)も禁止されており、
一応、エンジニアが「C#ならメンテできます」と言えることを目指している。
(上手く行っているとは言い難い部分もあるが)
酷い話だが、Javaは10年間全く進歩しないことによってこれを達成してしまっているし。

だから、話を戻すと、
実用言語においては実用性のある機能は取り入れるべきだが、
実用性がない機能は捨てられるべきなんだよ。
(大は小を兼ねる、多めに採用しとけ、ではない。同様に無駄に構文糖が多いのも問題)
今回ラムダが矮小化されて取り込まれているということなら、
取り込まれた部分は必要だと、切り捨てられた部分は不要だと判断されただけ。
勿論今後覆る可能性もあるけどね。
0835 ◆QZaw55cn4c (ワッチョイ 7f60-LJHW)
垢版 |
2018/04/18(水) 00:05:44.11ID:0XfxQo2f0
>>833
>取り込まれた部分は必要だと、切り捨てられた部分は不要だと判断されただけ。
受動的な態度であればそうなるが、あえて私の感覚を述べるとすれば、

ラムダ式を C++/C#/Java(特にC++)に取り込む価値があったのか?
という点、C++ のラムダ式は operator()() で実現できるし、operator()() のシンタックスシュガーと考えてよい

シンタックスシュガーを全否定するわけではない
「ラムダ式」という偉大な名前に反して、実際にできることは一般的な「ラムダ式」のカバーする領域よりも狭くなっているのを「不満」と感じているだけなのかもしれない
0836デフォルトの名無しさん (ワッチョイ a39f-/JlG)
垢版 |
2018/04/18(水) 01:03:16.68ID:fAoQEHU80
>>835
> C++ のラムダ式は operator()() で実現できるし、operator()() のシンタックスシュガーと考えてよい
一応それが禿がラムダをC++に採用するのに反対している理由だったと聞いたが、
結果的には折れたんだろ。
昨今は「出来ること」よりも「ソースコードの見やすさ」が重視されているし、妥当だと思うが。
比較すると、

1. そもそも operator()()(ファンクタ)では関数に見えない。これが最大のガン。
2. C/C++は階層記述能力が無く、関数内関数が出来ない。このため、
 局所的に関数ポインタを使いたいだけの場合でも上位階層に関数を記述するしかなく、
 結果的にその関数は他からも見える(使える)状態になってしまう。
 匿名関数であれば、そこでしか使っていない事を文法的に保証できる。
3. ファンクタだとインスタンス変数は必ずコピーすることになる。
 ラムダだとおそらく直接掴める場合もあり、この場合はケチれる。
 (ただしこれは実装による)

だから関数内関数(クロージャ付き、最低限その階層の変数は見えるもの=GCC拡張の仕様でいい)があれば、
1,2,3とも達成できるし、要らなかったかな、とも思う。
というか、C/C++とも、関数内関数(階層)は無しで押し切るつもりかよー、とは思う。
ラムダよりこっちの方が必要な気がするのだが。
0837デフォルトの名無しさん (スップ Sd1f-CG16)
垢版 |
2018/04/18(水) 02:30:28.15ID:vVNlUpo0d
Cとシェルスクリプトだけで生きていきたいんですが食べていけますか?
またそういった分野らOSSコミッター以外でありますでしょうか?
0839デフォルトの名無しさん (スップ Sd1f-CG16)
垢版 |
2018/04/18(水) 03:38:30.78ID:5PSc4Ve9d
>>838
ありがとうございます
0840デフォルトの名無しさん
垢版 |
2018/04/18(水) 06:50:02.81
今どき組み込み系もPythonできなきゃやっていけない時代よ
0842デフォルトの名無しさん
垢版 |
2018/04/18(水) 07:26:37.24
>>841
ツール類は一昔前ならPerl/Ruby/TTL(TeraTerm)/VBA、今はPythonが必須だよ
0844デフォルトの名無しさん
垢版 |
2018/04/18(水) 08:03:28.70
>>843
組み込み系開発者がCソースだけいじってればいいと思ってんのか
0854デフォルトの名無しさん (アウアウカー Sa47-p2KG)
垢版 |
2018/04/18(水) 11:16:51.20ID:gg2GabAwa
プログラムを動かすボードが貧弱でも開発は豪華なPCでやるんだから最低でもアセンブラ使えるようにはするだろう。
作ったばかりのCPUで他のCPUとの互換性が全くなくアセンブラもまだない、なんていう特殊な状況でない限りは。
0857デフォルトの名無しさん (アウアウカー Sa47-p2KG)
垢版 |
2018/04/18(水) 12:57:38.66ID:gg2GabAwa
mount /dev/sda
0859デフォルトの名無しさん (ワッチョイ e39f-ycE0)
垢版 |
2018/04/18(水) 23:58:14.05ID:BI6oaZDa0
この頃は組み込みって言っても Linux が動いちゃうような小さいボードあるしな。
SDメモリに平気で何Gもデータ入れちゃったりもできるし。なんとういか、時代は変わったよな。
昔は2KBと4KBのROMに詰め込むためにビット単位で削っていたもんな。
0861850 (ワッチョイ b7bd-9jjH)
垢版 |
2018/04/19(木) 05:33:01.08ID:IwtdBTTY0
なんかネタレスで返されてるな
とあるLEDアレイの案件では並列に重きを置き
CPUあたりの処理能力は思いっきり低い
なんてのがあったんだが
0862デフォルトの名無しさん (アウアウカー Sa43-9Dln)
垢版 |
2018/04/19(木) 12:39:01.79ID:oHD1faOFa
あまりに面倒ならハードウェアで回路追加して解決
0864デフォルトの名無しさん (ワッチョイ 76e7-l7dU)
垢版 |
2018/04/19(木) 23:07:31.74ID:p3OUOmjs0
int a[] = {0,1,2,3};
char b =0;
scanf("%d",&b);

printf("%d",a[b]);
知恵袋でこんな質問があって俺も不思議に思って持ってきたんだけど
色んな数字入れても0になるとか書かれてたんだけどこれどうなってるの?
0866デフォルトの名無しさん (ワッチョイ 76e7-l7dU)
垢版 |
2018/04/19(木) 23:21:55.11ID:p3OUOmjs0
>>865
100入れてみたら3が返ってきたw
0868デフォルトの名無しさん (ワッチョイ 83b3-sFFS)
垢版 |
2018/04/19(木) 23:23:39.27ID:XF7JHHHf0
エンディアンによるような気もするがー

%d は int の大きさを持った器のポインタを要求してるのに
char の大きさの器を渡してるから どうなろうがしったこっちゃない鼻から悪魔系の動作
0869デフォルトの名無しさん (ワッチョイ 76e7-l7dU)
垢版 |
2018/04/19(木) 23:29:53.26ID:p3OUOmjs0
これがエラーにならず動いてしまうという悪魔のCの動作か
■ このスレッドは過去ログ倉庫に格納されています

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