C言語なら俺に聞け 144
レス数が1000を超えています。これ以上書き込みはできません。
#include <stdio.h>
int main(int argc, char *argv[])
{
unsigned long long n[] = { 0x0820084008411c3e, 0x087f180408080810 };
int i;
for (i = 127; i >= 0; i--) {
putchar(n[i / 64] & (1ULL << (i % 64)) ? '*' : ' ');
if (! (i & 0x0f)) putchar('\n');
}
return 0;
}
https://paiza.io/projects/zyQ0Osccs4xaziOrVUF_cA 乱数生成法について教えてください。
普通の乱数生成法は、ある乱数 x を発生させたとき、次の乱数を特定の関数 f で生成させていますが、
(すなわち、次の乱数は f(x) となる)、これは n + 1 番目の乱数を作るには、n 番目の乱数を知らなければならないことになります。
そうではなくて、n + 1 番目の乱数を f(n + 1) で計算できるもの( n + 1 番目の乱数を求めるのに n 番目の乱数を知らなくてもいいもの)はないでしょうか?
こういう乱数はテクニカルタームとしてはどのように呼ばれるのでしょうか? >>3
擬似乱数のことでいいんだよね?
今普通って言ったらメルセンヌツイスターだと思うんだけど、
「次の乱数は f(x)」 とか「f(n + 1) で計算」とかしないよ
数千bitほどの内部状態から数列を生み出すんだよ
じゃないと周期とか質が悪い f(n + 1) で計算できるものって それはもはやHashではないかな >(すなわち、次の乱数は f(x) となる)、これは n + 1 番目の乱数を作るには、n 番目の乱数を知らなければならないことになります。
それランダムにならんように思うが。 >>4
乱数を取得するごとに内部状態が変わるので前回と違う値が取れんだと思うんだが
メルセンヌツイスタはシードが同じでも別の乱数列が出力される? >>3
普通の計算機である以上何かを元にして計算するしかないのでは?
f(n+1) を計算する時に f(n) を使わずに n を元にして計算する?
だったら乱数計算する前に必ずシードをセットするようにするしかないのではないか?
例えば rand() の直前に必ず srand() で種をセットするということね。
(実際これやると乱数にならないような気がするが) >>10
??
当然、初期状態が同じなら出力も同じだよ >>12
メルセンヌツイスタは乱数列を無限に出力できるのでn番目とかはないという話ですか? >>3 の質問の真意は
「(擬似)乱数列のn+1番目の値を出すためにn+1回のループを回す必要がない
アルゴリズムを紹介してくれ」だと思うよ。
n+1番目の乱数値を作るためにn番目までの乱数値を知る(次の値の計算に使う)
必要がある、という意味ではないでしょ。 おっと、「〜だと思うよ」の部分は「〜じゃないかな?」に訂正させてくれ。
読み直したら、そこまで断定する自信がなくなった。
質問者 >>3 による見解を求む。
…と言っても、いずれにせよ俺には答えられない問題だけどネ。 Gtk+ 3.0のGUIツールの質問はこちらでも宜しいでしょうか。
glade3.18、C言語を使用しています。
起動したgladeの右側のプロパティ画面で、
window1 GtkWindow
□|__box1 GtkBox
□□|__scrolledwindow1 GtkScrolledWindow
□□□|__viewport1 GtkViewport
□□□|____image2 GtkImage
□□□|__button1 GtkButton
のように配置すると、画面をマウスで引き伸ばしても、実行時window1のみが引き伸ばされてしまいます。
やろうとしている事は、ファイルの保存ダイアログの様に、マウスで引き伸ばしてもbutton1がwindow1と一緒に移動し、image2が引き伸ばしされている様に見せたいのですが上手くいきません。
教えてください。よろしくお願いします。 >>13
当然、特定初期状態からのn番目はあるよ
周期もある
何を聞かれてるのかよくわからない >>14
はい、そのとおりです。
ハッシュ関数(たとえばSHA-2) に対して入力0, 1, 2, を与えて得られた出力を乱数として使用することに妥当性はあるか?
もっと踏み込むと、実はストリーム暗号として使用したく考えています。
ハッシュ関数を h(x)、
暗号鍵を k
平文を M
暗号文をC
として、
C = Mi xor f(n + k), n = 0, 1, 2, ....
とした場合に、この暗号に対してどのような解読方法が考えられるか? >>16
「引き延ばし」というのは専門用語じゃないよね。位置とサイズをちゃんと指定くれないと、人間にもわからないよ。
イベント駆動については勉強した? サイズを自動調整するには、イベント駆動で「サイズ変更」のイベントを捕まえるか、自動レイアウトにするしかないよ。 >>3 >>18
ショボい線形合同法 f(n) = (f(n-1) * a + b) mod c なら、
f(n) = (f(0) * (a ** n) + b*n) mod c
という式が使える理屈だけど、現実には桁あふれとか
a ** n (べき乗)の計算でループするとか、実用できないだろうなぁ。
ところで詮索するわけじゃないけど
◆QZaw55cn4c って普段は教える側の人じゃなかったっけ? GtkBoxとGtkScrolledWindowをコンテナに。イベント駆動でサイズ調整。 >>22
その変形は、ちょっと楽観しすぎていると思う
f(1) = af(x) + b
f(2) = a(ax + b) + b = a^2 x + ab + b
f(3) = a(a(ax + b) + b) + b = a^3 x + a^2 b + ab + b
f(4) = a^4x + b(a^3 + a^2 + a + 1)
f(5) = a^5x + b(a^4 + a^3 + a^2 + a + 1)
なんかもっときれいになりそうだけれども…
>普段は
え?それはそうみえるだけじゃないでしょうか? >>26
本当だ。変形間違ってるわ。
ステップ毎に項数が増える漸化式の展開で必ず同じミスするなぁ。 割り算を割り算なしで実用的に計算する方法はありますか? >>28
精度保証がそれなりで良ければ分母の逆数をニュートン法で求めて乗算。
整数の商が正確に必要で除数が一定なら逆数と補正をあらかじめ用意できる。
定数の除算をアセンブリで出してみると驚くよ。 整数を2の自然数乗で割るのは右シフト演算に置き換えられる >>31
そんな些末な化石テクニックなんか、最適化に任せちまえよ。 >>33
いや、そうだけど、ゼロの代入しても最適化されてマシン語ではそれになってることあると思うよ。CPUにもよるだろうけどね。
レジスタをゼロクリアする専用の命令があればそちらが使われるだろうし、多分その方が何も計算しない分だけ速い。 XORクリアはZ80ではほぼ必須テクニックだったけど、x86では意味ないよ >>35
今時のC言語だと意味がないばかりかコンパイラの最適化の邪魔になりかねないので変な小技は忘れた方が良いと思うよ。registerとかと同じ。 G_MODULE_EXPORT void
cb_activate(
GtkEntry *entry1,
GtkLabel *label1)
{
gchar *buf;
buf = g_strdup_printf("文字 %s",gtk_entry_get_text(entry1));
gtk_label_set_text(label1,buf);
g_free(buf);
}
上のプログラムを参考に、GtkTextViewから文字数を得て、label1に書き込むプログラムにしようと、マニュアルを調べていたのですが、上手くいきませんでした。
insert_at_cursorのイベントから動くようにするには、どうしたらいいのでしょうか。
初歩的な質問ですみません。よろしくお願いします。 >>34
> レジスタをゼロクリアする専用の命令があればそちらが使われるだろうし、多分その方が何も計算しない分だけ速い。
レジスタじゃなくてメモリーだけど68000のCLR命令はなぜか0を書く前に謎の読み出しを行うので遅かったりした >>41
Cソース
https://ideone.com/324qDo
UIソース
https://ideone.com/o3pHFq
コメントにした部分は、動くことは動くけれど、ラベルが反応しない。
今の非コメント部分は、main関数は動きますが、それ以外はエラーが出ます。
動かないのを知っていて、プログラムが中途半端に書かれています。
なので責めないでください。
迷走している様子が伝わってくると思います。 >ゼロクリア
昔触った業務機は0固定のレジスタからコピーしてたな。 >>48
あれは乱数レジスタではなくて、リフレッシュカウンタ >>49
Z80で知識が止まってるおじいちゃんの出る幕じゃないよ
intel rdrand でググれ 先輩方また教えてください
int
hoge(int a,
_____int b)
{
____return a + b;
}
_は半角スペースだと思ってください。
こんな感じでintとhogeを別の行に書いたり
int aとint bも別の行に書いたり
こういう書き方をよく見るんですがどうしてこう書くんでしょうか?
C言語ではこういうルールがあるのでしょうか? それはコーディングスタイルとか、コーディングルールとかいうけど、会社や組織によって違う。
制御構造の構造を明確にするために、「インデント」したり文字の位置を揃えたりする。
まあ、初心者ならANSIスタイル使っておけば無難かな。 コード整形ツールというのを使えば、ソースのスタイルを変換できる。 >>52
> こういう書き方をよく見る
嘘つくな。
というか、本当にそう思うのなら見るべきソースを間違っている。
いずれにしても、初心者がその手のコーディングスタイルについて考えるのは完全に時間の無駄だから、
どれでもいいから有名なコーディングルールを読んで、それを使うようにしろ。
お前が今読んでいるそのコードに対して追加/修正が求められているのなら、
グダグダ言わずにそのスタイルで書け。
繰り返すが、初心者がコーディングスタイルにこだわるのは全くの無駄だから、止めろ。
君が入門書を読んで勉強しているのなら、その本のスタイル通りに書け。
初めはそれでいい。 >>52
cb とか indent ってコマンドがある C言語では文字列以外の空白はほとんど無視されるから、処理を一行に長〜く書くことが
できるけど、それでは人間には分かりにくいし、読みづらい。 >>52
たまーに引数が多くて読みずらい関数とかをメンテするハメになったときに、コメントつけるためにやる程度。
例のような短いのでそんな事になってたら、元担当見つけて小一時間問い詰めろ。 GNUスタイルは大嫌いだったな。K&Rは行数削れるから、最初のころ使っていたけど。 >>52
人間が見る時の見易さのためだけにそう書いているのがある。言語としての決まりはない。
C言語で改行に意味があるのはダブルクォーテーションで括った文字列内とプリプロセッサが処理する#で始まる行ぐらいだ。 ,,-―--、
|:::::::::::::;;;ノ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
|::::::::::( 」 <見るべきソースを間違っている。
ノノノ ヽ_l \______________
,,-┴―┴- 、 ∩_
/,|┌-[]─┐| \ ( ノ
/ ヽ| | バ | '、/\ / /
/ `./| | カ | |\ /
\ ヽ| lゝ | | \__/
\ |  ̄ ̄ ̄ |
⊂|______|
|l_l i l_l |
| ┬ | char p[]="aiueo";
p[3]='\0';
ではエラー出ないのに
char *p="aiueo";
*(p+3)='\0';
は書き込み違反になるのは何故なの >>65
前者は配列変数のp、後者は定数を指してるポインタのp。 前者は文字列リテラルの複製を配列にセットしたうえで配列を書き換えてる
後者は(ポインタ経由で)文字列リテラルそのものを書き換えている >>66
>>67
リテラルのアドレスになるのかありがとう char *p="aiueo"; //これが通るのは必要悪
const char *p="aiueo"; //本来こうであるべき
*(p+3)='\0'; //constついてりゃ並みのアフォなら気付けるはず constの意味がわかって無いアホ。
リテラルが書き換えられないだけで、ポインターは別に書き換えてもいいだろ。 char * const と const char * の違い そういや前にどこにconst入れるとどこが定数扱いになるか色々やって調べたことあるなあ。 const char *p; と char const *p; は p が指す先が定数で char * const p; は p 自体が定数なんだよね。 まあしかしコンパイラには char *p = "..."; の宣言で *p に書き込みアクセスするような記述を見つけたら警告ぐらい出して欲しいところだな。
実際に(少なくともデフォルトでは)動かないコード吐くわけだし。 ポインタである以上なんでも指せるし、
どう使うかは完全に自己責任では? ま、確かに。他の所を指すように使い回せるけどね。うーん。 >>70に加えて、
const char* const p = "aiueo"; // p も *p も const
も使い分ければいいだけだろ。
つってもこの書き方、非標準なのか?以下ページ以外では見あたらない。
https://qiita.com/pink_bangbi/items/a36617bf1d5923743d69 >>79
ISO/IEC 9899:2011 A.2.2に書いてあるんだが、おまえさんには見えないのか?
7.3) type-qualifier:
const
restrict
volatile
_Atomic
7.6) pointer:
* type-qualifier-listopt
* type-qualifier-listopt pointer
7.6) type-qualifier-list:
type-qualifier
type-qualifier-list type-qualifier char **pをconstするとそんな感じにならなかったけ? あ、こういう問題作れるね。
・ それぞれの違いについて説明せよ。
const char **p
char const **p
char * const *p
char ** const p
char * const *p
char * const * const p
char const * const * const p
char const ** const p >>82
悪問だけどな。結局の所、
・constは複数回指定できる
・constの右側の固まり全体が定数と見なされる
だけだし。逆に言えば、それらを別物/良問として認識するような奴は上達しないのだと思う。
(記憶の前処理としてabstractionする癖がない)
だからこれまでそんな馬鹿げた問題を出す奴はC界隈には居なかったし、今後も多分そうだ。
CodeIQの広告でその手の問題をよく見るが、あれじゃ「馬鹿です」と自己紹介して居るも同然だし。
まあ所詮リクルート(コード書いてない連中)だからそんなもんだが。
とはいえ、何らかのテストで簡単にそいつの実力を把握できる事が出来るのなら、役立つのも確かだが。
そしてそれ以前にconstが大して役に立たないからなあ。 >>83
> ・constの右側の固まり全体が定数と見なされる
え? これ違わない? というのは
const char *p = "...";
の場合は p は p++ できたりして const じゃないから右側の塊ではない。 >>84
>const char *p = "...";
は char const *p = "":
に等しい、例外みたいなもんじゃないか? 変数型宣言と初期化を同時に記述してっからそうなるんだろ? >>82
1: const char **p
2: char const **p
3: char * const *p
4: char ** const p
5: char * const *p
6: char * const * const p
7: char const * const * const p
8: char const ** const p
1と2、3と5は同じ
char **pとchar const * const *pのパターンがない
こういう奴はプログラマーに向いてない >>87
例外ではない。
char部分はCでは常にcons扱い(=int等に変更できない)だから
constが修飾する対象に仕様上なり得ないだけ。
だからその2つは結果的に同じ意味になる。
というかCは文法例外はほぼ無いはず。 自分流に解釈して覚えるのはいいけど、それが世界の真実かのように講釈するのは恥ずかしいから控えた方がいいよ
まあこのスレではいいけど、リアルの人間関係では陰で馬鹿にされるだけだよ >>91
charがintに変更できないのがconstだからだと?
おまえさん char c; *(int*)&c = 1; が許されないことと勘違いしているのか? いかん、間違えた
おまえさん char c; (int)c = 1; が許されないことと勘違いしているのか? >>95
これってcをintに拡張して1を代入してcをcharに戻すの? >>97
当たらずといえども遠からず
自分で言ってて無理を感じるなら
それが正解だ >>97
んなこたあない
>>94の書いてるコードと同義で、cの先頭アドレスからint分の領域に代入するだけで、cを拡張したり戻したりしてるわけではない
gcc 3.xやVC++2008では通ったが今のgccではコンパイルエラーになる記法 思いっきりメモリーリークして実行時に大暴走する悪寒しかしない。 >>101
そうだよ
だけど一部の(まずいことに大手の)コンパイラが
左辺値としての用法を古くから許していた >>98
俺は初見ではcはcharのまま代入されて代入後の値がintとして評価されると見たんだが >>102
Cは95のコードを書く池沼は死んでよし、って言語なんだよ。
だからそんなのは問題にもならない。
94はよく見るが、95は見たこと無いぞ。 若造が見たことないのは仕方ないよ
活発に議論されていたのがC89制定を目指していた頃のことだから >>84,87,91,95 の流れがよくわからん
const <type> *p = ... が <type> const *p = ... と等価となる理由が例外ではなく
p を左辺値と解釈する隙間があるから ってこと? >>107
例外じゃないって立場は俺しか居ないのか?
その場合、お前らはこれを整合性よく説明できない馬鹿共だということになるが、それで良いか?
逆に考えてみろ。
君がそれを「例外」だとしているのなら、つまり「例外」でなければ君は
const <type> *p = ... // (A)
<type> const *p = ... // (B)
で意味が違うべきだというわけだ。
その場合、それぞれどういう意味と捉えるべきだと考えるのか、言えるか? 少なくとも俺は そういうもんだと覚えてるだけで説明はできない こんなの決め事なんだからもしそう言うのがあったとしても
> その場合、それぞれどういう意味と捉えるべきだと考えるのか、言えるか?
は、作った奴に聞くしかないだろ 例外でもなんでもなく、単にC言語の標準規格がそうなっているからとしか言いようがないけどな。
宣言指定子 (declaration specifier) は以下の3要素から構成されている (順不同)。
・記憶クラス指定子 (storage class specifier) : auto, register, static, extern, typedef
・型指定子 (type specifier) : void, char, short, int, long, float, double, signed, unsigned, struct/union指定子, enum指定子、typedef名
・型修飾子 (type qualifier) : const, volatile
ポインタ宣言子 (pointer) は以下の2要素から構成されている。
・*
・型修飾子 (type qualifier) リスト
いろいろ省略してるので細部は不正確かもしれないがC89ではだいたいこんな感じ。
参考: C11のYacc文法 http://www.quut.com/c/ANSI-C-grammar-y.html
で、なぜそうなっているかを自分流に解釈して自分の中で整合性を取るのはいいけど、それを他人に押しつけるなってことだね。 ちゃんと理詰めで理解できるやつもいれば
暗記するしかないやつもいる
世の中、人それぞれだな >>113
別に太陽が地球の周りを公転していると解釈してもいいんですよ?
結果さえ合っていればね。
ただその自分流の解釈を他人に講釈したら恥をかきますよって話。 >>113
> ちゃんと理詰めで理解できるやつもいれば
アホなの?
理詰めで説明できると言うならして見せろよ 「 ̄ `ヽ、 ______
L -‐ '´  ̄ `ヽ- 、 〉
/ ヽ\ /
// / / ヽヽ ヽ〈
ヽ、レ! { ム-t ハ li 、 i i }ト、
ハN | lヽ八l ヽjハVヽ、i j/ l !
/ハ. l ヽk== , r= 、ノルl lL」
ヽN、ハ l ┌‐┐ ゙l ノl l
ヽトjヽ、 ヽ_ノ ノ//レ′
r777777777tノ` ー r ´フ/′
j´ニゝ l|ヽ _/`\
〈 ‐ 知ってるが lト、 / 〃ゝ、
〈、ネ.. .lF V=="/ イl.
ト |お前の態度が とニヽ二/ l
ヽ.|l 〈ー- ! `ヽ. l
|l気に入らない lトニ、_ノ ヾ、!
|l__________l| \ ソ 無知なやつには
恥をかかせるよりも
教えないことが最も堪えるからな 何を教えるつもりなんだろう...
俺が思う正解は>>111に書いてあるんだが w 悪党の泣き声は言い響きだ
何を教えるつもりなのか聞き出したいんだなあwww どうせなにも出てこないのは既にわかってる
って>>115みりゃわかると思うんだが w 正直なところ
const int x
と
int const x
は同等、
というのは、決め事でいいと思うよ、何もかも原理原則で理解できる(までに細かくパースできる)人にはどうでもいいのかもしれないが。
‥えっと、細かい人にとって、この場合どうでもいいのか、どうでもよくないのか、どっちだったっけ?? 同等も何も、修飾する主体が変数だけなんだから、何をどう変えろと?
対象がポインタなのかポインタの内容なのかって話に意味の無い例を挙げてどうしたいんだ? >>116
>>125
禿同
というかいい加減、知らない奴が煽るとか止めろよドアホ共。それは長期的にスレを毀損する。
なお、俺は知っている奴が馬鹿を糞味噌に貶すのを止めはしない。
馬鹿なこと言わなきゃいいだけだし、
逆に、これが出来ないのがID制フォーラムが腐る原因だと思っているから。
ヒントは既に書いたし、それ以前にC流の文法解釈をすれば特段不自然でもないし。
「例外」だと言いつつ(A)≠(B)を妥当とする根拠もないのはただの自己矛盾だと気付け。
そしてK&RはCの作者によって書かれているんだが、それも知らないのか?
Cしかなかった昔ならともかく、今お前らみたいな馬鹿がCやる理由は無いと思うんだがなぁ。 >>126
で、K&Rのどの記述からconstに関する解釈(constの右側の固まり全体が定数と見なされる)を読み取ったの? K&Rにconstはねえな
constの設計は髭と禿の合作だが >>128
ここに来て堂々と嘘をつくとか、お前も死んだ方がいいな。
K&Rが手元にあるのなら、目次見てみろよ。 煽ることしかできないアホ ⇒ ID:u4QX+fVn0, ID:8LuLzpAV0 constがないK&Rが本のことだと思ったアフォはもう死んじまったのか? 家のは、4-320-02145-2だけど、constは無いな プログラミング言語Cの第2版(白本)は初版(緑本)と違ってANSI規格準拠
型修飾子や型指定子の項目にconstは存在する
というかconstとvolatileはANSI標準で新設されたものと明言されてる
一般には同一著者なので第2版まで含めてK&R本と呼ばれているから紛らわしい 緑は初版じゃ無いよ。
初版は白。だから紛らわしいの。 あ、そうか
第2版の翻訳訂正前の表紙が緑だったっけ?
現在発売中のものの表紙は白だよ
https://www.amazon.co.jp/dp/4320026926 プレンティスホール版で言う所の「ANSI DRAFT」の斜線入り
に相当する版が緑色だったかと。
4.xBSDやOS-9がこの前の版のCなので、未だに残っているんでしょうね >>141
そう言えば最後にK&Rスタイルで書いたのはOS/9-68Kだったな
もう25年ぐらい前の話だが ゴガギーン
ドッカン
m ドッカン
=====) )) ☆
∧_∧ | | / / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( )| |_____ ∧_∧ < おらっ!出てこいOgju
「 ⌒ ̄ | | || (´Д` ) \___________
| /  ̄ | |/ 「 \
| | | | || || /\\
| | | | | へ//| | | |
| | | ロ|ロ |/,へ \| | | |
| ∧ | | | |/ \ / ( )
| | | |〈 | | | |
/ / / / | / | 〈| | |
/ / / / | | || | |
/ / / / =-----=-------- | | openじゃなくてfopenみたいに、ファイルの存在確認のaccess関数に
対応するちょっと上位の標準関数ってある? >>147
stat()とfstat()なんかどうだ?
まあでもopen(), fopen()の関係とは違うけどな。
open()はシステムコールだがfopen()はライブラリ関数だ。
(UNIX系OSの話ではあるが)。 俺の希望は、たいしたやりたくもないけど、
ちょっとやってみたら?とか丁寧に教えるからやってみなよ!
とかさ、そういう感じで優しく接してもらってだな、で、出来も悪いからなかなか覚えないけどそれでも教える側が知恵を絞ってどうにかうまく理解させる方法はないだろうかと創意工夫して育てる環境というのかな。とにかく頼むよまじ >>148
stdio.hにaccess()の偉いやつあるのかなー と思ったのだよ
無いならまあいいけど >>149
授業料ももらってないのに優しく教える理由なんかないわな
5chなんて煽り合いと罵り合いの場だよ >>149
日本語でおk
そして死ね
> 出来も悪いからなかなか覚えないけど
なら覚えるまで何度でも読み返せ
> 教える側が知恵を絞ってどうにかうまく理解させる方法はないだろうかと創意工夫して
教わる側が1mmも努力せず、教える側に全責任をなすりつけるのは典型的ゆとり。死ね。
というかな、はっきり言えば昔より格段に環境は良くなっている。
当然教える側のノウハウも蓄積されてるし、
本も大量に出版され、良書以外は淘汰されてるし、
Webにも情報があふれ、ここみたいな掲示板やフォーラムもあるし、
無料でIDEも使えるし。
だから昔の環境で手こずった奴も、今なら楽勝で学んでいける。
問題は、昔だったら(=IDE無しでは)お話にならない馬鹿にもプログラミングさせようとしていることであって、
俺はこれに関してはもう諦めた方がいい=手取り足取り教えないと出来ない奴は死ねでいい、と思っている。
自分の為に他人に無償の努力を強いるその姿勢が根本的に間違っている。
つかマジで、ゆとりのノリでやりたいなら、C以外のゆとり用言語を使え。Javaとか。新しいのならGoとか。
そしてこれとは別に、俺は2chとは別の掲示板を立ち上げようとしているのだが、
君はこれについて興味あるか?
追える限りでの発言を確認したが、君は煽るだけの無能ではないらしい。
俺は今の2chのシステムでは行けるところまで行っている(既に飽和している)と見ているから、
これ以上の物を求めるのなら何かしら新しい機能が必要だと考えている。
今はそれのアイデア出し中だ。何かあれば是非。 漠然とした質問で失礼します。
私は最近c言語の勉強を始めたところでギリギリポインタ等も理解できたところです。
そこで、アルゴリズムとデータ構造の勉強をしようと思い本を何冊か買ってきたのですが、
スタックなどのデータ構造の仕組みがよくわかりません。。
どの参考書でも、「スタックとは後入れ先出しで…」という説明の後、「それではc言語でスタックを
実装してみましょう」といって意味不明なコード(長い)が書かれているパターンが王道のようです。
このパターンは線形リストとかでも同じです(諸兄にはいうまでもないでしょうが…)。
どのような実益があってこのようなデータ構造を生成する必要があるのでしょうか。
python等でいうところのリストに相当するデータ構造をc言語で作成するためということ?
また、実際のプログラムにおいては、データ構造の定義だけでかなりコード長くなると思われるのですが、
よく利用される手法なのでしょうか。 >>153
std::stack相当の話?
なら大して使わないから、とりあえず読み飛ばしていい。
つか、最初から全部キッチリ理解しようとせず、
まずは分かる範囲で組み、その後、自分の出来る範囲を広げていくようにした方がいい。
(1度読んで全部理解して捨てる、ではなく、最初から5回読む前提で分かるところから読み進める)
そのうち、stackを使うべき用途に遭遇したら、なるほどと理解できるようになる。 >>153
直近のご要望としては、スタックの使い所を知りたいって事かな?
ほとんどの実行環境において、C言語の関数呼び出しなんかの実現に使われてるよ。
呼び出した側の状態を保存する場合にpush、呼び出され側から戻るときにpop的な。 >>153
どのような実益?そうだなあ。スタックといえば以前PerlでXMLの階層構造を
SAX使ってRDBに全て入れる時に使ったなあ。まあ、それだけでなく先入先出に
するとやりやすくなる処理はあるよ。再起処理でも使われるし(スタックに積まれて
いるとあまり意識する必要ないかもしれないが)。
リストは例えば長さが可変長のファイルからデータ取得してメモリ上に置いておく
時に使えるかな。
まあしかしライブラリにあるならそれ使った方が楽だよ。毎回書くのは阿保らしい。 >>156
とりあえずソートアルゴリズムのが理解したいと思い勉強をしていたのですが、複雑なものになってくると
各種データ構造の理解が必須!みたいになってきまして、データ構造の方にも手を出したみたわけです。
ヒープとかの方が簡単そうな気がしますし、とりあえずスタック関連は後回しにします。
>>157
はい、なんかそのようなことも本に書いてあったのです。
しかしこれが、「スタックとはプログラミング言語内においても既に設計されている基本構造なのだ。以上終わり。」
であれば、スッキリするのですが、
「それでは、これをc言語で実装してみましょう」といって、スタックをc言語のプログラムで作り出すことの意義
が今一つわからないというか。 >>150
filenoとfdopen覚えた方が楽だけどね >>159
難しすぎます!
おそらく当分使えるようにはならなさそうです! >>160
> とりあえずソートアルゴリズムのが理解したいと思い勉強をしていたのですが
アルゴリズムとデータ構造をソートで学ぶのは昔流で、今はそれをこの段階でやる必要はない。
今はとりあえず次の章に行ってしまって、for/while/if等を使いこなせるようになった方がいい。
> 「それでは、これをc言語で実装してみましょう」といって、スタックをc言語のプログラムで作り出すことの意義
仕様を説明する必要がないからだよ。
「じゃんけんゲームを作ってみましょう」なら仕様は大体分かり、説明が省ける。
「オレオレゲームを作ってみましょう」なら、「オレオレゲームとか何か」から詳しく正確に説明しないといけない。
その本は「スタックとは何か」を当然知っているという前提で書かれているんだよ。
Cプログラマがスタック構造を知らないというのもあり得ないからね。
ただ、スタック知らなくてもプログラムなんて組めるし、実際Web系の連中は知らんと思う。
とはいえこれが一方的に悪い訳でもなくて、逆に言えば、
スタック構造を知っていることがプログラミングの本質ではない、ということなんだよ。
だから君みたいな初心者は、分からないところは飛ばして分かるところから読み進めればいいんだよ。
というか、今、君のレベルの初心者がCから始める意味は無いし、
無駄に遠回りになるだけだが、それ分かってやってるか? >>160
ハノイの塔のパズルを解くプログラムを書いてみて。
スタックを使う場合と使わない場合の2パターン描いてみて。
で、どちらが少ない行数で書けるか、どちらが実行速度が速いか、
どちらが理解しやすい美しいコードか、さまざまな観点で比較してみて。 >>153
と思ったが、Pythonに言及しているところからすると、既にPythonを使いこなせるのか?
だとすると、「アルゴリズムとデータ構造」をガッツリやる意味はある。
スタックが何故使われるかと言えば、スタックで対応できる場合に最速だからだよ。
だからCは実行方式からしてスタックべったりだ。
逆に言えば、それくらいしかメリットないし、
通常の配列にメソッド生やしてスタックにするのも簡単だから、他言語では大体そうしてるでしょ。
以下見れば分かるが、
https://cpprefjp.github.io/reference.html
Pythonのリストに当たる物は
array, deque, forward_list, list, queue, stack, vector の7種類あり、
Cはこれらを使い分けて最速コードを得る為の言語なんだよ。
勿論それ以外の物が良ければ自作しろ、という文化だし。
逆に、Python等は、グダグダ考えずに全部リストでやれ、それの方が分かりやすいし、という文化だろ。 >>165
ほうほう。ありがとうございます。
かなり難しそうですがやってみます。
>>166
スプリクト言語の方が簡単、pythonやrubyでプログラミングというものをはじめましたが、そもそも詳しい人だけが
簡単に思えるだけで、基礎的知識なしでは相当にきついんでないの?と感じてcを始めました。
というわけでpythonが使いこなせるということはありません。
cに関しては教科書一通り一周して、とにかく制御をマスターしたかったので制御文を使いまくるであろうソートアルゴリズムに手を付けたんです。
制御文もアルゴリズムも理解できたら一石二鳥かなと思って。
「定本cプログラマのためのアルゴリズム〜」に「リスト」の説明があり、
・要素の挿入 ・要素の削除 ・要素の読み書き ・探索
・複数のリストをまとめる ・リストの分割 ・リストの複製 ・要素の数を求める
とあり、「あら、pythonのリストと全く同じ構造だ」とおどろいたわけです。
cはとりあえずarray, deque, forward_list, list, queue, stack, vectorといったものを「なんとかして」pythonのリストやまた
それ以外のデータ構造を自分で作成するということですか。 どうでもいいけどプログラミングなんて10年後オワコンじゃない?
コード共有サイト行けば書きたかったコード見つかるしコピペすればおk
世界で既に誰かが書いてるもの二回三回書く必要性はない
この流れが自動化されれば終わるだろうな >>168
1から1000 までを全部掛けた答えを出す共有サイトのコードを見せてください >>169
なに言ってんだこいつ
調べれば1000000億%出るから自分で調べろよ
まさかgithubも使ったことないのかい? >>167
> cはとりあえずarray, deque, forward_list, list, queue, stack, vectorといったものを「なんとかして」pythonのリストやまた
> それ以外のデータ構造を自分で作成するということですか。
違う。
Pythonのリストというのは抽象データ型で、要するに「万能」に作ってある。
この方がソースコードは分かりやすいから。(知識が少なくても読める)
逆に、「万能」なら限界ぎりぎりの速度を追求できないから、
Cでは別々にして使い分けろ、必要なら自作しろ、ということ。
> スプリクト言語の方が簡単、
これは実際にそう。
pythonやrubyでプログラミングというものをはじめましたが、
これも正しい。
> そもそも詳しい人だけが簡単に思えるだけで、
> 基礎的知識なしでは相当にきついんでないの?と感じてcを始めました。
ここはちょっと違う。
要するに、「動けばいい」プログラムでCを使う意味なんて無いんだよ。
逆に、最速のコードが欲しいときにはC/C++以外に現実的な選択肢はない。
だからほとんどのOS/ブラウザ/処理系(PythonやRubyも)はCで出来ているし、
Cが基礎だっていうのも間違いではないんだが、
プログラミングにCの知識が必要かというと、そうでもないんだよ。
Python/Rubyで済むのなら、Python/Rubyで済ませるべきであってね。
そして初心者はまず、「動けばいい」からスタートすべきであって、
それ以外に色々知識が必要なCはズブの初心者向きではないんだよ。
ただまあ、話を聞く限り、君が「アルゴリズムとデータ構造」をやるのは悪くはない。
とはいえ、現実的にソートのアルゴリズム知ってても大して意味はないし、
直接目標に向かった方がいいと思うが。
例えば、ゲームを作りたいのなら、何でもいいからとりあえず動くゲームを作ってみろ、ということ。
どうせこの最中にいろいろな問題にぶち当たることになるから。 一応付け加えておくと、
Pythonのリストは、C++で言う array, deque, forward_list, list, queue, stack, vector のどの用途にも使える。
でもその分遅いし、メモリも食う。
Pythonを使うというのは、これを認めて、楽さを取る、ということ。
逆に、最高速度で動かしたい、メモリを無駄に食うのは嫌だ、となると、
リストの実際の使われ方を確認して、最も適切なものを選べ、
或いはさらにチューニングできるのなら自作しろ、となるのがC。
だから、組み合わせて作るのではなく、使い分ける。 例えて言った方がいいかな?
Pythonのリストは「車」という解像度しかないのに対し、
Cでは、「軽、軽トラ、普通車、バス、トラック」が指定できるようなもの。
「車」で済むのならPython使っとけ、だし、初心者はこれで問題ない。
細かくチューニングしたいからそれ以上の解像度が必要だ、というときにだけCが必要で、
逆に言えば、その気がないのならPython/Rubyで十分だと思うし、そうするべきだとも思う。
Cは実行速度は最速だが、開発速度は最速ではないので。 なお、人工知能にはPython使う模様
cさん...w Pythonでも速度求めるんならスタック・キューはlistじゃなくてcollections.deque使うやろ >>174
py なのはインタフェースだけでしょ。 >>160
えっ?
データ構造を学んでるんでしょ?
その実装例がでてきたことに対して、実装する意義がわからないっておかしくない?
学習するためじゃないんかい…
車輪の再発明は無駄だけど、学習として車輪の作り方をトレースするのは有益。
とちょっと斜め上の視点をとってみた。 今からお前らが書いてるコードが全て車輪だってことなんだよなぁ... 2chにいる時点で端くれプログラマーなんだし世界で既に書かれたコードしか書いてないでしょ...() >>179
おまえさんは何かコードを書く前に
それを誰が書いたのか調べてクレクレしに行くのか?
すげー嫌われ者だろうな >>180
これは無能確定
何回も同じコードを書くのかい? 同じ仕様を満たすコードを何人もが独自に書くプロジェクトなんて、沢山あるだろw
誤ったオブジェクト指向の解釈が蔓延した弊害でなw 自分でコード書かないと npm left-pad みたいな問題が起きる
ブラックボックス的に使う部分と内製化する部分はきっちり区別して
内製部分はすべてのコードを完璧に把握しておくべきだ >>185
そりゃコードは把握すべきだよ
けど基本全部他かりゃ引っ張ってくりゃ解決するんだよなプログラムなんざ
プログラマーを神格化する風潮やめようぜ 知恵遅れでポインタすらも分からずギャーギャーわめいてるアホがコイツなんじゃねえの
ttps://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10184535725 >>189
確認したが、同意する。
質問/回答一覧できるのに、酷いな。 いやしかし、ひどい質問だなw
プログラムどころかアルゴリズムの時点で特許がどうの騒ぐ時代なのに、プログラムを全世界で共有とか頭悪すぎる。 部分的にはライブラリの配布みたいな感じで出来てはいるけどな。 正直車輪の再開発なんていってたら商売成り立たないよな
ほかの人に見せて第三者がそのコード使ったら普通に嫌だと思うんだけどコードの共有化とか利益と競争を考えてない綺麗事じゃないか?
コード使い回しなんて実際問題、会社内ぐらいでしかやらんだろ むしろ乖離問題で使わせてない。つか使わせたくないってのが本音。
資産だけど公開した途端にむしろ負の資産になる。 GNU汚染問題もあるし出所の怪しいコードをやたらとホイホイ取り込めないよな ライセンス絡みは面倒だから出来るだけ自分で書くのが一番いい 何も見ないで独自に作ってもある日サブマリン特許にやられたりする あれひでえよな
産みの苦しみを報うはずの制度が
産みの苦しみを突然否定しに来る
たった1人を報うために大勢が犠牲になる ソフト特許権絡みの問題なんて余程優れたアルゴリズムを実現でもしない限り発生しないだろ
少なくとも車輪の再発明レベルでは問題が起きようがない
ライセンス関係の問題の殆どは著作権絡みであって特許権の問題ではない 卑怯なことは一切せずに作ったオリジナルなものを
突然パクり呼ばわりされるんだぜ?
開発者としてこれ以上の侮辱があるかよ
いつそうなるかの予測もほぼ不可能だし
それで金よこせってまるで強盗かヤクザの集金だろうが >>202
そこまで言うなら自分で先に特許出願でも何でもして防衛しろよ
仮にパクリ呼ばわりされても先願が認められれば拒絶の申し立ても出来るだろ 自分で発明したものを後から特許とられて…って話でなければ
先に出願しとけってのは無茶、というか超時空理論だわな。
「サブマリン特許で攻められるのが嫌なら
何か作る前に全ての特許を調べておけ」という主張には、
「皆がそんな調査をする必要がある社会では何も生み出せないだろう」
という意見を出したいね。 いやいや製品開発では商品企画段階で先行技術調査はやってて当たり前のことだぞ
後で他社から特許侵害の訴えを受けると面倒くさいことになる
というか大手メーカの組み込みソフト技術者は、技術レポート作成や特許出願の年間ノルマが課せられることも多い
例え特許として特許庁に認められなくても出願したという実績さえあれば先行技術として認められる
サブマリン特許といえども既に世の中に公知されている先行技術のあるものに対して実施料を請求することは出来ない
米国はサブマリン特許に見られるように特許を攻撃戦略をとすることが多いが、日本企業の場合は防衛が特許戦略の中心とする傾向が強い 話が脱線気味だけど、特にソフトウェアに限って言えば余程のことがない限りコードの中身そのものが問題になることは少ない
ただし製品の制御方法についてはソフトが問題になることはある
例えば、炊飯器のご飯の炊き方や洗濯機の攪拌方法やエアコンの運転方法など、これらは特許(パテント)の出来損ないのペテントで
そのノウハウはがっちり固められてるし、下手すりゃ権利の侵害問題に発展することもある
ただし繰り返しになるけど、純粋なコードの権利については特許というよりは著作権の方が問題になることが多い そういえばMSもLinuxが特許侵害してるって言ってandroid使ってるスマホメーカーから金受け取ってんだよな。
技術的にはたいしたものではないらしいが。 プログラミングあんま知らんけどコードって著作権あるの?
俺普通に本とかの模写しまくってるんだけど...
もちろん勉学目的で商用してるわけじゃないけど大丈夫だよな...? 特許に必要なのは、新規性と独創性と再現性
技術的に高度でも既に知られているものは特許にはならない
技術的にたいしたものでなくても今まで誰も考えつかなかったものは特許になる
ソフトウェアでも既に知られているアルゴリズムでは特許にならない
全く新しい理論に基づくアルゴリズムを実現すれば特許になる >>210
個人利用の範囲で商用利用しなければ問題ない >>204
そこまで言うならって
俺は何か間違ったことや行き過ぎたことを言っているか? サブマリン特許は公開されてないから、「サブマリン」なんだが
それを誰が調べるの? >>217
それ昔の話
今は出願から一定期間経過したら公開されるし特許の権利期間も出願からの期間となってるからサブマリン特許はほとんどないよ >>219
これはプログラミングの話じゃなくてお前の日本語読解能力の問題。
13-3 の問題文にモロにヒントが書かれてる。 既にある連結リストにはqsortは使えない(これは常人でも考えれば分かる)
後からどうしてもソートしたいならマージソートを使う(これは常人がすぐに思い付くモンじゃないので知らないと出来ない、つまりは考えても無駄) >>210,212
著作権は商用かどうかは無関係。
個人で楽しむなどの目的で例外的に複製が認められるだけ。
もちろん勉強用なら複製は構わない。
それ以上の利用は本に明示してあることもある。 >>221
「だよねぇ」じゃなくて「13-3の3行目ですかねぇ」だろ。 ここで言っているコピーって、書籍に掲載されているロジックをそのまま借用するって事だよね >>219
「以下のプログラムの (1) (2) の部分を作成し」の「(1) (2) の部分」が見つからない >>226
ヒント:exit(1) の「(1)」のところかな?
言いたいことは分かるけど、まぁ…ね。 >>219
というか、これ学校の宿題レポートで先生が作った問題じゃないの?
こんな場でまるまる公開して教えてくれ、って大丈夫なのか。 >>219見てちょっと考えてみたけど、
初回だけ(topが未設定の場合だけ)場合分けで例外的な処理がいるの?
あと、大小で判定して挿入するとき、先頭もしくは末尾だけは例外的な処理がいるの?
かっこよくスマートに書けるやりかた教えて! 連結リストで検索すればお手本は大量に出てくる
この改まった場で今更説明するほどのものでもない >>234
なんも見ずに書いてみたけど(コンパイルもしてないけど)
片方向リストにしたらこんな感じかなあ
見た感じスマートじゃないからたぶん無駄なことしてるんだろうけど
// 打席数、安打数は省略
typedef struct PLAYER_tag PLAYER;
struct PLAYER_tag {
char name[20];
PLAYER *next;
};
int main() {
PLAYER *top; // 先頭の要素
PLAYER *p; // 追加する要素
PLAYER *q; // 現在の要素
PLAYER *z; // 一つ前の要素
(省略)
top = NULL;
while (EOFでない) {
// 1行読み込んで名前(name)、打席数、安打数を取得
(省略)
malloc(p, sizeof(struct PLAYER));
memset(p, 0, sizeof(struct PLAYER));
strcpy(p->name, name);
// topが未設定の場合だけは例外的な処理
if(top == NULL) {
// 先頭に挿入
top = p;
} else {
q = top;
z = NULL;
// リストの先頭から順に走査
while (q != NULL) {
// アルファベット順が大きい要素の直前に挿入
if (strcmp(p->name, q->name) < 0) {
if (z != NULL) z->next = p;
p->next = q;
break;
}
z = q;
q = q->next;
}
// 末尾に挿入するときだけは例外処理
if ((p->next == NULL) && (z != NULL)) z->next = p;
(省略) >>235
先頭に挿入した場合の例外的な処理も必要だった
if (z != NULL) z->next = p;
↓
if (z != NULL) {
z->next = p;
} else {
top = p;
} >>235
>struct PLAYER
PLAYER
の誤りだった とりあえず、実際にはリストとデータは分けた方がいいよね。
あと、リストのtopも実体にしたほうが、いい予感。 割とマジでvolatileって何に使うんだ。。。? >>239
volatile は揮発性のものってことで、読んだ次の瞬間に値が変わっている可能性がある変数に付けとくやつだ。
その変数は実際にはハードウェアによって変化するものに結びついているかも知れないし、他のプロセスや
スレッドによって書き換えられるものかも知れない。とにかくそのプログラムのメインの流れとは無関係に
変化する可能性があるということ。だから読む場合は必ずその変数の内容が読まれるようにコンパイルされる
必要がある。最適化してさっきから変更してないからレジスタに入ってる内容で代用しようみたいなコードに
なってはいけないわけだ。volatile を付けておくとそういう最適化をしなくなる。 >>239
知らないほうが幸せだよ
本当に必要なプロジェクトなら、過去に誰かがよく分からん不具合に何日・何週間も悩まされた末にコーディングルールに追加されてるから >>239
UARTのFIFOレジスタとかに使う。
ハードウェアを直接叩かなければ普通は要らない。 >>235
やっぱアセンブララッパー言語はゴミコードだな setjmp(), longjmp() 使う時も volatile 使わねばならない時がある。
https://www.jpcert.or.jp/sc-rules/c-msc22-c.html
ま、longjmp() 使うこと自体が稀だろうとは思うが。 長いことやってるがsetjump,longjump見たことない。 >>244
マルチスレッドとか使ったことないのか? longjmpはC++の例外のクソさに耐えきれなくなったときに使う >>249
普通は同期用の専用オブジェクト(mutex とか semaphoe とか)を使っておくね、それでいいよね… >>249
そのサンプルコード、ハンドシェークしてるんだが、そもそも普通これしないよな?
並列させたいだけなら、普通はシグナル(sleep/wake up)で同期させる。それの方が軽いはずだし。
スピンロックでハンドシェークって、完全非同期で独立動作してるときだが、
あまり用途は無いと思うんだが。 例えば、スイッチを入れると割り込みが入ってループから抜け出すプログラムとかでループ制御フラグをvolatileにする。 vbaを扱えるようになったんで次にC言語触ってみようと思うんですが、どう勉強してったらいいですか?これ作ればあらかた基礎コードや仕組みが学べるものってあります?
やることによるんだろうけど、例えばテトリス作れば基礎が固まるとか。ネット検索しても今一ピンとこなくて。
おすすめの参考書とかもあれば教えてください。 >>259
せっかくvba憶えたんならマシン語から入ってみては?
https://pf-j.桜.ne.jp/program/tips/vbasm.htm
ちな俺はBASIC->マシン語->Cで憶えたクチで
マシン語が透けて見えるCの特徴をありありと感じながら使えて
多重レベルポインタの**を全く悩まずにすんなり習得できた >>259
コマンドラインで使えるミニツール(dirなど)を真似て作ってみたら?
標準入出力、ファイルアクセス、データ編集の基礎が身につくと思う。 dirはファイルアクセスせんだろ
ファイルシステムに問い合わせをするだけで ディレクトリも一応ファイルと言えばファイルなわけで・・・ openもcloseもせんしデータ構造を理解してseekする必要もない >>259
Small-Cっていう C言語のサブセットがあって、
そのコンパイラを作るって本があったよ。
オレはこれで C言語の基礎を勉強した。
30年くらい前かな?
たぶん絶版で入手困難だと思う。
あと、アンドリュータネンバウム先生のMINIXオペレーティングシステムも勉強になる。
Linuxを作ったリーナストーバルズもアンドリュータネンバウム先生の教え子だったはず。 ディスクの挙動が知りたければ、Read Diagnostic だな 初心者は結城浩先生の
新版C言語プログラミングレッスン-入門編-
あたりで学習しときなyo! >>266
コンパイラつーか構文解析は何年たっても勉強する気が起きないわ
ほんと大変そうなんだもん プログラミング初心者なんだけどコマンドプロンプトとかの知識って必要なん?
一応簡単なバッチファイル作れるレベルまでは来たんだけど バッチファイルが作れるレベルでコマンドプロンプトの知識が必要かどうかがわからんとかあり得るのか... >>271
IDE build に頼らないで make する必要があるのなら
バッチファイルを作れる程度なら十分 >>271
君にとって必要かどうかは君がこれから何をするかによって変わる。 ファイルのIOの部分難解すぎて意味がわからない。
・文字列を処理したいのにchar型とかint型とか byte型とか
出て来るしtry catchとかIOExceptionとか何なのかがよくわからない。
・なんとかOutputStreamとか なんとかReader Writerが
おおすぎてどれを使っていいかわからない。
・オブジェクトを生成して別のコンストラクタの引数に渡している部分が
何をしているのかさっぱりわからない。
・BufferedReader / Writerとかを使う必要があるのかないのかよくわからない。
・結局文字列を読み書きするのとバイトを読み書きするのが何が違いがあるの?
・for(item : list){}文は使えないの? すみません、Javaのスレに書こうとして間違えました fwprintf(stdout,L"日本語");
4回に1回くらい文字欠けするんだが... fflush入れてみろ
もしくはsetvbufでバッファーサイズを0に プログラミング全く関係ねぇんだけど
組み込み系のプログラマーって電子制御とか電子回路、機械工学の知識必要ないん?
これ絶対プログラミングだけの知識で食っていける分野じゃねぇだろ 必要ないわけ無いじゃんw
何でそんな勘違いにたどり着いたしw >>281
やっぱそうなん?
あほらし
じゃあ組み込みc言語の本全部捨てよ
あほくさ、そんなん全部学ぶとか無理無理
情報工学の二回生だけどやめやめ、ばーか Cは別に組み込み専用言語でもないんだし、勉強続けりゃ良いじゃん。 >>283
あほやなぁ...
組み込み系以外でc言語の案件なんかまともにねぇだろ
どっかでグラフ見たけどcの用途なんか限られまくってるし
素直にPython勉強して人工知能するわ
人工知能なら電子回路とか機械工学の知識必要なさそうだし 組み込みCもいずれは勘定系のCOBOLみたいにごく一握りの職人にしかメンテできない時代になるんかな >>285
ヒエ〜!
機械工学科と電子電気科でもプログラミングの授業に力を入れる運動が出て来てるし(メカニクス的な意味で)こわい
情報学科って生きていけるんやろうか
俺も今のうちに基本的な電子回路制御の知識はつけておくべきか
アルゴリズムとか通信系学んだところでなんの意味があるんだくそがっ! どうかなあ?少なくとも新しいデバイスのデバイスドライバはC使われ続けるんじゃないか?丸々全部アセンブラにするより楽だから。
その後の処理は何の言語でも良い。 あとやはりOSはまだまだC言語使われ続けると思う。UNIXやLinuxは根深いからな。
LinuxなんかAndroidのベースになっちゃったしそこらじゅうのネットワーク機器や家電に入っちゃったもんだからまだまだ思い切り使われ続けるだろう。 C が滅びることはないでしょうね、真っ先に移植されるのが C コンパイラだし
>>289
はい とりあえず電子電気工学とか機械工学科じゃ太刀打ちできない人工知能の研究室選ぶは...
やっぱ時代はアルゴリズムや! 人工知能の高速化にGPUとASICが必要になる時代にCから逃げられると思うなよ >>292
もちろんcとPythonはやるぜ!
Java、Rubyさんはポイッ!w
あとは線形代数とかの数学的知識も必要か...
夢を決めると頑張れるな プログラマーは鳥籠のようなものだ。
外にいる鳥たちはいたずらに中に入ろうとし、
中にいる鳥たちはいたずらに外に出ようともがく。 見聞を広げた方が、新しいアイデア浮かぶから、捨てるなんて馬鹿な選択するな。
むしろ全く関係無い分野の知識が思わぬアイデアを出してくれるのがこの業界。 >>289
そう。ソース公開されてるから見てみな。
所々アセンブラ使ってる所があったとは思うが大半がC言語。
これについてはUNIXも同じ。というかむしろOS作って配布しやすくするためにC言語作ったようなもの。
そうするとCPUが違っても移植が楽だからね。 >>295
それだけ根性ねえやつがなる職業ってことかねえ
俺の時代っちゃなんだけど、あの当時は大学に情報処理のコースなんかほとんどなくて
大人たちはみんなゲーム小僧の遊びの延長はメインフレームには関係ねえなんて
ぬかしてやがってて、それでも実際に大学のセンターと家のマイコンを触り比べて
一縷の勝ち目を感じるのを信じて大勝負に出たんだよ
でジジイたちにひと泡吹かせることにはいちおう成功した
今さら後悔なんかしてねえぜ ぜひ組み込みCを自らプログラミングできる人工知能を生み出して
このスレにいる前時代の遺物のおっさんどもをギャフンと言わせてほしい 情報工学だからこそっていう仕事ねぇのか?
組み込み系って
情報工学でもやっていけるんか結局?
機械工学、電気電子のやつより上にたてる?
あいつらよりは地位上でいたい
なんかムカつくから あくまで私見だけどね
ストレートに情報へ行ったやつより
遠回りしてきたやつのほうが
俺は個人的には期待しちゃうな
ストレートタイプにもすげえのいるけど
確率論的なやつで 情報工学って結局何ができるのかね?
プログラミングなんかやってる奴よりは
MATLABとか操ってる奴の方が格上だし
PowerPointとExcelしか触らない奴の方がさらに格上だわな >>302
情報専攻の奴が他分野と張り合うとしたら工学の領域では厳しい
情報工学としてではなく情報科学の方面で学会とかで研究成果を発表していく研究者としての方が
上の立場を狙いやすいと思う 電気電子では技術者、情報では研究者、立場的に主流となる流れが違う印象だね >>302
そもそもpythonがC言語で書かれてるから当分は心配しなくていい 日本じゃソフトはハードのおまけだからどの分野でも立場は上がらないよ。
人工知能も車とかその他製品の便利機能にすぎん。 士・農・工・商・メカ・エレ・ソフト
機構設計(メカ)、ハード設計(エレキ)、ソフトの順で、ソフト技術者は最底辺ではある >>303
なんか先輩で
機械工学から大学院で知能情報なんとか?に入った人いるって言ってたけどそういうタイプか
でもそういうのって役に立つ人材なのかね
機械工学と情報工学が交わることって一切ないし >>311
例えばだが、運動解析や流体解析などの人工知能を弄るような場合などは機械系の出身者の方が純粋培養の情報系よりは役に立つだろうな
工学の応用という点では情報だけでは潰しが効かない
何か秀でた専門分野を持っていれば強力な武器になる 俺は仕事で必要になるまでアクチュエータという言葉すら聞いたことがなかった
サチュレーションとかハンチングとかもしかり
結局、純粋な情報系なんて糞食らえってことだ C言語なら俺に聞け、って言われれも…
こいつら全然違う話ばっかしてんじゃんかよ。 最近の流行りで言えば、たぶんブロックチェーンは情報系。
他にはOSとかコンパイラとか人工知能そのものがたぶん情報系。
「情報系の成果を他の工学で使う」話をしてるのだったら、他の工学の知識の方が重要になるに決まってる。 いや俺は>>317は当たっていると思うぞ。
情報系はソフトウェアそのものにフォーカスしてる。
だから最終的にソフトウェアで完結する物については情報系でいい。
当たり前だが他知識がない分、ソフトウェア技術で上回っている必要がある。
(工学系他と同程度のソフトしか書けないのであれば、他知識がない分糞なだけ)
ブロックチェーン(P2P)/OS/コンパイラ/人工知能『そのもの』はソフトウェアで完結してる。
他は超並列とか、少し前ならクラウドや仮想化/ライブマイグレーションとか。 情報科学とソフトウェア工学が中途半端に混じり合った上に、計算機科学や電子工学と被る部分も大きく、訳わからんのがいわゆる情報工学という学問分野
技術の発展を基盤とする工学なのか、純粋理論を追求する科学なのかスッキリしない
個人的に情報系の学問の本質は数学や物理学などの科学に近いと考えているが、ソフトウェアだけに限れば工学的なアプローチも間違いとは言えない
ただ情報系がソフトウェアだけにフォーカスしたものと言うのは極論すぎる むしろこのご時世でプログラミングで食っていけるc言語プログラマーどこにいんの?
俺はweb系だしc言語詳しくないから友人の話だけど自動車のアンチロックブレーキシステムなんかの制御は自動車の知識をトップレベルで持つものにしかさわれないらしいな
c言語なんてweb系でもアプリ系でも使われてない以上むしろ機械系の人間専用みたいなとこあるんじゃないん やっぱWeb系は馬鹿だなとしか。
そういえばWeb系は情報系でも問題ないね。完全にソフトウェアでしかないし。
というかマジでWeb系は腹が立つほどレベルが低いから、
ちゃんと勉強した情報系の連中が押し寄せて、今のWeb系全員殺して欲しい。
C界隈にも分かるように言うと、「スクリプト言語しか出来ない奴をプログラマと呼ぶな」っての、偶にいるだろ。
あれよりさらに輪をかけて酷い感じ。 ・実は情報系人材以外のエンジニアにはオブジェクト指向や関数型は難し過ぎる
現代的?な言語の中でそこそこ簡単でそこそこ使えるのは実はCしかない
・機械語に変換して全て精査する場合は機械語に近い方がいいかもしれない
原発とかロケットとか製鉄所とかエアバスとか人工衛星とかいろいろ まあ C の言語仕様は比較的簡単な部類だと思いますしライブラリも貧弱だし >>323
まあ車の制御系は機能安全とかも要求されるからハードル高いわな
でも車でもボディ系(ワイパーとかパーウインドの制御とかいわゆる上半分のところ)はそこまで厳しくない
あと車じゃなくても家電製品とかプリンタとかカメラとかありとあらゆるものにソフトが入ってる時代だから組込屋って意外としぶとく生き残ってるよ web系ってばかではないでしょ
むしろ天才気質が多い プログラミングだけなら文系でもできる
ただC言語の中心である組み込み機器の制御系のプログラム設計/作成となると文系では荷が重い
制御プログラムの中身というか制御モデルは大量の連立微分方程式で記述される
機械系にしろ電気電子系にしろ制御理論にある程度精通していないと手も足も出ない
工学系技術者としての存在意義はC言語の文法に精通することではなくて、C言語(別に何の言語でもいいけど)でシステム設計/記述が出来る点にある
自分は電子系出身で専門はブラシレスモータのベクトル制御の分野
簡単に言えばハイブリッド自動車などの駆動モータ制御なんかで使われている技術のこと >>329
すまない、質問で悪いんだがプログラミングは会社に入ってから身につけた?
それと大学院卒? >>330
プログラムそのものは学生時代(高校)から趣味でやってたよ
最終学歴は普通の大卒 >>325
> ・実は情報系人材以外のエンジニアにはオブジェクト指向や関数型は難し過ぎる
そんな訳ない。それはお前が理解出来てないだけ。
そもそもオブジェクト指向自体が「複雑化するソフトウェアを『簡単にする』」為に生まれた物であって、
オブジェクト指向ではまだ足りない、というので『関数型』が持て囃された。
本来は、関数型>オブジェクト指向>それ以前、の順で簡単なんだよ。
だからレガシーCOBOL等には手をつけられない事態になっているわけでね。
(ただしオブジェクト指向も関数型も馬鹿(=意識高い系)が調子に乗って暴走しているが)
Cが組み込みに使われるのは、余分なことをせず、書いた通りに動くから。
組み込み分野が広がっているのは、機械式よりも電子式制御のほうが圧倒的に楽だから。
考えてみろよ、車のエンジンで燃費最適化でバルブの開閉/点火タイミングを調整したいとき、
電子式なら1usずつ振るのも楽勝だが、機械式だと死ねるだろ。
VWの排ガス不正なんて、機械式では絶対に無理だった話だぞ。 >>328
天才って言うか仕事が速くないとダメだからパッと理解できる能力は必要だな
こつこつ真面目にやるような奴は組込の方がまだ向いてる >>329
> 制御プログラムの中身というか制御モデルは大量の連立微分方程式で記述される
そんな狭い分野で語られても... 連立微分方程式ってc言語で解けるもんなんか
そうとう頭良くないと難しそうだな 何を制御したいかにもよりそう
変数が2つ以上あれば連立になるんでしょ 連立微分方程式を解くのはmatlabでやるんだろ
その結果を使って制御プログラムをCで実装する まぁ結論から言うとプログラミングが必要な技術者とかいないから安心しとけ
機械系とか電気系はプログラミング理解してるとむしろ馬鹿にされる
無駄な知識付けてるってことだから要領ないってことだし 結論から言うと、現代においてプログラミングが出来ない>>346みたいな奴は池沼以下だと気づけ。
だからこそ、小学校からプログラミング授業が必修化される。(個人的にはこれには反対だが)
あと10年もすると、「エ、マジ、キモーイ、プログラミングが出来なくていいのは、小学生までだよね」の世界がマジで来る。
そうなれば>>346は老害オブ老害だ。
だからこんなところを荒らしてるんじゃなくて、マジでプログラミングを勉強した方がいい。
Cである必要はないが。 制御での微分方程式は解くためのものじゃない
制御対象の挙動を単純化してモデル化するために使うんだよ
言い換えれば、物理現象をプログラムで扱えるようにするために数式に落とし込むための道具だよ
挙動を記述さえできればプログラムで制御することが出来る ついでに言うと微分方程式そのものは代数的に解くんじゃないよ
プログラム上で数値計算によって制御対象(モーター回転数など)がリアルタイムに目標値に追従するように制御量(電圧など)を制御するのが
狙いなので解そのものを求める必要はない >>340 とか>>345 とかが組み込みの制御プログラムを誤解しているようだったのでちょっと言ってみただけ >>347
なんだこいつ...
プログラミングを学ぶことは否定しないがそれが別の分野で役立つ
つまり専門的な分野+プログラミングが必要な人材っていうのは嘘
適材適所ってあんだろ、飛行機のパイロットが彦井の設計しますか?
飛行機の設計する人が飛行機内の電子回路制御担当しますか?
飛行機内の電子回路制御担当する人がマイコン系のプログラミング担当しますか?
しない、以上 プログラマについてだけは専業は限界があるんだよな。
別分野で使うツールを作る仕事だから、その分野の事を知らないとまともなインターフェースを提供出来ないからな。
そう言ういみではプログラマほど他業種との交流を大事にしないとならない職業なんだ。 そういった分野(業務系)ではC言語ではなくて他の言語使った方がいい気がするが… そう言った分野が業務系しか思い浮かばないのがこいつらの限界。 >>354
プログラミングって日本語とか英語とかで書いてある要件をC言語とかに翻訳する作業だから要件に対する知識とか要件を知ってる人との交流が重要なのは当たり前
政治家に同行する同時通訳者が政治の知識を持ってないと勤まらないとの似たようなもんだよ そしてAIが日本語とか英語をそのまま読んでプログラムを作らず、
人の要望に答える動作を自らするようになると。 おまえら暢気だなー
ほんっと金銭感覚が絶望的にアウトなやつら
AIが人の要望に応えるまでに
人力でやるべきことは無尽蔵とは言わんまでも
特需はごまんとあるわけで
それを指くわえて見送るのは
アンダードッグな精神構造がそうさせるんだろ
仕事ってそういうもんだぜ?
未来永劫食うに困らないなんて保証はねえんだよ
その時その時の社会情勢を見て自分にできることをやって
おまんまにありつくんだよ >>360
要望はあげられるけれど、それが要求と一致することは稀だよ。良い要求分析ができるAIはしばらく先だろうね。 >>354
同意
>>353
情報系の適所はITドカタだよ。(PCで完結するソフトウェア)
電気電子(製造業)や自動車(機械)に於いては電気電子/機械の知識が無いと話にならんだろ。
例のブランコは、
https://www.tamingdata.com/wp-content/uploads/2010/07/tree-swing-project-management-large.png
結局のところ、仕様が分からない奴同士で話を進めるからそうなるのであって、
仕様を決められる奴自身がプログラミングすれば解決するんだよ。
今のところプログラミングは文系馬鹿には難しすぎる、ってことでITドカタが担当しており、
仕様のすりあわせをもっと確実に、ってことになっているが、
そもそも発注元がプログラミング出来ればこんなことにはなりようも無いのさ。
(最大の問題は発注元が工数《どれくらい難しいか》を全く見積もれないこと。例:京都市)
だから小学生から全員にプログラミングを教え、これが成功した場合、この話はなくなる。
プログラミングを万人が出来る時代になろうとしているのさ。
だから情報系特化なら、常人の領域ではなく、達人になっていないとただのゴミだ。
「プログラミングが出来る」だけで食える時代ではなくなりつつある。ちゃんと認識しろ。
そしてソフトウェアインフラのほぼ全てをCが担当している現在の状況で、
C抜きで達人になれるはずも無いだろ。
情報系でPythonしか出来ません=おまえ=ゴミ確定だよ。
情報系の学生ならグダグダ言わずにCもやるしかないだろ。アホなのか?
逆に工学系で専門領域がPythonやMatlabで完結しているのならそれだけでいいが。
工学系にとってのプログラミングはあくまでもツールだからね。 DNS登録されてないようなURL貼って長文書かれても困るなぁ マ板でするような話を指摘されても延々と続けるような奴らが何を言おうと、まったく説得力がない。 荒れてるな
それではネタでも投下してみるか
単純な制御プログラムのサンプルとして物理現象を連立微分方程式としてどの様にプログラムに落とし込むかを示してみる
実際は目標値に対して追従するように入力項を加えるのだけど面倒くさいので省略
制御プログラムのサンプルと言いながら実は中身は単純なシミュレーションだけど大体こんな感じ
>>348,349で微分方程式の解そのものを求める必要はないといった意味は分かると思う
https://ideone.com/Od1fxj 微分方程式君がマウントしに来てるだけだからスルーしとけ 工学系のプログラミングの一面を示しただけだよ
業務系そのものを否定する気はない
スレに粘着してる情報工学の学生の参考にどうぞ
組み込みのC言語プログラムの理解の助けにでもなればいい >>368
そんなもん俺でもできるわ
何をドヤ顔で... 情報工学の学生は>>340 だからな
正直言うと既に手遅れな感じはしてる >>372
どうでもいいけど末尾6でガックシって大学内でのWi-Fi経由での書き込みやん
大学内Wi-Fiは監視されてるから2chに書き込まないほうがいいぞマジで
俺の大学は学籍番号登録して大学Wi-Fi繋ぐタイプだったがアプリとか落としまくってたらメールで呼び出しくらったわ
利用禁止だけで済んだけど どうやったらこんなつまんないレスを返せるんだよ...
重症やな w 大学当局が何の規制も監視もしていないことは自慢にはならないぞ
外部の違法サイトにも好き放題でアクセス出来てしまうって事は、
学内に不正侵入も招きかねない
学生の個人情報も流出しかねない大学だって言うことだろう スレ違いや板違いが100レス以上も続いてしまってるからそろそろこのスレ見るのを止める C言語勉強するにあたり相談です。
@スクールに通って学ぶ(170時間程度)
A3日間の会社主催のセミナー参加
B本、参考書等やネットで独学
Cその他
それぞれ理由とおすすめがあればお願いします! >>387
何のために勉強するかも書けよ
ってか会社主催のセミナーとか言ってるなら仕事か?
なら只だろうからそれからやれば? >>388
なにも知らないです。VBかじってる程度。
>>389
富士通のって結構いいですか? >>390
会社の命令ですね。
スクール通うより富士通とかのがためになるんですかね? >>392
会社の命令なら会社主催のセミナー行けよ
C言語の話以外にもその会社独自のやり方の説明もあるだろうし
それとは別に独学でも学びたいと言うならスクールでも本でもいいけど、なんか簡単なゲームでも作って色々ここで聞きまくるって言うのでいいんじゃね? いろいろとありがとうございました!
参考にさせてもらいます! Cのマクロでその場じゃないところに展開って出来ないかな?
VC++2008環境でVC++2017(C++11相当)のラムダを使いたいのだが、当然使えない。
そこで以下を参考にしてマクロで乗り切れないかと考えている。
http://koturn.hatenablog.com/entry/2013/08/06/223805
字句の置換は何とかなるとして、問題なのは「関数内関数定義」がない事。
だから手動でいいから関数の外側に展開させたい。具体的に言えば、以下。
void abssort(float* x, unsigned n) {
std::sort(x, x + n, [](float a, float b) {return (std::abs(a) < std::abs(b));});
}
を書き換えるとして、LAMBDAがマクロで、
// ここに出力する方法あるか?
void abssort(float* x, unsigned n) {
std::sort(x, x + n, LAMBDA(ホニャララ) );
}
// 或いはここでもいい
マクロ内で#defineしてプリプロセッサをもう一度くぐらせればいけそうな気がするが、これって無しだよな?
出力場所は手動、名前は手動マングリングで構わない。記述上ラムダを使いたい。
環境を上げるとしたらVS2017なので、そのときに書き換えがほぼ無しで済ませたいから。
delegateで書いてみたものの、やっぱり記述量が無駄に多いので、ラムダにしたい。 void abssortごと置き換える
C++詳しくないから知らんけど 関連質問しました。
http://mevius.2ch.net/test/read.cgi/tech/1413180800/138
VSにユーザ定義プリプロセッサを噛ませられればいけるのだけど、
知っている人がいたらよろしく。
>>396
それは無理。
実際はLAMBDAは大量にバラバラに使ってる。
というかそういう使い方しないと大してメリットないし。以下とか。
viod function(){
if (xx) x = LAMBDA( xxxx );
else if (yy) y = yyyy;
else z = LAMBDA( zzzz );
} 今使ってコンパイラがweakって宣言子があって、どうやらデフォルトの関数処理を書いておいて、後から同じ名前の関数でそのまま飛び先を上書いてくれる機能があるなぁ >>395
自己解決しました。
結局自前のスクリプトを作成したので、エレガントではありませんが。
知恵を絞ってくれた人はありがとう。
http://mevius.2ch.net/test/read.cgi/tech/1413180800/150 こんばんは
はじめて書き込みします。
入門書としてやさしいCをやり終えたのですが、今後やっていった方がいい本はどんなのがありますか? 今、何が出来るのか
これから、何がしたいのか
↑
による Cって何のためにやるの?組み込みしかなくね?そんなの極める必要ある?
C++やろうぜ >>405
>Cって何のためにやるの?
C++をやるため >>402
単純な数行のソースかいて、コンパイルしてコマンドプロンプトに出力するだけです。
>>403
何ですかそれ?
>>405
将来的にはやるつもりです。
ですがその前にDirectXでスーファミソフトの模擬展開してみたいとも思っとります ダイレクトエックス?テン?か知らないけどそれの本は? >>410
探してるんですけど、なかなか本やにないので ますますよく分からんが
少なくとも「その前に」ってレベルじゃねぇ >>412
自作ゲームを作るのが目的で、自分の性分として元祖からやっていきたいと思って、、、、
ファミコンの実機はパソコンx86とDirectXで作ったとかなんとか、、、、
要領が小さい横スクロールアクション(ロックマンの亜種)を作ってみたいのです。 >>413
実機って何を指してるか知らんけど
ファミコン(1983)、スーファミ(1990)に対してDirectX1.0は1995年発表だぞ
x86は流石にもっと古かった >>413
>ファミコンの実機はパソコンx86とDirectXで作ったとかなんとか、、、、
何処からそんなデマを聞いたんだ?
ファミコン実機の中身はx86どころか8bitCPU(6502ベースのカスタム品)だということ知ってる? >>413
ファミコンの発売は1983年でスーパーファミコンは1990年だ。
まだDirectXも何もない時代なんだけど、何のことを言っているのかな?
Windows上でのエミュレータの話? >>409
単純な数行のソース?
Hello worldでさえ6行もあるよな。。。 >>416
Vipでゲーム機の進化の話があ出たときに、スーファミの開発環境がDirectXだって書いてあった >>419
DirectXはその前身のGame SDKでさえWin95(1995年)と同時期にリリースされてる
スーパーファミコンの登場はそれより前のWin3.1(1992年)すら登場していない時期
まだMS-DOSの全盛期だよ、タイミング的に有り得ない >>152
遅くなったが、なかなか難しいがその難しさ含めアイデア次第でとても面白いな!
ツイやらインスタみたいのがもてはやされとるけどやっぱこういう反リアルタイムで半匿名性保持したものって必要なんだと思うし、2hは仰るとおりこのまま行くと5年後10年後にはホントの過疎化で存続危ういし、今からテコ入れして人の誘導図るのは大賛成!
よし、俺もC本気出してやるかw https://ideone.com/Jhbm7n
グラムシュミット計算して結果をそのまま出力するって課題が出て、一応出来はしたんだけど出力で変になったんだ
リンク先に書いてる奴が正しい出力で、最後のコメントみたいにすると違う結果が出てくる
具体的に言えばcmdで
「 f3 1.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 1.000」ってやると
「 1.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 1.000」が出力される(リンク先はコレ)はずなんだが
コメント通りにすると
「1.000 1.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000」になっちゃう
環境はVSCodeでコンパイラはVS2017のcl >>427
Cは複数の値を返却値として返すことはできない。関数の引数リスト以外で、カンマを書くとカンマ演算子として解釈される。 >>428
なるほど、ありがとう
カンマ演算子ってのを初めて知ったよ
>>429
41行目 >>428
構造体を型宣言して戻り値にすれば、複数の値を実体返し出来るけどね。 結局、質問者は問題点が何処にあるか理解できたのかな?
カンマ演算子の評価結果は、最後の式の評価結果だからね
余計なお世話かも知れないけど、どうしても結果を戻り値で返したい場合は構造体に纏めれば出来るよ
というか、ベクトル自体を配列ではなくて構造体に纏めた方がプログラムの見通しがすっきりすると思う もう駄目だ
>>427のコードを構造体に纏めて書き換えてみたけど、ideoneのコマンドライン入力がどうやってもエラーを吐く
もう諦めたのでテストデータ埋め込みでコードを晒す(数学的には意味のないテストデータだけど)
誰か原因分かる人確認お願いします
手元のVC++2017ではコマンドライン入力でも正常動作することは確認してる
https://ideone.com/IEGKl0 もしかして勘違いしてた?
ideoneの標準入力stdinってプログラム実行開始前のコマンドライン入力としては使えないのか?
もうどうでもいいけど… fscanf(stdin,...) とかの 入力ストリームにこれを与えるってだけ
実行時引数を渡すしくみはなかったような >>436
ちなみに初心者だよな?
だとすると、一般的にはCでは構造体の値渡しは(特に理由がある場合以外は)しないので、
ポインタ渡しで書くことに慣れた方がいい。 . はほぼ使わず、 -> ばかりになる。
具体的に言うと、
void gram_schmidt(BASIC3* bas, VECT3* v_1, VECT3* v_2, VECT3* v_3);
として、
BASIS3 bas;
gram_schmidt(&bas, &v_1, &v_2, &v_3);
とする。
値渡しする場合の理由だが、通常は、以下のどちらか。
・中で一時期的に書き換えるため、どうせコピーが必要。
・中で何度も使う場合、値渡しの方が速い場合がある。
値渡しはスタック上に置かれるためイミディエートオフセット命令が出る。(Read1回でデータを読み込める)
ポインタ渡しは間接参照になるため、アクセス速度が少し遅い。(2回Readが必要)
ただし値渡しは呼ぶ際と戻る際に構造体の中身を全コピーするので、それとの兼ね合いになる。
単純には、値渡しはコピーが2回発生するのだから、確実に速くなるとしたら3回以上使う場合で、
逆に言えば、2回以下のときはポインタ渡しにしておけ、となる。だから大体ポインタ渡しになる。
個人的には、このくらい自動で最適化してくれとも思うが、
Cは「書いたように動かせ、余分なことはするな」の文化だから、手動で切り替える方が好まれているのだろう。
(C++の場合はコピーコンストラクタが動くことになっているので、自動で切り替えたら違反になり、出来ないはず。) >>440
うーん、まあそうなんだけどね
今回はそんなに大きなデータでも無いので手抜きしてる
元々のコードは次元もパラメータとして持っていたので、基底空間の構造体そのものをベクトル構造体のリスト構造で構成するのが正解なんだろうね
ポインタでベクトル構造体を引き渡すことになるとは思う
ただそこまでやるのが面倒くさかったので、3次元ベクトル空間に限定して無理やりデータを小さくまとめてしまってる
この程度なら値渡しでもいいかと手抜きしてるのが裏事情、ぶっちゃっけて言うとまともに実装するのが面倒臭かった
まあ、あんまり細かいこと突っつかないで>< >>441
やれば分かるが、そんなに記述量は変わらないぞ。
. が -> に変わるのが大半で、それ以外はほぼそのままで済むはず。
主に計算用途で、Python -> Cを目指しているのか?
だとしたら速い書き方が出来ないと意味無いだろ。
そして、ベクトルの値渡しとかスタックを余計に食う=再帰したら悲惨なことになるから止めとけ。
->の表記が気に入らないのなら、C++の「参照」を使えば . のままでも書ける。
この場合は、ソース自体の書き換えは呼び出し部分だけで済む。
(ただし、非const参照は推奨されていない場合もある。例:googleのコーディングルール) >>442
このスレには珍しく数学的な背景に詳しそうだな
ちょっと聞きたいけど、基底空間の拡張そのものはベクトル構造体をリスト化すれば簡単なんだけど、ベクトルの要素の拡張で簡単な方法ないかな?
実は最初にそれを考えたんだけど要素もリスト化するとポインタの連鎖が大変なことになりそうで、躊躇した結果がVECT3やBASIS3などの次元決め打ちになってしまってる
あとは演算部も際限なく項が増えていくので再起でも使わなければとても実装できそうもない
これもポインタの実装が大変なことになるのが容易に想像できる
参考までに先のコードを拡張するにあたって何か良さそうなアイディアないかな >>443
いや俺は多分君よりは詳しくないが。
ただ、君はだいぶ勘違いしてると思うぞ。
1. まず、値渡しをポインタ渡しにしたところで、記述量は大して変わらない。
これはやってみれば分かるし、どのみち通る道だろうからやっとけ。
大変なことになんてならない。
2. 次に、Cのポインタは配列のサイズは気にしてない。
だからベクトル要素の拡張とか、最初から気にする必要が無い。
強いてコツを言うなら、ド頭を「長さ」にして、データは末尾にしとけ、という程度。
(大体これで上手くいく)
typedef struct {
int num;
// int elemSize;
double* elems;
} VECTX;
typedef struct {
int num;
// int elemSize;
VECTX* vectors;
} BASISX;
多分これで全て事足りる。
混乱するようなら num を dim(ension) なり rank 等に変えてもいいが、
ダックタイプ的に手抜きする気なら num に統一してついでに int elemSize も構造体に入れとけ。
そしたらコピー等は同じ関数が使えるようになる。
(void*にキャストしてmemcpyするにしてもサイズが無いと無理。
Cには実行時型情報(RTTI)が無いから、必要なら自前で用意するしかない)
或いは、VECTXとBASISXを分けずに、どちらもvoid*にキャストして1種類の構造体で扱ってもいい。 構造体返しなんか、知らないうちに使ってるんだから気にするな。
君が返り値に指定したその型が実は構造体だったなんて誰も気にしてないから。 ファイル操作しているなら、
FILE構造体のお世話になっているはず
この構造体の中身を一度見てみると良いよ でも FILE 構造体を構造体返しや構造体渡しにはしないからなあ… 構造体返しやら構造体渡しやらを使ってる標準ライブラリ関数なんかあらへんやろ K&Rでも初期のほう
構造体の値渡し/構造体の値戻しは出来なかったわけで
標準関数に盛り込まれることはなかったんじゃなかろうかと いや、コンパイラの吐くコードがアホだったから解放したスタックから値をコピーする事になっちまってただけだ。
割り込み専用スタックが無いアーキテクトマシンはそこで死んだ。 >>453
socket関連に構造体渡しってあったっけ?
あったっけっつっちゃった >>456
由緒正しきバークレーソケットに構造体渡し・構造体返しがあるわけがない、常識的に 構造体の値渡しについては440に書いたとおりだが、
構造体の値返しは通常はあり得ないだろ。
理由は何らメリットがないから。 ないな。呼ぶ側で何らかの方法で領域確保してそのポインタを渡せばいいし。
まあ物凄く良い感じで最適化されて無駄がなくなるならあってもいいが。 >>443
よほど高次元を扱わない限り決め打ちコピペ、マクロ、キャストを駆使する方法とかある
変態仕様だから俺はおすすめしない
typedef struct {
int element_sz;
int elements[2];
} VEC2;
typedef struct {
int element_sz;
int elements[3];
} VEC3;
#define INIT_VEC(name, size) \
VEC##dim name = {.elements_sz = size} >>462
それ、ちょっと考えたんだけどさ、無理矢理1行に書けばいいだけなんだよね。
BASIS3 bas;
gram_schmidt(&bas, &v_1, &v_2, &v_3); // (A)
BASIS3 bas = gram_schmidt(&v_1, &v_2, &v_3); // (B)
BASIS3 bas; gram_schmidt(&bas, &v_1, &v_2, &v_3); // (C)
(A)が一般方式だ。
(B)が宣言的な記述で、関数型()な奴らが「美しい」と主張する書き方だ。
とはいえ俺も(A)よりは(B)の方がいいと思ってはいるんだが、
それなら(C)って書けばいいだけなんだよな。
あまり一般的ではないけど、確保&初期化に関してはありかなと思えてきてる。
実はマクロで(B)を(A)に変更することを考えていたのだけど、
そんなことやるなら(C)でいいじゃんってね。
コンパイラが(B)を(A)相当にするのも簡単だとは思うんだけど、(C++のクラスがこれだし)
(C)が出来るんだからこれでいいじゃん、で終わりだよなと。
basを2回書かないといけないのは何とかならんのか、というのはあるが。 >>463
ちなみにそれはちょっと違う。決め打ちにするのであれば、以下の方がいい。
typedef struct {
double x;
double y;
} Vec2;
typedef struct {
double x;
double y;
double z;
} Vec3;
決め打ちのメリットは、
・分かりやすい名前を使える
・型チェックが有効になる
ことだから。
上はそのままだから分かるだろ。下は、例えば内積計算関数が、
3次元*2次元とかの違法の場合に書きようがなく、コンパイル以前にIntellisenseで落とせる事。
elementsが配列になっていると、当然ループになり、3次元*2次元でも書けてしまう。
ただし決め打ちの場合はその後のコンパイラの型チェックで落とされるが。
VecXとして一般化した場合は、この辺が全部通ってしまうわけでね。
ただまあ、C言語は、コンパイラにバグ取りを手伝ってもらう言語ではなく、
そもそもおめーがバグなく書きゃいいだけだろ、というノリなんだが。 >>465
それ演算式どうするんや?個別で書くんか?
アドレス渡しもできそうにないし、それ書くなら
typedef double[3] VEC3;
でよくね? >>466
個別で書くに決まってるだろ。
実際それが最速だし、この場合は適切だ。
> アドレス渡しもできそうにないし
オイオイ。
つかお前、マジで言ってるのなら豆腐の角で頭打って死ぬレベルだぞ。 >>467
アドレス渡しじゃねえ、キャストだ
アドレス渡ししてキャストできれば汎用にできそうやなあとか考えててアホなこと書いてたわ
個別で書くと割り切るならありやな >>468
誤解ないように追記しとくわ
void*でって意味 >>469
typedef double[3] VEC3;
で VEC3をvoid*にキャストするのは止めた方がいい。使い物にならないから。
void*で一般化するには何にしてもサイズが必要だから。
サイズ無しで型を一般化したいのなら素直にテンプレート使っとけ。 >>470
いや、だからキャストを考えてないなら
typedef double[3] VEC3;
でよくね?と書いてた >>471
それは使い勝手の問題だが、
VEC3 v0 = {1,2,3};
VEC3 v2;
v2[0] = 1; // 添字で指定
と
Vec3 v0 = {1,2,3};
Vec3 v1 = {.x=1,.y=2,.z=3}; // 名前が付いているからこれも出来る
Vec3 v2;
v2.x = 1; // 名前で指定
とどっちが見やすいかと聞かれたら、普通は後者と答えるだろ。
個別にした場合はループが回せないが、
2次元と3次元の決め打ちだけで済むならいらんだろ、ってことだよ。
(どうしてもループ回したければ double* p = &v1.x; で行けるし)
ただまあここら辺は外野の俺らが言い合っても意味がない。
使用者が決めればいいだけ。好みの範疇だからね。 >>472
>>468にも書いたけど、個別で式書くと割り切るなら同じ意見やで
ただ、次元増えたときは面倒やろと思っただけ >>474
アプリケーションハンガリアン記法。
参考までに、システムハンガリアン記法はNG。 戻り値が構造体ってのは、型宣言に構造体が使えるから言語仕様的に出来なきゃならないんだよ。本当はな。
でも関数内オート変数に一旦格納した型後でreturn オート変数ってやると、コンパイラがアホだからポインターだけ渡してスタック破棄した後に領域コピーしちまうんだ。
運が良ければ残ってるかもね。的な綱渡りさ。割り込みが掛かった時点で死ねる。 >>476
そんなアホコンパイラは捨てろよ w
そもそもC言語ではスタックの解放は呼び出し側でやるからお前みたいなトンチキが作らない限りそんなことにはならんよ >>476
それはどう実装されるかの問題。
まあしかし後付け感はあるな。配列はポインタにされちゃうのに構造体の中に配列入れると丸々渡せたりして。
まあ昔々に考えられて互換性を考慮して拡張されてきた言語なので仕方がないようにも思うが。 >配列はポインタにされちゃうのに構造体の中に配列入れると丸々渡せたり
あほか >>427
構造体が話を難しくしているのではないか?
単純に最初から二次元配列を使うだけでいいのでは
Ideone.com - i9PcuN - Online C Compiler & Debugging Tool
ttps://ideone.com/i9PcuN
gram schmidt {{2, 3, 4, 5},{ 7, 8, 9, 10},{ 20, 90, 78, 3},{6, 6, 7, 7}} - Wolfram|Alpha Results
ttp://m.wolframalpha.com/input/?i=gram+schmidt+%7B%7B2%2C+3%2C+4%2C+5%7D%2C%7B+7%2C+8%2C+9%2C+10%7D%2C%7B+20%2C+90%2C+78%2C+3%7D%2C%7B6%2C+6%2C+7%2C+7%7D%7D
>gschmidt 2 3 4 5 7 8 9 10 20 90 78 3 6 6 7 7
これで試すとwolframのと同じになる スタックがどうたら言ってるやつ
ジジイの昔話をそのまま受け売りしてるだけだな 基本型とユーザー定義型の概念が理解出来てないところかな 小手先のテクニックだけでなく概念そのものしっかり理解した方が良い >>476
構造体を返せないコンパイラはいくらでもあるけど
>>476みたいな返し方のコンパイラは見たことがない
例えばどのコンパイラがそういう返し方をする?
doubleをレジスタで保持出来ないCPUも基本的には処理方法は構造体と同じと思う 主にDOS時代の話だなぁ
Sparcのアセンブラで説明する勇者は居らぬか 配列で要素間をまたいで先頭からnビットの位置から6bit取り出してintに入れるにはどうしますか? 課題を丸投げするな。
自分なりの解を出して、もっと効率化できるかと聞くならあり。 組み込み系のヒープってなーに?の環境だと、まだまだ自動変数はスタックに置かれてたりするぞ。 >>489
ビットフィールドを使う組み合わせ分だけunionしろ。 C言語の登場当時に画期的だったのは構造体として自由に新しいデータ型を作り出すことが出来たことだった
C++では更にデータだけでは無くて関数まで含めたデータ型がクラスに発展してオブジェクトの概念にまで到達した
要は構造体は新しい概念をプログラムの世界に持ち込むための手段
ベクトルや多次元空間といった概念も構造体によってプログラム内で直接取り扱うことが出来る様になる 配列の任意のところからの 6bit の抜出しってーと
Base64エンコードの実装か? >>489
それはリトルエンディアンで考えるのかそれともビッグエンディアンなのか?
まあいずれにしてもまずはその配列の型のビット数で割る必要がある。
配列のその要素の中に先頭のビットがある。 >>496
BASE64は3バイトを4つの文字に置き換えるんだから、3バイトづつ処理するコードを書けばいいんだよ。
4文字を3バイトに変える方も同じく4文字づつ処理するコードを書く。
そーすれば、必ず同じ位置からビットフィールド取り出す処理だけになる。 あれ?もしや俺の書いたお題を解くために質問してたのか?
ま、頑張れ。調べていけば何れわかる。 >>495
> C言語の登場当時に画期的だったのは構造体として自由に新しいデータ型を作り出すことが出来たことだった
PL/1, Pascalにもあったし、範囲型とかをサポートしないサブセットだよ?
むしろポインタを陽に使える方が画期的だったな ポインタはPascalにもあるし、アドレスと紐ついているというのが
受けたんだと思うけどね >>506
ああすまん、陽にって言うより自由に使えるって書いた方がよかったかな >>502
EBSDICとBase64にどういう関係が?
バイナリならなんでも変換できるんだから特定のコードは関係ないだろう。 >>507
ここでのポインタが自由に使えるの意図は>>495 の構造体に対する考え方と本質的に意味することは同じだろ 要は言語としての設計思想というか考え方の問題であって、画期的の意味は最初という意味では無いということ >>509
意味不明
>>510
バカの上塗り w
二番煎じ画期的とは言わない
画期的
これまでとは時代をくぎるほど目覚ましいさま。
新しい時代をひらくさま。
エポックメーキング。
https://dictionary.goo.ne.jp/jn/42567/meaning/m0u/ C言語はその生い立ちがUNIX のシステム記述のためのツールだからね
画期的ではあっても全く新規の考えというものを指摘するのは難しい
当時の構造化言語のアイデアをひとつの言語として完成させたことが最大の特徴 >>508
両方のコード表見比べて関係が判らないなら病院いけ Base64 の話に EBCDIC とか言う奴の方が行くべきだろ w =とか
==で埋めるんじゃないの?
0埋めで変換したら結果違わなくない? 2バイト用と1バイト用のテーブルなんてちょろいでしょ C言語学習中だけど企業等々でどんなことに使われてる? >>524
OS、組み込み、速度が要求されるゲーム、数値計算など。 >>524
純粋なC言語が使われているのは、リソースが厳しい組み込み分野と、他にはプログラミングの教育や学習の分野がほとんど全て
実用的にはC++への通過点といった感じで考えておいた方が無難
CとC++の使い分けは結構曖昧で緩い感じだけど意識しておいた方が良い
両者をまとめた適用分野で言えば>>525あたり しかしなんというか、C++は発展させすぎて難しくなった感があるな。
C++ってWindowsネイティブアプリ以外で使われてるのあまり見ないような気がするんだけど。
Windows用で使われる理由は歴史的な理由で、もしこれがなければC++って廃れてないか? >>527
> 実用的にはC++への通過点といった感じで考えておいた方が無難
ダウト。
というか個人的には俺もそう思っていたが、どうも実際はそうじゃない。
https://www.tiobe.com/tiobe-index/
https://techacademy.jp/magazine/8735
あまり毛嫌いする必要もないはずなのだが、C++に乗り換えてない奴らも相当数いる。
理由は>>528の言うとおりで、C++は若干暴走気味だよ。
Linusの言う「無駄に抽象化しすぎて話を余計にややこしくする馬鹿が多すぎる」というのも当たってる。
とはいえクラス構文すら入れないCのかたくなな姿勢はどうなのよ?とも思うが。 「なんとなくアセンブラコードが想像できるところまで」
というのがC言語で実装する機能の上限だと思う。
まあ実態とだいぶ乖離しているが、最適化を切ったとかの前提でひとつ 個人的にはクラス云々よりもC言語では関数のオーバーロードやデフォルト引数あたりが使えないのがもやもやする
というかあまり詳しく調べてないけど、最近のC言語の仕様改定で標準化とかされてなかったよね?
大抵はC++の処理系を利用しているから有耶無耶で利用している人も多いと思うけど stdarg (... とか va_list) とマクロで出来んか 個人的には評価が確定した物は入れればいいと思ってる。
クラス(またはプロトタイプ)が使えない実用言語なんてほぼ無いわけでさ。
ただ、
> 「なんとなくアセンブラコードが想像できるところまで」 (>>530)
が標準化委員会の指針なら、今の姿勢も分からんでもないが。
>>531
> 関数のオーバーロードやデフォルト引数あたり
実はここは評価が確定してない。
というか、どっちかがあれば大体解決する。
VC++/CLIではデフォルト引数は禁止でオーバーロードのみ。
JavaScriptはオーバーロード無しでデフォルト引数は常にundefinedのみ。
いずれも大した問題はない。
C++は壮大な実験場と化しているから、
Cはありがたくその結果だけを受け取って緩やかに発展させればいいと思うのだが。 余計なもん要らんからクラスだけ追加したC+で頼む。 >>534
>実はここは評価が確定してない。
そんなに揉めるような機能か、これ?
特にオーバーロードなどは今すぐにでも導入されれば、似たような関数名であれこれいらんこと考えずに済むのでメリットしか考えられないんだが
デフォルト引数もあっても悪いものではないだろう
クラスの導入のように現行のC言語の規格を大きく変更(デメリットも含めて)することなく、簡単に言語の使い勝手を向上させるお手軽な改善だと思っていたんだが違うのか >>537
> ●java
> デフォルト引数なし.オーバーロードはあり.
> ●python
> デフォルト引数はあるが,オーバーロードはなし.
> https://plaza.rakuten.co.jp/redbeeshrimp/diary/201112240001/
理由についてグダグダ言っている奴は他にもいたはずだが、例えば以下。
http://ufcpp.net/study/csharp/sp4_optional.html
> 余談: なんでいまさら?
以降を読んでみればいい。
型あり言語は型違いで無駄に同じ趣旨の関数が氾濫することになるから、
オーバーロード/テンプレート/ジェネリクスのどれかはあった方がソースは綺麗になる。
だから型無し言語(JavaScript/Python)はオーバーロード無しでデフォルト引数だけ、というのもまあ妥当な線だろう。
ならば、テンプレートを持っているC++は、
オーバーロード無しで、デフォルト引数+テンプレートだけで綺麗に書けるか、という話になる。
多分これもやれば出来るんだよ。
勿論そこに出ている「名前付き引数+テンプレート」でも綺麗に書ける。
どれを言語に取り込むべきか、ということに関して、C++は「全部入れちゃえ」というノリだからいいとして、
Cみたいにミニマムで美しく、というノリで「どれかにしろ」と言われたらちょっと迷うだろ。
Linusは多分オーバーロードすら要らん、という立場だぞ。
ちょっとググってもすぐには出てこなかったが、
「Cはこれについて馬鹿みたいに単純な方法(別の名前を付けること)で対応している。
実際、これはgrep出来るしメンテしやすい」
と言っていたはず。
まあ分からんでもないだろ。オーバーロードすら無しならgrepした関数に確実にそのまま当たる。
ソースを追うという意味ではこちらの方が当たってる。
オブジェクト指向の継承が良くない点の一つは、ぱっと見、どの関数が実行されるか分かりづらい点であってさ。
勿論、「分からなくていいし、分かる必要がない」というのがオブジェクト指向のノリだとしてもね。 あまりにミニマムすぎるとみんなが好き勝手なマクロを作って「僕が考えたエレガントなコーディング」を始めるから少しは高級な記法を用意しといてくれや うーん。Cはアセンブラ代わりの単純な言語にしておいてそれ以上の事は別の言語でやればいいような気がするが。
丁度よい言語が見つからないなら作れば良い。自分で作れなくても仕様を公開して作ってくれる人を募集すればその内誰か作ってくれることだろう。 >>537
関数のオーバーロードは、リンク時の対応にアセンブラ互換性がとれなくなるので、お手軽ではないと思う
extern "C" を追加するか?え、C に extern "C" って意味わかんない… >>541
おまえさんの言っていることこそ意味わかんない >>542
C++ 名前マングリングを指していたんだが… >>543
defファイルのことだとしたらしょーもねーな CはUNIX思想の根源みたいなもんだし、十徳ナイフみたいな機能はいらんでしょ
どうしてもって人はC++使えばいいだろ
そのためにできたようなもんだし 質問答えてくれたら嬉しいです
配列の中身をfprintfでエクセルに書き込む方法を教えてください
fprintf(fp,"%3d , %3dn",0,value)
のように一変数を書きこむ方法は分かるのですが配列のすべての要素を書き込みたいです >>546
Excelじゃないとだめなの?
CSVファイルとかじゃあかんの? エクセル言ってるんだから、エクセルクラスモジュール組み込んでライブラリ使うんだろ? Csvだろうな。
です
for()で
fprintf(format,array[i])
を回せばええんちゃうん? なんの考えもなしに愚直に書くとこういうことがやりたいです
long value[100],k;
for(k=0;k<100;k++){
value[k]=500;
}
fprintf(fp,"%3d,%3d,%3d,%3d,%3d・・・,%3d\n",0,value[1],value[2],・・・value[100]); for (k = 0; k < 100; k++) {
if (k) putchar(',');
fprintf(fp, "%3d", value[k]);
}
putchar('\n'); あ、間違えた。putchar() じゃなくて putc() にして fp に対して出力に書き換えて。 >>553
ありがとうございます!
fprintf(fp, "%3d", 0);
for (k = 0; k < 100; k++) {
putc(',');
fprintf(fp, "%3d", value[k]);
}
putc('\n');
であってますか? >>555
それでいいなら
fprintf(fp, "%3d", 0);
for (k = 0; k < 100; k++) {
fprintf(fp, ",%3d", value[k]);
}
putc('\n', fp);
でいいかと でも1バイトずつ出力なんて普通はしないで
行くらいはまとめて出力するやろ?
char buf[405]; /* 3桁数字×101個 + カンマ100個 + 改行 + 「¥0」でMAXサイズ決め打ち */
size_t pos;
/* 1行処理開始 */
pos = 0;
sprintf(&buf[pos], "%3d", 0); pos += 3;
for (k = 0; k < 100; k++) {
sprintf(&buf[pos], “,%3d", value[k]); pos += 4;
}
sprintf(&buf[pos], “¥n”); pos++; /* buf[pos++] = ‘¥n’; buf[pos++] = ‘¥0’; でもいいけど */
fwrite(&buf[0], 1, pos, fp);
/* 1行処理終了 */ 惜しいな。
>>555
putc() または fputc() の引数は文字コードと出力先FILE*の2つだ。
>>557
fprintf()のようなFILE*経由の出力はライブラリの中でバッファリングされるように
なっているので(自分でそのバッファの大きさをいじるのでない限りは)まとめて
出そうとかは考える必要がない。考えた方が良いのは write() で直接出力する
場合だ。 もう一つ質問させてください
long型の配列に空白を入れることは可能でしょうか?
>>556
ありがとうございます long array[] = {1, 2, 3, ' '};
memset(array, ' ', sizeof(array)); 配列に空白を入れるというのは、配列のどこかに、空白文字の文字コードを表す整数値を入れるという意味になる。
文字コードは、文字リテラルか整数リテラルで指定できる。 配列の初期化で
int arr[10] = {};
と空に書くのは本来は行儀悪いことなんだな
int arr[10] = {0};
と最低1個は書かないとだめなのか cの初心者抜け出したいんだがgithubってのを使えばいいの? (アスキーコードを使ってる仮定で) SPC文字 と 整数32 は等価
より大きいサイズへの整数への格上げも素直に行われるだろう
long a = ' ';
long b = 32;
// a と b は等しい
元質問 >>565
「long型の配列に空白を入れることは可能でしょうか?」における
空白とはなんぞや?が ' ' でいいのかどうかは知らん >>579
min という変数がポインタだとして、min の指し示すところに 100 を代入する、という意味になる
部分だけではよくわからない場合もあるので、可能ならば全体を https://ideone.com に張ってもらえると、もっと解説できるかもしれない ロング型に文字入れてもprintfできないのに何の意味があるのか分からん 上位ビットのほうををフラグに使って下位は文字そのまんまかもしれんじゃん
まぁ 構造体・共用体でやれって話になるが >long a = ' ';
>long b = 32;
>// a と b は等しい
long a = 0;
long b = '0';
a と b は等しくない #include <stdio.h>
void maxmin(int array[],int max,int min); int main(void)
{
int i = 0,array[10],max,min;
do
{
printf("%d 番目の数:",i + 1); scanf("%d",&array[i]); i++;
} while (array[i - 1] != -1);
maxmin(array,&max,&min);
printf("最大値 %d : 最小%d\n",max,min);
return 0;
}
void maxmin(int array[],int max,int min)
{
int i = 0;
*max = 0;
*min = 100;
while (array[i] != -1)
{
if (array[i] > max) max = array[i];
if (array[i] < min) min = array[i];
i++;
}
} × void maxmin(int array[],int max,int min)
○ void maxmin(int array[],int *max,int *min)
× if (array[i] > max) max = array[i];
○ if (array[i] > *max) *max = array[i];
× if (array[i] < min) min = array[i];
○ if (array[i] < *min) *min = array[i];
ポインタ使わずに記述してて、呼び出し元に結果かえってないじゃーん
から、慌ててポインタに変えた感じかな? 下の関数はmain関数と思い込んでだけどよく見たら引数あるのか >>593
2-1の
関数の中身は間違い
ansの前に*が必要 エラーが起きても仕方ないものとするとか
初心者向けでも考え方が間違ってる エラーが起きないことを想定するとどんな書き方なんですか? >>600
50メートル歩くプログラムで、こけても起き上がらず、足を動かして歩こうとするみたいな。 >>593
今すぐ見るのをやめるべき
って言うぐらいひどい
そもそも今時のコンパイラ使ってたら警告でるだろうに >>588ですけど、参考書は>>592の文になってました。ネットの方は間違ってるみたいですね。 >苦しんで覚えるC言語(苦C)は、初心者を対象としたC言語入門サイトです。
>C言語の基本機能を体系立てて解説しており、市販書籍と同等以上の完成度です。
去年サイトリニューアルするまでは、項目はあるのにページが無いのとか結構あったし、完成してないのにこれで市販書籍以上の完成度とかよく書けるなw >>607
運営者本人が初学者だから苦しんでるんだろうなw >>604
ネット上には当てにならない情報が溢れているから、ある程度自分で判断できるレベルになるまではちゃんとした書籍で勉強した方がいいよ 体で覚えるしかないな
なんて、コンパイラにバグがあって変な風に覚えちゃったりしてw よくあるのが非標準拡張機能に騙されて
それが標準と思い込んでしまうことだ 最近の書籍はあてにならない
著者も編集もレベル落ちてる void * の変数に1を足しているのを見た時は驚きました。 メモリのハード的な最小単位へのポインタは欲しかった そういえば昔1/2ビットシフトなんてテクニックがあったな 1.5ストップビットみたいな 立ってるビットの総和で1シフトする/しないとかの条件付きかと思ったけど
ふと 2で割る演算を 右へ算術シフトする話のほうっぽい ラプラス変換(からZ変換した)後に、やっとCのコーディングの話になるので
どこか余所できいたほうがいい 数学ですかね…
他に当たります。ありがとうございます。 >>623
数値微分の考え方をまず理解して、さらに三角関数の微分と、極限を理解しないといけない。大学数学だよ。 元が消えてるからよく分からんけど、>>627の内容って高校数学の内容じゃないの? https://i.imgur.com/yXsENPk.jpg
https://i.imgur.com/LhIHXaC.jpg
こちらになります。
一応これをC言語でやれというものなので、よろしくお願いします。
解き方の方針だけでも、、、
θをラプラス変換後、伝達関数と掛け合わせてから、逆ラプラス変換をするのかと思いましたが、そんなこと計算できませんでした。
よろしくお願いします。 流石にラプラス変換をC言語でやれという問題じゃないと思う(´・ω・`)
手計算で(6)式に対する出力信号(tの関数)をωcを含む形で導いてから、適当な値を変数omagacにセットして出力信号を数値計算するのでは...? 手計算で、θをラプラス変換して、10式と掛け合わせて、ラプラス逆変換までするのかな?
それができたら、できそうだけど、、、
計算できるかな >>629
積分器の部分が面倒くさいな
単純に時間刻み値一段だけ遅延させてみたけどうまくcos波形にならない
何段遅延させればうまくいくかよく分からない
とりあえず方針としては、ブロック図を単純に差分方程式に落とし込んでやれば回答には辿り着けるはず
1/sの部分が積分器だから入力を適当に遅延させて出力させてやればいい
ラプラス変換云々は理論的な理解には大切だけど、プログラム的には最終的に差分方程式(数学的には微分方程式)の形に落とし込んでしまえばいいよ
もうここまでにして途中のソースだけ挙げておく
https://ideone.com/69YxIz ごめん、俺が知ってるやり方も部分分数分解だった。
でも手順に従うだけじゃ...?
http://lab.cntl.kyutech.ac.jp/~nishida/lecture/MathOfCntl/no5.pdf >>634
伝達関数の使い方が、その方法じゃ分からないです…
勉強不足です。
>>635
θをラプラス変換したものを伝達関数と掛け合わせてから、逆ラプラス変換した結果がこうなりました。
T=ω/(ω^2+1)
P=0.1/ω^2+1000^2
と適当な文字において、
θ(t)'=T(-cos(t)+ωsin(t)+e^(-ωt))+
P(-cos(t)+ωsin(1000^(2)×t)/1000^(2)+e^(-ωt))
となりました。
これをtを0.001秒毎に、0〜10まで出していけばいいんですよね?
自分でやってみたんですけど、tが0.001秒毎に変わっていかなくて途方にくれてます。
多分簡単なことなんで、コードをお願いします。 int main()
{
int a;
a=1;
sumNum(&a);
printf("%d\n",a);//13
char str;
sumStr(&str);
printf("%c\n",str);//□
}
void sumStr(char* str){
*str ="a";
}
int sumNum(int * num){
*num=*num+12;
return 0;
}
なぜ変数strの出力が"a"と表示されないのですか? "a"は{'a', '\0'}へのポインタ
'a'は文字のa "a"はポインタじゃないぞ
printf("%u", sizeof "a"); //2
const char *p;
p = &"a"; //ill-formed
p = &"a"[0]; //well-formed
'a'はint型の0x41もしくは0xc1だ >>643
eclipseは出ない
どのIDE使えば書きやすいのかそれも教えてくれないか >>644
仮に文字列リテラルの式の値の型がポインタじゃないとして、それらが何故その根拠になるのか分かりません(>_<) >>648
文字列リテラルは定数なのでそれは分かります(>_<) char a[] = "A";
a+1 セーフ
a++ これも文法エラー ポインタならばこれは通るけど、配列では無理 ポインタ変数にリテラルを代入した場合は...?(>_<) >>646
面倒くせえやつだな
const char *p;
printf("%u", sizeof p); //4
const char (*q)[2];
q = &"a"; //well-formed
q = &a[0]; //ill-formed >>648
syntax errorじゃない
semantics errorだ >>649
定数だからエラーなのではない
char s[2]; //non-constant array
s++; //ill-formed >>654
これは分かりました(>_<)
配列の変数はポインタと同じようで違うんですね(>_<) >>640
void sumStr(char* str){
*str ="a";
}
これ、strはcherのポインタでありその指す先はchar型だ。
"a"は 'a', '\0' と並んで入っている先を指すポインタだ。
*str は char 型で、"a" は char * 型だ。型が違う。
これが例えば *str = 'a'; だったり、あるいは *str = *"a"; だったりすれば型も一致するし目的の値の代入に成功するだろう。
(まあしかし普通は *str = *"a"; なんて書き方しないけどな)。 詳説 Cポインタ、2013、オライリー・ジャパン
ポインタの仕様だけで、本が1冊書けるw
どんなに面倒くさい言語やねんw >>659
そんなにネタはないと思うが、いったいどんな本なんだろう? ポインタ・文字列を、図解して説明している
"abc" なら、"abc\0" みたいに4バイトになるとか >>645
書きやすいかどうかは分からないが、VisualStudioだとこんな感じで警告どころかエラーでビルドに失敗する(C++プログラムとしてだけど)
正確にはビルドするまでもなく、コーディング段階で赤色の波下線で警告表示されるのでそれ以前に問題に気付く
https://i.imgur.com/6MLycv2.png >>662
VisualStudioはエディタやデバッガが滅茶苦茶優秀
コンパイラがウンチだけど、それさえ許容できればVisualStudio一択 これからC言語始めます自分で色々と調べたけっかこの2つが残りました
どちらがいいでしょうか?アドバイス下さい。それやめとけなんて話もあればお聞かせ下さい
1,「C言語プログラミング」(ハーベイ・M. ダイテル/ポール・J. ダイテル 、ピアソン)
2,プログラミング言語C 第2版 ANSI規格準拠 B.W. カーニハン (著),? D.M. リッチー 巨匠の柴田望洋・林 晴比古とか、
「猫でもわかるC言語プログラミング 第3版」粂井(くめい)康孝、2013
古い本だと、例題の開発環境が古いから、動かせないだろ
「c言語 入門書 おすすめ」で検索! >>666
新しいことを学ぶときは
・バイブル的な本(K&R第2版)
・初心者向け
の組み合わせで。
片方だけではダメ。 ちょっと教えてくらさい。
最近Cを書くことが多くなったんですけど
#include <Includes/General.h>
#include "Includes/General.h"
これって、本来の動作的に厳密には何か違いがあるんですか? >>671
#include <> はコンパイル環境指定のインクルードディレクトリから探索
#include "" はインクルードしたファイルのあるローカルディレクトリを先に探索してから環境のインクルードディレクトリを探索
つまり自分で今作ってるプログラムのヘッダファイルは#include ""を使わないと他人の同名のファイルをインクルードするかも知れない。 >>672-673
そういう事ですか、なるほど。
詳しくありがとうございました。勉強になりました。 本当はコーディングルールから学ぶと良いが書ける人はとても忙しいので本がない。 >>666
1は知らんけど2は絶対に読んだほうが良い本だと思うよ。 いくら本読んでも本に頼ってるうちは初心者
書いて書いて書きまくってエラー出しまくって経験積め >>678
なんでもそうだと思うが、
悩んで解決した分 だ け が自らの糧となる。 >>168
このセリフは10年前にも言えたことだな 初心者です。参考書を読んで勉強していたのですが
「浮動小数点数の利点は、一定の有効桁数(精度)の範囲内で、小さな数から大きな数まで表現できることです」(分かりやすいC入門編:川場隆)
とあったのですが、どういう意味か分かりま出んでした。
ネットで調べても同じようなことしか書いてなくて。浮動小数点数の利点を教えてください。 >>685
123,000,000,000=123×10^9
右辺の方がコンパクトだろ? >>685
利点とは、何かよりも優れている点であることは解っているか?
浮動小数点と何を比較するのかで答えは違ってくるぞ
整数か? それとも固定小数点か? >>686
というと?
>>687
では、数字が少数になったらどうなんでしょうか?
例えば12469125478.945→1.2469125478945×10^10。これでコンパクトになっていると言えるのでしょうか?
>>688
すいません。固定小数点数と比べて、です。 間違えた
0.000000000123 = 1.23e-10 二進数32ビットで123,000,000,000は表せないけど、
32ビットを符号部、指数部、仮数部に分けると表現できる。
有効桁数は仮数部のビット数で決まる。 例えば、8ビットなら、2^8 通り、0〜255 しか表現できない
それを5ビットにして、残りの3ビットを桁をずらす機能にすると、
2^5 通り、0〜31 しか表現できないけど、
残りの3ビットで、0〜7 を表現できるので、それをずらす桁とすると、
7桁ずらせば、310,000,000 を表現できる
だから精度は減ったけど、桁をずらせるようになったから、
非常に小さな数や、大きな数を表現できる
桁をずらす部分は、指数部という。
実際には、10進数ではなく、2進数でずらしていく 初心者質問おねがいします。
二つのunsigned char型があり、
一つ目が 0b10001000 で、
二つ目が 0b01110111 です。
これを合わせて 0b10001000 となる計算式はどうすればいいですか?
よろしくおねがいします。 >>695
希望の結果が1つ目の値そのままのように見えるが >>696
すみません。
説明不足でした。
二つ目のchar型は刻々と変化するので、一つ目のchar型の各ビットを二つ目の各ビットが変わったら
そのビットだけ反転させたいのです。
よろしくお願い致します >>698
直前の値とのEXORを取れば変化ビットだけ抽出はできるけど、それとは別に何かのマスクを掛けたいということ? >699
すみません。
超初心者なのでマスクとかよくわからないです。
単純に、一つ目のchar型の各ビットを二つ目のchar型の各ビットが変化したらそのビットだけ反転させたいだけです。 >>700
わかりにくい。
ビット単位で4パタン説明して。 >>701
すみません
こんな感じでわかりますか?
一つ目の初期値 0b11010110
二つ目の初期値 0b01001011
二つ目が0b01001010に変化
↓
一つ目が0b11010111に変化させたい
二つ目 0b01001010 もう一例です
一つ目の初期値 0b11010110
二つ目の初期値 0b01001011
二つ目が0b010000111に変化
↓
一つ目が0b11011110に変化させたい >>702
なぜ話をややこしくする?
ビット単位で説明すればいいじゃん。 >>704
ビット単位で比較してそれぞれ操作するしかないということでしょうか?
できればバイト単位で一括で操作できる方法があればとおもいました >>706
敢えて質問するけど
1.全ビット反転させてはいけない理由はあるの?
2.何処のビットが変化したかどうやって判別してるの? >>706
だれがビット単位で操作するしかないと言ったの? >>707
1、はい。全ビットは反転してはまずいです。
2、マイコンの入力ポートです。
>>708
すみません。
そんなつもりではありません。
ということは、自分の望む計算式があるのでしょうか? >>709
イメージとしては、二つ目の変数の変化をEXORで抽出しながら変更用マスクを作成
そのマスクで一つ目の変数と再度EXOR演算、これで二つ目の変更ビット個所だけ一つ目のビットが反転する
ざっくりとした流れはこんな感じ
一つ目の値(状態)a、二つ目の値(入力)b、入力比較用変数c、変更ビットマスクd
c = input(b);
while(1) {
d = c ^ input(b);
c = b;
a ^= d;
} ちょっと整頓させてくれ。
>>702 の場合
二つ目の unsigned char
01001011 ... 最初の値
01001010 ... 新しい値
00000001 ... 変化したビット
一つ目の unsigned char
11010110 ... 最初の値
11010111 ... 二つ目の unsigned char の変化にともない新たに取るべき値
00000001 ... 変化したビット (二つ目の unsigined char の変化したビットと等しい)
>>703 の場合
二つ目が0b010000111に変化 ... ビット数が増えとるやん!
>>710 の言う通り「二つ目」のビット変化をexor(^演算子)で抽出した結果を
「一つ目」のビットに作用させれば良さそうだけど、
「二つ目」のビットが1から0に変化したときには「一つ目」にはどう反映させたいの? >>710
ありがとうございます。
何となくですが少しイメージが浮かんできました。
>>711
すみません。
二つ目が 0b01000011 に変化の間違いです。 1001110
1101001
1101000
1101111
1101110
1100111
1101111
0100000
1100100
1100101
0100000
1001111
1001011 こ、こうか・・・
1001110 N
1101001 i
1101000 h
1101111 o
1101110 n
1100111 g
1101111 o
0100000
1100100 d
1100101 e
0100000
1001111 O
1001011 K 2つめ着目ビットが 0 -> 1 となったとき 1つめ対象ビットを 反転/0/1 にする
2つめ着目ビットが 1 -> 0 となったとき 1つめ対象ビットを 反転/0/1 にする
0->1 でも 1->0 でも 1つめ対象ビットを反転すればいいのけ?
new_1st = old_1st ^ (old_2nd ^ new_2nd); >>716
正にその通りです!
その式で思ってる通りに制御できました!
ありがとうございましたm(_ _)m 全くの初心者です。
「2の3乗を求める」という計算プログラムを勉強しています。
最終的には3^1024を求めたいのですが。
ネットで見ていると30乗ぐらいまではプログラムがあるのですが
1024乗ぐらいになると難易度的に難しくなるのでしょうか? >>718
3^1024=(3^2)^512
3^2≒10ってことで、だいぶ大雑把だけど
3^1024≒10^512
10進数で500桁以上の大きな数になりますね。
どの型の変数を使う? >>718
やることは3に3を1,023回掛けるだけだから難しくはない
ただ>>719の言うようにかなりでかい値になる(ちょっとpythonで計算したら489桁だった)から普通のlong intとかではオーバーフローする
なので
多倍長整数 C言語
とかでググるがよろし DOSで4000桁の電卓つくるにはって考えてたことあったな。 >>718
自力でどうにか解決できたらプログラミングの力がつくよ、がんばって! >>718
GMPというフリーのライブラリを使えば3^1024は簡単に求まるぞ BCD(二進化十進)ライブラリを拾ってくるのが汚れた大人だけど、
若者は勉強のためにBCDライブラリを作ってみては? >>725
10進の世界を前提に計算するのは、メリットがよくわからないんですが 10進じゃないと0.1が無限に数字が続くらしい
よく分からんけど >>728
10進だと 1/3 が無限に数字が続きますよね
それはさておき、多桁長+浮動小数点が落としどころではないかと
すると、BCD の意義がよくわからないのです 効率よく2進値を10進表記するアルゴリズムが思いつくならメリット無いかもな。 とりあえず質問者の意図にそって
多倍長整数演算と言うことに絞ろう 16進ダンプしたとき読みやすい
それだけ
3増し符号とか使ってたやついる? >すると、BCD の意義がよくわからないのです
科学技術計算は浮動小数点でいいが、リアルなお金の計算とかでは10進で計算するのがディフォールト
2進と10進では結果が大幅にちやうから。
ま俺の財産なら誤差0.1円くらいかもしれんが、、 いま必死に考えてる
昔のCPUは絶対に持っていた機能だ
レジスタが8ビットだとすると、256以上のデータが表現できなくなるけど、そんなことはない
だから何か仕組みがあるはず
プログラマが勝手にこのビットが立ったら2の15乗だとか自由に決めて、8ビビットの重み付けをしてるんだとおもう
あとは計算と結果の表現次第だ
指数法則を使えばできそうだけど、これはなかなか面白い課題だね >>737
キャリーフラグと言ってレジスタの範囲を超える加減算があると1になるビットがステータスレジスタにある
32ビットCPUにだってあるぞ >>741
C で多桁長計算を記述するときは、キャリーフラグという便利なものが使えないので、いちいちマスクしたり、と苦労しますね
http://mevius.2ch.net/test/read.cgi/tech/1434079972/28
C で書かないほうが楽で記述量も少ないかもしれない
>>718 は初学者には無理かもしれません アセンブラだと当たり前のようにキャリーフラグを見るけど
高級言語だとキャリーフラグを活用してるのは皆無じゃないかと
思えてくるのが悲しい I/Oがメモリにマッピングされてるんだから見れると思ってる
ぼくはそういうプログラミングがしたい Reno版のカーネルのソース読んだとき、
VAXのHDDのドライバが分かりやすくてビビった。
メモリマップドI/Oだた。 ここの人達ってOpaqueポインタとか使ってます? とりあえず本買ってきて読んでいます。3月末ぐらいにはなんとか結果を出したい・・・ とりあえずプログラム初心者だが将来有望な頭脳をもった奴を
2人ほど用意した・・・。 >>742
うーん。最上位ビット使えばできるのでは?
まあしかしアセンブラ使った方が効率はいいだろうな。
CPU違ったら動かんけど。 >>748
実ソースではvoidポインタしか見たことない 3進数用にBCD3を定義する
1桁を2進数2bitで表現して
最下位桁の次に2bitのエンドコード11を付与する
例えば
0=00 11
1=01 11
2=10 11
3=01 00 11
4=01 01 11
5=01 10 11
6=10 00 11
7=10 01 11
8=10 10 11
9=01 00 00 11
...
3^1024=01 00 00 ...(00 が1020個(左右に書いたもの含めると1024個))... 00 00 11 >>754 議論の本質から逸れた混ぜ返しになるけど、
BCD が 二進化十進数 binary coded decimal の略なら、
3進数の場合は binary coded tricimal で BCT ではないかしら。
3進数が tricimal なのか、ちょいと自信がないけど、
とりあえずネット検索でヒットする言葉みたい。 >>756
訂正ありがとう。確かに ternary が辞書に載ってる言葉みたいね。
triple あたりからの類推では到達できない綴りだったわ。
これからは注意して取り締まることにする。 従来のbooleanの変数が1個だけあっても、2進数とは呼ばんだろ。 2進数なら無駄なく表せるけど
struct {
bool b1:1;
bool b2:1;
bool b3:1;
bool b4:1;
bool b5:1;
bool b6:1;
bool b7:1;
bool b8:1;
}
3進数だと3バイトずつセットにしないと無駄なく表せないよね
3進数使うメリットあんの? 自然対数の底2.71828…により近い3進数の方が効率が良いっておばあちゃんが言ってた。
2進数なのは単に電気で表しやすいからだって。 元の質問が3の累乗を求める問題だから3進数の方が単純化できるというだけのこと このあたりのソース揃ってるソフトでC言語の勉強してるわ。
スカパーの録画環境も構築できるし。
https://www65.atwiki.jp/psky/ const char ○○とchar ○○について。
○○はフォルダ名。
後者ではエラー、前者ではエラーにならない場合何が考えられますか?
CとC++だと記述が違うとかあります? 恐らく何らかの標準関数の引数にでもした時にエラーが発生したんだろうけど、具体的なことが分からないので何とも言えない
constについてはCとC++では微妙に扱いが違う >>766
そりゃ2値で3進数を表現しようとしてるから当たり前
1本の線が3値になるようなハードなら3進数の方がやり易い エラー発生箇所の最小のコードとエラー内容を張らないと憶測だらけに >>776
それはソフト屋さんの思考やね
ハード的に0ピッタリなんてできなくて結局ある範囲を見る必要があるから1V, 2V, 3Vでも-1V, 0V, 1Vでもたいしてハードは変わらない curl.exeをsystemコールするのだけど
その標準出力をバフに入れたり、バフの値を標準入力に入れたりするのってどうすればできるのだろう? >>779
オプションをつけて標準入力をcurl.exeで〜とかってのはコマンドライン上で実現できてるけど
それをコードで実現する方法が知りたいです const 無しのポインタ変数にリテラル文字列を与えると
C++だと (リテラル文字列の)指し先を書き換える気あるのかボケェ と警告やエラーになるですよ
Cは過去のコードの互換性の為に黙ってることが多い
(けどオプションで警告したりエラーにしたりするんだっけか?) "!"!"!MOHYO!"!"!"2"
1.[[[HUn≒MUL=POSI≠MAHO+Set*HUGE=SAGE=LOGE=NOISIA=0≒1]]]
2-[[[[[[[E=RAT%2^10%SPELAn!%]&!TOWA&!PEG#!NOLNOL8!#!HYAGO!2#]1*2=1]U]S]0]O]!#PAL!
3--->PAGODOL7&!@17,2222734.15&[[[%%RENRAK6,9,99"^10"]#$11.2%}]KAIJ]{
41.2SSS = RALQI2.β{{{RA4,0,238^97,1,$.S.L.E.I.L."Q5352.15Q"JOL"5*3>>>41.3q}}}>1.2<0
.3φTALHOSI"0">>>105.10<1.235<1.2>51≠52===55.632>V="E=0.835"of"1.32","632",0.683,1.end
{ >>779-780
Rubyではパイプラインで、サブプロセスを実行し、結果を受け取れる。
例えば下は、メモ帳の実行ファイルの場所を探す
resText = ""
IO.popen("where notepad") { |io| resText = io.read }
puts resText
出力結果
C:\Windows\System32\notepad.exe
C:\Windows\notepad.exe >>779-780
Rubyではパイプラインで、サブプロセスを実行し、結果を受け取れる。
これで、サイトのHTML が取れる
resText = ""
IO.popen("curl サイトのURL") { |io| resText = io.read }
puts "終了ステータス : #{$?}", resText >>779
system()ではなくpopen()使うと楽だ。 色々ありがとう
>>785
Linuxだからそいつは無理なんだ...
>>787
>>788
すまん
Cは決定で、さらに言うとexecvで実行も決定なんだ
実行部のソースコードの変更はしたくないので... curl.exe を Linux で?
こりゃ触っちゃダメな人だな Linux なら、curl はコマンドである。
環境変数PATH も通っている
which curl で、
/usr/bin/curl
>>787
これは、Windows10 のWSL 上の、Ubuntu 16.04 で、Ruby で実行したもの >>790
すまねぇ
正確に言うとcurlだった
実行ファイルってのを言いたかったんだけど紛らわしかったわ....
>>791
コマンドラインで実行をコード上からして
その結果をメモリに書き込みたいって感じ
int main()
{
char* buff[1024]
execv(curl..........)
}
子プロセス作成とかは書いてないけどこのexecvの結果をbuffにいれたい >>779 と >>789 は同じ投稿者なのかな?
「curl.exeをsystemコールする」という文の意味は、
実際には curl.exe でなく /usr/bin/curl かどこかの Linux のコマンド、
systemコールと言っても system() 関数でなく execv() 関数で呼ぶ、
という条件でいいの? >>793
同じです
メチャクチャ困惑させてすみません
そうです #include <unistd.h>
#include <stdio.h>
int main() {
int pp[2];
pid_t pid;
pipe(pp); // パイプを生成 (エラーチェック略)
pid = fork(); // プロセスを複製 (エラーチェック略)
if (pid > 0) {
// 親プロセス: 子プロセスから情報を受け取る
close(0); // 標準入力のディスクリプタを閉じる
dup(pp[0]); // パイプの入力を標準入力に複製
close(pp[0]); // パイプの入力を閉じる
close(pp[1]); // パイプの出力側は使わない
char buf[1024];
int nbytes = read(0, buf, sizeof(buf)); // 子プロセスからのデータ受け取り
printf("[%*s]\n", nbytes, buf); // 受け取ったデータの確認
} else {
// 子プロセス: 外部コマンドを呼び出し、標準出力経由で親プロセスに送る
char *cmds[] = { "/usr/bin/echo", "hello, darling", NULL }; // ダミーの外部コマンド
close(1); // 標準出力のディスクリプタを閉じる
dup(pp[1]); // パイプの出力を標準出力に複製
close(pp[1]); // パイプの出力を閉じる
close(pp[0]); // パイプの入力側は使わない
// 外部コマンドの呼び出し (エラーチェック略)
execv(*cmds, cmds);
}
return 0;
} 自分で fork, exec するなら pipe() 作って dup() で繋げ。
やり方はUNIXやLinuxのシステムコールに関する入門書みたいなのがあれば必ず書いてあると思うのでそういうのを見るか、またはググれば世界中で解説やサンプルプログラムが見つかると思う。
かなり基本的な事だ。 急造のデッチ上げだけど、こんな感じかな。
要点は、名前なしパイプを作って標準入出力と差し替える。
外部コマンドの標準出力はパイプを通って出ていく、
呼び出した側は標準入力を読むとパイプから入ってくる。
32行制限に収めるために行が詰めたら見にくいね。 などと書いている最中に真上にサンプルプログラム出現w curlだったら、オプションで全部ファイルに書き出せるじゃないか 親プロセス側は標準入力をパイプに差し替える必要ないね。
パイプのディスクリプタから素直に読みゃいいんだわ。
// close(0); // (不要)標準入力のディスクリプタを閉じる
// dup(pp[0]); // (不要)パイプの入力を標準入力に複製
// close(pp[0]); // パイプの入力側はまだ閉じちゃダメ!
close(pp[1]); // パイプの出力側は使わない
// int nbytes = read(0, buf, sizeof(buf)); // (変更)
int nbytes = read(pp[0], buf, sizeof(buf)); // 子プロセスからのデータ受け取り
close(pp[0]); // 使用済みパイプの入力を閉じる >>801
本物らしいな
しかも解説ドキュメント付
やっぱオープンソースよりプロプライエタリのほうが忖度が充実してるね 流出どころかAppleがそもそも堂々と公開してるじゃないか >>808
OSのソースコードはないじゃん(´・ω・`) まあ、ライセンスが必要な部分は非公開なんだけどね。 処理が進んでくにつれてエラー処理のif文の中身が増えていくのをどうにかしたいんだがいい方法ない? >>815
エラー時に行う定型的な処理の塊を関数化するのではいかんの? >>815
普段起こりえないエラーは全部gotoでケツに例外処理を書く >>815
あー。ファイル1を開く、エラーならリターン、ファイル2を開く、エラーならファイル1をクローズしてリターン、ファイル3を開く、エラーならファイル1、ファイル2をクローズしてリターン、
・・・って具合にリターン直前にクローズするファイルがどんどん増えていくみたいなやつだよね?
そういうのは俺はもう goto 使って関数の終わりの方に飛ばしてそこで必要なクローズやらfree()やらをまとめてやるようにしたよ。関係する変数は関数のブロックの先頭の宣言で全部 NULL や -1 で初期化して goto の飛び先で NULL や -1 でなければクローズやfree()をする。
(但し関数の途中で自分でクローズやfree()をした場合はその直後にNULLや-1を代入するように書く必要がある)。C言語は try catch みたいな例外処理は作れないから仕方がないね。
goto 使わずにやるとしたら for (;;) か while (1) のブロック内に書いてエラーが出たら break すればできる(もちろんループの終わりは break)。しかしこの方法はループでもないのにループを書くという何か不自然なものになる。 >>818
C言語の場合は同じような事をする場合はgotoの方が可読性高いと思うけどなあ。とにかく間すっ飛ばして使ったリソース開放して即リターンしたいわけだし。 >>816
それで対応できるものもあるんですけどね・・・
>>817
>>819
gotoは絶対使っちゃいけないみたいな感覚があって考えていませんでした
どうしようもないときに使ってみます goto hell;はdo-whileで置き換え可能。
do {
...
break; // goto hell;
...
} while (0);
hell:; >>823
ああ。do while で 0 で抜けるようにするのでもできるか。
まあしかし goto 使わないならそんな風にするしかないよな。 単純に置き換え可能じゃないから do while(0) は定着しなかった
※個人の感想です do while(0) も使うけど、その中でループを書く場合は面倒だからgoto使うかなあ
必ずどっちかだけってことは無いですね return は1箇所でまとめる派 (関数出口は1箇所)
とっと return してしまう派 (関数出口は散らばる) cでgoto使わないのは唐揚げにレモンかけないようなもんやで break 1 とか
break 2 とかで
抜ける {} の段数指定できない仕様が糞 >>823
gotoというキーワードに対する言葉狩りでしかない
うちの若いのがそんな変態コード書いたらしばく do{}while(0)は普通に使うやろ
特にマクロで
どこが変態やねん! int ret = 1;
int fdA = -1;
int fdB = -1;
int fdC = -1;
if (ret) {
fdA = open(A);
if (fdA < 0) {
printf(“ファイルAオープンエラー¥n”);
ret = 0;
}
}
if (ret) {
fdB = open(A);
if (fdB < 0) {
printf(“ファイルBオープンエラー¥n”);
ret = 0;
}
}
if (ret) {
fdC = open(A);
if (fdC < 0) {
printf(“ファイルCオープンエラー¥n”);
ret = 0;
}
}
if (ret) {
いろいろ処理
}
if (fdA >= 0) close(fdA);
if (fdB >= 0) close(fdB);
if (fdC >= 0) close(fdC);
return ret; O'ReillyのLinuxデバイスドライバ本では
初期化の失敗時、一部分だけ確保できたリソース群を
確保時とは逆順に行儀良く解放するのにgotoを使う方法を勧めてるね。
そういう具合にgotoが出てくる場面が明確ならば
必ずしもgotoが可読性を落とす、とは言えないじゃろ。 >>829
なんかの理由でネストを増やしたら全部書き換えになる糞仕様だろ
ループにラベルつけてラベルを指定してbreakできるようにしてほしい >>831
使わねーよノーマルさんなら
変態の自覚がない真性変態め goto を使わないようにというのは
昔、ダイクストラ大先生が「gotoは有害だ!」
とのたまわれたので、それ以後gotoを使わない
構造化プログラミングというのが流行ってFortranなども
Fortran 77で一部構造化されたりしてきたという経緯が
あります。
たしかに、昔のBASICプログラムはやたらgoto が多くて
まさにスパゲッティプログラムで論理を追うのに苦労しました。
最近のBasis(たとえばFree Basic)などは構造化されていて
使いやすく感じます。
Cもgotoを使わなくて書けるのですから、やむおえない
(gotoを使わなければ、どうしようもない)場合場合以外は
使わないにこしたことはないと思います。 ダウト
昔のBASICはGOTO文のせいで読みづらいんじゃない
最大のネックは変数が全てグローバルであること
次いでFOR文のNEXTの自由度が高すぎることだ
メインフレーム脳でPCを語るジジイどもが
行番号を批判していたが的外れもいいとこ >>833
gotoの使い道なんてそのパターン以外ないな。 Linuxカーネルで登場するgotoをざっくりgrepしてみたらラベルの種類は1000種類程度
top10は以下
12257 out
2534 err
1609 done
1520 error
1415 fail
1351 exit
737 unlock
493 retry
421 again
368 bail grepが雑すぎた
1753種でtop10は以下
2つ目のoutは先頭にスペースあり
12257 out
2534 err
1609 done
1520 error
1415 fail
1351 exit
1213 out
737 unlock
493 retry
421 again >>818
初心者…gotoを使いまくる
中級者…gotoを一切使わない
上級者…適材適所を覚える >>818
内部的には全部goto(継続とか)だって事を理解すれば、適切な使い方が出来るようになる。 ドラクエもテトリスもファイナルファンタジーも全部
C言語で作っているのですか?ふと疑問に思いました。 >>836
知識30年以上前で遅れてないか?
C言語なら理由があるgoto文は普通に使われるぞ
他言語で言う例外処理機能やラベル付きbreak文が無いからな >>846
> C言語なら理由があるgoto文は普通に使われるぞ
さすがにこれは言い過ぎだろう。
ただしgoto不要論も50年前の理論であり、盲信するのも間違いだというだけだ。
問題は、goto を無くしたいだけの理由で余分なフラグやループ(もどき)を導入する是非だ。
ソースが余計に見にくくなるのは事実だからね。
最近の風潮なら、linter等によって「間違ったgotoの使い方」を検出できるようになれば、
gotoは完全にありになるだろう。
問題はこれが難しい(と言うよりやる気がない)ことで、
Cのノリなら「お前が間違えなければいいだけ、何故特化文法が必要になる?」になってしまう。
ラベル付きbreakとか、導入しても俺はいいと思うけどね。
例外については、今のところ他言語でも上手い解を見つけられていない。
goto文を使った場合はあくまで自関数内のtry-catchになってしまうが、正直、これで十分だ。
OOPでの継承先からのcatchとかを許可すると、便利な反面、密結合になってしまい、
noexceptとか言いだしているし、完全にあっちは暗礁に乗り上げつつある。
Cだと最初からnoexceptしかない。OOPが色々屋上屋を架しているのも事実だね。 毎年どっかのスレでGOTO戦争起こってる気がする。 goto使えないなら、setjmpにマクロ被せてtry〜catch風にしちゃえw >>836
「gotoは有害!」と言われるそのgotoは昔のBASICみたいな、別のサブルーチンの中に無節操にジャンプできる機能のことだったんじゃないかと思われる。
関数の外に飛べないgotoなら、関数の行数が少なければさして問題じゃない。 gotoのラベルって、関数内しか有効じゃなかったっけ? こんな時代だからこそあえてmain関数にすべてを詰め込むプログラミングスタイルを確立していきたい あー。別サブルーチンにgotoあったねえ。
6502アセンブラで書かれた Apple ][ のモニタプログラムにもそういうの結構あって当時すげえとか思ったが、無理矢理2KBのROMに押し込むための苦肉の策だったんだよな。
当時はメモリが高価で少ないのが当たり前だったから何でもかんでもトリッキーな方法使って小さくしてた。 >>851
試してみ。お前のコンパイラは何か違うかも知れない。
ただし出来た場合、それをC言語と読んで良いのかどうか悩ましいところだ。
それと、一体どのようなコードを作っているのかが気になる所だな。
>>852
変なことに挑戦するなよw
Cだとそれできちゃうんだからw >>836
> 昔、ダイクストラ大先生が「gotoは有害だ!」
> とのたまわれた
本人が書いたわけじゃないけどな >>851
むかーし、データ受信専用のホストアプリ作ったときは、setjmp、longjmp使ったな >>851
ああ、>>850 で書いたのはもちろんC言語のgotoじゃない。
そもそもgotoはよくないという主張が叫ばれたのが1960年代、C言語ができたのは1972年らしいんだから。 ガチの初心者で申し訳ないんやが...。
unsigned char型変数には8ビットしか入らんはずやのに
0〜255の数値が入るのはなんでなんや?
8ビットを二進数変換すると11111111でこれを10進数に変換すると255になるのは分かるんやが
なぜ255の半角が入るのかがわからんのや。
#質問するとこ、ここで合ってるよな? >>859
うん、”255”の半角を入れるなら終端文字まで含めると4バイト必要だね
‘2’(0x32) ‘5’(0x35) ‘5’(0x35) ‘¥0’(0x00) >>859
君がどういう勘違いをしているのかよくわからない。 >>861
小人さんがASCIIコードに変換してる すまん、いま投稿しようと思ったら、クソ規制に弾かれたわ
だから詳細が書けない。 たぶんこんな感じ
2進数で格納すると8文字(11111111)
16進数で格納すると2文字(FF)
10進数で格納すると3文字(255)分の領域が必要なはず
なのになんで10進数の数値255を
1文字分の領域(unsigned char型変数)に格納できるの??? 簡単に書くわ
signed char var = 255;
↑これが何故格納できるのかわからない。 >>868
さっきまでunsigned言うてたのに… >>868
signed charでは-1を意味しているけど
中身は同じ8bit(2進数で表すと11111111)だから格納はできる 何が分からないのか、それがよく分からない
1ビットなら、0,1
2ビットなら、0,1,2,3
3ビットなら、0,1,2,3,4,5,6,7
・
・
・
・
8ビットなら、0,1,2,3,4,5,6,7.....253,254,255
指折るなりしてちょっと考えてみよう >>861
それは255という数値を "255" という文字列に変換しているね
0〜255 の「数値」は 8 ビット = 1 バイトで表現できますよ >856
Edgar Dijkstra: Go To Statement Condidered Harmful
Communications of the ACM 11, 3(March 1968) 147-148
というように、ダイクストラ大先生が権威ある
Communications of the ACM
にお書きになっていますが。
この論文は検索すれ読めますよ。 >>868
数値としての255だからだよ。コンパイラが"255"の文字の並びを見て数値の255として扱って8bitのvarを初期化するコードを作ってくれるの。 >>877 そんなのネットですぐ分かるだろ、と「コンディダード」を検索したら
5ちゃんねるの「C言語なら俺に聞け 144」て掲示板の投稿877番がトップに出た。
最新のネット用語で言うところの「モルゲッソヨ」みたいな感じね。 >>875
だからその
> Go To Statement Condidered Harmful
って言うタイトルはダイクストラじゃなくてニクラウス・ヴィルト(Pascal作った人)が付けたって話な
ちなみに本人がつけたタイトルは A Case Against the Goto Statement
そもそも論文の中身を読めばgoto有害一辺倒でないこともわかる
読んでない知ったかさんがタイトルだけで騒ぎすぎ w >>876
なるほど、数値だから格納できるのか。
仕組みに関しては初心者が触れたら戻ってこれなさそうだから
「そういう物」って感じに覚えておくよ。 >>881
> 「そういう物」って感じに覚えておくよ。
まずはそれでいい
そのうち、あ〜そういうことね、ってわかる日が来るから CとC++、C#の違いすら把握していない初心者だけど
構造体っていうのはC++にのみあってCにはない概念なの?
ポインタはCにもあるよね? >>1
>>1 > C言語の話題のみ取り扱います
どうぞお帰りください >>886
そうかな?
MISRA-Cの一つの出口の原則を守りつつ、ネストもあまり深くならない。
問題と言えば、一瞥して「これはヒドい」と思う人がいるのと、retの評価コストと、retの使い方に一貫性を持たせないとバグを生むリスクくらいじゃないかな? 簡単なSTGが作れるようになったが次は何を勉強したらいいんだ?
まだまだわからないことだらけだ
指定子だとかポイントだとかアロー演算子だとかまだまだ >>890
自分が作りたいものがないんならやる意味ないよ >>892
ゲームボーイのQビリオンの動画を見ると
実装方法が自ずと思い付く >>891
そんな意味なんて人それぞれやん…
バカじゃねえの >>890
time_t とか struct time とか使って書いたことある? >>890
時間制限付きの算数ドリルなんてどうや? 宿題もたいがいだけど、その上をいくな
(既に〆てる奴なら上位の回答見れないのけ?) プログラムはある程度かけるけどそういうコンテストみたいなのってからっきしダメなんだよなあ
将来これでやってけるのか不安 プログラミング・コンテスト・チャレンジブック、第2版、2012
1年掛けて、この本の問題をやれば? 与えられた希望一覧の中の希望を1番多く叶えられるようなチェック柄の位置に対する叶えられる与えられた希望の数を求めるらしい(´・ω・`) 複数の条件 (xi,yi,ci) ci =白か黒 と 市松模様の大きさ K
KxK の市松模様を任意の位相でプロットし(=(周期2Kの中で)位相を適当に振ったとき)
与えられた条件をできる限り満たしたい。 変数は位相
解で要求されているのは満たした条件数 シカくんが塗りたいマスの一覧
シカくんは出来るだけ多くのマスを塗りたいらしい。 出来るだけ多くのマスを塗りたい(希望一覧の中のマスの中で) どうやるの?
パターンを全種類生成してから条件に合わないものを弾いていくの?
数学苦手だから分からない>< あー。なんとなくわかってきたぞ。白か黒かに塗りたいのはその指定された座標の1マスだけということか。
その希望を実現するためのマス目を求めるってこと?
でもその出力例ってなんなの?数字一つしか出力されてないけど。なんの値が出力されてるの?マス目の一辺の長さ? 希望を出来るだけ多く満たせるようなチェック柄の位置に対する満たせる希望の数を出力するらしい わからんw
しかし、わかる必要性もないような気がしてきたw
わからない事はわからないままにしておこう。
きっと今はその時ではないのだ。 シカくんが塗りたいマスで実際に塗れるのは何個か求めるんだよ(>_<) N=100000、K=1000の場合、考え得る模様のパターン数は幾つになるのかな?
全部計算するのに何分かかる?
生成パターンを保存するためのメモリ容量は何MB必要? 模様のパターンは 2K × 2K 通りで時間はO(N×K^2) >>920
もうよい。昔の事は忘れようではないか。w
ていうかここでこの話続けるのもスレチな感じがしてきた。C言語かどうかの問題じゃないし。 確かにパズルの解き方の部分と、Cによる実現は別々に考えた方が良さそう。
それにしても問題文が酷いね。
たぶん元は外国語で、サイエンティフィック・アメリカン誌の
読者への問題コーナーみたいなノリの文章だったんだろうけど、
日本人向けにはまるまる再構成すべきだわ。 解き方のイメージとしては↓こんな感じ?
x = (x[i] /K) & 1;
y = (y[i] /K) & 1;
c = x^y;
if (c1==c) count++; ニキ質問!
頑張ってくるCといかいうサイト終わりそうなんだけど、2冊めってか次やるなら何がいいっすか? >>927
そのサイトは知らないけど、解説読んだり課題解くだけじゃ大して進歩しないから、とにかく自分でコード書いて悩んで調べて考えて乗り越えるのを繰り返してみたら。やってるうちに自分が理解していないのはどこか、自分がやりたいことに必要な物が何か分かると思う。
あと、こういうことやりたいのにこんなめんどくさい方法しかないの?って思うようなことは既に上手いやり方が確立してたりするから、そういうのも一度自分で経験してから身につけると理解が深まると思うよ。 >>927
「C実践プログラミング」 でCの文法、make、gdbなど、基礎を習得
↓
「C言語ポインタ完全制覇」 or 「秘伝C言語問答 ポインタ編」 でポインタに関して完全理解する
↓
「エキスパートCプログラミング―知られざるCの深層」 でスタック、ヒープ、リンカ、ローダなど周辺知識を習得
↓
「C言語によるオブジェクト指向プログラミング入門」 で大規模プログラムの作り方を学ぶ
↓
「C言語デバッグ完全解説」でバグに強いプログラムの記述法をマスター
↓
「Code Complete(上)(下)」でより良いC言語プログラムとは何かを各人で考察する
↓
神の誕生 神だってお
どんだけレベル低いんだよ
まあレベルの問題でもないんだが
なにがしか発明をしてやっと神界の入り口だぞ 青色LEDとかflashメモリーとか発明して初めて神の領域 己の創りたもうた世界に住人がいなきゃ
どんなにレベルだけ高くても神と呼んでくれる人がいない ハードなんかいくら発明したって、神になれる訳ないよ >>933
その場合は呼んでくれる人が居なくても最初から神に確定してるのでどうでもよい。
まあしかし夢の中では夢の世界を作ったのは自分なのに、その夢の中の登場人物は特に崇めてくれないのと同様に、本物の神は普通は崇められていない。 ん、俺はあくまで喩え話をしていたんだが
ガチの宗教論になってきたのか? 宗教論なら、gotoは悪とかreturnは関数末にひとつだけ論とかやろうぜ? 質問。
1/3を3回、6回、9回足し合わせる計算を単精度と倍精度でそれぞれ行うプログラムを作ったんだけど、
6回足したときの結果が単と倍で逆転しているような気がする
これってプログラムがおかしい?それともこうなるようになってる?
プログラム
https://imgur.com/ncjlu.jpg
実行結果
https://imgur.com/QpRfO.jpg >>940
10進数に直した時に小数点以下20桁ないからそうなるだけでは?
どちらも本当はだめなんだけどビット数の都合でうまいこと10進で丸まる事があるだけだと思うが。 >>940
これと同じなら10進数では小数点以下は15桁だ。
http://www.cc.kyoto-su.ac.jp/~yamada/programming/float.html 分数を実数で扱うからこうなる。
分数なら分数のまま、分子と分母が扱える型を使って計算しろ。 分数なら、Ruby の、Rational とか
浮動小数点は、常に誤差があるから、
正確な値は表せないから、== で比較もできない
また、式の順番を入れ替えたり、コンパイル時・実行時で、
同じ式でも値が異なるとか、とにかく実装依存 C使いにオヌヌメするならC++だろ
分数クラスはないが、標準にgcd関数があるから
小学校の算数ができる人ならすぐ自作できるし、
ratioなら翻訳時評価までできる >>930
紹介してる本は良いものだと思うけど、入手性はどう?
今でも新本で買えるのかな。
…いや、俺の経験じゃ古本屋ではついぞ見かけなくてね。 cでカーネルとか書いたことないからアレなんだけどmalllcとかfopenとかどうやって書いてるのかしりたい >>947
ターゲットのOS、CPU、コンパイラーのC実行時ライブラリー(C runtime; CRT)のソースを探せ。 malloc() の原理というか基礎的な実装方法は
『プログラミング言語C』で1章割いてた記憶がある。
まるまる1章じゃなかったかも知れんけど。
あとは「標準ライブラリのmalloc()は遅くて使い物にならん」と言って
でかいメモリブロックをひとつだけシステムから借り受けた後、
小分け部分は自前で管理する実装がネットのあちこちで紹介されてる。
TLSF とかいうアルゴリズム。 >>947
その辺は glibc とかがソース公開してるんじゃないかな。
でもそんなに難しくないよ。
ある程度わかってくると自作もできる筈。
既にあるので作る意味ないけどな。 >>951
その小分けの階層構造に愕然とはしなかったのか 若者はinetdのソースを是非読んで欲しい。
貧乏くさくて涙ちょちょぎれるぞ。 最近組み込みやデバイスドライバでもC++使われるのが増えてきたけど、Cの未来ってあるのかな? 縮小傾向はあるのでは?しかし、UNIX系OSが根強いから中々なくならんだろうけどね。
特に Linux が組み込み関係や Android で物凄く広まってほぼ定着してしまったからな。 組み込みLinuxやAndroidではC言語ってそんなに使われてないと思うが 例えば組み込みLinuxとして有名なRaspbianではPython、またAndroidではJavaが主流
直接カーネルでも弄るような特殊な事例を除けば、C言語でのアプリ開発なんか殆ど誰も行なわないだろ C++ はひどい言語だ。これは、多くの平均以下のプログラマーが使ってるために
さらに輪をかけてゲロゲロになっていて、どうしようもないゴミが
簡単に生産されるようになってる。正直いって、C を選ぶ理由が C++ プログラマーを
追っぱらうため *だけ* だったとしても、それ自体、C を使う強力な理由になりうる。
つまりこういうことだ: C を選ぶのは、唯一のまともな選択だ。
ぼくは C よりも C++ をプロジェクトに使いたがるようなプログラマーは、みな
*本当に* ムカつかせておきたいようなプログラマーだという結論に達した。
C++ はトンでもなく悪い設計の元になりうる。どうせこの言語ではいつも STL やら
Boost やら、その他ゲロゲロベロベロの「素敵な」ライブラリの機能を使って、
それがあんたのプログラムに「役立つ」んだろうが、以下のことが起きる:
- うまく動かないときにもたらされる際限のない苦痛
- 非効率な抽象プログラミングモデルで、2年たった後にこれらが実はそんなに
効率的じゃなかったことに気づくケース。
言いかえれば、唯一まともで、効率がよくて、システムレベルで使えて、移植性がある
C++ ってのは、基本的に C で使える機能だけに限ったときなんだ。そして C だけに
限定するってことは、他の人がそれをめちゃくちゃにしないってことで、
ついでに沢山のプログラマが実際に低水準の問題を理解することができて、アホらしい
「オブジェクト・モデル」のたわごとを持ちこまないってことだ。 >>962
FILE* は優秀
time_t とか struct tm は糞 >>963
そういった分野ではOS自体が必要無いしな
ファイルシステムやコンソール入出力が存在しない場合も多い
メモリと入出力ポートさえ直接制御出来さえすればいい
アセンブラに比べればC言語の方が主流ではある 「組み込み」て言葉を、プアなハードウェア環境をギリギリ限界まで使う、と
寸法は小さくても目的には十分以上の能力を持ったコンピュータ、と
両様の意味で使ってて議論がちぐはぐになってるように感じる。 選択肢がないと言うのは語弊がある
とことんまで高速性を追求するならアセンブラということになる >>961
ああ。アプリ開発ではCはほとんど使われてないだろうな。 OSそのものがCで書かれているからと言って応用アプリもCで書くのか? >>962
Linusと書いてなくても、元の英語のままでなくても内容からしてLinusが書いたとわかってしまうなw とことん高速求めるなら、FPGAでワイヤーロジック組めよ。 >>972
それはOSとは関係ないがLinuxの場合組み込み用のボードでよく使われている関係上使われる率は今のところ高いんじゃないかな。
Cだと最終的に作られる実行形式のバイナリが小さいというのもあるしね。 >>972
書くだろ
アプリと言うから違和感あるけど、制御プログラムなら今でもCは普通に使われてる まあしかしソースが公開されていて誰でも開発に参加できるOSがCで書かれているとなるとそのOSが使われ続ける限り最低でもそこでCが使われ続けるということだからCは消えないだろう。
俺の予想では別の言語をベースにして作った互換性のあるOSが爆発的に流行してLinuxやUNIX系OSを誰も使わなくなった時にCが完全に廃れると思う。なので100年以上先なのではないかな。
(途中time()の都合で改造が入るだろうが、それが元でOSごと全部廃れることはないと思う)。 ちょっと前のパソコンスペックのlinux機だって組み込みと言うし。 なんでパソコンってアプリケーションから書き換え可能なFPGAを搭載しないの?
その回路を使って光速で処理できるのに... 標準じゃないだけで
載せたければいくらでも載せられる プラス数万円程度のFPGAじゃあ性能なんてたかが知れてるだろう。
Intelがチップセットに内蔵するというならともかく。 ニコニコ動画かどこか忘れたけど動画の処理をFPGAに実装できるらしいけどあれって高いのかな >>983
数年前にドワンゴがFPGAかASICだか開発して販売するとか記事読んだ覚えあるわ
すっかり忘れてた
その後続報聴かんし >>979
FPGA は ASIC に比べると「遅い」 速くなるかはさておき、C/C++でのFPGA設計はRTLより楽ではある ふと「最近 \e ってネタ聞かなくなったなぁ」と思った。 ASIC って書き換え出来ないやん?
>>979 の意図で ASIC は無いと思うんだが >>989
だから FPGA は遅い、といっている セットアップ時間が掛かるって話と、応答速度がごっちゃになってるけど、わざと? ASICはApprication Specific ICというだけで、フルカスタムという場合もある
ただし、それだけが理由ではない
仮に自分とこがフルカスタムでも、それはIntelと同じ土俵に立ったに過ぎない
開発費を同等以上にかけられるとは限らないがね セットアップ時間の話なんかしてないと思うがな。
回路構成を変更できるようゲートアレイだから遅いと言ってるんだろう。 またアホがトンチンカンな事言ってるw
FPGAは論理合成された結果だけになるから
下手なロジック回路より速いんだぜ。 ASIC, FPGA, ゲートアレイの用語が混同されている気がする まさか、ASICは論理合成しないとでも思ってるのか。
>下手なロジック回路より速いんだぜ。
これも意味わからん。FPGAはロジック回路じゃないとでも?
それとも、いまどき「下手なロジック回路」をASICで作るとでも? そりゃFPGAでバグ取りした回路がASICになるんだからだろ? このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 58日 2時間 58分 23秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。