X



C言語なら俺に聞け 149

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ af9f-7TBo)
垢版 |
2018/10/28(日) 22:01:44.38ID:D9Gt7gmT0
!extend:checked:vvvvv:1000:512

次スレを作る時は上記1行をコピーして2行に増やして必ず1行目に入るようにしてください。

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言語なら俺に聞け 148
https://mevius.5ch.net/test/read.cgi/tech/1537347410/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
0167デフォルトの名無しさん (ワッチョイ 034f-1YVs)
垢版 |
2018/11/25(日) 10:08:42.57ID:i1TAIE2a0
>>164
> ……と思って今試したら警告レベルを最大にしてやっと出たわ。
最大にすれば出るのだから『便利』と言っていい。

警告レベルは自分に合わせて使うものだ。
判断する能力がないのなら、とりあえず最大にしとけ。


>>161
演算速度自体は上がらない。むしろ符号拡張等が必要になり落ちる。(事が多い)
これは通常はintがCPU内部のALU幅と同じ(つまり最速)に設定される為だ。
ただしフットプリントは減る為、キャッシュヒット率が上がり、結果的に速くなることはある。

よく分からなければ、基本的に全部 int で、明確に必要なところだけその他を使えばいい。
(同一ソースでint幅が異なる複数の処理系で動かすというような場合を除く)
0171デフォルトの名無しさん (アウアウカー Sa87-rBFN)
垢版 |
2018/11/25(日) 14:26:54.92ID:uM/ivlZCa
現時的にはちょっとデータを保存するとかネットワーク越しに外に送るとかした時点でサイズは意識することになるから、intが無難とも言い難い。
意識できてればなんでもいいんだが…
0177デフォルトの名無しさん (ワッチョイ c364-m15j)
垢版 |
2018/11/25(日) 20:07:43.14ID:74eaLfxV0
ごめんバカみたいな質問なんだけど
その「遅い」っていうのは実行時の速度だよね。コンパイルが遅いってことじゃないよね。
だとすると8の倍数のbit数のCPUでint<8×N>型を使ってもタイムロスって起きない気がするんだけど……。
0179デフォルトの名無しさん (アウアウカー Sa87-ZX3B)
垢版 |
2018/11/26(月) 06:54:36.44ID:xHCVYRaTa
>>177
そういうのはSSE命令とか使うXMMレジスタ使う話。
Intelコンパイラでも無いとアセンブラの話。

単純に上位ビットを0で埋める。(分遅くなる)

ただ、CPUアーキテクチャにも依存する。
95年当時はpentiumは32ビットCPUだが16ビットの方が速く、pentiumU以降で32ビットの方が速くなった。
Core2は32ビットが速く、64ビットは遅く、Core iから64ビットの方が速くなった。
(ハードレベルでも、ただ実装しただけと、最適化したのとある)
0180デフォルトの名無しさん (スフッ Sd1f-TETZ)
垢版 |
2018/11/26(月) 14:44:44.56ID:00kzfg0Id
encode.exe
PGM 形式の画像ファイルを入力に与え,Run Length 法によって圧縮したデータを出力す る
decode.exe
encode.exe で圧縮したデータを入力に与え,PGM 形式の画像ファイルを出力する。
これをc言語で書くにはどうすればいいですか?
osはUnix開発環境はMSYS2です。
0182デフォルトの名無しさん (スフッ Sd1f-TETZ)
垢版 |
2018/11/26(月) 15:19:44.48ID:00kzfg0Id
コードはかけたのですがエラーが出ないのに圧縮するとデータサイズが大きくなるはずなのに小さくなります。それがわからないです。
0184デフォルトの名無しさん (アウアウウー Sa27-ml8p)
垢版 |
2018/11/26(月) 15:27:58.32ID:mDHVgMsLa
元のファイルと出来上がったファイルの中身を16進ダンプしたりして調べれば良いのでは?
それとプログラムもよーく読み直してみな。
0186デフォルトの名無しさん (アウアウウー Sa27-ml8p)
垢版 |
2018/11/26(月) 15:44:04.38ID:mDHVgMsLa
Run Length は連続データが少ないと大きくなる事があるからその辺は特に不思議はない。
0191デフォルトの名無しさん (ワッチョイ c380-1YVs)
垢版 |
2018/11/26(月) 22:38:09.76ID:404pxOU70
0バイトのデータを圧縮すると間違いなく大きくなる
0199デフォルトの名無しさん (ワッチョイ c364-m15j)
垢版 |
2018/11/27(火) 01:23:33.76ID:UHpiRGCo0
マジレスすると情報っていうのは消失しないと考えられているので
BH表面にエネルギー運動量テンソルの波動として,飲み込まれた物質郡の属性
(電荷など)が記録される……筈w
少なくとも現状の場の量子論と重力宇宙論ではそういう結論が出てる。
C言語とは関係ないけど,BHを記憶装置として用いるっていう考えは
突拍子もないけど理論的には可能だよねぇ,上記の理屈が正しいとすると。
0200デフォルトの名無しさん (ワッチョイ 6f9f-KQkZ)
垢版 |
2018/11/27(火) 01:29:33.86ID:IxTjeZ9T0
みんなが何を言っているのかよくわからない
0202デフォルトの名無しさん (ワッチョイ 6f9b-nNS8)
垢版 |
2018/11/27(火) 22:26:43.87ID:/aKqcH8H0
>>195
例えば100bitの長さのデータは全部で2^100種類作ることができる
50bitの長さのデータは全部で2^50種類作ることができる

