C言語なら俺に聞け 151at TECH
C言語なら俺に聞け 151 - 暇つぶし2ch358:デフォルトの名無しさん
19/05/03 20:31:26.00 4Ii/FXBd0.net
>>340
> 一つ思い出しました、キャリーフラグを活用するアルゴリズムは、そのままでは C でかけずに大変ですね
それはアルゴリズムと言うより実装の話かと

359:デフォルトの名無しさん
19/05/03 20:52:43.47 EWn4tN7a0.net
PC9801のVRAMを1ドットスクロールさせるのなんか
キャリー使って書いてたのをキャリーなしで書き直させられるのは悲しかった

360:
19/05/03 21:19:31.21 0u/4Gvfl0.net
>>345
>アルゴリズムと言うより実装の話
いや、それは不思議な分類だと思います、DES/AES などはローテート・シフトがそのままアルゴリズムになるのでは?

361:デフォルトの名無しさん
19/05/03 22:27:22.12 4Ii/FXBd0.net
>>347
そのアルゴリズムにキャリーフラグなんて出てこないでしょ?

362:デフォルトの名無しさん
19/05/03 22:32:04.75 EWn4tN7a0.net
アルゴリズムという特定ワードに囚われて用語の定義の話に逸れていくつまらん展開だ

363:デフォルトの名無しさん
19/05/04 04:19:37.51 qzgt3pmZ0.net
文字列入力を受け付けて、それをstrという変数に代入する…というプログラムを書きたいのですが、知りたいことがあって以下のような条件を課させていただきます。
・for文を使い、その中でscanf(“%c”,str[i])により1文字ずつ文字をstrの各配列に格納していくこと
・文字数は最大50文字までとし、たとえば「abcd」などのように4文字であった場合も、abcdと入力→Enterが押された時点で、その文字列をstrに代入して、その4文字を表示して完了とする
・if文を使ってそれを実現すること

#include<stdio.h>
int main(void){
int i,str[50];
for(i=0;i<50;i++){ //入力処理
scanf(“%c”,str[i]);
}
for(i=0;i<50;i++){ //出力
printf(“%c”,str[i]);
}
}
このコードだと、「abcd」と入力してEnterを押しただけでは、出力されません。(50文字入力されるまで入力受け付け状態から遷移しない)
どのように改良すればよいでしょうか?

364:デフォルトの名無しさん
19/05/04 05:12:15.70 Yh80Q70x0.net
入力される度に文字のチェックしてみれば。

365:デフォルトの名無しさん
19/05/04 05:15:36.04 eVIwB2YR0.net
>>350
宿題は自分でやれ

366:デフォルトの名無しさん
19/05/04 05:21:50.50 I31OC90J0.net
何故誰もscanf("%c", str[i])に突っ込まないのか

367:デフォルトの名無しさん
19/05/04 05:39:39.99 RAMEL17i0.net
>>350



368:「入力処理」のforループで、「50文字入力されたら」を判定してるけど、 もう一方の終了条件「Enterが押されたら」を判定してないからでしょ。 1文字受け取るごとに、Enter '\n' ならループを抜ける、をやらなきゃ。 というわけで >>315 に至る。 >>353 このスレッドの伝統かと。>>299 以下を参照のこと。 あちらはスルーしたのに、こちらでツッコむのは抵抗感がある、みたいな。



369:354
19/05/04 10:20:54.58 RAMEL17i0.net
誤: というわけで >>315 に至る。
正: というわけで >>351 に至る。
315 を確認したところ、まるっきり見当違いでもなかったね。

370:デフォルトの名無しさん
19/05/04 10:47:02.91 lguQ1Ppja.net
>>354
>>299は見逃していたなあ。空目だな。

371:デフォルトの名無しさん
19/05/04 11:41:09.49 yT0QTmUja.net
>>350
もし宿題が本当に scanf(“%c”,str[i]) と書いてある場合は先生が間違えてるので「 scanf(“%c”, &str[i]) ですよね?」とツッコミを入れてみると良い。
そうすると君はできる学生と思われて成績が上がるるか、または気に入らんやつと思われて成績が下がると思う。

