C言語なら俺に聞け 152

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (アウアウウー Sa4f-7DQ/)
垢版 |
2019/06/17(月) 18:27:10.41ID:3L1/L9kLa
!extend:checked:vvvvv:1000:512
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/
-
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
※前スレ
C言語なら俺に聞け 151
https://mevius.5ch.net/test/read.cgi/tech/1554171817/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2019/07/18(木) 05:43:05.99ID:xY9KzRxOd
>>572
こう理解できてるとわかりやすいね。つまり
const char *s

*s(sの指す先)はchar型でさらにconstだよ
となる。
2019/07/18(木) 06:48:06.17ID:2qyz/4gG0
>>572
その宣言から以後、
sという式がchar*型
*sという式がchar型
2つの意味を同時に表現してるんだよ
2019/07/18(木) 07:54:18.60ID:kb0ZHGx0M
*と*const があると憶えるべき。
576デフォルトの名無しさん (アウアウウー Sad3-9T1T)
垢版 |
2019/07/18(木) 09:56:03.22ID:q9HPUerJa
>>563
ポインタを表す * が型にくっついてるんじゃなくて変数にくっついてるからでは?
分かりにくいなら typedef でポインタの型を作ってそれを使えばいいんじゃないな。

右から読む事に関しては英語を日本語に翻訳する時に順序を入れ換えた方が自然な感じになる事があるのでなんとも言えんな。漢文のレ点みたいなものもあるしな。
日本語とは逆順の方が自然な表現になる言語はある。そして歴史的な事情で混在してしまっているのもある(アメリカでの年月日が月日年の順だとか)。
生まれながらにしてその言語使ってればその人にとってはそれが一番自然な表現だからな。
2019/07/18(木) 10:04:50.81ID:xY9KzRxOd
>>574
結果はいっしょでも解釈の仕方は複数ある感じだね。
自分にとって理解しやすいので
char *s

sの指す先はchar型、つまりsはポインタ
って言う風に捉えてる。
578デフォルトの名無しさん (ワッチョイ 3f28-t2IU)
垢版 |
2019/07/18(木) 21:25:27.83ID:PbeogWAD0
この話は何時も混乱するんだけど
結局の所は
自分の言葉で理解するまでやる
これをやらないと混乱してしまう

なぜそうなってしまったのか?
という視点で解釈しようとしないと
なかなかにc言語って難しい
その辺は例のc言語ポインタにのみついて書かれた本
あれを読んで
後は何とか自分の言葉で理解して解釈するしか方法が無い

それとこんなになってしまっている原因に
キーボード上の記号が少ない
というのもある
basic何かでは記号類は四則演算類だけ使って
なるだけ英単語?を使って記述するようになっている
だから使う場所によって記号の意味が違う
なんていうのが起こりにくくなってる
ある意味c言語が普及してしまったのはプログラミング世界にとっては不幸なのかもしれない
2019/07/18(木) 21:30:10.98ID:1zgaXsge0
C言語って初心者向けに作られたものではないと思う
2019/07/18(木) 21:32:28.55ID:/oDno/7H0
>>578
私も最初に C をやったときには、ここまで流行るとは思わなかったんです、むしろ pascal の方が筋がいいと思っていたのですが、どうしてこうなってしまったのでしょうか?
2019/07/18(木) 21:34:00.28ID:/oDno/7H0
>>579
当時は初心者用とかは特に無くて、BASIC でもある程度できる人はすぐに peek, poke を連発するようになったものです、最近の人は甘えていると思います
2019/07/18(木) 21:41:19.07ID:AzHVv8Pq0
>>580
UNIXがCで云々というのもあるけど、良い意味で高級アセンブラとして使い勝手が良かったからじゃないかな?
2019/07/18(木) 22:00:46.19ID:8m1lI2X40
厳格で融通がきかないと嫌われる
pascalはそんな感じ
2019/07/18(木) 22:15:37.33ID:/oDno/7H0
>>583
delphi は結構流行ったと思ったんですけれど…
2019/07/18(木) 22:18:08.64ID:0kCblb2b0
pascal失速最大の原因は:=だろう
これを採用している言語はもう一つも無い
プログラミング業界最大かつ唯一にして不可侵の大例外を抱えてるのがpascalだ
2019/07/18(木) 22:30:23.30ID:1zgaXsge0
pascalで開発したアプリっていうと
JaneStyleが有名かな?
2019/07/18(木) 22:32:00.45ID:1zgaXsge0
厳格で融通がきかないのは、教育用として最適だと思う
2019/07/18(木) 22:35:15.64ID:ugDCzjFC0
pascalでUNIX張りのOS書いていれば流行ったかもね
589デフォルトの名無しさん (ワッチョイ ff02-lraP)
垢版 |
2019/07/19(金) 00:19:03.24ID:7Hdy7m6i0
>>585
Modula-2は:=だったような気がする。
590デフォルトの名無しさん (ワッチョイ ff02-lraP)
垢版 |
2019/07/19(金) 00:22:05.35ID:7Hdy7m6i0
>>588
Delphiみたいに拡張されてれば可能だとは思うがコードが大きくなりそうなので昔のPCでは苦しいかもね。
ただし、Androidみたいに元のOSの上に乗っけて動くOSなら行けるかも。
2019/07/19(金) 00:25:42.16ID:Mih8lrFJ0
もう一つが奥の深さでC言語ではポインタが奥の深い箇所にあたる
この難易度が絶妙で難しい難しいと言われていて初学者には適度に難しいので挫折者が増える、
挫折者の総量が言語の価値を決定する

教育用に作られた言語は難しい箇所とか理屈に合わない箇所とか奥の深い箇所とかが無いのでオカルトとしての魅力が無い
学習曲線がいびつじゃないと流行しない
2019/07/19(金) 00:30:44.87ID:QK1dwfXD0
ポインタはただの入り口だろ
Cは入り口で躓く奴が多いだけで奥は寧ろ浅い
2019/07/19(金) 00:36:04.81ID:nbu0jJrl0
ポインタ使わないでもC言語ってプログラム書けるんだよな
無理して難しいことをしなくても良いと思う
ちゃんと動くかどうかの方が重要
2019/07/19(金) 00:38:14.85ID:QK1dwfXD0
ポインタを使わないならCを使わない方がいい
2019/07/19(金) 01:10:46.83ID:0vO2r76S0
超無理矢理ならポインタ使わずになんでもできるんかな?
いずれにせよポインタ理解してないとライブラリ使えなくて詰むでしょ。たぶん突然落ちたりメモリリークだらけのプログラムができあがるはず。
2019/07/19(金) 01:25:31.41ID:nbu0jJrl0
グローバル領域に予め必要な変数や配列確保しておけば
メモリーリークが発生する余地はないw
2019/07/19(金) 01:28:45.01ID:QK1dwfXD0
ネタで言ってるのか本気で言ってるのか判断が付かない
2019/07/19(金) 01:46:29.51ID:ZOnA3nWq0
ポインタ難しいって言われてるけどそんなに難しいか?
メモリイメージできれば理解できると思うけどな
2019/07/19(金) 02:19:29.42ID:1jezjf9K0
俺はポインタは難しいことがわかってたから、一度にすべて理解しようとしなかった
数年使って徐々に理解した
それが正解だった
2019/07/19(金) 02:49:16.94ID:ApXEphk20
初期化してないポインタにアクセスするとどうなっちゃうの
とか危険そうなのは試してないからわからないが
ハードウェアのイメージがあれば難しさはあまりない
(命名規則で Xxx_p と書いておけば
2019/07/19(金) 06:09:16.79ID:8762T9lH0
> (命名規則で Xxx_p と書いておけば

システムハンガリアンは大大大大大嫌い
2019/07/19(金) 07:17:09.85ID:gH0zRzIgM
>>585
ada, APLも知らない情弱知ったかは黙っとけ

>>589
まあ作者は同じだから後継って感じだし
2019/07/19(金) 09:10:50.31ID:EJb/7aTM0
>>599
そういう人もいるのか
おれはアセンブラもやってたので秒で理解した
604デフォルトの名無しさん (アウアウウー Sad3-9T1T)
垢版 |
2019/07/19(金) 09:29:24.25ID:uab/wKdga
>>580
マイコン用の小さいコードも作れるから。
昔のマイコンやPCはメモリが物凄く少ないのでその辺は重要。
少なくとも毎回でかいランタイムライブラリがくっついてしまうようではダメだ。

それと元々 UNIX の記述用に使ってた言語なので Linux 等の互換OSでも使われていて、そういうのが徐々に広まっていったので、それを通してCが流行った面もあると思う。
605デフォルトの名無しさん (アウアウウー Sad3-9T1T)
垢版 |
2019/07/19(金) 09:39:17.61ID:uab/wKdga
>>603
アセンブラできるとポインタについては理解が楽だよね。
アセンブラの方では普通に使う考え方だし。(というかないとプログラム作れないぐらい重要)。
2019/07/19(金) 11:29:42.41ID:1jezjf9K0
>>603
はじめてのプログラミング言語がCだったからな
けっこう苦労したよ、先輩
2019/07/19(金) 11:43:44.67ID:nbu0jJrl0
プログラムはZ80からなので、当たり前のようにアセンブラから学習した
CPUの仕組みを学ぶのにちょうど良かった気がする
2019/07/19(金) 12:47:23.54ID:8762T9lH0
Z80だとパイプラインとかあんまり憶えないよな
でRISCブームのとき苦労させられたと
2019/07/19(金) 13:03:51.18ID:hLCIQJ7mx
まぁZ80全盛期にパイプラインしてたCPUなんて限られてたしな。
そういう汎用コンピータはほぼ高級言語使われてたし。
2019/07/19(金) 13:07:02.40ID:8762T9lH0
6502とか
2019/07/19(金) 13:28:17.26ID:EJb/7aTM0
>>606
C++とかじゃ未だにオーバーライドとオーバーロードを間違えるので
レベル的にはおまえとドッコイだよ、後輩
2019/07/19(金) 14:13:06.92ID:ZOnA3nWq0
ムカデ長老を見習え
2019/07/20(土) 21:04:06.20ID:lWqONft90
泣いてる顔文字→( ; ; )がforの無限ループにしか見えないのですが、職業病でしょうか?
2019/07/20(土) 21:31:18.65ID:TRa6Slo50
8086のアセンブラはセグメントで挫折する・・・と言われてたけど
Z80やってたらすんなり理解できたな。
2019/07/21(日) 01:27:26.84ID:3tY7pLz50
>>613
煽りとかで()とか書かれてると関数に見えるときある
例: 職業病()とか言われましても
2019/07/21(日) 04:14:55.91ID:Nmc6oncn0
>>615
草、見えたことないわw
617デフォルトの名無しさん (ワッチョイ 3fad-lraP)
垢版 |
2019/07/21(日) 06:51:52.49ID:F3an1Rtm0
>>613
はい。

>>614
セグメントすごくわかりやすいと思うけどな。まともに説明出来る人と巡り会えなかったのだろうか。
2019/07/21(日) 08:20:20.57ID:/atv33Bt0
>>608
わかりやすいけど面倒だよね
2019/07/21(日) 15:59:50.66ID:FmQzr+LX0
>>613
forで無限ループつかうの?
おれはwhileかなw
2019/07/21(日) 16:10:09.79ID:g8U8cyIO0
forの方が短くてすむじゃないか
2019/07/21(日) 16:20:48.28ID:PhbbaTTy0
>>614
Z80にセグメントの概念なんてあったけっけ?
メモリバンク切り替えは機種によってはあったけど、あれはZ80の機能ではないし。
2019/07/21(日) 16:27:59.21ID:m/GaQUZU0
空白のcontinue節みたいなのに入る必要がないから
ちょっとwhileのほうが早いイメージ
2019/07/21(日) 16:43:59.35ID:g8U8cyIO0
>>622
インタープリターじゃないんだからさ
2019/07/21(日) 16:52:32.65ID:/atv33Bt0
>>619-620
俺はfor(;;)だな
while(TRUE)は警告表示されることが多かったから
2019/07/21(日) 18:08:15.14ID:Q0wcPMRB0
for (;;) とwhile (1) がどっちがぱっと見分かりやすいか戦争勃発しますか?
あとfor派は;;周りにスペースを入れるか入れないかでさらに細かく派閥が分かれていると聞きました!
2019/07/21(日) 18:19:58.86ID:FmQzr+LX0
>>625
まさに永久ループ戦争!
2019/07/21(日) 18:30:02.78ID:+S54SSox0
字下げのいらないgotoも参戦
2019/07/21(日) 18:32:50.79ID:Q0wcPMRB0
あ、do {} while(1);派も出てくるとおもうので皆さん頑張ってください応援してます
2019/07/21(日) 18:38:59.23ID:g8U8cyIO0
do while(0)は便利
2019/07/21(日) 18:39:57.32ID:vddupZNY0
>>629
それは #define で使うときだけでしょう?
2019/07/21(日) 18:44:37.26ID:g8U8cyIO0
いや、エラー判定とかでもよく使うだろ?
2019/07/21(日) 18:48:06.96ID:I0JRxlnTx
for (;;) は forever と読むとか
2019/07/21(日) 18:50:32.60ID:/atv33Bt0
バッドノウハウに近いが
do {
if(...) break;

if(…) break;

} while(0);
みたいなのは昔書いてたわ
2019/07/21(日) 18:52:10.72ID:Q0wcPMRB0
do {} while (0); の意味と目的【do while false イディオムの利点】 | MaryCore
ttps://marycore.jp/coding/do-while-false-idiom/
2019/07/21(日) 18:58:23.23ID:FmQzr+LX0
flag=true;
while(flag)
{
flag=(....);
}
2019/07/21(日) 19:09:32.73ID:/atv33Bt0
>>634
do {
if (that(value)) break;
if (value == -1) break;
if (value == 0) break;
puts("有効な値です");
} while (0);
みたいなのは
do {
if (
that(value)
|| value == -1
|| value == 0
) break;
puts("有効な値です");
} while (0);
って書けばいいだけ
do {
if (that(value)) break;
value = f(…);
if (value == -1) break;
value = g(…);
if (value == 0) break;
puts("有効な値です");
} while (0);
みたいに間に処理をはさまる場合が難しい
2019/07/21(日) 19:18:11.94ID:Q0wcPMRB0
このスレって直接ここに複数行のソース書き始める人多いよね
2019/07/21(日) 19:37:52.68ID:m/GaQUZU0
>>633
小さなスコープを作るため?
2019/07/21(日) 19:39:13.75ID:g8U8cyIO0
breakが使えるスコープね
2019/07/21(日) 20:14:20.69ID:/SITzbMm0
#define fe for( ; ; )
が最強
2019/07/21(日) 20:35:26.43ID:+S54SSox0
>633
おかしな事してるのが一目で、continue が外に漏れるこれ オススメ
switch(0)default:{
2019/07/21(日) 20:45:42.22ID:R+Rb+3j1d
gotoが便利すぎて禁止されがちなのが悪い。ちゃんと使えばコードが見やすくなることこの上なしなのに。
2019/07/21(日) 21:09:22.26ID:/atv33Bt0
>>642
そう言うこと
なので最近は素直にgotoで書くことが多い
一部の言語の様にブロックに名前付けて
break 名前;
でそのブロックを抜けられるようにしてくれれば良いのにと常々思う
2019/07/21(日) 21:21:29.94ID:m/GaQUZU0
ないものねだりではありますが
perlのようにブロックやループの頭にラベルをつけて、
redo next last があったらもっと良い
do {...} while(0); も {} と簡潔
2019/07/21(日) 21:42:59.10ID:ZJZWYLqf0
>>642
便利すぎってどういうことだよ
教条主義的goto禁止論の域を出とらんだろうが
2019/07/21(日) 21:46:07.68ID:AbjqA2h30
>>621
インデックスのことかも
2019/07/21(日) 22:36:03.44ID:c+HlyquL0
>グローバル領域に予め必要な変数や配列確保しておけば

>ネタで言ってるのか本気で言ってるのか判断が付かない

実際に仕様なんかがしっかりしているタイプで
メモリー確保が動的に大きく変化しないものなら
実際にそういう風に作っているのを聞いた事は有る

配列式だと動的に確保したり開放したりが無く
リークしたり無効になったりしない分かなり安全
実行開始時に使用する領域が完全に確保されているから
2019/07/21(日) 23:24:53.03ID:R+Rb+3j1d
>>645
すまん、そんなに深い意味はない。
2019/07/22(月) 00:04:19.79ID:PN8KKKdJa
静的な所にプール作るのはメモリ制限ある組込では割とあったと思いますよ
650デフォルトの名無しさん (アウアウウー Sad3-9T1T)
垢版 |
2019/07/22(月) 15:35:08.24ID:vmYUDJ0Ja
>>643
最近の言語ではそういうのあるね。
とはいってもJavaには既にあったのでかなり前からあるな。
Java以前はあるかどうか俺は知らん。
651デフォルトの名無しさん (アウアウウー Sad3-9T1T)
垢版 |
2019/07/22(月) 15:37:04.86ID:vmYUDJ0Ja
あ、Perlもループにラベル付けてlastで抜けるなんてのあるな。
2019/07/22(月) 16:18:33.80ID:QnLUYAOH0
break ラベル で、多重ループから一気に抜けられると便利なんだがな
2019/07/22(月) 16:35:14.27ID:rxI3cfFL0
gotoが便利すぎというより
単純な break returnで間にあわないときには
それしか制御がないのでは
2019/07/22(月) 17:24:33.59ID:7pc0Xm6O0
二重ループから抜けるにはgotoが一番
gotoを廃止した言語制作者は天罰を受けるべき
2019/07/22(月) 17:30:50.79ID:rxI3cfFL0
goto はそれで使われている保障がないから、
保守性のためにも
ループなどに名前付けて、それを抜けると明記したい
2019/07/22(月) 17:54:19.31ID:e8FkVPqsa
まず多重ループを避けろと
657デフォルトの名無しさん (ワッチョイ 3fab-5Xl5)
垢版 |
2019/07/22(月) 18:05:34.66ID:LktYqlpm0
gccで X Window System (x11) でウインドウつくって画像合成するのって

どうすればできますか? なにかサンプルプログラムなど無いでしょうか?
2019/07/22(月) 18:22:30.58ID:QnLUYAOH0
>>656
二次元配列を総なめする場合に
ループを 1変数でやるのかな?
2019/07/22(月) 18:36:31.65ID:zh10SCAHd
>>657
古本を漁ればやり方が書いてあるかも。
XScreenSaverのソースみれば参考になるかも。
2019/07/22(月) 18:39:10.09ID:zh10SCAHd
いにしえのシステムなら、関数名をmanコマンドで引けば、X Windowの関数のマニュアルが見られるはず。
661デフォルトの名無しさん (ワッチョイ 3fab-5Xl5)
垢版 |
2019/07/22(月) 18:42:21.76ID:LktYqlpm0
>>659
linuxOSだとSDL(Simple DirectMedia Layer)で書いたほうが情報が多く 
描画書き換え速度もはやい気がします

SDLに移行したほうがやはり無難でしょうか?
2019/07/22(月) 18:50:51.45ID:QnLUYAOH0
質問者自身で決定すれば良いと思うが
2019/07/22(月) 18:54:21.58ID:zh10SCAHd
>>661
X11は将来、Waylandにバトンを渡すらしい。新しい端末ではX11が採用されない状況が考えられる。クロスプラットフォームの方が安心かな?
2019/07/22(月) 18:56:55.15ID:zh10SCAHd
暗号化されてないX11をネットワークで見たら丸裸だからあんまり使いたくないよね。
665デフォルトの名無しさん (ワッチョイ 3fab-5Xl5)
垢版 |
2019/07/22(月) 19:02:32.68ID:LktYqlpm0
ネットワーク環境はsshしか使ったこと無いのですが
SDL_net などは関数に暗号化などがふくまれているのですか?
2019/07/22(月) 19:08:12.59ID:zh10SCAHd
>>665
ソーシャルゲームを作るなら、暗号化は必須。暗号化方式を決めて、それに合った暗号化専用のライブラリーを使う形になる。
667デフォルトの名無しさん (ワッチョイ 3fab-5Xl5)
垢版 |
2019/07/22(月) 19:10:57.83ID:LktYqlpm0
>>666
C言語の暗号化ライブラリで使いやすいのおせーてください
2019/07/22(月) 19:22:24.63ID:zh10SCAHd
ソーシャルゲームは専門ではないが、暗号化なら
https://ja.m.wikipedia.org/wiki/%E6%9A%97%E5%8F%B7%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E6%AF%94%E8%BC%83
2019/07/22(月) 19:25:19.41ID:MRg17CtQa
いろいろあるんですけど、ライセンス的にopensslでいいやみたいな感じになりましたね
waylandは5年後くらいにはなんとかなるんかな。どういうレイヤでサービス提供したいのかよくわからん所がある。
2019/07/22(月) 21:33:35.10ID:tAjmkx+m0
同じくopensslでいいんじゃないかと思いますな
671デフォルトの名無しさん (ワッチョイ 4f25-WSqd)
垢版 |
2019/07/23(火) 03:25:09.81ID:/ZO3BTO70
gchar **command = (gchar *[]){"./Hello.exe","World",NULL};

を gcc6 で compile すると以下の2種類の warning が出ます。

warning: ISO c++11 does not allow conversion from string literal to 'gchar *' (aka 'char *') [-Wwritable-strings]

warning: pointer is initialized by a temporary array, which will be destroyed at the end of the full-expression [-Waddress-of-array-temporary]

どう書くのが正解なのでしょうか? 教えてください。最後の NULL がなければ、

gchar **command = (gchar **)((char [][20]){"./Hello.exe","World"});

で良いと思うのですが、最後の NULL も必要です。よろしくお願いします。
2019/07/23(火) 04:01:15.67ID:XJs/DfWFa
要素の文字列をそれぞれキャストしてみるとか?
でも別に文字列の実体を用意した方が無難では。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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