任意のデータを半分に圧縮できる方法があるとして
100bitで作れる2^100種類のデータをすべて圧縮したなら
50bitの長さで2^100種類の異なるデータができなくてはいけないがそれは不可能
0203デフォルトの名無しさん (ワッチョイ 6f9f-zhOP)
垢版 |
2018/11/28(水) 01:13:46.19ID:BkKDQWNJ0
いやいや、ちょっと待て。ここは発想の転換が必要だ。例えば8インチのフロッピーディスクから3.5インチの

いや、なんでもない。みんなには内緒にしておいてくれ。
0204デフォルトの名無しさん (ワッチョイ ff2b-pqc8)
垢版 |
2018/11/28(水) 02:27:03.19ID:iOF+GVq50
「任意の」データを半分に圧縮できるとすると
圧縮した後のデータもさらに半分に圧縮できるはず
そうやって圧縮を繰り返せば最後には全てのデータは1ビットになる
よってそのような圧縮法がないことは明らか
可逆でないならそれでもいいかw
0207デフォルトの名無しさん (ワッチョイ ffd2-f63u)
垢版 |
2018/11/28(水) 09:24:07.52ID:seMAmMUm0
そこでTHCompですよ
0214デフォルトの名無しさん (アウアウウー Sa27-ml8p)
垢版 |
2018/11/28(水) 19:51:31.92ID:wHjpMIAFa
Kotlinもよろしく
0216デフォルトの名無しさん (アウアウウー Sa27-/Yu/)
垢版 |
2018/11/28(水) 22:31:15.42ID:xsmtECg3a
ttps://bituse.info/c/kadai/44

上記のサイトなどを参考に
簡単な九九の表を作ると

1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15...
...
...
(略)


このようになると思いますが、

隣の数字を参照にして足して
3 5 7 9 11 13 15 17
6 10 14 18 22 26 30 34
9 15 21 27 33...
...
...
(略)


と、表示するには上記のサイトの様なプログラムをどのようにすれば良いのでしょうか?
宜しくお願いします。
0222デフォルトの名無しさん (ワッチョイ 0bb3-C0zt)
垢版 |
2018/11/29(木) 04:25:22.53ID:+QhJBOyD0
int main() {
char *ary[] = { "AAAA" , "BBBB" , "CCCC" };
printf("%s\n%s\n%s\n" , ary[0], ary[1], ary[2]);
printf("%x\n%x\n%x\n" , ary[0] , ary[1] , ary[2]);
printf("%x\n%x\n%x\n" , &ary[0] , &ary[1] , &ary[2]);
return 0;
}
実行結果
AAAA
BBBB
CCCC
405064
405069
40506e
61ff24
61ff28
61ff2c

っていうのでよくわからなくなったんですが
0061FF24==00405064で00405064==41414141
なのに、同じary[n]で参照?してるアドレスが違うのは%sが特別だからですか?
それと、AAAA,BBBB,CCCCはどの変数にも格納されていなくて、ただポインタがその文字列たちを指しているっていう理解であってます?
*がよくわからない・・・・・
0223デフォルトの名無しさん (ワッチョイ 0bb3-C0zt)
垢版 |
2018/11/29(木) 04:37:33.83ID:+QhJBOyD0
ああ直接ポインタを作っててそれで変数がある必要もないのかな?
AAAA,BBBB,CCCCを普通に配列で作って、それを1つのポインタでオフセットを指定して選ぶ。みたいなのってCでできるんですか?
0224デフォルトの名無しさん (ワッチョイ a7c3-o5Pc)
垢版 |
2018/11/29(木) 05:10:38.21ID:ljP5qN1x0
any[]には各文字列のアドレスが格納される。文字列へのポインターの配列。
%sはポインターが指すアドレスの文字列を、%xはポインターに格納されたアドレスを表示する。
&any[]とすると、ポインターそのもののアドレスを取得して表示する。

