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
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ができて当たり前の環境になってしまった。
0269 ◆QZaw55cn4c (ワッチョイ ba60-4R1R)
垢版 |
2018/11/30(金) 23:31:23.55ID:MkfLpznc0
>>253
>スッキリJava は、250ページにも及ぶ、猿向けにオブジェクト指向を解説した、伝説の書。
私が知りたいのはスッキリC++(そんなものが存在するのですか?限りなく胡散臭いですね)の話です
0271デフォルトの名無しさん (ワッチョイ b3af-C0zt)
垢版 |
2018/11/30(金) 23:34:56.47ID:PIchVJHi0
#define C Java
0272 ◆QZaw55cn4c (ワッチョイ ba60-4R1R)
垢版 |
2018/11/30(金) 23:50:06.20ID:MkfLpznc0
>>263
下準備にはPEEK/POKEも重要
私は CALL で呼んでいた記憶がありますが、もしかするとNとN88とN88(86)とでは違っていたかもしれません…
0273デフォルトの名無しさん (ワッチョイ 0bb3-C0zt)
垢版 |
2018/12/01(土) 07:43:03.30ID:7EJdQB2R0
PC6001でBASICを覚えてPLAY,SOUNDで音楽作ってたな
PSGの音を聞くだけで懐かしい気分になる
そしてMSXでMSX-Cを覚えた
cursesがあったからローグもどきのゲーム作って遊んでたよ
0276デフォルトの名無しさん (ワッチョイ 2393-abuG)
垢版 |
2018/12/01(土) 09:27:06.02ID:TOuK5lWF0
関数と手続きを総称して、「メインルーチン」に対して「サブルーチン」って
言い方なら今でも使うんじゃないかな。
プログラミング教育の初期の段階での説明。

BASICでの「サブルーチン」は言語仕様での用語だっけ?
0282デフォルトの名無しさん (ワッチョイ 0bb3-C0zt)
垢版 |
2018/12/01(土) 16:11:09.57ID:oMoZEV7I0
アセンブラだと値返していようがいまいがサブルーチンっていうよね
今曖昧だってことは元々曖昧だったのかな
0283デフォルトの名無しさん (ワッチョイ e3f2-r3MB)
垢版 |
2018/12/01(土) 16:42:04.42ID:mW7z3f7A0
もともとは呼び出しがステートメントであって返値というものが存在しないサブルーチンと、
値を返して式の一部となる関数という区別だね。
式+;が文になるという単純化を行ったCではその区別もなくなってそれが主流になった。
副作用のないものが関数、ありえるのがサブルーチン、と定義を変えて復活はあるかも。
0286デフォルトの名無しさん (ササクッテロレ Sp3b-4pMt)
垢版 |
2018/12/01(土) 18:36:37.73ID:qSa8BGaMp
副作用のある手続きをほんとは関数とは呼ばないのだろうけど
Cではそんなことに頓着せず全て関数に単純化したからね

ただ本来サブルーチンとはメインルーチンと対立する文脈で語られていたものかと
これは単なる呼び出し関係だけでなく、古い言語では変数のスコープなども異なる
Cではこれも単純化してしまった
main は単にスタートアップルーチンから最初に呼び出されるという以外は
特別なスコープを持つわけでもなく、他の関数と何ら違いがない
他の関数から main を呼ぶことも、普通やらないだけで問題なく可能だ
Cでサブルーチンという名前がしっくりこないのはこの辺が理由でもあるかと
0288デフォルトの名無しさん (ササクッテロレ Sp3b-4pMt)
垢版 |
2018/12/01(土) 19:53:46.70ID:qSa8BGaMp
>>287
そうだけと、その辺の用語も統一されてるとは言い難いところがあるよ
AdaなどのPascal系の言語ではprocedureとfunctionという区別があるよね
まぁ値を返すかどうかという違いでしかないわけだけど
VBではPascalのprocedureに相当するのはSubであって、SubとFunctionをまとめた
上位概念としてプロシージャと言うからね
0291デフォルトの名無しさん (ワッチョイ 2b4f-y69T)
垢版 |
2018/12/01(土) 22:38:01.02ID:VxENaYkZ0
>>286
> 副作用のある手続きをほんとは関数とは呼ばないのだろうけど
> Cではそんなことに頓着せず全て関数に単純化したからね
逆だぞ。関数型が馬鹿やったから「副作用」なんて言葉が必要になったのであって。

元々Cの関数は副作用がない。これは単純に、Cの場合は引数で渡すしかないからだ。
(当たり前だがグローバルは使わないとする)
だからC全盛の時代には「副作用」なんて言っている奴すら居なかった。
関数型の連中が副作用(キリッとか気にする必要がでてきたのは、クロージャを濫用したからだ。

単純に言えば、関数に対しての値の渡し方は、
・引数
・グローバル
・this(OOPの)(=インスタンス内グローバル)
・クロージャ(=レキシカルスコープの場合は階層内グローバル)
とあって、クロージャは使い方を間違えば結合を強めてしまうんだよ。
(thisの場合は最初からクラス界面で切る《=public/privateを意識して設計する》
からそこまで酷くはならない)
Cはそれがないから、便利に書けない反面、無駄に結合するって事もない。
(少なくとも、結合していることは明示的に見える)
伊達に50年近く現役な訳でもないのさ。現役で居続けられた理由がある。

>>288
AdaとかPascalとか、最早死んで誰も使わないし使う価値もない言語を持ち出しても、
何の意味も無いと思うぜ。
それらが死んだのは、それなりの理由があるんだよ。
0294デフォルトの名無しさん (ワッチョイ bebe-lzSb)
垢版 |
2018/12/01(土) 23:00:40.61ID:piawvWud0
Cに副作用の概念はないって……それは流石に嘘でしょう。
箇所は失念してしまったがK&Rにも関数を指して「文字列を出力したりする場合もあるので純粋な関数とは呼べない」
みたいな記述あるくらいだし。
0296デフォルトの名無しさん (ワッチョイ 2b4f-y69T)
垢版 |
2018/12/01(土) 23:11:44.86ID:VxENaYkZ0
>>294
副作用の概念はあるに決まってるだろ。
そもそもプログラミング自体が副作用を伴うものであって、
全てを含んだ「学術的な意味での副作用」を伴わないプログラムなんて、何もやらないプログラムだからだ。
それすら理解出来ない>>293なんてただの馬鹿だ。

そうではなくて、関数型()の連中が言っている意味での「副作用の無い関数」についてなら、
Cは全ての関数が該当する、ということだよ。
だから、「副作用(キリッ」する必要すらなかったって事だよ。

試しに関数型()の連中に、「クロージャ禁止、this禁止、グローバル禁止、全て引数で渡せ」と言ってみろよ。
多分、顔が引きつると思うぜ。
■ このスレッドは過去ログ倉庫に格納されています

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