C言語なら俺に聞け 146

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 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
2018/07/16(月) 22:23:31.47ID:d44IRZCy0
sageをつけ忘れました
申し訳ございません。
2018/07/16(月) 22:43:27.11ID:BgE9oE4s0
>>376
メモリ空間は1次元だから。
arr[y][x]は*(arr+y*WIDTH+x)と同じ。WIDTHがわからないとできない。
2018/07/16(月) 23:01:36.27ID:GVNh7z7o0
>>376
matがdouble型へのポインタだからだよ。
結果mat[i]はdouble型になり、mat[i][j]はdouble型に[j]を付けたことになるので、配列でもポインタでもないのに[]つけるなって怒られてる。

きっとmatのメモリ確保は
mat = malloc(sizeof(double) * tate * yoko);
みたいにやってるだろうから、i列j行目にアクセスするときは
&a->mat[i + j * yoko]
みたいにしないといけない。

あと、上の例ならjを外側、iを内側のforにしたほうが最適化されやすいと思うよ
2018/07/17(火) 00:14:58.01ID:TUtIYHCtM
>>375
作りが悪くて目標に届かなかっただけ
100万件のinsertに1秒程度が目標だったけど2.5秒ぐらいだった
2018/07/17(火) 00:50:16.45ID:j9lU977L0
>>376です
お二人とも丁寧に教えていただきありがとうございます。
>>378さんの方法で改良してみたのですが複数のMat構造体を作り,tateとyokoの値のそれぞれ別にしたときにプログラム実行中に入力が強制終了されてしまうのですが、配列の作り方に何か不都合があるのでしょうか
2018/07/17(火) 01:14:22.91ID:ZzFa01D50
>>381
あるあるネタだね。
何処かでx/y、i/j、tate/yokoが逆になってる。
2018/07/17(火) 03:42:30.44ID:ZJqMOJYT0
Ruby のハッシュでは、データ数と共に、バケット数を増やしていく。
バケット数は、2 の累乗の次に現れる素数。
2^n + a, 2 <= n <= 30

8 + 3 = 11
16 + 3 = 19
32 + 5 = 37
64 + 3 = 67
128 + 3 = 131
256 + 27 = 283
512 + 9 = 521

データ数が、バケット数の5倍を超えると、ハッシュが再構成される。
再構成時には、極端に遅くなる

11 * 5 = 55 だから、データ数が56 個になると、バケット数が19 になる。
19 * 5 = 95 だから、データ数が96 個になると、バケット数が37 になる
2018/07/17(火) 04:09:19.94ID:ZJqMOJYT0
AVL では、左右部分木の高さの差を、1 以内にしなければならないから、
2 になると、木の回転・縮約など、再構成をしなければならない。
つまり、しょっちゅう再構成が起こるので、遅くなる

赤黒木では、左右部分木の高さの差を2 倍以内にしたから、再構成が起こりにくい。
左が10 なら、右は20 まで、再構成が起こらない

タスクスケジューラーに使われる

例えば、100個のスリープしているタスクがある所に、
木に実行するタスクを追加して、重みに従ってソートすると、
追加したタスクが選ばれて、木から削除される

つまり、ほとんどの葉の順位が変わらなくて、
追加した葉が、すぐに削除されるようなものに適している
385デフォルトの名無しさん (ワッチョイ 753c-KCFg)
垢版 |
2018/07/17(火) 21:50:50.91ID:j9lU977L0
makefileってPowerShellで作れないとかないですか?
386デフォルトの名無しさん (アウアウカー Sa55-jzog)
垢版 |
2018/07/18(水) 13:02:52.94ID:9IEVAZpRa
>>385
君が何を言わんとしているのかがよくわからない
2018/07/18(水) 13:22:02.69ID:OuA1chkMd
わからないならかくなあほ
388デフォルトの名無しさん (アウアウカー Sa55-jzog)
垢版 |
2018/07/18(水) 13:27:22.37ID:9IEVAZpRa
>>387
あれで人に言葉が通じていると思い込んでる可能性があるから書くべきだろう
2018/07/18(水) 15:13:21.80ID:rBfwKW3R0
>>385
作れますよ
2018/07/22(日) 17:00:55.76ID:QT86rkZL0
なんとなく、コマンド行をタブで始めてなくて(スペースで空白を作ってて)、
makeがエラー出してるような気がするなぁ。
エディタのTab→スペース自動変換が効いてるとか。