61ff24 -> 405064 -> "AAAA"

みたいになってる。
0225デフォルトの名無しさん (ワッチョイ a7c3-o5Pc)
垢版 |
2018/11/29(木) 05:25:57.02ID:ljP5qN1x0
一つのポインターでオフセットを指定することはできるけど、
"AAAA"はAAAAの4byteではなくて、文字列の終端である0を含めた5byteになる。

char *any = "AAAABBBBCCCC";

こういうイメージで+4や+8でアクセスしようとしたら
%sで表示したとき意図する結果にならないかもしれない。
文字列として扱わなければ問題ないです。

char *any = "AAAA\0BBBB\0CCCC";

こんな書き方もできますが、*を理解したほうがよいと思います。
アドレスやオフセットの概念は理解しているようですので。
0226デフォルトの名無しさん (ワッチョイ 2393-abuG)
垢版 |
2018/11/29(木) 07:00:11.93ID:f12HiZt90
>>222 の実行結果を解釈すると...

文字列 "AAAA" "BBBB" "CCCC" の実体は 0x405064 から格納されていて、
16進ダンプだと
0x405064: 41 41 41 41 00 ; {'A', 'A', 'A', 'A', '\0'}
0x405069: 42 42 42 42 00 ; {'B', 'B', 'B', 'B', '\0'}
0x40506e: 43 43 43 43 00 ; {'C', 'C', 'C', 'C', '\0'}
という具合に(アラインメントのためのパディングなしに)詰め込まれている。
行分けせずに
0x405064: 41 41 41 41 00 42 42 42 42 00 43 43 43 43 00
と書けば「詰め込む」のイメージが分かりやすいかも。

charへのポインタの配列 ary[] は 0x61ff24 から配置されていて
番地: 0x61ff24 == &ary[0], 値: 0x00405064 == ary[0] (== "AAAA"の先頭番地)
番地: 0x61ff28 == &ary[1], 値: 0x00405069 == ary[1] (== "BBBB"の先頭番地)
番地: 0x61ff2c == &ary[2], 値: 0x0040506e == ary[2] (== "CCCC"の先頭番地)


これで分からんかな。
ポインタが指す実体(文字列)の番地、その(文字列の)番地が格納された配列の値、
(値としてポインタが格納された)配列要素の番地。
0229デフォルトの名無しさん (ワッチョイ 0bb3-C0zt)
垢版 |
2018/11/29(木) 12:11:40.55ID:+QhJBOyD0
ありがとうございます。
読んでみてなんとなくは理解できるようになりました

>>225
NULLのことはすっかり忘れてました
*を理解できるように頑張ります、ご丁寧にありがとうございました。
0230デフォルトの名無しさん (ワッチョイ 4e80-gjgg)
垢版 |
2018/11/29(木) 16:00:56.19ID:Pq9K3tWa0
>>216-221
Ruby で作った

NUMBERS = ( 1..5 ).to_a
Count = NUMBERS.length

# 九九の表、Times Table ( Multiplication table ) を作る。
# map は1次元配列を作るので、each_slice で、2次元配列にする
Multiplication_table = NUMBERS.product( NUMBERS ).map { | x, y | x * y }
.each_slice( Count ).to_a

result = [ ]

Multiplication_table.each do | ary | # 1行ずつ処理する
result.push ary.each_cons( 2 ).map { | x, y | x + y } # 隣同士を足す
end

p result

結果
[[3, 5, 7, 9], [6, 10, 14, 18], [9, 15, 21, 27], [12, 20, 28, 36], [15, 25, 35, 45]]
0232デフォルトの名無しさん (ワッチョイ db64-VZvV)
垢版 |
2018/11/29(木) 16:20:18.55ID:Msn7clch0
>>231
やめてさしあげろw

