18/10/29 21:37:04.36 l03/lfXna.net
0x99b9e4313e3e
3:デフォルトの名無しさん
18/10/30 23:57:20.35 EION13qUM.net
自分を賢いと思っている馬鹿は
周りが自分をどう見ているかも
相手がどのレベルにいるのかも
なぜ自分が放置されてるのかも
何一つ知らない
4:デフォルトの名無しさん
18/11/01 16:13:41.13 upF+pHX50.net
musl-libcみたいに,特定のOSのプロジェクトではないPOSIXユーティリティの実装ってありますかね。
5:デフォルトの名無しさん
18/11/01 17:07:48.90 g+DLXddba.net
NewLibとかあったね
6:デフォルトの名無しさん
18/11/03 10:27:59.63 gIO4YTzK0.net
strtok_sを4変数にするとエラーになるんですけどどうしたらいいですか?
strmaxがある説明と無い説明があってわからないです。
7:デフォルトの名無しさん
18/11/03 11:28:06.76 hj5IrB61M.net
>>6
msvcのstrtok_sは非標準だから、_MSC_VERとかが定義されてるかどうかで呼び分けるしかないね。
あんまり覚えてないけどmsvcバージョンのほうが先にあった気がするから、iso/iecが悪い気がする。(間違ってるかも)
まあmsが切り替えスイッチを用意してくれればよいのだけど。
8:デフォルトの名無しさん
18/11/07 08:24:14.69 60G+FgCT0.net
>>7
よくわからないのでstrtokを使いました。
9:デフォルトの名無しさん
18/11/07 16:09:41.16 39tnP8GCx.net
ちょっとお知恵を拝借。
符号付き14ビットの整数があるとき(14ビットのMSBが符号ビット)、その値を符号付き16ビット値に拡張するうまいやり方はないでしょうか?
拡張後も符号や数値自体は変化なしです。
例えば2進で
10 1010 1010 1010
という符号付き14ビット値があった時、
1110 1010 1010 1010
のように変換したい。
14ビット値を16ビット符号付き変数に入れて左に2ビット論理シフトし、さらに右に2ビット算術シフトすれば実現できるのですが、何となく気持ち悪くて。
サクッとエレガントな方法はないでしょうか?
10:デフォルトの名無しさん
18/11/07 16:25:54.26 Gtw+mwj/H.net
>>9
シフトが一番エレガント。
11:デフォルトの名無しさん
18/11/07 18:02:56.37 d49i6th8M.net
>>9
2の補数表現として…
普通に14bit目が1なら0xc000とorするだけじゃないの?
12:デフォルトの名無しさん
18/11/07 18:16:05.56 bimd4khFa.net
もはや答えが出切ったと思うので斜め上からの回答でも書いておくか。
回答
int型が14ビットの整数型になっているCコンパイラを使う。
もちろんchar型は7ビット。
CPUは1バイトが7ビットである。
13:デフォルトの名無しさん
18/11/07 19:11:16.88 d49i6th8M.net
それ16bitの結果得るのが面倒なだけだろ
もう少し面白い回答頼むわ
14:デフォルトの名無しさん
18/11/07 19:12:35.33 xr+D7aWAM.net
皆様回答ありがとうございます。
今回はビットシフト方式で行こうと思います。
>>12
使ってるCPUとコンパイラがマイナーな、ある意味純粋な16ビット環境で、sizeof(char)もsizeof(short)も1を返し、sizeof(long)は2を返すような特殊な環境なので7ビットマイコンではありません。
15:デフォルトの名無しさん
18/11/07 19:46:07.55 SCUqGzCI0.net
intが14ビット
そんな処理系あるの?
16:デフォルトの名無しさん
18/11/07 20:47:19.69 bimd4khFa.net
>>15
多分ない。
しかし1バイトが6ビットとか9ビットのマシンはあったようだよ。
URLリンク(qiita.com)
17:デフォルトの名無しさん
18/11/07 20:49:47.59 YuYLxFMn0.net
60~70年代メインフレームは百花繚乱だったなぁ
URLリンク(en.wikipedia.org)(computer_architecture)
27bitマシンとかどーすんだよ
18:デフォルトの名無しさん
18/11/07 20:55:36.02 Lazgvcn1M.net
このように1バイトが何ビットかはアーキテクチャ依存のため、EUではハードディスクなどのパッケージにはGB単独表記は認められず、Go(ギガオクテット)を併記または単独で表記しなければならない。
1オクテットは必ず8バイト。
19:デフォルトの名無しさん
18/11/07 21:07:14.78 fEoWtkRgM.net
つまりEUでもHDDの容量はわからないってことか
20:デフォルトの名無しさん
18/11/07 21:09:34.64 u7stYdWj0.net
>>18
いや、Octetは8ビットでは?
21:デフォルトの名無しさん
18/11/07 21:12:33.55 Lazgvcn1M.net
そうでしたwwwww
22:デフォルトの名無しさん
18/11/07 21:19:59.22 h4FWJh3Ka.net
大丈夫。
文脈から理解はしてる。
上げ足取りなだけだ。
23:デフォルトの名無しさん
18/11/07 21:47:40.71 lW24kLVO0.net
バグってそういうもんだろ
笑ってられる神経が異常だ
24:デフォルトの名無しさん
18/11/07 23:27:18.47 fWOqg0Pc0.net
バカってそういうもんだろ
25:デフォルトの名無しさん
18/11/08 00:45:35.31 LWRNNBjj0.net
>>12
CHAR_BIT は 8 以上、 INT_MAX は 32767 以上って規定があるから、規格非準拠になっちゃう。
26:デフォルトの名無しさん
18/11/08 22:02:06.26 WtJgli4G0.net
だから何? 違ったら笑うしかできない無能か
27:デフォルトの名無しさん
18/11/08 22:55:19.89 nQ7J47/rx.net
C89止まりのものです
私のような者が C11などの新しい規格を学ぶのによい書籍はありますか?
28:デフォルトの名無しさん
18/11/08 23:16:18.68 x4oYjs6S0.net
このスレは最近独り言が増えたのか?
オレもそうだがな
29:
18/11/08 23:21:07.60 PviajTiD0.net
>>27
>C89止まりのものです、私のような者が C11などの新しい規格を学ぶのによい書籍はありますか?
私もC89止まりですが、それで困ることがあるのでしょうか?
30:デフォルトの名無しさん
18/11/08 23:28:43.81 6k9Hci0C0.net
>>29
私はC99で止まっていますが、最近はもっぱらPythonを使っているので困りません
31:デフォルトの名無しさん
18/11/09 05:43:42.12 1ixP0EQ90.net
pythonいいよな
yieldとかC標準にもほしい
32:デフォルトの名無しさん
18/11/09 10:07:36.38 6cegpcYL0.net
cpythonのyield実装を見ればC言語に移植できるんじゃねえの
33:デフォルトの名無しさん
18/11/09 11:42:49.67 Sh6b3ug/a.net
yieldって何につかうの?
34:デフォルトの名無しさん
18/11/09 12:33:54.85 DHGOZxvaa.net
動き的にgets的な動きする。
表示したら即メモリ解放的な。
35:デフォルトの名無しさん
18/11/09 12:41:29.53 GUqFOdkWM.net
>>31-32
yieldはソース上に出ないデータを管理しないといけないからC言語の理念と合わない気がする
※ 個人の感想だが…
C++には欲しいな
36:デフォルトの名無しさん
18/11/09 12:52:21.62 1VeVq06f0.net
yieldはいわばスタック情報の保存だから、setjmp、longjmpで出来そうな出来なさそうな?
37:デフォルトの名無しさん
18/11/09 13:11:31.21 JsSTi+Gxa.net
ん?thread?
38:デフォルトの名無しさん
18/11/09 13:52:10.49 Sh6b3ug/a.net
単にコンテキスト保存するだけだからまあ再現はできるよ
書き方としてイテレータとか欲しいのはわかるけど実現方法はどうでもいいわけじゃん
39:デフォルトの名無しさん
18/11/09 14:11:15.88 lOb1tGzl0.net
yieldは便利で使い勝手がいーるど
40:デフォルトの名無しさん
18/11/09 20:13:38.25 3ZHBVzZ50.net
POSIXの<errno.h>にある番号とBSDの<sysexits.h>で全然番号が違うのは理由があるのかな。
いままで<sysexits.h>に従って「許可がない」動作は77を返すものだと思ってたら
Linuxでは1を返すのでなぜだと思って調べたら<errno.h>では権限エラーは1。
嫌だなぁ。
41:デフォルトの名無しさん
18/11/09 20:53:23.68 GUqFOdkWM.net
77とか1とかのリテラルで書くバカって今でもいるんだ…
42:デフォルトの名無しさん
18/11/09 23:18:17.74 Sh6b3ug/a.net
POSIXで具体的な数値決めてたっけ?
43:デフォルトの名無しさん
18/11/10 05:46:23.69 PYYpj2JU0.net
>>40
<errno.h> の方はC言語でシステムコールしてエラーになった時の errno 変数の値で、
<sysexits.h> はプログラムが exit() 等で終わる時に使う値なので全く用途が違う。
44:デフォルトの名無しさん
18/11/10 06:30:10.24 lBOHSSIo0.net
>>43
つまり<errno.h>で定義された値はユーザーからは見えないんだね。
45:デフォルトの名無しさん
18/11/10 06:43:06.70 PYYpj2JU0.net
>>44
見えないというか、ただの数値なのでどこにでも使えないわけではないが、errnoの値をexit()で返す事は想定して作られていない。
46:デフォルトの名無しさん
18/11/10 11:37:20.64 lMF42kZL0.net
>>45
わりとerrnoを返してくる人多いけどね
47:デフォルトの名無しさん
18/11/10 11:58:28.71 4Oh2WWEl0.net
errno返してもらっても困る
48:デフォルトの名無しさん
18/11/10 17:42:25.30 16GnFLu/0.net
#defineマクロ定数はプリプロセッサで単純置換されるだけだからな
49:デフォルトの名無しさん
18/11/10 18:12:43.61 JVjCprWqa.net
>>46
多いか?
別にそう作っちゃいけないということはないが、できれば exit() では <sysexits.h> の方を使って欲しいな。
単なる個人的な希望だが。
50:デフォルトの名無しさん
18/11/10 18:13:54.94 lBOHSSIo0.net
>>45
>>46
ありがとう。
ユーティリティ自体の終了ステータスはPOSIXの範囲では0もしくは非0,
BSD拡張で<sysexits.h>で定められている値を使えば まあユーザーの助けにはなるって認識でいいかな。
51:デフォルトの名無しさん
18/11/10 18:26:46.25 JVjCprWqa.net
そう。
52:デフォルトの名無しさん
18/11/11 12:27:27.91 2PA7tL2j0.net
struct S {
size_t len;
type-X buf[0];
};
という状況下で、
size_t const len = 500;
struct S* const p = (struct S*)malloc(sizeof(struct S) + sizeof(type-X)*len);
p->len = len;
p->buf = (type-X*)((size_t)p + sizeof(struct S));
という処理を偶に見かけますが、これだと末尾パディングの影響でbuf[1]のアドレスがtype-Xのアライメントに沿っていない可能性があるので、不正な気がします
具体的には
struct S {
size_t len;
type-X* buf;
};
として、
size_t const len = 500;
size_t const padding_for_align_x = alignof(type-X)*(sizeof(struct S)%alignof(type-X) == 0 ? 0 : 1);
struct S* const p = (struct S*)malloc(sizeof(struct S) + padding_for_align_x + sizeof(type-X)*len);
p->len = len;
p->buf = (type-X*)((size_t)p + sizeof(struct S) + padding_for_align_x);
...などとしないとアライメント違反になりそうな気がするのですが、この認識は正しいでしょうか
53:デフォルトの名無しさん
18/11/11 12:57:16.34 2PA7tL2j0.net
すいませんよく考えたら自己解決しました
>>52の質問は取り下げます
お騒がせしました
54:デフォルトの名無しさん
18/11/11 14:07:31.98 PRctJ18Z0.net
>>4
へー。musl-libc知らなかったけど組込Linuxとかの界隈では有名っぽいね。
ソース見たけどすごく短かいのが多くて逆に不安になったw
55:デフォルトの名無しさん
18/11/11 15:17:31.04 0RasjQan0.net
sysexits.h って初めて知った
>>49
Linuxとかだと ls unko で 2 が返るとか割と普通
56:デフォルトの名無しさん
18/11/11 16:17:47.42 PRctJ18Z0.net
>>55
まあBSDでプログラミングしたことないと あんまり知りえないと思うわ。
だいたいPOSIXで定められてる訳じゃないから 知っておくべきなのはBSDプログラマくらい。
ただLinuxプログラムのエラーコード周りはなぜか非統一的なんだよね。
GNUコーディング規約で事細かに決められてそうなものだけどねw
apt(1)なんて権限エラーに100返すんだぜ?
57:デフォルトの名無しさん
18/11/11 16:41:45.09 PCIE9alw0.net
>>52
『MSDNこそC++である』という格言があるように、構造体の末尾の配列は不定長に出来ます
構造体内の可変長配列
URLリンク(msdn.microsoft.com)(v=vs.120).aspx
58:デフォルトの名無しさん
18/11/11 18:01:07.65 EYHizhRi0.net
VLAとは違うんだよな
そのページのサンプルに限っては不完全型配列の直前にサイズ情報があって確かに可変長だが
配列そのものがサイズ情報を含むのではないので、不定長とでもいうべきものだ
59:デフォルトの名無しさん
18/11/11 18:07:53.58 PRctJ18Z0.net
どうでもいいけど そのURLの書式はなんだ?
URLパラメータってそんな位置に置けたっけ。
60:デフォルトの名無しさん
18/11/11 18:21:19.83 1ROtIrLE0.net
先頭さえ確定できれば後ろなんてどうでも良い
さすがのC言語さん
61:デフォルトの名無しさん
18/11/11 21:36:09.88 1MIvJQ9R0.net
>>57
その格言は初めて聞きましたw
その方法だとアライメント違反になるかならないかが気になっていたのですが、
* 末尾のbuffer[0]でその型のアライメント以上のアライメントを構造体に強いることができる(拡張)
* 末尾のbuffer[1]の場合は当然構造体にそのアライメント以上のアライメントを強いることができる(c89)
* 末尾のbuffer[]でも同様(c99での仕様)
となり、全パターンでbuffer[i]へのアクセス時にアライメント違反にならないので、
ポインタメンバにしてアライメント気にしてmallocする必要ないのかー、これでいいのかーと解決した次第です
>>58
英語だとflexible arrayでした
62:デフォルトの名無しさん
18/11/11 22:08:30.71 7PNv93Lvf
c言語はとてもマシな呪いだと思うよ。
センスいいね、お互いにね。
63:デフォルトの名無しさん
18/11/11 22:10:10.02 7PNv93Lvf
新参者を呪う言葉は、先輩なら誰でも当たり前の事実であるかのように発するからね。
64:デフォルトの名無しさん
18/11/11 22:09:10.99 3Du2sMqla.net
>>59
v=vs.120のとこ?
クエリストリングちゃうやろ
65:デフォルトの名無しさん
18/11/11 22:26:25.11 0F8Q4Ddx0.net
>>55
ま、確かにコマンドごとにバラバラだな。
errno とも無関係だったりする。
66:デフォルトの名無しさん
18/11/12 13:20:45.59 JkRQG90v0.net
もうちょっと皆がリターンコードについて考えてくれたらいいね。
67:デフォルトの名無しさん
18/11/12 13:26:58.93 yW6s8Lj00.net
コマンドの戻り値って、皆さんどの様に活用されてますか?
成功か失敗か、それが分かれば十分な気はしますけど
68:デフォルトの名無しさん
18/11/12 13:50:25.07 JkRQG90v0.net
>>67
例えば同じ「失敗」でも何が原因なのか分かったほうが問題に対処しやすくない?
ファイルが存在しないのか はたまたファイルが現状の権限では読みとれないのか。
もちろんエラーメッセージを見てもいいけど。
あと,終了ステータスを見ないと成功失敗が分からない場合がある。
例えばdiff(1)ユーティリティーなんかは「1」という(一見失敗してるような)終了ステータスに
「(コマンド自体は成功してるが)不一致が発見された」という意味を割り当ててる。
fsck(1)ユーティリティーはもっと複雑。
まあ知ってるに越したことはないし<sysexit.h>はPOSIX標準ではないにせよ,
Unixプログラミングをする場合は積極的に利用してもいいかも。
69:デフォルトの名無しさん
18/11/12 14:11:20.80 yW6s8Lj00.net
イヤ、使い方の可能性としてそう言うものがあるくらいは知っている
実際に使っている人がいたら、どういう使い方をしているかを聞きたいんだ
70:デフォルトの名無しさん
18/11/12 16:42:56.85 JkRQG90v0.net
勘違いしてましたわ
俺の知ってる限りじゃシェルスクリプトでは多用されてるがCではどうだろうね。あまり見掛けない。
71:デフォルトの名無しさん
18/11/12 17:16:29.53 7RdsKszja.net
diffでちょっと迷うくらいだよな。
72:デフォルトの名無しさん
18/11/18 22:01:33.04 Fz4U8sel0.net
#define elif(e) else if (e)
みたいにして
if (...) {
...
} elif (...) {
...
} else {
...
}
↑こういう感じにするのってやっちゃマズいのかな。
個人的にelifキーワードがある言語に慣れてるんでこうやってて
現状特にエラーに遭遇したことはないんだけど
OSSのソースコードとか個人が公開してるソースコード見ても
こういうことやってないんだよね。
73:デフォルトの名無しさん
18/11/18 22:14:05.51 Eond7dK60.net
>>72
やめとけ
メリットが1ミリもないから誰もやらない。
善し悪しはさておき、C言語での判断基準はほぼ「実行性能」であって、
else if と書けばいいだけの所をいちいちマクロにする馬鹿なんて世界中に誰もいないだけ。
というか、そのレベルで慣れられないのなら、elif言語だけ使っておけ。
74:デフォルトの名無しさん
18/11/18 22:24:21.65 KTJRdzRs0.net
#define { begin
みたいなことを本気でやる奴がいたとはw
75:デフォルトの名無しさん
18/11/18 22:26:08.72 KTJRdzRs0.net
#define begin {
逆だったわw
76:さまよえる蟻人間
18/11/18 22:35:31.43 ZI/kDlHTd.net
ソースコードを静的解析する関係で、文法を強引に変えるような変態な前処理は良くないらしい。
77:デフォルトの名無しさん
18/11/18 22:39:49.79 HA6us6PZ0.net
世の中の静的解析ツールは当然プリプロセッサ適用後の状態で解析するわけで
78:デフォルトの名無しさん
18/11/18 22:42:50.43 gSv28L1Ba.net
typedefも避けるという流儀はあるからね
まあ気持ちはわかる
むしろGNU拡張のtypeofはアリ
79:デフォルトの名無しさん
18/11/18 22:45:11.55 Eond7dK60.net
>>75
endは普通に変数名に使われてるから無理だな。
それはさておき、セミコロン嫌いも拗らせておかしくなってるよな。
80:デフォルトの名無しさん
18/11/18 22:47:48.36 Eond7dK60.net
>>78
> typedefも避けるという流儀はあるからね
それはC++ではないか?Cでは使われまくりだったような。
81:さまよえる蟻人間
18/11/18 23:14:59.59 ZI/kDlHTd.net
国際会議で誰も知らない方言を話して良い訳ない。オープンなソースコードは世界中の人が見るんだから。
82:デフォルトの名無しさん
18/11/18 23:19:46.27 we8vMVw10.net
>>80
多分linuxカーネルの流儀じゃないかな
struct/enum/unionとかの省略を目的としたtypedefは行わない
opaque-type/関数ポインタとかの必然性が無い限り対象は明示するっていう戦略
83:デフォルトの名無しさん
18/11/18 23:37:43.07 Eond7dK60.net
>>82
> struct/enum/unionとかの省略を目的としたtypedefは行わない
こんなのは当たり前だ。(linuxカーネルに限らず)
そもそも「タイプ数をケチるだけの為に何かする」という文化は最近のWeb系馬鹿言語だけであって、Cにはない。
当然、else if を elif にしたがる奴もいない。
「腕のいい奴のコードは短い」を勘違いしてる馬鹿共がやたら「タイプ数」にこだわってるだけだ。
だいたい、structをタイプしたくなければC++コンパイラ使えば済むし。
84:デフォルトの名無しさん
18/11/19 00:20:04.42 DaKcZAfU0.net
ここで聞いていい内容なのかわからないのですが
gccを4.8.1から8.1.0に変えたらwinAPIを使用して図形を表示するプログラムで
図形が表示されずウィンドウだけ表示されるようになってしまった
これは、c言語,gcc,winAPIどれを疑えばいいのでしょうか?
MingW-W64-buildsというところから8.1.0のgccはダウンロードした
85:さまよえる蟻人間
18/11/19 00:24:07.93 4H6R9aF+d.net
図形の描画ルーチンを貼れ。
86:デフォルトの名無しさん
18/11/19 00:25:09.76 +eaeK27e0.net
>>83
なぜ唐突にweb系云々に話が飛ぶのか理解できないのだが、
typedef struct {...} S;
typedef enum {...} E;
void f(S* s, E e);
上のような書き方、結構(昔から)見かける気がするけど
87:デフォルトの名無しさん
18/11/19 00:28:01.74 1op4u+BL0.net
>>84
お前の頭、だな
gcc4.8.1で行けるのならそれでやればいい話。
それを8.1.0に変えただけで問題が発生するのなら、当然そこに問題がある。
そしてそもそも詳しいことはそのソースを作った奴に聞け。
88:デフォルトの名無しさん
18/11/19 00:30:44.00 +eaeK27e0.net
というかこれ以外だとtypedefを使うべき所にしか使わないはずなので、
cだろうがc++だろうがtypedefの使用量に差が出るとは思えない
ああ、実は>>80ってc++ならusing使うべきとかそういう話?
89:デフォルトの名無しさん
18/11/19 00:46:59.49 1op4u+BL0.net
>>86
> 上のような書き方、結構(昔から)見かける気がするけど
個人的には疑問があるが、おそらく実際はそちらの方が正しいのだろう。
C++で対策された=C言語のそこがウザイと禿が判定した、ということだから。
> なぜ唐突にweb系云々に話が飛ぶのか理解できないのだが、
ググレば分かるが、その辺の言語では「こちらの方が短いから良い」といっているページは結構見かける。
C言語でこれを言っている奴は皆無だ。
>>88
> ああ、実は>>80ってc++ならusing使うべきとかそういう話?
いや、そうじゃない。そちらの取り方で問題ないし、君の typedef の使い方は正しいと思う。
typedefって結局「型に別名を与える」為の物で、
型が自由に定義出来るようになったC++ではほぼ要らないはず、って話。
90:デフォルトの名無しさん
18/11/19 01:03:17.87 DaKcZAfU0.net
>>87
そうか...仕様変更、バグ、なにか他にも入れるものがあるとか分かるなら聞きたかったんだが
仕方ない。ありがとう
4.8.1だと古くなってるかなと思って思い切って8.1.0で試してみてるんだけど戻すか
91:デフォルトの名無しさん
18/11/19 01:03:24.61 CKJwSX5SM.net
Web系言語界隈は条件演算子をif文の簡略表記()だの省略形()だの言ってる池沼も多いからなぁw
92:デフォルトの名無しさん
18/11/19 01:16:02.93 1op4u+BL0.net
>>90
まじめにやる気があるのなら、少しずつ上げて切り分けるのは簡単だろ。自分でやれよ。
ここで聞くより早いと思うぜ。
93:デフォルトの名無しさん
18/11/19 01:26:41.23 on7lyeKV0.net
else if の省略形は確かに頂けない
あれはperlからだっけか?
94:さまよえる蟻人間
18/11/19 01:28:26.32 4H6R9aF+d.net
#elifはあって、elifがないのは変だが、キーワードを節約するためだから。
95:デフォルトの名無しさん
18/11/19 01:30:10.27 1op4u+BL0.net
>>93
歴史的には多分sh
70は多分python
96:デフォルトの名無しさん
18/11/19 01:37:20.71 DaKcZAfU0.net
>>92
なるほど、きざんでやってみます
ありがとうございます
97:デフォルトの名無しさん
18/11/19 01:38:53.01 +eaeK27e0.net
>>89
あー...もしかして自分の
>struct/enum/unionとかの省略を目的としたtypedefは行わない
これが「型定義時に、キーワードとしてのstructやenum、unionの省略のためだけのtypedefは行わない」
つまりstruct S{...}という形で定義し、明示的にvoid f(struct S* s)などといった形式で取り扱う
...という意味ではなく、
「structやenum、unionといった型について、それら個々の名前(タグ名)を単に省略するためだけのtypedefは行わない」
つまりtypedef struct SS...SS Sというただの省略形式にするtypedefは行わない
と伝わったのかな
それなら書き方が悪かった、申し訳ない
98:デフォルトの名無しさん
18/11/19 12:18:16.63 hiATcnIp0.net
>>94
自分もここが引っ掛かったんだよね。
プリプロセッサ向けにはelifキーワードがあるのに
コンパイラ向けにはない。
もしもキーワード数を節約したり実行速度のみを重視する実装なら
プリプロセッサ向けにもelifキーワードはなかった筈。
なのにある,ということはなにかしらタイプ数の節約とか読み易さとかを考慮してるんだろうね。
だからコンパイラ向けにelifキーワード(の紛い物)を追加するというのは何らおかしくないと思うのだが。
99:デフォルトの名無しさん
18/11/19 13:17:22.86 X/ZWPPJsx.net
そもそもC言語にはelse ifって構文はないよ。
んで、プリプロセッサは#の後をスペースなしの1語にした結果だと思う。
100:デフォルトの名無しさん
18/11/19 13:27:56.02 X6/A5UNDa.net
フリーフォーマットだからelse if(...)を自分なりに分かりやすくすれば良いだけ。
101:デフォルトの名無しさん
18/11/19 21:04:51.99 DK7kmuka0.net
>>76
賛成
静的解析はツールだけがすることではなく人力でもすることだ
人力「でも」と言ったが、目的意識を持って判断できるのは人間だけで
こちらが主役であることを、小者でアフォなやつほど忘れる
102:デフォルトの名無しさん
18/11/20 01:45:19.01 EatTFoyz0.net
>>101
でも>>77でも言われてるけど
プリプロセッサ命令を効かせてから解析するのが普通なんだから
あんま関係なくね?
103:デフォルトの名無しさん
18/11/20 09:35:42.58 im347JOd0.net
>>99
構文にはなくても書けるんだから一緒だろ
104:デフォルトの名無しさん
18/11/20 15:56:41.31 mQTI1hl+0.net
負の数を識別できません。
signed int DATA = -128 (0xFF80。int は16ビット)
if (DATA > 0)
{式1}
else
{式2}
なぜか式1 が実行されます。(DATA > 0) は偽ではないのでしょうか。
105:デフォルトの名無しさん
18/11/20 16:14:32.18 ls520OJz0.net
問題のコードから症状が出るままどんどん削ってって最小単位がそのコード?
URLリンク(ideone.com)
実は右辺がcharの変数で 中身が 0x80 なんだけど
符号拡張の過程で char を unsigned char として 0x0080 と拡張したり
(処理系依存だっけか? リテラルだけだっけ?)
そういう話
106:ではない?
107:デフォルトの名無しさん
18/11/20 16:16:24.86 hc2iBltta.net
16bitってどういう処理系なんじゃろうか
108:デフォルトの名無しさん
18/11/20 16:43:19.22 mQTI1hl+0.net
>>105,106
右辺の0は定数です。
変数DATA の値はPRINT文で16進表示したものです(0xFF80)。
引用先のページは、残念ながら理解できませんでした。
申し遅れましたが処理系は組み込み用16ビットマイコン用GCC です。
処理系に依って前述のような動作になることはありえますか?
109:デフォルトの名無しさん
18/11/20 16:49:33.90 ls520OJz0.net
右辺云々は 初期化の右辺の話だけども、そこが本質じゃなさそうね
sizeof(int) = 2 かつ printf("%x", DATA) が ff80 と表示される系で
if (DATA > 0) が成立しないとな
ごめんワカラン
110:デフォルトの名無しさん
18/11/20 16:59:34.34 7KgR8FwmM.net
最小の全ソースを見せて。
この手の場合、自分では正しいと思ってるとこに思わぬポカミスが入ってることがまれによくある。
111:デフォルトの名無しさん
18/11/20 17:07:55.90 mQTI1hl+0.net
>>108,109
すいません。ご察しのとおり、変数DATA に初期値を代入しているわけではありません。
このif 文が評価される直前のDATA 値が-128 という事で、初期値を代入したように書きました。
今日はこの件で非常に疲れたので、ソースの提示は少し時間を下さい。ありがとうございます。
112:デフォルトの名無しさん
18/11/20 17:18:12.25 ls520OJz0.net
>>109
元コードをそのまま横断的に眺めてるとわからないけど
症状が残るまま、余計な箇所をがんがん削っていって簡単化していくと見つかることがあるよね
a[i++] = i; のような副作用完了点内での複数回の参照とかはどうしようもないけどw
113:デフォルトの名無しさん
18/11/20 17:26:38.15 GGiSm8Yna.net
値自体は型情報を含んでないという点は押さえないとあかんが、そういう問題でもないか。
妙なtypedefしてたりしてね。
114:デフォルトの名無しさん
18/11/20 17:33:06.78 oWNEdszs0.net
アセンブリコード読んで見るとか
割り込みでレジスタ確認とかすれば
cで見てると気づかないことが見えてくるかも
115:デフォルトの名無しさん
18/11/20 19:23:37.02 2i13hG6Q0.net
printf("check : sizeof %d: DATA = %d\n",sizeof(DATA),DATA);
if((signed int)DATA > (signed int)0)
とかやって一つ一つ動作確認してみるとか。
よくわからん動作不良起こした時は配列変数がスタックサイズ超えてたとか
16Bit環境なら32kb/64kb超えたとかが原因だったことあるけど。
116:デフォルトの名無しさん
18/11/20 19:37:09.53 TCh3BaRvM.net
>>110
そもそもその環境で>>104のコードを実行したらどうなるのさ?
117:デフォルトの名無しさん
18/11/20 20:38:14.44 xyhgdzIUa.net
>>104
本当に DATA の型は signed int か?
良く見たら unsigned int ってことはないか?
118:デフォルトの名無しさん
18/11/20 21:11:07.99 d/DSkvWpM.net
>>104
16進リテラルが16bitで収まらないからunsigned intで解釈された。(c99)
そんでintに暗黙キャストされたときに最上位bitが落ちたと思われ
119:デフォルトの名無しさん
18/11/20 22:03:30.03 HgsWcywV0.net
>>110
> 今日はこの件で非常に疲れたので、ソースの提示は少し時間を下さい。ありがとうございます。
正しい。疲れたら休め。結果的にその方が早い。
君も分かっていると思うが、まともなコンパイラ(実績のあるコンパイラ)なら、そんなところにバグはない。
ほぼ間違いなく君の勘違いだ。
それは根詰めて見てても気づかないが、一旦忘れて見直したらあっさり見つかる、ということもよくある。
残業してグダグダやるよりも、早く帰って早く寝て、次の日に早めに出社した方が捗る。
おそらくあっさり解決すると思うぜ。
120:デフォルトの名無しさん
18/11/20 22:51:04.92 0YIMqUF30.net
リテラルの大小によって、型が変わるとか、滅茶苦茶な文法だろ
コンパイルエラーにしろよ。
気づかねえ
121:デフォルトの名無しさん
18/11/20 23:08:18.58 w1zNIHuF0.net
ソースの見栄えで桁あわせにゼロパディングしたら 8進数になっててうぁぁぁ
122:デフォルトの名無しさん
18/11/20 23:08:44.13 jZchQuqWa.net
マジックナンバーあかんとか言ってもさあ、マクロで隠したせいで生じたバグも経験的にはかなり多いんだよね。
値のリテラル即悪みたいなのもどうかと思うね。
123:デフォルトの名無しさん
18/11/20 23:22:23.29 HgsWcywV0.net
>>119
型は変わらないし、普通は警告が出るはず。
いずれにしても、C言語はお前みたいな馬鹿向けには出来てない。
>>117
unsigned int から int へのキャストは普通はそのままで、飽和処理なんてしないだろ。
仕様なのか処理系依存なのかは知らんが。
124:デフォルトの名無しさん
18/11/20 23:35:21.40 HgsWcywV0.net
>>121
何をリテラルにして良いか判断出来ないのは君(または周り)の問題だろ。
独り言ではなく、問題提起~議論起動する気があるのなら、「俺なりの基準」でも言えよ。
125:デフォルトの名無しさん
18/11/21 00:29:46.48 Z1qX2lWM0.net
>>122
>型は変わらないし
つ6.4.4.1
>普通はそのまま
intの最大値を超えているのにどうやって表現する気だ
126:デフォルトの名無しさん
18/11/21 00:32:45.26 UO6rINaw0.net
>>124
> intの最大値を超えているのにどうやって表現する気だ
ならお前はdoubleの最大値を超えている場合はどうするんだ?
お前みたいな馬鹿が使うようには出来てないんだよ。
127:デフォルトの名無しさん
18/11/21 00:45:36.29 w42YOu3l0.net
釣り針が大きすぎて、咥えられないw
128:デフォルトの名無しさん
18/11/21 06:57:26.41 sFoC6dALM.net
>>120
あるあるすぎる…
129:デフォルトの名無しさん
18/11/21 09:11:45.73 xS7mIekg0.net
>>120
止めてくれ
その術はオレに効く
130:デフォルトの名無しさん
18/11/21 09:22:03.70 RC0TEAoba.net
30年ぐらい前にZ80のマイコンボード用に作ったプログラムでそれにハマった覚えがある。
131:デフォルトの名無しさん
18/11/21 09:54:03.00 PloQSCN7a.net
すぐ16進で書きたがるのもどうかと思うわ。
intに-1でなくて0xffffffff入れてるのとか意図が掴みかねる。
そもそもunsignedがあるのが良くないんだな。javaは正しかった。
132:デフォルトの名無しさん
18/11/21 10:14:15.23 nY2eM3rc0.net
70年代初期に何が良いか何が悪いか何が正解かが分かるの?
それに磁気コアメモリが4096ビットの時代だよ
133:デフォルトの名無しさん
18/11/21 10:55:13.30 Gzh6p2MJ0.net
>>127-129
リテラル中に 8 や 9 が入ってれば文法エラーで止まるので判明するけど
入ってないとそのまま通っちゃうし、特に警告の対象になるようなもんでもないしでやっかいよね
134:デフォルトの名無しさん
18/11/21 12:33:01.52 sFoC6dALM.net
>>132
今時8進表記なんて使うことはほぼないと思うから使ってたら警告してもいいくらい
135:デフォルトの名無しさん
18/11/21 13:31:24.92 VldA7vNv0.net
>>111-118
皆さんご助言ありがとうございます。おかげさまで一応不具合は解消できました。
以下問題の箇所です。
signed int MAX, WIDTH, TMP, SHIFT;
float COEF;
COEF = MAX / WIDTH; //浮動小数点演算になると思っていた
// 1 = 128 / 128
TMP = SHIFT * COEF;
// -128 = -128 * 1
if (TMP > 0)
{式1} //TMP= -128 なのに、式1
136:が実行される。 else {式2} だったのを COEF = ((float)MAX / WIDTH); に修正すると、式2 も実行されるようになりました。他に変更したところはありません。 今まで何故(-128 > 0)が真だったのかは不明です...
137:デフォルトの名無しさん
18/11/21 13:55:29.32 89fYavxUa.net
>>134
本当に if の直前で TMP がマイナスだったのかが怪しい。
それと気になるのはやはり型が本当にその通りなのかだな。
138:デフォルトの名無しさん
18/11/21 14:13:56.46 Gzh6p2MJ0.net
本当に変数の型は signed なのか?
実際に 式2 に通って欲しいのに 式1 へ流れた MAX, WIDTH, SHIFT の値 をメモって
再現する最小セットのコード作って何が起きてるのか把握しとかないと、また同じことやらかすかもよ
signed int TMP;
signed int MAX = <リテラル>;
signed int WIDTH = <リテラル>;
signed int SHIFT = <リテラル>;
float COEF;
COEF = MAX / WIDTH;
TMP = SHIFT * COEF;
printf("1:%d\n", TMP);
if (TMP > 0) { printf("1:式1\n"); } else { printf("1:式2\n"); }
COEF = ((float)MAX / WIDTH);
TMP = SHIFT * COEF;
printf("2:%d\n", TMP);
if (TMP > 0) { printf("2:式1\n"); } else { printf("2:式2\n"); }
139:デフォルトの名無しさん
18/11/21 14:20:55.45 HZsG+Ur+a.net
COEFが0なんじゃ?
まあわかんないね
140:デフォルトの名無しさん
18/11/21 22:53:01.43 UO6rINaw0.net
>>134
皆が指摘しているように、それだけでは無いと思うがな。
おそらく君が出してきたソースにも色々間違いがあるんだろうけど。
ソース見る限りズブの初心者のようだが、問題点を理解しているか?
まず用語がおかしいので先にこれを修正しておくが、普通は
float scale = width / max; だ。shiftは足すもの、scaleが掛けるもの。coeffは係数=無次元数だろ。
読んだときに違和感がないようにしろというのはアプリケーションハンガリアンの思想だが、
これを採用するかはともかくとして、思想自体は当たってる。
そして通常は max で割る。(ただしこれについては、意図的に逆数にすることもあるが)
あと変数を全部大文字にするのはマジで止めろ。そんなことしてる奴は居ないだろ。
それで、君の「キャスト忘れ」についてはscaleが0に張り付くなり、整数の階段状になるので、
「動作を見た瞬間にどこがバグっているか分かる」タイプのバグになる。
追跡するにも苦労しないし、そもそも追跡の必要すらない。
当然、疲れもしない。マジで10分で修正して、てへぺろ、だ。
だからそのバグを取るのに手こずること自体がおかしい。
そしてその遠因になっているのはその意味不明なネーミングだ。
まずはそこからだと思うぜ。
(-128 > 0)が真になることはないので、確実に君が何か勘違いしている。
先生/先輩/上司その他、見てもらえる人がいるのなら、
君のソースのその酷さも含めて見てもらった方がいい。
そういう人がいなくて君が一人でマイコンを動かそうとしてるのなら、今の君では無理だと思うぜ。
Python馬鹿なら、最近はPythonが動くマイコンもあると聞くので、環境を変えた方がいい。
マイコン環境のCは、色々と貧弱な分、PC環境のCより難しい。
今の君ではPC環境のCでも無理がある。
状況聞く限り、俺は>>137の予想が正しいと思う。
141:デフォルトの名無しさん
18/11/21 23:10:25.75 iZ9rHJSw0.net
ズブの素人が来てよかったね
嬉しそう
生きがいみたいなもんだな
142:デフォルトの名無しさん
18/11/21 23:20:56.85 ILAAUKO60.net
歳を取ると説教したくなる
143:デフォルトの名無しさん
18/11/21 23:26:10.43 0tXjM5tc0.net
何が起きていたのか本人は追求する気はないみたいなんで
話はこれ以上進まないだろう
>>139
で、それがお前の生きがいなわけだ
なんだかな
144:デフォルトの名無しさん
18/11/21 23:48:20.51 QmHGv3o90.net
低学歴知恵遅れが
低学歴知恵遅れ丸だしなレスして
イキイキしてる
145:デフォルトの名無しさん
18/11/21 23:57:18.63 UO6rINaw0.net
>>139,140
まあお前らは上達しないと思うぜ。
最近お前らみたいな奴も増えたが。
上達出来るかは結局、自分で深みに突っ込んで行けるかにかかってる。
俺の指摘が間違っている、というのならともかく、
気に入らない指摘は無視すればいい、というスタンスなお前らはプログラマは無理だ。
諦めて他の職を探せ。
132は努力しているようだが、方向を間違っている。
それはお前らにも見えてることだろ。放置するのもまた悪だと思うぜ。
巻き込まれるのが怖くて見て見ぬふりをして、結果、
陰湿ないじめが横行してたゆとりなんてその程度だと思うが。
勿論132も追求した方がいいとは思うが、正直、そのレベルじゃない。
PC環境のCでGUIのIDEを使ってまずCを覚えるか、
既にプログラミング出来るのならその言語、調べたところRubyが動くのもあるようだから、そっちから行った方がいい。
Cも初めて+マイコンも初めて、では、確実にはまる。
146:デフォルトの名無しさん
18/11/22 00:13:37.04 8rnkEr570.net
こんな低学歴知恵遅れ丸出しな長文レスばっかりで埋め尽くされると
まともなヤツは近づかなくなるわ
やはり自覚がない
147:デフォルトの名無しさん
18/11/22 07:53:35.42 pCbzIdwz0.net
>なんだこれ?引数 void って初めて見たぞ。文法的にありなのかこれ?
まーたこのゴミが登場したのか
もう出てけよ
余りにもゴミだからこのスレにはいらねーよ
148:102
18/11/22 13:02:07.52 RP03a4vB0.net
この議論に参加してくださった皆さん
>>138 さんの指摘は初心者の私には大変有難いものでした。
ただ、いくつか反論したい部分もあります。私はハード屋で、ハードウェア言語で使われる変数(フリップ・フロップ)の動作遷移を意識した変数名にした方が私には分かり易いのです。
変数を全て大文字にしているのは単純に昔からの癖です。命令文 = 小文字、引数,変数 = 大文字 と決めています。
「キャスト忘れ」についてですが、異常動作に即気付けるか否かはint 変数をキャストしないと
0,1,2・・・などの整数にしかならないことを知らなければなかなか気付けない事ではないでしょうか。
Cの参考書は持っていますが、浮動小数点演算に関連する情報が離散していて、この事象が起こりうるという説明を見出すことが出来ませんでした。
>>136 さんが提示されたテスト・プログラムは余裕が出来た時に実行してみるつもりです。現在このプロジェクトはほぼ完成しており、細かな調整を残すのみです。ありがとうございます。
149:デフォルトの名無しさん
18/11/22 13:18:43.76 mBJlqzKNx.net
>>146
まずは問題解決とプロジェクト完了おめでとうございます。
分かってると思いますが、ここは教えたがりな人、説教したい人、煽りたい人がマウントとり合うだけのスレなので、あまり細かいことは気にせず自分に有用な情報だけ吸収してくださいな。
150:デフォルトの名無しさん
18/11/22 13:19:52.16 xeK3mO2I0.net
すごいゲスパーだけど
式1 式2 が実際にはハードからの電圧出力やリレーのON/OFFで
オシレータか分周器書いててオシロで当たったら、どうもデューティーがおかしい
ってなったのかな
151:デフォルトの名無しさん
18/11/22 13:46:54.48 Q57x8lAMa.net
Cは型を意識しないとどうしようもないという所はあるよね。
なので、そもそも型変換が入る余地のない、キャストに頼らないコードを書くという強い意志を持つのが大事なんじゃろうと思う。
152:デフォルトの名無しさん
18/11/22 15:41:36.24 QPQE3Of30.net
getchar 「型変換?要らないよね?」
153:デフォルトの名無しさん
18/11/22 21:29:32.36 53EGOrV/0.net
>>143
おまえの指摘が間違っているかどうか以前に
おまえは何を指摘したんだ?
たとえば「10分」という物理量はどういう計算で出てきた値だ?
テキトーすぎて相手するに値しないんだが
154:デフォルトの名無しさん
18/11/22 22:08:04.59 /6bysR4g0.net
>>145
> ワッチョイ ff12
回答無し
だからゆとりは駄目なんだよ
>>151
> ワッチョイ 3308
同上
155:デフォルトの名無しさん
18/11/22 22:09:04.67 /6bysR4g0.net
>>146
> ハードウェア言語で使われる変数(フリップ・フロップ)の動作遷移を意識した変数名にした方が私には分かり易いのです。
他文書と同期したいのならコメントに残せ。
ソフトウェアはソフトウェアだけで評価出来ないと管理上問題だ。(大体において同期が取れずに意味不明になる)
そもそもその部分、ハード叩いている感じでもないし。
それ以前にFFの状態遷移でSHIFTも無いと思うが。
> 命令文 = 小文字、引数,変数 = 大文字 と決めています。
これはマジで今すぐ直せ。
大文字にするのは目立たせる為であって、RAMが64バイトしかないような環境ならさておき、
今時ただの変数なんて目立ったら余計に邪魔になるだけ。今時白黒端末もないから、普通は、
命令文(キーワード)=青(色付き)、引数/変数=黒(色無し)、マクロ=全大文字、と大体相場が決まっている。
(そもそもverilogにも大文字文化はない。VHDLには多少有った気もするが…)
> Cの参考書
Cに限らず、プログラミング全般で、入門書/参考書はゴミだ。理由は筆者自身がゴミだから。
海外の参考書は一部達人が書いている物があって、それは参考になるらしいが、俺はよくは知らん。
(ただこれも、昔からプログラミングをやっているのなら常識のはずだが)
> この事象が起こりうるという説明
int/int は端数切り捨てで商のみが返る、というのはCの仕様だ。
> 変数を全て大文字にしているのは単純に昔からの癖です。
言っちゃ悪いが、君は「昔から」というほどプログラミングをやってないはずだ。
昔からやってるなら、マイコンで割り算やfloatを使うこと自体が無いし、
Cの割り算の仕様を知らないこともない。
そしてそのソフトウェアの完成度で良しと出来ること自体が(普通のプログラマからすると)キチガイじみてる。
確実に事故るぞ。
156:デフォルトの名無しさん
18/11/22 22:10:24.36 /6bysR4g0.net
>>146(続き)
ただしあまり反発もないところを見ると、ただのゆとり(若者)でもないらしい。
仮に全てを満足出来るプロフィールを定義すると以下となるが、合ってるのか?
・全て大文字とはCOBOL/FORTRAN/BASIC/アセンブラの世界。つまりC以前からであり、プログラミング歴自体は長い。
・Cの基本的仕様を知らない=Cは普段使いではない。
・変数が大文字の方が都合がいい=RAMがほぼ無い4bitマイコン等だとあり得る。この場合、ほぼアセンブラ。
・基本ハードウェア+ちょいソフト(アセンブラ)程度で、今時ならIoTの末端の各センサ等、
定期的に計測値を報告するようなプログラムはずっとやってきている。
WatchDogTimerやPowerOnResetを使いまくりなのでプログラム自体はポンコツでもいい。
だとすると、下からCを攻めてきているわけだが、これはほぼ無いパターンだから最初にそれを言うべきだ。
この場合、参考書はK&Rのみで、それ以外は全部ゴミだから捨てていい。
割り算の仕様なら、P13にもろに書いてある。
> Cでは他の多くの言語と同様、整数の割り算では切り捨てが行われて、
> 小数部が切り捨てられてしまうからである。(K&R第2版P13)
K&Rは「既にプログラミング出来る人がCを入門する用」に書いてあるから、
プログラミング自体の入門者には不向きだが、君の場合は最適だ。
一応言っておくが、ハロワがP7、コメントがP11、のP13な。本当にど頭に書いてある。
アセンブラの範囲を超えてCに踏み込んできたのなら、C流の管理方法に合わせた方がいい。
アセンブラの管理方法は、結局はアセンブラの規模用でしかなく、Cの規模には対応しづらい。
アセンブラ修得済みの人がCを修得するのは容易い。
ただし既に言ったように、世の中の「入門書」はそういう人向けではないから、K&R以外は読まなくていい。
とりあえずK&Rを頭から全部一通り読め。それでだいぶ状況が変わるはずだ。
157:デフォルトの名無しさん
18/11/22 22:12:40.41 BRQlwM1LM.net
でもvoid君はC言語詳しくないじゃん
158:デフォルトの名無しさん
18/11/22 22:14:51.83 /6bysR4g0.net
>>149
× キャストに頼らないコードを書く
○ 『暗黙の』キャストに頼らないコードを書く
だろ。ただ、intをfloatに突っ込むと『精度が落ちる』と警告が出るはずだが。
(少なくともVC++ではそう。gccはこの辺甘々だから駄目かもしれんが)
キャスト自体が悪、というのはC++(というより型安全)の思想だが、
現実的にはCでは『明示的な』キャスト無しではまともに書けない。
ただし、『暗黙的な』キャストは当然無しには出来る。
159:デフォルトの名無しさん
18/11/22 23:05:52.65 Qbh1A67u0.net
>>152
10分という物理量と3308はどういう関係だ?
テキトーすぎて相手するに値しないんだが
160:デフォルトの名無しさん
18/11/22 23:32:58.42 y7NAvobyM.net
>>156
暗黙のキャスト?
意味わからん造語で語られても困るわ
161:デフォルトの名無しさん
18/11/22 23:47:40.88 Qbh1A67u0.net
>>156
> 現実的にはCでは『明示的な』キャスト無しではまともに書けない。
ほうほう
暗黙変換を明示的なキャストにすることで
どんな「現実的」なコードが書けるんだ? おいバカ
162:
18/11/23 00:18:09.13 e/BZMkzC0.net
>>156, >>158
>暗黙のキャスト
integral promotion?
それとも bcc用語では暗黙の型変換のことですか?
163:デフォルトの名無しさん
18/11/24 09:23:26.40 I8hvszb00.net
型変換って割とおこなうとは思うけどなぁ。
164:デフォルトの名無しさん
18/11/25 05:17:32.88 iX9BTM1g0.net
確かにintをflotに突っ込むのは型だけ変わるじゃなくてデータも変わるからなぁ
165:デフォルトの名無しさん
18/11/25 08:02:06.68 rsPEFWOD0.net
<stdint.h>とかのint8_tとかって
「プログラマが気が付かない整数型に関するミスをコンパイルする段階で(エラーとして)発見できる」
以外に使い道ってか利点ってないよね?
int8_tで定義することでプログラムの速度が上がったりはしないと思ってるんだけど 間違ってる?
166:デフォルトの名無しさん
18/11/25 08:15:12.05 Euo5liwn0.net
>>163
速度も上がらないし、そもそもコンパイル時にエラーとしても発見できない。
ただ単にコーディング時や人のソースを読む時にビット数が明確に認識できるだけ。
167:デフォルトの名無しさん
18/11/25 08:19:43.85 8Uvv4MpL0.net
(通信プロトコル等の)外的要因でビット数が規定されているものを操作するコードを書くとき
168:デフォルトの名無しさん
18/11/25 09:24:44.24 rsPEFWOD0.net
>>164
例えばすごく初歩的なんだけど
uint8_t型で宣言したループカウンタが500回回ったらコンパイルの時に警告でるよね。
……と思って今試したら警告レベルを最大にしてやっと出たわ。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int
main(void)
{
for (uint_fast8_t cnt = 0; cnt < 500; cnt++) {
printf("%d\n", cnt);
}
exit(EXIT_SUCCESS);
}
これを
$ gcc -std=c99 -Wall -Wextra -Wpedantic -o inttest ./inttest.c
でやっと注意してくれる。
あれ? なんかもっと良い感じに撥ねられて(不注意な自分には)便利だなと思ったんだが,勘違いだったようだw
169:デフォルトの名無しさん
18/11/25 09:53:54.15 2C+NPzGbM.net
>>163
利点というか、1byteが8bitでない環境もあるので、ポータブルなコードを書く場合は他に選択肢がないと思う
170:デフォルトの名無しさん
18/11/25 09:55:02.80 jMSg79gEa.net
それはどちらかというと静的解析の仕事じゃないかなあ。
171:デフォルトの名無しさん
18/11/25 10:08:42.57 i1TAIE2a0.net
>>166
> ……と思って今試したら警告レベルを最大にしてやっと出たわ。
最大にすれば出るのだから『便利』と言っていい。
警告レベルは自分に合わせて使うものだ。
判断する能力がないのなら、とりあえず最大にしとけ。
>>163
演算速度自体は上がらない。むしろ符号拡張等が必要になり落ちる。(事が多い)
これは通常はintがCPU内部のALU幅と同じ(つまり最速)に設定される為だ。
ただしフットプリントは減る為、キャッシュヒット率が上がり、結果的に速くなることはある。
よく分からなければ、基本的に全部 int で、明確に必要なところだけその他を使えばいい。
(同一ソースでint幅が異なる複数の処理系で動かすというような場合を除く)
172:デフォルトの名無しさん
18/11/25 10:15:56.81 rsPEFWOD0.net
>>169
ありがとう。
173:デフォルトの名無しさん
18/11/25 12:58:50.32 FjBIbaie0.net
int8_tとか使おうとしているやつ相手に、とりあえずint使っとけとか
どんだけドヤアホなんだよ
174:デフォルトの名無しさん
18/11/25 13:25:51.40 dxJC+hBBM.net
>>171
いやint8_tの利点を聞いてる時点で>>169に分があると思うぞ
175:デフォルトの名無しさん
18/11/25 14:26:54.92 uM/ivlZCa.net
現時的にはちょっとデータを保存するとかネットワーク越しに外に送るとかした時点でサイズは意識することになるから、intが無難とも言い難い。
意識できてればなんでもいいんだが…
176:デフォルトの名無しさん
18/11/25 15:22:16.95 iX9BTM1g0.net
構造体とかにint_8が入ってたらintに入れて計算してint_8に入れて
戻すのがいいのか?
177:デフォルトの名無しさん
18/11/25 16:05:11.73 FjBIbaie0.net
よくねえよ
ナローイングになっちまう
178:デフォルトの名無しさん
18/11/25 16:11:29.88 x3zl9kFB0.net
計算の途中でint8_tの範囲外になる可能性があるかどうかと範囲外になった場合にどうしたいか次第だろ。
179:デフォルトの名無しさん
18/11/25 17:07:06.68 iX9BTM1g0.net
int32_tが最速だけれどsize_tと一緒に使うと型変換がいることで遅くなるんだよな
180:デフォルトの名無しさん
18/11/25 17:16:56.38 XilAUoVOd.net
>>177
何が最速化は環境によるのでは?
少なくともfast型のほうが早そうだが
181:デフォルトの名無しさん
18/11/25 20:07:43.14 74eaLfxV0.net
ごめんバカみたいな質問なんだけど
その「遅い」っていうのは実行時の速度だよね。コンパイルが遅いってことじゃないよね。
だとすると8の倍数のbit数のCPUでint<8×N>型を使ってもタイムロスって起きない気がするんだけど……。
182:デフォルトの名無しさん
18/11/25 21:05:52.83 6ChQfOQca.net
メモリに詰めて格納してると嫌な感じ
183:デフォルトの名無しさん
18/11/26 06:54:36.44 xHCVYRaTa.net
>>179
そういうのはSSE命令とか使うXMMレジスタ使う話。
Intelコンパイラでも無いとアセンブラの話。
単純に上位ビットを0で埋める。(分遅くなる)
ただ、CPUアーキテクチャにも依存する。
95年当時はpentiumは32ビットCPUだが16ビットの方が速く、pentiumⅡ以�
184:~で32ビットの方が速くなった。 Core2は32ビットが速く、64ビットは遅く、Core iから64ビットの方が速くなった。 (ハードレベルでも、ただ実装しただけと、最適化したのとある)
185:デフォルトの名無しさん
18/11/26 14:44:44.56 00kzfg0Id.net
encode.exe
PGM 形式の画像ファイルを入力に与え,Run Length 法によって圧縮したデータを出力す る
decode.exe
encode.exe で圧縮したデータを入力に与え,PGM 形式の画像ファイルを出力する。
これをc言語で書くにはどうすればいいですか?
osはUnix開発環境はMSYS2です。
186:デフォルトの名無しさん
18/11/26 15:15:00.32 t9INuUY1x.net
ランレングスと画像フォーマットは何ら関係ないよ。
てかもしかしてランレングスのコードそのものを教えてもらうつもり?
学校の課題は自分でやりな。
187:デフォルトの名無しさん
18/11/26 15:19:44.48 00kzfg0Id.net
コードはかけたのですがエラーが出ないのに圧縮するとデータサイズが大きくなるはずなのに小さくなります。それがわからないです。
188:デフォルトの名無しさん
18/11/26 15:25:50.47 t9INuUY1x.net
>>184
私はあなたの言ってることが分からないです。
189:デフォルトの名無しさん
18/11/26 15:27:58.32 mDHVgMsLa.net
元のファイルと出来上がったファイルの中身を16進ダンプしたりして調べれば良いのでは?
それとプログラムもよーく読み直してみな。
190:デフォルトの名無しさん
18/11/26 15:36:52.43 t9INuUY1x.net
>>184
圧縮したらデータサイズが小さくなったって悩んでるんだよね?
自分で何言ってるか分かってる??
布団も圧縮したら小さくなるぜ。
191:デフォルトの名無しさん
18/11/26 15:44:04.38 mDHVgMsLa.net
Run Length は連続データが少ないと大きくなる事があるからその辺は特に不思議はない。
192:デフォルトの名無しさん
18/11/26 15:45:34.47 n96xVY2na.net
でかくなる様なデータで確かめる課題かね?
ちょっとそのまんま見てみたいね
193:デフォルトの名無しさん
18/11/26 15:47:36.67 t9INuUY1x.net
>>188
ああ、単純な実装なら確かにそうね。
194:デフォルトの名無しさん
18/11/26 18:55:01.13 XECRUPoh0.net
PGMのランレングスは何かしら工夫してんのかな
(行単位で生列とRLを切り替えできるとか? 連続性の強い色空間を選択してるとか?)
195:デフォルトの名無しさん
18/11/26 19:58:24.72 XECRUPoh0.net
あー ちゃんと読んでなかった 189 は無しで
196:デフォルトの名無しさん
18/11/26 22:38:09.76 404pxOU70.net
0バイトのデータを圧縮すると間違いなく大きくなる
197:デフォルトの名無しさん
18/11/26 22:54:04.60 9UWiUoMZ0.net
虚数空間にデータを書き移すから、さらに小さくなる、かも
198:デフォルトの名無しさん
18/11/26 22:58:35.51 XECRUPoh0.net
ホログラフィーみたいに3次元情報?が2次元に畳み込まれてなんて話ではないんだろう
199:デフォルトの名無しさん
18/11/26 23:10:34.44 4Tpz9uQJa.net
単に乱数とかね
200:デフォルトの名無しさん
18/11/26 23:21:21.04 9UWiUoMZ0.net
任意のデータをその半分に出来る圧縮技法、誰か考えて
201:デフォルトの名無しさん
18/11/27 00:17:38.39 sRUlwxGC0.net
SERNをハックしてLHCでマイクロブラックホールを作ってどうたらこうたらするとかなり圧縮できるよ
202:デフォルトの名無しさん
18/11/27 00:21:47.09 E9za3JrpM.net
綴りを間違えるとホワイトホールができちゃうかもしれんぞ
203:デフォルトの名無しさん
18/11/27 00:22:04.16 ugyzpzqZ0.net
圧縮は出来ても、復元が出来なさそうw
204:デフォルトの名無しさん
18/11/27 01:23:33.76 UHpiRGCo0.net
マジレスすると情報っていうのは消失しないと考えられているので
BH表面にエネルギー運動量テンソルの波動として,飲み込まれた物質郡の属性
(電荷など)が記録される……筈w
少なくとも現状の場の量子論と重力宇宙論ではそういう結論が出てる。
C言語とは関係ないけど,BHを記憶装置として用いるっていう考え�
205:ヘ 突拍子もないけど理論的には可能だよねぇ,上記の理屈が正しいとすると。
206:デフォルトの名無しさん
18/11/27 01:29:33.86 IxTjeZ9T0.net
みんなが何を言っているのかよくわからない
207:デフォルトの名無しさん
18/11/27 02:18:13.33 enNfKuoe0.net
C言語でok
208:デフォルトの名無しさん
18/11/27 22:26:43.87 /aKqcH8H0.net
>>197
例えば100bitの長さのデータは全部で2^100種類作ることができる
50bitの長さのデータは全部で2^50種類作ることができる
任意のデータを半分に圧縮できる方法があるとして
100bitで作れる2^100種類のデータをすべて圧縮したなら
50bitの長さで2^100種類の異なるデータができなくてはいけないがそれは不可能
209:デフォルトの名無しさん
18/11/28 01:13:46.19 BkKDQWNJ0.net
いやいや、ちょっと待て。ここは発想の転換が必要だ。例えば8インチのフロッピーディスクから3.5インチの
いや、なんでもない。みんなには内緒にしておいてくれ。
210:デフォルトの名無しさん
18/11/28 02:27:03.19 iOF+GVq50.net
「任意の」データを半分に圧縮できるとすると
圧縮した後のデータもさらに半分に圧縮できるはず
そうやって圧縮を繰り返せば最後には全てのデータは1ビットになる
よってそのような圧縮法がないことは明らか
可逆でないならそれでもいいかw
211:デフォルトの名無しさん
18/11/28 05:46:42.41 N04UITTm0.net
しかしソースコードとかって圧縮率高いよね。
やっぱり同じような文字が続いたりインデントに空白文字が続いたりするからだろうか。
212:デフォルトの名無しさん
18/11/28 07:08:14.21 82iiMHmWa.net
コルモゴロフの複雑性もあります
213:デフォルトの名無しさん
18/11/28 09:24:07.52 seMAmMUm0.net
そこでTHCompですよ
214:デフォルトの名無しさん
18/11/28 09:40:55.66 0XeeIlyH0.net
情報のエントロピー
215:デフォルトの名無しさん
18/11/28 13:43:56.99 rECr01ZDM.net
今から趣味でプログラミング始めます!激励してください!!
216:デフォルトの名無しさん
18/11/28 17:27:07.00 N04UITTm0.net
悪いこと言わないからPython3やれ
217:デフォルトの名無しさん
18/11/28 17:57:49.24 Vqd4vFOqM.net
趣味で初プログラミングなら、俺からもpythonを勧める。
GUIが手軽だとモチベーション違うよ。
218:デフォルトの名無しさん
18/11/28 18:00:54.28 rECr01ZDM.net
分かった!いやよくわかんないけどそっちから始める!
XCodeでできるかな、ありがとう!
219:デフォルトの名無しさん
18/11/28 18:48:28.91 N04UITTm0.net
$ brew install python
とやって
$ python
これで起動する。もうスレチだし「macOS Python3」とかでググれ。
220:デフォルトの名無しさん
18/11/28 19:51:31.92 wHjpMIAFa.net
Kotlinもよろしく
221:デフォルトの名無しさん
18/11/28 20:05:07.50 Vqd4vFOqM.net
まだマイナーすぎ。入門書があふれてきたら推すよ
222:デフォルトの名無しさん
18/11/28 22:31:15.42 xsmtECg3a.net
URLリンク(bituse.info)
上記のサイトなどを参考に
簡単な九九の表を作ると
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...
...
...
(略)
と、表示するには上記のサイトの様なプログラムをどのようにすれば良いのでしょうか?
宜しくお願いします。
223:デフォルトの名無しさん
18/11/28 22:37:30.42 IOIePrN/0.net
>>218
死ね
224:デフォルトの名無しさん
18/11/28 23:13:58.25 MBR3DrMT0.net
puts("3 5 7 9 11 13 15 17\n");
puts("6 10 14 18 22 26 30 34\n");
puts("9 15 21 27 33...\n");
225:デフォルトの名無しさん
18/11/28 23:24:49.65 30WXuBf5p.net
>>220
puts は改行するので、文字列の末尾に \n を付けると2回改行することになる
226:デフォルトの名無しさん
18/11/28 23:26:32.45 MBR3DrMT0.net
あっー 指摘ありがと
227:デフォルトの名無しさん
18/11/29 02:39:17.93 d0mF96D
228:3a.net
229:デフォルトの名無しさん
18/11/29 04:25:22.53 +QhJBOyD0.net
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はどの変数にも格納されていなくて、ただポインタがその文字列たちを指しているっていう理解であってます?
*がよくわからない・・・・・
230:デフォルトの名無しさん
18/11/29 04:37:33.83 +QhJBOyD0.net
ああ直接ポインタを作っててそれで変数がある必要もないのかな?
AAAA,BBBB,CCCCを普通に配列で作って、それを1つのポインタでオフセットを指定して選ぶ。みたいなのってCでできるんですか?
231:デフォルトの名無しさん
18/11/29 05:10:38.21 ljP5qN1x0.net
any[]には各文字列のアドレスが格納される。文字列へのポインターの配列。
%sはポインターが指すアドレスの文字列を、%xはポインターに格納されたアドレスを表示する。
&any[]とすると、ポインターそのもののアドレスを取得して表示する。
61ff24 -> 405064 -> "AAAA"
みたいになってる。
232:デフォルトの名無しさん
18/11/29 05:25:57.02 ljP5qN1x0.net
一つのポインターでオフセットを指定することはできるけど、
"AAAA"はAAAAの4byteではなくて、文字列の終端である0を含めた5byteになる。
char *any = "AAAABBBBCCCC";
こういうイメージで+4や+8でアクセスしようとしたら
%sで表示したとき意図する結果にならないかもしれない。
文字列として扱わなければ問題ないです。
char *any = "AAAA\0BBBB\0CCCC";
こんな書き方もできますが、*を理解したほうがよいと思います。
アドレスやオフセットの概念は理解しているようですので。
233:デフォルトの名無しさん
18/11/29 07:00:11.93 f12HiZt90.net
>>224 の実行結果を解釈すると...
文字列 "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"の先頭番地)
これで分からんかな。
ポインタが指す実体(文字列)の番地、その(文字列の)番地が格納された配列の値、
(値としてポインタが格納された)配列要素の番地。
234:デフォルトの名無しさん
18/11/29 09:05:40.33 Msn7clch0.net
どうでもいいけど略すならaryじゃなくて,
235:arrでは。
236:デフォルトの名無しさん
18/11/29 09:24:21.59 b4PauqdMx.net
>>229
aryもまれによく見る。
237:デフォルトの名無しさん
18/11/29 12:11:40.55 +QhJBOyD0.net
ありがとうございます。
読んでみてなんとなくは理解できるようになりました
>>227
NULLのことはすっかり忘れてました
*を理解できるように頑張ります、ご丁寧にありがとうございました。
238:デフォルトの名無しさん
18/11/29 17:20:38.58 pCyrju1nm
マイコンのLEDを点滅させるプログラムを
教えて頂きたいです。
問題としては、マイコンのボタンを一度押すと0x55で点滅し、
もう一度同じボタンを押すと0xAAで点滅するというプログラムを
考えなくてはなりません。
今はまだif文とswitch文しか習っていません。
239:デフォルトの名無しさん
18/11/29 16:00:56.19 Pq9K3tWa0.net
>>218-223
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]]
240:デフォルトの名無しさん
18/11/29 16:15:48.88 qd4rCcG0M.net
>>233
Rubyすげぇ~!!!
URLリンク(gigazine.net)
URLリンク(www.softantenna.com)
URLリンク(www.softantenna.com)
URLリンク(findy-code.io)
大人気Ruby!
Ruby大人気!!
241:デフォルトの名無しさん
18/11/29 16:20:18.55 Msn7clch0.net
>>234
やめてさしあげろw
まあ擁護するなら人気のありなしで言語の優劣は測れないと思うけどね。
IOなんてドマイナーだけど俺は好きだし,素晴しい言語だと思っている。
なおRuby
242:デフォルトの名無しさん
18/11/29 18:14:40.72 ljP5qN1x0.net
(´-`).oO(aryだったのね……)
243:デフォルトの名無しさん
18/11/29 18:49:51.71 Msn7clch0.net
いやarrやろ(しつこい)
244:デフォルトの名無しさん
18/11/29 19:09:36.82 8tueZiBHa.net
array
245:デフォルトの名無しさん
18/11/29 19:12:17.70 sIB7nB920.net
いいやaryもまれによく見る。
俺は省略せずarray派だが。
246:デフォルトの名無しさん
18/11/29 19:19:19.48 Msn7clch0.net
まあarrayくらい省略するなって話よな
creatじゃないんだからw
247:デフォルトの名無しさん
18/11/29 19:46:28.81 8tueZiBHa.net
>>239
「まれによく見る」とは?
248:デフォルトの名無しさん
18/11/29 19:51:20.93 lt3dDpp60.net
総体としての頻度は稀だが、とある人の書いたソースには悉く ary として書かれており、
その書いた人というスコープ内においては良く見る
249:デフォルトの名無しさん
18/11/29 19:53:37.10 sIB7nB920.net
>>241
weblio辞書より
まれによくある
別表記:稀によくある、稀に良くある
起こり得る事柄を形容して用いられることのある言い回し。
滑稽な表現であるが、あからさまな形容矛盾であり、日本語としては意味をなさない。
「ブロント語」と�
250:オて広まったインターネットスラング。 「まれによくある」の語のニュアンスは、使用者や使用場面によって異なるといえるが、 「頻繁に起こるとも言えるし、めったに起きないとも言える」といった意味合いだったり、「特定の人においてはよくあるが、その他の人には起こらない」といった意味合いだったり、あるいは、いわゆる「あるあるネタ」を指していたりする。
251:デフォルトの名無しさん
18/11/29 20:38:21.77 +QhJBOyD0.net
ちなみに>>224のやつは入門サイトにあったやつを少しいじったやつです
252:デフォルトの名無しさん
18/11/29 21:38:47.98 FncUCYw3a.net
スッキリわかるC言語と苦しんで覚えるC言語
どちらで勉強するか迷ってるんですがどっちがいいと思いますか?
253:
18/11/29 22:00:55.64 yDZ234lo0.net
>>245
>スッキリわかるC言語
胡散臭いです…
>苦しんで覚えるC言語
正直で好感を持てる題名ですね
254:デフォルトの名無しさん
18/11/29 22:01:35.59 kX/wXhND0.net
>>245
立ち読みして自分にとって説明が理解しやすいと思った方を選んだら?
255:デフォルトの名無しさん
18/11/29 22:30:54.22 +QhJBOyD0.net
苦CのほうはWebにサイトがあるのでそっちを見ては?
256:デフォルトの名無しさん
18/11/29 22:40:45.52 FncUCYw3a.net
まだ新しいスッキリわかるC言語をベースにウェブで分からない時に苦しーも見る方針に決めました
皆さんありがとうございます
257:デフォルトの名無しさん
18/11/29 22:48:01.10 TPe/tu+/0.net
>>244
IDEを使ってメモリウインドウから>>228の内容を納得いくまで確認しろ。
> 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べた書きで大体事足りる。
258:デフォルトの名無しさん
18/11/29 23:07:20.28 +QhJBOyD0.net
>>250
一応プロセスメモリエディタとか使いながらやってたんですよ、それでも混乱するので聞きました。
多言語はやったことないのでよくわかりませんが、高級言語のよくわからずに使う感じが苦手なので、むしろ原始的なのは好きです。
> AAAA,BBBB,CCCCを普通に配列で作って、それを1つのポインタでオフセットを指定して選ぶ。
っていうのがbotを作るうえで必要というのは初めて知りましたが、botは作りたいと思ってました。
259:デフォルトの名無しさん
18/11/30 00:06:17.84 tn7d6mNM0.net
>>251
> プロセスメモリエディタ
なんじゃそりゃ?と思ってみてみたが、どっちかというとハッキングツールだな。
マジな話、IDE使え。個人開発レベルの糞ツールとは次元が違うから。
俺はVSがいいと思うが。
言い忘れてたが当然return文にブレークポイントを当てて止めて見るんだよ。
というか他に何言語やってるんだ?
> AAAA,BBBB,CCCCを普通に配列で作って、それを1つのポインタでオフセットを指定して選ぶ。
これは全くの初心者の発想ではないはず。
明らかに他言語ではこう書ける、これをCでやりたい、というように読めるが。
> っていうのがbotを作るうえで必要というのは初めて知りましたが
というか、文字列を配列に持って切換ながら使う=それらの文字列は同列に扱うべき、
という使い方をすることがほぼ無いんだよ。他の言語でも、アプリでも。
大体文字列なんてリテラルでその場で使って終わり、が殆どだ。
それ以前に、charを主として使うアプリ(bot含む)をCでやろうというのも間違いだが。
char出力は結局UIであって、どうせI/Oで引っかかるから、Cの優位�
260:ォ(速度)が生かせない。 そして原始的な分、生産性自体は悪いから、そのデメリットだけ受けてしまう。 AIbotとかで演算部分に相当速度が必要でない限り、スクリプト言語で作った方がいいと思うぞ。 この意味で、Cでの文字出力はほぼログ生成でしかなく、 だからこそ貧弱なライブラリでも間に合ってる訳だが。 > 高級言語のよくわからずに使う感じが苦手 いやこれは違う。 「余計なことを考えなくて済む」という意味で後発言語はよく出来てるんだよ。 まあこれはじきに分かるだろうさ。
261:デフォルトの名無しさん
18/11/30 01:05:40.46 qUT8id4/0.net
void君は相変わらずだな
262:デフォルトの名無しさん
18/11/30 01:14:13.61 dHzryZqK0.net
プログラミングというより解析系に興味があっていろいろ調べてただけです。
Cのこともプログラミングのこともまだ全然わからないです
263:デフォルトの名無しさん
18/11/30 01:40:17.87 ZZJKHSVT0.net
puts()関数とかの「s」ってストリングのsなんだね。
今までずっとputの三単現だと思ってたわw
264:デフォルトの名無しさん
18/11/30 08:28:07.36 VjmtC3o00.net
>>245-249
スッキリJava は、250ページにも及ぶ、猿向けにオブジェクト指向を解説した、伝説の書。
単純な言語の文法書ではない
前半はフレームワークを使う人の立場で、後半はフレームワークを作る人の立場での解説。
だから初心者は、後半を読まなくてもよい
苦しんでC は、手順書。
14歳以下とか、中学生に教えるたぐいの本。手順を教えるだけ。
たいていのAndroid アプリの本と同じ
なぜ、こういうデザインパターンをするのかとか、概念の説明などはない。
漏れは、2時間で読める。
理解して考える要素がないから、ライトノベルと同じ
265:デフォルトの名無しさん
18/11/30 08:32:59.05 xQIq6Uyn0.net
理解して考える脳の無いRuby厨であった
266:253
18/11/30 08:36:47.97 VjmtC3o00.net
例えば、WEB+DB 106号の「実践 Android/iOS アプリ設計」を読んでみ
DI, MVVM, Flux とか、なぜこういうデザインパターンを使うのか、
自分で理解して考えないといけないから、こういう概念の話は難しい
デザインパターンを参考にして、Ruby などでいじくり回すのが、最も身につく。
ポインターのバグ取りに、時間を取られないし
267:デフォルトの名無しさん
18/11/30 09:22:30.92 KWzr3gbka.net
DIって外部の設定を使いましょうって話なんですか?
268:デフォルトの名無しさん
18/11/30 09:39:20.17 vcs52++Va.net
>>256
スッキリわかるC言語はパズドラ作りながらC言語が学べるみたいです
269:253
18/11/30 10:35:00.21 VjmtC3o00.net
DI は、C++ の、p-impl パターン。
外部から、後に作られる、依存性を注入する
class A { new B(引数); }
class A { b = 構築メソッド }
上のように、クラスA 内で、直接B を作らず、
構築メソッドで、Bインスタンスを作る
例えば、クラスBの引数の変更が、クラスAに及ばないように、疎結合にしている。
クラスA・Bの作者が、同一でない場合に、効果が大きい
間接的に、Duck Typing, Interface を使う事で、インターフェース・構築メソッドが固定されるが、
同じ構築メソッドを使うことで、似たようなクラスを扱いやすい
270:デフォルトの名無しさん
18/11/30 14:03:17.31 wR5wJL4H0.net
苦Cから入ったけどつまずいて1年くらい何も触らなかったおもひで
271:デフォルトの名無しさん
18/11/30 16:07:52.38 cYaYTjx50.net
何もわからんうちからえり好みしないでK&R
これですんなり入れることが適性試験
272:デフォルトの名無しさん
18/11/30 17:16:53.52 fQ
273:i4U1HQH.net
274:デフォルトの名無しさん
18/11/30 17:20:44.30 wR5wJL4H0.net
アセンブラの入門かじった程度でもイメージはつかめるしCで躓くことはかなり減ると思う
275:デフォルトの名無しさん
18/11/30 18:19:25.99 cYaYTjx50.net
俺はサブルーチンが関数な言語を1つも知らずにK&Rで憶えた
強いて言うならBASICのUSR関数くらいか
276:デフォルトの名無しさん
18/11/30 18:33:32.23 vx8Iixcxa.net
BASICの全てグローバル変数だとか行番号に苦しんでいた時に徐々にMS-DOSでCが使える状態になってきて、PC-98でMS-DOSが使えるようになり、TurboCとかも出て俺は救われた。
しかしその後UNIX関係の仕事になったのでCができて当たり前の環境になってしまった。
277:デフォルトの名無しさん
18/11/30 19:07:15.02 m3TSK4YL0.net
大学でunixでCをやるようになってvim系の操作が気持ち悪かったからノリで大学を辞めた
人生で最悪の選択をしてしまった
278:デフォルトの名無しさん
18/11/30 19:17:21.91 9hh85ykUM.net
>>266
BASICならGOSUBだろ。
279:デフォルトの名無しさん
18/11/30 21:49:44.97 cYaYTjx50.net
>>269
GOSUBが、どのように関数なんだ?
280:デフォルトの名無しさん
18/11/30 22:03:56.69 5CDqtXe60.net
関数と言えるのは、DEF FN かな?
281:
18/11/30 23:31:23.55 MkfLpznc0.net
>>256
>スッキリJava は、250ページにも及ぶ、猿向けにオブジェクト指向を解説した、伝説の書。
私が知りたいのはスッキリC++(そんなものが存在するのですか?限りなく胡散臭いですね)の話です
282:
18/11/30 23:33:27.03 MkfLpznc0.net
>>261
おっしゃることがよくわからないので、ちょっと書いていただけますか?URLリンク(ideone.com)
283:デフォルトの名無しさん
18/11/30 23:34:56.47 PIchVJHi0.net
#define C Java
284:
18/11/30 23:50:06.20 MkfLpznc0.net
>>266
下準備にはPEEK/POKEも重要
私は CALL で呼んでいた記憶がありますが、もしかするとNとN88とN88(86)とでは違っていたかもしれません…
285:デフォルトの名無しさん
18/12/01 07:43:03.30 7EJdQB2R0.net
PC6001でBASICを覚えてPLAY,SOUNDで音楽作ってたな
PSGの音を聞くだけで懐かしい気分になる
そしてMSXでMSX-Cを覚えた
cursesがあったからローグもどきのゲーム作って遊んでたよ
286:デフォルトの名無しさん
18/12/01 07:47:36.67 +NY+xI8A0.net
サブルーチンって用語はもう消えた?
287:デフォルトの名無しさん
18/12/01 09:16:07.78 4Hoi4/y50.net
C言語以降関数と手続きを区別しない言語が増えたこととOOPでは一部がメソッドと呼ばれるようになったので使用頻度は下がったな
なくなってはいないけど
288:デフォルトの名無しさん
18/12/01 09:27:06.02 TOuK5lWF0.net
関数と手続きを総称して、「メインルーチン」に対して「サブルーチン」って
言い方なら今でも使うんじゃないかな。
プログラミング教育の初期の段階での説明。
BASICでの「サブルーチン」は言語仕様での用語だっけ?
289:デフォルトの名無しさん
18/12/01 09:27:25.60 piawvWud0.net
サブルーチンと関数って違うのか(無知)
290:
18/12/01 09:55:16.44 J8cQMvWo0.net
>>279
GOSUB 命令がありました
291:デフォルトの名無しさん
18/12/01 10:14:48.66 /TQ/ikyba.net
ラベルはなかったね
292:デフォルトの名無しさん
18/12/01 10:27:11.17 tI2T+oTI0.net
>>280
処理をまとめたのがサブルーチンで
値を返すのが関数…とかなんかあった気がする
293:デフォルトの名無しさん
18/12/01 16:05:57.68 piawvWud0.net
>>283
その定義だとvoid func(void)
はサブルーチンになるな
ちょっと難癖っぽいけどw
294:デフォルトの名無しさん
18/12/01 16:11:09.57 oMoZEV7I0.net
アセンブラだと値返していようがいまいがサブルーチンっていうよね
今曖昧だってことは元々曖昧だったのかな
295:デフォルトの名無しさん
18/12/01 16:42:04.42 mW7z3f7A0.net
もともとは呼び出しがステートメントであって返値というものが存在しないサブルーチンと、
値を返して式の一部となる関数という区別だね。
式+;が文になるという単純化を行ったCではその区別もなくなってそれが主流になった。
副作用のないものが関数、ありえるのがサブルーチン、と定義を変えて復活はあるかも。
296:デフォルトの名無しさん
18/12/01 16:58:01.89 6zv/O1Bm0.net
void以外は関数って事だな
297:デフォルトの名無しさん
18/12/01 17:11:46.73 FtOkB0gI0.net
言語(VBとか)によっては明確な違いがあったりするけど、概念的にはサブルーチン⊃関数というイメージあるわ。
298:デフォルトの名無しさん
18/12/01 18:36:37.73 qSa8BGaMp.net
副作用のある手続きをほんとは関数とは呼ばないのだろうけど
Cではそんなことに頓着せず全て関数に単純化したからね
ただ本来サブルーチンとはメインルーチンと対立する文脈で語られていたものかと
これは単なる呼び出し関係だけでなく、古い言語では変数のスコープなども異なる
Cではこれも単純化してしまった
main は単にスタートアップルーチンから最初に呼び出されるという以外は
特別なスコープを持つわけでもなく、他の関数と何ら違いがない
他の関数から main を呼ぶことも、普通やらないだけで問題なく可能だ
Cでサブルーチンという名前がしっくりこないのはこの辺が理由でもあるかと
299:デフォルトの名無しさん
18/12/01 19:00:11.99 mW7z3f7A0.net
ああ、関数と対比されるのはサブルーチンじゃなくて正しくはプロシージャ(手続き)だね。
300:デフォルトの名無しさん
18/12/01 19:53:46.70 qSa8BGaMp.net
>>290
そうだけと、その辺の用語も統一されてるとは言い難いところがあるよ
AdaなどのPascal系の言語ではprocedureとfunctionという区別があるよね
まぁ値を返すかどうかという違いでしかないわけだけど
VBではPascalのprocedureに相当するのはSubであって、SubとFunctionをまとめた
上位概念としてプロシージャと言うからね
301:デフォルトの名無しさん
18/12/01 21:37:27.03 piawvWud0.net
mainが特別扱いされてると言えばOSが受け取れる返り値は0--255なのにint型を指定するってところとかかな。
302:デフォルトの名無しさん
18/12/01 22:24:12.87 3EVAE8120.net
Perl ではサブルーチンは sub で始まる。これはCの関数のようにも使える。
303:デフォルトの名無しさん
18/12/01 22:38:01.02 VxENaYkZ0.net
>>289
> 副作用のある手続きをほんとは関数とは呼ばないのだろうけど
> Cではそんなことに頓着せず全て関数に単純化したからね
逆だぞ。関数型が馬鹿やったから「副作用」なんて言葉が必要になったのであって。
元々Cの関数は副作用がない。これは単純に、Cの場合は引数で渡すしかないからだ。
(当たり前だがグローバルは使わないとする)
だからC全盛の時代には「副作用」なんて言っている奴すら居なかった。
関数型の連中が副作用(キリッとか気にする必要がでてきたのは、クロージャを濫用したからだ。
単純に言えば、関数に対しての値の渡し方は、
・引数
・グローバル
・this(OOPの)(=インスタンス内グローバル)
・クロージャ(=レキシカルスコープの場合は階層内グローバル)
とあって、クロージャは使い方を間違えば結合を強めてしまうんだよ。
(thisの場合は最初からクラス界面で切る《=public/privateを意識して設計する》
からそこまで酷くはならない)
Cはそれがないから、便利に書けない反面、無駄に結合するって事もない。
(少なくとも、結合していることは明示的に見える)
伊達に50年近く現役な訳でもないのさ。現役で居続けられた理由がある。
304:>>291 AdaとかPascalとか、最早死んで誰も使わないし使う価値もない言語を持ち出しても、 何の意味も無いと思うぜ。 それらが死んだのは、それなりの理由があるんだよ。
305:デフォルトの名無しさん
18/12/01 22:43:10.84 6zv/O1Bm0.net
>>294
ねえねえ、Fortranは?
306:デフォルトの名無しさん
18/12/01 22:58:40.52 fkjVwInMM.net
なんだCの関数には副作用なかったのか。これで安心してprintfできる
307:デフォルトの名無しさん
18/12/01 23:00:40.61 piawvWud0.net
Cに副作用の概念はないって……それは流石に嘘でしょう。
箇所は失念してしまったがK&Rにも関数を指して「文字列を出力したりする場合もあるので純粋な関数とは呼べない」
みたいな記述あるくらいだし。
308:デフォルトの名無しさん
18/12/01 23:07:56.71 8rj5PksfM.net
void君は今日も平常運転
309:デフォルトの名無しさん
18/12/01 23:11:44.86 VxENaYkZ0.net
>>297
副作用の概念はあるに決まってるだろ。
そもそもプログラミング自体が副作用を伴うものであって、
全てを含んだ「学術的な意味での副作用」を伴わないプログラムなんて、何もやらないプログラムだからだ。
それすら理解出来ない>>296なんてただの馬鹿だ。
そうではなくて、関数型()の連中が言っている意味での「副作用の無い関数」についてなら、
Cは全ての関数が該当する、ということだよ。
だから、「副作用(キリッ」する必要すらなかったって事だよ。
試しに関数型()の連中に、「クロージャ禁止、this禁止、グローバル禁止、全て引数で渡せ」と言ってみろよ。
多分、顔が引きつると思うぜ。
310:デフォルトの名無しさん
18/12/01 23:56:03.97 C49O7CpGa.net
引数voidって初めて見たぞ
311:デフォルトの名無しさん
18/12/02 00:31:53.73 jISJOvCb0.net
void君人気っすね。羨し…くはないなw
312:デフォルトの名無しさん
18/12/02 00:39:59.56 qwr+Mk5T0.net
秋田
313:デフォルトの名無しさん
18/12/02 00:45:19.85 Bx+z5yQP0.net
>>301
まあそれがゆとりが嫌われる理由なんだけどな。
お前も含めて自覚がないのが救いようがない。
お前ら、もう既に老害になってると思うぜ。