372:デフォルトの名無しさん
19/05/04 13:40:22.89 tOD9kuurM.net
そういえば東大では今でも
C言語が必修なのか?
まじ時代遅れの馬鹿だと思ってたら、
Cしかできない在日の馬鹿教員が
いるのだとか

373:デフォルトの名無しさん
19/05/04 13:51:43.16 k+B84EwL0.net
学歴コンプレックスの人?

374:デフォルトの名無しさん
19/05/04 14:16:41.02 vXlxEQ1E0.net
参照型とか出てくるのにそもそも参照がなにかも理解出来てないにわかオブジェクト指向が増えるよりよっぽどマシよ
なんの言語とは言わないけども
C言語なら理解しなければ先に進まないから

375:
19/05/04 14:19:50.76 7fnHNdb20.net
>>358
C が分からないようでは話にならないのでは?

376:デフォルトの名無しさん
19/05/04 14:47:16.31 tOD9kuurM.net
>>361
トヨタ系の研究所には
Cの分かる研究員がもういないのです
研究には全く支障がないです
組込みやってる高卒やFランが
Cをやるべきでしょ?

377:
19/05/04 14:55:00.73 7fnHNdb20.net
>>362
それは多分ありえない話でしょうね、なぜならば C は計算機言語の基本で、各種書籍ではアルゴリズムの記述に C を使うものが大半ですから
本も読めない人がトヨタの研究者とか、あなたの空想の話なのでは?

378:デフォルトの名無しさん
19/05/04 15:22:49.59 Yh80Q70x0.net
アルゴリズムの勉強はpythonがいいよ

379:
19/05/04 15:25:54.07 7fnHNdb20.net
>>364
python で二分木の実装とかできますか?

380:デフォルトの名無しさん
19/05/04 16:05:03.07 Yh80Q70x0.net
>>365
できますん

381:デフォルトの名無しさん
19/05/04 16:07:19.80 LvYM7SOrM.net
>>365
そんなのはFランの仕事でしょ?

382:デフォルトの名無しさん
19/05/04 16:13:20.77 8Q7/PMC20.net
論文の次はFランか、哀れだなw

383:デフォルトの名無しさん
19/05/04 16:49:12.48 vXlxEQ1E0.net
やっぱり相当コンプレックスの塊で頭悪いんだろうなぁ

384:
19/05/04 18:28:05.43 7fnHNdb20.net
>>366
本当ですか?ポインタがない python では無理なんじゃないですか!?

385:デフォルトの名無しさん
19/05/04 18:39:36.30 yT0QTmUja.net
pythonって参照ないの?

386:デフォルトの名無しさん
19/05/04 18:43:01.66 gINSNBZZa.net
真面目に言うとpythonは基本的に全部参照渡しだね。
参照したものを直接いじれるかというとそうでない場合があるけども。

387:
19/05/04 19:05:41.64 7fnHNdb20.net
>>372
なるほど、ではユーザー定義の型は自動的に参照扱い、すなわち Java みたいなかんじなんですね
であれば苦労すれば二分木を実装できますね、大変失礼いたしました

388:はちみつ餃子
19/05/04 19:18:51.61 21Of2ELD0.net
>>370
Python に限らず動的型の言語の多くは変数に値を入れるんじゃなくて、
オブジェクトと変数の間に束縛 (bind) を作ることで成り立ってる。
辿ることでオブジェクトを参照するんだ。 実質的にポインタだよ。 むしろポインタしかない。
(小さい値 (小さい数値とか文字とか) はアロケーションを抑制するためにそのまま
ワードに突っ込むような最適化をする言語 (処理系) もあるけども。)

389:
19/05/04 20:22:17.94 7fnHNdb20.net
>>374
Java ならば boxing でヒープにとる値とスタックに取る値とをある程度(意識せずに)変換できますね(そういう C/C++ like な意識が皆無ではない、という意味)
ただし、二分木に関してはいいたいことがまだあって、「本物の」二分木は二重ポインタ(ポインタのポインタ)が必要なのではないか?と思っています
さすがに Java には二重ポインタはない、そんな用途の言語じゃない
Python や ruby にはあるのでしょうか?