PowerShellとは直接関係なくて。
2018/07/23(月) 07:43:37.05ID:4YnpLRT90
C++ C言語 C#の初心者用スレはないんですか?
探してみたけどそれらしきスレが見当たらないです
2018/07/23(月) 08:25:03.57ID:XREcIsoOM
>>391
まずはどうやって探したのか聞こうか
2018/07/23(月) 18:37:31.75ID:4YnpLRT90
>>392
まずスレッド一覧を開いてCTRL+FでC++と入れて検索しました
一応それらしき所を見つけたんですが書き込んだ瞬間変なおっさんに噛みつかれたので
初心者スレじゃないのかな。。。と。
入門にあったスレはないでしょうか
394デフォルトの名無しさん (ワッチョイ 979f-lcCj)
垢版 |
2018/07/24(火) 00:16:29.41ID:jxAZ77iY0
無ければ作ったら良い
2018/07/24(火) 00:25:40.41ID:WnIMuw3FM
初心者歓迎なのと甘えた初心者に手とり足とり教えるのとは違うよ
396デフォルトの名無しさん (スップ Sd3f-3g7x)
垢版 |
2018/07/24(火) 10:50:38.33ID:0p5SDr2Gd
回答者も甘えてる奴がほとんどだしな
2018/07/24(火) 12:49:34.60ID:AIbS+cPKM
初心者といいつつそれ以前だったりするから
2018/07/24(火) 12:52:10.55ID:jy7p1ZdAd
回答する気が無いヤツは黙ってろ
目障り
2018/07/24(火) 22:27:17.58ID:yuwuYFDqM
>>393
ここでの『初心者』はANSI Cの規格を読み込んでいること前提
プログラム未経験者は取り合えず柴田茫洋の明解C言語を読め
2018/07/24(火) 22:55:24.02ID:0yPjFIBM0
回答する気が無いヤツは黙ってろ
目障り
2018/07/25(水) 14:04:28.05ID:rhtXSHsm0
明解C言語は分かりにくいからやめとけ
苦Cの方がいい
402デフォルトの名無しさん (アウアウカー Saab-GY9v)
垢版 |
2018/07/25(水) 15:50:06.17ID:rOB4O81ba
明解と
書いてる方が
不明解
403デフォルトの名無しさん (ブーイモ MMbf-4pMd)
垢版 |
2018/07/25(水) 18:17:36.85ID:LRuCLCqQM
今からC言語覚えて何に使うの?
2018/07/25(水) 18:38:39.52ID:ru0lrBQYM
デバドラを書く
低速言語のボトルネックをカバーする
2018/07/25(水) 19:01:18.88ID:WBw1LCSkd
こういう連続線をクリックで描きたいなんか参考になる本だとかサイトってありませんか?
https://i.imgur.com/Emj85bk.jpg
2018/07/25(水) 19:07:02.74ID:h5CHP+XR0
>>405
それをCで書こうって考えている?
2018/07/25(水) 19:11:06.73ID:WkyhwwwQ0
>>403
小規模マイコンのプログラミング
とか
408デフォルトの名無しさん (アウアウカー Saab-GY9v)
垢版 |
2018/07/25(水) 19:19:25.92ID:ekeRKo17a
>>405
環境は?
OSやコンパイラは?
2018/07/25(水) 20:53:24.83ID:IVngiw360
>>407
揚げ足とるわけじゃないけれど
なんで小規模マイコン限定?
2018/07/25(水) 20:53:47.05ID:IVngiw360
大規模は違うの?って意味ね
2018/07/25(水) 20:57:49.18ID:E4aNPZoQ0
まずint(4バイトとする)とmalloc(4)の違い教えて
話しはそれからだ
2018/07/25(水) 21:01:13.33ID:Gtkf0v1Td
>>411
mallocは使い終わったらfreeで解放しないといけない。
2018/07/25(水) 21:02:09.90ID:DGkeAJEO0
Windows Win32 GDIで作ってみた
中身はいい加減だけど、マウスのボタンクリックイベントでポインタ座標を取得して順に直線で繋げているだけ
http://codepad.org/QqqOuloX
https://i.imgur.com/J8woM1h.png
2018/07/25(水) 21:04:29.51ID:Gtkf0v1Td
101回目のバッファオーバーフロー?
2018/07/25(水) 21:09:14.98ID:DGkeAJEO0
エラー処理なし
ウインドウハンドラ作成もメッセージループの処理も適当なのでプロシージャもいい加減な作り
2018/07/25(水) 21:13:14.68ID:E4aNPZoQ0
俺の言い方がまずかったようだ。
int* a = (int*)malloc(4);
これはわかる

