C言語なら俺に聞け 151
■ このスレッドは過去ログ倉庫に格納されています
たしかにscanfが危険なものだと知った時にどうやってfgetsに置き換えるか考えたの思い出した >>287
その数%のアセンブラの部分を、おまえさんは「OS」と呼ぶのか? >>314
scanfの仕様をロクに調べもせず自分の頭で考えもせず
どっかの受け売りを初心者に吹聴する無能老害こそ
この世から駆逐すべきだろうが >>319
ヨコからスマンけど
そゅ意味じゃないのが
理解できないほどの馬鹿は
ここにくるべきではない >>315
「よい子は真似をしてはいけません」と言われる芸当をやっているプロになろうって人には当てはまらない >>321
おまえさんこそ>>283からの話の流れを読んでるか?
人を馬鹿呼ばわりした自分の発言に責任を持てよ 匿名掲示板だから逃げたければ逃げられるが
おまえさんの人間性の問題が変わるわけではない 馬鹿丸だし(笑)
論文ゼロの院生くずれ馬鹿ニート
という雰囲気プンプンだな(爆) 院生とかめっちゃ高評価じゃんw
俺には大学にコロコロコミックを持ってきて、全ての人間が敵に見えて毎日発狂してた同級生の江○君と被ってしまう。
頭はすこぶる良いんだけど、頭が弱い残念なアイツの雰囲気がプンプン 学歴コンプレックスまる出しだな
頭隠して尻隠さずw 効いてる効いてるw
突然論文ゼロとか言い出すカモは扱いやすすぎ #include <stdio.h>
int main(void){
remove("https://mevius.5ch.net/test/read.cgi/tech/1554171817/");
return 0;
} Cできるけどアセンブラできない、
ってのはCもできないってことだ。 アセンブラからCに行ったらアセンブラでやってたアルゴリズムがCで表現できなく、非常にもどかしくて・・・ >>335
それは初耳、いや、どういうのに手こずったのか参考に教えていただけませんか? 出来る出来ないっていう話なら、基本Cできるんじゃないかな。
CPU固有のブルック転送命令とかそんなのを除いて。
(それすら別にできるけどね。)
1命令でできてたことがめんどくさくなるってものならあるかも。 アセンブラで作るにしてもでもアルゴリズムで実装しているならCでも出来るんじゃないの? プラットフォーム依存の問題は言語じゃなくてコンパイラより下が解決するわけでさ、それをできると言っていいならなんでもできると思うよ。 >>335
一つ思い出しました、キャリーフラグを活用するアルゴリズムは、そのままでは C でかけずに大変ですね
ローテートとかシフトとか >335
キャリーフラグが無くてオーバーフロー/アンダーフロー判定が面倒だとか、
ビットシフトはあってもローテーションが無いとか。
ジャンプ命令使うとパイプラインが初期化されるからなるべく使うなと聞いたのに
逆汗見たらジャンプしまくってるじゃないかとか。
8/16bit時代のアセンブラは1バイト、1ステート削って処理速度稼いでたんで
上記の差を補う処理が無駄に思えて・・・。
かといってインラインアセンブラ使うのはなんか違うと(インライン使うと最適化されないとも聞いてたし)。
それならアセンブラでCから呼べる関数書いた方がすっきりするとか。
20世紀時代のことだ。 マシン語でコード書いてるときはオンレジスタ思考なのに
当時のCはデフォautoつまりオンメモリなので
ああ、やはりマシン語よりは速度が落ちる言語なんだな
コンパイラ言語とインタプリタ言語のような違いが
もう1つあるんだなって思っていた スパゲッティなものを書いてるならともかく、真っ当にサブルーチン化してたら必要悪としてレジスタ志向は早々に諦めてたわ。
局所的に最適化するならそれは別問題として解決してた。 構造化なんか眼中になかったね
速度こそ純粋で美しい法律だった >>340
> 一つ思い出しました、キャリーフラグを活用するアルゴリズムは、そのままでは C でかけずに大変ですね
それはアルゴリズムと言うより実装の話かと PC9801のVRAMを1ドットスクロールさせるのなんか
キャリー使って書いてたのをキャリーなしで書き直させられるのは悲しかった >>345
>アルゴリズムと言うより実装の話
いや、それは不思議な分類だと思います、DES/AES などはローテート・シフトがそのままアルゴリズムになるのでは? >>347
そのアルゴリズムにキャリーフラグなんて出てこないでしょ? アルゴリズムという特定ワードに囚われて用語の定義の話に逸れていくつまらん展開だ 文字列入力を受け付けて、それを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文字入力されるまで入力受け付け状態から遷移しない)
どのように改良すればよいでしょうか? 何故誰もscanf("%c", str[i])に突っ込まないのか >>350
「入力処理」のforループで、「50文字入力されたら」を判定してるけど、
もう一方の終了条件「Enterが押されたら」を判定してないからでしょ。
1文字受け取るごとに、Enter '\n' ならループを抜ける、をやらなきゃ。
というわけで >>315 に至る。
>>353 このスレッドの伝統かと。>>299 以下を参照のこと。
あちらはスルーしたのに、こちらでツッコむのは抵抗感がある、みたいな。 誤: というわけで >>315 に至る。
正: というわけで >>351 に至る。
315 を確認したところ、まるっきり見当違いでもなかったね。 >>354
>>299は見逃していたなあ。空目だな。 >>350
もし宿題が本当に scanf(“%c”,str[i]) と書いてある場合は先生が間違えてるので「 scanf(“%c”, &str[i]) ですよね?」とツッコミを入れてみると良い。
そうすると君はできる学生と思われて成績が上がるるか、または気に入らんやつと思われて成績が下がると思う。 そういえば東大では今でも
C言語が必修なのか?
まじ時代遅れの馬鹿だと思ってたら、
Cしかできない在日の馬鹿教員が
いるのだとか 参照型とか出てくるのにそもそも参照がなにかも理解出来てないにわかオブジェクト指向が増えるよりよっぽどマシよ
なんの言語とは言わないけども
C言語なら理解しなければ先に進まないから >>358
C が分からないようでは話にならないのでは? >>361
トヨタ系の研究所には
Cの分かる研究員がもういないのです
研究には全く支障がないです
組込みやってる高卒やFランが
Cをやるべきでしょ? >>362
それは多分ありえない話でしょうね、なぜならば C は計算機言語の基本で、各種書籍ではアルゴリズムの記述に C を使うものが大半ですから
本も読めない人がトヨタの研究者とか、あなたの空想の話なのでは? >>364
python で二分木の実装とかできますか? やっぱり相当コンプレックスの塊で頭悪いんだろうなぁ >>366
本当ですか?ポインタがない python では無理なんじゃないですか!? 真面目に言うとpythonは基本的に全部参照渡しだね。
参照したものを直接いじれるかというとそうでない場合があるけども。 >>372
なるほど、ではユーザー定義の型は自動的に参照扱い、すなわち Java みたいなかんじなんですね
であれば苦労すれば二分木を実装できますね、大変失礼いたしました >>370
Python に限らず動的型の言語の多くは変数に値を入れるんじゃなくて、
オブジェクトと変数の間に束縛 (bind) を作ることで成り立ってる。
辿ることでオブジェクトを参照するんだ。 実質的にポインタだよ。 むしろポインタしかない。
(小さい値 (小さい数値とか文字とか) はアロケーションを抑制するためにそのまま
ワードに突っ込むような最適化をする言語 (処理系) もあるけども。) >>374
Java ならば boxing でヒープにとる値とスタックに取る値とをある程度(意識せずに)変換できますね(そういう C/C++ like な意識が皆無ではない、という意味)
ただし、二分木に関してはいいたいことがまだあって、「本物の」二分木は二重ポインタ(ポインタのポインタ)が必要なのではないか?と思っています
さすがに Java には二重ポインタはない、そんな用途の言語じゃない
Python や ruby にはあるのでしょうか? 二重ポインタを何に使う?
Cだと引数でノードのオブジェクトを返す辺りか? >>376
ノードを追加する関数add の引数を
add(&root, Object)
ってするでしょ?&root ってことは、struct *node のアドレス、すなわち struct node ** が必要なのではないかと >>377
わからんが、Cでも戻り値でポインタを返せばいいんじゃないか? >>375
参照を持つオブジェクトへの参照を持てるんだから、事実上の二重ポインタとして使えるよ。 二重までは使うんだよなあ
三重をなぜ使わないか、説明できるか?w ガベージコレクションと裸のポインタって相性が悪いような >>378
2個返したい時とか、戻り値は成功かどうかのコードを返したいとか 道はいろいろあると思うが、せっかくあるんだから構造体使って皆くるんじゃえと思うよ。 微妙にスレチのように思うので続きはJava初心者のスレでやった方が良いのではないか?
まあ人に聞かなくても Java を勉強して Java の API のソースを読めばそういうのをどうしているのかは何れわかると思うけどね。 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 (深いコピー)と呼ぶ(別のインスタンス) >>380
余裕で三重ポインタなどほいほいと使いますよ
https://mevius.5ch.net/test/read.cgi/tech/1434079972/26
void prep_exe(char *sttp, char **path, char ***argv)
char **argv を使うことが理解できるのだったら「argv のアドレスを渡す」みたいな場合に渡された関数側では三重ポインタを使うことになるでしょう >>388
それcodepadだろ? 使いさえすればいいって話じゃなくて >>389
無論使いさえすればいい、というわけではなく、この例では小さなシェルを実装しており、シェルのパイプ機能を実装するのに三重ポインタを使ったのです >>391
代入命令が増えるという意味ではなく、「同じ値」なのに代入してしまう、という作業が >>378「戻り値でポインタを返」す方式の書き方だと不可避です 呼び出しの前後で、ptrの値が 同じかもしれない、場合よっては変わるかもしれない関数
ptr = func1(ptr, opt); と func2(&ptr, opt);
うーんどっちも使うな… >>393
前者
>ptr = func1(ptr, opt);
は初心者用で、>>392 のいう無駄な代入が含まれています、二重ポインタがわかるのなら後者にするべきです >>394
シンプルな記述ができるのに、わざと複雑な書き方にするのは問題なのでは? >>396
じゃあ、戻り値そのまま使えば?
mallocは使うんでしょ? >>397
その場合無駄な代入が発生しますね、>>393 がいい例を示しています エラー伝達に NULL を使う realloc は即代入するとお漏らししちゃうし
あれ、なん引数書き戻しにしなかったんだろう? 素朴な疑問 >>398
代入されているのかされていないのか、わからない方が良いってこと? ×あれ、なん引数書き戻しに
○あれ、なんで引数書き戻しに >>399
正直、nullが来た時点で終わってるしなあ…。
まあでも一時変数使うのが筋だと思いますよ。戻り値でも引数でも同じこと。 >>400
ちがいます
代入するのか代入しないのかは malloc() したかしなかったかにかかっています。
代入は malloc() したとききだけにすればよく それが >>393 の func2(&ptr, opt); の書き方
一方 >>393 ptr = func1(ptr, opt); は malloc() したかしないかにかかわらず代入を行います、これは無駄な代入を含みます >>403
だから、関数の内部的に何してるのかわからんのが良いってことじゃない? >>404
着目点はそこにはありません。関数による記述で内部を隠蔽するのが目的ではありません
問題は、malloc() したときだけ代入し、malloc() しなかったときには代入しない、という記述を正確にかけるかどうか…@、にかかっており
>>393 ptr = func1(ptr, opt); は@を記述できる可能性が皆無、一方
>>393 func2(&ptr, opt); は@を記述できる可能性がある、というわけです >>393
前者の方が好ましい
2重ポインタなんて最適化の妨げになるものは、それしか使えない場面でのみ使うべき >>406
非常に大きな二分木(ノートが1億個)があって、そのはるか先端で malloc() してそこで代入すればいいだけなのに、
その先端から root に戻ってくる途中の30箇所ほどで、軒並み全部のノードで「必要のない無駄な代入」をするのですか?
>それしか使えない場面でのみ使うべき
この二分木を実装する、というのがまさしく「それしか使えない場面」なのですよ >>405
つまり、後者でmallocしてnullが返った時はそれを代入するってことですか?同じじゃん。 >>407
二分木のコストってのは比較であって代入じゃないと思いますよ。
まあアルゴリズムの一般論としては。 >>408
>>393 func2(&ptr, opt); では
malloc() して null が返ってきたときは、例えば何もしない、ということはできますね
でも >>393 ptr = func1(ptr, opt);
は、malloc() しようがしまいが代入してしまいますね、これは「やる必要のない無駄な代入」が含まれることになり、好ましくないです
>>393 ptr = func1(ptr, opt); の記述法は二分木を最初に習うときに、この記述法で理解を促すという意味では有用であっても、
いつまでもこれで書いているようでは進歩していない、もっといえば怠惰である、と考えています >>409
しかし無駄な代入を放置してよいというわけではないでしょうね、削れるところは削るべきです
単純二分木よりさらに改良された平衡二分木(AVL木、赤黒木等)を紹介する書籍では、最初から >>393 func2(&ptr, opt); で記述されていますよ >>410
じゃあ隠蔽しろという話なんじゃないの?
関数の中で成功失敗を判定して外にnullは返すな入力時のままにしとけ、という関数。 >>412
ちがいますね
問題は、malloc() したときだけ代入し、malloc() しなかったときには代入しない、という記述を正確にかけるかどうか…@、にかかっています。
>>413
>>407 に書いておきました、1億ノードの二分木にて各ノードが最適に配置されているとして、削ることのできる代入は malloc() 一回に対して 30 個の代入になります
>>393 ptr = func1(ptr, opt); では 1億ノードの二分木にノードを追加する際、30個の無駄な代入が発生します
代入のコストは大したことがない、にしても、アルゴリズムを正確に記述できないのは問題ですね
洗練された記述とはそういうものではないでしょうか >>414
いや、mallocがnull返した時はいれないんでしょ?
成功か失敗かじゃないの?呼んだかどうかじゃなくて。 仕事では戻り値に成功失敗が入ってオブジェクトのポインタは引数に来るような関数は使うけどさ、
結局どっちもチェックするよ。信じられねえもんな。 >>415
malloc() が成功したか失敗したかは、今の話には関係ありません
今関係があるのは、
malloc() したときだけ代入し、malloc() しなかったときには代入しない、という記述を正確にかけるかどうか…@
です ■ このスレッドは過去ログ倉庫に格納されています