まあ擁護するなら人気のありなしで言語の優劣は測れないと思うけどね。
IOなんてドマイナーだけど俺は好きだし,素晴しい言語だと思っている。
なおRuby
0235デフォルトの名無しさん (アウアウウー Sa47-2q9Y)
垢版 |
2018/11/29(木) 19:09:36.82ID:8tueZiBHa
array
0238デフォルトの名無しさん (アウアウウー Sa47-2q9Y)
垢版 |
2018/11/29(木) 19:46:28.81ID:8tueZiBHa
>>236
「まれによく見る」とは?
0240デフォルトの名無しさん (ワッチョイ 0bb3-Gcmv)
垢版 |
2018/11/29(木) 19:53:37.10ID:sIB7nB920
>>238
weblio辞書より

まれによくある
別表記:稀によくある、稀に良くある

起こり得る事柄を形容して用いられることのある言い回し。
滑稽な表現であるが、あからさまな形容矛盾であり、日本語としては意味をなさない。
「ブロント語」として広まったインターネットスラング。

「まれによくある」の語のニュアンスは、使用者や使用場面によって異なるといえるが、
「頻繁に起こるとも言えるし、めったに起きないとも言える」といった意味合いだったり、「特定の人においてはよくあるが、その他の人には起こらない」といった意味合いだったり、あるいは、いわゆる「あるあるネタ」を指していたりする。
0241デフォルトの名無しさん (ワッチョイ 0bb3-C0zt)
垢版 |
2018/11/29(木) 20:38:21.77ID:+QhJBOyD0
ちなみに>>222のやつは入門サイトにあったやつを少しいじったやつです
0245デフォルトの名無しさん (ワッチョイ 0bb3-C0zt)
垢版 |
2018/11/29(木) 22:30:54.22ID:+QhJBOyD0
苦CのほうはWebにサイトがあるのでそっちを見ては?
0247デフォルトの名無しさん (ワッチョイ 2b4f-y69T)
垢版 |
2018/11/29(木) 22:48:01.10ID:TPe/tu+/0
>>241
IDEを使ってメモリウインドウから>>226の内容を納得いくまで確認しろ。

> AAAA,BBBB,CCCCを普通に配列で作って、それを1つのポインタでオフセットを指定して選ぶ。みたいなのってCでできるんですか?
それを222で君がやっているように見えるが。
書き方が気に入らないのなら、以下でも多分行ける。
for (int i=0;i<3;i++) printf("%s", *(ary+i));

他言語とは文字列の扱いが異なる。Cの方がより原始的で、はっきり言って使いにくい。
他言語:文字は長さ1の文字列
C言語:文字はcharで、文字列はcharの配列

ただ、char周りなんてどうせ大して使わないから飛ばしていい。さらに言うと、
> AAAA,BBBB,CCCCを普通に配列で作って、それを1つのポインタでオフセットを指定して選ぶ。
なんてのはbotとかでも作るわけでなければ使わない。
printfべた書きで大体事足りる。
0248デフォルトの名無しさん (ワッチョイ 0bb3-C0zt)
垢版 |
2018/11/29(木) 23:07:20.28ID:+QhJBOyD0
>>247
一応プロセスメモリエディタとか使いながらやってたんですよ、それでも混乱するので聞きました。
多言語はやったことないのでよくわかりませんが、高級言語のよくわからずに使う感じが苦手なので、むしろ原始的なのは好きです。

> AAAA,BBBB,CCCCを普通に配列で作って、それを1つのポインタでオフセットを指定して選ぶ。
っていうのがbotを作るうえで必要というのは初めて知りましたが、botは作りたいと思ってました。
0249デフォルトの名無しさん (ワッチョイ 2b4f-y69T)
垢版 |
2018/11/30(金) 00:06:17.84ID:tn7d6mNM0
>>248
> プロセスメモリエディタ
なんじゃそりゃ?と思ってみてみたが、どっちかというとハッキングツールだな。
マジな話、IDE使え。個人開発レベルの糞ツールとは次元が違うから。
俺はVSがいいと思うが。
言い忘れてたが当然return文にブレークポイントを当てて止めて見るんだよ。

というか他に何言語やってるんだ?
> AAAA,BBBB,CCCCを普通に配列で作って、それを1つのポインタでオフセットを指定して選ぶ。
これは全くの初心者の発想ではないはず。
明らかに他言語ではこう書ける、これをCでやりたい、というように読めるが。