int* a = (int*)malloc(5);
この場合でもコンパイルは通るし実行も出来る。

でも、やっていいことなんだろうかってね。
余った1バイトは気にしないでいいのだろうか?
2018/07/25(水) 21:18:04.56ID:Gtkf0v1Td
>>416
余分に確保しても大丈夫。連続したメモリーブロックと呼ばれるものだよ。頭に構造体を使ってもいいし。
2018/07/25(水) 21:21:01.07ID:Gtkf0v1Td
例えば、int *p = (int*)malloc(5*sizeof(int));と書けば、pは、int p[5];のように使える。
2018/07/25(水) 21:24:03.17ID:E4aNPZoQ0
>>418
そう。これは分かる。インクリメントで確保した変数にアクセス出来るのも分かる。
>>416の下の例で、例えばa++した時、そしてそのアドレスの中身を変更すようとすると
何か途轍もなく悪いことが起きそうな気がするんだけど大丈夫なんだろうか?
2018/07/25(水) 21:29:51.06ID:Gtkf0v1Td
連続したメモリーブロックからはみ出るから、そのアクセスは違法になるね。
2018/07/25(水) 21:32:51.80ID:E4aNPZoQ0
ああ、なるほど。そういう時はエラー出るのね。
今試しにインクリメントしたら確かにエラーになった。なるほど良く出来てる。
なんか試すのも怖かったんだわ。ありがとう!
2018/07/25(水) 21:33:37.75ID:kwDgMq/WH
>>419
未定義だから鼻から悪魔が出てもおかしくないよ

冗談はおいといて、現実には5バイトじゃなく、64バイトとかのサイズをとったりするので、何事もなく動く。ただし、動くのはたまたま。
2018/07/25(水) 21:36:12.00ID:E4aNPZoQ0
>>422
エラーをちゃんと出してくれるのが分かったから良かった。
まぁ適当な数字入れることなんか絶対ないだろうけど、これが動いたらやべぇなって心配だった
2018/07/25(水) 21:36:50.93ID:Gtkf0v1Td
ただし、アクセスにおいてエラーが出ない事もあり、この手のバクはやっかいで、下手をすると数億円が吹き飛ぶことがある。
だから、最近ではなるべく生ポインタを使わないでやるのがプロ。
2018/07/25(水) 21:39:44.99ID:Gtkf0v1Td
アクセス制御の貧弱なOSでは、不正アクセスは感知されない。
2018/07/25(水) 21:55:12.69ID:WkyhwwwQ0
>>409
大規模はC++の率が高くなる
2018/07/25(水) 21:56:03.32ID:LjfK0h7i0
>>406
>>408
すみません。ここCでしたね。C♯でした。場所間違えました。
2018/07/25(水) 21:57:27.86ID:LjfK0h7i0
>>413
すげぇ。わざわざありがとうございます。
2018/07/25(水) 23:13:13.16ID:99/tYlRKM
>>421
一般にエラーは出ないぞ
2018/07/25(水) 23:32:18.85ID:RmE/AZ04x
>>416
このれいだと.引数が 4でも 5でも、バウンダリが不安かな...
mallocは 4とか 16バイトの境界にアジャストされたアドレスを返しそうだけど
2018/07/25(水) 23:53:34.35ID:RmE/AZ04x
>>430
430ですが、mallocの返す番地は、大概の型にキャストできる境界になってるんだろうね、知らんけど
2018/07/26(木) 11:01:17.82ID:Oz5vlcaw0
C11はアラインメントが決めれるmallocがあるよ
普通は8の倍数になってる。
433デフォルトの名無しさん (アウアウカー Saef-2Ess)
垢版 |
2018/07/26(木) 12:52:49.36ID:EM3EzxKLa
ま、しかし、intが4バイトの保証はないし、malloc()で確保した範囲外がどうなってるかもライブラリ依存だし、変な事に挑戦しない方が良いと思うw
2018/07/26(木) 15:59:28.57ID:VR2PsH3f0
mallocの返すアドレスはワード教会に揃ってるように
POSIXで決まってなかったっけ? 気のせいか
2018/07/26(木) 16:54:25.22ID:ixC9BcxzH
>>432
aligned_alloc()だね
2018/07/26(木) 17:01:26.31ID:Vf/lMr8pd
>>434
決まってる
2018/07/26(木) 17:03:12.87ID:0PbkpRUpH
C99には
The pointer returned if the allocation succeeds is suitably aligned
so that it may be assigned to a pointer to any type of object and
then used to access such an object or an array of such objects
in the space allocated (until the space is explicitly deallocated).
とあるので、どんなオブジェクトでもその場所に置けることは保証されている。
ただ、アラインメントがずれてるとアクセスできるけど遅くなるとかいう
変態環境でどうなるかとかは規定されていない。
(ふつうの実装ならまともにアラインメントされていると思うが)
これをどうしても合法的に確実にアラインメントしたい人向けなのが、aligned_alloc()。
2018/07/26(木) 17:08:47.42ID:VR2PsH3f0
>>437
そうなんだ
おれはてっきりもっと全然違う基準、例えば64バイトとか16KBとかで
アライメントしたいときaligned_allocの方を使うものかと思ってた
2018/07/26(木) 17:17:59.96ID:0PbkpRUpH
>>438
そりゃもちろんそういう用途にも使えるよ
2018/07/26(木) 19:04:38.15ID:Vf/lMr8pd
>>437
パフォーマンスはCの仕様で規定されてないから
そんな事を心配したら標準ライブラリも使えないぞ
memcpyが劇遅かもしれないとか
2018/07/26(木) 19:07:36.39ID:Vf/lMr8pd
普通の用途は>>438みたいなヤツ