390:デフォルトの名無しさん
19/05/04 20:55:58.63 cZ5M6KFWa.net
二重ポインタを何に使う?
Cだと引数でノードのオブジェクトを返す辺りか?

391:
19/05/04 21:01:18.06 7fnHNdb20.net
>>376
ノードを追加する関数add の引数を
add(&root, Object)
ってするでしょ?&root ってことは、struct *node のアドレス、すなわち struct node ** が必要なのではないかと

392:デフォルトの名無しさん
19/05/04 21:43:09.25 cZ5M6KFWa.net
>>377
わからんが、Cでも戻り値でポインタを返せばいいんじゃないか?

393:はちみつ餃子
19/05/04 21:46:08.02 21Of2ELD0.net
>>375
参照を持つオブジェクトへの参照を持てるんだから、事実上の二重ポインタとして使えるよ。

394:デフォルトの名無しさん
19/05/04 21:57:52.42 8Q7/PMC20.net
二重までは使うんだよなあ
三重をなぜ使わないか、説明できるか?w

395:デフォルトの名無しさん
19/05/04 22:09:57.55 RtDHzLy60.net
ガベージコレクションと裸のポインタって相性が悪いような

396:デフォルトの名無しさん
19/05/04 22:15:35.23 eVIwB2YR0.net
>>378
2個返したい時とか、戻り値は成功かどうかのコードを返したいとか

397:デフォルトの名無しさん
19/05/04 23:07:46.23 cZ5M6KFWa.net
道はいろいろあると思うが、せっかくあるんだから構造体使って皆くるんじゃえと思うよ。

398:デフォルトの名無しさん
19/05/05 00:20:41.66 nwgMKC8Ra.net
微妙にスレチのように思うので続きはJava初心者のスレでやった方が良いのではないか?
まあ人に聞かなくても Java を勉強して Java の API のソースを読めばそういうのをどうしているのかは何れわかると思うけどね。

399:デフォルトの名無しさん
19/05/05 00:21:53.66 tvdtPjB+0.net
Ruby での、Jaggy 配列は、
ary = [ ] # 配列の配列
ary.push [ "a" ]
ary.push [ 1, 2 ]
p ary #=> [["a"], [1, 2]]
C/C++ 以外のたいていの言語では、数字などのprimitive 以外は、すべて参照。
(primitiveは参照にするよりも、その場所へ値を埋め込んだ方が速い)
外側の配列は、内側の配列の参照を持っている。
内側の配列は、(primitive以外の)各要素の参照を持っている
primitive以外は、コピーしても参照がコピーされるだけで、値はコピーされない。
つまり、同一インスタンスを指す。
別のインスタンスは作られない
new されていなければ、インスタンスは作られない。
代入しただけでは、参照がコピーされるだけ
これを、shallow copy (浅いコピー)と呼ぶ(同一インスタンス)。
new して、別のインスタンスを作ることを、deep copy (深いコピー)と呼ぶ(別のインスタンス)

400:デフォルトの名無しさん
19/05/05 00:37:14.86 RPhfdkos0.net
>>385
馬鹿は消えろ

401:
19/05/05 08:54:51.63 3EWrT4Pn0.net
>>378
それは無駄な代入が発生するでしょう?

402:
19/05/05 09:01:10.92 3EWrT4Pn0.net
>>380
余裕で三重ポインタなどほいほいと使いますよ
スレリンク(tech板:26番)
void prep_exe(char *sttp, char **path, char ***argv)
char **argv を使うことが理解できるのだったら「argv のアドレスを渡す」みたいな場合に渡された関数側では三重ポインタを使うことになるでしょう

403:デフォルトの名無しさん
19/05/05 09:04:36.94 hoO1o10+0.net
>>388
それcodepadだろ? 使いさえすればいいって話じゃなくて

404:
19/05/05 09:08:14.08 3EWrT4Pn0.net
>>389
無論使いさえすればいい、というわけではなく、この例では小さなシェルを実装しており、シェルのパイプ機能を実装するのに三重ポインタを使ったのです