> っていうのがbotを作るうえで必要というのは初めて知りましたが
というか、文字列を配列に持って切換ながら使う=それらの文字列は同列に扱うべき、
という使い方をすることがほぼ無いんだよ。他の言語でも、アプリでも。
大体文字列なんてリテラルでその場で使って終わり、が殆どだ。
それ以前に、charを主として使うアプリ(bot含む)をCでやろうというのも間違いだが。

char出力は結局UIであって、どうせI/Oで引っかかるから、Cの優位性(速度)が生かせない。
そして原始的な分、生産性自体は悪いから、そのデメリットだけ受けてしまう。
AIbotとかで演算部分に相当速度が必要でない限り、スクリプト言語で作った方がいいと思うぞ。
この意味で、Cでの文字出力はほぼログ生成でしかなく、
だからこそ貧弱なライブラリでも間に合ってる訳だが。

> 高級言語のよくわからずに使う感じが苦手
いやこれは違う。
「余計なことを考えなくて済む」という意味で後発言語はよく出来てるんだよ。
まあこれはじきに分かるだろうさ。
0251デフォルトの名無しさん (ワッチョイ 0bb3-C0zt)
垢版 |
2018/11/30(金) 01:14:13.61ID:dHzryZqK0
プログラミングというより解析系に興味があっていろいろ調べてただけです。
Cのこともプログラミングのこともまだ全然わからないです
0253デフォルトの名無しさん (ワッチョイ 4e80-gjgg)
垢版 |
2018/11/30(金) 08:28:07.36ID:VjmtC3o00
>>242-246
スッキリJava は、250ページにも及ぶ、猿向けにオブジェクト指向を解説した、伝説の書。
単純な言語の文法書ではない

前半はフレームワークを使う人の立場で、後半はフレームワークを作る人の立場での解説。
だから初心者は、後半を読まなくてもよい

苦しんでC は、手順書。
14歳以下とか、中学生に教えるたぐいの本。手順を教えるだけ。
たいていのAndroid アプリの本と同じ

なぜ、こういうデザインパターンをするのかとか、概念の説明などはない。
漏れは、2時間で読める。
理解して考える要素がないから、ライトノベルと同じ
0255253 (ワッチョイ 4e80-gjgg)
垢版 |
2018/11/30(金) 08:36:47.97ID:VjmtC3o00
例えば、WEB+DB 106号の「実践 Android/iOS アプリ設計」を読んでみ

DI, MVVM, Flux とか、なぜこういうデザインパターンを使うのか、
自分で理解して考えないといけないから、こういう概念の話は難しい

デザインパターンを参考にして、Ruby などでいじくり回すのが、最も身につく。
ポインターのバグ取りに、時間を取られないし
0258253 (ワッチョイ 4e80-gjgg)
垢版 |
2018/11/30(金) 10:35:00.21ID:VjmtC3o00
DI は、C++ の、p-impl パターン。
外部から、後に作られる、依存性を注入する

class A { new B(引数); }
class A { b = 構築メソッド }

上のように、クラスA 内で、直接B を作らず、
構築メソッドで、Bインスタンスを作る

例えば、クラスBの引数の変更が、クラスAに及ばないように、疎結合にしている。
クラスA・Bの作者が、同一でない場合に、効果が大きい

間接的に、Duck Typing, Interface を使う事で、インターフェース・構築メソッドが固定されるが、
同じ構築メソッドを使うことで、似たようなクラスを扱いやすい
0259デフォルトの名無しさん (ワッチョイ a79f-C0zt)
垢版 |
2018/11/30(金) 14:03:17.31ID:wR5wJL4H0
苦Cから入ったけどつまずいて1年くらい何も触らなかったおもひで
0262デフォルトの名無しさん (ワッチョイ a79f-C0zt)
垢版 |
2018/11/30(金) 17:20:44.30ID:wR5wJL4H0
アセンブラの入門かじった程度でもイメージはつかめるしCで躓くことはかなり減ると思う
0264デフォルトの名無しさん (アウアウウー Sa47-2q9Y)
垢版 |
2018/11/30(金) 18:33:32.23ID:vx8Iixcxa
BASICの全てグローバル変数だとか行番号に苦しんでいた時に徐々にMS-DOSでCが使える状態になってきて、PC-98でMS-DOSが使えるようになり、TurboCとかも出て俺は救われた。

しかしその後UNIX関係の仕事になったのでCができて当たり前の環境になってしまった。
■ このスレッドは過去ログ倉庫に格納されています

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