zmmレジスタのサイズ
キャッシュのラインサイズ
HDDのセクタサイズ
FIFOのサイズ

なんかにしたい場合
2018/07/27(金) 00:14:41.96ID:J2z2B0JS0
家でC言語の独学してたけど眠くなって続かないから週末だけ学校にいこうと思う。関西でお勧めはどこですか?
2018/07/27(金) 07:12:56.09ID:GxaYOivnM
金の無駄遣い
2018/07/27(金) 09:20:14.17ID:UMN2C6wAd
大阪大学基礎工学部情報科学科
2018/07/27(金) 09:52:20.15ID:mngCBxZNM
勉強を成功させるには強い動機付けが必要
やる気も効率も上がらないのはまずそこに失敗してる
2018/07/27(金) 20:31:18.69ID:dNDh2QHO0
>>445
動機付け、ですか…
そんなものは初めからありませんでした…
2018/07/27(金) 21:04:40.28ID:Gi4wb1wwM
個人的にはLinuxのデバドラから入るのがおすすめ
分かってくると俺の方が上手く書けるとか拗らせる
448デフォルトの名無しさん (ワッチョイ 6f9f-YSnv)
垢版 |
2018/07/28(土) 02:43:37.63ID:E0E9ZkiG0
動機を自分で意識的に付けようとしても中々出来ないのが普通なのでは?
何かそれなりのメリットがあると信じられないと何もしないのが普通の人間だろうし。
例えば何かをするとモテモテになるだとか、そういう自分にとってのメリットがあるならその何かをやる気は出るだろうけど、そんなのがないなら、あるいはもしあってもそれに気付けないなら普通はやる気は起きんでしょう。
2018/07/28(土) 07:47:22.78ID:CM3Pz0hR0
C言語、あるいはプログラムそのものの入門書で、文庫か新書サイズの良書はありますか?
2018/07/28(土) 08:07:15.42ID:xtvz/nLF0
C++ならこれならわかるC++があるが・・・
2018/07/28(土) 08:08:34.90ID:8G21bbxI0
はじめてのC
2018/07/28(土) 09:55:07.43ID:VMG9DnUG0
>>449
講談社ブルーバックスなら新書サイズでC本やプログラミング本があったはず。
ただ、書名は挙げられないし、良い入門書かどうかも分からん。

