19/05/05 20:16:09.59 3EWrT4Pn0.net
>>434
>性能上の無駄という意味ではないんだね?
性能の上で分析するとなると、間接参照にてデータをロード、ストアするコストと値をストアするコストを天秤にかける、ことになりますね
なるほど、その点を言いたくて、でも言いたくなくて、しつこく絡んでいたのですか…
私は二重ポインタでの表現の方がトータルでお得だ、とは思ってはいますが、これまで表に出ている私の発言は、あえてそこには踏み込まず(だって性能の話はうかつに断言できませんからね…)、
おっしゃるとおり「アルゴリズムの表現の上では不要なことをしている」に留まっています
451:はちみつ餃子
19/05/05 20:57:45.43 TxpPZKKr0.net
>>435
たとえば数学上の表記なら「A=1 であり B=1 のとき A=B は真である」と「1=1 は真である」には何も差が無い。
途中で名前を付けるのは人間に対する便宜であって、無駄な「操作」は存在しない。
代入が無駄たりうるのは C のパラダイムだからなので、
「C で表現するにはポインタが必要だし、代入では不適当だ」は事実であっても
「ポインタが無い言語では表現できない」というわけではないよ。
C の低級な世界でまともな意味論を表現しようとするのがそもそもの間違いだろう。
452:
19/05/05 21:02:18.49 3EWrT4Pn0.net
>>436
>「ポインタが無い言語では表現できない」というわけではないよ。
それは理解しています、なぜなら
Java での二分木の実装を検討したことがある(探せば2ch過去ログにあるかもしれません)
Java にはポインタはありませんが、実装できるかできないか、といえば「できる」の方に入りますね
453:はちみつ餃子
19/05/05 21:54:26.85 TxpPZKKr0.net
>>437
そこまでわかっているのなら、
「代入しない」と「同じ値を代入しなおす」が意味論的に等しいということがどうしてわからないんだ。
454:デフォルトの名無しさん
19/05/05 23:34:40.25 RXFRr1FQ0.net
C言語のプログラム内で確保していいメモリってユーザー空間の仮想メモリ上限いっぱいまで取っていいの?
複数の変数a, b, c, ・・・の値を表示するだけのプログラムを時系列に並べて考えてみるんだけど
0. 実行ファイルを起動する
1. 32bitプロセスが生成される ←たとえば32bit windowsだとユーザー空間とカーネル空間で計4GBの仮想メモリが確保される
2. int a; ←仮想メモリ(1で確保されたユーザー空間)上にaが確保される
int b; ←上に類似
int c; ←上に類似
・・・・・(複数の変数の宣言やprintf関数が続く)
こんな感じなんだろうけど
上記の2でユーザー空間いっぱいになるまで変数を宣言してもいいの?
455:はちみつ餃子
19/05/05 23:38:14.20 TxpPZKKr0.net
>>439
いいけど、もっと効率的な方法があるならそれに越したことは無いっていうそれだけの話
456:デフォルトの名無しさん
19/05/05 23:41:29.98 RXFRr1FQ0.net
簡潔に書くと
安全のためにはどこまでメモリを使っていいの?
そのメモリの大きさはユーザー空間の上限と同じなの?
という室問なのに長くなってしまた
457:デフォルトの名無しさん
19/05/05 23:47:50.76 RXFRr1FQ0.net
>>440
ありがとう
ただ初心者なので効率性を目指すにはきつい部分が出てくる
そうなるとメモリの残量を監視する、つまり残量の値を取得する必要があるわけだけど
これは一般的にはwindowsのAPIを使うのが普通なの?
(そんなものがあるのかは知らない)
458:デフォルトの名無しさん
19/05/05 23:52:54.47 RPhfdkos0.net
>>442
スタックとヒープという概念は知ってる?知らなければまずそれを調べてみて。
それと、初心者なら効率を求める前に正しくメモリ管理を扱えるようになる必要があるが、その時点で残量は気にする必要はないぞ。
459:デフォルトの名無しさん
19/05/05 23:59:16.82 RXFRr1FQ0.net
FIFOだとかナントカ程度にしか。
「~~領域」という幾つかの用語がOSとかの環境が違っても
全く共通のものなのかよく分からないから正直スルーしてる
460:デフォルトの名無しさん
19/05/06 05:38:27.60 wr9bFPpT0.net
>>414
>1億ノードの二分木にノードを追加する際、30個の無駄な代入が発生します
2^10 = 約1,000 千
2^20 = 約1,000,000 百万
2^30 = 約1,000,000,000 十億
>>441
Java VM の初期値は、256MB とか。
それよりも大きいと強制終了されるが、起動時に、512MBに設定できる
たぶん、4GB の仮想メモリでも、ユーザー空間3GB・カーネル空間1GBぐらいだろ
それ以上のデータは、動画みたいにstream になる。
バッファサイズ、例えば、1MB を読んでは捨てて、次の1MB読んでは捨てて、の繰り返し
読み込んだデータを使ったら、すぐに捨てないといけない。
ユーザー空間に、空きを作らないといけない
461:デフォルトの名無しさん
19/05/06 06:20:53.21 Geq8Gq1G0.net
>>445
いつものRubyバカだろ。いい加減な知識でC言語のメモリの話題に口を挟むのはやめろ。この板になれている者からすれば「またいつものか...」ですむが、初心者にとっては害悪でしかないから消えろ。
462:デフォルトの名無しさん
19/05/06 06:25:32.64 Geq8Gq1G0.net
>>444
組み込みとかの特殊な環境では例外もあるけど、基本的には環境によらずC言語で必須の概念だからスルーせずにちゃんと調べるべき。
463:デフォルトの名無しさん
19/05/06 08:39:59.60 s1ulBxFy0.net
>439
>上記の2でユーザー空間いっぱいになるまで変数を宣言してもいいの?
他のプロセスがスワップ起こして重くなるから止めろって言いたい。
464:デフォルトの名無しさん
19/05/06 10:14:49.95 Om5TJBQR0.net
>>447
うん調べてみるよ
ありがとう
>>448
そんな視点もあるのか
他のプロセスも考慮しないといけない
思ったよりも数段以上やっかいだな
465:デフォルトの名無しさん
19/05/06 10:19:59.43 Om5TJBQR0.net
>読み込んだデータを使ったら、すぐに捨てないといけない
データをガンガン読み込んでいくようなプログラムだと「使ったらすぐ捨てる」のが鉄則か
466:デフォルトの名無しさん
19/05/06 10:40:24.77 F7BEaxMm0.net
>>439
ユーザープロセスなのでカーネル空間はマッピングされないよ。プロセス管理のための領域はカーネル空間に多少は確保されるとは思うけど、それはユーザープロセス用ではないし。
ページサイズの関係で効率的に確保できるかどうかは別問題だけど仮想メモリ領域いっぱいまで取れるか否かと言えば取ることはできる。
実際にそんなことしたらスワップ発生しまくりでまともに動かないとは思うけど。
467:デフォルトの名無しさん
19/05/06 12:43:21.39 53K/0wkW0.net
実装としてはだいたいcopy on writeだから、確保だけだったら特に問題発生しないよ
468:デフォルトの名無しさん
19/05/06 16:08:26.90 95XsbNbMM.net
>>451
どのOSなのか明示してくれ。
少なくともlinux 32bitは3GB以降はkernel空間にマッピングされてるだろ
469:デフォルトの名無しさん
19/05/06 21:20:46.06 lSipB+Y80.net
配列にある16進数アスキーを
整数型変数に数値として入れたいのですが、上手くいきません。
valの値をprintfで出力しても「0」になります。
rbuf[5]の中身は「0xDC」
rbuf[6]の中身は「0x18」でした。(printfで出力してみたところ。)
#include <stdio.h>
unsigned char sbuf[255] = {'\0'}; //送信バッファ
unsigned char rbuf[255] = {'\0'}; //受信バッファ
unsigned char work[10] = {'\0'}; //ワークバッファ
unsigned int val = 0; //値
work[0]=rbuf[5];
work[1]=rbuf[6];
work[2]='\0';
sscanf((char *)work, "%x", &val);
よろしくお願いします。
470:デフォルトの名無しさん
19/05/06 21:29:36.69 v87Zm/5a0.net
sscanf の %x は、文字列で記述された数字+アルファベットの列を 16進数として抜き出す
sscanf("10", "%x", &val); → val の値は 10進で16 となる
0xDC 0x18 の並びから どういう整数値にしたいんだろうか?
471:454
19/05/06 21:38:34.55 lSipB+Y80.net
>>455
回答ありがとうございます。
val=0xDC18
という感じで取り出したいです。
472:デフォルトの名無しさん
19/05/06 21:40:18.62 v87Zm/5a0.net
>>456 それなら
val = rbuf[5]; じゃあかんの?
473:454
19/05/06 21:50:08.40 lSipB+Y80.net
>>457
ありがとうございます。そういうことか・・・
下記で上手くできました!
val= rbuf[5];
val = val << 8;
val |= rbuf[6];
474:デフォルトの名無しさん
19/05/06 21:54:12.13 v87Zm/5a0.net
>>458 解決してよかったね
0xDC 0x18 の並びから
(最低でも32bit長の整数)0xDC18 が欲しかったということだね
475:デフォルトの名無しさん
19/05/06 21:55:43.20 v87Zm/5a0.net
(俺がちゃんと >>456 を読めてなかった説 val=0xDC18 って書いてるやんけw)
476:デフォルトの名無しさん
19/05/06 22:06:19.06 NYoOX9LAa.net
>>454
> rbuf[5]の中身は「0xDC」
> rbuf[6]の中身は「0x18」でした。(printfで出力してみたところ。)
だったらそれはASCIIではないよね。
477:デフォルトの名無しさん
19/05/06 22:08:02.81 NYoOX9LAa.net
などと、ゆっくり書いていたら既に解決か・・・
478:デフォルトの名無しさん
19/05/06 22:09:16.82 lSipB+Y80.net
>>460
>>461
ありがとうございます。
お陰様で解決できました。
勝手にASCII、文字列と勘違いしていたのがよくなかったです。
479:デフォルトの名無しさん
19/05/07 06:48:35.98 /Z9tG+PY0.net
ASCII は、7 bit キャラだろ
欧州文字コードなら、8 bitとか
480:デフォルトの名無しさん
19/05/07 15:31:36.79 gGAOuhJk0.net
BASIC時代 文字→文字コード変換関数が ASC(文字) だったな。
481:デフォルトの名無しさん
19/05/08 20:11:19.53 w7dyIR3e0.net
逆はCHR$(コード)だったな。
482:デフォルトの名無しさん
19/05/08 22:02:13.36 LqpjdKM80.net
「なんで朝潮?」と思ってしまった当時の俺w
483:デフォルトの名無しさん
19/05/09 08:32:10.12 IVg2TokP0.net
わらってよりとも というのは、当時の人気番組名をもじったものだよ
484:デフォルトの名無しさん
19/05/09 12:40:11.38 J26JobOx0.net
URLリンク(ae01.alicdn.com)
485:デフォルトの名無しさん
19/05/09 20:40:23.75 axmpki24M.net
「はじめてのC」なら買う
486:デフォルトの名無しさん
19/05/09 22:18:17.14 fgRKvhjn0.net
その本の名前、買うときに恥ずかしいw
487:デフォルトの名無しさん
19/05/09 23:03:35.49 vEdVh+9n0.net
質問です
文字列の配列
char matrix[Y][X]を関数に引数として渡して、渡した先の関数でtxtファイルに出力したい。
YとXはその時々によって違う値でmatrixは文字列の配列だけど1行ごとに'\0'が入っていないとき、渡した先の関数でYとXをどうやれば参照できますか?
例えば
matrix = {{‘a’, ‘b’, ‘c’}, {‘d’, ‘e’, ‘f’}};
みたいな配列です
488:デフォルトの名無しさん
19/05/10 00:00:40.06 IBOrEgMWa.net
X(配列のサイズ)を共有してやればいいんじゃないかな
489:デフォルトの名無しさん
19/05/10 00:14:05.05 Ojl9YgLP0.net
>>472
matrixのアドレスと共にX、Yの値を渡さないと無理
490:デフォルトの名無しさん
19/05/10 03:11:16.60 +vHN15fT0.net
>>472
URLリンク(qiita.com)
491:デフォルトの名無しさん
19/05/10 09:26:09.21 bwAvNWKg0.net
>>474
やっぱり配列のサイズ一緒に渡さないとだためですか
492:デフォルトの名無しさん
19/05/10 09:44:04.32 0Zlxa6bHa.net
そう。他の言語だと裏でこっそり渡すようになっていたりしてプログラムに書かなくても動くかも知れないが、Cはそこまでやってくれない。
493:デフォルトの名無しさん
19/05/10 10:05:05.80 hw8N8wYC0.net
標準関数も一次元配列ですら大きさを渡してるからねー
(文字列は '\0' が終端である という了解を持って大きさを不要にしているだけ)
494:デフォルトの名無しさん
19/05/10 12:34:03.34 zZfQYrbwd.net
>>475
URL張って解党した気になってるアスペルガーのカスがスレ来んな
495:デフォルトの名無しさん
19/05/10 23:50:49.39 svzEPJh90.net
え?読んでもわからなかったの?
496:デフォルトの名無しさん
19/05/11 07:43:24.28 glRpLuyC0.net
確かにつまらんね
リンクだけとかググレカスとか
せっかく掲示板にいるのに対話がないのは
497:はちみつ餃子
19/05/11 09:55:06.58 GtXmrqj00.net
>>481
リンクを示すのも、ググればわかるようなことにググれというのも対話だよ。
対話を終わらせてるのはお前だろ。
リンク先を見て意味がわからんかったならどうわからなかったか、
よりよい説明があると思うならそれを示してもいい。
望むことだけ欲しいというのは対話とは言えんよ。
498:デフォルトの名無しさん
19/05/11 10:34:34.75 glRpLuyC0.net
>>482
話が噛み合ってない
おまえさんとは平行線のようだな
499:デフォルトの名無しさん
19/05/11 11:46:55.45 0ygzdBDA0.net
ID:glRpLuyC0が対話する気なさすぎて草w
500:デフォルトの名無しさん
19/05/11 12:23:55.76 9iCvmH6s0.net
ここは質疑を行うスレであって
対話したり、雑談したりする場ではない
501:デフォルトの名無しさん
19/05/11 19:10:51.09 HOBfdmGr0.net
Cの上位互換(?)として、C++がありますが。C++は覚えた方がいいですか?
もしくは、CとC++を両方覚えたら、Cは不要になり、C++でコードを書くようになりますか?
C++でできることはCでもできるように見えますので、ならCだけでいいようにも思えたり。
502:
19/05/11 19:18:54.28 KtHZQgR00.net
>>486
C++ は最近規格の改定がすすみ、いろんなことが C++ の枠内でできるようになりました
503:デフォルトの名無しさん
19/05/11 19:21:03.92 2v2BzL6t0.net
>>486
言っておくが、python,C++,Java,javascript,C#,shellでできる事はC言語でも出来る
更に君が作ろうとしてるものや、やりたいことは、もう誰かが作ってる
ましてや大規模になると、googleとかamazonと戦う羽目にもなる
それが嫌ならプログラミングなんて辞めとけ
504:デフォルトの名無しさん
19/05/11 19:32:35.19 HOBfdmGr0.net
>>487-488
了解です、ありがとうございます
505:デフォルトの名無しさん
19/05/11 21:07:19.81 glRpLuyC0.net
>>484-485
482は反対意見を述べているという意味でまだいいところがあったが
てめーらは一方的な押しつけしか頭にない100%真のノイズだ
506:はちみつ餃子
19/05/11 21:28:03.11 GtXmrqj00.net
>>490
既に解説があると示すのも質問に対する回答として十分だし、それで不満な理由がまるでわからん。
それが対話でないと断言するのも意味がわからん。
結局のところどうして欲しいの?
507:デフォルトの名無しさん
19/05/11 22:15:36.12 YLmnNEXIa.net
きっと寂しいんだよ。
508:デフォルトの名無しさん
19/05/11 22:49:22.08 glRpLuyC0.net
>>491
意味がわからんからどうした?
平行線の相手に何か言って欲しいのか?
509:はちみつ餃子
19/05/12 10:19:15.38 l86zXz3/0.net
>>493
そう決めつけて続きを拒むなら「一方的な押し付けしか頭にない」「対話がない」というまさにそれでしかなくね?
意味がわからんから解説してくれっての。
わからんことを理解する必要があるから対話になるんだろ。
510:デフォルトの名無しさん
19/05/12 11:22:06.40 VeGHf8Lz0.net
>>494
自分の言葉で何か言えよと思う俺の意見を
おまえ真っ向から全否定しただろ
だから接点がないと判断したんだ
接点があるなら最初の態度を撤回しろ
話はそれからだ
511:デフォルトの名無しさん
19/05/12 11:57:36.56 7nn+3/Jt0.net
>>495
意見を全否定って、そりゃ異なる意見があるのは当然だろう。異なる考えなら議論にならないなんて、議論する気が無いだけだろう。
ついでだが、俺もお前さんの意見には反対だ。自分の言葉で書くかはまったく重要ではないと思う。お手軽に書ける掲示板のレスは言葉足らずだったり不正確な表現なことも多々あるが、それよりきちんと纏まった情報をリンクされた方がありがたいことも多い。
512:デフォルトの名無しさん
19/05/12 12:19:14.09 VeGHf8Lz0.net
>>496
意見が異なるのと全否定は違うぞ
自分はこう思うと述べるのと
おまえは間違っているというのの違いだ
よくいるんだよ、どっかからの受け売りを壊れたレコードみたいに繰り返すだけなやつとか
俺は自分の知見からは何も出てこないのかよと思うことがあるが
おまえはそれで満足なら勝手に満足してろよ
そこが俺とおまえの違いだな
513:デフォルトの名無しさん
19/05/12 15:34:15.26 SbCKIsfP0.net
質問です
テキストファイルから文字を1文字ずつ読み込んでchar型の2次元配列matrixに入れていきたい。
この時改行は配列に入れたくないときどうすれば良いですか?
うまくいかないコード
for (i=0;i<10;i++) {
for (j=0;j<10;j++) {
if (fgetc(fp) == ‘\n’) {
continue;
}
matrix[i][j] = fgetc(fp);
}
}
テキストファイルは行数と列数があらかじめ分かってるとして
例えば
AAAAAAAAAA
BBBBBBBBBB
…
のようなファイルです
514:デフォルトの名無しさん
19/05/12 15:51:11.62 L7lYUohVa.net
fgetc二回呼びたいの?
515:デフォルトの名無しさん
19/05/12 16:10:46.32 7kDDqNbD0.net
>>498
continueだと内ループ先頭に戻るから違うんじゃないの
516:デフォルトの名無しさん
19/05/12 16:24:47.11 R31sKZyy0.net
>>498
.for ... {
. for ... {
. char c = fgetc(fp);
. if (c != '\r' && c != '\n') {
. m
517:atrix[i][j] = c; . } . } .}
518:デフォルトの名無しさん
19/05/12 17:12:05.74 SbCKIsfP0.net
>>499
呼ばなくていいです
>>501
これでもうまくいかないです
519:経団連
19/05/12 17:22:08.08 uLUIsoqa0.net
for (i=0;i<10;i++) {
for (j=0;j<10;j++) {
matrix[i][j] = fgetc(fp);
}
fgetc(fp); //読み捨て
}
520:デフォルトの名無しさん
19/05/12 17:29:14.22 CrklWm7I0.net
変な例出すなよ…
521:デフォルトの名無しさん
19/05/12 17:29:29.19 gzai7Rgq0.net
サイズが固定なら fread でよくない?
そうすべきというほどのものでもないだろうが。
522:デフォルトの名無しさん
19/05/12 17:35:10.27 x4ccFx6b0.net
>>498
「うまくいかない」症状を見れば、もう少し見当がつくんだけど…。
格納先の配列を char matrix[LINES][CHRS]; とか定義して、
printf("%s\n", matrix[n]); で表示してるの違うかな。
各行の文字列の末尾にあるべき '\0' が格納されてない、みたいな。
523:デフォルトの名無しさん
19/05/12 17:36:33.22 JjryTeWM0.net
2重ループやめても良いか?
while (1) {
int c = fgetc(fp);
if (c == EOF) {
break;
}
if (c == '\n') {
continue;
}
matrix[i][j] = c;
j++;
if (j == 10) {
i++; j = 0;
}
}
524:デフォルトの名無しさん
19/05/12 17:38:28.80 JjryTeWM0.net
501の方法だと'\n'読んだ時に、スキップしているけど
ループ変数の方は ++1 してるからズレてくる
525:デフォルトの名無しさん
19/05/12 18:35:08.99 SbCKIsfP0.net
>>503
>>507
どちらも行けました
507のは理解できるんですが
503の読み捨てというのはどう言うことなのでしょうか
526:デフォルトの名無しさん
19/05/12 18:43:30.54 JjryTeWM0.net
>>509
10個読んで1個捨てる
527:デフォルトの名無しさん
19/05/13 20:38:42.19 WOFscy660.net
バッファにつめるところを簡単にしてみた。
URLリンク(ideone.com)
528:デフォルトの名無しさん
19/05/14 06:41:01.67 7SLYc+Rqr.net
OSSで構造体を公開しようとおもってる
そのサイズをバージョンアップしても固定にしたいんだけどいいアイデアないかな?
struct foo {
int a;
double b; // ここをバージョンアップで追加
}
char[100] buffer;
上記を予め含めておいて、追加サイズ分だけ減らすってのがよくある手段だと思うけど、intや他の型が固定サイズの保証はないから、処理系をかんがえると使えない
パディングでサイズも変わっちゃうしね
C++ならテンプレートでいけるけど、OSSだから利用者が多いC言語で書いておく必要がある
構造体を公開しないで、ハンドラとセッタで扱えばいけるだろうけど、今回は構造体でいきたい
529:デフォルトの名無しさん
19/05/14 08:01:00.18 YNmKUGxB0.net
「sizeof(int)が環境依存」を前提にするなら
バージョンアップ以前のint a;だけでもう既にサイズ固定じゃないじゃん
int32_tですら必ずある保証はないよ
「汎用な記述で全ての環境に対応したい」ってのが、土台無理な注文なのよ
低レベルなことやるなら、サポートする環境を列挙限定しなければならない
素直に「よくある手段」でやりなさいってことだ
530:デフォルトの名無しさん
19/05/14 08:07:10.74 0o/9QF7Tx.net
>>512
処理系によるパディングとかの問題を別にしたら、bufferをunionにしといたらわざわざ減らさなくても良いのでは?
531:デフォルトの名無しさん
19/05/14 08:25:38.55 7SLYc+Rqr.net
>>513
たしかにint aですでに違うね
ただ今回考えてるのは、コンパイルせずに共有ライブラリを差し替えるって状況を想定してる
そのときにセグメンテーションフォールトがでないようにしたい
だから、すべての処理系で同じサイズにしたいってわけじゃなくて、同じ処理系の中ではバージョンにかかわらずサイズを保ちたいってことなんだよね
説明不足ですまん
532:デフォルトの名無しさん
19/05/14 08:36:30.40 2RiYyx1fa.net
あらゆる環境だったらシリアライズしないとだし。
同じ処理系だったら同じ構造体でいいだろうし。
533:デフォルトの名無しさん
19/05/14 13:41:09.36 d9/Wmgv60.net
>>514 のはこんな感じですかの
union foo {
struct {
int a;
double b; // ここをバージョンアップで追加
};
char dummyBuffer[100];
};
534:デフォルトの名無しさん
19/05/14 13:59:44.65 d9/Wmgv60.net
構造体の大きさが char[100] に収まってる範囲での話
>>512 のように末尾に用意したギャップを引き算していくにしても、引ききれなくなった段階で破綻するよね
※ 突破したことをチェックするには sizoef(union foo) と sizeof(char[100]) とを比較すんのかなぁ…
535:経団連
19/05/14 14:09:24.00 4po1tQ0w0.net
C99 <stdint.h>のuint*_t型を使った方がいいと思う。
536:デフォルトの名無しさん
19/05/14 14:39:04.31 2RiYyx1fa.net
普通符号付きでしょ
537:デフォルトの名無しさん
19/05/14 14:51:20.14 5nOlmwWa0.net
符号プログラミングか
538:デフォルトの名無しさん
19/05/14 15:42:40.54 2RiYyx1fa.net
今はstatic_assertとかいうものがあるらしいぞ
これでコンパイル時にチェックすればよい
539:デフォルトの名無しさん
19/05/14 21:12:50.85 8soz04JH0.net
>>512
不格好だけどこれでいけるよ
全部プリプロセッサで処理できて、構造体サイズは100バイト固定になる。
予想を超えてサイズを突き破った場合は別構造体作るしかないね。
#include <stddef.h>
struct inner_foo {
int a;
char buf[];
};
#define MAX_STRUCT_SIZE 100
#define BUF_SIZE (MAX_STRUCT_SIZE - offsetof(struct inner_foo, buf))
struct foo {
int a;
double b;
char buf[BUF_SIZE];
};
540:デフォルトの名無しさん
19/05/15 07:47:15.99 FPbZusNo0.net
>>523 ちょっと間違ってるみたい。
struct foo には struct inner_foo に double b; が追加されてるせいで
sizeof(struct foo) == MAX_STRUCT_SIZE にならない。
sizeof(struct foo) == MAX_STRUCT_SIZE + sizeof(double) になっちゃう。
inner_foo と foo とで char buf[] より前のメンバを一致させる必要がある。
541:デフォルトの名無しさん
19/05/15 08:35:12.84 0TljqresM.net
>>515
なんでサイズが違うとセグメンテーションフォールトになるのかよくわからんが…
Win32APIみたいに頭にサイズ入れときゃいいんじゃね?
542:デフォルトの名無しさん
19/05/15 08:56:22.39 nK0I7Knm0.net
データファイルの話なら分かるが、intのサイズが違う環境の共有ライブラリってそもそも使えるのか?
543:デフォルトの名無しさん
19/05/15 09:12:43.64 e9I3VVqQa.net
コンパイルは自分でしろって話だと思うよ。
そうすると単にメモリ配置を意識した�
544:vログラムだな。 当然、バイトオーダーも気にしろよっていう話に
545:デフォルトの名無しさん
19/05/15 09:32:21.44 k0yjAgrYa.net
やっぱ int32_t みたいな環境に関係なく同じビット数になるやつにしといた方が良いんじゃないかな。
546:デフォルトの名無しさん
19/05/15 09:45:02.94 25auY+1H0.net
515の
>ただ今回考えてるのは、コンパイルせずに共有ライブラリを差し替えるって状況を想定してる
>そのときにセグメンテーションフォールトがでないようにしたい
構造体のパラメータを追加し共有ライブラリを差し替えつつ
呼び出し側のコンパイルは行わないって無理ないか?
旧ソースで追加されたパラメータ部分は不定値であって
その不定値をうけて共有ライブラリ内部が正しく動作できるとは思えないが…
547:デフォルトの名無しさん
19/05/15 11:40:27.07 AfKgri370.net
構造体には、サイズの変わらない、ポインタだけを置いておいて、
実際の領域は、ライブラリ内で確保して使って、解放すれば?
548:デフォルトの名無しさん
19/05/15 12:19:01.09 e9I3VVqQa.net
さすがに実体を共有するという目的がないとこういう発想にはならんでしょ。
共有メモリとか、ファイルとか、通信とか。
549:デフォルトの名無しさん
19/05/15 12:31:29.02 dMKqDPXvr.net
>>529
呼び出す側がバージョン情報をもっておいて、処理側で振り分けてアクセスしないようにすれば問題ないね
#define version 2
void func (const struct* foo) {
func_impl(foo, version);
}
void func_impl(const struct* foo, int version) {
if (version > 1) {
foo.b;
}
}
550:デフォルトの名無しさん
19/05/15 12:43:05.74 25auY+1H0.net
>>532
そのバージョン情報の数字を埋め込むのに一番適度なのは実構造体のサイズって話に(>>525)
>>531 のような背景なら
ペイロードサイズは触りたくない ってのは納得できるな
バージョン違いの吸収法は別途必要だけど
551:デフォルトの名無しさん
19/05/15 12:53:24.07 k0yjAgrYa.net
構造体の中身を公開しないでポインタだけ使わせて読み書きする関数を別途用意するって方法もあると思う。オブジェクト指向の言語でのプロパティのようなものね。
内容のファイルへの読み書きやネットワークでのやり取りはそれようにデータをpack、unpackする処理を作ってそこにバージョン番号も埋め込む。
552:デフォルトの名無しさん
19/05/15 12:59:51.65 Wbf0zcGJ0.net
exeがnew(malloc)するけど中をいじるのは全てdllの関数ってのはままある
dllだけ差し替えで済ましたい、サイズが変わらなければexeはビルドし直さなくていいのに…
ってことだろう
>512の
>intや他の型が固定サイズの保証はないから、処理系をかんがえると使えない
>パディングでサイズも変わっちゃうしね
は全く関係ない話だったということだ
素直に「よくある手段」でやればいい
>514,517のunionもいいと思うけど
foo.aでアクセスできないよね?foo.body.aとかしないと
553:デフォルトの名無しさん
19/05/15 13:12:20.84 25auY+1H0.net
>>517 の foo.a でいきなりアクセスできる union が記述できるのは C11 からみたい
無名構造体/無名共用体
554:デフォルトの名無しさん
19/05/15 14:41:00.06 dMKqDPXvr.net
>>535
intが4バイトなんて保証はないから、char[] bufの大きさを決められないって話でしょ?
intメンバを追加したとして、bufのサイズはどれだけ減らせばいいのかわからないのが問題
4の環境が多いだろけど、2の環境だと2を減らさなきゃいけないわけで
dll差し替えで再ビルドしない場合、構造体サイズが変わると特に配列渡しの場合はセグメンテーションフォールトになる可能性が高くて危険
セーブデータみたいに構造体をそのままファイルに落とすとしても、サイズはずっと不変なのが扱いやすいね
555:デフォルトの名無しさん
19/05/15 14:56:07.34 e9I3VVqQa.net
数字付かないintのでかい方に合わせるなら、それこそunion使って明示的にオフセット決めるとか。
本当にそんなことしたいのか?という話は置いといて。
もちろんint32_tとかint_least32_t使う方がいいし、本当に位置合わせするならバイト位置指定して読み書きするし、そもそもサイズ固定�
556:ケずにシリアライズ用のライブラリ使うのが正しいよ。
557:デフォルトの名無しさん
19/05/15 19:35:47.81 0TljqresM.net
>>537
> intが4バイトなんて保証はないから、char[] bufの大きさを決められないって話でしょ?
そんな話はとっくに終わっとる
>>515をちゃんと読めよ
558:デフォルトの名無しさん
19/05/15 20:46:54.27 Wbf0zcGJ0.net
>>536
ほう知らんかった
なら>517でほぼデメリットないね
>>537
「その環境」でのintのサイズはsizeof(int)でおk
559:デフォルトの名無しさん
19/05/15 21:55:29.06 ZaVTFrP70.net
win32apiはバージョンによって構造体の変数が追加になるから構造体のサイズを構造体の先頭にセットする
560:デフォルトの名無しさん
19/05/16 08:13:26.18 eEplP63Q0.net
windows.hのsmallで一時間潰した
561:デフォルトの名無しさん
19/05/16 19:38:59.34 GXqxfUU20.net
文字配列列sを逆順に文字配列tに格納して出力したいのですが、
以下のコードでは実行してもt=[]と出力されてしまいます
#include <stdio.h>
#define MAXLINE 1000
main()
{
char s[MAXLINE],t[MAXLINE];
int c,i,I;
for(i=0; i<MAXLINE-1 && (c=getchar())!=EOF && c!='¥n'; ++i)
{
s[i]=c;
}
if(c=='¥n'){
s[i]=c;
++i;
}
s[i]='\0';
I=i;
for(i=i; 0<=i; i=i-1)
{
t[I-i]=s[i];
}
printf("t=[%s]",t);
}
どこがおかしいのでしょうか…
562:デフォルトの名無しさん
19/05/16 19:48:10.73 q0J7kB7g0.net
後のループの一発目は
s[i]='\0';
I=i;
/* ここのforを削って */
t[I-i]=s[i];
こういうことになるから
t[0] = s[i] ってことになって t[0] = '\0'; をやってることになる
上記のは
1 2 3 4 \0 → \0 4 3 2 1 のコード
実装すべきなのは
1 2 3 4 \0 → 4 3 2 1 \0 となるコード
563:デフォルトの名無しさん
19/05/16 20:27:22.18 m1+/MMjMa.net
惜しいねえ。綺麗に逆に入ってはいるんだよな。
564:デフォルトの名無しさん
19/05/16 20:38:11.53 GXqxfUU20.net
おっしゃる通りでした…今度は上手くいきました
ありがとうございます
565:デフォルトの名無しさん
19/05/16 20:38:46.73 GXqxfUU20.net
おっしゃる通りでした…今度は上手くいきました
ありがとうございます
566:デフォルトの名無しさん
19/05/16 21:09:34.65 q0J7kB7g0.net
自己解決できたようでなにより
整数の配列を逆に整列させるなら正解だったんだけどねー
「文字列」操作の落とし穴ですな
567:デフォルトの名無しさん
19/05/18 22:03:40.11 e0Mh58zT0.net
今C言語教室でSQLとGUIやってる初心者なんだがCでDB弄る仕事ってあるのか
JavaとかC#に取られそうだけど
568:デフォルトの名無しさん
19/05/18 22:06:44.17 8rj7/ih6a.net
sqliteは使うよ
569:
19/05/18 22:07:47.63 Pqc0+ZP00.net
>>549
ODBC 経由ならできますが…昔、ハンドルのキャストをとちったミスを、その意味不明の動きから突き止めるのは大変でした
ODBC を直書きする情報はネットにほとんどありませんね
570:デフォルトの名無しさん
19/05/18 22:19:48.67 e0Mh58zT0.net
SQL使うのか慣れてないからあんまやりたくないんだよなあ
頑張るか
571:デフォルトの名無しさん
19/05/18 22:37:47.44 D3aJPSyb0.net
>>549
C++ならまだしもC言語でGUI?
どこの教室だよ…
572:デフォルトの名無しさん
19/05/18 22:53:12.41 RWbfx4gX0.net
むかーし、Pro*C って使った事がある
Cのソース内にSQLを埋め込み
プリコンパイルする感じ
今は流行らないかもしれない
573:デフォルトの名無しさん
19/05/18 22:58:45.45 8rj7/ih6a.net
SQL使いこなしてる人ってすごいけど、正直ああはなりたくないという感じだよな。
574:デフォルトの名無しさん
19/05/18 23:01:53.11 RWbfx4gX0.net
賢いファイルシステムとして利用すると超便利だぞ
575:デフォルトの名無しさん
19/05/18 23:02:38.45 RWbfx4gX0.net
同じ事をCのロジックで組むとなると、アタマおかしくなるかも
576:デフォルトの名無しさん
19/05/18 23:08:58.89 Y/SMFmS40.net
普通にアプリケーションの規模が大きくなるとsql使いたくなるだろ
そういう場合はsqlite使う
577:デフォルトの名無しさん
19/05/18 23:10:30.33 RWbfx4gX0.net
5ちゃんねる専用ブラウザもsqlite使っているそうですね?
プログラムコードはCではないですが
578:デフォルトの名無しさん
19/05/19 10:01:29.20 EV8D9m9A0.net
IoTのデバイス開発やってるけど、C言語でDBのクライアントライブラリ使ってるよ
579:デフォルトの名無しさん
19/05/19 16:30:57.06 b6d7Y/CF0.net
リーナスさんはC++嫌いつーてるしな
トレードマークのfuck口調で
580:デフォルトの名無しさん
19/05/19 17:49:51.40 V/GPYpFPa.net
この頃は間に何かライブラリ挟んでDB変わってもSQL文がほぼ同じままで行けるようなのが流行りなのでは?
581:デフォルトの名無しさん
19/05/19 19:08:51.80 SqCxdnVY0.net
大学の情報科の人たちってどのレベルでC言語使えるんですかね?
Cに限ったことではないですが大学4年でどの程度の練度が身につくのか
582:デフォルトの名無しさん
19/05/19 19:17:39.10 Ic55MIMX0.net
人によるだろ
そもそも好きなやつは大学入る前からやってるからな
583:デフォルトの名無しさん
19/05/19 19:22:28.74 qBoKnLB7a.net
>>563
別に使えなくてもいいよ
584:デフォルトの名無しさん
19/05/19 21:05:03.54 b6d7Y/CF0.net
>>565
おまえは情報科に来るなってだけ
やる気ねえやつが畑違いな学部に入ること自体が害悪だ
585:デフォルトの名無しさん
19/05/19 21:14:52.17 Y3pJ4vrOa.net
>>566
お前が入ったの専門学校だろ?
586:デフォルトの名無しさん
19/05/19 21:19:32.43 b6d7Y/CF0.net
>>567
化学科だけど
587:デフォルトの名無しさん
19/05/19 21:24:37.32 RJz4Ejb00.net
学校だとアルゴリズムやシステム設計手法は学べるだろうが
練度が上がるのはやはり仕事を始めてからだと思う
588:デフォルトの名無しさん
19/05/20 12:44:26.31 PSRVLRmYr.net
コンピュータサイカヨウの基本は一通りやるんじゃない?
情報処理試験の基本レベルくらいのもの
初心者は実務にはそのままは使えないけど、中級以上のエンジニアならこのあたりの知識があると差がついてくるね
589:デフォルトの名無しさん
19/05/20 14:12:04.87 0d3wAWyu0.net
業務のほとんどは手作業の自動化だから差は出ない。そしてみんなリストラされる。
590:デフォルトの名無しさん
19/05/20 18:18:34.53 IJBxlZ980.net
仕事で出会った、いろいろな人を思い出すに、ガチに使える人材って凄いからなあ。
学校や仕事を通じて学ぶ、みたいな次元じゃないんだよねえ。
591:デフォルトの名無しさん
19/05/20 19:49:19.18 Nbm/sW0Oa.net
おまえが使ってるんだったらおまえが偉いよ
592:デフォルトの名無しさん
19/05/21 00:42:18.33 jVHVO/YL0.net
setbuf関数っていつなんの為に使うんや?
バッファリングのためにあるのはわかるけどそもそもバッファリングがなんの為にあるのかわからん
593:デフォルトの名無しさん
19/05/21 00:44:38.83 Hcv2vO/e0.net
ちまちま出力するより溜めてからまとめて出力した方が高速
594:デフォルトの名無しさん
19/05/21 01:29:10.75 jVHVO/YL0.net
1万文字くらいのテキストファイルを標準出力でやってみたけど変わった気しなかったぞ
もしかして数百万文字レベルの巨大ファイルだと劇的に変わるんか?
595:デフォルトの名無しさん
19/05/21 01:34:19.46 XM845/F70.net
10kbって小さくね
596:デフォルトの名無しさん
19/05/21 01:46:59.05 +xvLcOVEa.net
というか普通はバッファリングする関数ばっかりだが、自前でバッファ用意したいときもあるって話。
基本変わらんよたぶん。
597:デフォルトの名無しさん
19/05/21 01:47:43.41 jVHVO/YL0.net
確かに少ないな
と思ったんで2,700kbでやってみたらむしろ4秒長くなったぞ
598:デフォルトの名無しさん
19/05/21 02:21:13.21 Y+BS98b80.net
>>574
FILE * 経由で出力する printf() 等は内部でバッファリングしていてバッファがいっぱいになったらまとめて出力する(出力先が端末の場合は行単位で出力する)。
そのバッファを自分で指定した領域を使わせるか、またはなしにできるのが setbuf()。更に自由に大きさやモードも指定したいなら setvbuf() を使う。
バッファリングに関して考慮しなくても良い入出力をする場合は read(), write() で行う。この場合は全くバッファリングされないので少ないバイト数の入出力が多いと遅くなる。
それと printf() のようなフォーマットを考慮した出力はないので必要なら自作する。
599:デフォルトの名無しさん
19/05/21 02:26:07.71 Y+BS98b80.net
>>576
open()してwrite()で1バイトづつ書くのとまとめて書くのとではバイト数によっては大幅に違いが出ると思う。環境依存ではあるが。
600:デフォルトの名無しさん
19/05/21 03:47:59.45 jVHVO/YL0.net
>>581
大きなファイルの入出力を高速化したい時はsetbuf(fp,buf)
バッファリング無しにしてバッファをフラッシュするタイミングを順番に逐一実行させたい時はsetbuf(fp,NULL)
みたいな感じでええんかな?
601:デフォルトの名無しさん
19/05/21 03:58:34.93 Y+BS98b80.net
>>582
setvbuf()で自分でバッファの大きさ決めてしまった方が良いかも。
602:デフォルトの名無しさん
19/05/21 04:24:32.31 zmxtmgNI0.net
既出かもしれませんがconstがjavaのfinalと違うと知りました。どう違うのでしょうか?c初心者です
603:デフォルトの名無しさん
19/05/21 05:39:22.97 SRv5ILQj0.net
>>576
OSによってはHDDへ遅延書き込みするから、結局バッファしてるのと大して変わらなかったりする。
604:デフォルトの名無しさん
19/05/21 06:44:08.98 UPiNM42a0.net
>>584
20年前くらいの知識で、しかも完全に理解してるわけではないので、間違っていたらゴメンだけど。
変数について言えば、Java の final 変数は、値が未定義かどうか、という情報を内部的に持っていて。
もし、変数の値が未定義の場合は、1回だけ代入できたはず。例えば
final int i;
System.out.println("test");
i=4;
System.out.println(i);
i=5;
System.out.println(i);
の場合、1回目の代入(i=4)は許されるけど、2回目の代入(i=5)は怒られる。
それに対して、(C89の頃のだけど)Cのconst変数は・・・
const int i;
printf("test\n");
i=0;
printf("%d\n",i);
1回目の代入(i=0)であっても怒られる。
みたいな感じの違いはあったような。最近のCやJavaは知らないんだけどね。
あまり自信がないので、詳しい方のレスを待ちましょう。
605:デフォルトの名無しさん
19/05/21 06:49:56.40 tdstqwiHM.net
>>585
そっちもあるけどAPI呼出し回数の削減もあるから
606:デフォルトの名無しさん
19/05/21 07:08:29.24 6muVxYSDr.net
>>585
今どきのディスクならほぼ遅延書き込みしてるといってもいいね
バッファには二段階あって、
①プロセスが持ってるバッファ
②OSが持ってるバッファ
flush関係のライブラリ関数やシステムコールは①を②に吐き出す
②を吐き出すにはLinuxだとfsyncもしくはfdatasync
607:デフォルトの名無しさん
19/05/21 09:19:53.31 BVi2WQ22a.net
>>584
Cはポインタの指す先が const という指定ができるがJavaは配列の要素まで final にする指定ができなかったと思う。
つまり配列やクラスそのもののインスタンスへの参照は final にてきる。しかし参照される中身までは final にできず書き換え可能(クラスの場合はpublicのクラス変数とか、外部から書き換えられるようになっていれ
608:ば書き換えられる)。 ま、ちょっと試してみな。
609:デフォルトの名無しさん
19/05/21 10:05:33.15 DLRGb2lZ0.net
LTOのオプション
を使ってコンパイルすれば
インライン関数をヘッ
ダーに書かなくても
勝手にインライン化できるものはインラ
イン化してくれる
という理解で
あってますか?
610:デフォルトの名無しさん
19/05/21 10:21:18.62 BVi2WQ22a.net
>>590
それコンパイラ依存なのでは?
611:デフォルトの名無しさん
19/05/21 12:55:43.68 PZq+OQZ5p.net
>>589
これな
Javaを最初に設計した奴はバカなんじゃないかと final の仕様を見たとき思ったな
612:デフォルトの名無しさん
19/05/21 15:23:18.72 ZAINLMmO0.net
Linux では、HDD へ書き込むのは、デフォルトで、5秒に1回
USB メモリで、書き込み回数を減らしたい場合は、
15秒に1回とかに設定する人もいる
613:デフォルトの名無しさん
19/05/21 18:23:31.31 6muVxYSDr.net
>>593
書き出し周期はファイルシステムに依存するよ
例えばext3かext4かで挙動は違う
614:デフォルトの名無しさん
19/05/21 18:37:21.97 G/IUf+gXp.net
C言語のfprintfを用いるときに、前行の改行を消す方法をご存知ないですか?
エスケープシーケンスでバックスペースを試したのですか上手くいかなくて困っています。
状況としてはfor文を用いて改行を含んだ文字列を繰り返し出力させているんですが、最後の行だけ改行を無くし、続けて別の文を出力したいのです。
繰り返しの回数を変えて最後に改行なしの処理をいれればいいと思うのですが、簡単な方法があればと思い質問させていただきました。
よろしくお願いします。
615:デフォルトの名無しさん
19/05/21 18:40:11.67 UdJL+OJH0.net
ストリームの撒き戻しは難しいんじゃないか? 表示装置なのかファイルなのかでも変わるだろうし…
616:デフォルトの名無しさん
19/05/21 18:54:48.20 Hcv2vO/e0.net
ファイルポインタは巻き戻せる
標準出力ならエスケープシーケンスで右上に行けばいい
617:デフォルトの名無しさん
19/05/21 19:19:14.41 IJ+i04U80.net
こんな感じでいいのか?
#include <stdio.h>
int main(void) {
FILE* fp;
fp = fopen("Test.txt","w");
fprintf(fp,"hoge\n");
fseek(fp,-1,SEEK_CUR); /* 改行2byteなら-2 */
fprintf(fp,"fuga\n");
fclose(fp);
return 0;
}
618:デフォルトの名無しさん
19/05/21 19:53:55.55 UPiNM42a0.net
質問者が知りたい情報とは違うので、スルー推奨かもですが。
もし自分が、同じことをやれ、と言われたら。
「改行を含んだ文字列」を、「改行」と「それ以外の文字列」の2つに分けて、別々に出力しようとするかなあ。
ループの回数を変える必要はなくて。イメージとしては
for() ※行単位のループ
{
if(最初の行でなければ) fprintf で「改行」を出力
fprintf で「それ以外の文字列」を出力
}
fprintf で「別の文を出力」
619:デフォルトの名無しさん
19/05/21 19:58:03.98 kdkwqODuM.net
>>595
bool First = true;
for( … ){
if(First){
First = false;
} else {
fprintf("¥n");
}
fprintf( … );
}
620:デフォルトの名無しさん
19/05/21 19:58:35.62 kdkwqODuM.net
あっ、被ったや
621:デフォルトの名無しさん
19/05/21 20:07:13.38 IJ+i04U80.net
ファイルが標準出力等でvt100互換端末であれば。
#include <stdio.h>
#include <string.h>
int main(void) {
int i;
i=fprintf(stdout,"hogehogehogehoge\n");
if (0) fprintf(stdout,"\E[01Afuga%*c\n",i,' '); /* これか? */
else fprintf(stdout,"\E[01A\E[%02dCfuga\n",i-strlen("\n")); /* あるいはこれか? */
return 0;
}
cmdとかdos窓なら無理?
622:デフォルトの名無しさん
19/05/21 20:22:57.69 G/IUf+gXp.net
>>596-602
皆様回答ありがとうございます。
ファイルを扱っているので、fseekで戻す方法を試してみようと思います。
623:デフォルトの名無しさん
19/05/21 20:31:17.43 JOJ6V6qzd.net
プログラムいじられるなら、改行出す方をどうにかした方が良さそうだが
624:デフォルトの名無しさん
19/05/21 20:31:52.25 8vKfOnx40.net
ansi.sysを組み込めばVT100互換エスケープシーケンスが
という昔話…と思ったが、ググったらvistaまであったんだな驚き
Windows 10 Threshold 2(10.0.1058)ではコマンドプロンプトでANSI/VT100互換表示が可能に
というスラドの記事も出た
625:デフォルトの名無しさん
19/05/21 20:52:46.26 BVi2WQ22a.net
最後に改行出すんじゃなくて最初に改行出すようにすれば良いだけでは?
一番最初の行だけは最初に出さなければ良いだけ。
バッファリングされて出力されないのが嫌なら行末でfflush()する。
626:デフォルトの名無しさん
19/05/21 21:47:10.75 n1jvW3Ih0.net
>>606
>>599-600
627:デフォルトの名無しさん
19/05/21 22:06:40.11 Y+BS98b80.net
>>607
おお。既にあった。
さっきスマホで見てて気付かなかった。
628:デフォルトの名無しさん
19/05/21 22:09:47.12 JtLDtEYt0.net
>>604-607
603です。>>600の意味をちゃんとわかってませんでしたが、>>606の方のレスでわかりました。
>>600の方が安全な気がするのでそちらを検討します。
629:デフォルトの名無しさん
19/05/24 09:00:19.45 h3dkW7YJ0.net
C言語はクラスが無い。
それは実際どれくらい問題になりますか?
昔C使ってたけど、本格的な抽象的設計をやってたわけじゃなくて、
最近Java使っててそういうのをやりだしたけど、
今思い返してみるとC言語はクラスや継承や多態性が無いから
かなり厳しい言語なんじゃないかな、と思ったんです。
メジャーなカーネルがCで作られてるという事実に驚愕します。
クラス無しで大規模開発は不可能としか思えません。
それどころか、1アルゴリズムの実装でもクラスは有用だと思うんですが。
最近、NimとかRustのようなCを代替するかもしれない勢いのある言語があります。
そういう言語はかなり抽象的な設計が可能です。
そういうのと比べると、小さなデバイスドライバみたいなものはCでいいだろうけど、
大規模開発におけるCはかなり無理があるんじゃないかな?と
そうでもないものですか?
630:デフォルトの名無しさん
19/05/24 09:04:22.51 a6wIXg41a.net
まあファイルがクラスと同じだし。
継承はしづらいけど、そんなもん使ったらC++でもむしろ見通し悪くなるでしょ?
631:デフォルトの名無しさん
19/05/24 10:11:20.70 M2ZwKTAn0.net
最大のデバイスドライバがOSのカーネルなんじゃねえの
そしてそれがC言語の限界
632:デフォルトの名無しさん
19/05/24 10:43:06.36 h3dkW7YJ0.net
Linuxカーネルは2100万行を超えているそうなので
たぶん地球上でもっとも大規模な開発の1つです。
633:デフォルトの名無しさん
19/05/24 11:21:47.36 0dR+L/D60.net
責任ある人は気がくるっているじゃない。
634:デフォルトの名無しさん
19/05/24 12:25:59.56 Cw+6mW4za.net
Cでもオブジェクト指向的に考えて作ることは可能。構造体へのポインタまたは情報を区別する番号などを渡してその中身に基づいて処理する関数作ればいいので。
ファイルアクセスとかは作りがそうなってるよね。
635:デフォルトの名無しさん
19/05/24 12:32:21.84 M3xcEept0.net
クラスはコンストラクタ/デストラクタは活用したけど
継承で面倒になって、ちょっと便利な関数付き構造体としてしか設計したことない。
636:デフォルトの名無しさん
19/05/24 12:35:03.01 C+5joBz9M.net
C言語ではオブジェクト指向も関数型プログラミングもできる。その下位レイヤーだから。
面倒臭いけど。
637:デフォルトの名無しさん
19/05/24 12:50:51.48 8pSuDyEhM.net
>>613
デバドラとかが山ほどあるだけでコア部分はそんなにたいしたことないよ
638:デフォルトの名無しさん
19/05/24 12:53:08.72 8pSuDyEhM.net
>>610
構造体に関数ポインタ入れたりすれば継承も多態も可能
書くのが面倒ってだけの話
モジュールを適切に分割すれば個々の開発部分はそんなにでかくならないし
639:デフォルトの名無しさん
19/05/24 12:59:14.48 Cw+6mW4za.net
まあしかしC++は複雑怪奇な状態になったような感じがするのでなんか別の言語でオブジェクト指向やった方が良いような気がする。
640:デフォルトの名無しさん
19/05/24 13:49:11.26 FIKXvkBI0.net
Javaがとてもシンプルな言語に見えてくる
641:デフォルトの名無しさん
19/05/24 14:27:11.63 YkjJvwKvd.net
linux kernelなんておもくそオブジェクト指向的な構造だろ
642:デフォルトの名無しさん
19/05/24 19:13:34.31 E0qJKDus0.net
関係ないけどOOPが流行り始めた頃に「WindowsのUIはオブジェクト指向だ」と言ってたやつを思い出した。
643:デフォルトの名無しさん
19/05/24 19:26:36.07 omgaeJxY0.net
目指していた方向はそうだったと思う
644:
19/05/24 20:26:08.87 0N6+tWvP0.net
>>615
>Cでもオブジェクト指向的に考えて作ること
あくまでも「オブジェクト指向『的』」であることに注意すること
C ではオブジェクト指向を実現できない(断言)
645:
19/05/24 20:27:08.05 0N6+tWvP0.net
>>617
>C言語ではオブジェクト指向も関数型プログラミングもできる
C ではオブジェクト指向はできない(断言)
継承をCでどのように記述するのでしょうか?
646:
19/05/24 20:27:59.68 0N6+tWvP0.net
>>622
>linux kernelなんておもくそオブジェクト指向的な構造だろ
あくまでも「オブジェクト指向『的』」であってオブジェクト指向そのものではありません(断言)
647:デフォルトの名無しさん
19/05/24 20:41:47.14 1FXcUtRQa.net
いやできなくはないよ。何せC++は元々はCへのコンバータだったしな。C++のソースを読んでC言語に変換して後のことはCコンパイラに任せてたんだよ。それが初期のC++。
もちろんCは言語そのものがオブジェクト指向をサポートしてないから人間がそれをやろうとするととても面倒な事になるけどな。
648:デフォルトの名無しさん
19/05/24 20:51:16.47 E0qJKDus0.net
そんなん言い始めたらアセンブラでもオブジェクト指向プログラミングできることになっちゃう。
言語としてOOPがサポートされてなきゃ認められないでしょ。
649:
19/05/24 21:00:32.57 0N6+tWvP0.net
>>628
>C++のソースを読んでC言語に変換して後のことはCコンパイラに任せてたんだよ。それが初期のC++。
C++ から C へのトランスパイラが存在したからといって、C にてオブジェクト指向(的ではなくそのものずばり)なプログラミングができるわけではありません
C++ のコンパイラが存在するからといって機械語が OO でないのと同じです、まず、
C++ URLリンク(ideone.com)
に対応する C のコードを示してください
650:
19/05/24 21:01:09.07 0N6+tWvP0.net
>>629
>言語としてOOPがサポートされてなきゃ認められないでしょ。
激しく同感いたします!
651:デフォルトの名無しさん
19/05/24 21:12:51.85 ZwmHdTYl0.net
>>610
全く問題にならない
classというキーワードがなくても
コードを書く者の考え方次第でカプセル化や継承はできる
FILE構造体がその例だ
多態性がないというのは、おまえさんの認識不足で
関数ポインタでそんなものはすぐに実現できる
そういう認識不足があるからこそ
メジャーなカーネルをなぜ書けたかが理解できないのだ
652:デフォルトの名無しさん
19/05/24 21:15:04.81 ZwmHdTYl0.net
>>630
対応するCのコードを示せるやつがいたら、おまえどうする?
朝8時の品川駅のホームでストリーキングでもするか?
653:デフォルトの名無しさん
19/05/24 21:24:37.67 QPLeHwR8a.net
まあ継承なんてオブジェクト指向と関係ないよ
654:
19/05/24 21:45:54.65 0N6+tWvP0.net
>>632
>classというキーワードがなくても
>コードを書く者の考え方次第でカプセル化や継承はできる
C ではカプセル化はできても継承は不可能ですよ
655:
19/05/24 21:46:59.73 0N6+tWvP0.net
>>633
>対応するCのコードを示せるやつがいたら、おまえどうする?
あなたができないことをそんなにアピールしなくてもいいと思いますよ
656:デフォルトの名無しさん
19/05/24 21:56:28.68 wwZ4gkZH0.net
仮想関数テーブルの実装方法について語るスレはここですか?
657:デフォルトの名無しさん
19/05/24 22:01:07.63 ZwmHdTYl0.net
>>635
いーや、できる
おまえさん禿本やリップマンくらい読んだか?
裸踊りを賭す自信もねえやつがいきがってんなよ
658:デフォルトの名無しさん
19/05/24 22:02:14.93 ZwmHdTYl0.net
>>637
いいぜ
おら、来いや
659:蟻人間
19/05/24 22:06:22.36 /xfbOr910.net
>>630
URLリンク(ideone.com)
660:
19/05/24 22:17:20.89 0N6+tWvP0.net
>>638
ではストロヴストルップやリップマンはどういっているのか、ここに引用していただけますか?
あらかじめいっておきますが、引用はできない、なぜならば、そんな内容をストロヴストルップもリップマンも書いていないのだから
661:デフォルトの名無しさん
19/05/24 22:18:09.05 TMKOHW7N0.net
>>625-627, >>629
オブジェクト指向と言う概念と実装の区別がついてないんだな
低能なプログラマーによくある行動w
例えばLinuxで言えばリダイレクトなんて言うのはもろオブジェクト指向な機能だよね
Applicatlon > xxx
ってやればxxxがファイルならApplicatlon が出力したデータをファイルに書き込むし、xxxが端末なら端末にデータを表示するし、xxxがプリンタならデータを印刷する
Applicatlonは出力先が何であるかを気にする必要はない
もちろんLinuxはC言語でこれを実現してるしより面倒だろうけど当然アセンブラで実装することも可能
662:デフォルトの名無しさん
19/05/24 22:21:05.39 0NhXAFL60.net
概念ならFILE構造体とそれの操作関数群
663:
19/05/24 22:21:27.40 0N6+tWvP0.net
>>640
>typedef struct C
>{
> A ThisA;
> B ThisB;
> int c;
>} C;
これは委譲であって継承ではありません。私は >>626 で「Cでは継承はできない」と主張しており、これを否定するために委譲は使えません
664:
19/05/24 22:23:27.35 0N6+tWvP0.net
>>642
それは smalltalk 的な OO であって C++ の OO の概念とは多少食い違うと思います
665:デフォルトの名無しさん
19/05/24 22:24:05.41 0NhXAFL60.net
コンストラクタとデストラクタの機構だけは欲しいと思ったことがしばしば
666:
19/05/24 22:24:31.62 0N6+tWvP0.net
>>643
FILE は OO 的ではありますが、OO そのものではありません
OO というからには委譲とは別の継承を表現できねばなりませんが、
C では継承を表現できません
667:デフォルトの名無しさん
19/05/24 22:41:32.12 K6buSCwsM.net
glibとか大昔からあるじゃん…
glibがooでないならooの定義をまず示せ
668:デフォルトの名無しさん
19/05/24 22:42:05.32 hUeULEjja.net
オブジェクト指向ってC++固有の概念なの?
だとすると、そりゃCで実現は無理でしょう。関係ないんだから。CとC++は。
669:
19/05/24 22:44:44.02 0N6+tWvP0.net
>>648
glibc++ は OO かもしれませんが glibc が OO だとは寡聞にして聞きませんね
670:
19/05/24 22:45:51.47 0N6+tWvP0.net
>>649
>オブジェクト指向ってC++固有の概念なの?
いいえ、Java も C# も OO だし、 python も ruby も OO で表現できます
671:デフォルトの名無しさん
19/05/24 22:50:26.22 hUeULEjja.net
>>650
GLibだよGLib
今知らないのもどうかと思うけど、使ってみると面白いと思うよ
672:デフォルトの名無しさん
19/05/24 22:51:22.70 hUeULEjja.net
>>651
いや、それだとつじつま合わないでしょ
自分の決めた道を突き進めよ
673:蟻人間
19/05/24 22:53:40.43 /xfbOr910.net
GTKのGLibだよね。
674:
19/05/24 22:54:27.15 0N6+tWvP0.net
>>653
どうつじつまがあわないというのですか?説明ください
私は「OO ならば委譲と区別された継承を記述されなければならない」と主張しています
675:デフォルトの名無しさん
19/05/24 22:55:59.59 K6buSCwsM.net
>>650
glibcじゃねーよ…
gimp、inkscape、gnomeほか様々なソフトウェアで使われてる。
linuxとは無縁だったんだな
676:デフォルトの名無しさん
19/05/24 23:36:16.20 SCqWQYPI0.net
>>629
出来るに決まっている
OO言語はオブジェクト指向プログラミングがやり易いようになっているだけでそれじゃなきゃOO出来ないというのはOOについて理解していないだけ
677:デフォルトの名無しさん
19/05/24 23:46:49.71 SCqWQYPI0.net
>>644
多重じゃない継承の場合Cでは1つめのメンバにベースクラスのインスタンスを書くというルールなだけ
それだけで呼び出し元のコードはほぼなにも考えずにベースクラスの機能を使うことができる
678:デフォルトの名無しさん
19/05/24 23:58:34.02 S5Q/uU3j0.net
>>655
CでもOOできるし、継承できるし、オーバーライドもできる。
20年位前の本に「ANSI C に準拠したコンパイラならできる」と紹介されている。
メモリを意識したコードを書けない人には理解できないけどね。
679:デフォルトの名無しさん
19/05/25 00:01:58.97 7Hh+Cor80.net
C言語はABIが標準化されている、という文を見たんですが、
その標準仕様の名前は何ですか?
新しいプラットフォームがその標準仕様を満たせば
バイナリレベルあるいはソースレベルで移植性があるんでしょうか?
680:デフォルトの名無しさん
19/05/25 00:07:07.65 KPhaQb+n0.net
>>654
ていうかお前、MZ級にウンコな片山博文やんけ。
>>660
標準の名前は無いんじゃないの?
とりあえず「ABI」でググれ。
681:デフォルトの名無しさん
19/05/25 00:11:09.80 oops2jeN0.net
アーキテクチャ跨いでABIが統一できるわけないよね
引数の渡し方なんてアーキテクチャ変わったらそもそも使えるレジスタ変わるし
同一アーキテクチャの特定OS内ならバージョン変わってもABI互換ってのは良くあるけど
682:蟻人間
19/05/25 00:29:35.52 2ZlhwbAL0.net
>>661
そのプライドを大切にしろよ
683:デフォルトの名無しさん
19/05/25 05:52:48.29 Tic4GHY30.net
>>645
お前のOOの定義書いてくれ
俺の思うOOじゃないとか言われたらどうしようもないわなw
684:デフォルトの名無しさん
19/05/25 05:57:11.32 6KmI3UXB0.net
Cでオブジェクト指向プログラムなんて書くのは時間の無駄
速度が必要な部分だけCで作るのが正解
685:デフォルトの名無しさん
19/05/25 06:05:28.22 6T2yG8cn0.net
>>641
てめえの怠慢を俺が尻拭いする筋合いはねえぜ
調べるところまで教えてやったんだ
自分で調べる気がねえなら不勉強のまま取り残されろ
686:デフォルトの名無しさん
19/05/25 07:19:56.39 DOpjF4HUM.net
>>665
> Cでオブジェクト指向プログラムなんて書くのは時間の無駄
そう言うこと
ただ時間がかかると言うのとできるできないの話は別
なのでお前のレスのほうが時間の無駄w
687:
19/05/25 15:51:01.79 jppBZDTS0.net
>>658
>多重じゃない継承の場合Cでは1つめのメンバにベースクラスのインスタンスを書くというルールなだけ
C では構造体のメンバの順番をプログラムから指定することはできたのでしょうか?
C コンパイラはアラインメントを考慮して最適化をはかり構造体のメンバを、プログラマの記述から適宜入れ替えていもいいのでは?
となると一つめのメンバにベースクラスのインスタンスを書いても、コンパイラに入れ替えられてしまっては無意味なのでは?
688:
19/05/25 15:52:11.46 jppBZDTS0.net
>>659
>CでもOOできるし、継承できるし、オーバーライドもできる。
できないとおもいますよ、できるというのなら >>630 を C で記述してみてください
>20年位前の本に「ANSI C に準拠したコンパイラならできる」と紹介されている。
出典を明記ください
689:
19/05/25 15:53:43.84 jppBZDTS0.net
>>666
>てめえの怠慢を俺が尻拭いする筋合いはねえぜ
あなたは私の怠慢を主張するのと同様の筋で、私はあなたの欺瞞を主張します
出典元や引用を正確にできないのであれば、あなたは嘘をついていると判断されてもしかたがないと思います
690:
19/05/25 15:55:14.60 jppBZDTS0.net
>>661
片山先生は私とは比較にならないほど生産性の高いプログラマですよ
691:
19/05/25 16:03:59.98 jppBZDTS0.net
>>652
はじめて知りました、>>650 は勘違いした内容でした、すみません
ご紹介ありがとうございます。今試しているところです!
692:デフォルトの名無しさん
19/05/25 16:17:34.75 Tic4GHY30.net
>>668
真面目な話、規格書読んでこい
ツッコミどころが頓珍漢すぎる
693:
19/05/25 17:02:40.54 jppBZDTS0.net
>>673
コメントありがとうございます。確かに >>668 には誤りが含まれていました
ISO/IEC 9899:1999
6.7.2.1
694:.5 As discussed in 6.2.5, a structure is a type consisting of a sequence of members, whose storage is allocated in an ordered sequence, JIS X3010:2003 構造体は,メンバの列から成る型とし,メンバの記憶域は,並べられた順に割り付ける(6.2.5参照)。 しかし、この記述は構造体のパディングが構造体の先頭に詰められる場合を排除していないと考えます よって、>>658 >多重じゃない継承の場合Cでは1つめのメンバにベースクラスのインスタンスを書く >それだけで呼び出し元のコードはほぼなにも考えずにベースクラスの機能を使うことができる 構造体の先頭にパディングがあった場合は、この記述は正しくないのではないでしょうか。
695:
19/05/25 17:37:11.41 jppBZDTS0.net
>>674
よくよく考えると、私の「この記述は構造体のパディングが構造体の先頭に詰められる場合を排除していないと考えます」もかなり疑わしい、
パディングというものは、一つのメンバがあって、それに対してもう一つのメンバを置くときにパディングを置くものであって、最初からパディングを置く必然性がないですね
struct S {
int a;
} b;
のとき
&b = &(b.a)
は保障されている、時間がたつにつれてそんな気がどんどんしてきました…
>>658 を認め、同時に単一継承であれば C で OO と継承を表現できることを認めます
696:
19/05/25 18:11:59.97 jppBZDTS0.net
>>674
> a type consisting of a sequence of members, whose storage is allocated …
この is にも惑わされてしまいました
これは
a type consisting of a sequence of members, each of which is allocated about storage in an ordered sequence
とか
a type consisting of a sequence of members, each of which's storage is allocated in an ordered sequence
くらいに解釈するべきなんですね
検討する機会をいただきありがとうございました
697:デフォルトの名無しさん
19/05/25 21:04:32.61 DDy3bloZM.net
>>675
絶対許さんぞおおおお
698:デフォルトの名無しさん
19/05/25 21:07:06.72 aM9QB8YDa.net
オブジェクト指向って抽象化が目的なのに、メモリ配置とか気にするのは馬鹿みたいだよな
699:デフォルトの名無しさん
19/05/25 21:23:55.56 cjrLAMgS0.net
MicrosoftのCOMはほとんど全てのコンパイラが構造体のメモリ配列を同じ様にするってのを利用してるんだっけ?
700:デフォルトの名無しさん
19/05/25 22:13:30.07 UN9uDEfaM.net
>>678
ここにも概念と実装の区別がついてないバカが…w
701:デフォルトの名無しさん
19/05/25 23:25:49.27 KPhaQb+n0.net
>>669
C言語でオブジェクト指向を表現する (クラス、継承)
URLリンク(qiita.com)
この辺でも読んどけ。
「何故できるか」まで言及したもっといい文献はあるがカスには教えない。
俺は「せざるを得ない」状況だったのでCでOOしたが、ネイティブでOOできるならそれに越したことはない。
あ、同じ板でハッシュが一致してるのでお前は蟻。
702:デフォルトの名無しさん
19/05/26 01:24:13.78 zv+FEFKTa.net
>>681
またおまえか
703:デフォルトの名無しさん
19/05/26 08:36:08.16 o+/j3IaP0.net
>>670
は? 俺は主張なんざしてねえぜ
事実をありのまま指摘しただけだ
何勘違いしてやがる
というか勘違いということにせねば立場がねえってかw
704:デフォルトの名無しさん
19/05/26 08:56:22.54 7tI1cTYc0.net
もうこんなとこで喧嘩しても勝敗つかないんだからやめろw
仲良くできねえのかお前らは
705:デフォルトの名無しさん
19/05/26 12:29:05.12 lzKtO2WM0.net
でも冷静になって考えてみろ
単細胞時代から何億年と喧嘩してきた結果今の人間がいる訳だから喧嘩をやめてしまったらそれは果たして生物と言えるのか
逆に言えばAIが人知を超える時
人間は機械に滅ぼされ地球から人間はいなくなっているという事
つまり今何をすべきかと言うと人間は思考をやめアホになるべきである
706: そうアホの坂田こそ未来の救世主ネオなのである
707:
19/05/26 15:17:23.15 CpBTYp0n0.net
>>681
そのご紹介のリンク先は、内容について、はっきりいって詰めが甘いです
すなわち、継承と委譲を区別できていません
そんな中途半端な理解で quita に掲載するとか、玉か石かどちらかといえば、石の部類でしょう、全然参考になりませんでした
そんな中途半端な内容の記事を掲載するあなたも同様と判断いたします
708:
19/05/26 15:19:14.79 CpBTYp0n0.net
>>683
事実かどうかは、主観的か客観的か、に依存すると思いますが、
相対論においてはすべての事象について純客観的などありえない…①
ので、①より、あなたは主観を主張しているものと私は理解します
709:デフォルトの名無しさん
19/05/26 15:46:43.76 aNhG7Lwu0.net
>>686
「継承」に必要な操作一式を委譲に基づいて提供できているなら継承できていると思うんだけど、
言語サポートを伴って暗黙的に機能しない限り「継承」と呼ぶべきではない、ということなの?
そこで明確に区別することにあんまり意義が見出せないんだけど、その定義どっか出典示せる?
710:
19/05/26 15:52:14.70 CpBTYp0n0.net
>>688
委譲による実装で継承を実現できているのなら、それは継承(の一形態)である、…① という主張ですね
①は私にも理解できますが、委譲はダイヤモンド継承を回避できない欠点があるのでは、と考えています
「ダイヤモンド継承」については C++ の書籍には大概載っているかと、具体的な書籍名は探しておきます
711:デフォルトの名無しさん
19/05/26 16:00:20.28 Jdhtsrqd0.net
まあ継承なんてオブジェクト指向と関係ないからね
712:
19/05/26 16:02:51.60 CpBTYp0n0.net
>>690
それは初耳です
Object Oriented に継承は憑き物だと思っていました、継承のない OO って存在するのですか?それは例えばなにですか?
713:デフォルトの名無しさん
19/05/26 16:08:55.02 aNhG7Lwu0.net
>>689
ちょっと何言ってるかわからないな。
ダイアモンド継承の問題を「継承」で回避しているが委譲では回避できないであろう例を挙げてくれたら考える。
明確に区別しないことも理解できると言うなら「詰めが甘い」とか「中途半端」とか言ってたのは何なのか・・・。
714:デフォルトの名無しさん
19/05/26 16:22:19.45 Jdhtsrqd0.net
>>691
なにって、言語を知りたいということ?
715:デフォルトの名無しさん
19/05/26 16:37:44.23 vwTAovQx0.net
クラスベースのOOP言語ではクラスの継承は一般的だけどプロトタイプベースのOOP言語では継承の概念は存在しないよ
716:
19/05/26 16:40:12.48 CpBTYp0n0.net
>>692
クラス A, B, C, D について、
A のメンバ変数を a とする、また
B->A(B は A を派生する)
C->A
D->B, C (多重継承)
において、これを委譲で実装すると、B.A.a と C.A.a が同じであるべきにもかかわらず二重にインスタンスとして生成されてしまうので、
継承で実装した D.a を、委譲で実装した D.B.a と同一視するか、D.C.a と同一視するか、また継承における D.a を更新した場合に委譲では D.B.a と D.C.a の両方を更新するコードを生成しなければならないのか、
等あいまいな部分がでてくる、これがダイヤモンド継承問題です
継承で実装すれば、C++ ではこれを仮想継承といいますが D.a の実態を一つに限定することができますし、D.B.a, D.C.a の両方を保存することもできます、つまりモデリングにおいて選択肢を準備できる
しかし委譲で実装すると D.a の実態を一つに限定することが不可能です、つまり選択肢を準備できません
以上より委譲で継承のすべてを代行できないため、委譲と継承を区別する必要が生じると考えます
ただし、多重継承を認めないのであれば、委譲と継承は同一視しても差し支えないと考えます
717:
19/05/26 16:41:21.10 CpBTYp0n0.net
>>693-694
ふーん、インタプリタ JavaScript には継承はないのですか
718:デフォルトの名無しさん
19/05/26 16:41:38.74 vwTAovQx0.net
URLリンク(ja.m.wikipedia.org)
719:
19/05/26 17:08:49.07 CpBTYp0n0.net
>>692
>明確に区別しないことも理解できると言うなら「詰めが甘い」とか「中途半端」とか言ってたのは何なのか・・・。
「単一継承に限定するのならば委譲による継承の実装も可能である」という意味での>>689の「理解します」の文言だと解釈ください
ただし委譲で継承をすべて実現できないので、>>681 掲載のリンク先は「詰めが甘い」と判断せざるを得ない、そんなリンク先を紹介する >>681 も同様と判断するものです
720:デフォルトの名無しさん
19/05/26 17:11:49.57 iR9VJ5EUa.net
継承がオブジェクト指向と無関係なんだから、委譲で実現する必要がない
721:デフォルトの名無しさん
19/05/26 17:25:25.86 aNhG7Lwu0.net
>>695
C++が仮想継承・多重継承でやっていることをコードで書き下せば済む話。
アップキャストがnopで済むか、オフセットの足し算になるかなどの詳細に基づいて区別しろってことに
聞こえるんだけど、やっぱりそんな区別の意義が見えてこない。
722:デフォルトの名無しさん
19/05/26 17:39:21.34 kcdU4Ge60.net
もうそろそろ別スレ立ててやれや
> それは smalltalk 的な OO であって C++ の OO の概念とは多少食い違うと思います
とか言う様な奴を相手にしても永遠に終わらんと思うが…
723:
19/05/26 17:50:19.72 CpBTYp0n0.net
>>700
>C++が仮想継承・多重継承でやっていることをコードで書き下せば済む話。
そこで実現されているのは私のいうところの継承であって、私のいうところの委譲ではありません
委譲ではダイヤモンド継承に対応できない(選択肢を提供できない)
したがって、委譲と継承とは区別するべきであり委譲で継承を実装するべきではない、という私の主観には一貫性があると思います
724:デフォルトの名無しさん
19/05/26 17:56:41.22 NrZyzakr0.net
>>702
継承はだめだよ
これから使ったら反省文ね
725:デフォルトの名無しさん
19/05/26 18:07:56.35 aNhG7Lwu0.net
>>702
むちゃくちゃだなぁ。「私のいうところの」「継承」「委譲」の区別がどうにも掴めないし、
その区別の意義も示されなさそうだし、迷惑してる人もいるみたいだから、離脱させてもらうよ。
726:
19/05/26 18:09:31.06 CpBTYp0n0.net
>>703
私がいつ「継承は要らない子」とかいいましたか?
あくまでも「継承を委譲で実装できない」とは言っていますが(これは部分的に意見を修正していますが)「継承不要論」とかは一切主張していないと考えていますよ
727:
19/05/26 18:13:13.41 CpBTYp0n0.net
>>704
継承と委譲の区別は必要だと思いますよ、その言葉を贈らせていただきましょう
728:デフォルトの名無しさん
19/05/26 18:34:08.86 NrZyzakr0.net
>>705
だから、世界の共通認識として要らないもの。
使っちゃだめ。
729:デフォルトの名無しさん
19/05/26 18:57:26.86 mCW+tIqA0.net
もういい加減やめてくれないかな
やりたいなら、Cでクラス実装とかって
別スレたててその中でやってくれ
730:デフォルトの名無しさん
19/05/26 19:03:45.32 NrZyzakr0.net
>>708
またおまえか
731:デフォルトの名無しさん
19/05/26 20:50:42.22 o+/j3IaP0.net
>>706
私のいうところのって、最初の論旨からずいぶん乖離しているな
カプセル化や継承ができるかどうかって話だっただろうがよ
いつから、おまえのお気に召すかどうかって話になったんだよ
732:デフォルトの名無しさん
19/05/26 23:38:41.06 SA/0I36h0.net
>>686
煽って、良い文献の情報を得ようとしているのだろうが、カスにはやらんよwwww
733:デフォルトの名無しさん
19/05/27 01:54:45.96 sXav5Bzw0.net
URLリンク(jp.quora.com)
734:デフォルトの名無しさん
19/05/27 02:52:02.77 jiPRfYyG0.net
ソロソロ終わって良いですよね?
この議論は、C使っている人とは違う世界に感じる
735:デフォルトの名無しさん
19/05/27 03:09:42.07 HzhW79+j0.net
>>713
またおまえか
736:デフォルトの名無しさん
19/05/27 09:01:49.81 Nqk3VxBP0.net
stddef.hをインクルードして
#
737:define __STDC_WANT_LIB_EXT1__ 1 を定義して -std=c11をつけても gccでrsize_tが使えないですけど なぜですか? windows版のGCCでは使えました
738:デフォルトの名無しさん
19/05/27 09:23:40.73 or6IbtWZa.net
defineの順番とか…
739:デフォルトの名無しさん
19/05/27 09:34:14.79 Nqk3VxBP0.net
>>716
順番は試しましたが駄目でした
740:デフォルトの名無しさん
19/05/27 10:04:44.33 PB+ZSyAza.net
rsize_tって多分オプションだから実装されてないよね?
windowsはなぜか実装してる
741:デフォルトの名無しさん
19/05/27 10:11:08.57 Zyn15i1D0.net
C#でポインタ使えばC、C++は無くても良いんじゃないですか?
742:デフォルトの名無しさん
19/05/27 10:15:55.39 gR3ITcWOM.net
C#使うならポインタのように面倒臭いこと考えなくても変数でも関数でも参照できるだろ
743:デフォルトの名無しさん
19/05/27 19:48:50.47 0mZL0xC90.net
C#のポインタはC/C++ほど使い勝手が良くない
C#でポインタを使ったところでパフォーマンスはC++の半分程度
まあトータルで見れば最優秀クラスの言語なのは間違いないけどね
C++みたいなスパゲティ言語ではないし
744:デフォルトの名無しさん
19/05/27 20:36:21.78 f4m/nmMua.net
まあ、だいたいの後から出た言語はC/C++の欠点を補おうとしているのでポインタがあっても安全なのが普通だな。
745:デフォルトの名無しさん
19/05/27 20:42:45.71 MaSSH1d10.net
安全じゃないのがc#のポインタの特長だろ。
特徴じゃなく
746:デフォルトの名無しさん
19/05/27 21:12:57.55 RgnUDQi4a.net
そりゃC#のポインタ使うにはunsafeオプションが必要だからね。安全じゃないわね。
C#のポインタは過去資産APIを使うための必要悪って感じか。
747:デフォルトの名無しさん
19/05/28 07:12:55.99 gr6HI2ftM.net
>>722
Cの前からでてたPascalにもポインタはあるんだが…
むしろC/C++が例外的
748:デフォルトの名無しさん
19/05/28 09:09:59.25 HGTlDNNW0.net
数年前からこのプロジェクトがちょっと注目されてるけどどう思う?
RustはC++を置き換えてもCを置き換えないだろうと思うし、
ZigはCの置き換えとしては妥当なんじゃないかという気がする。
Cより高速、単純、堅牢らしい。
URLリンク(ziglang.org)
749:デフォルトの名無しさん
19/05/28 09:29:30.01 HGTlDNNW0.net
Cより速いと主張
>Speaking of performance, Zig is faster than C.
単純な言語仕様
>Small, simple language
性能と堅牢性
>Performance and Safety: Choose Two
個人的にとても興味を持ってるんだが
750:デフォルトの名無しさん
19/05/28 17:05:35.46 5GqHhS1Q0.net
CはC++ほどではないにせよ色々酷いから
Cを置き換えられる言語があるなら見てみたいしぜひ置き換えてほしい
751:デフォルトの名無しさん
19/05/28 17:30:53.21 vL2LyOeQ0.net
>>726
URLリンク(www.spriters-resource.com)
ちょっと検索してみたらもうドット絵まで準備されてるらしい
さすがに西洋人は仕事が早いな
752:デフォルトの名無しさん
19/05/28 19:02:59.10 Pzgny9jf0.net
URLリンク(www.datadeliver.net)
キューを実装する?プログラムを書いたのだがコアダンプになってしまったため、どこが悪いのか調べるために1回だけenqueueをするように変えたら無限に10を生成するようになってしまった
どこが悪