405:デフォルトの名無しさん
19/05/05 09:21:39.41 2T/oydys0.net
>>387
引数を介すと代入が減るってこと?

406:
19/05/05 09:47:47.39 3EWrT4Pn0.net
>>391
代入命令が増えるという意味ではなく、「同じ値」なのに代入してしまう、という作業が >>378「戻り値でポインタを返」す方式の書き方だと不可避です

407:デフォルトの名無しさん
19/05/05 10:05:07.93 bV6goPu10.net
呼び出しの前後で、ptrの値が 同じかもしれない、場合よっては変わるかもしれない関数
ptr = func1(ptr, opt); と func2(&ptr, opt);
うーんどっちも使うな…

408:デフォルトの名無しさん
19/05/05 10:28:11.80 2T/oydys0.net
>>392
じゃあ、一時変数に代入しとけば?

409:
19/05/05 10:29:23.05 3EWrT4Pn0.net
>>393
前者
>ptr = func1(ptr, opt); 
は初心者用で、>>392 のいう無駄な代入が含まれています、二重ポインタがわかるのなら後者にするべきです

410:
19/05/05 10:30:14.08 3EWrT4Pn0.net
>>394
シンプルな記述ができるのに、わざと複雑な書き方にするのは問題なのでは?

411:デフォルトの名無しさん
19/05/05 10:32:32.58 2T/oydys0.net
>>396
じゃあ、戻り値そのまま使えば?
mallocは使うんでしょ?

412:
19/05/05 10:33:46.84 3EWrT4Pn0.net
>>397
その場合無駄な代入が発生しますね、>>393 がいい例を示しています

413:デフォルトの名無しさん
19/05/05 10:35:01.06 bV6goPu10.net
エラー伝達に NULL を使う realloc は即代入するとお漏らししちゃうし
あれ、なん引数書き戻しにしなかったんだろう? 素朴な疑問

414:デフォルトの名無しさん
19/05/05 10:35:57.12 2T/oydys0.net
>>398
代入されているのかされていないのか、わからない方が良いってこと?

415:デフォルトの名無しさん
19/05/05 10:36:08.55 bV6goPu10.net
×あれ、なん引数書き戻しに
○あれ、なんで引数書き戻しに

416:デフォルトの名無しさん
19/05/05 10:41:29.60 2T/oydys0.net
>>399
正直、nullが来た時点で終わってるしなあ…。
まあでも一時変数使うのが筋だと思いますよ。戻り値でも引数でも同じこと。

417:
19/05/05 11:25:51.36 3EWrT4Pn0.net
>>400
ちがいます
代入するのか代入しないのかは malloc() したかしなかったかにかかっています。
代入は malloc() したとききだけにすればよく それが >>393 の func2(&ptr, opt); の書き方
一方 >>393 ptr = func1(ptr, opt); は malloc() したかしないかにかかわらず代入を行います、これは無駄な代入を含みます

418:デフォルトの名無しさん
19/05/05 11:31:24.71 2T/oydys0.net
>>403
だから、関数の内部的に何してるのかわからんのが良いってことじゃない?

419:
19/05/05 11:37:36.53 3EWrT4Pn0.net
>>404
着目点はそこにはありません。関数による記述で内部を隠蔽するのが目的ではありません
問題は、malloc() したときだけ代入し、malloc() しなかったときには代入しない、という記述を正確にかけるかどうか…①、にかかっており
>>393 ptr = func1(ptr, opt); は①を記述できる可能性が皆無、一方
>>393 func2(&ptr, opt); は①を記述できる可能性がある、というわけです

420:デフォルトの名無しさん
19/05/05 11:38:01.66 orE8GGyod.net
>>393
前者の方が好ましい
2重ポインタなんて最適化の妨げになるものは、それしか使えない場面でのみ使うべき

421:
19/05/05 11:44:46.28 3EWrT4Pn0.net
>>406
非常に大きな二分木(ノートが1億個)があって、そのはるか先端で malloc() してそこで代入すればいいだけなのに、
その先端から root に戻ってくる途中の3


