17/11/12 10:18:34.45 pV+DiiLQ0.net
変じゃない説明よろしく
263:デフォルトの名無しさん
17/11/12 10:24:13.57 H0u2BwIs0.net
CASLが基本。
264:デフォルトの名無しさん
17/11/12 10:34:03.82 534592TW0.net
ニモニック表片手にハンドアセンブルしてみろ
そうすりゃアセンブラやコンパイラがなにしてるか
馬鹿でもない限りいろいろ分かる
265:デフォルトの名無しさん
17/11/12 11:18:13.17 JQDoPKa1a.net
自分は二重ポインタってのが分からないです
アドレスの入るアドレスがあるなら
アドレスの入るアドレスの入るアドレスもあるんですか?
266:デフォルトの名無しさん
17/11/12 11:23:06.41 H0u2BwIs0.net
アドレスにアドレスは入らないだろ。
267:デフォルトの名無しさん
17/11/12 11:28:32.94 H0u2BwIs0.net
アドレスを記録位置と言い換えてみたらどうだろうか。
268:デフォルトの名無しさん
17/11/12 11:30:59.32 H0u2BwIs0.net
メモリーを記録装置、メモリー上のバイトを記録素子、アドレスを記録位置。
どうだい。
269:デフォルトの名無しさん
17/11/12 11:32:35.21 StX7DGK40.net
変数の位置(アドレス)を示す変数 = ポインタ
そいつ自体も変数だからアドレスを持ってるしポインタも持てる
270:デフォルトの名無しさん
17/11/12 11:33:44.56 H0u2BwIs0.net
記録位置の入った素子の位置が入った記録素子�
271:B これなら有りえるとすぐわかる。
272:デフォルトの名無しさん
17/11/12 11:35:10.76 H0u2BwIs0.net
>>266
ポインタはアドレスではない。
273:デフォルトの名無しさん
17/11/12 11:40:26.83 V8vWJYoP0.net
物理的な描像にするな。
論理的な本質部分を説明しろ。
274:デフォルトの名無しさん
17/11/12 11:41:52.30 H0u2BwIs0.net
Cから物理を取り除いたら役に立たない古代文明。
275:デフォルトの名無しさん
17/11/12 11:43:40.40 V8vWJYoP0.net
ハートは抽象的モデル化しろ。
276:デフォルトの名無しさん
17/11/12 11:44:09.30 V8vWJYoP0.net
x ハート o ハード
277:デフォルトの名無しさん
17/11/12 14:48:35.92 w0XJ4hAE0.net
>>265
メモリー上の位置でいいんじゃね?
これがイメージできなきゃ無理
278:デフォルトの名無しさん
17/11/12 14:50:03.54 BnEu6Dc30.net
C使う以上、物理的な概念から逃れる事は不可能。
279:デフォルトの名無しさん
17/11/12 14:54:31.77 MOg5phwx0.net
>>262
ある
3重でも4重でもいくらでも
一般的に使うのは2重までだが
280:デフォルトの名無しさん
17/11/12 15:11:05.31 61B/9ygA0.net
○重ポインタという言葉はあまりオススメしない
いくら重ねようが「~へのポインタ」だ
int a = 123;
int *pa = &a; /* 「int型」へのポインタpa */
int **ppa = &pa; /* 「int型へのポインタ」へのポインタppa */
int ***pppa = &ppa; /* 「int型へのポインタへのポインタ」へのポインタpppa */
参照のイメージ([アドレス][値])
[a][123]
[pa][&a] -> [a][123]
[ppa][&pa] -> [pa][&a] -> [a][123]
[pppa][&ppa] -> [ppa][&pa] -> [pa][&a] -> [a][123]
281:デフォルトの名無しさん
17/11/12 17:57:06.14 dvIcUwwY0.net
確かにポインタは2重以上はなるべく使いたくないな。混乱するし。
282:デフォルトの名無しさん
17/11/12 18:01:39.60 C1sLEmf00.net
そうだなポインタを文字列の格納だけに使うならアドレスは関係ない
int型で変数を操作するとかなら話は別だけどな
283:デフォルトの名無しさん
17/11/12 18:02:47.18 H0u2BwIs0.net
二重以上には二重も入るのだが、本当にそれでいいのか?
284:デフォルトの名無しさん
17/11/12 18:05:10.12 5J9eZD000.net
二重ポインタって言い方が紛らわしい
「ポインタが二重」って意味が通じない。
もともとは * が2つ付いてることを二重って言ってるんだろうけど
285:デフォルトの名無しさん
17/11/12 18:20:47.35 H0u2BwIs0.net
ポインタは型ではないので、二重のポインタという言い方はあり得るのではないか。
286:デフォルトの名無しさん
17/11/12 18:22:14.17 VcNgV3aF0.net
ポインタの配列 配列のポインタ ポインタのポインタ
287:デフォルトの名無しさん
17/11/12 18:25:05.93 MOg5phwx0.net
>>279
「なるべく使いたくない」だからいいんじゃね
288:デフォルトの名無しさん
17/11/12 18:25:48.95 ppEJgx+i0.net
三重以上のポインタって実際に使われているの?
289:デフォルトの名無しさん
17/11/12 18:25:59.93 H0u2BwIs0.net
int型へのポインタに対するchar型へのポインタとかあるのなら紛らわしいという主張も理解できるが。
そんなものは無いので。
***を三重のポインタというのは合理的に見える。
どうだい。
290:デフォルトの名無しさん
17/11/12 18:28:26.99 ppEJgx+i0.net
int型へのポインタ型へのポインタ
char型へのポインタ型へのポインタ
291:デフォルトの名無しさん
17/11/12 18:28:46.98 5fy9hb990.net
>>284
15年前大学で4重ポインタの地獄を目にした
292:デフォルトの名無しさん
17/11/12 18:30:54.73 ppEJgx+i0.net
>>287
型宣言の読解が試験にでたとか?
293:
17/11/12 18:36:30.86 Va1KoPXV0.net
>>284
スレリンク(tech板:26番)
294:デフォルトの名無しさん
17/11/12 18:36:50.26 5fy9hb990.net
>>288
研究課題で先輩が作ったライブラリのプログラム
それを使って成果を出すのが自分の卒論…
295:デフォルトの名無しさん
17/11/12 18:42:31.96 VcNgV3aF0.net
3次元配列を生成して引数に書き戻すような構造なのか
4次元配列を生成して戻すようなのか
各次元で大きさが固定なら 1次元配列にして 添え字演算で4次元にしちゃうな
296:デフォルトの名無しさん
17/11/12 19:35:51.01 BnEu6Dc30.net
リスト構造とかツリー構造とか、繋げたり外したりすんのに使うよな?
297:デフォルトの名無しさん
17/11/12 19:57:25.27 MOg5phwx0.net
>>292
でも2重までじゃね?
298:デフォルトの名無しさん
17/11/12 20:33:06.12 0YSprajH0.net
>>280
階層の方が良いか?
299:デフォルトの名無しさん
17/11/12 21:04:53.38 RBwKcf3Fa.net
x,y,z座標表すのにint***を使
300:ったことがある
301:デフォルトの名無しさん
17/11/12 22:25:07.93 Q7xN5Euu0.net
2重以上になりそうなときは構造体にまとめちゃうからなぁ。
302:デフォルトの名無しさん
17/11/12 22:26:52.43 5J9eZD000.net
>>294
多分、階層の方がわかりやすいだろうね
int ***p; というポインタ変数pで p[x][y][z] とすると、
*(*(*(p + x) + y) + z)
を参照する。このあたりを分かりやすく言えるといいんだけど
303:デフォルトの名無しさん
17/11/13 00:06:28.13 NsFkY9mQ0.net
同一ファイル内の関数を単体で自動化テスト出来る何かスマートな方法はないものか
他のテスト周りで小回りが効く言語と比べると単体テストがお辛い
304:片山博文MZ
17/11/13 00:11:14.56 GVKu0VVYd.net
>>298
惜しい。C++だったら、コンストラクタでオートメーションできるのに。
305:デフォルトの名無しさん
17/11/13 05:48:49.26 m7i5EnEm0.net
テストコードを入れておくしかない。
306:デフォルトの名無しさん
17/11/13 14:10:14.51 oBHzUCYz0.net
>>295
三次元扱うと***pくらい何て事無いよね
307:デフォルトの名無しさん
17/11/13 14:21:03.70 M4Fu1SNu0.net
構造体のメンバーの構造体のメンバーの構造体のメンバーのつもりで
ポインタのポインタのポインタとかいい気になって使ってたら、
エクセプションの嵐でワラタw
308:デフォルトの名無しさん
17/11/13 14:23:47.67 rCuenLSS0.net
正しい指し先を格納してるかはコードの書いた奴の責任だからね
言語で保障してくれない
309:デフォルトの名無しさん
17/11/13 14:41:15.42 xUyRVn+md.net
有名な言葉思い出した。
プログラムは意図した通りには動かない、
書いた通りに動く。
310:デフォルトの名無しさん
17/11/13 15:23:54.44 U+8SrSdXM.net
ハードがまともに動いている前提でな。
タイマーLSIにall0ぶち込むなんてのはどこのマニュアルにも
書いてないバッドノウハウだろうに
311:デフォルトの名無しさん
17/11/13 16:47:57.07 bTqh5JwP0.net
>>298
google testとかcpp testとか使えば?
312:デフォルトの名無しさん
17/11/14 05:34:12.35 Qlty8abH0.net
三次元配列を扱うのに三重ポインタが出てくると思っている池沼がいるな
313:デフォルトの名無しさん
17/11/14 09:52:35.71 1+/iXMbtp.net
まあ、Cは次元とかオフセット計算が掛け算になるだけだからな。
何次元にしようとリニアな配列のままさ。
314:デフォルトの名無しさん
17/11/14 09:54:58.20 1+/iXMbtp.net
俺はポインタを諦めて、構造体配列のインデックスでリンクするリスト構造を作ったわ。
315:デフォルトの名無しさん
17/11/14 17:36:47.28 ijEEO/Co0.net
誰かが書いてあって気になったんだけど
double a;
scanf("%if", &a);
ってf単体じゃないの?
316:デフォルトの名無しさん
17/11/14 17:46:40.44 CqmbHxm/0.net
%lfじゃなくて?
317:デフォルトの名無しさん
17/11/14 18:28:10.04 ijEEO/Co0.net
>>311
間違えたそれだ
318:デフォルトの名無しさん
17/11/14 18:42:01.06 fdj+YHIz0.net
long double は別物として実装していない?
319:片山博文MZ
17/11/14 18:56:38.89 Qnc8WtYFd.net
scanfでは、floatが%fで、doubleが%lfだ。printfでは区別がない。
320:デフォルトの名無しさん
17/11/14 19:35:59.33 ZWJmr3O/0.net
cでUTF-8のファイル読み書きとデータの取り扱い方が分からないです
もしかしてできないのかな?
321:デフォルトの名無しさん
17/11/14 19:57:38.61 mdecs3M50.net
調べるとすぐにwikipediaが出てきたよ
URLリンク(ja.wikibooks.org)
322:87%E5%AD%97%E3%81%A8%E6%96%87%E5%AD%97%E5%88%97#Unicode.E6.96.87.E5.AD.97.E3.82.BB.E3.83.83.E3.83.88 文字を「L"」で囲むとその文字を表現するワイド文字型の数値となる Unicode文字セットでは、標準ライブラリの関数を使う前にロケール(地域)を設定する必要があり、また、Unicode用の関数を使う必要もある // wchar_t型 wchar_t wc = L'a'; // wchar_t型の変数wcに文字L'a'を格納 _wsetlocale(LC_ALL, L""); // ロケール(地域)を設定する wprintf(L"変数wcに格納された文字は%c", wc); //wcを文字として表示 wprintf(L"変数wcに格納された数値は%4x", wc); //wcを数値として表示
323:デフォルトの名無しさん
17/11/14 20:29:12.24 1+/iXMbtp.net
だから、文字セットはライブラリの範疇だからC言語スレで聞くなよ。
おまえが使ってるコンパイラのスレにでも行け。
324:デフォルトの名無しさん
17/11/14 20:29:48.26 M89KBFlu0.net
何したいかによるんじゃね
素でもそれなりには扱えるし、不十分ならライブラリ探してもいい
どうしても無理なら慣れた文字コードに変換すればいいけど、こっちは一部文字情報が欠落するかもね
325:デフォルトの名無しさん
17/11/14 20:58:01.97 ZWJmr3O/0.net
>>316
ありがたい
なんとかなりそう
326:デフォルトの名無しさん
17/11/15 06:11:40.94 1fEpam2j0.net
「配列へのポインタ」で嘘教えてるクソサイト
327:デフォルトの名無しさん
17/11/15 08:01:18.30 2LyFVpmC0.net
エンコーディングにかかわらず、ただのバイト列だからchar*でいい
328:ビル・ジョブス
17/11/15 09:06:23.81 sfEUfVZe0.net
配列名は変更できない左辺値
329:デフォルトの名無しさん
17/11/15 10:37:31.14 Iv8iuDMF0.net
次のC規格でそろそろ文字を扱う関数全てunsigned charに変更してくれないかな
utf8でもsjisでもだけど1バイト目の判定でいちいちキャストするのが不毛すぎる
賢明なプログラマならcharなどというプリミティブ型をそのままの名前で使わずちゃんと
typedef char str_t;
とかしてるはずだし、してない愚者はもうシステムもろとも切り捨てていいだろう
-1が欲しいために結局intに拡張されるんだからcharの時点では符号は不要なんだよ
330:デフォルトの名無しさん
17/11/15 10:45:30.80 5eRwFnaIp.net
C#みたいにbyte型作れば?
それかマルチバイト型
331:デフォルトの名無しさん
17/11/15 18:45:36.23 /fqUZ3V60.net
>>323
ハゲドゥ
332:デフォルトの名無しさん
17/11/15 20:52:19.99 edi6IXQo0.net
>utf8でもsjisでもだけど1バイト目の判定でいちいちキャストするのが不毛すぎる
いまどきそういうencoding依存のコードをそんなに頻繁に書いているんだとしたら
それ自体が不毛な気も。
333:デフォルトの名無しさん
17/11/16 10:46:07.94 QxSeP1oQa.net
なんのために皆cやってるん?
334:デフォルトの名無しさん
17/11/16 10:47:45.24 sipg0WT3p.net
生活の為だ。
335:デフォルトの名無しさん
17/11/16 12:40:47.00 jvRl/N31M.net
文句たれてる暇があるなら1バイト目判定関数でもつくれば
336:デフォルトの名無しさん
17/11/16 16:46:03.46 ExCdIANwa.net
ファイルサイズ測定
↓
そのファイルサイズ領域を動的確保
↓
そこにutf-8の文字列を順次格納
みたいなプログラム組んでるんだけど
ファイルサイズ/sizeof(wchar_t)と中身の文字の数って等しくないの?
337:片山博文MZ
17/11/16 16:52:10.55 1Qzf60whd.net
UTF-8をそのまま扱うんなら、/sizeof(char)じゃね?
UTF-16やUTF-32に変換したならデータサイズが違うけど。
338:デフォルトの名無しさん
17/11/16 16:54:06.14 Gq05ZlN50.net
UTF-8 は データサイズから文字数を求めることはできない
339:デフォルトの名無しさん
17/11/16 17:01:45.21 FIH9Q68l0.net
やっぱり1文字づつ
340:読み込んでって文字数カウントするしかないか
341:デフォルトの名無しさん
17/11/16 17:06:37.43 Gq05ZlN50.net
>>333
記憶するのに必要なメモリの量は読み込んだバイト数でいいけど
「1文字に要するバイト数が可変」なので
「文字数」をカウントするとなるとそうせざるを得ないね
342:デフォルトの名無しさん
17/11/16 17:15:42.23 FIH9Q68l0.net
>>334
そうします
343:デフォルトの名無しさん
17/11/16 17:29:40.48 NqJtZOMo0.net
暇つぶしで気になったんだけどC言語でもOSは作れるだよな、でも制御とかでコンピューターをちゃんと理解してないとやっぱ作れない?
344:片山博文MZ
17/11/16 17:45:35.36 1Qzf60whd.net
FreeDOS、Linux、ReactOSなどのオープンソースなOSは、ソースが見られるから参考にするといい。
例えば、OSで並列処理をしたい場合は実際のCPUの知識が必要になるし、OSをCD-ROMからインストールしたい場合は、CD-ROMのファイルシステムの知識が必要になる。
OSを便利にしたいなら、それなりの知識が必要になるのさ。
345:片山博文MZ
17/11/16 17:50:48.01 1Qzf60whd.net
モダンなOSは巨大化・複雑化しているから、一人ですべてを把握するのは難しい。
必要な機能を分割統治して、ライブラリなどによってブラックボックスとして実装するのが一般的。
346:デフォルトの名無しさん
17/11/16 18:09:46.26 j+aaxsF+0.net
>>336
OS自作入門とかいうそのものズバリな本があるよ
勉強目的なら割りとオススメ
347:デフォルトの名無しさん
17/11/16 18:10:16.42 NJ9DPXHtM.net
モダンでなくても、C単体ではシステムコールとCPUステータスに
関わる部分が書けないので、100%は不可能。
asm文とか使うなら別だけど。
348:片山博文MZ
17/11/16 18:10:19.85 ++5Qg6gN0.net
なお、OSで商売したいなら、著作権のトラブルをクリアしないといけない。
マイクロソフトやグーグルのようにOSを売るのは至難の技だ。
349:片山博文MZ
17/11/16 18:29:05.66 1Qzf60whd.net
パソコン向けじゃなければ、日本企業でもOSを開発しているところはある。
どんなOSを開発したい?
350:デフォルトの名無しさん
17/11/16 18:42:10.01 lNSovIGo0.net
OS劇場っぽいやつ
351:デフォルトの名無しさん
17/11/16 20:19:28.30 FIH9Q68l0.net
あとメモリ上に読み込んだバイナリデータをwchar_tの文字列に変換することは可能でしょうか?
352:デフォルトの名無しさん
17/11/16 20:33:55.78 NqJtZOMo0.net
ただC言語の本にアセンブリ言語またC言語でもOS作成可能ってあったから気になっただけ
他の言語もコンパイルして機械語にするからC言語も間接的な言語しかないのかなって疑問に思っただけ
353:デフォルトの名無しさん
17/11/16 21:44:00.25 lLXMegrc0.net
>>317
354:デフォルトの名無しさん
17/11/16 22:16:50.50 SDKqgqGy0.net
嘘ついてるかもだけど、wchar_tのたぐいって、使うとはまる奴じゃなかった?
文字列はcharオンリーな今日この頃。
cpu限定すれば、変換はいけるんじゃない?
355:デフォルトの名無しさん
17/11/16 22:50:06.96 j+aaxsF+0.net
ワイド文字だと場合によってはエンディアンを気にする必要があるのと
結局>>334は避けられないあたりを忘れなければハマることはないかと
356:デフォルトの名無しさん
17/11/16 23:02:19.01 53UzEJx90.net
OSのコードを書くのってC言語のインラインアセンブリが使われてるんじゃないの?
357:デフォルトの名無しさん
17/11/17 03:13:34.00 HNipYc2I0.net
インラインなんかほとんど使わない
アセンブラが必要なところはガチのアセンブラを使う
量にして全体の数%ってとこ
358:割
17/11/17 08:21:02.54 5vMCLRTs0.net
フリーのOS作るため勉強するよ
359:デフォルトの名無しさん
17/11/17 08:39:11.50 Noghda3Sa.net
>>339
あれかなり良いけどフロッピー使うし作るOSもかなり独特だからモダンな感じでもう一冊くらい書いて欲しい
360:デフォルトの名無しさん
17/11/17 23:24:01.69 mCQOvNmw0.net
>>330
UTF-8 とは何か?
そして wchar_t 型とはなに
361:か? まずはこの2つについて徹底的に調べると君の頭は少し良くなると思う。
362:デフォルトの名無しさん
17/11/17 23:32:51.13 mCQOvNmw0.net
>>336
OS作れるどころかOSを書くために作られたような言語がCだよ。UNIXな。
363:デフォルトの名無しさん
17/11/17 23:36:03.75 mCQOvNmw0.net
>>342
超漢字はPCで・・・
364:デフォルトの名無しさん
17/11/18 01:14:51.20 rocDtfxqa.net
mallocとかcallocでNULLが帰ってくる原因が分からない
メモリも十分あいてるしfree忘れもないのに
365:デフォルトの名無しさん
17/11/18 01:20:58.17 j81pJ1Fd0.net
要求している大きさが 0 とか?
366:デフォルトの名無しさん
17/11/18 01:23:12.16 SBD2pOIJa.net
>>357
流石に0ってことはないと思うわ
367:デフォルトの名無しさん
17/11/18 01:40:38.42 bkH0AyDYa.net
どこかでバッファオーバーランしてるのかなあ
368:デフォルトの名無しさん
17/11/18 01:54:02.41 ravPC5RbM.net
0 allocでもnullは返さないはず
369:デフォルトの名無しさん
17/11/18 02:00:44.06 xg8+Glw40.net
perrorくらいしてから書け
370:デフォルトの名無しさん
17/11/18 03:52:04.95 V3PmucT60.net
おれの昔使ってたシステムでは、free忘れじゃなくて、mallocしたアドレスを2度freeしたり、もしくはmallocとは全然関係無いアドレスをfreeすると、
その後のmallocでおかしな動作をすることがあった
371:デフォルトの名無しさん
17/11/18 06:02:16.21 4FIhP4xR0.net
>>358
本当か?
372:デフォルトの名無しさん
17/11/18 06:22:35.45 mIICZMYh0.net
>>362
おそらく、そういう系だろうな
どこかで未定義の動作をやらかしてる
373:デフォルトの名無しさん
17/11/18 07:00:43.85 ScUjvH+z0.net
>>361
それ関係ないやろ
374:デフォルトの名無しさん
17/11/18 09:37:24.12 N5k0nP0W0.net
>>362
windowsなんだけど可能性あるの
375:デフォルトの名無しさん
17/11/18 09:47:18.69 mIICZMYh0.net
ゲイツOSかどうかには関係ねえぞ
malloc/freeが空き領域をどのように管理しているかの実装の問題だ
376:デフォルトの名無しさん
17/11/18 11:15:25.02 QN3bDN6ad.net
Winなら2重freeで死ぬんじゃね
377:デフォルトの名無しさん
17/11/18 11:27:25.57 rocDtfxqa.net
2重freeだとその時点でエラーはかないの
378:デフォルトの名無しさん
17/11/18 11:56:53.68 ScUjvH+z0.net
>>368-369
>>367
379:デフォルトの名無しさん
17/11/18 12:20:10.83 N5k0nP0W0.net
解決した
不定のポインタに対して代入
変なとこ書き換えたせいでmalloccallocに失敗したみたい
380:デフォルトの名無しさん
17/11/18 16:45:23.67 LYf4SJAt0.net
よかったな鼻から鼻毛が出る程度で
381:デフォルトの名無しさん
17/11/18 20:07:48.43 N5k0nP0W0.net
また別の問題が・・・
メモリ上にある時は問題ないのにwprintfで表示するときに文字化けする
382:デフォルトの名無しさん
17/11/18 20:09:57.58 4FIhP4xR0.net
>>373
「問題ない」とは?何で確認した?
383:片山博文MZ
17/11/18 20:10:41.39 QiNK1qRtd.net
setlocaleした?
384:デフォルトの名無しさん
17/11/18 20:37:46.90 N5k0nP0W0.net
>>374
visualstudioのメモリの中覗く奴
>>375
main関数でやってる
385:片山博文MZ
17/11/18 20:39:12.15 QiNK1qRtd.net
ideoneに貼ってよ。
386:デフォルトの名無しさん
17/11/18 20:49:06.97 ravPC5RbM.net
コンソールのロケールは?
387:デフォルトの名無しさん
17/11/18 20:54:11.61 N5k0nP0W0.net
>>378
chcp 65001をsystem関数で実行してる
388:デフォルトの名無しさん
17/11/18 21:10:22.92 V3PmucT60.net
setlocaleの引数は?
389:片山博文MZ
17/11/18 21:47:57.26 QiNK1qRtd.net
system関数で出来る子プロセスは、別プロセスだから、現在の画面出力には影響しないと思う。
390:デフォルトの名無しさん
17/11/18 21:48:38.17 N5k0nP0W0.net
解決した
関数の中で宣言したwchar_t の配列buff[20]のポインタを返してそれを表示してたんだけどそれがまずかったみたい
スコープから抜けた瞬間に解放されちゃうみたい
無知だったわ申し訳ない
391:デフォルトの名無しさん
17/11/18 21:49:45.49 N5k0nP0W0.net
buffの中身をmallocで確保した所にコピーしたのを返すことに�
392:オました
393:デフォルトの名無しさん
17/11/18 23:02:18.25 euoYf0NO0.net
>>382
GC言語使ってた奴がよくやるパターンだ。ドンマイ。
>>383
それだと後でいちいちfreeするのが面倒だろ。
普通は呼び出し元で buff[20] 確保してポインタを渡し、子関数内でそこに書き込む。
なおどうしても値返しで組みたければ、structならreturnで値返しできるからくるめばいい。(はず)
394:デフォルトの名無しさん
17/11/19 03:54:32.58 +NeHX1+n0.net
char* hoge(){
char buff[20];
strcpy(&buff[0], "何らかの処理");
return &buff[0];
}
int main(int argc, char* argv[]){
char* str = hoge();
printf("%s\n", str);
return 0;
}
多分、こうなってたんじゃないか?
配列は、自分で管理すべきだよねー。
void hoge(char* const str){
strcpy(&str[0], "何らかの処理");
return 0;
}
int main(int argc, char* argv[]){
/* char str[20]; */
char* ptr = nul;
/* ptr = &str[0]; */
ptr = (char*)malloc(sizeof(char) * 20);
hoge(ptr);
printf("%s\n", str);
return 0;
}
395:デフォルトの名無しさん
17/11/19 04:46:36.12 uKY6C0dJ0.net
意味は同じだし最適化されるからどうでもいいことではあるが、
そこの &str[0] は単に str と書くだけでいいんじゃないの?
見やすさの点からも受け取る部分が char *str ならそのまんま
str って書いておいた方が分かり易いと思うんだけど。
396:デフォルトの名無しさん
17/11/19 05:47:08.77 UDBnG5b80.net
c言語でこういう処理はやめておけ?
397:デフォルトの名無しさん
17/11/19 09:57:18.82 v7NTUoVSM.net
初心者はこれだけ守ってれば良いかと
処理対象のメモリは呼び出し元で確保、alloc-freeで処理をはさむ
処理の戻り値は基本intでエラーコードを返す
ローカル変数は16k未満、可変長配列は使わない
>>387
そんなことはない
398:デフォルトの名無しさん
17/11/19 10:16:36.97 Rb2sIcHm0.net
> 処理の戻り値は基本intでエラーコードを返す
malloc先生やprintf先生を見習ったら違反だな
> ローカル変数は16k未満、可変長配列は使わない
何だそのマジックナンバーは??
399:デフォルトの名無しさん
17/11/19 10:34:41.84 YNZopTj60.net
malloc に限らんけど、ポインタを返す関数は
失敗の場合にNULLを返すってのはまぁ基本だね。
線形リストの探索、見つからなければNULL、みたいに。
printf の返り値はintだから一応は >>388 の方針通りじゃろ。
成功なら非負の値、失敗したら -(エラーコード) が返る、
と決めておけば何かと使いやすいわね。
400:デフォルトの名無しさん
17/11/19 10:42:05.59 Rb2sIcHm0.net
>>390
ちょw
printfの仕様を知らんのか
401:デフォルトの名無しさん
17/11/19 10:59:03.36 KR+9hAut0.net
mmapはNULL返さねーけどな
402:デフォルトの名無しさん
17/11/19 11:41:24.76 lBNHVI9l0.net
エラーはnullとか-1とかの正常時には戻らない値
エラーコードは errno 見ろよ
って言うのが以前のお約束だった気がするけど
403:デフォルトの名無しさん
17/11/19 12:18:44.42 qf87F9y70.net
printf("%d",printf("1*2*3="));
404:デフォルトの名無しさん
17/11/19 13:05:21.82 uKY6C0dJ0.net
printf() の man page 見てもエラーの時は負の値を返すとしか書いてなくて errno に何か入るとは書いてない。
まあ、実際には中で putchar() と同等な事をするだろうからその中で使われる write() で何か書かれるとは
思うがその辺は保証されていないので使えない。(書き込み時のエラーではないかも知れないしな)。
GNU の asprintf() もエラー時は -1 を返すのみで errno については何も書いてない。
それと sn
405:printf() のような結果を書き込むバッファの大きさを指定できるやつはバッファを使い切った場合の エラーの返し方が違う。
406:デフォルトの名無しさん
17/11/19 16:13:09.94 ViWWOCHYa.net
条件が
文字列の長さ
文字列比較
でソートしたくて2回forで回してます
流石にこれでは件数が増えたときにとてつもなく遅くなるので1回のforだけでやる方法を教えてください
407:デフォルトの名無しさん
17/11/19 16:19:33.08 lEYmgXHFM.net
>>396
普通にソートすれば、長い方が後に来るんじゃね?
408:デフォルトの名無しさん
17/11/19 16:32:59.11 NI05LLAC0.net
条件を変えて2回まわしたら1回目のソートは(ほぼ)意味がないんじゃない?
(順位を保つソート法なら 多少意味が出てくる: qsort はその保障はない)
qsort の srot_cmp の記述で
比較すべき それぞれの要素 c1 と c2 を多重に比較すればいい
・「文字列長さ」で比較し 違うなら大小関係を返す→
↓
・(上の比較が等しいので)「文字列」比較し 違うなら大小関係を返す→
↓
:
↓
・(上の比較が等しいので)等しいと返す
これならソートは1回だけ
409:デフォルトの名無しさん
17/11/19 18:57:37.27 LiOPGVVq0.net
URLリンク(i.imgur.com)
この2.の(2)の総ステップ数って
f=1で1回、for文内でn回で、T(n)=n+1
であってる?
なんか授業でやったときは3n+4だったか4n+3だったかそんな数字だったと思うんだが求め方がよく分からん
410:デフォルトの名無しさん
17/11/19 19:18:57.18 uKY6C0dJ0.net
>>399
f=f*i の部分は四則演算1回と代入1回だから2ステップなのでは?
411:デフォルトの名無しさん
17/11/19 19:34:22.94 H23Xb2RQ0.net
f=1 代入1回
for(i=1;i<=n;i++) -> for(i=1;i<=n;i=i+1) 代入1回; 条件判断n+1回; 四則演算n回、代入n 回
f=f*i; 四則演算n回、代入n回
なので合計 5n+3 ステップかな、i++ を1ステップとする処理系なら 4n+3 とか。よくわからんけど
412:デフォルトの名無しさん
17/11/20 14:16:42.45 QGisDeezp.net
>>401
いまどきオプティマイザあるからどっちも同じアセンブルコードになる悪寒
413:デフォルトの名無しさん
17/11/20 14:28:22.74 8OH1W8zR0.net
i++ を1ステップ勘定するか 2ステップ勘定するかは悩ましいけど
分解して 四則演算の1 + 代入の1 計2ステップ の見積もりするのが妥当なんかな
題中にインクリメント演算についてのステップ数は明示されてないし
414:デフォルトの名無しさん
17/11/20 17:25:41.15 ZHV8ZCmh0.net
i++みたいにハード的にありえない(メモリは加算機能を持たない)ことは
マイクロコードで実現しているわけで、1ステップなわけがない
415:デフォルトの名無しさん
17/11/20 17:45:57.87 8KCSU74o0.net
狙いは記述の簡潔化
416:デフォルトの名無しさん
17/11/20 17:54:00.78 jMZlCBbia.net
単体のi++は無駄だから++iにしろってばっちゃが言ってた
417:デフォルトの名無しさん
17/11/20 18:09:22.43 uYx1UAMqH.net
じっちゃんはそんな差は最適化で消え失せるって言ってたよ
418:デフォルトの名無しさん
17/11/20 19:51:59.87 glF63Wia0.net
i += 1;に統一しろや
419:デフォルトの名無しさん
17/11/20 20:13:15.58 WOKp52/B0.net
つまりC++死ねと言う事で
420:デフォルトの名無しさん
17/11/20 20:44:27.03 Y8ntE/6M0.net
暗号の話で面白いネタありませんか?
421:デフォルトの名無しさん
17/11/20 23:46:50.09 iMFZcv9G0.net
URLリンク(i.imgur.com)
>>399だけど、これが一応正解らしい
422:デフォルトの名無しさん
17/11/20 23:56:46.22 ZHV8ZCmh0.net
おまえ自身は何も言わないわけか
423:デフォルトの名無しさん
17/11/21 00:13:10.99 j0/qDr3U0.net
++は対象がレジスタに乗ってるときに1命令だろ
とくにアドレスレジスタの場合に *p++ をポストインクリメントレジスタ間接アクセス命令にそのまま置き換えられるから、
オプティマイズがまだ発達してなかったころに重宝したはず
424:デフォルトの名無しさん
17/11/21 06:23:40.67 uBkGRn7P0.net
そのバヤイは0.5命令だね
* と ++ を同時並列でやるわけで
425:デフォルトの名無しさん
17/11/21 06:30:17.80 VCAIytbF0.net
>>411 実際のマシンとは関係のない、問題のための問題だから
問題を作った人の答えが正解というルールは仕方ないとして…。
i++ が1ステップなのか2ステップなのか、という疑問が出るスレッドで、
f = f*i はまとめて1ステップです、という解説が現れるのは予想外だったわ。
f*i が四則演算で1ステップ、fへの代入でもう1ステップ、と思うよね。
426:デフォルトの名無しさん
17/11/21 07:23:37.68 V9LM9CF/0.net
単純に行数で示す場合もあるし
いろいろだよ
重要なのは計算オーダーと実測値
ステップ数は計算オーダーを見積もる為の道具で
定数倍はわりとどうでも良い
計算量をもっと正確な値を知りたい時は
加減算○回、乗算○回、除算○回
など、より具体的な値とする
427:デフォルトの名無しさん
17/11/21 09:57:32.04 6BA+Ife8d.net
末尾に/が入っていたとき全て削除したいのだけどどうすれば簡単に実装できるだろうか
データはcharの配列に入っている
ex
aaa.txt
aaa.txt/→aaa.txt
aaa.txt/////→aaa.txt
428:デフォルトの名無しさん
17/11/21 10:04:28.94 6BA+Ife8d.net
あとsystem関数の戻り値の判定に悩んでます
URLリンク(linuxjm.osdn.jp)
上記参考にしたら四つのケースに別れていて
下二つはwexitなどのマクロで取得可能
上二つの内ひとつはnullチェックで弾くこと可能
残りは子プロセス作成失敗の-1で網羅できてると考えているのだけど間違ってるのかな?
やりたいことは
system関数のコマンドライン実行したアプリのステータスコードを取得したい。そのためにマクロ使ってる
ただ子プロセスの取得云々の前にsystemの結果判定必要なんでは?と指摘を受けて修正してるのだけどsystemの返す値がさっぱりわからなくて困ってます
429:デフォルトの名無しさん
17/11/21 10:38:25.75 IvGEWozr0.net
>>417
自分ならstrtok関数を使う
430:デフォルトの名無しさん
17/11/21 10:49:16.27 6BA+Ife8d.net
>>419
ごめん略してたけどもフォルダもあるんだ
/xxxx/yyyy/aaa.txt
みたいな
その関数だとこのパターンは処理できない?できる?
431:デフォルトの名無しさん
17/11/21 10:54:29.00 rkhjnhkRp.net
俺様専用脳内マシンは1ステップ命令に変換するんだから1ステップなんだ!!
アホらし。
432:デフォルトの名無しさん
17/11/21 10:58:18.95 0pj8KC/M0.net
>>420
末尾の/を取り除きたいのか、頭のファイルパスを取り除きたいのか、よく分からないけど、/を区切り文字として文字列を分割さえしてしまえばどうにでも出来る
433:デフォルトの名無しさん
17/11/21 11:41:02.99 qTGygbeTE.net
gcc -lライブラリ名 hoge.c
stdio.hと同じフォルダに自分が使いたいヘッダーファイルが存在してるのに
いちいち-lライブラリ名ってしないと参照できないんです
どうしてstdio.hは-lstdioって書かなくても使えるのに自分がインストールしたヘッダーファイルはいちいち-lで指定しないと使えないんでしょうか?
すか?
434:デフォルトの名無しさん
17/11/21 12:27:08.32 ylDmWfHBd.net
>>417
if(配列[strlen(配列)-1]=='/') 同=0;
をループで回せ。
435:デフォルトの名無しさん
17/11/21 13:06:11.86 b7HcaLG8d.net
>>424
うわっ
最悪のアルゴリズム
436:デフォルトの名無しさん
17/11/21 13:13:57.97 b7HcaLG8d.net
null-endと仮定するなら普通にこれで良い
int i;
for (i = strlen(配列) - 1; i >= 0; i--)
if (配列[i] != '/') break;
配列[i+1] = '\0';
437:デフォルトの名無しさん
17/11/21 13:34:45.06 IvGEWozr0.net
URLリンク(codepad.org)
438:デフォルトの名無しさん
17/11/21 14:23:21.10 uBkGRn7P0.net
>>417
regex.hを使ってはどうかな?
URLリンク(sourceforge.net)
439:デフォルトの名無しさん
17/11/21 14:47:42.58 uBkGRn7P0.net
>>423
スクリプトかバッチを作ればいい
たとえばmycc.batというファイル名で
gcc -lライブラリ名 %*
と書き込んでおいて
mycc hoge.c
とやる
440:デフォルトの名無しさん
17/11/21 19:27:53.90 5ScqS7z90.net
>>423
標準ライブラリオブジェクトはスタートアップファイル(crt0)に組み込まれていて自動的にリンクされる
標準以外のライブラリオブジェクトは明示的にリンクしないと使えない
441:デフォルトの名無しさん
17/11/21 20:38:46.08 IlBdcuWwM.net
>>415
> f*i が四則演算で1ステップ、fへの代入でもう1ステップ、と思うよね。
f と i がレジスタなら大抵のプロセッサで1ステップだと思う
442:デフォルトの名無しさん
17/11/21 21:45:59.93 EZGPgPj40.net
まあ、先の問題については、ステップの厳密な定義が読み取れないし。
回答者の説明に矛盾がなければ○でいいと思うわ。
それでも誤答とされてしまったら、出題者がウンコだと思って忘れるレベル。
443:デフォルトの名無しさん
17/11/21 22:17:44.53 6BA+Ife8d.net
>>428
やはり正規表現か
444:デフォルトの名無しさん
17/11/21 22:26:46.51 6oQfsQ1l0.net
スクリプトとかならまだしも
Cで末尾の/削るためだけに正規表現とか持ち出すのは馬鹿だと思う
445:デフォルトの名無しさん
17/11/21 22:38:13.64 IS6cxUc80.net
replace("/$","");//うろおぼえ
なんでよ簡潔にかけて最高じゃないか
正規表現は心の友
すぐ忘れるけど
446:デフォルトの名無しさん
17/11/21 22:48:24.18 n0bc2/yX0.net
>>435
末尾に連続する'/'が有ったら、消さないと
447:デフォルトの名無しさん
17/11/21 23:25:32.21 n0bc2/yX0.net
URLリンク(codepad.org)
こんな感じか?
静的文字列の時は編集可能な形で渡して
448:デフォルトの名無しさん
17/11/21 23:33:58.03 6oQfsQ1l0.net
>>435
>>428はGnuWin32って名前から察するにPOSIXのregexだろ
置換なんてないから、正規表現コンパイルして検索して自分で書き換えるんだぞ
正規表現の置換を呼び出し一回で済ませられるような関数が
ANSIとかPOSIXにあるなら良いけど、そうじゃないだろ
449:デフォルトの名無しさん
17/11/21 23:45:43.58 IS6cxUc80.net
std::regex_replaceってちがうんか?
450:デフォルトの名無しさん
17/11/21 23:48:20.93 6oQfsQ1l0.net
は?
C言語のスレでC++を持ち出してきて何が言いたいの?
451:デフォルトの名無しさん
17/11/21 23:48:43.70 IS6cxUc80.net
なんてこったい
452:デフォルトの名無しさん
17/11/22 00:18:19.23 CvPbHYJg0.net
>>417
こんなのはどうかなあ。
char *s が元になる文字列へのポインタ。p は char *p。
for (p = strrchr(s, '/'); p && p >= s && *p == '/' && ! *(p + 1); *p-- = '\0');
453:デフォルトの名無しさん
17/11/22 01:37:39.91 CvPbHYJg0.net
>>418
こんな感じかねえ。
if (cmd) {
int s = system(cmd);
if (s == -1) {
// 子プロセス作成失敗またはステータス取得失敗
} else if (WIFEXITED(s)) {
// 子プロセスは正常に終了した。
int es = WEXITSTATUS(s);
// es の内容が子プロセス側での exit(es) または return es
// これはたいてい 0 以外がエラーになっている。0なら成功。
} else if (WIFSIGNALED(s)) {
// 子プロセスはシグナルで中断して終わった。
// (人が Ctrl+C をキーから押したとか、kill したとか、プログラムバグってて core dump したとか 0 で割ったとか)
// シグナルの意味は signal(7) の man page 見るとわかる。
int sg = WTERMSIG(s);
// sg にシグナル番号が入る。
}
}
454:デフォルトの名無しさん
17/11/22 02:48:21.29 CvPbHYJg0.net
>>417
試しに正規表現使うとどうなるか作ってはみたが、あまり意味ないなw
URLリンク(paiza.io)
455:デフォルトの名無しさん
17/11/22 06:57:55.87 ehTxx6H60.net
>>431
f = f*i を f *= i と解釈して1ステップか、それもありうる。
456:デフォルトの名無しさん
17/11/22 08:11:12.98 W0SJQGiTM.net
>>445
それもありうるって言うかそうでない処理系の方が珍しいだろ
457:デフォルトの名無しさん
17/11/22 08:30:23.30 OmrPXxhs0.net
元の問題が、演算と代入とそれぞれ1ステップって書いてあるんだから
そこを議論しても意味がない
458:デフォルトの名無しさん
17/11/22 14:50:29.32 5BCPAAz7a.net
これ教えてくれ
URLリンク(i.imgur.com)
459:デフォルトの名無しさん
17/11/22 15:08:01.31 qJn/S+Fz0.net
面倒くせえ奴らだなあ。。。
//aho.cpp
extern "C" char* regex_replace(char* str, size_t n, char const* pat, char const* put) noexcept
{
try
{
string buff{str};
buff = regex_replace(buff, regex{pat}, put);
strncpy(str, buff.data(), n);
return str;
}
catch(...) {}
return nullptr;
}
460:デフォルトの名無しさん
17/11/22 15:08:31.73 qJn/S+Fz0.net
//baka.c
char* regex_replace(char*, size_t, char const*, char const*);
int main()
{
char buff[100];
while(fgets(buff, 100, stdin))
if(regex_replace(buff, 100, "/+$", "")) puts(buff);
else puts("error");
}
461:デフォルトの名無しさん
17/11/22 15:08:55.87 qJn/S+Fz0.net
rem test.bat
cl baka.c aho.cpp /EHsc && baka
ったく世話の焼ける(ぶつぶつ
462:デフォルトの名無しさん
17/11/22 15:31:36.02 5BCPAAz7a.net
ありがとうございます!
463:デフォルトの名無しさん
17/11/22 17:50:15.00 MV3BmYS20.net
初心者です、教えていただけませんか?
大文字の配列を小文字にするコードなのですが
1 int main(){
2 int i;
3 char str[]={'A','B','C'};
4
5 for(i=0;i<3;i++)
6 {
7 str[i]=str[i]+'a'-'A';
8 }
9 return 0;
10
11 printf("答え \n");
12 for(i=0;i<3;i++)
13 {
14 printf("%c\n",str[i]);
15 }
16 return 0;
17 }
を実行すると 「Info: Nothing to build for Hello」 となります。
5行目から9行目までを削除して実行すると答えは大文字で「ABC」となります
5行目から9行目の文法がおかしいと思うのですが何処がおかしいのかわかりません
誤っている個所をご指導頂けないでしょうか?よろしくお願いします。
464:片山博文MZ
17/11/22 17:52:20.48 QYl/HC3Nd.net
>>453
9行目のreturn 0;でmainから制御を戻しているから、以下は実行されない。
465:デフォルトの名無しさん
17/11/22 18:11:10.14 MV3BmYS20.net
>>454
ありがとうございます。とても感謝してます。
戻り値とmain関数の関係を調べてみます。
大変にありがとうございました。
466:デフォルトの名無しさん
17/11/22 18:14:07.74 MV3BmYS20.net
>>455
9行目のreturnでmain関数が終わってしまっていたのですね
ありがとうございました!
467:デフォルトの名無しさん
17/11/22 19:23:09.00 T7TzzxgAp.net
ちよわw
机上デバッグなりステップ実行なりすりゃいいじゃんみたいなんばっかりだな。
468:デフォルトの名無しさん
17/11/22 20:47:50.23 W0SJQGiTM.net
>>447
正解は>>411
469:らしいしまともなら知識を持ってたら普通に同意する内容だし
470:デフォルトの名無しさん
17/11/22 20:50:57.50 W0SJQGiTM.net
>>453
とりあえず
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
スレリンク(tech板)
に行けよ...
471:デフォルトの名無しさん
17/11/22 21:53:31.50 SHp93EZHa.net
mmap の page fault で割り当てられたページフレームってスワップアウトとか発生した時にドロップしたりしますか?
472:デフォルトの名無しさん
17/11/23 06:33:31.65 ZFTBiu2d0.net
君の言っている事がよくわからない
473:デフォルトの名無しさん
17/11/23 09:17:29.44 N/op9puJa.net
>>461
mmap で割り当てた物理メモリは munmap、プロセス終了時以外にも解放される契機はあるのでしょうか?
madvise の MADV_SEQUENTIAL で解放するとか書かれてますが、ソース見てみるとフラグ的にはノーマルと変わらない処理してるみたいなんですよね
474:デフォルトの名無しさん
17/11/23 09:34:44.63 NGg/SBGT0.net
MMUにもよるんじゃない
475:デフォルトの名無しさん
17/11/23 09:46:31.82 N/op9puJa.net
ディスクリードがあるのでmmuにはよらないかと
476:デフォルトの名無しさん
17/11/23 10:51:34.50 ijGzvwTZ0.net
結局何を聞きたいの?
mmapで割り当てた仮想メモリが解放されるかどうかであれば、解放されない
物理メモリの話なら解放される
madviseが実際に指示通りに動くかどうかは実装次第だけど
一応LinuxとかはMADV_DONTNEEDで物理は解放できる
というか、これはC言語の話じゃないから各環境のスレで聞け
477:デフォルトの名無しさん
17/11/23 12:41:47.79 FGycjMyka.net
>>465
mmap 時の物理メモリ使用量とその変化を知りたかったんです。
結局非DIRTYなら物理メモリは解放されることあるんですね。
ありがとうございます
一応linuxの場合で考えてました
ホットで適当なスレが見当たらず、一番mmap使いそうなcスレでいいかと
失礼しました
478:デフォルトの名無しさん
17/11/24 13:07:13.19 13KSLmbUM.net
>>466
一応一般的には
非dirtyならまだ物理メモリは割り当てられてない、が正しい
物理メモリの再利用についてはdirtyでもswapがあれば行われる(そのためのswap)
479:デフォルトの名無しさん
17/11/24 14:08:06.79 /RqU0h4Pd.net
コーディングの仕方的な教材になる本あるかな?
コーディングとはこうやって沿っていくと良いよ的な本
それを読んでからテクニックの本を読もうとしてる(effective)
480:デフォルトの名無しさん
17/11/24 15:12:46.00 bYdw4irrd.net
>>468
まず「リーダブルコード」読んどけ。
481:デフォルトの名無しさん
17/11/24 15:20:30.73 W0y6TqiA0.net
>>467
つまりreadonlyでmmapし場合、dirtyにならないから物理は割り当てられないと
すごいな
482:デフォルトの名無しさん
17/11/24 16:33:20.57 /I02is1j0.net
割り当てられてないメモリーにアクセスするとページフォルトが起きてから
OSが割り当てる遅延ファイルマッピングの事をいいたいんじゃないのかな。
483:デフォルトの名無しさん
17/11/24 17:19:21.14 oz95vMBJM.net
DMA涙目だな
484:デフォルトの名無しさん
17/11/24 17:56:03.88 37SoWLJsH.net
ポインタのことなんだけど、*pt と pt みたいに同じ名前で宣言したら、別々の変数になる?
485:デフォルトの名無しさん
17/11/24 18:18:10.79 OpHoTsuS0.net
>>473
まずはやってみろ
486:デフォルトの名無しさん
17/11/24 18:23:00.58 LzLaFdMta.net
>>474
たしかに
家帰ったらやってみる
487:デフォルトの名無しさん
17/11/24 19:41:11.01 5gRYCg9up.net
つか、どうしつて区別すると思うんだ?
488:デフォルトの名無しさん
17/11/24 19:44:50.18 4DoLJt5P0.net
*も含めて変数名と思ったんじゃね?
489:デフォルトの名無しさん
17/11/24 20:43:22.73 yshQtEuUM.net
>>466
まあここでいいと思うぞ
madviseはあまり関係ない
落とされる前提でポリシー決めてるだけ
MAP_SHAREなら解放される可能性がある
MAP_LOCKEDで解放されない
他のフラグは知らん、試せ
490:デフォルトの名無しさん
17/11/24 21:30:01.83 Mh0dfdoe0.net
これまた初歩的な質問なんだけど、intとdoubleとかで変数名が衝突したらどうなる?
491:デフォルトの名無しさん
17/11/24 21:34:30.17 oQOGHeAz0.net
衝突してるぞエラーになる
492:デフォルトの名無しさん
17/11/24 22:01:24.27 OpHoTsuS0.net
>>479
>>474
493:デフォルトの名無しさん
17/11/24 22:54:20.18 Mh0dfdoe0.net
確かにエラー出るんだけど、できないってことでいいの?
494:デフォルトの名無しさん
17/11/24 23:29:26.60 LzKIf/Vy0.net
外のスコープで定義されたものと名前が衝突した場合は内側の方が有効になり
同じスコープで衝突した場合はエラーになる
495:デフォルトの名無しさん
17/11/24 23:30:01.94 oz95vMBJM.net
cでは出来ない。という仕様
496:デフォルトの名無しさん
17/11/25 00:53:38.80 JCp8dCym0.net
サンガツ
497:デフォルトの名無しさん
17/11/25 06:12:18.91 KGlQ3mpn0.net
同じ変数名でもスコープが違えば出来るよ。
498:デフォルトの名無しさん
17/11/25 06:35:32.53 H7G0IpRv0.net
int* ptの意味は意味int *ptだよ。
ptをデリファレンス演算子で評価したらint型になるよという宣言だよ。
499:デフォルトの名無しさん
17/11/25 08:28:27.42 InRb1JFJ0.net
変数名が型ごとに独立した名前空間に属する、という言語があるのかな。
原理的には可能だと思うけど、えらく組みにくそうな気がする。
「型だけが異なる同名の変数を使わない」みたいなコーディング規約を強制されそう。
500:デフォルトの名無しさん
17/11/25 08:44:13.26 H7G0IpRv0.net
構造体のネームスペースみたいに
全部の変数に型名をつけるようになるだろうな。
501:デフォルトの名無しさん
17/11/25 08:47:32.78 t3NLc0dP0.net
かえって使いづらい言語になるね
502:デフォルトの名無しさん
17/11/25 09:32:16.56 87Khqx810.net
変数の寿命はできるだけ短くしましょう
503:デフォルトの名無しさん
17/11/25 13:36:36.33 O9uPrWP7d.net
リーダブルコーディングとeffective以外に本を探してるのだけど他にあるかな?
504:デフォルトの名無しさん
17/11/25 14:31:12.80 99QBz+fh0.net
組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、2006
505:デフォルトの名無しさん
17/11/25 16:19:42.50 87Khqx810.net
C実践プログラミング
506:デフォルトの名無しさん
17/11/25 16:51:39.14 o/Q+Vng/d.net
っコードコンプリート
507:デフォルトの名無しさん
17/11/25 17:02:06.40 DmTU06Rg0.net
>>488
perlは$aと@aと%aが違うけどな。型と言うよりはスカラか配列かハッシュかの違いだな。
508:デフォルトの名無しさん
17/11/25 17:03:44.75 ROI3Hzdd0.net
>>493
ネットで MISRA の詳しい解説はありませんか?
509:デフォルトの名無しさん
17/11/25 17:08:09.65 N5s7ffCaM.net
>>497
つ URLリンク(srad.jp)
510:デフォルトの名無しさん
17/11/25 17:24:25.43 6ctJHfBp0.net
処理重視なら毎回毎回変数宣言って処理が鈍くなるよな?
511:デフォルトの名無しさん
17/11/25 17:58:52.01 AcXq78AE0.net
インタプリタじゃないです
512:デフォルトの名無しさん
17/11/25 17:59:36.62 t3NLc0dP0.net
C++でもないのでコンストラクタ走るわけでもないです
513:デフォルトの名無しさん
17/11/25 18:34:32.19 ve9pYFQ+p.net
スタック操作なんか関数呼び出し時にまとめてやってるから、どこで宣言しようが処理速度は変わらないけどな。
514:デフォルトの名無しさん
17/11/25 18:34:37.15 ROI3Hzdd0.net
>>499
その程度ならコンパイラが良きに計らってくれますよ
515:デフォルトの名無しさん
17/11/25 19:25:41.27 Hc9rYyD70.net
for文の中の変数宣言って外で行うよりオーバーヘッド大きいの?
516:デフォルトの名無しさん
17/11/25 19:29:40.95 o/Q+Vng/d.net
>>504
言語上ブロック内で有効なだけで、
他の自動変数同様スタックに余分にとられるだけだからまず変わらない。
517:デフォルトの名無しさん
17/11/25 20:41:30.63 DmTU06Rg0.net
>>499
宣言だけ?メモリ確保とかは自分でやらずに?
だったら最初に確保する一回分だけの時間しか掛からないと思うぞ。
518:デフォルトの名無しさん
17/11/25 20:51:32.38 L+SRk42p0.net
あ、C++みたいな言語でクラスの中でメモリ確保してデストラクタで解放やってるような場合は
ループするブロックの中で宣言したら最低でもメモリ確保と解放でループの回数分時間
掛かっちゃうだろうけど、C言語にはそういうのはないので掛からない。
519:デフォルトの名無しさん
17/11/25 20:59:06.21 XP2bT693d.net
動的に確保というのはあるだろうが、
俺を意識した使い方するだろうし
520:デフォルトの名無しさん
17/11/25 21:27:39.55 FWelsGSm0.net
VLAはスコープの出入りで伸縮だと思うが
521:デフォルトの名無しさん
17/11/25 22:01:34.55 DmTU06Rg0.net
ああ。そうか。これか。
URLリンク(qiita.com)
C11のこと忘れてた。
522:デフォルトの名無しさん
17/11/26 16:09:01.86 EJqMiwXm0.net
>>506
for文とかの中で宣言してやったりすると毎回確保するから処理の速度が遅くなるってどっかで書いてあった
なるべく何回も宣言しないで中身を変える処理をする方が処理がはやくなるとか言ってた
523:デフォルトの名無しさん
17/11/26 16:12:10.13 xKw15WCKH.net
そのレベルの理解なら気にする必要はない
そもそもCを使う必要もない
524:デフォルトの名無しさん
17/11/26 16:15:46.29 pGcZHtwF0.net
>>511
> for文とかの中で宣言してやったりすると毎回確保するから処理の速度が遅くなるってどっかで書いてあった
よほどショボいコンパイラでない限り気にする必要はない
> なるべく何回も宣言しないで中身を変える処理をする方が処理がはやくなるとか言ってた
そう言うアホな本は窓から捨てるべき
525:デフォルトの名無しさん
17/11/26 16:46:48.52 EJqMiwXm0.net
>>513
それは中の処理が大量になっても大丈夫なのか?
20行、30行ぐらい長い処理でも?
526:デフォルトの名無しさん
17/11/26 16:52:44.80 14BIGute0.net
宣言と長い処理って何処に関連が?
初期化の右辺がすんげー長いというのは
変数宣言がループの中にあろうが変数宣言をループの外に追い出しても
同じで必須コストだしそこは論点じゃないよね
527:デフォルトの名無しさん
17/11/26 17:10:19.17 EJqMiwXm0.net
>>515
URLリンク(qiita.com)
これのループ内での変数宣言ってやつのことを知ってそうしたんだけど
528:デフォルトの名無しさん
17/11/26 17:15:43.31 14BIGute0.net
>>516
全部ヒントに「コンパイラが最適化でやる」って書いてあるし
逆にそのコストが重いようならもっと根本的な手入れ(アルゴリズムの見直しとか)が必要だし
529:デフォルトの名無しさん
17/11/26 17:20:34.69 EJqMiwXm0.net
なるほどなるほど、アルゴリズムの問題か納得した
530:デフォルトの名無しさん
17/11/26 17:23:40.85 woDc+4Yf0.net
C言語じゃなくてC++でのクラス変数じゃないの?
531:デフォルトの名無しさん
17/11/26 17:29:05.50 pGcZHtwF0.net
>>514
測定して本当にそれが問題になってるとわかった時に考えればいい
532:デフォルトの名無しさん
17/11/26 17:57:37.44 YtJM5Nau0.net
>>516
「実際のところ」と書いてある所をよく読むべき。
533:デフォルトの名無しさん
17/11/27 04:22:16.28 vYl0vGfCd.net
コードとは直接関係はないけどメモリリークのテストってlinuxだとどうやるのだろう?
534:デフォルトの名無しさん
17/11/27 07:40:08.21 fAclYYwOM.net
>>522
valgrind か LeakSanitizer
535:デフォルトの名無しさん
17/11/27 07:57:21.48 ENOa9M21M.net
>>522
valgrind (URLリンク(valgrind.org))
536:デフォルトの名無しさん
17/11/27 13:20:55.85 HfjV3qo40.net
脳内ループ最適化かー。結構良く目にするのは
int i;
for(i = rows; 0 < i; i―)
Hoge;
だったりするけど
組み込みでも、このくらい最適化かかるのにねぇ
537:デフォルトの名無しさん
17/11/27 1
538:9:33:17.36 ID:vYl0vGfCd.net
539:デフォルトの名無しさん
17/11/27 20:30:19.45 clAY2uWxa.net
>>526
systemって-1返す事なかったっけ?
540:デフォルトの名無しさん
17/11/27 20:31:48.14 clAY2uWxa.net
>>526
てか、>>443見てみな。
541:デフォルトの名無しさん
17/11/27 22:36:43.33 AvUHS7bA0.net
>>522
オレは単純にpsコマンドで、vszとszの推移を見てるだけだなー
確保の仕方にもよるだろうけど。。。
542:デフォルトの名無しさん
17/11/27 22:55:20.44 epITd0LcM.net
>>529
メモリマップとかは見てると分かった気になれるし、仕事してる感も出るからおすすめ
543:デフォルトの名無しさん
17/11/27 23:00:48.16 jJU6vIIdd.net
>>528
うおおおおお
たしかにあった
>>527
-1は素で忘れてた
>>443見てみたけど最後if elseで終わってるからその後がどうなんの?って気になる
if elseってことは他もあるじゃん?ってなるのだがいかんせんman理解できない...
544:デフォルトの名無しさん
17/11/28 01:05:27.23 uD/TV9F60.net
>>531
URLリンク(linuxjm.osdn.jp)
Linux の場合大きく分けて WIFEXITED と WIFSIGNALED 以外があるのかというと今のところない。
しかし将来的に増えないとも限らないので念のため if で分岐させておいた方が良いと思う。
545:デフォルトの名無しさん
17/11/28 01:45:58.95 //UzmZat0.net
URLリンク(i.imgur.com)
この問題なんだけど、下の書き方以外に賢い方法ある?
このやり方はごり押し過ぎてさすがに違うと思うんだけど
URLリンク(codepad.org)
546:デフォルトの名無しさん
17/11/28 03:16:49.45 Ol4PUSI5M.net
>>533
3点ほど
配列使う必要ある?保持したいのは最大値だけなんだよね?入力ループ内で最大値判定までやったら?
ローカル変数名は input_num とか分かる名前つけようか
main の戻り値
547:デフォルトの名無しさん
17/11/28 07:53:02.37 tl7kMs1v0.net
C99以降だっけ?
省略された int main() の返り値として自動的に return 0; が補われる、
という仕様があるはずだけど、それに積極的に依存するよりも
return 0; と1行書く方が良い習慣だわね。
548:デフォルトの名無しさん
17/11/28 08:09:45.26 VZsT4wzqd.net
>>532
さんくす
これ読みにくいよなぁ....
子プロセスの配送が停止したとき
具体的に言うとwifstoppedの時は別なのかな?
549:デフォルトの名無しさん
17/11/28 18:38:43.18 v3J3k8MEM.net
stdlib.hのSUCCESSなんちゃらをほんにゃら
550:デフォルトの名無しさん
17/11/29 02:06:01.37 1lf2VR3q0.net
>>536
試してみればわかると思うけど system() で動かされた子プロセスは SIGSTOP 受け取っても
停止するだけで親プロセスには帰らないよ。system() 内でやってる waitpid() は WUNTRACED
や WCONTINUED オプション使ってないってことだと思う。なので STOP や CONT に関係する
WIF... はやる必要がない。
551:デフォルトの名無しさん
17/11/29 15:46:29.13 awoPtY5k0.net
char str1[10]="AAAAAA";
char str2[10]="BBBBBB";
char str3[10]="CCCCCC";
があって、これをそれぞれ
char strh[0][10]~char strh[2][10]に代入する方法を教えてください。
552:デフォルトの名無しさん
17/11/29 15:5
553:8:48.18 ID:mhTWLdh/0.net
554:デフォルトの名無しさん
17/11/29 16:16:35.31 4OxukQ3ip.net
ポインターのコピーじゃダメなんですか?
なんで中身をわざわざ複製して、処理時間を無駄に消費するんですか?
555:デフォルトの名無しさん
17/11/29 16:25:56.35 llo+D0tpd.net
>>538
ありがとうありがとう
そうすることにする
stat関数でのファイル存在確認って破損していたファイルだとエラー返ってくる?
仕様を調べていたけどそのような記載がなかった
556:デフォルトの名無しさん
17/11/29 17:24:28.37 FWpFj9nP0.net
>>541
ポインタのコピーだとコピー元の配列(str1[],str2[],str3[])の中身を変更するとコピー先(*strh[0]~*strh[2])の内容まで変わる
値のコピー(strcpy()など)だとコピー元の配列の中身が変わってもコピー先の配列(strh[0][]~strh[2][])の内容は変化しない
配列とポインタでは挙動が違う
557:デフォルトの名無しさん
17/11/29 17:38:36.67 7w8PUMIS0.net
初期化でやってしまう話じゃないんだろうな。 多分
char strh[3][10] = { "AAAAAA", "BBBBBB", "CCCCCC" };
558:デフォルトの名無しさん
17/11/29 17:49:08.23 Ypog5BGe6.net
配列変数はただのポインタ変数じゃないってマジ?
arr==&arrになるんやが。
arrがポインタなら&arrはポインタのポインタだからこれはおかしい。
559:デフォルトの名無しさん
17/11/29 18:28:37.84 azEm6Mj/M.net
配列名が先頭要素へのポインタになるのは構文糖
560:デフォルトの名無しさん
17/11/29 18:44:21.59 +PcO5Rrn0.net
int a[10];
int *p;
p++; 問題なし
a++; エラー
配列は配列 ポインタはポインタ
561:デフォルトの名無しさん
17/11/29 18:50:37.55 Xa+98JY60.net
arrと&arrじゃ型違うし、比較結果が一致する保証もないけど?
562:デフォルトの名無しさん
17/11/29 18:51:10.65 DGImDAX5a.net
また一人C言語の罠に掛かったようだ・・・
563:デフォルトの名無しさん
17/11/29 18:57:26.48 DGImDAX5a.net
>>545
ポインタの変数はポインタを入れとくための変数だ。
配列変数はポインタを入れとく変数ではなく、単に配列の先頭を表すラベルでしかない。
564:デフォルトの名無しさん
17/11/29 19:03:01.69 azEm6Mj/M.net
よし、sizef演算子の出番だな。
565:デフォルトの名無しさん
17/11/29 19:11:32.94 vgi7NPsq0.net
>>545
int arr[10]; みたいに配列を定義して
if (arr == &arr) {...} てな具合に比較する話かな。
配列名 arr は &arr[0] (先頭の要素へのポインタ)
配列名に&演算子を作用させた &arr は配列全体(10要素の配列)へのポインタ
…と解釈される、とANSIで決まった、と望洋さんの本に載ってる。
『秘伝C言語問答 ポインタ編』p.25 Column1-2 「配列名に&をつけると……」
>>548
型が違うのは間違いないけど、値が一致しない場合ってあるのかな?
それとも型の異なるポインタ同士での値の比較って未定義動作なんだっけ?
566:デフォルトの名無しさん
17/11/29 19:31:59.94 bodUKsOx0.net
>配列名 arr は &arr[0] (先頭の要素へのポインタ)
>配列名に&演算子を作用させた &arr は配列全体(10要素の配列)へのポインタ
>…と解釈される、とANSIで決まった、と望洋さんの本に載ってる。
なるほどな
567:デフォルトの名無しさん
17/11/29 19:54:00.64 Xa+98JY60.net
>>552
>6.5.9 等価演算子
>(中略)
>制約??次のいずれかの条件を満たさなければならない。
>(中略)
>-両オペランドとも適合する型の修飾版又は非修飾版へのポインタである。
「~型」と「~型の配列型」は適合しないから、ポインタの比較は未定義
568:デフォルトの名無しさん
17/11/29 20:09:41.35 /RfTzpPk0.net
>>552
型が異なったら、比較できない
例えば、アドレス100番地から10バイトと、
アドレス100番地から20バイトでは、全然違う
仮に、同じバイト数だとして�
569:焉A中身・内容が異なるし、比較する事に意味がない
570:デフォルトの名無しさん
17/11/29 22:15:27.21 QTG/JUE+0.net
>>542
ファイルの破損というのがファイルの中身の論理レベルの話なら正常なファイルとみなされるはずだし、ファイルシステムレベルの破損やメディアの物理的破損なら実装依存じゃないかな。
571:デフォルトの名無しさん
17/11/29 22:18:50.37 QTG/JUE+0.net
>>555
いま話題にしているのはarrと&arr[0]の比較であって、これらはどちらも比較演算子のオペランドとしてはint*型として評価されて型も値も一致すると思ってたけど、どうだろう。
572:デフォルトの名無しさん
17/11/29 22:20:43.77 QTG/JUE+0.net
>>557
間違えた。arrと&arrね。&arrもint*型のはず、だと思う。
573:デフォルトの名無しさん
17/11/29 22:42:55.53 Xa+98JY60.net
実際にコンパイルすれば型不一致のwarning出るのに、なんでそういう発想になるんだろう
不思議だわ
574:デフォルトの名無しさん
17/11/30 06:56:06.98 VGvsvH1F0.net
>>557-558
int arr[10]; と定義されてる場合、
arr の型は int*
&arr の型は int (*)[10]
つまり arr と &arr は型が違う
というのが >>552 の「&arr は配列全体へのポインタ」の意味。
「引数として『10個のintを要素とする配列』のみを受け入れる関数」
(要素数が違うとコンパイルエラー)みたいのを書ける。
もちろん、それが目的で存在する書式じゃないだろうけど。
それにしても &arr の型の書き方は分かりにくいな。
理屈は多次元配列を仮引数にとる関数プロトタイプと同じ、
だと思うんだが。
575:デフォルトの名無しさん
17/11/30 07:49:26.15 T6nL/USz0.net
>>560
色々と記憶違いをしてたよ。サンクス。
576:デフォルトの名無しさん
17/11/30 10:29:35.42 /QNJXUpA0.net
>>560
arrの型はint[10]だボケ
&arr[0]がint*だ
おまえさんの、その理解では&arrがint**になっちまうだろうが
577:デフォルトの名無しさん
17/11/30 10:41:32.87 5xc99BMT0.net
arrは&arr[0]の糖衣構文なので型は同じint*だろ
578:デフォルトの名無しさん
17/11/30 10:46:30.46 Rc2VGt53a.net
糖衣構文なのになんでわかりづらくなってるんすかね
579:デフォルトの名無しさん
17/11/30 10:48:13.06 I+JVe+Ukp.net
まあ、sizeofしたら分かるよ。
580:デフォルトの名無しさん
17/11/30 10:53:47.57 5xc99BMT0.net
arr=&arr[0]≠&arr
581:デフォルトの名無しさん
17/11/30 10:56:17.41 CwUb7XwN0.net
代入左辺の int* に渡す右辺
関数引数の int* に渡す引数
ここに渡す際に先頭要素へのポインタを与えてるだけで
変数そのものはポインタにはなっていなくて配列のまま
582:デフォルトの名無しさん
17/11/30 11:01:32.20 I+JVe+Ukp.net
arrは要素10持つ配列の先頭アドレスを返す、サイズはint 10個分
&arr[0]は、配列要素0番目のアドレスを返す、サイズはint 1個分
先頭アドレスが欲しいだけなら型キャストして使えばいい。
代入に使うならサイズが違うから上手く行かない。
583:デフォルトの名無しさん
17/11/30 11:10:18.71 5xc99BMT0.net
arr = &arr[0] ≠ &arr
sizeof(&arr) = sizeof(&arr[0]) ≠ sizeof(arr)
584:デフォルトの名無しさん
17/11/30 12:23:05.77 /QNJXUpA0.net
>>563
いーや違う
§6.3.2 Other operands
Except when it is the operand of the sizeof operator, or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type'' is
converted to an expression with type ‘‘pointer to type ' that points to the initial element of the array object and is not an lvalue.
あくまで配列からポインタへconvertedつまり元の型int[10]とは違う型int*への変換だ
585:デフォルトの名無しさん
17/11/30 12:39:07.57 wmrrhfKqM.net
C言語は覚えることが少ないので初心者にお勧めです👈
586:デフォルトの名無しさん
17/11/30 12:58:4
587:9.70 ID:7wMQk3WFa.net
588:デフォルトの名無しさん
17/11/30 13:08:48.69 CNBdn6EpM.net
まあ他の言語よりはね
589:デフォルトの名無しさん
17/11/30 15:43:07.77 AraxvjGC0.net
氏名、生年月日を入力させて、年齢を出力する。(ここまではいい)
再度起動時に、同一氏名入力時は生年月日と年齢を出力する(これがわからん)
方向性がさっぱり見えない、どうすりゃいいの?
URLリンク(codepad.org)
590:デフォルトの名無しさん
17/11/30 15:49:01.37 CwUb7XwN0.net
入力された氏名のファイルを探す
無い→ファイル作って 入力した生年月日を書き出すとともに変数に覚えておく
有る→ファイルから生年月日を変数に読み込む
↑の処理で変数で覚えている生年月日から年齢を求め表示する
591:デフォルトの名無しさん
17/11/30 15:50:35.20 CwUb7XwN0.net
異なる氏名の分だけファイルを作っちまうけどお手軽
592:デフォルトの名無しさん
17/11/30 15:58:14.77 AraxvjGC0.net
if文&fread,fwriteでなんとかなります?
あと出来ればリンク先のソースコードにダメだし貰えると嬉しい
593:デフォルトの名無しさん
17/11/30 17:12:52.14 hDUXhrlWM.net
ファイルが一個しか使えないんなら、
その中に何の情報をどんなフォーマットで入れるか先に設計しろ。
594:560
17/11/30 17:54:17.29 VGvsvH1F0.net
>>562 言葉は悪いけど言う通りだね。
俺が書いたのは arr て名前が演算の対象として単独に現れたときに
自動的にポインタの値に変換される場合の値と型のことだった。
arr 自体はあくまで配列だから int[10]
この名前が関数の引数とかで使われた場合 &arr[0] と同じになる。
配列名は隙あらば「先頭要素へのポインタ」になりたがる。
こんな感じでよろしいか? (我ながらぎごちないけど)
595:デフォルトの名無しさん
17/11/30 18:07:14.42 rYNpG8Zla.net
>>577
fprintf()で一行にカンマ区切りで名前と生年月日出した方が扱いやすいのでは?
で、処理の順序としてはこうだ。
1. 名前入力。
2. 入力された名前がファイルの中にあったら一緒に入っている生年月日を出して終了。
3. 生年月日入力。
4. 名前と生年月日をファイルに追加。
5. 終了。
ファイルアクセスは2では読み出ししかせず開きっぱなしにしないでクローズする。
4では追加書き込みだけしてクローズだ。
596:デフォルトの名無しさん
17/11/30 18:07:34.67 kZZqjgS10.net
OLE複合ファイルで保存すればよろし
597:デフォルトの名無しさん
17/11/30 18:30:11.56 RwvI386YM.net
構造体配列をバイナリでrw
598:デフォルトの名無しさん
17/11/30 21:02:57.60 /QNJXUpA0.net
>>579
演算の対象ではなく、特定の演算子の対象な
どの演算子で&arr[0]に変換されるのか、
列挙できる知識が必要ということだ
599:デフォルトの名無しさん
17/11/30 21:56:39.93 xcZwpJOTa.net
XMLで
なんていうと余計にややこしくなって大変な事になるなw
600:デフォルトの名無しさん
17/11/30 22:05:39.04 ewUYSdOO0.net
>>583
左辺値が変換されるのであって、特定の演算子のオペランドのとき変換されるなんて仕様はないよ?
特定の演算子のオペランドのときに変換されないって仕様はあるけどさ
601:デフォルトの名無しさん
17/12/01 06:29:54.45 jGNBP26P0.net
>>585
Cの演算子は「特定の演算子」の集合で、
そこから、ある特定の演算子を除いた残りもまた
特定の演算子だろうがよ
602:デフォルトの名無しさん
17/12/01 06:50:45.43 NXDNhmZv0.net
宣言とか、演算子出てこないことぐらいあるだろ
初期化子つきの宣言に出てくる=が代入演算子だとでも思ってんのか?
603:デフォルトの名無しさん
17/12/01 07:18:53.95 NIbF5rwZM.net
>>584
C# とか C++ ならまだしも C言語だとちょっと辛いわな
>>574 程度なら .ini ファイルみたいな奴でいいかと
604:デフォルトの名無しさん
17/12/01 09:10:23.44 IMGPh1jC0.net
>>587
ちなみに、初期化子つきの宣言に出てくる=が代入演算子でないとすると、
その=は何と呼ばれるものです?
605:デフォルトの名無しさん
17/12/01 09:50:32.00 jGNBP26P0.net
>>587
宣言? おまえさん、int arr[10];がint *arr;に変換されるとでも思っているのか?
仮引数にint arr[10]と書くとint arr[]に読み替えられたりはするが、
そのことを言っているのなら>>562で指摘したとおりになるな
ただし>>560にはセミコロンが付いていてそういう逃げ道は封鎖されているわけだが
606:デフォルトの名無しさん
17/12/01 10:53:53.03 j3o2JE0u0.net
int arr[10];
int *p = arr; /* このときの arr の解釈 */
を指してるのだと思うの。
ここで出てくる = は代入演算子じゃないぜ って
607:デフォルトの名無しさん
17/12/01 11:01:39.32 y1pVtdhXM.net
我輩は宣言子と初期化子の間の=である。名前はまだ無い。
608:デフォルトの名無しさん
17/12/01 11:08:59.34 jGNBP26P0.net
>>589
初期化宣言子 init-declarator
609:デフォルトの名無しさん
17/12/01 12:08:20.94 IMGPh1jC0.net
>>593
なるほど、情報サンクスです。
C++だと、同じものが代入演算子と称されていて。コンストラクタ内で代入演算子をオーバーロードすべし、
のような言い方をよく見かけますので。Cでも同じ呼び方をするのかと思ってました。
610:デフォルトの名無しさん
17/12/01 12:17:22.80 y1pVtdhXM.net
いやまて init-declarator は、"宣言子"か"宣言子=初期化子"のことだぞ
611:デフォルトの名無しさん
17/12/01 12:22:41.61 IMGPh1jC0.net
>>594
あー、よく見たらC++ではコピーコンストラクタと代入で明確な区別があるんですね。
もっと勉強しなきゃですわ
612:デフォルトの名無しさん
17/12/01 13:24:35.76 jGNBP26P0.net
>>595
s/"宣言子"か//
613:デフォルトの名無しさん
17/12/01 14:30:51.38 HUofIpvH0.net
貞子とか初子とか
614:デフォルトの名無しさん
17/12/01 15:44:26.68 0Iysip4/d.net
プログラミング初心者です
車のタコメーターをフルカラーのディスプレイを使って作りたいのですが、どうすれば良いのかが全く分かりません
C言語は計算機内で式の答えを演算する程度なら使えますが、ハードを制御したりはできないです(Arduinoなら少し弄りました)
C言語で作れるのかも分からないので、簡単なところから教えてください
エンジン回転数のパルス信号は取れてます
615:デフォルトの名無しさん
17/12/01 15:55:36.34 HUofIpvH0.net
ターゲット環境は?
616:デフォルトの名無しさん
17/12/01 15:56:55.06 jGNBP26P0.net
Ardudinoを弄ったことがあってハード制御ができない?
パルス信号を取れるっていうのは、オシロスコープか何かで確認できたってことか?
・・・もしかして、こういうことか?
その信号をプログラムで読み取るには、どこの端子に繋ぐのかとか、
信号のレベルの合わせ方とか、そういうことがわからんのか?
617:デフォルトの名無しさん
17/12/01 16:01:06.60 j3o2JE0u0.net
マイコンに表示装置とかをくっつけて
デジタコを0から自作したいってことなのかな?
言語外の相談のほうが重要度高いような気もする
618:デフォルトの名無しさん
17/12/01 16:13:56.45 0Iysip4/d.net
信号→マイコン→処理
は分かります
その処理を今までPC上に表示させていた物をディスプレイに↓のようにカッコよく表示させるにはどうすれば良いのかを教えてほしいのです
URLリンク(i.imgur.com)
619:デフォルトの名無しさん
17/12/01 16:15:42.98 0Iysip4/d.net
何から調べていいのかも分からない状態です
ど素人ですみません…
620:デフォルトの名無しさん
17/12/01 16:54:04.97 kRZ1SJ+P0.net
そのディスプレイとやら仕様書見せてくれなきゃ
なんとも答えようがなくない?
621:デフォルトの名無しさん
17/12/01 16:56:05.30 y5AhnBkya.net
>>603
ターゲットのマシンは?
Windows? Linux?
ていうか、C言語でやると何で動かすにしても大変面倒だと思うので何か他の言語使った方が良いと思う。
622:デフォルトの名無しさん
17/12/01 16:56:22.84 0Iysip4/d.net
言語もバードも指定は無いです
寧ろ何を使えば良いのかを教えて欲しいです
623:デフォルトの名無しさん
17/12/01 16:59:45.04 0Iysip4/d.net
ターゲットがよく分からないのですが、コードはUNIX系のOSのemacsで書いてます
Windows上で作ったプログラムを動かしたことはあまりないですね
624:デフォルトの名無しさん
17/12/01 17:09:00.66 jGNBP26P0.net
ディスプレイのつなぎ方がわからんのか?
つないであるディスプレイへのコマンドの送り方がわからんのか?
625:デフォルトの名無しさん
17/12/01 17:42:29.56 jA0BeSqZ0.net
>>599
PCのウィンドウ環境上でウィンドウを開いてグラフィック表示って問題なら、
環境次第でここでも分かると思うけど…。
部品としての液晶やLEDのパネルのハードウェア制御ってことになると、
まずはどの部品を使うのか、って話になるな。
626:デフォルトの名無しさん
17/12/01 18:11:29.04 5uJXNlV4M.net
なにがベストかと聞かれても答えにくい質問だな。
自分ならデータを無線で飛ばしてタブレットでみれるwebシステムを検討したい案件だが。
627:デフォルトの名無しさん
17/12/01 18:28:55.76 LYbXDWPHH.net
そもそもの目的は?勉強とかお遊び?
628:デフォルトの名無しさん
17/12/01 18:35:32.61 6HJgPekDM.net
消費電力、サイズ制限、予算諸々考えてどの程度のハードが用意出来るかって所から
linuxやwinが動くようなリッチな環境が用意出来るなら
GUI部はCじゃなくても良くねってのが正直な感想
629:デフォルトの名無しさん
17/12/01 18:39:21.60 kbDZQVhk0.net
BT接続できるOBD2アダプタ(点検器具端子)買ってアンドロ端末に表示するのがお手軽かも
630:デフォルトの名無しさん
17/12/01 19:09:42.97 qQWTYDNZM.net
>>597
おれも少し変だとは思うけど、企画書には、宣言子単独が init-declarator に含まれてるんだよ
631:デフォルトの名無しさん
17/12/01 19:38:44.88 quTLstwT0.net
>>608
> ターゲットがよく分からないのですが、コードはUNIX系のOSのemacsで書いてます
根本的に分かってないようだが、「ターゲット」ってのはお前が決めるんだよ。
そして既にコードを書いていて、そこにLCDを接続したいだけなら、その環境を言えよ。
632:デフォルトの名無しさん
17/12/01 20:25:33.69 01uXYhT3d.net
LCD付ARMのlinuxキットでやれ
633:デフォルトの名無しさん
17/12/01 20:27:16.42 NXDNhmZv0.net
>>615
初期化子なしは、不定値で初期化するって意味だと納得することにしてるわ
一応、初期化の説明に含まれてるし。。。
つーことで、>>586とかには演算子のオペランドでないこともあるって理解してもらえたかな
良かった良かった
634:デフォルトの名無しさん
17/12/01 20:54:03.81 HgVhW4BC0.net
>>603
>信号→マイコン→処理
>は分かります
で、信号は取れたとか言ってるんだから対象の物理的扱いはわかっているんだろ。
それをどんなマイコンにどう繋ぐかだ。出来合いのマイコン基板を買ってきて
それに繋げるのか、基板から自作するのか
635:デフォルトの名無しさん
17/12/01 21:25:55.70 jGNBP26P0.net
>>618
586だが、だから何だ?
演算子に限らずとも、Cは明確に列挙された機能の集合だ
そこから特定の演算子を除いた残りは、
おまえが言うような曖昧な集合ではない
636:デフォルトの名無しさん
17/12/01 21:37:37.37 kbDZQVhk0.net
>>583 へのカウンターじゃないの?
583では 変換が走るのは 特定の演算子の対象 としてるけど
初期化においても変換が走ってる
この記述中では演算子はなくて、該当変数は演算子のオペランドになっていない って
637:デフォルトの名無しさん
17/12/01 21:39:28.94 NXDNhmZv0.net
>>620
ん?
配列型を持つ左辺値は特定のケースを除いてポインタ型に変換されるという
規格に明記してある話を理解してもらえればそれで十分だよ?
初期化子には演算子が含まれないこともあるって理解できたんだよね
なら、それで良いよ
638:デフォルトの名無しさん
17/12/01 21:43:38
639:.60 ID:jGNBP26P0.net
640:デフォルトの名無しさん
17/12/01 21:46:07.65 kbDZQVhk0.net
>>623 俺の認識は >>570 の converted であり
arr は int[10] のまま
641:デフォルトの名無しさん
17/12/01 22:00:29.26 NXDNhmZv0.net
>>623
そりゃ、>>570のconvertedだろ
sizeof、&、配列の初期化に用いられる文字列リテラルを除いて、配列型をポインタ型に変換する。それはもはや左辺値ではない。
の変換
642:デフォルトの名無しさん
17/12/01 22:05:59.37 NXDNhmZv0.net
もしかしてarr自体がint*型を持つというアホな解釈を擁護してるとでも思われてたの?
それは>>560自身も、>>579で式中に現れた場合のことでしたって弁明してるでしょ
それとも
arr;
という識別子名だけの単文があったとき、arrがポインタ型に変換されないと思ってる?
左辺値なんだから、当然変換されるよ
643:デフォルトの名無しさん
17/12/01 22:11:15.92 kbDZQVhk0.net
>>625
> 配列の初期化に用いられる文字列リテラル
(その通りに動作すると期待して)普通に使ってるけど、
逆の観点の、配列のまま取り扱ってる例として挙げようとすると、見落とすわ これ
644:デフォルトの名無しさん
17/12/01 22:19:35.93 jGNBP26P0.net
>>626
うん、そう思っている
おまえ、なぜ
arr;
がポインタ型に変換されると思っている?
なんだか残念な答えが返ってきそうな予感がするが
645:デフォルトの名無しさん
17/12/01 22:49:05.07 NXDNhmZv0.net
6.3.2.1 Lvalues, arrays, and function designators
An lvalue is an expression with an object type or an incomplete type other than void
6.8.3 Expression and null statements
expression-statement: expressionopt ;
arr;は式文、arrは式(左辺値)
よって、>>570の規則に従って変換される
646:デフォルトの名無しさん
17/12/01 22:57:47.71 jGNBP26P0.net
>>629
それはおかしいぞ
arrという部分式を評価中に、それがどんな文脈の作用対象となるかは
予見しないのがCのポリシーで、だからこそ式arrはlvalueを生じる
その後lvalueからvalue of an expressionへの変換を要請する文脈を経ずに
シーケンスポイントとなっているそのプログラム片のどこに
アドレス計算が生じうるんだよ
647:デフォルトの名無しさん
17/12/01 22:59:25.50 UqjXH8z4d.net
>>608です
>>616
コードをどう書けばいいかも、どれを使えば実現できるのか分からないです
コストや部品点数は抑えたいと思ってます
>>619
どういうマイコンをどうすればアニメーションでディスプレイ出力ができるのかを知りたいんです
おおまかな道筋を教えて欲しいです
ARMマイコンとかどうなんですかね…
648:デフォルトの名無しさん
17/12/01 23:03:12.88 jGNBP26P0.net
PIOのディレクションレジスタを出力に設定してマスクパターンを指定しておき、
それからコマンドを書き込んでストローブのパルスを作って。。。
649:デフォルトの名無しさん
17/12/01 23:07:47.82 NXDNhmZv0.net
>>630
ポリシーとかじゃなくて規格の話をしてくれない?
配列型の左辺値は特定の場所以外で現れた場合に、変換されるという規格なの
演算子を伴わない場合は変換されないというのなら、その規格を明示して
左辺値ですらないというのであれば、その根拠となる規格を示して
人に説明求める割に、自分の論拠が想像ってのはどうかと思うよ
650:デフォルトの名無しさん
17/12/01 23:12:55.57 quTLstwT0.net
>>631
ググレカス
Arduinoと液晶でいくらでもヒットするだろ
ゆとりはマジで殺処分すべきだな
651:デフォルトの名無しさん
17/12/01 23:20:03.85 UqjXH8z4d.net
>>634
ありがとうございました
652:デフォルトの名無しさん
17/12/01 23:49:36.73 P20tw7a40.net
>>633
> 配列型の左辺値は特定の場所以外で現れた場合に、変換されるという規格なの
630 じゃないけど、そっちこそ規格のどこ見て言ってるの?
N1570 6. Conversion で演算子オペランドになったときの変換は確認できるけど、
式文を含めて「現れた」だけで変換されるという記述は見つけられない。
653:636
17/12/01 23:50:50.61 P20tw7a40.net
あ、ごめん。 6. Conversion じゃなくて 6.3 Conversions ね。
654:デフォルトの名無しさん
17/12/02 00:14:21.15 mWFcFWTj0.net
>>633
質問に質問で返さないでくれない?
arr;というプログラム片のどこにアドレス計算が生じうるの?
全く無用と思える操作を強制する根拠法令を示しなさいよ
全く無用と思わない、あんたの思考回路でもいいよ
こちとら規格しか聞く耳持たないとか言わないから
つーか自分なりの思想を持っているやつと話すほうが実りがあるし
655:デフォルトの名無しさん
17/12/02 00:17:19.87 2ymk6h8v0.net
>>636
>>570
an expression that has type ‘‘array of type'' is converted to an expression with type ‘‘pointer to type ' that points to the initial element of the array object and is not an lvalue.
確かに、6.3の頭には演算子オペランドの暗黙的な型変換について規定するとは書いてあるけど、
あくまでもsuch an implicit conversionであって、それだけを規定するわけではないでしょ
expressionが変換されると書いてあるんだから、式が変換されると読むのが素直じゃない?
そう解釈しないと、例えば
return arr;
とか、どういう理屈でポインタを返すと考えれば良いの?
656:デフォルトの名無しさん
17/12/02 00:23:30.95 mWFcFWTj0.net
>>639
おまえさんが言っているのはこういうことだ
int aho() [10]
{
int arr[10];
return arr;
}
コンパイル通るかどうかやってみな
で、どういう理屈でそうなるのか
おまえさん自身が言ってみな
657:デフォルトの名無しさん
17/12/02 00:29:15.26 2ymk6h8v0.net
>>640
自分は一貫してreturn arr;でint*を返すという主張なんだけど?
あなたこそ、演算子を伴わないと変換が行われないと主張してたんだよね?
そういう解釈だと、どうやって
return arr;
でint*返せるのって質問だよ
658:デフォルトの名無しさん
17/12/02 00:32:10.46 mWFcFWTj0.net
>>641
演算子って言質がおまえさんの命綱のようだな
別にそんなの撤回してもこっちは痛くも痒くもない
それをもって勝利宣言したければすればいい
win-winだね
659:デフォルトの名無しさん
17/12/02 00:36:49.22 +GJuKLXc0.net
>>639
return についての規定で代入と同じ変換が行われることになってる。
規格見てるんなら return について疑問に思った時点で該当箇所読んでから聞こうな。
「自分の論拠が想像」は許さない立場なんだからさ。
660:デフォルトの名無しさん
17/12/02 00:45:15.02 2ymk6h8v0.net
>>643
おお、ほんとだ
ありがとう、見落としてたわ
ついでに初期化宣言子も見返したけど、単純代入と同じ型変換後の値が初期値って書いてあるな
ごめん、ごめん
規格解釈は間違ってたけど、結果は合ってたって感じかな
こういう指摘くれたら1発で済んだのに。。。
661:デフォルトの名無しさん
17/12/02 00:52:58.64 mWFcFWTj0.net
>>644
おまえは間違っていた
人のせいにしてんじゃねえよ
662:デフォルトの名無しさん
17/12/02 15:52:09.87 KedYgmHp0.net
文系で一から使えるようになるまでにどれくらいかかりますか?
663:デフォルトの名無しさん
17/12/02 16:07:39.94 fU6v9rJN0.net
桃クリ3年柿8年ゆずの大馬鹿13年。
664:デフォルトの名無しさん
17/12/02 16:16:16.79 34/Kk+++0.net
>>646
文系かどうかはあまり関係ないと思う。論理的な思考が苦手でなければok。
使えるようになるのレベルに幅がありすぎるからなんとも言えない。
プログラミング初めてで、どうしてもCでなければならない理由がないなら、他の言語から入った方が実用的なことをするのには早いと思うよ。
665:デフォルトの名無しさん
17/12/02 16:25:40.62 WQRORJsZ0.net
>>647
ゆずの大馬鹿は18年だったんだが、最近のゆずは発育がいいのか?
666:デフォルトの名無しさん
17/12/02 17:01:24.21 dQxrNdHKM.net
接ぎ木するんだろ
667:
17/12/02 17:10:18.36 4pmjT1Fk0.net
>>646
Java がいいんじゃないかな?書籍も多い
668:デフォルトの名無しさん
17/12/02 18:49:23.92 WQRORJsZ0.net
>>646
数学/物理が出来なくて文系に行った口なら諦めろ。一生無理だ。
頑張ったところで、若い奴らに簡単に追い越され、一生惨めな思いをするだけだ。
他に適性のある分野を探した方がいい。
現実的には、理系/文系のどちらの知識も必要なく、抽象/論理思考が出来るかどうかが全てだ。
だから高々高校2年間程度のラベルの結果である文系/理系自体には大した意味がない。
しかし、そもそも抽象/論理思考が得意なら、当然、
不得手な奴が混ざっている環境(つまり文理分けていない状況)においては無双できる。
結果、「得意だから」≒「好きだから」という理由で文理を選んだのなら、文系を選んでる時点で向いてない。
そして大学4年間で理系の連中は周りが抽象/論理思考出来る奴らばかりという環境で鍛えられることになるから、
決定的な差がついてしまう。
そうではなく、俺は数学も得意な文系だ!というのなら行けるかもしれん。
最近は経済学部が理系化しつつあるという話だし。
いずれにしても個人差の方が大きい。学生なら、やってみて面白くなければ諦める、でいいと思うが。
面白いと思えて続かないようなら向いてない。
669:デフォルトの名無しさん
17/12/02 18:53:01.98 WQRORJsZ0.net
ちなみに、論理的思考は、出来る奴は最初から出来る、というか思考ベースがそっちだ。
もちろん頑張って対応することも出来るが、
最初から出来る連中がデフォの環境で頑張り続けるのは辛いと思うよ。
URLリンク(buzz-netnews.com)
URLリンク(buzz-netnews.com)
670:
17/12/02 18:57:05.09 4pmjT1Fk0.net
>>652
化学・生物じゃだめですか?
671:デフォルトの名無しさん
17/12/02 18:58:43.14 hLt+ALOn0.net
>>653
なんやこの画像w
一般化能力高いなw
672:デフォルトの名無しさん
17/12/02 19:17:30.71 PL6F8Ywp0.net
>>654
むしろ向いてる気がする
数学とか論理によりすぎだと変なこだわりがあったり
現実のあいまいさに適応できなかったりするから
現実的な手続きや広範な知識が必要な化学が得意だったら適正ばっちりじゃないか
673:デフォルトの名無しさん
17/12/02 19:33:33.78 WQRORJsZ0.net
>>654
高校生物=ほぼ暗記
高校化学=暗記7割、理論3割
高校物理=ほぼ理論
高校数学=8割理論、2割パターン暗記
(高校国語/英語/社会=ほぼ暗記)
じゃね?
だから高校化学/生物が得意だからといって、抽象/論理思考の能力は分からない。
(無いとは言わないが、得意とは判断できない)
逆に暗記が得意なら自然と文系教科で無双することになる。
この理由で文系を選んだのなら、暗記能力>抽象/論理思考能力、ということになり、向いてない。
今時のプログラミングってWebを参照しながらやるもんだし、暗記能力自体はほぼ要らなくなってる。
ただしドキュメントを大量に読むようになってきてるから、国語/英語
674:の能力は重要になってきてるが。 とはいえ、高校英語=ほぼ単語を覚えているかどうか、であり、 現実はポップアップ辞書も使えるし、google翻訳も読めないほどでもないし、そもそも技術英語は簡単だしで、 テストでの英語の能力よりも、何を書いてあるか読み解く方が重要で、 いわゆるTOEIC等とは違う尺度だから、高校英語の点なんて全く当てにならないが。 ただまあ、学生なら、グダグダ言わずにやってみて、面白いと思えなければ向いてない、でいいと思うよ。 ただ、ド初心者なら、>>648の言うとおり、他言語の方がいいと思うが。
675:デフォルトの名無しさん
17/12/02 21:10:49.78 i2vG1ua/0.net
>>657
まあ、国語は暗記でも行けるかもだけど、読解系の問題は論理思考でいけばかなり楽できるんだぞ。
676:
17/12/02 21:23:09.14 4pmjT1Fk0.net
>>658
現国はあてもんだろう?
677:デフォルトの名無しさん
17/12/02 23:09:43.44 i2vG1ua/0.net
>>659
勉強しなくても、論理思考さえできれば、ほとんど正解できるってこと。
678:デフォルトの名無しさん
17/12/02 23:24:12.70 WQRORJsZ0.net
つかな、多分、解く過程が数学と同じなんだよ。
ただし数学自体ではないから、数学の成績自体はあまり関係ないけど、
数学めいたものが嫌いな場合には向いてない。
そして大体の場合は好き=得意科目になるから、
集団から選抜するのなら数学の試験を課すなり、面倒なら一律文系お断りってのも当たっている。
(もちろんプログラミング課題を課せるのであればそれが一番いいが)
よくある初心者向けのプログラミング課題、
・ソース○○に対して、出力△△を得たい、どうすればいいか、
に対して、実際は適切なメソッドや典型的な手法を組み合わせて対応するわけだろ。
これが、公式やお約束的解法を組み合わせて問題を解く「高校数学」と似てる。
そして実際のプログラミングなんて、
上記単発のお題が階層跨いでフラクタルになっているようなものだから、
ある意味数学パズルをずっと解き続けるようなもので、数学が嫌いだと持たんだろ。
ただし本来はその先の、
「こうすればこんなに簡単に実装できるのか」という構造を思いつける奴が「センスがある」となるわけだが、
これについては選抜の仕方(適正判断の仕方)は分からんなぁ。
ただ、いわゆる「エレガントな解法」というのが存在するのも数学だけだし、
プログラミングと数学はかなり構造が似ているのだと思うよ。
679:
17/12/03 00:12:42.31 lZQcP+Ql0.net
>>660
論理思考、最強!みたいな勢いだけれども、
その論理思考の中身というのが常識を外れているような気がする
命題A: 「1 + 1 = 3」 ならば「2 * 3 = 6」である
とするとき、命題Aは正しいか間違っているか、また、その理由は?
680:
17/12/03 00:14:06.99 lZQcP+Ql0.net
>>661
プログラミングは証明に似ているのには理解が及びますね。
ただ、普通の証明よりもずいぶんと細かいことに気をくばらないといけない気がします。
「型」を数学であつかっている例はありますか?
681:デフォルトの名無しさん
17/12/03 00:39:39.44 oCGWkppTM.net
>>646
マーチ文系の俺は現場に入るまで3週間
足引っ張らない程度になるまで3か月
無双するまで1年だったかな
3年たった今では Golomb 符号とたわむれてる
682:デフォルトの名無しさん
17/12/03 01:38:00.88 iOWX59aS0.net
>>663
証明問題じゃねえよ。つかおまえも数学出来なかった口だろ。
数Ⅱ数Ⅲはほぼパターン通りだけど、
数Ⅰの難しい問題はたいがい「エレガントな解法」ってのがあって、裏技
683:みたいに簡単に解けたりするんだよ。 それはそれこそ東大の過去問とか見てみればいい。 或いは三平方の定理とかでも何通りも証明方法があって、おおっ、てのもあったりするだろ。 (ただ、この話が通じない時点で説明しても無理なのは確定だが…) 実際のプログラミングもこれと同じで、データ構造を正しく整理すれば制御構造もものすごく単純に出来たりするんだよ。 だから数学的な「エレガントさ」を追求するのが好きじゃないと向いてない。(というか上達しない) そして「型」なんてのはノートに引いてある罫線みたいなもので、プログラミングの本質とは全く関係ない。 ただし型自体は圏論だっけ?Haskellの連中がやってたはずだけど。詳しくは知らんが。
684:デフォルトの名無しさん
17/12/03 01:39:55.00 iOWX59aS0.net
で、QZ、君は色々文句言われてたりしてるのを見たことがあるが、俺自身は知らんからそれはどうでもいい。
ただC++のスレで「色々忘れてしまうんで…」とか言い訳してたろ。
(別段それについて責めるわけではないが)それは覚え方が悪いんだよ。
例えば高校の物理、
・ma=Fとsin/cosだけ覚えて後は組み合わせるだけだが、 // (A)
・「垂直にぶら下げたケース」「斜面においたケース」「バネがくっついたケース」とか、// (B)
別々に覚えたがる奴はいるんだよ。それで、(A)が抽象思考(分類)できる奴、(B)が出来ない奴、となるんだよ。
そして、プログラミングで必要なのは(A)で、(B)は死ね、でしかないんだよ。
で、多分君は(B)派なんだよ。だから「忘れる」とかいうことになる。
(A)だったら忘れるも何もない。どの言語でも同じものを使っていて、
それを「ひらがな」「カタカナ」「英語」のどれで書くか、でしかないから。
685:デフォルトの名無しさん
17/12/03 01:40:39.01 iOWX59aS0.net
ただ自分が(A)なのか(B)なのかは簡単に分かるとして、(高校の物理に最初からついて行ければA、無理ならB)
これは思考の癖だから、簡単には直せないんだよ。だから向き不向きはかなりある。
単純に言えば、脳内のCPU/ストレージのコストによる。
いちいち圧縮/展開してでもストレージをケチりたい=CPUの速さに対して記憶が得意ではない場合は(A)、
いちいち展開するくらいならベタでストレージした方が楽=CPUのコストに対して記憶コストが安い場合は(B)になる。
そしてこれは無意識領域で作用するから、簡単には変えられない。
(A)の連中は最初から抽象思考する、というより抽象思考ベースだから、プログラミングにはフィットするけど、
例えば高校の歴史、「○○年に何がありました」という単発事象を別々に暗記するのには全く向かない。
逆に(B)の連中にはこれが向いているが、抽象思考するためにはいちいち「意識的に」圧縮/展開する必要があり、
ネイティブ(A)の連中にプログラミングでは太刀打ちできない。
それでも(B)の連中が得意な「記憶」でプログラミングに対処しようとした結果が「デザインパターン」だ。
だから(B)の連中はデザインパターンにすがるし、新しいパターンをどんどん登録しようとする。それが上達への道だから。
(A)の連中は最初から「デザインパターン?何それ?おいしいの?」だし、「名前つけただけだろ」程度でしかないんだよ。
で、QZ、君はデザインパターンにすがってるタイプだとC++スレで言ってたろ。
ここでも(B)だと分かるんだよ。
で、俺は、(B)の連中はわざわざプログラミングする意味無いと思ってるんだよね。向いてないから。
多分、その記憶コストの安さを生かした、何か別のことをすべきだよ。
パターン暗記で対応することも出来るけど、それだとコピペプログラマ程度にしかどうせなれないし。