参考までに、本の寸法に制約があるのは何故かな?
2018/07/28(土) 10:28:26.03ID:CM3Pz0hR0
電車の中や、昼飯食べながら片手で読めるものがあれば、と思ったんです
パソコンいじりながら読むなら大きい方がいいんですけどね
454デフォルトの名無しさん (ワッチョイ c65a-FZq6)
垢版 |
2018/07/28(土) 11:19:05.91ID:fTj3LZGS0
Kindleで読めば?
2018/07/28(土) 12:06:22.12ID:s8FQvaoRM
さっさとkindleで読めアホ
2018/07/28(土) 14:09:45.43ID:xtvz/nLF0
マンガはタブレット端末で見るけど
参考書系は紙じゃないとなんか駄目だわ。全然集中できない。
2018/07/28(土) 16:49:06.40ID:XyATpAmoa
kindleとか電子書籍って参考書系読みにくいよね
漫画みたいにページそのままならいいのに
458デフォルトの名無しさん (ワッチョイ c65a-FZq6)
垢版 |
2018/07/28(土) 17:02:27.00ID:fTj3LZGS0
何年も前からiPadや電子ペーパー端末でプログラミングや法律の本読んでるけど特に不都合感じてないな
むしろ紙は持ち運びし辛いし検索もできないから不便だわ
459デフォルトの名無しさん (ワッチョイ 12e4-oxGy)
垢版 |
2018/07/28(土) 19:13:56.62ID:sJabZ7tp0
すみません
この2行のコードを1行にするスマートな書き方ってありますか?

idx = idx << 12;
idx = idx ^ _data;
2018/07/28(土) 19:15:47.78ID:CM3Pz0hR0
kindleですか、参考にします。
ありがとうごさいました。
2018/07/28(土) 19:31:07.68ID:g7V8p7HEd
>>459

idx = (idx << 12) ^ _data;
2018/07/28(土) 19:52:37.67ID:mee2LTKv0
>>461
うむ
2018/07/28(土) 20:05:12.26ID:0bzuzSMVM
初心者スレじゃないんだからidxがvolatileの場合を無視した回答は良くない
2018/07/28(土) 20:12:34.82ID:cv0xu0xkM
それを言うならvolatileでない場合を無視するのが問題では?
volatileであれば問題ないだろ
2018/07/28(土) 20:26:36.40ID:mee2LTKv0
わしここの住人じゃなくて通りすがりなんだけど、
>>461 だとなにか問題あるの?
2018/07/28(土) 21:15:36.33ID:DyF9e7oqM
>>465
もしもidxが送信データを書き込み受信データを読み出すためのレジスタだったら、
複数回書き変えること自体が重要だったり、読み込み時は異なる値を返却するかもしれない、
という割とどうでもいい話。
2018/07/28(土) 21:32:40.43ID:mee2LTKv0
>>466
C的に見れば無駄なコードが実は必要だったという、そういう話しかな
468デフォルトの名無しさん (ワッチョイ 1680-1o86)
垢版 |
2018/07/28(土) 21:52:57.65ID:jbwKRPPF0
最適化で一瞬レジスタの値が変わらなくなったから
それがどうしたのという話だからな

むしろ一瞬レジスタの値が変わるようなコードがそもそもぜんぜんダメ
2018/07/28(土) 21:55:35.27ID:remUbofq0
そういう話になってくるとレジスタってなんや?って話になるからな?
470デフォルトの名無しさん (ワッチョイ 1680-1o86)
垢版 |
2018/07/28(土) 22:00:32.66ID:jbwKRPPF0
ちゃんと確定値入れろよ
なんで計算中の値いれてんの

なんでそんな頭悪いことすんの

一行にしたいということは
間違いなく計算過程のコードだからな
2018/07/28(土) 22:02:55.51ID:aLrZyGnX0
通信プロトコルでCPUレジスタ使ってやり取りする様な方法ってあったっけ?
472デフォルトの名無しさん (ワッチョイ 1680-1o86)
垢版 |
2018/07/28(土) 22:05:44.90ID:jbwKRPPF0
メモリマップドI/Oなんか簡単に消える
2018/07/29(日) 00:51:03.42ID:++N1yuL90
>>471
「レジスタ」って「CPUのレジスタ」だけじゃなくて「I/Oチップのレジスタ」って使い方もするよ
2018/07/29(日) 07:02:57.29ID:YD8oKrYq0
>>463を書くためにわざと>>459の質問しただろ
まあ確かにvolatileだと>>461ではダメ

明らかに初心者の質問に>>463の回答もどうかと思うが

idx = idx << 12; idx = idx ^ _data;
これで良い
2018/07/29(日) 07:15:13.10ID:YD8oKrYq0
質問というよりスレのレベルを見るための問題だな
>>468みたいな素人が見事に引っかかっちゃう
2018/07/29(日) 09:00:29.62ID:+KuOy2bC0
触らぬ質問に騒乱無し
■ このスレッドは過去ログ倉庫に格納されています