422:0箇所ほどで、軒並み全部のノードで「必要のない無駄な代入」をするのですか? >それしか使えない場面でのみ使うべき この二分木を実装する、というのがまさしく「それしか使えない場面」なのですよ



423:デフォルトの名無しさん
19/05/05 11:45:42.03 2T/oydys0.net
>>405
つまり、後者でmallocしてnullが返った時はそれを代入するってことですか?同じじゃん。

424:デフォルトの名無しさん
19/05/05 11:47:06.67 2T/oydys0.net
>>407
二分木のコストってのは比較であって代入じゃないと思いますよ。
まあアルゴリズムの一般論としては。

425:
19/05/05 11:53:15.92 3EWrT4Pn0.net
>>408
>>393 func2(&ptr, opt); では
malloc() して null が返ってきたときは、例えば何もしない、ということはできますね
でも >>393 ptr = func1(ptr, opt);
は、malloc() しようがしまいが代入してしまいますね、これは「やる必要のない無駄な代入」が含まれることになり、好ましくないです
>>393 ptr = func1(ptr, opt); の記述法は二分木を最初に習うときに、この記述法で理解を促すという意味では有用であっても、
いつまでもこれで書いているようでは進歩していない、もっといえば怠惰である、と考えています

426:
19/05/05 11:55:53.32 3EWrT4Pn0.net
>>409
しかし無駄な代入を放置してよいというわけではないでしょうね、削れるところは削るべきです
単純二分木よりさらに改良された平衡二分木(AVL木、赤黒木等)を紹介する書籍では、最初から >>393 func2(&ptr, opt); で記述されていますよ

427:デフォルトの名無しさん
19/05/05 11:57:28.30 2T/oydys0.net
>>410
じゃあ隠蔽しろという話なんじゃないの?
関数の中で成功失敗を判定して外にnullは返すな入力時のままにしとけ、という関数。

428:デフォルトの名無しさん
19/05/05 11:58:36.27 2T/oydys0.net
>>411
代入回数比較してよ。頼むよ。

429:
19/05/05 12:05:45.99 3EWrT4Pn0.net
>>412
ちがいますね
問題は、malloc() したときだけ代入し、malloc() しなかったときには代入しない、という記述を正確にかけるかどうか…①、にかかっています。
>>413
>>407 に書いておきました、1億ノードの二分木にて各ノードが最適に配置されているとして、削ることのできる代入は malloc() 一回に対して 30 個の代入になります
>>393 ptr = func1(ptr, opt); では 1億ノードの二分木にノードを追加する際、30個の無駄な代入が発生します
代入のコストは大したことがない、にしても、アルゴリズムを正確に記述できないのは問題ですね
洗練された記述とはそういうものではないでしょうか

430:デフォルトの名無しさん
19/05/05 12:48:51.19 2T/oydys0.net
>>414
いや、mallocがnull返した時はいれないんでしょ?
成功か失敗かじゃないの?呼んだかどうかじゃなくて。

431:デフォルトの名無しさん
19/05/05 12:52:54.83 2T/oydys0.net
仕事では戻り値に成功失敗が入ってオブジェクトのポインタは引数に来るような関数は使うけどさ、
結局どっちもチェックするよ。信じられねえもんな。

432:
19/05/05 13:12:30.38 3EWrT4Pn0.net
>>415
malloc() が成功したか失敗したかは、今の話には関係ありません
今関係があるのは、
malloc() したときだけ代入し、malloc() しなかったときには代入しない、という記述を正確にかけるかどうか…①
です

433:デフォルトの名無しさん
19/05/05 13:42:25.11 2T/oydys0.net
>>417
じゃあ、絶対代入するってことだろうよ。
引数に渡したポインタに。ポインタを。

434:
19/05/05 13:51:49.48 3EWrT4Pn0.net
>>418
malloc() したときは代入しますよ、でも malloc() しないときは代入なんかせず、そのまま呼び出し元に返るだけです
それが>>393 ptr = func1(ptr, opt); 方式と絶対的に違うのです

