C言語なら俺に聞け 152at TECH
C言語なら俺に聞け 152 - 暇つぶし2ch200:デフォルトの名無しさん
19/07/04 18:46:50.22 RufwSseDM.net
hoge.hというヘッダーファイルがシステムで使用可能ならインクルードして、ないならローカルに用意したものをインクルードしたい時はどうすればいいですか?
イメージはこんな感じです
if (exists("hoge.h")):
#include<hoge.h>
else:
#include"./src/hoge.h"

201:デフォルトの名無しさん
19/07/04 18:59:45.02 ead2oXvp0.net
>>200
#if EXISTS_HOGE
#include <hoge.h>
#else
#include "./src/hoge.h"
#endif
コンパイラオプションで-DEXISTS_HOGE=1を指定するとシステムのヘッダをインクルードできる
これの欠点は手動で指定する必要があること
自動でやりたいならautotoolとかcmakeを使うしかない

202:デフォルトの名無しさん
19/07/04 19:38:05.76 j+BKfkH80.net
>>200
includeパスの優先順位を利用するのじゃダメなの?

203:デフォルトの名無しさん
19/07/04 19:40:09.58 CiYpNsgja.net
自分の hage.h を用意しとけば。名前何でもいいけど。
で、本物のhageのインクルードガードのマクロ定義をチェックすればいい。マクロがあればの話だけど。

204:デフォルトの名無しさん
19/07/04 20:01:31.43 DFmBoT0+d.net
こっそり__has_include使えたりしないの?

205:デフォルトの名無しさん
19/07/04 22:38:29.59 YXLsgD0T0.net
cmake便利だよな。これを覚えたせいで仕事を簡単に家に持って帰れるようになってしまったよ……

206:デフォルトの名無しさん
19/07/04 23:09:00.36 Dgm46w9S0.net
社畜w

207:デフォルトの名無しさん
19/07/05 07:37:58.54 gYSYJWLY0.net
ハッカータイプの人はそれが普通なんだよ
パンピーには解らないし解ってもらいたいとも思わない

208:デフォルトの名無しさん
19/07/05 07:39:43.05 RJCpPwwqa.net
いわゆる暇プロタイプの人だな。

209:デフォルトの名無しさん
19/07/05 10:42:30.79 /9SntML6a.net
タクシー運転手の趣味がドライブみたいなものだな。

210:デフォルトの名無しさん
19/07/05 10:48:27.91 V1OP8/TU0.net
会社でマルウェア製造していたのか

211:デフォルトの名無しさん
19/07/05 12:21:58.01 /9SntML6a.net
四角くてもマルウェア

212:デフォルトの名無しさん
19/07/05 19:35:27.70 cg54bwGhM.net
山田く~ん

213:デフォルトの名無しさん
19/07/07 01:12:52.69 ibboI0jYa.net
マ板化してる・・・

214:デフォルトの名無しさん
19/07/07 12:35:21.67 L+nDH+YyF.net
>>163 >>167
ポインタと配列の違いを説明してみ

215:デフォルトの名無しさん
19/07/07 13:52:06.12 rNUlAIMGM.net
*p[]
(*p) []
**p
*(*p)

216:デフォルトの名無しさん
19/07/07 16:31:13.26 hqXlVeni0.net
>>214
ポインタは変数で4バイトのメモリ領域で、
配列は連続したメモリ領域?
int arr1[] = {1,2};
int arr2[] = {3,4};
arr1 = arr2;
がエラーになるから配列はポインタ変数とは明確に区別されてるみたいだが

217:蟻人間
19/07/07 16:40:40.99 0lH1eUtNd.net
16-bitのMS-DOSの時代だと2バイトのポインタがあったし、64ビットのCPUなら、8バイトもあり得る。

218:デフォルトの名無しさん
19/07/07 16:45:42.38 YcHC3knN0.net
また値渡し、ポインタ渡し、参照渡しは~ってやるのか?

219:デフォルトの名無しさん
19/07/07 16:52:42.60 21BbIGV/0.net
> *(*p)
ああ、こいつ解ってないな

220:デフォルトの名無しさん
19/07/07 18:03:14.45 XjejoYnQ0.net
>>219
それ顔文字っぽいよね。

221:デフォルトの名無しさん
19/07/07 18:04:40.15 XjejoYnQ0.net
>>216
うちのポインタは8バイトだ。

222:デフォルトの名無しさん
19/07/07 19:09:15.76 bN7H9WWH0.net
配列はポインタのシンタックスシュガーでしかない
ポインタは何でも許されるが配列は操作が簡略化と同時に制限されてる

223:
19/07/07 19:31:01.29 wvjux2100.net
>>222
配列名は定数扱いのポインタですね
しかし、配列だけに許される簡素化ってなんですか?

224:デフォルトの名無しさん
19/07/07 19:32:54.23 bN7H9WWH0.net
>>223
配列は宣言した瞬間に領域が確保されてるだろ

225:デフォルトの名無しさん
19/07/07 19:33:00.70 SGQz+b0c0.net
>>222
x[-1]、これも許されるんだよな

226:デフォルトの名無しさん
19/07/07 20:07:07.70 OUCQisjNM.net
int a[1];

int *a;
a=(int *)malloc(sizeof(int));
の違いって何?

227:蟻人間
19/07/07 20:12:27.77 0lH1eUtNd.net
>>226
前者はスタックか静的領域に確保される。後者はヒープに確保される。前者はスコープを抜けると自動で解放。後者は解放しないとメモリーリークする。

228:デフォルトの名無しさん
19/07/07 20:15:53.10 OUCQisjNM.net
>>227
ということは配列ってメモリのことよく分からない初心者プログラマ以外には無用の長物なん?
解放漏れの考慮以外でわざわざ配列使うメリットってあるの?

229:デフォルトの名無しさん
19/07/07 20:17:35.62 bN7H9WWH0.net
>>228
寧ろ配列で済むのにポインタを使う意味がないぞ

230:蟻人間
19/07/07 20:18:55.18 JhpdhjN90.net
>>228
繰り返し(iteration)の処理で連続データを処理・制御するときに配列がないと困る。

231:デフォルトの名無しさん
19/07/07 20:29:34.92 OUCQisjNM.net
>>229-230
int a[3];
for(int i=0;i<3;i++) a[i] = 0;
int *a;
a=(int *)malloc(sizeof(int * 3));
for(int i=0;i<3;i++) *(a+i) = 0;
これとこれだと違うの?
ポインタだとchar型の時とか文字列代入出来るし
上位互換な気がするんだけど。

232:蟻人間
19/07/07 20:32:06.26 JhpdhjN90.net
>>231
sizeof(int) * 3の間違い。
ヒープだと可能なかぎり自由に実行時にサイズを決められる。

233:蟻人間
19/07/07 20:34:52.90 JhpdhjN90.net
配列のサイズが決まるのはコンパイル時だ。

234:デフォルトの名無しさん
19/07/07 20:36:22.20 bN7H9WWH0.net
>>231
前者の方が簡潔だし
書かなくていい確保・開放処理は避けるものだ
パフォーマンスも配列の方が上

235:デフォルトの名無しさん
19/07/07 20:36:48.46 HZba7DSz0.net
>>228
自分で書いたんだから分かると思うけど、言語構造の話でも>>226の場合は記述量で配列の方が楽だし、読む側もひと目でわかるじゃん。

236:デフォルトの名無しさん
19/07/07 20:37:18.16 HZba7DSz0.net
かぶった

237:デフォルトの名無しさん
19/07/07 20:50:54.62 OUCQisjNM.net
じゃあ配列は、ポインタの一部機能を制限して使いやすさの向上を図ったものという認識でいいの?
それとも生まれも育ちも全く別の概念?
何か、今やってるcの教材が、まず最初に配列を使ってプログラム書いて、
次の章でポインタ出てきて、今まで配列使って書いた奴をポインタで書き変えろみたいな例題ばっかりだから
だったら最初から配列いらなくない?と思ってしまいました。

238:蟻人間
19/07/07 20:52:43.83 JhpdhjN90.net
実用的なプログラム書いてたら、そのうちわかる。心配要らない。

239:デフォルトの名無しさん
19/07/07 21:00:11.30 OUCQisjNM.net
分かりました。unionもわざわざこんなの使わずstruct使えばよくねって思うけどそういうもんだと今は思っときます。

240:デフォルトの名無しさん
19/07/07 22:02:44.50 o4vR1s03a.net
>>237
むしろ、何故ポインタが不要だと思わんのか謎だわ

241:デフォルトの名無しさん
19/07/07 22:15:20.04 2f8BNWqD0.net
なぜopenとfopenの二つのファイルアクセス手段が用意されているのか。

242:
19/07/07 22:18:01.98 wvjux2100.net
>>241
open() は OS が提供するシステムコールそのもの
fopen() はライブラリ関数であり open() をラップして「使いやすくした」(本当か?)もの

243:デフォルトの名無しさん
19/07/07 23:10:44.83 XjejoYnQ0.net
>>242
バッファっリングしてくれるとか、fprintf()もあったりしてテキストをフォーマットして出力するのも楽というのがある。

244:デフォルトの名無しさん
19/07/07 23:15:22.66 o4vR1s03a.net
Cライブラリとしてはfopenしかないわけだけど、正直あんまり便利じゃないよな。

245:
19/07/07 23:16:29.46 wvjux2100.net
>>243
バッファリングはね…バッファリングは今は大部分 OS が抱いているものなんじゃないかな…アプリケーションが各々のユーザーランドに抱いていてメリットがあるのかな…

246:デフォルトの名無しさん
19/07/07 23:34:13.80 XjejoYnQ0.net
>>245
ま、そうだけどね。Cってそういう今時のちゃんとしたOSのないところや完全にOSなし環境用のプログラム作るのにも使われるし、ああいうライブラリはあってもいいと思う。
まあしかしちょっと古くなった感はあるのでリニューアルしても良いんじゃないかとは思うけどね。てか、最低でも標準ライブラリなのにセキュリティーホール作ってしまうようなのは廃止した方が良いよな。

247:デフォルトの名無しさん
19/07/07 23:42:46.95 sq3gNEgUd.net
システムコール自体相当重いから、OS呼び出す回数減らすためのバッファリングだろ

248:デフォルトの名無しさん
19/07/07 23:47:08.94 YcHC3knN0.net
入出力バッファリングしてくれるファイルシステムなんてあるか?
ジャーナリングと勘違いしてるんだろ

249:デフォルトの名無しさん
19/07/07 23:54:40.74 sq3gNEgUd.net
しない方が珍しくね?
writeしたらディスク書き込み完了するまで次がブロックするとか?

250:デフォルトの名無しさん
19/07/07 23:59:57.04 YcHC3knN0.net
それジャーナル制御の話だろ

251:デフォルトの名無しさん
19/07/08 00:13:01.27 cSAl/tEC0.net
バッファリングとキャッシュの区別が…。

252:デフォルトの名無しさん
19/07/08 00:15:59.34 +tWapxmU0.net
>>248>>245へのレスな
バッファリングはアプリの仕事

253:デフォルトの名無しさん
19/07/08 00:21:05.88 G56xs+BGM.net
>>240
char *str;
str = "abc\n";
が許されるから。
配列に文字列を代入出来ないのが不便
>>241
それ言うならfopenとfopen_sの方が意味分からんね
VS使ってたら書き換えろと警告出してくるわ、書き換えたら引数の取り方違うとかいうクソ仕様だし

254:デフォルトの名無しさん
19/07/08 00:29:20.86 EniIIYRYa.net
>>253
そりゃ、現実としてそういう建て付けになってんだから使うよ。
でも文字列だったら最初からもうちょっと抽象的な操作の方がいいわ。ポインタ使いたかったら&つけてもいいんだし。

255:デフォルトの名無しさん
19/07/08 00:44:01.80 YBWHLZTU0.net
>>253
一応初期化の時だけ char s[] = "..."; って書き方できるけどね。これは初期化だけの特別な書き方だな。

256:デフォルトの名無しさん
19/07/08 01:20:48.92 6nQUGxHg0.net
OSによっては遅延書き込みってしているだろう

257:デフォルトの名無しさん
19/07/08 02:05:54.23 YBWHLZTU0.net
やってるな。外付けのHDD付けた時なんかはするかしないか設定できたりして。

258:デフォルトの名無しさん
19/07/08 08:34:21.82 IKtCR6xL0.net
DOS時代、ディスクキャッシュはドライバーが必要だったな。

259:デフォルトの名無しさん
19/07/08 08:57:53.53 YymrlAAVd.net
str[9]="おはよう"
str[9]={'お','は','よ','う'}
こうやってまとめて配列に日本語を入れるのは出来るんだけど「お」、「は」、「よ」、「う」と一文字ずつ入れることって出来ますか?
英語ならstr[0]=…、str[1]=…って済むけど

260:デフォルトの名無しさん
19/07/08 09:43:06.34 tzeJFuHla.net
>>259
> こうやってまとめて配列に日本語を入れるのは出来るんだけど
え?できる?
>「お」、「は」、「よ」、「う」と一文字ずつ入れることって出来ますか?
wchar_t 型を使ってL付けたらできないか?

261:デフォルトの名無しさん
19/07/08 09:53:54.58 jiAfHW5M0.net
要素数を明示してるので、文中の代入ではなく、初期化のときの話だろうとは予測できるが
「入れる」というのは、代入を連想させるので、うまい言い回しではないかもね

262:デフォルトの名無しさん
19/07/08 11:00:59.71 sWBK4Oik0.net
>>253
関係ないけどconst違反だね
そのケースだけ特別に見逃すことになってるけど
>>255
その書き方はK&Rでは静的記憶域期間にのみ許されていた
なぜだかわかるか?

263:デフォルトの名無しさん
19/07/08 11:23:23.17 tzeJFuHla.net
>>262
そうだったっけ?そうだったような気もするが。
なかったのは自動変数だと毎回コピーすることになって無駄だからかな?

264:デフォルトの名無しさん
19/07/08 11:25:22.35 Y+Xu67y40.net
>>262
初回のみ限定警告100%オフ! 送料無料! だからね
いちおう違反ではないことになってる

265:デフォルトの名無しさん
19/07/08 11:45:28.78 IKtCR6xL0.net
>259
>str[9]={'お','は','よ','う'}
マルチバイト文字をこう書く時はエンディアンにも気をつけないとね。

266:デフォルトの名無しさん
19/07/08 12:17:44.27 tzeJFuHla.net
>>265
てか、それできる?

267:デフォルトの名無しさん
19/07/08 12:23:54.16 sWBK4Oik0.net
>>263
memcpyみたいのは言語自体に組み入れるべき機能ではないという判断だ
俺は今でもそう思っている

268:デフォルトの名無しさん
19/07/08 12:29:40.10 SgFxP6hn0.net
思ってるって……
じゃK&Rにはwhyは書いてないってこと?
なんでお前の脳みその中身を当てこしなきゃいけねーんだ
バカかこいつ?

269:デフォルトの名無しさん
19/07/08 12:30:19.48 sWBK4Oik0.net
>>265
エンディアンが同じでも解釈が違うことがあるぞ
printf("%x %x", 'あ', L'あ');
bcc32: a082 3042
cl: 82a0 3042
gcc: error

270:デフォルトの名無しさん
19/07/08 12:31:09.46 sWBK4Oik0.net
>>267
じゃあ言い直そう
- 思っている
+ 賛成している

271:デフォルトの名無しさん
19/07/08 12:31:47.98 sWBK4Oik0.net
くそ、安価ミスとは俺としたことが
- >>267
+ >>268

272:デフォルトの名無しさん
19/07/08 13:00:33.95 tzeJFuHla.net
>>267
なるほど。

273:デフォルトの名無しさん
19/07/08 13:43:50.72 IKtCR6xL0.net
>266
どのあたりに疑念を持ってるの?

274:デフォルトの名無しさん
19/07/08 13:58:51.22 tzeJFuHla.net
>>273
'あ' みたいなのは char じゃないから少なくとも警告出そうな感じするんだが。

275:デフォルトの名無しさん
19/07/08 14:09:16.87 IKtCR6xL0.net
int Code='ABCD';
なんて書き方できるから文字列はOK。(Code=0x41424344; と解釈)
全角文字の解釈はコンパイラ次第。unicodeやutf-8対応なら問題ないと思う。
S-JISはよく"\"が含まれる文字で誤作動起こすけど。

276:デフォルトの名無しさん
19/07/08 14:54:14.01 jiAfHW5M0.net
C99 6.4.4.4 Character constants で
 character-constant:
  'c-char-sequence'
  L'c-char-sequence'
 c-char-sequence:
  c-char
  c-char-sequence c-char
こうなってて文法的には 'ABCDEF' は許されるんだな ちょっと意外

277:デフォルトの名無しさん
19/07/08 15:31:05.17 sWBK4Oik0.net
>>275
printf("%x", Code);
bcc32: 44434241
cl: 41424344
gcc: 41424344

278:デフォルトの名無しさん
19/07/08 15:37:58.06 u+KjwOdz0.net
処理系定義の動作だから移植性は落ちるよね

279:デフォルトの名無しさん
19/07/08 20:12:45.44 84rxMJ1M0.net
文字定数は
Cではint型
C++ではchar型

280:デフォルトの名無しさん
19/07/08 20:54:00.78 ibRWBgM50.net
int *ptr;
↑なんですが、「int型のポインタ変数ptr」、それとも「int *型のポインタ変数ptr」のどちらでしょうか?

281:デフォルトの名無しさん
19/07/08 20:55:50.12 Fr0SEB8b0.net
int*型の変数

282:デフォルトの名無しさん
19/07/08 21:09:00.76 ibRWBgM50.net
>>281
読み方としては
int (イント) * (ポインタ) 型の変数
でしょうか
「ポインタ変数」と言った場合は「* (ポインタ)変数」という捉え方でいいのでしょうか?
「ポインタ」と言った場合に「*」を指すのは普通ですか?

283:
19/07/08 21:12:57.52 qs7HTSo50.net
>>282
好きなように把握すればよい、しかし int * の使われ方は決まっているのだから、それがすんなりできるかどうかが問題

284:デフォルトの名無しさん
19/07/08 21:24:04.62 /2nq94DTa.net
pointer to int

285:デフォルトの名無しさん
19/07/08 21:42:19.26 prK3AyGza.net
>>280
Cの場合は変数に*がくっついた形で宣言されていると考えた方が良い。というのは int *a, b; と書いた場合に a は int * 型だが b は int 型になるからだ。

286:デフォルトの名無しさん
19/07/08 22:54:53.21 ibRWBgM50.net
なんとなくわかりました
ありがとうございました

287:280
19/07/09 00:31:35.20 L+Vy/ftS0.net
規格書には
pointer to a character type
pointers to structure types
という文が頻繁に出てきますね
日本語で言ったら「char型へのポインタ」のほうが「charのポインタ型」より正しい気がします
>>284さんのpointer to intは日本語なら「int型へのポインタ」ですね
と思ったんですが規格書には
pointer type
も出てくるので、どっちでもいいということでしょうか
つまり「char型へのポインタ」=「charのポインタ型」ということになりますが

288:デフォルトの名無しさん
19/07/09 02:08:12.29 Mm2yqLXca.net
変数の宣言と型の宣言が同じ形というCの事情もありそうだが、そこは曖昧だと思うね。
アップキャストしたら単にポインタだし、ポインタ型と言う場面もあるだろう。
これいいね
URLリンク(cdecl.org)

289:デフォルトの名無しさん
19/07/09 09:14:08.91 gdYXIa6pa.net
typedef char *pchar; とすると pchar 型は「charのポインタ型」というとにはなる。

290:280
19/07/09 11:14:54.62 L+Vy/ftS0.net
ということはどっちでもいいんですね

291:デフォルトの名無しさん
19/07/09 11:27:52.60 knKJba5J0.net
気にしたことが無いくらいどうでもいい話。

292:デフォルトの名無しさん
19/07/09 12:21:07.04 J4x6YR7aa.net
引数のvoidが一体なんなのか考える方が有意義

293:デフォルトの名無しさん
19/07/09 12:41:16.87 jbK1WB2u0.net
引数なしの関数を書くときはvoidと書く
以上

294:デフォルトの名無しさん
19/07/09 12:59:36.67 PyDbCO5q0.net
voidって引数じゃないの?

295:デフォルトの名無しさん
19/07/09 15:08:36.62 jbK1WB2u0.net
引数に予約語使えるの?

296:デフォルトの名無しさん
19/07/09 15:44:50.86 +qcz+46H0.net
some_type foo() と戻りがあるのに、その戻りを捨てる意図で
(void)foo(); と呼び出すコードを見たことがあるような気がするが C++ かもしれん
最適化の際にうまいことしてくれるのを期待してるのかしら

297:デフォルトの名無しさん
19/07/09 15:55:38.40 td6qAd7k0.net
>>296
コンパイラかコードチェッカーのwarning抑止のためじゃないかな

298:デフォルトの名無しさん
19/07/09 16:02:30.30 +dEKq4+ba.net
Cでも使える。
一度も使ってない引数変数があるとか、関数の戻り値を使っとらんとかで警告が出る場合にくっつけるのが主だと思う。

299:デフォルトの名無しさん
19/07/09 16:03:09.93 NP6oYl9g0.net
> 引数なしの関数を書くときはvoidと書く
プロトタイプじゃなかったっけ

300:デフォルトの名無しさん
19/07/09 16:07:01.41 gdYXIa6pa.net
>>299
プロトタイプと違ったらエラーになる。

301:デフォルトの名無しさん
19/07/09 16:20:41.31 +qcz+46H0.net
>>297-298
なるほど、警告避けかー
引数に対してのは
callback 関数として、引数の型&数は限定されてるけど
実装時には一部の引数を使わずに実装できちゃうときに発生しそうね
void foo(int arg1, int arg2)
{
 /* 色々書くけど arg2 は使わない: callback 関数の都合で引数の型と数は変えられん */
 (void)arg2;
}

302:デフォルトの名無しさん
19/07/09 17:10:50.55 NP6oYl9g0.net
>>299
これ OKでしょ
int func(void);
int func()
{
return 0;
}

303:デフォルトの名無しさん
19/07/09 17:12:50.99 NP6oYl9g0.net
アンカミスった >>300

304:デフォルトの名無しさん
19/07/09 17:17:21.63 +qcz+46H0.net
>>302 のは 非ANSI の K&Rフォームで警告されるんじゃ
引数有りの記述では
 int func(int);
 int func(a)
 int a;
 { return 0; }
と等価

305:デフォルトの名無しさん
19/07/09 17:26:13.08 jbK1WB2u0.net
>>302
これアウトでしょ
int func(void);
int func()
{
return 0;
}
func(hoge);

306:デフォルトの名無しさん
19/07/09 17:28:26.22 PyDbCO5q0.net
>>302
VCだと
> warning C4255: 'func' : 関数プロトタイプがありません : '()' を '(void)' に変換します。
って警告出て、関数部分の引数を変えてしまってる

307:デフォルトの名無しさん
19/07/09 17:41:06.68 3UBru1uA0.net
>>302
おまえさん、自分のところで動作確認してるか? でたらめこくな

308:デフォルトの名無しさん
19/07/09 17:43:09.00 8Y9GhXx/M.net
char *p;
p = "str1";
p = "str2";
こんな風に文字列リテラルのポインタを付け替える時に前の文字列リテラルのメモリ領域を解放するにはどうすればいいの?

309:デフォルトの名無しさん
19/07/09 17:49:15.98 PyDbCO5q0.net
>>308
静的領域に確保しているから解放は無理

310:デフォルトの名無しさん
19/07/09 17:59:43.14 3UBru1uA0.net
exit関数を呼び出せば解放できるね

311:デフォルトの名無しさん
19/07/09 18:21:06.36 NP6oYl9g0.net
X 3010:2003 では
6.7.5.3 関数宣言子(関数原型を含む)
「並びの中の唯一の項目が void 型で名前のない仮引数であるという特別な場合,関数が仮引数をもたないことを指定する。」
6.9.1 関数定義
typedef int F(void);
F f, g;
int f(void) { /*... */ } // 正
int g() { /*... */ } // 正
という訳で
int func(void); /* prototype */
int func() /* definition */
{
return 0;
}
どこかまちがっているか

312:デフォルトの名無しさん
19/07/09 18:28:37.94 8Y9GhXx/M.net
>>309
まじですか。じゃあこのような書き方してたらいずれクラッシュするってことですか?
char *p;
while(1) {
//何かの処理
p = "hoge";
}

313:デフォルトの名無しさん
19/07/09 18:36:42.49 lRtOoeh80.net
それは同じ"hoge"のアドレスがロードされるだけ
文字列リテラルのポインタ扱うならconst char *使いなされ

314:デフォルトの名無しさん
19/07/09 18:43:38.45 gdYXIa6pa.net
>>312
文字列の定数は静的な領域に作られるだけで実行時に動的に作られたりしないのでそれは問題なし。

315:デフォルトの名無しさん
19/07/09 18:46:20.39 gdYXIa6pa.net
あ、でも、定数でなくても同じか。単にポインタ代入してるだけだもんな。

316:デフォルトの名無しさん
19/07/09 18:47:53.66 jbK1WB2u0.net
>>311
プロトタイプと同じだからOKだよね
>>302は何を言いたいのか分からんな

317:デフォルトの名無しさん
19/07/09 19:48:16.54 YXbnrG+I0.net
>>301
その場合は↓で良いはず
void foo(int arg1, int)
{
}

318:デフォルトの名無しさん
19/07/09 20:34:43.07 3UBru1uA0.net
>>311
おまえさんは「関数原型を含む」を、「関数原型についてのみ」と脳内変換しているのか?
> int func() /* definition */
これのどこに、void型で名前のない仮引数があるんだ?

319:
19/07/09 21:57:18.11 Rbs4mLR80.net
>>296
それは lint 対策ですよ

320:デフォルトの名無しさん
19/07/09 22:42:13.74 pf5t+DpRa.net
最近C言語学び始めた者ですが練習がてらトランプのブラック・ジャック的なものを作っています
そこで11以上がでた時10とするという単純なプログラムを書きたいのですがつまづいています。
ご教授頂ければありがたいです

321:デフォルトの名無しさん
19/07/09 23:16:49.68 PyDbCO5q0.net
>>320
パッと思いつくのは、要素数13の配列用意して
対応する番号の所に希望する数を入れておく

322:デフォルトの名無しさん
19/07/09 23:46:17.89 pf5t+DpRa.net
>>321
一応rand関数というのをつかって1~13までの数をランダムで出すようには組めたのですがそのランダムで出た数が11以上だった時10として扱うというのが組めません
やはり13個全部配列組む方が確実なのでしょうか

323:デフォルトの名無しさん
19/07/09 23:52:36.31 khnvGGZh0.net
ブラックジャックのルール全部適用させようとすると初心者には結構ハードル高いような気がする。

324:デフォルトの名無しさん
19/07/09 23:54:18.16 PyDbCO5q0.net
>>322
式でやりたいなら、
i>10? 10: i

325:デフォルトの名無しさん
19/07/09 23:59:20.27 pf5t+DpRa.net
>>324
ありがとうございます!早速試して見ます!

326:デフォルトの名無しさん
19/07/10 00:04:27.37 YFbFPCAXa.net
>>323
あんまり細かいことはさすがに手が出ないのでとりあえず
・11以上は10として扱う
・21超えたら負け
・1がでたら1か11好きな方を選べる
この3つだけできればとりあえずブラック・ジャックとしてゲームは成り立つかなと考えてます

327:デフォルトの名無しさん
19/07/10 00:04:44.92 q0FoS2hTa.net
カード52枚作るのがいいと思いますよ。
シャッフルもしがいがある。
配列の要素は見た目(ハートのJとか)を表す構造体。なんだったら実際の値も入れる。Aが微妙ですが。

328:デフォルトの名無しさん
19/07/10 00:14:34.49 YFbFPCAXa.net
>>327
作り始めた時52枚全部定義すれば本格的になるかなと思ったのですが、ご教授お願いしている身で申し訳ないんですけど少し面倒だなと思ってしまいましてorz
やっぱりちゃんとしたブラック・ジャックを作りたいなら52枚全部定義した方がいいですよね

329:デフォルトの名無しさん
19/07/10 02:58:29.54 Jh4oErcv0.net
そうしないと確率が変わってしまうのではないかな。

330:デフォルトの名無しさん
19/07/10 07:53:06.60 c5IU7AfX0.net
某ゲーム内のブラックジャックは同じカードが自分と相手に出てきた。
カジノのブラックジャックだとトランプを何セットも混ぜてやってるらしいね。

331:デフォルトの名無しさん
19/07/10 08:45:30.08 FsJSBTR40.net
絵札の数が決まっていると残りの絵札を数えれば勝てるらしい。

332:デフォルトの名無しさん
19/07/10 08:48:48.34 q0FoS2hTa.net
実際は6セットとか使うわけです。
有限なのでカウンティングができる。
過去の結果に依存するってことはサイコロ使うような無記憶な試行ではないってことだね。

333:デフォルトの名無しさん
19/07/10 09:15:26.99 1T4zvF6/x.net
カウンティングだけで勝つのは驚異的な記憶力がないとなかなか難しいと聞く。
小説「マルドゥックスクランブル」でのBJシーンは有名だけど、読んででも半分も理解できなかった記憶があるわ。

334:デフォルトの名無しさん
19/07/10 09:18:07.74 8OTK1K8V0.net
麻雀よりは簡単

335:デフォルトの名無しさん
19/07/10 09:20:35.29 8OTK1K8V0.net
麻雀の方が簡単か
すまん

336:デフォルトの名無しさん
19/07/10 09:37:28.19 z7915HRG0.net
BJのカードカウンティング、結構な種類があるんだね
URLリンク(vegasdocs.com)

337:デフォルトの名無しさん
19/07/10 17:29:16.11 6YiGFI5ep.net
麻雀の役判定、得点計算できるライブラリってある?

338:デフォルトの名無しさん
19/07/10 18:23:48.87 Tg8SA/BfM.net
>>337
ググれ

339:デフォルトの名無しさん
19/07/10 18:44:07.65 rAQ8nA0Y0.net
>麻雀の役判定、得点計算
あると思う
判定も計算も難しくはないし
無くても自製可能なレベル

340:デフォルトの名無しさん
19/07/10 19:16:43.40 iZJC1PSD0.net
ものすごく基礎的な質問で申し訳ないんだけどテトリスのようなゲームを作るとき、実行中のプログラムとは別にn秒ごとにあるプログラムを実行するようなのってどうすればいいの?
キーボードからの入力待ちの状態と並行して時間の計測とブロックを落下させるみたいなの

341:デフォルトの名無しさん
19/07/10 19:21:28.73 rAQ8nA0Y0.net
OSによって違いがあるけれど、
指定した時間間隔でイベントを発生させ
そのイベント通知を受けて処理を行うようにする

342:デフォルトの名無しさん
19/07/10 19:24:28.60 c5IU7AfX0.net
DOSならVSYNC割り込みとかタイマ割り込みっていうのがある。

343:デフォルトの名無しさん
19/07/10 19:37:55.05 b2TgwlJAa.net
入力待ちしてるはずなのになんでブロックは落ちてるんだ

344:デフォルトの名無しさん
19/07/10 19:48:07.07 wGS7rpFP0.net
待ってないから。

345:デフォルトの名無しさん
19/07/10 19:48:36.59 YAEkGiKl0.net
ブロッキング/ノンブロッキング
同期/非同期

346:デフォルトの名無しさん
19/07/10 19:59:01.20 iZJC1PSD0.net
うーん…前提から間違ってるのか?
ブロックを生成した後、キーボードからの入力を待ちながら一定時間毎に落下させるのかと思ってたけど、一定時間毎に落下させる中でキーボードからの入力があればそちらを実行する感じ?

347:デフォルトの名無しさん
19/07/10 20:00:37.82 b4vpo7xg0.net
非同期処理

348:デフォルトの名無しさん
19/07/10 20:08:27.28 iZJC1PSD0.net
なるほど
同期処理、非同期処理を使えば割り込ませたりすることができるのか
まだほとんど理解できてないけどある程度方向性は見えてきた気がする
サンクス

349:デフォルトの名無しさん
19/07/10 20:10:55.04 rAQ8nA0Y0.net
>>346
マルチスレッドって分かるかな?
同時に複数の処理を行うんだけど
多分イメージしているプログラムは
それを利用する事で出来ると思う
ただし、OSが何かによって実装方法が変わってくる

350:デフォルトの名無しさん
19/07/10 20:23:29.74 nUGO9xykM.net
>>346
そうだよ。古典的なゲームは、1秒間に30回または60回、入力の取得と状態の更新と画面の更新を行う。
ギャラクシアンもといタスクシステムでぐぐれ

351:デフォルトの名無しさん
19/07/10 20:48:50.43 lDiVjXP/a.net
テトリス程度の(コンピュータからしたらゆっくりな動きの)ゲームならマルチタスクやマルチスレッドにしなくても順番に処理すればできそうだけどな。
キー入力については何も押されてなかったらすぐに処理を抜けるようにしとけば良い。
で、画面書き換えたりする処理して、またキー入力されてるかを見て、という感じで繰り返す。
キー入力されてたらそれによって変化するパラメータ(テトリスならブロックの向き等)を変更する。

352:デフォルトの名無しさん
19/07/10 21:05:28.75 gc55JO0Da.net
マルチスレッドだって順番だろう
昔はコアが一つしかなかったんじゃよ

353:デフォルトの名無しさん
19/07/10 23:25:08.72 QCGATMsz0.net
ソフトタイマ ポーリング 状態シーケンス制御

354:デフォルトの名無しさん
19/07/11 01:13:09.90 9IeQUu2b0.net
>>352
順番って、時分割で切り替わるって意味?
しかしそれは普通はOSレベルでやってるので切り替え部分までユーザが考える必要はないね。
そこまで自分で作らねばならないようなOSなし環境や昔の 8 bit CPU みたいなのだと別だが。

355:デフォルトの名無しさん
19/07/11 02:10:12.63 j5kiUrVb0.net
>>351
それってキー入力取り逃したりしないの?

356:デフォルトの名無しさん
19/07/11 06:43:27.53 bnplrtu80.net
>>352
マルチスレッドじゃなくて単なるループだと思うが

357:デフォルトの名無しさん
19/07/11 07:08:26.92 l57S3jiM0.net
ハードウェア割り込みとマルチタスクOSがごっちゃになってるんだろ

358:デフォルトの名無しさん
19/07/11 08:25:52.40 Osy0Da+v0.net
>>355
処理のサイクル(1/30秒 や 1/60秒)の間に off->on->off とパルス状に入力されると取りこぼすよ

359:デフォルトの名無しさん
19/07/11 09:26:29.26 42U1oSKOa.net
高橋名人の16連射でもコンピュータからすれば物凄く遅いスピードだから問題ない。40年ぐらい前のクロック4MHzで動く 8 bit CPU でも余裕だ。
それにゲームなら一回や二回入力が失敗しても文句を言うやつはまずいない。

360:デフォルトの名無しさん
19/07/11 10:34:43.73 nMYI1ORia.net
>>356
まあユーザースレッドなんて言葉もあるけども
昔のCPUだとぶんまわすしかなかったけど、ある意味わかりやすい気がするわ。
リッチな環境でアクションゲームってどうやって作るの?条件変数とか使うのかね?

361:デフォルトの名無しさん
19/07/11 11:38:42.52 KgOJMZpN0.net
>>358
炎のコマの解説は嘘だったんだよな
あれ以来、人間を信用しなくなった

362:デフォルトの名無しさん
19/07/11 12:18:10.67 xCkJ5LaR0.net
組み込みでは、0.1~1秒など、長時間に渡って、
何回もキーを押しているかどうか確認してから、機械を動かす
そうやって、ボタンを確実に押しているかどうかを判断する
1回で判断すると、ボタンの接触不良で、
モーターのon/off が繰り返されてしまうから、短時間で判断できない
この判断を、ハードウェア回路で行うのと、ソフトウェアで行うのと、2つの方法がある
詳しくは、組み込み(エンベッド)情報処理資格の教科書を参照

363:デフォルトの名無しさん
19/07/11 12:23:27.06 ZSl7eG940.net
一々教科書を読まなくても「組み込み チャタリング」などで調べれば分かるのでは

364:デフォルトの名無しさん
19/07/11 15:03:35.76 vYMpRAzp0.net
Windows初期はVsync待ちとかウェイトかけずに処理してて、CPU速度が上がったら実機より速くなって(60fps以上)ゲームにならんのもあったわ。

365:デフォルトの名無しさん
19/07/11 21:07:12.90 W9yQmyPFa.net
エイリアンの動きが速すぎて穴を掘ってる暇がないと

366:デフォルトの名無しさん
19/07/11 21:08:10.26 +FsFkp9e0.net
それ何ていう平安京エイリアン?

367:デフォルトの名無しさん
19/07/11 21:47:38.69 BSTUJEPb0.net
space panic

368:デフォルトの名無しさん
19/07/11 21:55:53.90 pe38QhTW0.net
Linuxってconio.h使えないのかよ
getcheもkbhitも駄目とか面倒臭いな

369:蟻人間
19/07/11 21:57:23.76 JEmOAlRld.net
コンソールで色を付けるならpdcurse使え。ncursesは古い

370:蟻人間
19/07/11 21:57:56.88 JEmOAlRld.net
pdcurses

371:デフォルトの名無しさん
19/07/11 22:15:03.30 BSTUJEPb0.net
ioctl

372:デフォルトの名無しさん
19/07/12 04:02:10.72 30ixxYg+0.net
pdcursesってcursesのWindows実装なんだけどな

373:デフォルトの名無しさん
19/07/12 12:58:51.21 4AR7dspsa.net
>>368
ncursesとかを使ってそういうラッパー関数作れば良いのではないかな。

374:デフォルトの名無しさん
19/07/12 18:40:44.71 q8HbeEfz0.net
Cで面白いワンライナーとかない?ICCCMとかにも案外ワンライナーという分類はないんだよね。

375:デフォルトの名無しさん
19/07/12 19:20:34.57 rA9WmwUa0.net
1行と言うのは難しそうだが、7行で良ければ
URLリンク(uguisu.skr.jp)

376:デフォルトの名無しさん
19/07/12 19:24:01.49 Vt6HtS1w0.net
BASIC時代に1画面プログラムってのがあったな。

377:デフォルトの名無しさん
19/07/12 19:40:11.46 aSZPouska.net
1行の定義って何?

378:デフォルトの名無しさん
19/07/12 19:56:09.02 pYBNura/0.net
>>373
既に世界中で書かれて公開されている予感

379:デフォルトの名無しさん
19/07/12 19:56:09.31 zAF1v8/n0.net
\n

380:デフォルトの名無しさん
19/07/13 01:22:11.42 +XrRzYc00.net
>>378
結婚して///

381:デフォルトの名無しさん
19/07/13 06:35:45.40 GFbMPvry0.net
#defineを-Dでやれば1行にできるかも
URLリンク(www.ioccc.org)

382:デフォルトの名無しさん
19/07/13 07:12:15.59 THUdwCLa0.net
そもそも改行しないでプログラム書けば一行

383:デフォルトの名無しさん
19/07/13 13:07:12.18 BfevEbDR0.net
cppディレクティブは1個1行

384:デフォルトの名無しさん
19/07/14 22:19:01.35 uXqqdpfBM.net
int i = 0;
int s[2];
s[i] = i++ + 1;
printf("%d", s[1]);
これの出力が1になります。これは理解できません。
事実、3行目は以下のようにすると出力は0になります。
s[i++] = 1;
また、3行目は以下のようにすると出力は0になります。
s[i] = i++;

385:デフォルトの名無しさん
19/07/14 22:22:40.77 /MgLlV8v0.net
>>384
URLリンク(www.kouno.jp)

386:蟻人間
19/07/14 22:30:43.07 uXkiDi0Ud.net
「式の評価」という言葉はわかるか?
1+1という式を評価すると2になる。
C/C++の後置演算子では、全ての評価が終わった後で変数を書き換える。
i++は、++がiの後ろについているから、後置だ。i++を評価すると、評価した瞬間の値はiであり、そして式全体の評価が終わると、iはプラスいちになる。
後置の反対は前置演算子であり、式全体の評価の前に変数を+1もしくは-1する。

387:デフォルトの名無しさん
19/07/14 22:48:05.04 uXqqdpfBM.net
演算規則に従い、インクリメント後置なので、元の3行目の式は
s[i(==0)] = i(==0) + 1
i = i + 1
の順に行われて結果、
s[0]に0が代入されてs[1]の値は初期値0だと思うのですが。
事実、3行目がs[i] = i++;なら上の通りの順で実行されます。
演算規則が無視されて結果がコンパイラ依存になる理由は何ですか?

388:デフォルトの名無しさん
19/07/14 22:48:51.03 uXqqdpfBM.net
私は間違えました、s[0]に1が代入されます。

389:デフォルトの名無しさん
19/07/14 22:52:20.27 uXqqdpfBM.net
また、3行目を以下の通りにすると演算規則通りに結果2が得られます。
s[i] = ++i + 1;

390:デフォルトの名無しさん
19/07/14 22:53:42.53 uXqqdpfBM.net
順番はこの通りです、
i = i + 1
s[i(==1)] = i(==1) + 1

391:蟻人間
19/07/14 23:13:20.84 uXkiDi0Ud.net
>>387
主な原因は順序が決められないことと最適化のためらしい。詳しくは知らん

392:デフォルトの名無しさん
19/07/14 23:15:43.21 uXqqdpfBM.net
i = i++;
これの結果が未定義なのは直感的に理解できます。
代入とインクリメント増分の関係が不明だからです。
s[i] = i++;
これの結果が未定義なのは直感的に理解できません。
演算規則に従えば、iはインデックスとしての間接参照でしかないからです。

393:デフォルトの名無しさん
19/07/14 23:18:12.85 XOVWGW1L0.net
>>387
左辺と右辺の評価順序は未定義だからだ
gccとclとか違う環境で試してみれば分かる

394:デフォルトの名無しさん
19/07/14 23:28:34.66 uXqqdpfBM.net
int x = 2*i + i++;
それでは、これの結果もまた未定義ですか?

395:デフォルトの名無しさん
19/07/14 23:55:54.94 XOVWGW1L0.net
iの評価は何回だ?
評価が複数回入る式は書くなということだ
仕事でそんなコード書いたらどやされるぞ

396:デフォルトの名無しさん
19/07/15 00:20:47.65 wok43DsHM.net
私は勉強のためにコードを書いています。
コードがどのような動きをするか興味があります。
int a = 1;
int x = (a = a) + a;
それでは、この式ではxは定義されますか?
左辺と右辺の評価順序に関わらず、答えは同じです。

397:デフォルトの名無しさん
19/07/15 00:33:43.29 mPPf+F39a.net
されます

398:デフォルトの名無しさん
19/07/15 00:46:03.12 E9YINa1F0.net
そんな無意味なコードから何を学ぼうとしているのか分からんわ

399:デフォルトの名無しさん
19/07/15 00:55:35.98 wne2EA+X0.net
優先順位や式の評価順が曖昧かもって考えるソース、
書いてて気持ち悪くなりませんか?私はなりますよ。

400:デフォルトの名無しさん
19/07/15 01:14:29.35 Voexy70f0.net
>>394
副作用完了点でググってこい

401:デフォルトの名無しさん
19/07/15 02:04:55.42 wok43DsHM.net
while((s[i++] = t[j++]) != '\0') ;
元々気になったのは、tをsにコピーするこのコードです。
これを見て、他にインクリメントで簡略化出来そうなコードを考えています。

402:デフォルトの名無しさん
19/07/15 02:10:16.53 wok43DsHM.net
for(;t[j] != '\0'; j++){
s[i] = t[j];
i++;
}
s[i] = t[j];
従来の私なら、このようにコードを書いていました。
新しいコードの記述なら1行で書けます。

403:デフォルトの名無しさん
19/07/15 02:19:48.51 wok43DsHM.net
while((s[i++] = t[i + 1]) != '\0') ;
そこでtをsに1つずらしてコピーするコードをこのように書けないか考えていたら、未定義の問題が生じました。
私は演算規則から考えてこのコードは上手く働くと思いました。

404:デフォルトの名無しさん
19/07/15 03:09:03.53 mPPf+F39a.net
俺はmemcpy使う
性能は知らん

405:デフォルトの名無しさん
19/07/15 07:21:57.18 ex33LrHm0.net
せっかくC-FAQのリンク書いたのに…
バカって人の言う事聞かないからバカのままなんだな…

406:デフォルトの名無しさん
19/07/15 07:41:01.06 Voexy70f0.net
>>401
「簡略化」とは、何を目指しているんだ?
行数が少ない方がいいとか考えているならバカな考えだからやめとけ。
コンパイラの最適化で同じコードになるような範囲の変形で行数を減らしたところで、可読性を下げてるだけで何のメリットもないぞ。

407:デフォルトの名無しさん
19/07/15 08:20:49.21 wok43DsHM.net
私は行数の少なさというよりはむしろ見た目の単純さで読みやすいと感じます。
C-FAQのリンクは事実が書かれているのみで演算規則が無視される理由が理解できませんでした。

408:デフォルトの名無しさん
19/07/15 08:32:41.44 Voexy70f0.net
>>407
演算規則って何のことだ?
構文解析や演算子の結合の優先順序と副作用の発生するタイミングはまた別の話だぞ。

409:デフォルトの名無しさん
19/07/15 09:10:34.41 ex33LrHm0.net
どうせちゃんと読んでないか理解する能力がないんだろうな…

410:デフォルトの名無しさん
19/07/15 09:22:44.79 IpJNQ16e0.net
>>389
それはおかしいだろう
算術プラスの第1オペランドと第2オペランドの評価順序は未規定だぞ

411:デフォルトの名無しさん
19/07/15 10:07:24.78 Voexy70f0.net
>>410
未規定の動作がたまたま自分の期待する動作と同じになったということが理解できてないんだろうね。人の話を聞かない相手に何を言ってもダメそうだね。

412:デフォルトの名無しさん
19/07/15 10:40:21.72 r5uSGSCiM.net
愛繆私は未定義な理由について理解できません。
なぜなら、演算規則に従い前置インクリメントを代入の評価より先に行えば、389の結果は一つと決まるからです。
しかし、評価順序が未定義となりコンパイラに依存となる理由は何ですか?
この式を定義することによる問題の例を理解したいです。

413:デフォルトの名無しさん
19/07/15 10:44:14.06 mPPf+F39a.net
左辺は

414:デフォルトの名無しさん
19/07/15 10:45:20.28 r5uSGSCiM.net
つまり、私は未定義と規定されている理由を知りたいです。
定義することで発生する問題の例などです。

415:デフォルトの名無しさん
19/07/15 10:49:35.01 6m2OA1zn0.net
この人の言ってる「演算規則」って何なんだろうね。
「C言語 "演算規則"」でググっても、それらしきものは出てこないし。

416:デフォルトの名無しさん
19/07/15 10:57:10.32 r5uSGSCiM.net
int i = 0, j = 0;
int x = i++;
int y = ++j;
これです。xでは代入の後に後置インクリメントされます。(x = 0)
yでは代入の前に前置インクリメントされます。(y = 1)
s[i] = ++i + 1;
つまりこの式では代入の前に前置インクリメントされます。(次と等価です、)
i = i +1;
s[i(==1)] = i(==1) + 1;

417:デフォルトの名無しさん
19/07/15 10:59:07.47 mPPf+F39a.net
>>414
だから、左辺は

418:デフォルトの名無しさん
19/07/15 10:59:28.08 r5uSGSCiM.net
これは、未定義と規定されていますが、理由が理解できません。
私が示した通り、定義することによる問題の例は何ですか?

419:デフォルトの名無しさん
19/07/15 11:01:03.87 r5uSGSCiM.net
389の中では、左辺はs[1]です。
なぜなら、代入より前にiが前置インクリメントされます。

420:デフォルトの名無しさん
19/07/15 11:01:37.73 r7SsHRFS0.net
i++のポストインクリメントとi+1の評価順が不定だから

421:デフォルトの名無しさん
19/07/15 11:02:04.90 E9YINa1F0.net
これ読んで分からないなら諦めろ

未規定の動作とは、複数考えられる動作のうち、どれが実行されるかの要求が課されない動作のこと。
未規定の動作への依存で移植性が低下します。
未規定の動作
・部分式が評価される順序、及び副作用が発生する順序。
ただし関数呼出しの()、&&, ||, ?:, カンマ演算子は除く。(6.5)
・代入演算子のオペランドが評価される順序。(6.5.16)
未規定の動作
URLリンク(www.c-lang.org)
未定義の動作
URLリンク(www.c-lang.org)

422:デフォルトの名無しさん
19/07/15 11:04:11.05 r5uSGSCiM.net
i++のポストインクリメントとi+1の評価順が不定な理由は何ですか?

423:デフォルトの名無しさん
19/07/15 11:07:31.48 r5uSGSCiM.net
i = i++;
これが未定義なのは理解できます。
しかし、389の中で私が示した通り、の定義をすると発生する問題の例は何ですか?

424:デフォルトの名無しさん
19/07/15 11:09:44.83 ex33LrHm0.net
未定義な理由?
言語作った奴がそう決めたから
要するに「仕様だから」
そう決めた理由は想像になるけど最適化しやすい(と言うかそうしないと最適化の妨げになる)と考えたんだろうと思うよ

425:デフォルトの名無しさん
19/07/15 11:12:06.88 mPPf+F39a.net
>>419
なんで?
その添字いつ評価されんの?
演算子[]の中身だよ
カッコだけどvoid書いちゃだめだよ

426:デフォルトの名無しさん
19/07/15 11:12:37.37 3cpTbRIL0.net
インクリメントは式全体の前か後に実行されるからだろ
式の途中で実行されるとかあるの?

427:デフォルトの名無しさん
19/07/15 11:19:52.48 r5uSGSCiM.net
定義すると最適化の妨げになるという理由は、私には反論する知識は全くないので了承します。私は理解しました。

428:デフォルトの名無しさん
19/07/15 11:22:41.60 r5uSGSCiM.net
425の中で、書かれているように、実際には、演算規則でsのインデックスは0でした。
私は[]の優先を見落としていましたが、私が述べたかったことは、演算規則の優先で順番は決定できると思うことでした。

429:デフォルトの名無しさん
19/07/15 11:23:12.12 3cpTbRIL0.net
最適化の妨げにはならないだろ
コンパイラー簡単に作れるとかじゃないの

430:デフォルトの名無しさん
19/07/15 11:25:19.08 b7u0RgVG0.net
現行のCの仕様に文句があるなら、ANSI?ISO?の仕様策定に参加でもすればいいんじゃね?

431:デフォルトの名無しさん
19/07/15 11:29:05.40 IpJNQ16e0.net
>>411
すまん
俺はとんでもない失言をしていて
突っ込まれるの覚悟しておとなしく待ってたんだが

432:デフォルトの名無しさん
19/07/15 11:36:42.62 ZvCggxzR0.net
一通り勉強しましたが、次に何をやったらいいのか分かりません!
何も作れません!
どうしたらいい?

433:デフォルトの名無しさん
19/07/15 11:38:20.09 mPPf+F39a.net
>>428
そりゃ決定するための規則を作れば決定するけど、めんどくさいじゃん

434:デフォルトの名無しさん
19/07/15 11:39:31.38 E9YINa1F0.net
>>432
作りたいものが無いなら無理に作らんでもいいじゃん

435:デフォルトの名無しさん
19/07/15 11:40:09.15 3cpTbRIL0.net
>>432
散歩したり 景色を見たり…
昼寝したり 何もしない
そのうちに急に書きたくなるんだよ

436:デフォルトの名無しさん
19/07/15 12:05:05.25 ex33LrHm0.net
>>426, >>429
> インクリメントは式全体の前か後に実行されるからだろ
> 式の途中で実行されるとかあるの?
どのように実装してもいい
並列に処理することすら可能
と言うような最適化を妨げないための仕様

437:デフォルトの名無しさん
19/07/15 12:24:44.13 E9YINa1F0.net
要するに++,--は混ぜるな危険ってこと

438:デフォルトの名無しさん
19/07/15 12:36:46.00 IpJNQ16e0.net
能なしど低脳

439:デフォルトの名無しさん
19/07/15 12:47:17.16 0wrdUuzC0.net
>>403
>while((s[i++] = t[i + 1]) != '\0') ;
for(;(s[i] = t[i + 1]) != '\0';++i) ;
これじゃ駄目な理由ってなんだろう

440:デフォルトの名無しさん
19/07/15 12:55:44.11 wne2EA+X0.net
評価順序以前にループ条件が直感的に分かりにくい様なコードは書くべきでない

441:デフォルトの名無しさん
19/07/15 12:56:34.33 14ut6KBx0.net
for(①;②;③)
この123が全部必要だと思ってるんじゃね

442:デフォルトの名無しさん
19/07/15 13:04:03.21 Voexy70f0.net
>>431
こちらこそすまん。>>411>>410宛ではなく>>409宛だった。

443:デフォルトの名無しさん
19/07/15 14:30:35.03 y88H95dP0.net
MISRA-C 2004 の100ルールを守っていないソースコードは、読むに値しないw
まず、コーディングルールを5年勉強しろ!w

444:デフォルトの名無しさん
19/07/15 14:33:44.55 Voexy70f0.net
>>443
その特徴的な書き方はいつものRuby大好きマンか?
バカなこと言ってないで巣に帰れ。

445:
19/07/15 15:05:29.64 Nn+acajv0.net
>>443
MISRA なんて鎖や束縛を作りたがる「管理職」の思考法でしょう?なんでそんなものに従わなければならないのでしょうかね

446:デフォルトの名無しさん
19/07/15 15:14:40.80 mPPf+F39a.net
ルールはあってもいいけど、MISRAはあれアホだよね。
考えたやつお前はCを使うなよっていう。

447:デフォルトの名無しさん
19/07/15 15:25:22.82 ex33LrHm0.net
>>446
どこがアホなのか詳しく書いてみ

448:デフォルトの名無しさん
19/07/15 15:26:34.84 mPPf+F39a.net
>>447
rubyが嫌になったってことですか?

449:
19/07/15 15:28:03.17 Nn+acajv0.net
>>446
あの阿呆なMISRAを制定した人間の種族はなにか、どんな属性か?得意な思考方法、苦手な思考方法は?信条・信念は?
というところには興味があります、そのためだけに MISRA を読んでいたりします

450:デフォルトの名無しさん
19/07/15 16:02:12.44 3UWFYY1V0.net
>>432
自分が作りたいものを作れ。
作る技術がまだ足りないならそれについて学習したり研究したりしろ。
一つ間違えてはいけないことは、自分の作りたいものを今の自分が持っている技術力で出来る範囲内に無理に収めないようにすることだ。
収めれば実現はたやすいが飛躍はできず本当にやりたかったことには届かない。

451:デフォルトの名無しさん
19/07/15 16:06:07.03 QcIx6aGf0.net
MISRAは実際の不具合を分析して作られたいわばバットノウハウ集だけど、言い換えると最低限のバカ避け。
バカがバカな不具合出すもんだからその他の人が迷惑を被る。
ま、バカはプログラム作るなって事だ。

452:443
19/07/15 16:14:22.25 y88H95dP0.net
組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、MISRA‐C研究会、2006
この研究会は、トヨタなど大企業から、数十人のベテが集まって、
欧州人に聞きながら、完成された本w
未だに、コーディングルールのバイブルだろがw
元々は、Andrew Koenig の本
C Traps and Pitfalls, 1988, c1989
Cプログラミングの落とし穴

453:デフォルトの名無しさん
19/07/15 16:20:24.64 3cpTbRIL0.net
自分が馬鹿だとしっている賢い人はMISRAを使うということか

454:デフォルトの名無しさん
19/07/15 16:26:07.09 IpJNQ16e0.net
ブランドにすがるだけで自分の頭で考えないやつは相手にならん
あれ読んでて異論を持つことが全くないやつはその疑いが強い

455:デフォルトの名無しさん
19/07/15 16:34:38.99 ex33LrHm0.net
>>454
だからどこに異論持ってるのか書けよ
もしかしてグダグダ言うだけ君なの?w

456:デフォルトの名無しさん
19/07/15 16:42:13.17 IpJNQ16e0.net
命令すんな
そもそも自分が書かねえくせに

457:
19/07/15 16:43:21.75 Nn+acajv0.net
>>452
>この研究会は、トヨタなど大企業から、数十人のベテが集まって、
トヨタってコーディングを製造と言い切っちゃう人たちの集まりでしょう?そんな人たちの考え方って信じていいのでしょうかね…

458:デフォルトの名無しさん
19/07/15 16:48:48.65 ex33LrHm0.net
>>456
どうせ書けないんだろ、無理すんなよw

459:デフォルトの名無しさん
19/07/15 16:49:33.71 ex33LrHm0.net
>>457
信じるのはダメだと思うよ
内容見て判断しなきゃ

460:デフォルトの名無しさん
19/07/15 16:51:54.40 Voexy70f0.net
>>452
お前さんはいつも、有名な誰それがこう言った!とか、なんとかの本にこう書かれていた!とか、他人の発言を字面だけなぞって記憶するだけだから、中身の本質も適用すべき場面も長所短所も理解せずに垂れ流して害悪にしかならないから、もういい加減消えてくれないか?

461:デフォルトの名無しさん
19/07/15 17:02:08.44 14ut6KBx0.net
多分MISRAはΣ計画とセットだったんじゃねえの
とするとゾンビだよ

462:443
19/07/15 17:25:49.24 y88H95dP0.net
>>457
日本の研究会の考え方・思想は、ほとんどない!
MISRA-C は、Andrew Koenig の本を参考にして、欧州人が作ったから
日本の研究会は、各ルールの例題を作って、誰でもわかるように解説した。
各ルールは、こういう事を言ってます、という解説書
江添 亮の「C++11/14 コア言語」のみたいな本。
無数の例題を並べて、各ルールを解説した本
だから、この2冊は、神の書と言える!

463:デフォルトの名無しさん
19/07/15 17:32:05.00 dKUxLoi20.net
ルールとかくそどうでもよくね
動いて読めればそれでいい

464:デフォルトの名無しさん
19/07/15 17:32:21.62 IpJNQ16e0.net
>>458
ブーメラン乙

465:デフォルトの名無しさん
19/07/15 17:43:32.93 ex33LrHm0.net
>>464
バカなのか?
俺は別に異論があるとは言ってない
異論があるなら書けよって言ってるだけ
俺に何を書けって言ってるんだよw

466:デフォルトの名無しさん
19/07/15 17:46:56.60 IpJNQ16e0.net
>>465
またブーメランかよ、ワンパターンなやつだな
俺はさっき相手にならんと言ったはず

467:デフォルトの名無しさん
19/07/15 17:47:07.64 biXPcN21d.net
落ちものゲーム作れたと思ったけど落下処理の度に今表示中のものが上にズレて処理後のが新しく表示される仕組みのせいで目が死んだ
これダメな奴だ

468:デフォルトの名無しさん
19/07/15 18:01:17.82 ex33LrHm0.net
>>466
ハイハイ、結局具体的には何も言えないグダグダ君だったなw

469:デフォルトの名無しさん
19/07/15 18:41:39.94 IpJNQ16e0.net
煽っても情報は得られない
インタビューの下手な人だな

470:デフォルトの名無しさん
19/07/15 19:25:33.92 ex33LrHm0.net
情報持ってない奴からなにか得ようとしてるってか?
心配するなよ、お前に期待なんてしてないからw

471:デフォルトの名無しさん
19/07/15 20:06:52.59 14ut6KBx0.net
githubに存在するMISRA適合のソースコードとかどんだけあるんだよ

472:443
19/07/15 20:23:31.95 y88H95dP0.net
そのルールを守らないという、逸脱手続きをすれば、OK
トヨタでも、MISRA-C で採点したら、5/100点(ルール)しか取れなかったとかw
70~80点は、欲しい

473:デフォルトの名無しさん
19/07/15 20:27:21.89 QcIx6aGf0.net
>>472
それはそうなんだけど、逸脱したらレビューと品質記録が必須になるので逸脱しない方向へのバイアスが強くなる。
結果、強制されてるのと同じになっちゃう。

474:デフォルトの名無しさん
19/07/15 20:28:56.79 dKUxLoi20.net
ちなMISRAってどんなの?
pdfのリンクはってれ

475:443
19/07/15 20:31:45.40 y88H95dP0.net
例えば、Linux では、関数の冒頭部分に、return がよくある。
冒頭部分で、処理しないものをはじいてしまう
でも、MISRA-C では、関数内で、return は、最後に1つしか使えない。
複数箇所に、出口があってはならない
そのルールを守らないなら、逸脱手続きをすればよい。
その代わりに、点数が下がっていく

476:デフォルトの名無しさん
19/07/15 20:32:43.56 ex33LrHm0.net
>>471
ほとんどないんじゃね
>>451が言う通りバカ避けだから
>> 関数は、その最後に1つだけの出口を持たなけらばならない
みたいに適合させようとすると人によってはちょっと書き辛いルールもあったりするし

477:デフォルトの名無しさん
19/07/15 20:33:46.38 ex33LrHm0.net
あっ、被ったわ
みんな結構このルールに抵抗あるんだなw

478:443
19/07/15 20:35:21.08 y88H95dP0.net
>>474
「misra-c 2004」「misra-c 2012」で検索して!

479:443
19/07/15 20:37:59.21 y88H95dP0.net
他にも、MISRA-C では、2重ループ内から、一気に脱出できないから、フラグを持ちまわる事になる
このルールも嫌われる

480:443
19/07/15 20:48:48.44 y88H95dP0.net
組み込みとか医療用では、バグると簡単に人が死ぬから、
MISRA-C を勉強していない香具師が、コーディングするとヤバイ!
だから、コーディングできる資格を作るべきだっていう話も聞く

481:デフォルトの名無しさん
19/07/15 20:50:33.69 dKUxLoi20.net
なんでルールブックが有料やねんあほか勝手にやってろ

482:デフォルトの名無しさん
19/07/15 21:07:10.69 IpJNQ16e0.net
>>476
語るに落ちたな
ブランドvsブランドの対戦成績を
自分の頭で考えないブランド志向なやつに出せるわけがない

483:デフォルトの名無しさん
19/07/15 21:19:39.89 pdudwpaZ0.net
>>481
検索したら出てきた
URLリンク(www.c-lang.org)

484:デフォルトの名無しさん
19/07/15 21:36:18.18 r7SsHRFS0.net
4.12 必要 動的なメモリ割り当てを使用してはならない
って酷くね

485:デフォルトの名無しさん
19/07/15 21:47:13.82 Xch0qlQL0.net
俺以外は絶対守れよって思うルールも多々ある

486:デフォルトの名無しさん
19/07/15 21:57:44.30 ex33LrHm0.net
>>482
何を言ってるのか自分でもわかってないだろww
ブランドとかバカじゃね

487:デフォルトの名無しさん
19/07/15 21:58:24.78 QcIx6aGf0.net
関数の中盤以降からreturnするならともかく、早期returnまでも認めないのはナンセンスだよな。
杓子定規すぎるわ。

488:デフォルトの名無しさん
19/07/15 22:00:39.84 ex33LrHm0.net
>>484
組込みだと実行時間が読めなくなるのとフラグメンテーションで総容量足りててもエラーになることがあるからしょうがない

489:デフォルトの名無しさん
19/07/15 22:06:28.61 IpJNQ16e0.net
>>486
おまえがすがっているのはブランド以外の何物でもない
とぼけたら誤魔化せると思っているならおめでたいやつだ

490:デフォルトの名無しさん
19/07/15 22:43:50.22 ex33LrHm0.net
MISRAをブランドとか言うアホがいるんだ…
まあ具体的な内容には突っ込めないグダグダ君だしなぁww

491:デフォルトの名無しさん
19/07/15 22:45:14.79 ex33LrHm0.net
そもそもうちはMISRAは参考にしてるけど全面適用なんてしてないし

492:デフォルトの名無しさん
19/07/16 00:24:39.33 UHx9kM+ca.net
>>491
いや、しろよ

493:デフォルトの名無しさん
19/07/16 00:48:27.21 /MIJx2vXM.net
プログラムは書く人によって千差万別
書く物によっては複雑な物を書かなきゃならない
そしてその上でのバグ千差万別
ルールブックなんてプログラム書かない管理者がこれを守れば大丈夫(キリッ
ってするものだろう

494:デフォルトの名無しさん
19/07/16 01:07:51.42 EySzsoWc0.net
普通は大勢で開発するときに必要な取り決めだけどな
そういう規模で仕事しないなら,何しても良いけど

495:デフォルトの名無しさん
19/07/16 01:37:13.82 UHx9kM+ca.net
>>494
MISRAは明らかに小規模なプログラムのための規約だと思うよ

496:デフォルトの名無しさん
19/07/16 02:37:59.80 EySzsoWc0.net
大規模なプロジェクトのコーディング規約を決める人がここにいるとは思わないからね
小規模だと思うなら,そのルールでやれば良いんじゃない?

497:デフォルトの名無しさん
19/07/16 03:09:26.20 FvAVzBqbM.net
大規模とか小規模とかじゃなく実際にプログラムを書いてると必要になったりとかあるって話で
プログラムを書いた事内物が大規模ではとかいってるのか

498:デフォルトの名無しさん
19/07/16 03:18:03.55 UHx9kM+ca.net
そうそう、MISRAはクソ

499:デフォルトの名無しさん
19/07/16 03:29:07.35 UHx9kM+ca.net
MISRAを尊重するひとって、returnを書く位置によって返る先が変わると思ってるんだよ

500:デフォルトの名無しさん
19/07/16 07:29:02.49 UAKGOqEv0.net
間違ったことばかり書いてあるわけじゃないけどね
現場にそぐわないスキル不足なやつを庇うところには同意しかねるわけよ
> ルール 8.14 必要 restrict型修飾子を使用してはならない
規格票が読めないようなアホの相手はやってらんね
C++が混ざるところでも対策は簡単だし

501:デフォルトの名無しさん
19/07/16 07:43:27.01 1j77iOOZ0.net
トヨタのやってることは一つのミスでも人が死ぬということだよ
もしrestrictを使って人が死んだら責任とれるの?

502:デフォルトの名無しさん
19/07/16 07:45:28.75 /V8NdDl/M.net
それなら、人が死なないプロジェクトではMISRAは守る必要がないですね。

503:デフォルトの名無しさん
19/07/16 07:58:46.16 UAKGOqEv0.net
>>501
規格票を確認しないやつにミスがどうたら言われたかねえぜ

504:デフォルトの名無しさん
19/07/16 08:02:25.27 UAKGOqEv0.net
○○を使って人が死んだら責任とれるの?
○○に何でも突っ込めるウルトラクソ論法
ポインタ、共用体、仮定義、数学関数、それから?

505:デフォルトの名無しさん
19/07/16 08:50:54.07 7HVrvnq4a.net
>>501
お前が作ってるプログラムはテストしないのか?

506:デフォルトの名無しさん
19/07/16 09:07:55.77 csbTSCSc0.net
>>492
絶対守るべき指標と守った方がいい指標、といった具合に何段階かにわかれていて
別途ルールがあるならば守らなくても良い(無理して守るべきでない)指標もあるよ

507:デフォルトの名無しさん
19/07/16 09:35:00.37 UXD1By8p0.net
上司のバカかバカの上司でも理解できるまでに破壊されたC言語だろ
それを規格と言ってるだけだ
安全かもしれないけど対照実験がないでしょ
安全であることをどうやって確かめたのか論文の欠片も見つからなかった
だからMISRAの安全神話は神話かデマかフェイクニュースだよ

508:デフォルトの名無しさん
19/07/16 09:46:10.29 MyJUZjZxa.net
プライドだけは高いこの道30年の社畜が書いた様なルールだよ。
「してはいけない」ばかりでこうしろという記述が圧倒的に少ない。
フレームワークという発想がない。指摘だけ。すべて勘と経験という名の錯覚に基づいてる。
あと内容的に「最適化はしてはいけない」とか書いておけばいいんじゃないかと思う。次は入れて欲しい。

509:デフォルトの名無しさん
19/07/16 10:35:01.62 Yi/rfLM50.net
>>463
処理系依存や未定義だけどなんか上手く動いてる
というのは、ちょっと怖い

510:デフォルトの名無しさん
19/07/16 12:58:57.36 EySzsoWc0.net
たまたま動いているのは
処理系のバグかも知れない

511:デフォルトの名無しさん
19/07/16 13:18:30.94 uQ5be57j0.net
組込み系の開発経験者いなくて草
MISRA準拠が納品物の条件にあるんだよ
でもプロジェクト毎にカスママイズするから
100%適用するわけじゃないよ
わけわからんルールは適用除外してる

512:デフォルトの名無しさん
19/07/16 14:13:08.82 i1fbuZ/pM.net
>>511
> 組込み系の開発経験者いなくて草
ID:y88H95dP0 あたりは経験者だろ

513:デフォルトの名無しさん
19/07/16 15:01:33.68 csbTSCSc0.net
>>511
8進数使うな、とかいやだよね

514:デフォルトの名無しさん
19/07/16 15:05:03.91 Yi/rfLM50.net
エディタ上での見栄えで桁合わせに 空白を使わず 0 で補ってやらかす

515:デフォルトの名無しさん
19/07/16 15:14:31.06 EySzsoWc0.net
>>513
2進数や16進数は見慣れているんだが
8進数ってどういう時に使いたい?

516:デフォルトの名無しさん
19/07/16 15:27:11.60 UHx9kM+ca.net
バイトが6bitの時は便利だったとかいう話だけど、今要らんよね
emacs使っててエンコードがアレだと出てくるね

517:デフォルトの名無しさん
19/07/16 15:32:14.71 Yi/rfLM50.net
文字列で [ESC] を埋めるのに \033 を使ってるのを見るぐらい
(2進数のリテラルをマクロでなんとかするとき 一時的に8進化するけど 中の話)

518:デフォルトの名無しさん
19/07/16 15:40:10.80 uQ5be57j0.net
大昔のアーキテクチャは18bit,24bit とかで3bit 区切りが扱いやすかった
今は16,32,64と16進数が扱いやすいって話だね
ゼロ始まりは8進数というのはB言語からきたらしいよ

519:デフォルトの名無しさん
19/07/16 15:44:50.30 i1fbuZ/pM.net
>>513
いや、もうコンパイルオプションで禁止してもいいレベル
>>515-516
Unix/Linuxのファイルパーミッションが3ビット単位だからと言うのはあるけど今時直書きなんてしないし
>>517
それも "¥x1b" の方が馴染みがあると思う

520:デフォルトの名無しさん
19/07/16 16:30:56.95 SpxSpG+wx.net
\0 … 8進数
\x0 … 16進数

521:デフォルトの名無しさん
19/07/16 16:37:07.34 cpfSTA9t0.net
>>487
if の nest が深くなってしまう?

522:デフォルトの名無しさん
19/07/16 16:54:01.54 Yi/rfLM50.net
>>521
教条主義的に守るなら そうせざるを得ないだろうね
if (エラー) return ; // 即脱出
後続コード
return ; // 最終
即脱出を禁ずるなら
後続コードは即脱出条件とは排他的なので if (or else) 内に収めるしかない
if (!エラー) {
 後続コード
}
return ; // 最終

523:デフォルトの名無しさん
19/07/16 16:58:26.41 EySzsoWc0.net
goto ___exit; /* 震え声 */

524:デフォルトの名無しさん
19/07/16 16:59:45.97 Yi/rfLM50.net
多分 goto も塞がれてる気配w

525:デフォルトの名無しさん
19/07/16 17:24:48.72 uQ5be57j0.net
うちはreturnは最後に一つのみってやつは適用除外になってる
理由はネストが深くなって読みづらくなるから
gotoもネストしたループから一気に抜ける場合のみ使ってもよいことになってる
フラグ使ってbreakで抜けるより読みやすいからね

526:デフォルトの名無しさん
19/07/16 17:27:15.45 glyNXuyHa.net
もちろんgotoも禁止さ。
あと、各関数の頭で引数チェックも必須なのでreturn禁止とのコンボでほぼ必ず正常系処理のネストが一段以上深くなる。
引数チェック必須はISO26262だったかもしれん。

527:デフォルトの名無しさん
19/07/16 17:27:59.62 UHx9kM+ca.net
途中のreturn禁止を徹底するなら、ifとかelseの後に2行以上書くの禁止にした方がいいね。
代入だけ許容するくらいでいい。

528:デフォルトの名無しさん
19/07/16 17:28:40.15 T78CNDqDd.net
>>513
0は0x0とか書かなきゃいけないんかね

529:デフォルトの名無しさん
19/07/16 18:10:37.85 QICQY/wp0.net
>515
そりゃもう512色カラー設定に(ry

530:デフォルトの名無しさん
19/07/16 18:31:58.85 2nARKc5Ld.net
ここまできたらC言語も禁止だな。
pythonでコーディングしてコンパイルしてやればいい。

531:デフォルトの名無しさん
19/07/16 18:35:56.79 /Cc9wbE10.net
結構前から言われてない?
「C言語を使う必要が無いなら使うな」と

532:デフォルトの名無しさん
19/07/16 18:47:43.53 K50k857la.net
pythonを使って人が死んだら責任とれるの?

533:デフォルトの名無しさん
19/07/16 18:54:47.98 2nARKc5Ld.net
>>532
大丈夫さ。プログラム全体をtryで囲んで引っ掛かったらprint("手動運転に切り替てください")のコンボがある。

534:デフォルトの名無しさん
19/07/16 18:58:26.32 uQ5be57j0.net
pythonでOSやデバドラ書けるようになったら考えるわ

535:デフォルトの名無しさん
19/07/16 20:05:19.62 WsWptbblx.net
#define xxx 06
#define yyy 07
//#define zzz 08 // なぜかエラーになる

536:デフォルトの名無しさん
19/07/16 20:31:07.37 K50k857la.net
なぜかはひみつ

537:デフォルトの名無しさん
19/07/16 20:54:46.50 GCGNUpCjM.net
>>535
なんてありがちな…

538:デフォルトの名無しさん
19/07/16 21:03:30.93 GCGNUpCjM.net
ここらへん嫁
URLリンク(programming-study.com)

539:デフォルトの名無しさん
19/07/16 21:05:08.13 K50k857la.net
祈りが足りないからだな

540:デフォルトの名無しさん
19/07/16 21:08:14.38 uQ5be57j0.net
ちょっと前に8進数が~ってやってるのに
あ、ネタかw

541:デフォルトの名無しさん
19/07/16 21:22:48.20 /Cc9wbE10.net
このスレの人って少し前のレス読まないよね

542:デフォルトの名無しさん
19/07/16 21:31:28.73 7JXDuVC90.net
const char *sの順番が納得いかない
直感的にはchar * const sだろうが!!

543:デフォルトの名無しさん
19/07/16 21:32:10.10 W8tOKWg20.net
char const*だろ?

544:デフォルトの名無しさん
19/07/16 22:16:46.03 Qe+dZ6A/0.net
* const char s
じゃね?

545:デフォルトの名無しさん
19/07/16 22:17:34.37 Qe+dZ6A/0.net
おれは何を言ってるんだ??

546:デフォルトの名無しさん
19/07/16 22:20:37.80 dxLim7GAx.net
>>542
>const char *sの順番が納得いかない
>直感的にはchar * const sだろうが!!
前者はポイントされる文字列が const で、後者はポインタ自体が const でしょ

547:デフォルトの名無しさん
19/07/16 22:42:49.53 uQ5be57j0.net
const char* const s
これも直感的じゃないって言うんだろうか

548:デフォルトの名無しさん
19/07/16 22:43:19.23 dxLim7GAx.net
546です
すみません、それを踏まえてということか…

549:デフォルトの名無しさん
19/07/16 22:50:32.56 g+WSNcLQ0.net
const は後置で書いたほうが整合性が取れる
char const * const s:
しかし、見た目的にかわいいのは前置である
const char * s;
私はかわいいのが好きである
よって前置は使わない

550:デフォルトの名無しさん
19/07/16 22:58:11.13 g+WSNcLQ0.net
そこで私が提案したいのが「strong」である
strongは修飾したデータをすべてconstにする
つまり
char const * const s;

strong char * s;
は等価である

551:デフォルトの名無しさん
19/07/16 23:13:59.86 ICazHXPW0.net
>>550
安易な予約語の追加は嫌われるよ

552:デフォルトの名無しさん
19/07/16 23:18:11.31 EySzsoWc0.net
「strongがやられたようだな…」
「フフフ…奴は四天王の中でも最弱…」

553:デフォルトの名無しさん
19/07/16 23:19:03.80 /Cc9wbE10.net
<strong>char* s</strong>

554:デフォルトの名無しさん
19/07/16 23:22:51.61 uQ5be57j0.net
stringと間違えそうで嫌だなw
readonlyはc#で使ってるしな
やっぱconstだな

555:デフォルトの名無しさん
19/07/16 23:40:17.89 awioItM70.net
大文字で CONST にするとか。

556:デフォルトの名無しさん
19/07/17 04:24:07.40 CqcyHUxLd.net
フン
char *const_s

557:デフォルトの名無しさん
19/07/17 06:33:32.66 Pp4wfZXK0.net
>>546
const int a → constなint型のa
const char *s → constなchar *型のs
constなのはchar *つまりポインタ(直感)
char * const s → char *型のconstなs
constなのはsつまり文字列自体(直感)
なんで逆!!

558:デフォルトの名無しさん
19/07/17 06:46:44.61 NB17uhF90.net
> const char *s → constなchar *型のs
ギャグだよな?

559:デフォルトの名無しさん
19/07/17 06:57:50.40 i06pHchL0.net
宣言は右から左に読む
const等の修飾は左にかかる
char const * const s; // sは、const *である、const char型の
右にかかるなら↓のように書けないとおかしいがこれは構文エラーである
const char const *s;
変数名はただの識別子で、ある領域にsという名前を付けただけにすぎない
constやvolatileは型修飾子であり、これらが付くのは型に対してである
~という領域を、以後sと呼ぶ、である

560:デフォルトの名無しさん
19/07/17 07:14:03.66 NB17uhF90.net
ちげーよ
宣言は真ん中から左右に読むんだよ
char const *(* const s)[1];

561:443
19/07/17 09:21:48.88 u050lnGw0.net
>>526
引数チェックに関しては、Java のコーディングルールでは、
外部の人用のAPI、つまりpublic な関数には、必要
一方、そのモジュール・クラスの実装者が使う、
内部的なAPI、つまりprivate な関数には、いらない
既にどこかで、エラーチェックしてるから、何回も同じエラーチェックするのは、無駄

562:デフォルトの名無しさん
19/07/17 21:08:01.97 E0YvS3zE0.net
const char *sは*sがconst
つまりポインタsの指すアドレスにある値が不変だけどsがどこを指すのかは可変
char *const sはsがconst
つまりポインタsがどこを指すかは不変だけどsの指すアドレスにある値は可変

大体こんな認識で合ってる?

563:デフォルトの名無しさん
19/07/17 23:04:57.90 Pp4wfZXK0.net
あってるけど納得いかないって話
1つ目がまず何で*sにかかるんだよ
自然に読んだらconstはchar *にかかるだろ
右から読むとか頭おかしいわ、アラビア語かよ

564:
19/07/17 23:22:42.51 UrUB0t8/0.net
>>563
char * s;
に 1 個の const を追加するとき、形式的に追加できる場所は 4 箇所
a) char * s const;
b) char * const s;
c) char const * s;
d) const char * s;
このうち a) はコンパイルできない
b) c) は可能だが、の二つの間で意味は異なる
d) は本来ならエラーであるべきだと私は考えているが、実際には c) と一緒の意味になっている

565:デフォルトの名無しさん
19/07/17 23:34:56.30 RL7WDafS0.net
C言語使う時はいつ?
早いコードが欲しい時
メモリー消費に無駄のないコードが欲しい時
他ある?

566:
19/07/17 23:39:48.74 UrUB0t8/0.net
>>565
他の言語はほとんどわからず(かじってはみたものの使えるまでにはMPがあがらず)、C/C++ でしかまともに書けないし発想できないからです…

567:デフォルトの名無しさん
19/07/17 23:42:49.57 FDkzfNlT0.net
>>563
実はアラビア語って可能性はないのか?

568:デフォルトの名無しさん
19/07/17 23:49:47.36 Pp4wfZXK0.net
そもそもconst char *sの宣言の時の切れ目がconst / char / *s なのも何だかなぁ
const / char * / s でconstはchar *にかかれよjk
現実に間違ってるのは渋々受け入れてるけど開発者が許せない

569:デフォルトの名無しさん
19/07/18 00:00:28.28 OLFUgkogx.net
>>564
自分は b or(and) d かなー

570:デフォルトの名無しさん
19/07/18 00:33:34.97 Nr80YdQr0.net
>>565
他に思い付くところとしては、
組み込み環境などで、C言語以外の選択肢がない、または他の言語で実行できる環境を整えるよりCを使った方が楽な場合。
外部のライブラリのインタフェースがC言語で、呼び出す部分をCで作る方が楽な場合。
バイナリファイルの操作などポインタ操作を使って実装しやすい場合。

571:デフォルトの名無しさん
19/07/18 00:48:28.58 Nr80YdQr0.net
>>568
単純なポインタのことしか考えないから、左から右にこだわってんだろ。
>>560も指摘している通り、変数宣言の構文は内から外だぞ。配列や関数ポインタも交えて、それらを多段階の組み合わせにしても一意に解釈できるのを理解すれば、合理的な物だとわかると思うよ。
>>563
1つ目は、constがかかってるのはcharだぞ。内側から解釈するとsは*が付いているからポインタであり、それが指す型がconstなcharだ。

572:デフォルトの名無しさん
19/07/18 05:33:10.45 yO5P6Jqp0.net
char *s
の意味は*sはchar型だよって意味で
sはchar *型だよって意味じゃないよ

573:デフォルトの名無しさん
19/07/18 05:43:05.99 xY9KzRxOd.net
>>572
こう理解できてるとわかりやすいね。つまり
const char *s

*s(sの指す先)はchar型でさらにconstだよ
となる。

574:デフォルトの名無しさん
19/07/18 06:48:06.17 2qyz/4gG0.net
>>572
その宣言から以後、
sという式がchar*型
*sという式がchar型
2つの意味を同時に表現してるんだよ

575:デフォルトの名無しさん
19/07/18 07:54:18.60 kb0ZHGx0M.net
*と*const があると憶えるべき。

576:デフォルトの名無しさん
19/07/18 09:56:03.22 q9HPUerJa.net
>>563
ポインタを表す * が型にくっついてるんじゃなくて変数にくっついてるからでは?
分かりにくいなら typedef でポインタの型を作ってそれを使えばいいんじゃないな。
右から読む事に関しては英語を日本語に翻訳する時に順序を入れ換えた方が自然な感じになる事があるのでなんとも言えんな。漢文のレ点みたいなものもあるしな。
日本語とは逆順の方が自然な表現になる言語はある。そして歴史的な事情で混在してしまっているのもある(アメリカでの年月日が月日年の順だとか)。
生まれながらにしてその言語使ってればその人にとってはそれが一番自然な表現だからな。

577:デフォルトの名無しさん
19/07/18 10:04:50.81 xY9KzRxOd.net
>>574
結果はいっしょでも解釈の仕方は複数ある感じだね。
自分にとって理解しやすいので
char *s

sの指す先はchar型、つまりsはポインタ
って言う風に捉えてる。

578:デフォルトの名無しさん
19/07/18 21:25:27.83 PbeogWAD0.net
この話は何時も混乱するんだけど
結局の所は
自分の言葉で理解するまでやる
これをやらないと混乱してしまう
なぜそうなってしまったのか?
という視点で解釈しようとしないと
なかなかにc言語って難しい
その辺は例のc言語ポインタにのみついて書かれた本
あれを読んで
後は何とか自分の言葉で理解して解釈するしか方法が無い
それとこんなになってしまっている原因に
キーボード上の記号が少ない
というのもある
basic何かでは記号類は四則演算類だけ使って
なるだけ英単語?を使って記述するようになっている
だから使う場所によって記号の意味が違う
なんていうのが起こりにくくなってる
ある意味c言語が普及してしまったのはプログラミング世界にとっては不幸なのかもしれない


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch