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
289デフォルトの名無しさん (アウアウウー Sa67-ze1x)
垢版 |
2019/07/09(火) 09:14:08.91ID:gdYXIa6pa
typedef char *pchar; とすると pchar 型は「charのポインタ型」というとにはなる。
2019/07/09(火) 11:14:54.62ID:L+Vy/ftS0
ということはどっちでもいいんですね
2019/07/09(火) 11:27:52.60ID:knKJba5J0
気にしたことが無いくらいどうでもいい話。
2019/07/09(火) 12:21:07.04ID:J4x6YR7aa
引数のvoidが一体なんなのか考える方が有意義
2019/07/09(火) 12:41:16.87ID:jbK1WB2u0
引数なしの関数を書くときはvoidと書く

以上
2019/07/09(火) 12:59:36.67ID:PyDbCO5q0
voidって引数じゃないの?
2019/07/09(火) 15:08:36.62ID:jbK1WB2u0
引数に予約語使えるの?
2019/07/09(火) 15:44:50.86ID:+qcz+46H0
some_type foo() と戻りがあるのに、その戻りを捨てる意図で
(void)foo(); と呼び出すコードを見たことがあるような気がするが C++ かもしれん

最適化の際にうまいことしてくれるのを期待してるのかしら
2019/07/09(火) 15:55:38.40ID:td6qAd7k0
>>296
コンパイラかコードチェッカーのwarning抑止のためじゃないかな
2019/07/09(火) 16:02:30.30ID:+dEKq4+ba
Cでも使える。
一度も使ってない引数変数があるとか、関数の戻り値を使っとらんとかで警告が出る場合にくっつけるのが主だと思う。
299デフォルトの名無しさん (ワッチョイ cf02-4kw8)
垢版 |
2019/07/09(火) 16:03:09.93ID:NP6oYl9g0
> 引数なしの関数を書くときはvoidと書く
プロトタイプじゃなかったっけ
300デフォルトの名無しさん (アウアウウー Sa67-ze1x)
垢版 |
2019/07/09(火) 16:07:01.41ID:gdYXIa6pa
>>299
プロトタイプと違ったらエラーになる。
2019/07/09(火) 16:20:41.31ID:+qcz+46H0
>>297-298
なるほど、警告避けかー

引数に対してのは
callback 関数として、引数の型&数は限定されてるけど
実装時には一部の引数を使わずに実装できちゃうときに発生しそうね

void foo(int arg1, int arg2)
{
 /* 色々書くけど arg2 は使わない: callback 関数の都合で引数の型と数は変えられん */
 (void)arg2;
}
2019/07/09(火) 17:10:50.55ID:NP6oYl9g0
>>299
これ OKでしょ
int func(void);
int func()
{
return 0;
}
2019/07/09(火) 17:12:50.99ID:NP6oYl9g0
アンカミスった >>300
2019/07/09(火) 17:17:21.63ID:+qcz+46H0
>>302 のは 非ANSI の K&Rフォームで警告されるんじゃ

引数有りの記述では
 int func(int);
 int func(a)
 int a;
 { return 0; }
と等価
2019/07/09(火) 17:26:13.08ID:jbK1WB2u0
>>302
これアウトでしょ
int func(void);
int func()
{
return 0;
}

func(hoge);
2019/07/09(火) 17:28:26.22ID:PyDbCO5q0
>>302
VCだと
> warning C4255: 'func' : 関数プロトタイプがありません : '()' を '(void)' に変換します。
って警告出て、関数部分の引数を変えてしまってる
2019/07/09(火) 17:41:06.68ID:3UBru1uA0
>>302
おまえさん、自分のところで動作確認してるか? でたらめこくな
2019/07/09(火) 17:43:09.00ID:8Y9GhXx/M
char *p;
p = "str1";
p = "str2";

こんな風に文字列リテラルのポインタを付け替える時に前の文字列リテラルのメモリ領域を解放するにはどうすればいいの?
2019/07/09(火) 17:49:15.98ID:PyDbCO5q0
>>308
静的領域に確保しているから解放は無理
2019/07/09(火) 17:59:43.14ID:3UBru1uA0
exit関数を呼び出せば解放できるね
2019/07/09(火) 18:21:06.36ID:NP6oYl9g0
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;
}
どこかまちがっているか
2019/07/09(火) 18:28:37.94ID:8Y9GhXx/M
>>309
まじですか。じゃあこのような書き方してたらいずれクラッシュするってことですか?

char *p;
while(1) {
//何かの処理
p = "hoge";
}
2019/07/09(火) 18:36:42.49ID:lRtOoeh80
それは同じ"hoge"のアドレスがロードされるだけ
文字列リテラルのポインタ扱うならconst char *使いなされ
314デフォルトの名無しさん (アウアウウー Sa67-ze1x)
垢版 |
2019/07/09(火) 18:43:38.45ID:gdYXIa6pa
>>312
文字列の定数は静的な領域に作られるだけで実行時に動的に作られたりしないのでそれは問題なし。
315デフォルトの名無しさん (アウアウウー Sa67-ze1x)
垢版 |
2019/07/09(火) 18:46:20.39ID:gdYXIa6pa
あ、でも、定数でなくても同じか。単にポインタ代入してるだけだもんな。
2019/07/09(火) 18:47:53.66ID:jbK1WB2u0
>>311
プロトタイプと同じだからOKだよね
>>302は何を言いたいのか分からんな
2019/07/09(火) 19:48:16.54ID:YXbnrG+I0
>>301
その場合は↓で良いはず
void foo(int arg1, int)
{
}
2019/07/09(火) 20:34:43.07ID:3UBru1uA0
>>311
おまえさんは「関数原型を含む」を、「関数原型についてのみ」と脳内変換しているのか?

> int func() /* definition */
これのどこに、void型で名前のない仮引数があるんだ?
2019/07/09(火) 21:57:18.11ID:Rbs4mLR80
>>296
それは lint 対策ですよ
320デフォルトの名無しさん (アウアウウー Sa67-j2me)
垢版 |
2019/07/09(火) 22:42:13.74ID:pf5t+DpRa
最近C言語学び始めた者ですが練習がてらトランプのブラック・ジャック的なものを作っています
そこで11以上がでた時10とするという単純なプログラムを書きたいのですがつまづいています。
ご教授頂ければありがたいです
2019/07/09(火) 23:16:49.68ID:PyDbCO5q0
>>320
パッと思いつくのは、要素数13の配列用意して
対応する番号の所に希望する数を入れておく
2019/07/09(火) 23:46:17.89ID:pf5t+DpRa
>>321
一応rand関数というのをつかって1~13までの数をランダムで出すようには組めたのですがそのランダムで出た数が11以上だった時10として扱うというのが組めません

やはり13個全部配列組む方が確実なのでしょうか
2019/07/09(火) 23:52:36.31ID:khnvGGZh0
ブラックジャックのルール全部適用させようとすると初心者には結構ハードル高いような気がする。
2019/07/09(火) 23:54:18.16ID:PyDbCO5q0
>>322
式でやりたいなら、

i>10? 10: i
325デフォルトの名無しさん (アウアウウー Sa67-j2me)
垢版 |
2019/07/09(火) 23:59:20.27ID:pf5t+DpRa
>>324
ありがとうございます!早速試して見ます!
326デフォルトの名無しさん (アウアウウー Sa67-j2me)
垢版 |
2019/07/10(水) 00:04:27.37ID:YFbFPCAXa
>>323
あんまり細かいことはさすがに手が出ないのでとりあえず
・11以上は10として扱う
・21超えたら負け
・1がでたら1か11好きな方を選べる

この3つだけできればとりあえずブラック・ジャックとしてゲームは成り立つかなと考えてます
2019/07/10(水) 00:04:44.92ID:q0FoS2hTa
カード52枚作るのがいいと思いますよ。
シャッフルもしがいがある。
配列の要素は見た目(ハートのJとか)を表す構造体。なんだったら実際の値も入れる。Aが微妙ですが。
328デフォルトの名無しさん (アウアウウー Sa67-j2me)
垢版 |
2019/07/10(水) 00:14:34.49ID:YFbFPCAXa
>>327
作り始めた時52枚全部定義すれば本格的になるかなと思ったのですが、ご教授お願いしている身で申し訳ないんですけど少し面倒だなと思ってしまいましてorz

やっぱりちゃんとしたブラック・ジャックを作りたいなら52枚全部定義した方がいいですよね
329デフォルトの名無しさん (ワッチョイ 6f02-tOvn)
垢版 |
2019/07/10(水) 02:58:29.54ID:Jh4oErcv0
そうしないと確率が変わってしまうのではないかな。
2019/07/10(水) 07:53:06.60ID:c5IU7AfX0
某ゲーム内のブラックジャックは同じカードが自分と相手に出てきた。
カジノのブラックジャックだとトランプを何セットも混ぜてやってるらしいね。
331デフォルトの名無しさん (ワッチョイ 6f8c-r2oz)
垢版 |
2019/07/10(水) 08:45:30.08ID:FsJSBTR40
絵札の数が決まっていると残りの絵札を数えれば勝てるらしい。
2019/07/10(水) 08:48:48.34ID:q0FoS2hTa
実際は6セットとか使うわけです。
有限なのでカウンティングができる。
過去の結果に依存するってことはサイコロ使うような無記憶な試行ではないってことだね。
2019/07/10(水) 09:15:26.99ID:1T4zvF6/x
カウンティングだけで勝つのは驚異的な記憶力がないとなかなか難しいと聞く。
小説「マルドゥックスクランブル」でのBJシーンは有名だけど、読んででも半分も理解できなかった記憶があるわ。
2019/07/10(水) 09:18:07.74ID:8OTK1K8V0
麻雀よりは簡単
2019/07/10(水) 09:20:35.29ID:8OTK1K8V0
麻雀の方が簡単か
すまん
2019/07/10(水) 09:37:28.19ID:z7915HRG0
BJのカードカウンティング、結構な種類があるんだね
ttps://vegasdocs.com/blackjack/counting.html
2019/07/10(水) 17:29:16.11ID:6YiGFI5ep
麻雀の役判定、得点計算できるライブラリってある?
2019/07/10(水) 18:23:48.87ID:Tg8SA/BfM
>>337
ググれ
2019/07/10(水) 18:44:07.65ID:rAQ8nA0Y0
>麻雀の役判定、得点計算

あると思う
判定も計算も難しくはないし
無くても自製可能なレベル
2019/07/10(水) 19:16:43.40ID:iZJC1PSD0
ものすごく基礎的な質問で申し訳ないんだけどテトリスのようなゲームを作るとき、実行中のプログラムとは別にn秒ごとにあるプログラムを実行するようなのってどうすればいいの?
キーボードからの入力待ちの状態と並行して時間の計測とブロックを落下させるみたいなの
2019/07/10(水) 19:21:28.73ID:rAQ8nA0Y0
OSによって違いがあるけれど、
指定した時間間隔でイベントを発生させ
そのイベント通知を受けて処理を行うようにする
2019/07/10(水) 19:24:28.60ID:c5IU7AfX0
DOSならVSYNC割り込みとかタイマ割り込みっていうのがある。
2019/07/10(水) 19:37:55.05ID:b2TgwlJAa
入力待ちしてるはずなのになんでブロックは落ちてるんだ
2019/07/10(水) 19:48:07.07ID:wGS7rpFP0
待ってないから。
2019/07/10(水) 19:48:36.59ID:YAEkGiKl0
ブロッキング/ノンブロッキング
同期/非同期
2019/07/10(水) 19:59:01.20ID:iZJC1PSD0
うーん…前提から間違ってるのか?
ブロックを生成した後、キーボードからの入力を待ちながら一定時間毎に落下させるのかと思ってたけど、一定時間毎に落下させる中でキーボードからの入力があればそちらを実行する感じ?
2019/07/10(水) 20:00:37.82ID:b4vpo7xg0
非同期処理
2019/07/10(水) 20:08:27.28ID:iZJC1PSD0
なるほど
同期処理、非同期処理を使えば割り込ませたりすることができるのか
まだほとんど理解できてないけどある程度方向性は見えてきた気がする
サンクス
2019/07/10(水) 20:10:55.04ID:rAQ8nA0Y0
>>346
マルチスレッドって分かるかな?
同時に複数の処理を行うんだけど
多分イメージしているプログラムは
それを利用する事で出来ると思う
ただし、OSが何かによって実装方法が変わってくる
2019/07/10(水) 20:23:29.74ID:nUGO9xykM
>>346
そうだよ。古典的なゲームは、1秒間に30回または60回、入力の取得と状態の更新と画面の更新を行う。
ギャラクシアンもといタスクシステムでぐぐれ
351デフォルトの名無しさん (アウアウウー Sa67-ze1x)
垢版 |
2019/07/10(水) 20:48:50.43ID:lDiVjXP/a
テトリス程度の(コンピュータからしたらゆっくりな動きの)ゲームならマルチタスクやマルチスレッドにしなくても順番に処理すればできそうだけどな。
キー入力については何も押されてなかったらすぐに処理を抜けるようにしとけば良い。
で、画面書き換えたりする処理して、またキー入力されてるかを見て、という感じで繰り返す。
キー入力されてたらそれによって変化するパラメータ(テトリスならブロックの向き等)を変更する。
2019/07/10(水) 21:05:28.75ID:gc55JO0Da
マルチスレッドだって順番だろう
昔はコアが一つしかなかったんじゃよ
353デフォルトの名無しさん (ワッチョイ 6f8c-r2oz)
垢版 |
2019/07/10(水) 23:25:08.72ID:QCGATMsz0
ソフトタイマ ポーリング 状態シーケンス制御
354デフォルトの名無しさん (ワッチョイ 7602-AvHN)
垢版 |
2019/07/11(木) 01:13:09.90ID:9IeQUu2b0
>>352
順番って、時分割で切り替わるって意味?
しかしそれは普通はOSレベルでやってるので切り替え部分までユーザが考える必要はないね。
そこまで自分で作らねばならないようなOSなし環境や昔の 8 bit CPU みたいなのだと別だが。
2019/07/11(木) 02:10:12.63ID:j5kiUrVb0
>>351
それってキー入力取り逃したりしないの?
2019/07/11(木) 06:43:27.53ID:bnplrtu80
>>352
マルチスレッドじゃなくて単なるループだと思うが
2019/07/11(木) 07:08:26.92ID:l57S3jiM0
ハードウェア割り込みとマルチタスクOSがごっちゃになってるんだろ
2019/07/11(木) 08:25:52.40ID:Osy0Da+v0
>>355
処理のサイクル(1/30秒 や 1/60秒)の間に off->on->off とパルス状に入力されると取りこぼすよ
359デフォルトの名無しさん (アウアウウー Sa47-KZVA)
垢版 |
2019/07/11(木) 09:26:29.26ID:42U1oSKOa
高橋名人の16連射でもコンピュータからすれば物凄く遅いスピードだから問題ない。40年ぐらい前のクロック4MHzで動く 8 bit CPU でも余裕だ。
それにゲームなら一回や二回入力が失敗しても文句を言うやつはまずいない。
2019/07/11(木) 10:34:43.73ID:nMYI1ORia
>>356
まあユーザースレッドなんて言葉もあるけども

昔のCPUだとぶんまわすしかなかったけど、ある意味わかりやすい気がするわ。
リッチな環境でアクションゲームってどうやって作るの?条件変数とか使うのかね?
2019/07/11(木) 11:38:42.52ID:KgOJMZpN0
>>358
炎のコマの解説は嘘だったんだよな
あれ以来、人間を信用しなくなった
2019/07/11(木) 12:18:10.67ID:xCkJ5LaR0
組み込みでは、0.1〜1秒など、長時間に渡って、
何回もキーを押しているかどうか確認してから、機械を動かす

そうやって、ボタンを確実に押しているかどうかを判断する

1回で判断すると、ボタンの接触不良で、
モーターのon/off が繰り返されてしまうから、短時間で判断できない

この判断を、ハードウェア回路で行うのと、ソフトウェアで行うのと、2つの方法がある

詳しくは、組み込み(エンベッド)情報処理資格の教科書を参照
2019/07/11(木) 12:23:27.06ID:ZSl7eG940
一々教科書を読まなくても「組み込み チャタリング」などで調べれば分かるのでは
2019/07/11(木) 15:03:35.76ID:vYMpRAzp0
Windows初期はVsync待ちとかウェイトかけずに処理してて、CPU速度が上がったら実機より速くなって(60fps以上)ゲームにならんのもあったわ。
365デフォルトの名無しさん (アウアウウー Sa47-KZVA)
垢版 |
2019/07/11(木) 21:07:12.90ID:W9yQmyPFa
エイリアンの動きが速すぎて穴を掘ってる暇がないと
2019/07/11(木) 21:08:10.26ID:+FsFkp9e0
それ何ていう平安京エイリアン?
2019/07/11(木) 21:47:38.69ID:BSTUJEPb0
space panic
2019/07/11(木) 21:55:53.90ID:pe38QhTW0
Linuxってconio.h使えないのかよ
getcheもkbhitも駄目とか面倒臭いな
2019/07/11(木) 21:57:23.76ID:JEmOAlRld
コンソールで色を付けるならpdcurse使え。ncursesは古い
2019/07/11(木) 21:57:56.88ID:JEmOAlRld
pdcurses
2019/07/11(木) 22:15:03.30ID:BSTUJEPb0
ioctl
2019/07/12(金) 04:02:10.72ID:30ixxYg+0
pdcursesってcursesのWindows実装なんだけどな
373デフォルトの名無しさん (アウアウウー Sa47-KZVA)
垢版 |
2019/07/12(金) 12:58:51.21ID:4AR7dspsa
>>368
ncursesとかを使ってそういうラッパー関数作れば良いのではないかな。
2019/07/12(金) 18:40:44.71ID:q8HbeEfz0
Cで面白いワンライナーとかない?ICCCMとかにも案外ワンライナーという分類はないんだよね。
2019/07/12(金) 19:20:34.57ID:rA9WmwUa0
1行と言うのは難しそうだが、7行で良ければ

https://uguisu.skr.jp/othello/7gyou.html
2019/07/12(金) 19:24:01.49ID:Vt6HtS1w0
BASIC時代に1画面プログラムってのがあったな。
2019/07/12(金) 19:40:11.46ID:aSZPouska
1行の定義って何?
2019/07/12(金) 19:56:09.02ID:pYBNura/0
>>373
既に世界中で書かれて公開されている予感
2019/07/12(金) 19:56:09.31ID:zAF1v8/n0
\n
2019/07/13(土) 01:22:11.42ID:+XrRzYc00
>>378
結婚して///
2019/07/13(土) 06:35:45.40ID:GFbMPvry0
#defineを-Dでやれば1行にできるかも
https://www.ioccc.org/2004/vik1.c
382デフォルトの名無しさん (ワッチョイ 17d2-rBUL)
垢版 |
2019/07/13(土) 07:12:15.59ID:THUdwCLa0
そもそも改行しないでプログラム書けば一行
2019/07/13(土) 13:07:12.18ID:BfevEbDR0
cppディレクティブは1個1行
2019/07/14(日) 22:19:01.35ID:uXqqdpfBM
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++;
2019/07/14(日) 22:22:40.77ID:/MgLlV8v0
>>384
http://www.kouno.jp/home/c_faq/c3.html#0
2019/07/14(日) 22:30:43.07ID:uXkiDi0Ud
「式の評価」という言葉はわかるか?
1+1という式を評価すると2になる。
C/C++の後置演算子では、全ての評価が終わった後で変数を書き換える。
i++は、++がiの後ろについているから、後置だ。i++を評価すると、評価した瞬間の値はiであり、そして式全体の評価が終わると、iはプラスいちになる。
後置の反対は前置演算子であり、式全体の評価の前に変数を+1もしくは-1する。
2019/07/14(日) 22:48:05.04ID:uXqqdpfBM
演算規則に従い、インクリメント後置なので、元の3行目の式は
s[i(==0)] = i(==0) + 1
i = i + 1
の順に行われて結果、
s[0]に0が代入されてs[1]の値は初期値0だと思うのですが。
事実、3行目がs[i] = i++;なら上の通りの順で実行されます。
演算規則が無視されて結果がコンパイラ依存になる理由は何ですか?
2019/07/14(日) 22:48:51.03ID:uXqqdpfBM
私は間違えました、s[0]に1が代入されます。
2019/07/14(日) 22:52:20.27ID:uXqqdpfBM
また、3行目を以下の通りにすると演算規則通りに結果2が得られます。
s[i] = ++i + 1;
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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