435:デフォルトの名無しさん
19/05/05 13:55:35.88 2T/oydys0.net
>>419
戻り値はvoidってこと?

436:
19/05/05 14:02:45.71 3EWrT4Pn0.net
>>420
>>393 func2(&ptr, opt); 式なら void もありえます

437:デフォルトの名無しさん
19/05/05 14:08:06.37 2T/oydys0.net
>>421
いや、必須なのでは?

438:
19/05/05 14:11:38.90 3EWrT4Pn0.net
>>422
いいえ、実際に実装するならば、エラーを伝達する手段として返り値を準備することは大いにありえるでしょうね
void が必須ではありません
必要な代入なら使えばいい、でも
>>393 ptr = func1(ptr, opt);
方式は不必要な代入があり、単に二重ポインタを使用して記述すればこれは除去できるので、
>>393 ptr = func1(ptr, opt);
を書くのは問題だし、これを書く人は頭を使っていない、と判断します

439:デフォルトの名無しさん
19/05/05 14:33:08.37 bV6goPu10.net
異常は戻りをNULLにするパティーンで 
 node_t *func3(node_t**, ...)
正常だった場合に ptr = func3(&ptr, opt); と書けるしw (無駄な努力の可能性

440:デフォルトの名無しさん
19/05/05 14:34:34.27 bV6goPu10.net
って書いたけど鼻から悪魔踏みそうな嫌らしさがあるな…

441:
19/05/05 15:03:58.07 3EWrT4Pn0.net
>>424
そのパターンでは、異常値 NULL をうっかりノードに登録してしまうと、そのノードより下が浮いてしまい危ないですね、ま、異常系をミスったままリリースしてしまうことも私はよくやりますけど

442:デフォルトの名無しさん
19/05/05 15:42:24.13 8x8syc+Fa.net
>>423
いや、必須でしょ?代入消せるんだから。消さないと。

443:
19/05/05 17:54:28.38 3EWrT4Pn0.net
>>427
言葉尻を捕らえて攻めたつもりになっているようですね
「すべての代入を消去できる」なんていってませんよね
>>393 ptr = func1(ptr, opt);
この代入は不要な代入を含むので、
>>393 ptr = func1(ptr, opt);
は不適当な書き方だ、とこれまで首尾一貫して述べているのです

444:デフォルトの名無しさん
19/05/05 18:13:23.13 bV6goPu10.net
423の文意は
「void が必須なわけではなく
 引数と同じ型のポインタを戻すことはせずに、別の目的の何か、たとえばエラーコードとして int を戻す
 なんてのはアリでしょ?」
ってことだと思うけど

445:デフォルトの名無しさん
19/05/05 18:42:49.42 dOx23ziba.net
returnしちゃだめでしょ
代入が駄目ってくらいだから

446:デフォルトの名無しさん
19/05/05 18:56:43.02 bV6goPu10.net
「代入不要なケースでも代入記述を要求するのはよろしくない」スタイルの延長だと
戻り値評価も破棄可能ならそうすべき って話か

447:
19/05/05 19:00:00.98 3EWrT4Pn0.net
>>430
どんな代入もだめだとは主張していませんね…
>>393 ptr = func1(ptr, opt);
方式は不必要な代入があり、単に二重ポインタを使用して記述すればこれは除去できるので、
>>393 ptr = func1(ptr, opt);
の代入が駄目だとはいってきていますけれども

448:はちみつ餃子
19/05/05 19:03:30.45 TxpPZKKr0.net
>>407

449:はちみつ餃子
19/05/05 19:13:46.27 TxpPZKKr0.net
あ、ごめん、ミスって文章を書く前に投稿してもうた。
>>407
あらためて確認するが、この代入を「無駄」としているのはアルゴリズムの表現の上では不要なことをしているという
意味の上での無駄であって、性能上の無駄という意味ではないんだね?
そして、アルゴリズムを正しく表現する上では (ときには二重・三重のも含めて) ポインタが必要だと。

450:
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 ではカプセル化はできても継承は不可能ですよ


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch