C言語なら俺に聞け 153
レス数が1000を超えています。これ以上書き込みはできません。
仮想アセンブラは、元々、日本の情報処理資格試験用に、CASL2 が作られた。
個別のCPU 命令では、試験にふさわしくないから、抽象化した命令が必要だった
でも、世界的には流行らなかった
それで、学生が作った、LLVM に、Apple が飛びついた 実像を見てない試験で社会から乖離してるな
バkの集団なんだろうか?
それともz80の問題だしたらライセンス料でも払わないといけないのか?
カネに掛けてはとかくケチな貧乏人が思い付きそうな小手先だ
至るところで独自規格で無意味の羅列、全く学習にならず、受けるだけムダな試験が練り上げられる 試験用のアセンブラは、仕様を公開せずに
試験問題の中で初見にすればいい
それで対応力を試すようにすれば
いくらか意味のある試験になる 以前に実施されていたマイコン応用システム開発技術者試験のアセンブラ問題は8080, Z80, 6800からの選択だった
現在の情報処理試験エンベデッドシステムの前身となった資格試験 実際に使えないものを教えられてるのは英語と同じだな
CASLやっても機械語の練習にならない
「教育用」にまで形骸化すると使い物にならない、現実と実用から乖離する、ファンタジーになる、
これが「教育用」の弊害だ
PASCAL不人気の原因もここら辺にあるんじゃねえか?
IT界隈は教育用と実用の間で揺れてる >>2 先生 700行の数式パーサーまたHPに載せて下さい! コンパイルもリンクも正常に動いているようだぞ
生まれたのがバグじゃなくて良かったな ha ha ha http://program-lecture.info/c_structure5.html
ここのサイトを見ながら学習しているのですがこのshowStatus関数では何故int配列を
int型の仮引数で受け取れてるのでしょうか?配列は配列かポインタでしか受け取れないと思ってたんですが
その認識は間違ってますか
よろしくお願い致します。 >>13
showStatus()はint型でもint型配列でもなくcharacter型を受け取ってるようだが? showStasus() の引数は struct person 型の実体を受けてる
main では
struct person 型の配列を用意 party[]
配列の各要素 party[0], party[1] のぞれぞれについて showStatus() を呼んでいる
本質的には
void foo(int arg);
int main() {
int array[2];
foo(array[0]);
foo(array[1]);
return 0;
}
これと同じ >>15
理解出来ました。ありがとうございます( ;∀;) >>8
あのコードは今となっては時代遅れだ。意味がない。 下のコードの部分を実行すると、最後の行だけ2回表示されます。
理由はなぜでしょうか?また、最後も1回にするにはどう変更したら良いでしょうか?
よろしくお願いします。
http://codepad.org/WCL1vHLd >>20
if ( !fgets(buf, sizeof(buf), fp) ) break; >>21
サンクス!
While 行と fgets 行の間にその行を入れたら1回になりました。
修正はこれで良いのでしょうか? >>22 の修正だと最後の行以外にもだいぶ表示されなくなってました。
どうするのが正解なのでしょうか? 良いのか?って聞かれると
色々言いたくなる奴が大勢出てきそう >>23
//while ( !feof(fp) ) {
while (fgets(buf, sizeof(buf), fp)!=NULL){
//fgets(buf, sizeof(buf), fp);
こんなんでどうか >>25 うまくいきました! Thanks!
やっぱり俺に訊けスレですね。ここの人達はすごい。
if ( (fp = popen(cmdline,"r")) == NULL ) {
perror ("can not exec commad");
}
while (fgets(buf, sizeof(buf), fp)!=NULL){
printf("%s", buf);
}
pclose(fp);
最終的にこうなりなした。助かりました。 Ruby では、Windows の、powershell, clip コマンドも呼べる。
UTF-8, CP932 の文字コード変換もできる
クリップボード内の複数行文字列の、各行の先頭・末尾から、
連続する空白類を除去して、クリップボードに入れる
str = `powershell Get-Clipboard`
str.encode! Encoding::UTF_8, Encoding::CP932 # UTF_8 へ変換
ary = str.each_line.map( &:strip ) # 連続する空白類を除去する
IO.popen( 'clip', 'w:cp932' ) do | clip | # CP932 へ戻す
clip.print( ary.join "\n" )
end defineマクロで以下をやりたいです。
struct my{
int d0 =0;
int d1 =0;
int d2 =0;
int d3 =0;
int d4 =0;
}:
struct my val;
val[0:2] = (1, 1, 1);
と入力した時にvalのdata0〜data2に1が入るようなマクロはどう書けばいいですか? __VA_ARGS__ つこて2段呼び出しだな
qiita.com/saltheads/items/e1b0ab54d3d6029c9593 >>29
ありがとうございます。
リンクを参考に、可変引数にするマクロまでは出来ました。(作った関数が間違えていたらすみません。)
struct my def2(struct my val, int s, int e, int d1, int d2){
int *p = val.d0;
*(p+s) = d1:
*(p+e) = d2;
return val;
}
/*def3省略*/
#define GET_MACRO(_1,_2,_3,NAME,...) NAME
#define DEF(val,s,e,...) GET_MACRO(__VA_ARGS__, def3, def2)(val,s,e,__VA_ARGS__)
ここから、表記を変える方法が分かりません。
下のようなことをしたいのですが、このように書くとコンパイルエラーになりました。
どう書けばいいでしょうか。
#define VAL[A:B]=(...) DEF(VAL,A,B,__VA_ARGS__) マクロ使わずにこれで十分だろ。
typedef struct my;
val = (my){1,1,1};
val = (my){1,1,1,1};
以下のようにはできるけど、
マクロの多用は誰もソースを読みたくなくなるから避けたほうがいいよ
#define SET(v,...) v=(struct my){__VA_ARGS__}
SET(val, 1, 1, 1) >>31
すいません、説明不足でした。
どうしてマクロかと言いますと、3つのデータを入れたい場所が0〜2だけではなく5〜7や2〜4の場合もあるからです。 #define SET(x,s,e,...) memcpy(((int*)&val)+s,&(int[]){__VA_ARGS__},sizeof(int)*(e-s))
SET(val, 1, 3, 1, 1)
SET(val, 1, 4, 1, 1, 1)
部下がこんなコード書いてきたら突っ返すわ ID:Y/GLm+KZ0 が上司だったらと想定してみよう。 うーん、どうにかして上のように[]を使って書き換えることは出来ないのですかね。
ちなみに下のようにして全パターン定義しようとしたらエラーでした。何故でしょうか。
#define val[0:2]=(...) DEF(val,0,2,__VA_ARGS__) >>37
なぜって、#defineを使用するための構文を完全に無視してるからだよ。こちらが思ったことを都合良く解釈してくれるわけでなく、構文通りの単純な置換をしてくれるだけだよ。
一度ちゃんと調べておいた方がいい。 >>39
なるほどです。
では、[]や:を利用して独自の構文を定義するのはC言語において不可能、ということですか? >>40
不可能。やるなら自前でプリプロセサでも書けばいいが、そんなことするくらいなら、ソース上に書くのではなく独自のデータファイルとそれを読み込んでデータを初期化するような処理でも作れば? >>41
ありがとうございます。
最終的な目標は、Cを他言語ライクな記述でコーディングすることなので、プリプロセッサについて調べてみます。 新言語作った方が良さそうな。
初期のC++みたいにC言語へのコンバータとして作っちゃえば楽だと思う。Cと同じで良い部分はほとんど素通しで行けるし。 あの変態的にC言語には見えないObjective CでさえほとんどプリプロセッサでCに変換してからコンパイルしてたと聞くので、やろうと思えばできるんだろうね。 独自言語を開発したときなんかはとりあえずCに変換するというのはわりとある話。
コード生成とか最適化とか考えずに済むから。
昔、独自じゃないけど、とある言語からCへのコンバータ作ったよ。
楽しかった。 コンパイル前にソースを別のソフトで変換、置き換えさせて・・・ #define ARR_NAME(n) arr##n
int arr0 [] = {0,0,0};
int arr1 [] = {1,1,1};
int* select_arr(int i){
return ARR_NAME(i);
}
これはどうしてコンパイルエラーになりますか?
ちなみにreturn ARR_NAME(0)だと正しく動きます。 タイミングの問題だ
#defineはコンパイル前に解釈されるが
関数仮引数の値は実行時に渡される
実行時とはコンパイル〜リンクまで全て終わった後の話だ
だから関数仮引数の値を#defineで置き換えることができない arriという変数はない。プリプロセッサでは変数の中身までは見られない。 分かりやすかったです。ありがとう。
この機能の代替として良き方法はありますか?配列のdimを増やすしかないですか? 配列変数名はコンパイル時には分かっているのだから
その配列のアドレスを格納したポインタ配列を用意してやる __、
iー'゙゙゙゙''''ー-,/^´ ゙';
| ゙ゝ....‐ .}
! |,
i____________......r'".'''゙ヽ . ..,,、
,,. -/ `'ー | .' 、
,..-'" l゙ __.. -''′ ./
. ,/ .`''''〜- ....---''''"゛ ,/
/.,, ,,..r'"
`''ー、,、 _,,,-'" `!、
/'r‐、 ,/´ /゙゙', ヽ
/ レ'゙ ´゙リ´ . `^^゙゙゙゙゙゙厂j .! │ . l
/ | .l. 丿/ / . / !
l ! .,,....--ー'''''''″ / .| (、 . !
_ .ィ‐¨゙゙'广゛ ...... ./ ,ノ.l. `'ィ ..,,_/
..-‐'"゛ 'l_゙'ーノ`' ..........,,_ .,, -" / │ .! ゙''''-.
.i''i ヽ、 / .! !
,)イ : ..,,,,,>u;;;;,、.__ _,,,.. / | "
/ . 、 ! .` |
!, ,!
." ゙ グローバル変数を宣言する時、ヘッダファイルでextern int hogehoge;ってするよね。
*.cからヘッダファイルをincludeすると、
extern int hogehoge;を毎回書いたのと同じ状態になるの? そうだよ
includeはファイルをそのまま展開するだけ >>60
被参照側(メイン)に int hogehoge と書く
参照側(サブ)には extern int hogehoge と書く
これが基本です、*.h を使うのなら
*.h に extern int hogehoge と書く
被参照側(メイン)に int hogehoge と書き、*.h をインクルード…@
参照側(サブ)は *.h をインクルード
@でヘッダと実体に矛盾がないかチェックします お前がC言語を 使う前に
言っておきたい 事がある
かなりきびしい話もするが
俺の本音を 聴いておけ
初期化前の変数を 使ってはいけない
gets()関数も 使ってはいけない
文字列の長さと 配列サイズは別物だ
使い終わったバッファは ゼロクリアしろ
できる範囲じゃなくて 全部やって
https://twitter.com/satoru_takeuchi/status/1176429522687676416?s=03
https://twitter.com/5chan_nel (5ch newer account) >>64
> 使い終わったバッファは ゼロクリアしろ
これは要らんやろ パスワードやらなんやらの機密情報を保存したバッファは解放前にゼロクリアしようねという話です。
任意のバッファという意味ではありません。失礼しました 物凄く初歩的な質問で申し訳ないのですが
1%5のような余剰計算をした場合解は5になるのでしょうか0になるのでしょうか それC言語固有の話じゃないし個々にやるべきかプロセス毎にやるべきかとかのポリシーもあるし >>66
元のツイートした本人か。
ここ見に来ているとは思わなかった。 ゼロクリアだとそこだけ異様にキレイなので逆に重要な値が入るものと察知される
乱数値でクリアすべき 一々乱数計算しなくても数パターン乱数表つくってメモリコピーでもいいんじゃね? そもそもゼロクリアされてるbss領域なんて重要なもの以外にも大量に存在してるので攻撃者がピンポイントで判断することなどまず不可能。
逆に綺麗すぎる乱数のほうが目立つ。 そこだけにするからバレると言うなら全部ゼロクリアすればいいってことでしょ
> 使い終わったバッファは ゼロクリアしろ
> できる範囲じゃなくて 全部やって 今の流行りは不変プログラミング
スコープが短い云々ではなく使い捨て
再利用なんてしない HDDだと少数回のゼロクリアじゃデータ復旧される可能性が残るけどメモリだったらその心配はないのかね? >>78
DRAMはリフレッシュがあるので原理的に不可能な気がする。
SRAMもフリップフロップなら不可能な気がする。 スワップされてディスクに書き込まれたら終わりなのでスワップされないようにする必要がある。 windowsの細かな動きがわからんけどスリープとかでメモリ内容を全部ディスクに保存する動きしない?
するなら言語レベルではどう頑張ってもディスクにデータを書き込まずにスルーする術なんてないんじゃなかろうか?
ということは漏洩防止目的でバッファをゼロクリアする意味は無い?
windows以外は知らん スリープ処理って関数実行中でも起きるの?
メッセージ待ちとかで起こると思ってた。 多分priemptされてたら実行状態でも普通にswap outされるだろうな。 スワップに書いてある内容がどのプロセスのものかをどうやって知るつもりなんだろう…
てかそんなのがわかる状況ならそもそもセキュリティうんぬん言ってもしょうがないと思う Linuxにはmlock()がある。
https://linuxjm.osdn.jp/html/LDP_man-pages/man2/mlock.2.html
多分他のOSにも似たようなのはある筈。
なければ高度なセキュリティが必要なプログラムは作れない。 サスペンドでメモリ内容が全てディスクに書き込まれるような場合は暗号化サスペンドイメージを使うように予め設定しておくしかないようだ。(もはや言語の問題ではない。OSの問題)。 最終的にはOSやらハードウェアファームやらのレベルの話に行き着くんで上位レイヤーでの完全対応は無理
ならば他アプリが自アプリのバッファにアクセスできないよう下位レイヤーが保証してるならバッファクリアは不要ということになる?
そんなレベルで心配が必要なことは個人的に触ることは無いと思うけど 関数ポインタの書式と宣言方法がわからぬ(´・ω・`)
だれか助けてクレメンス ここで講義始めるわけに行かないんだからもっとspecificに頼むよ Makefileなどに書かれているCCって「C Compiler」の略でしょうか? まずは燃料投下する必要があるんじゃないかな。C言語はダメとかクソとか、あるいは引数にvoidなんて見たことないとか、そういったことを書けば火が付いて3スレぐらいあっという間に消費すると思うよ。 C言語がクソなのは誰の目にも明らかだから燃料にもならない
何を犠牲にしてでも最速を求めなければならないとか
今時キロバイト単位のメモリしか載ってないとかで渋々使わざるを得ないだけ >>102
プログラムに関係する問題を人に伝えたく、かつ、言語固有の事情をできるだけ排除したいときにあえて c で表現することはあります、普段書きはすでに c++ ではあるのですが
https://mevius.5ch.net/test/read.cgi/tech/1551247748/442-443 かと言ってC++にそんなにメリット感じないんだよなぁ。 python最強!python最強!python最強! あんなに活気のあったスレがこんなに寂れるとは
5chから人が減っているという噂は本当だったか・・・ 誰かYouTuberになって布教活動すれば良いんじゃないか?
この際VTuberで美少女だけど実はおっさんがやってるってのでも良い。 >>109
C 宿題スレも激しく活況だったのに、ね、… そう言えば中国にもYouTubeみたいなのがあってYouTuberのようなのをやってる人も居るのだが、顔を若く変換するアプリ使って40代だか50代のおばちゃんが20代ぐらいに見せかけてやっていたってのがあったなあ。
そういうの使えばお前らのハゲもフサフサになるに違いない。 顔を変換するアプリと言えばアダルトサイトに芸能人の顔を合成したAVが上がってたな
見た感じ本物と区別付かないぐらい精巧だった
個人的にここ最近の技術革新では一番衝撃的だったな >>111
>>114
のらきゃっと + 顔バレあたりで現代に触れよう printf("%*d", width, num);
と
printf("%2$*1$d", width, num);
がなぜ等価でですか?だいたい等価?正確に等価? ずばり日本人って利己的な奴ばっかだから会話から何まで発展しようがないんだな。
後はもう負の連鎖。 ワッチョイ取ったほうがいいんじゃないの?
なんでワッチョイ付けてるの? 荒らされることで活気を保つというのもまたナンだなあ 本音だけど、何処の板もそうだけど、噛みついてくるのはすぐさま来るけど親身になって
答えてもそのまま逃げる奴ばっかだし、そりゃ人減るよ。
答える奴には聖人を求める癖に自分がカスすぎるじゃん。 他人に対する期待が多すぎるやつは
いつも文句ばっかりぬかしてて
思い通りにならないと発狂する 依存じゃなくて利用だな
他人なんて自分がラクするための道具でしかないという なくても困らない代わりはいくらでもあるものに対して依存しているとは言わない $ ctags -R /usr/include/alsa
をしても、int snd_pcm_open(...); 等が tags に記載されない。
どうして? どうしたら? >>133
ctags --c-kinds=+p -R /usr/include/alsa
でどうだろ。
見当つくだろうけど「Cのプロトタイプ宣言部分も出力に加える」の意。
どうして、の答えは「デフォルトではプロトタイプ宣言部は対象外だから」だね。 構造体のメンバ変数に、関数のポインタ変数を入れて、クラスのメソッドのような感じで使ったりできると思うけど、そういう使い方って現実性あるかな? >>135
デバイスドライバのたぐいは大体それのオンパレードだよね >>135
C++がCへのコンバータだった頃はクラスをそんな風に変換してたんじゃないかな。
今はコンパイラが内部的にやってるんだろうけど。 組み込みプログラマになりたいんだけど入門書やった後は何したらいいの? そんな質問の仕方で生きていけると思ってるのか?
自分で考えろ >>141
横井与次郎さんの本が愛読書だったな、俺っち
手垢で真っ黒ボロボロ 組み込み用の何かを買ってきて何か作れば良いのでは?
まあしかしこの頃は小さい組み込み用のやつでもLinux動くのあるし、良い時代になったもんだな。 >>141
PICとかハードを直接イジれるやつを隅から隅までイジれ。
逆にラズパイとかはお勧めできない。 30日でできる!OS自作入門ってやつは組み込みの知識としては全く必要ない?
なんか楽しそうだからC言語の入門書終わったらやろうと思ってるんだけど >>153
あの本はCPUの知識ないと何をしてるか分からないまま終わると思う
だから知識が増えた実感も感動も少ない(経験談)
揃えるツールも多いし著者が用意した奴だし
個人的にオススメの勉強法は自分で考えたオリジナル言語をCのソースに変換することかな
文字列処理の知識で実現できてなおかつC言語に詳しくなれるし、他言語の構文を学ぶきっかけにもなる 楽しそうだと思うものをやるのが一番学習には向いてる
組み込みも幅は広くてOSがあったりなかったり様々
やって全く不要だったとはならんと思うよ 何を持ってダメ?なのかがわからんから答えようがない
何使ったって楽しく勉強できるなら関係なくない?
勉強すれば次が見えることもある >>157
ラズパイはダメってレスがあるからさ。Arduinoもダメなのかな?と思ってさ。
とりあえずやってみるわサンキュー
>>158
なんで? 組み込みは扱うものの範囲がベラボーに広いからターゲットが決まってないないなら
予備知識なんてそれこそ有りとあらゆる事を学ばなきゃならなくて時間の無駄
いきなりやりたいことに手を付けるとか目的の会社に就職する算段するとかの方が現実的 興味あるところを片っ端からやればいいよ
最近の新人はまともにコーディングしたことがない人が多くて驚く >>161
>興味あるところを片っ端からやればいいよ
至言ですね…
つまるところアドバイスできるとすれば、この言葉にまとまってしまいますね ラズパイでもArduinoでもPICでもブレッドボード用意してまずはLチカから
トランジスタや7セグをやって、スイッチからの入力などとれるようになったら
またそこで考える >>154
この本アセンブリとC言語の勉強になったりしない? >>154
式をコンパイルするところでだいたい挫折する >>164
ならない
はじめて読む486の方が486倍マシ まずはLチカでオームの法則を押さえよう
次はhFEだ フォトトラとダーリントン
フォトカプラとHブリッジあたりまでできるようになれば
あとはどうにでも 組み込みだろうが回路は回路の専門家が考える
ソフトの新人が回路に意見しても聞いてくれないよ 制御系の場合は、LTIシステム、Z変換など制御理論の基礎知識がないとそもそもプログラミングが出来ない
どの様にプログラムすれば良いのか迷い途方に暮れることになる そういうのは実際に使う場面になってから勉強すればいいよ
ソフトは範囲が広すぎてどうせ全て学ぶのは無理だから そういえば抵抗のカラーコードって色弱の人とかには辛いんじゃないか?
と、今ごろ気づく。 おじさんが若い頃は新人はPIOドライバを書くことから始めてたけど今じゃそれさえも最初からドライバやSDKで用意されてるものが多いしな。
組み込みソフト技術者を自称してる人でも最近じゃリセットエントリからSDRAM設定やスタック設定やセクション初期化とかmainがコールされるまでの部分を書ける人は少なくなってるね。 組み込み分野で、私はソフト屋でハードはわかりません、なんてぬかすやつはビルから投げ捨てろ >>173
色弱で前までは気合で読んでたけど最近はスマホアプリとかで読んだりもする なるほど。やはりそうか。
スマホアプリあってよかったな。 ものづくりC言語塾とかいうプログラミングの勉強サイト見つけたんだけどわかりやすいのここ 無駄なイメージ画像が矢鱈と多いね
チャッチャと本題に入ればいいのに
肝心のコードのフォントサイズ一回り小さくしてね?
逆だろ逆 分野的には制御&組み込みだが論理回路とかは初歩の初歩くらいしか分からんわ
別に組み込み屋を自称する気もないけど ポインタを返す関数の中身を他の変数にコピーしたいとき
int a;
a = *func();
みたいな事をしても良いんでしょうか?
コンパイルしたら動きましたが…
普通こういうことはしませんか? >>181
慢心せず謙虚でいるのはいいことだが
やる気のなさの言い訳にするやつに
同調はしないってことさ >>183
func() の作り方次第
int x = 123;
return &x;
とかやってたらダメ 極論すれば対象をモデル化して状態方程式をプログラムで逐次演算するアルゴリズムを実装するのが本来の制御系の組み込みソフト
論理回路のソフト処理への代替はコストダウンの一環で取り込むことはあってもあくまでオマケ >>178
抵抗って昔からカラーコードで抵抗値表してるのでは?今は変わったの? >>192
部品を小さくすると高速化できるので
チップ部品が増えたが、そこにはカラーコードは使われていないからでは。 >>183
良いんだけどNULL返されたらおしまいなのでそのためにワンクッション入れるのが普通なのではないな。
実際 localtime() なんかはエラーの時にNULL返す事になってるしな。自分の所の変数にコピーする場合はまずポインタで受けてNULLでなければポインタの指してる先がコピーされるように書くよ。 >>180
典型的なアフィwebサイトと同じ造りなんだよな
一目でそっとじ >>193>>195
あの小さい四角いやつか。
電子工作何十年もやってなくて知らなかった。
ググって画像見た。 core-i7のパッケージ天面にも貼ってあるから電子工作してなくても見かけることはありそうだが マイコン、ラズパイ、PLC, HDL, Rust
ニコ生では、HDLまで行ってるw https://ideone.com/y2Ogra
で0.3がFalseになるのはわかるのですが、0.2がTrueになるのはなぜですか? 一応環境依存
内部が2進数の浮動小数点なら
(普通の範囲なら)2倍は正確
0.3がfalseになるのがわかるなら
わかりそうなもんだけど double
https://ideone.com/9COXkq
0.2 True
0.3 False
--------
float
https://ideone.com/wzvO20
0.2 True
0.3 True 小数は無限個あるが
doubleやfloatで表現出来る値は有限個
だから正確に表す事が出来る小数はごく一部となる
ほとんどの環境では0.1を正確に表す事が出来ない
だから近似になる
0.1の近似を3個足したものの近似と
0.3の近似
これが同じ値になるかどうかは運しだい 多くの環境では
floatで24bit整数の範囲は正確に表現出来る
doubleで53bit整数の範囲は正確に表現出来る
floatでもdoubleでもlong doubleでも
元の値に対して2^nをかけても2^nで割っても
(それが普通に表現出来る範囲であれば)誤差はない
1/n は、nが2^mの形でない場合は必ず誤差が出る
このくらい覚えて置けばいい 趣味でC言語で遊んでるんだけど入門書読んで、
printf scanf if else switch等使ったプログラム作ったんだけど次に何をしたらいいかわからへんわ。 あんまりしっかりとポインタは勉強できてないんだけど、
ポインタっていつ使うの?って感じ。
組み込みやらんと基本的には使わない? 組み込みじゃなくてもある程度大きなプログラムになればガンガン使う
むしろ一番使う型になるレベルで使うのがポインタになることもあるくらいには使う ていうかscanfでポインタ使ってるで
文字列出力したなたprintfでも使ってる
はじめは実感無いかもしれんが 全く実感ない
printfってどうやってできてんの とりあえずポインタの勉強はやり直すわ。
次にArduinoでも触ってみるか オレオレprintf を実装しようとすると、鼻血が出そうで vsptrintf に○投げしてから加工する方向にいってしまう >>215
関数に値を渡すのはわかるよね?
printfって関数に出力して欲しい数値や文字を渡してる
この渡すときにCPUの動き的には複製されたものが渡される
数値なら複製しても対して問題ないけど文字列の場合なんかだと複製することで消費されるメモリが増えてしまう
だから文字列全部を複製なんかせずに文字列の先頭の場所だけ渡す
受け取ったprintf側ではその場所を元に文字列にアクセスする
この場所を指し示す仕組みがポインタと呼ばれるもの
10文字でも1000文字でも先頭の場所、つまりアドレスは4byteとかで表せるので情報の受け渡し効率が良い
正確には間違ってる部分もあるかもしれんがだいたいこんなイメージ >>217
そもそもvsprintfのある環境ならprintfあるでしょ。
組み込みとかなら低レベルの1文字出力は作らないといけないけど。 >>220
そんな感じですです あと暗に頭にタイムスタンプ付加したりとか
VZエディタのASMソース見たときは、整数onlyでも結構複雑だった ポインタを使わないならCを使わない方がいいという程度にはポインタはCの肝
ポインタを使わないなら素直に安全で高級な言語を使った方がいい エントリ関数を int main(int argc, char *argv[]) と書いた時点で
ポインタを使ってる、とも言えるんだよな。
int main(void) で始めてるかもしれんけど。 int main()しか使ってないわ。どういう時に使うんだっけそれ >>224
C言語を使う用途の多くは
組み込み、OS、ドライバ
だろ
簡単に言語を変えるとかいうなよ コマンドラインから情報を受け取って処理したいときに使う
関数の引数と同じ ポインタの使い方を覚えるって言ってるんだから
それでいいじゃん C言語でOS作ってみたいんだけどなぁ。入門レベルじゃきびしいな >>231
簡単なRTOSでもまともに作るならCだけで書くのは不可能。 >>234
ほんの少しインチキをするだけで、全てC言語で書ける バイナリコード直接記述?
それはC言語で記述とは言わないような
インラインアセンブラも同じ >>234
大半はCで行けそうな感じはするけどな。実際にUNIXやLinuxはそうだし。
厳密に完全に100%Cにするとなると最初からそれを考慮してCPU作らないとできないとは思うが、かといってその必要性はないな。研究目的ならわかるが。 >>237
こういう知ったかして無知晒すバカはどうにかならんのかいな 痛いのが好きなんでしょう
鞭も旨い
おそまつさまでした >>237
100%Cでどうやって特権命令出すの?
Cプログラムが動き出せる最低限の準備は何だか知ってる? 動き出すだけなら100%C言語って今時珍しくも無い スタートアップルーチンに頼らずにmain関数が自立起動するのか >>241
「すべてC言語で書ける」に突っ込み入れられてるだけだろ
>>242
OSの話だよ? > startup.s/head.s
明日から仕事来なくていいから。 >>243
スタートアップをC言語で書くって話でしょ
まあ気合いでなんとかなるさ >>241
大半を100%とは言わないし、
100%CのUNIXやLinuxが大半でもない
話を逸らすな スタートアップコードなら100%Cで書けるマイコンは珍しくない
OS 100%は無理
>>240が話題を追加したの 231 CでOS作ってみたい
233 RTOSでさえ無理
234 Cだけで?そりゃ無理
237 100%Cは最初からそれを考慮したCPUならできる ←キ
238 237はシッタカ
240 特権命令は?Cプログラムが動き出せる準備は?
241 大半は100% ←キ
243 スタートアップ不要のmainとは?
244 OSの話だよ?
247 話を逸らすな
248 スタートアップだOSじゃない ←キ >>248
>OS 100%は無理
そこも気合いでなんとかなりますぜ!
※気合いとは、次みたいなコードもCとみなしてしまう心意気を指す
int main=195; >>240の
一行目は特権命令の話
二行目はスタートアップの話
に見える >>251
違う
スタートアップの話なんざしてねえよ
おまえベアメタルの経験ゼロだな いや、
どっちかっていうと趣味みたいなもんで
いろんなCPUでやってるけど
ただ単に
Cプログラムが動き出せる最低限の条件
と書いてあるんだからOS起動ではないでしょ 話の発端からずっとOSの話で
シッタカを指摘されて悔しくて悔しくて仕方なくて
スタートアップの話に逸らそうとしているのが約1名いるが Cプログラムと書いてあるんだからCプログラムだろ
OSが起動出来る十分条件ではなく、必要条件の1個
特権命令もその一つ
もっとも特権命令が存在しないCPUや使わなくてもOSがつくれるCPUがあるので
必要条件ではないけど ベアメタルであれば尚更main関数を呼び出す前に割込みベクターやスタックポインタの初期化などいろいろ準備が必要だろ
OSに頼れないので自分で準備しないとC
のプログラムは動き出せない とりあえずCでOSでスレが活性化することはわかった。機会があったら他の掲示板でもやってみよう。 >>250
レギュレーション違反ですw
>>236
> バイナリコード直接記述?
> それはC言語で記述とは言わないような >>257
最近のプロセッサはスタックポインタの初期値はリセット時に決められた番地から読み出すことが多いと思う
割り込みベクタはメモリーに書けばいいだけじゃね? >>261
>スタックポインタの初期値はリセット時に決められた番地から読み出す
プログラムカウンタの方じゃないですか? そのメモリ、いやもっと言えばバスの初期化はいつ誰がやるのかと。 >>257
それってすなわちスタートアップコードですよね?
何度も書くけどスタートアップコードを全てCで書けるマイコンは今時珍しくないんですよ >>264
>>236の内容に加えてpragma疑似命令もC言語で記述とは言わないと思う
C言語の構文だけではスタートアップの記述は無理だろう >>262
68KとかARM Cortex M
0x00000000~3 ⇒ SP
0x00000004~7 ⇒ PC Cだけで起動できるCPUって、まさかとは思うがPICじゃねえだろうなwww ROM/RAM内蔵のMCUとROM/RAM外付けのMPUのでは前提が違うので議論が噛み合わない。
>>257や>>263は後者の話をしている。 PICと言った意味も通じてねえな、こりゃw
まさかの更に下をくぐりやがった OSの無い組み込み環境なんて山ほど存在してて、その環境の中で全部Cのもで書いてるとこも存在してる
そもそもOS入れられるような環境とは言えないけど、こういうとこでCで書いてるものにOS的な動作をさせればそれはCのみで作ったOSと言えるのか?
おそらくどこからどこまでがOSの領域か?がずれてるから延々と罵り合いになるのでは? ARMとかRXとかSHとか...
スタートアップ含めCだけで書ける
(全ての環境でとは言わないけど) 組み込み用の処理系についてはメーカ独自拡張の独壇場
コンパイラ本体は
__section
__bank
__interrupt
など独自拡張多し
プリプロセッサも
#pragma
で設定弄らないといけないので注意 スタートアップファイルはC言語のような殆ど何か別言語に近い感覚 >>276
そのスタートアップはどうやって起動するんだよ >>273
PIC8からPIC32まであるのにPICだけで話が通じると思ってるのはちょっと世間知らずすぎる >>276
具体的な環境書いてみ
configでスタートアップルーチンを生成してるとかのオチじゃないよね? いまなら、C言語だけで書いたOSをUEFI でロードして起動するとかできるだろ?
C言語で書けない操作は UEFI 側で設定したものをそのまま使う PC-88/98のFDブートはFDの最初のセクタから256バイト読み込んで実行するんだっけ?
そのプログラム書くのに適したCコンパイラってあるの? ヒヨッ子が物を知らねえのは別にいいんだよ、当たり前
シッタカこくのと指摘されてからの逆ギレが攻撃対象になるんだ >>283
gccの場合は自動的にcrt0-efi-x86_64.Sをリンクするようだが ものづくりC言語熟おいしい!一番好きなバーガーです!! って言ってほしいのか? C言語のポインタはCPU機械語における間接アドレシングの抽象化だろ?
それ以上でも以下でも無い >>284
ないです。
余りにもバイト数が少なすぎるので手書きです。
手書きでもバイト数に気をつけて書く必要があります。 >>296
インクリメントは良く出来てるな
あとポインタのポインタと配列へのポインタの文法を混乱して覚えてる人が居て
そいつらのせいで劣化コピーが出回ってるのがさらなる混乱の原因
正しく理解して正しく使えばCのポインタは何も難しくない >>299
劣化コピーの具体例をよろしく
この文章だけだと何が問題なのかさっぱりわからん 二次元配列は二重ポインタで扱うという自分の勘違いを正当化したくて
mallocでポインタの配列を作るやり方を唯一正統と強弁するアホが
fjで暴れてたな、そういえば ポインタのポインタ **p
配列へのポインタ (*p)[]
ポインタの配列 *p[] >>300 みたいなのを炙り出せたのであれば
レスに意味があったと言えよう >>301
めんどいだけでポインタのポインタでも2次元配列かけるでしょ?
勘違いってどういうとこ? >>304
本人か?
char a[2][2],**b=a;
これが勘違いでないとまだぬかすか?
頭がバカなのか、それともトンマなのか、どっちだ? >>299
アセンブラやったことのない人は中々正しく理解できないようで、それでポインタの事だけ書いてある本が沢山出ちゃうんだろうな。 何年も書かないと忘れるな〜
ポインタのポインタは、ポインタの値を参照渡しするときくらいしか思いつかん
char *p;
foo(&p);
void foo(char **p) {…}
みたいな、
305のような書き方はピンとこないわ >>304
書けるかどうかじゃなくて
> 唯一正統と強弁するアホが
いたって話でしょ int a=0;
int *pa=&a;
int **ppa =&pa;
int ***pppa = &ppa; でもこういう関数だとポインタだけでやりたくなる
mul(double** x, double** y, int n, int m){
mul(double x[][20], double y[][20], int n, int m){ 関数の引数に限って言えば
func(**p)
func(*p[])
func(p[][])
func(p[][10])
どれでも同じ
引数として配列を引き渡す方法はない
どれも先頭要素へのポインタが値渡しされる
関数側で引数がポインタへのポインタ(いわゆる二重ポインタ)なのか、ポインタの配列なのか、配列の配列(いわゆる二次元配列) なのか区別する手段はない
引数に配列として要素数を渡してもエラーにはならないだけで無視される どこから突っ込んでいいやら・・・
出鱈目にも程があるぜ 関数の宣言文で説明だけなので変数型を省略してるだけだろ
配列の変数名がpならば呼び出しは
func(p)
でもいける
結局は先頭アドレスさえ渡せれば何でもいい >>314
プロトタイプ宣言しておけばC言語としては違う状態になるよ。 プロトタイプ宣言では状態を区別はしない
プロトタイプ宣言
void func(char *p[]);
関数定義
void func(char **p) {}
https://i.imgur.com/mMQGNga.png >>308
あほか
>>305 は間違いの例だから
ピンと来なくて当然 >>311
何を目的に書いてるのか知らんが
A: mul(double** x, double** y, int n, int m){
B: mul(double x[][20], double y[][20], int n, int m){
C: mul(double (*x)[20], double (*y)[20], int n, int m){
AとBは等価じゃないぞ 変数としてのxは
A:double型のポインタを指すポインタ
B:double型の配列を要素とする配列の先頭要素を指すポインタ
C:double型の配列を指すポインタ
関数の引数としてのxは
A,B,Cすべてdouble型の参照オブジェクト(何でもいい)を指すポインタ >>322
>>321のxのことを言ってるのなら、基礎からやり直せ。 まあ実際C:のような例は見たことはないけど、少なくともA:とB:は関数の引数としては同じと解釈される
中身は受け取った関数側でプログラマが処理する事案であってdouble型の何かを指すポインタという以上の意味はない 分かりきった固定要素数の配列を渡すのはいっかい struct で包んじゃうわ
struct foo {
double array[20];
};
mul(struct foo* x, struct foo* y, ...) >>323,326
ただの罵倒ではなくてもう少し有益なレスしろよ >>324
A,Bそれぞれのsizeof(x)やx+1について、値や型を比較してみろよ。意味が違うことがわかるから。 >>327
>>314 func(p[][])
似たようなもんだな >>328
一応言っておくけど>>322の通り変数のxは意味が違う
関数の引数の場合だけ状況が変わる
*p[]と*ppが同義なのは引数の場合だけ
>>319の通りプロトタイプ宣言と関数定義の両方で混在しても問題ない >>330
>>319 の言ってるのは >>322 のとは違うだろ
これは正しい
>プロトタイプ宣言 void func(char *p[]);
>関数定義 void func(char **p) {}
これは間違い
>プロトタイプ宣言 void func(char p[][20]);
>関数定義 void func(char **p) {} 初めて書き込む初心者ですが
配列存在そのものがポインタと違う
という話と
ポインタとして渡して同じように扱える
という話の食い違いをしてるのですか? ポインタの配列はポインタのポインタとして扱えるが
配列へのポインタはポインタのポインタとして扱ってはいけないって話
そりゃ無理に使おうとすれば使えない訳じゃないが止めた方が良い char a[2][2];
これは a[0][0], a[0][1], a[1][0], a[1][1] の順にcharが4個ならんだデータ
char *b[2] = {a[0], a[1]};
という配列をaとは別に作ってはじめて
char **として扱える aは(中身は)4このデータの先頭アドレスで
bはアドレスの配列の先頭アドレス
データが異なるので無理やりキャストしてもダメ なんで & より == の方が強い?
なんで func と &func 両方とも関数へのポインタ
なんで char の符号有無を規定しなかった? プログラマーは万能である
で、あれば、それらは些細なことだ >>345
===は比較演算子で、&はビット演算子(扱いは算術演算子と大差ない)だから。
funcと&funcが同じなのは単なるシンタックスシュガー。 配列のそれと変わらん。
charは符号もへったくれも無かったため。 最上位がパリティなことも多かったし。 char hoge[10][10];
があったとして
hoge と &hoge[0][0] が一緒なのは判るが
&hoge とか hoge[0][0] は一緒じゃない 算術演算子と大差無いと言うならなおさら優先順位が逆転するのは不思議
つうか神様への質問なんだからなんでそういう仕様になったかを答えてほしんでしょ >>347
===って、Bにあったやつか?
等値比較代入 比較演算子が最下位ならすっきりする
a + 1 == 2 → (a + 1) == 2 の順と同じく
a & 1 == 2 → (a & 1) == 2 や
a % 2 == 1 → (a % 2) == 1 であってほしい わたしゃ神様じゃないけど、カーニハンとパイクの『プログラミング作法』には
「カッコを使って演算子の優先順位の曖昧さを避けよう」みたいな項があるね。
もちろん規格では厳格に決まってるけど、使用者の記憶があやふやって話。
あの辺を読むと「ビット演算子より比較演算子を優先したのは誤りだったかも」と
ご当人が思ってたんじゃないかと感じるわ。 >>342
K&R1 から K&2 への相違で強烈に疑問を持っているのが
引数に配列をとったときは、配列の先頭のポインタが渡るのに、引数に構造体をおいたときは、構造体の実体がコピーされて渡されるのはなぜ?
馬鹿が
struct A {
int a[1234567890];
};
とかやったときには、これが関数の引数に乗ったときには、正気でコピーする気なのですか? ん? 構造体が左辺値変形されるなんてことあったか? 2点ほど訂正させてくれ。
カーニハン先生はC言語に大きな貢献をしてるけど、C言語の設計は
リッチーさんの仕事でカーニハンさんは手を出してないんだね。
だからこの場合「ご当人」と呼ぶのは正しくなかった。
「ビット演算子より比較演算子を優先するとは、デニスの野郎め
下手コキやがって」と思ってるんじゃないかと感じるわ。
…という具合に訂正。
もうひとつ。カーニハン先生は今の時点で健在らしい。
実は先の投稿の時点で亡くなってると勘違いしていた。
これもリッチーさんと混同したのが原因。 >>342
extern はいらない子!じゃないのですか?extern の必要性はなんですか? >>342
可変長引数のプロモーション(格上げ)が理解できない
なぜ float は double に、char, short, は int に格上げされるのか? >>355
構造体のポインタを渡すとして、仮引数はどう宣言するよ >>358
いらない子はtentativeなんだが
tentativeはtentativeの存在すら認識できない
知恵遅れのための必要悪だ
おまえのためだったとして
本当のいらない子は誰だろうね >>360
関数の引数には、構造体のポインタではなくて、構造体そのものを渡します、構造体そのものを渡せるようになったのは K&R2 から可能になりました
C の神 >>342 に、この改変―個人的には改悪について、一度お聞きしたいと思っていたんです なぜ神への質問を神でないものが回答するのか
神にでもなったつもりか! ヘッダファイルには何を書きますか?
こめおしだるまとかですか charは文字だから符号は重要じゃないってのはいいが、ならbyte型用意しておいてくれよと思う。 signed charもunsigned charもあるだろ signed charもunsigned charもcharもあるのが糞 char = unsigned char に固定してくれりゃ万事楽だったのに 「8ビットめいっぱい使う奴(国)が面倒おこしてめんどくせぇ」 文字割り当てで最初から8bit全桁使ってしまっていれば良かった 8bit整数はsigned/unsigned charでいいやと思っていたらC++で裏切られた。 2バイト(16ビット)もあれば、各国のが収まるだろ? →ダメでした なんでstaticにこんなにたくさんの意味をもたせた?
引数のconstが絶望的にわかりにくいんだが何でこんな文法にした? const char * *
char * const *
char * * const
たしかに分かりにくい
volatileも >>377
くそ、何がだよ。constの何がそんなにわかりにくいんだよっ!ちくしょうっ!! voidならsp使わないという利点があるんだからいるのでは? void君見てんだろ?
またあの名言聞きたいよ
てかspて何だ? fj.comp.lang.c japan.yoso 何年前… (´-`).。oO(今の人は newsgroup なんて知らないんだろうなあ・・・) voidならスタックポインタを使わない?
意味不明 何十年経ってもマウント取られたままなやつは
成長する意欲すら根こそぎ取られたただの産廃
唾棄するにも値しない >>407
某ゲームで、ボスバトルまでの待ち時間が結構ありまして、そのちょっと前のタイミングを知るのに
ストップウォッチ兼タイマー ver 0.1 を愛用しております。 自分で作ってもよかったのですが
蟻さんので必要十分だったのでありがたく使わせてもらっています。
ありがとうございました! >>413
TDM-GCCだとコンパイルできなかった >>417
リソースがsjisだからUTF-8にして、コードページにちょっとしたトリックをするとビルドできるよ。 >>419
蟻人間さんプルリク送っておいたからマージしてね 大学の課題でフーリエ変換を利用した画像保存プログラムを作成せよっていう
課題が出ました…
もうお手上げです。助けてください >>423
宿題の文章を一文字も間違えずに正確に転載できる技術を持っているのなら
https://mevius.5ch.net/test/read.cgi/tech/1434079972/
で話の続きを聞く準備はあります、その出題自体はどこか変だとは思っていますが >>424
>>425
そうです。
実際に本気で組んだら何行くらいになるんでしょうか?
それだけでも目安を教えてほしいです。
例えば
木の絵をピクチャーボックスに描きました。
フーリエ保存してファイルを作成します。
ファイルを再現できました。
同じ絵です。
成功です。
こんな感じです。 元の画像に戻ったら成功って事はフーリエ変換と逆変換かな?
フーリエ変換は外部ライブラリ使ってok?
okならOpenCV使えば良いんじゃね? 画像圧縮でフーリエ変換は罠だな、最初からDCT使って提出しようず 単機能だから、AWS Lambda で出来ないのか?
ライブラリを探すだけだろ
C/C++, PHP は、Lambdaには採用されていないけどw >>426
何でも良いなら
1x8に区切って1次元でフーリエ変換して
適当にビット数を減らして保存
読み出してビット数を元にもどして逆フーリエ変換
フーリエ変換は
abcdefghhgfedcba
のようにすると
同じ結果が2個ずつ出るので
半分だけ保存する 8x8でやるなら
横でフーリエ変換した結果に対して縦でやればいい
16個のデータにするのは横とおなじ フーリエ変換をDCTに変えて
ジグザグスキャンしてハフマン符号化すると
jpgになる 大学の課題と言うくらいだから画像云々はただの手段で目的はフーリエ変換というかFFTのアルゴリズムを実装できるか
というのが評価基準だと思う
間違って外部ライブラリを使ったり変に出題者の意図を捻じ曲げて解釈したりすれば減点される可能性高いから注意しろよ >>435
みんな大学の課題という前提を忘れて実務的実用的な話になってるよね
フーリエ変換と逆変換をプログラムで実装できているかが採点基準であって
画像はバイナリデータがちゃんと元に戻っているか確認する手段にすぎないと思う 圧縮って書いてあるんだからバイナリ一致しなくてもいいのでは?
同じ絵っていうのはパッと見同じってことじゃなくて? 隣接ピクセル間隔より狭い高調波は不要だから有限の離散フーリエ変換でも
実質可逆とみていいんだよね? (符号化による情報落ちを考慮しない話) 圧縮が目的でフーリエ変換するのに
何も情報を減らさずにそのまま戻してどうする? >>441
心配しなくても
ナイキスト周波数を越える成分はフーリエ変換の結果には含まれない >>423
>>426
離散コサイン変換じゃいかんのか >>432
どうせ課題なんだしそこまで求めてないというか
もしすごいのが出来たら教授が自分の成果にして発表するんやろ 講義での学習課題としては非圧縮でないと判定が面倒だな
単にデータを間引いただけなのか演算を間違っているのか確認に手間が掛かる
むしろ完全可逆で実装した方が採点する側としては分かりやすいだろう
出題者の意図はどこにあるか質問者は理解しているのだろうか? なんで理解しなきゃいけねーの
そういう旨なら文章にハッキリ書いてくれねーと困るワケ
お気持ちを察せよ なんてのが罷り通る案件なの? 「オメーの気持ちなんてしったこっちゃねー
オレに分かるように話せ」
が今の潮流
分からないように反為さないヤツは無視していいし排除していい
なんつったってオレが理解出来ないヤツは何言ってるか分からないコミュニケーション不可能な敵に近いからな
気持ち悪いから排除してもいいし、何よりオレに理解されようと思ってない
だから排除していいでしょ
……という思考で動くのが現代の日本社会 いやクライアントの意向を無視して好き勝手やっていたら仕事干されるだろ 保存とは書かれているが圧縮とはどこにも書かれてない件 てか皆さん「フーリエ変換くらい当然知ってる」って雰囲気なのが凄いわ。 圧縮しないなら
保存でフーリエ変換使う意味がわからんがな フーリエ変換そのものは理系の大学卒であれば誰でも知ってる
具体的な数値計算のアルゴリズムを知っているかはその人の専門分野による 専門課程ではなくても一般教養の数学系の講義で学んでると思うけど 微積と線形代数ぐらいで触らんかったぞ
大学なんか講師次第だからなあ 文系だと無いと思うな
統計学や代数幾何、微積分
この辺まで はるか前なので忘れたが、大学ではフーリエ級数って名前だった希ガス 理系の大学卒だが
フーリエ変換を大学で習った記憶はないなあ
覚えてないだけかな? フーリエ変換はフーリエ級数展開の一般化
フーリエ級数展開の基本周期を無限大まで拡大すると周波数成分は離散から連続となる
要するに周波数成分を連続スペクトルとして扱うのがフーリエ変換 数学科院卒だがフーリエ変換には掠りもしてない
工学部の一部しか触ってないだろう 工学部では厳密な理論よりも応用が重要なので表面的な触りだけで深入りはしない
厳密な議論はやはり数学者の分野だと思う 画像処理はOpenCVとかで済ましちゃうから細かい数式は気にしない それには同意
フーリエ変換の利用にはFFTの概要だけ理解していれば十分
ただ数学の専門家が掠りもしてないというのは如何なものかとは思う >>468
数学的にはとっくの昔に解決してるから
あとは工学系の仕事 >>470
応用数学とかそういう分野ならまだしも
純粋な数学者はそんなことには興味がない ラプラス変換やz変換あたりだと完全に工学分野だけどフーリエ変換くらい汎用なものは数学分野でも活用されてると思うけどね
フーリエ級数はローラン級数などと同じ複素解析の基本的な考え方でしょ
べきに展開するか指数に展開するかの違いくらいのもの 無理を言ってはいけない
数学者には楽器は作れても名曲を作る事はできない 名曲を作るのは数学者でも物理学者でも工学博士でもない
発明家や企業だ 沖縄音階は適当にランダムに音出しても曲に聞こえちゃうけどな >>479
それは沖縄音階に馴染みがないから、沖縄音階が使われているだけで沖縄っぽいと感じてるだけなんじゃないかな?
沖縄の人からしたら、そんなデタラメでは曲として成り立ってないと思わないのかな。 そういった抽象的な感覚を数値化して扱うための手段がフーリエ解析やスペクトル解析と呼ばれる分野
音楽の音階(周波数)やリズム(時系列)を分解して客観的に評価するのが科学的なアプローチ 確かにフーリエ解析では周波数成分の変化の時系列データを扱うのは難しい
少し浅はかだったなすまん
それにしても数学者が理論を確立して証明しそれをベースに開発が進むという典型例だな 200年くらいかかってるな
ベイズで100年ちょっとか >>480
さあ?まあ、実際にやってみな。自分でピアノやオルガンのキーを沖縄音階で適当に押すだけでわかる。 自分で弾いたら曲になるように弾いちゃうからランダムじゃない
本当にランダムで弾いたら曲にならない 質問失礼いたします。
以下のpopcountは引数xを2進数で表したときの1の数を返す関数なのですが、
動作原理がよく理解できないため考え方のヒントなどをいただけないでしょうか。
int popcount(unsigned long long x)
{
x = (x & 0x5555555555555555) + (x >> 1 & 0x5555555555555555);
x = (x & 0x3333333333333333) + (x >> 2 & 0x3333333333333333);
return (int)(((x & 0x0f0f0f0f0f0f0f0f) + (x >> 4 & 0x0f0f0f0f0f0f0f0f)) % 0xff);
}
以下のpopcount2は自分で作ったもので、これならうまくいくことは分かるのですが、
上のpopcountも本質的には同じことをやっていると考えていいものなのでしょうか。
int popcount2(unsigned long long x)
{
int n = 0;
for (int i = 0; i < 64; i++)
{
if ((x & 1ull << i) != 0ull)
{
n++;
}
}
return n;
}
どうぞよろしくお願いいたします。 https://ideone.com/8LfIh0
こんにちは。
ちょっと思いついたので、こういうコードを書いたのですが、
普段からreallocを使わないのでこのコードがあっているか解らないのです。
これで大丈夫ですか? >>490
reallocが成功した場合古いポインタに対してfreeは呼ばなくていいと思いますよ。
reallocの戻り値は古いポインタと異なるものになる保証はないはずなので、
freeを呼んでしまうとせっかくreallocした領域まで解放されてしまうかも。 >>492
ちゃんとコードを読んだら↓の部分はケアされてましたね。失礼しました。
> reallocの戻り値は古いポインタと異なるものになる保証はないはずなので、
ただ、reallocが成功したらfreeは呼ばなくていいのは間違いないと思います。 >>489
超高速ビットカウント
でググって出てくるページでちゃんと解説してくれてる
この手のよく見るやつはちょっとググれば解説見つかる
何を本質と置くかによるけど両者はそもそもアルゴリズムが違うのでその観点からなら違う
どちらのコードも結果は同じでも前者のほうが圧倒的に処理速度が早い
ビット数などが必要になる処理では速度が重要になるケースも多々あるので結果が同じでも後者は使い物にならない場合もある >>496
レスありがとうございます。紹介していただいた記事を読ませていただき、大変勉強になりました。
ただ、>>489 の場合だと「ビットカウントするデータ列がある程度長い場合」には
当てはまらないため記事の前半の内容がアルゴリズムの基本になるとか思うのですが、
私が理解した範囲で記事の内容を参考にして関数を作成しても以下のようにしかできませんでした。
int popcount(unsigned long long x)
{
x = (x & 0x5555555555555555) + (x >> 1 & 0x5555555555555555);
x = (x & 0x3333333333333333) + (x >> 2 & 0x3333333333333333);
x = (x & 0x0f0f0f0f0f0f0f0f) + (x >> 4 & 0x0f0f0f0f0f0f0f0f);
x = (x & 0x00ff00ff00ff00ff) + (x >> 8 & 0x00ff00ff00ff00ff);
x = (x & 0x0000ffff0000ffff) + (x >> 16 & 0x0000ffff0000ffff);
return (int)((x & 0x00000000ffffffff) + (x >> 32 & 0x00000000ffffffff));
}
しかし >>489 の関数はこれを途中で打ち切って % 0xff をくっつけたような形になっており、
やはり完全な理解には至っていない状況です。
もし可能であれば、この部分についてもヒントをいただけると大変嬉しく思います。
たびたび申し訳ありませんが、どうぞよろしくお願いいたします。 >>497
64ビット長のビットカウントの最大値はたかだか64なので8ビット(最大255)で表現できる
一方、64ビットデータの分割統治による畳み込み計算は1回目で2ビット×32組、2回目で4ビット×16組、3回目で8ビット×8組の結果が得られる
ビット数を求めるだけなら3回目の結果が得られた時点で8ビットの最大数(255)で3回目の畳み込み結果の剰余を求めてやればそれぞれの組の重み(ビット数)が計算できる
(64を超えることはないことが明らかなので) >>498
わかりやすいご説明どうもありがとうございます!ほぼ理解できたと思います。
たとえば十進数の123を十進数文字の最大値9で割った余りは
1+2+3と等しくなりますが、これと同じ原理ということですよね?
ただよくよく考えてみると、そもそも十進数の各桁の合計を9で割った余りが
元の数を9で割った余りと等しくなることについても
お恥ずかしながら豆知識として知っているだけで原理を理解できていませんでした。
ただこれに関してはもはやC言語ではなく算数の問題なので、
その方面の解説サイトをググって勉強しようと思います。
なにはともあれ、回答してくださった皆様方、どうもありがとうございました。
>>495
読みやすい記事を提供してくださっているので、もう少しだけコメントさせてください。
現状だと、MemoryReAllocateを呼び出す側は関数の成否を確認するために
Mem->Memoryを覚えておく必要がありますので、MemoryReAllocateの引数に
参照渡しを使われるならMemoryReAllocateの戻り値はMomeryではなくて
成否を表すboolなどにされてはいかがでしょうか。
また、reallocは第一引数としてNULLを許容しているので
MemoryReAllocateは入力のMem->MemoryがNULLであっても
Mem->ElementSizeが正しい値であれば正常に動作しますが、
その一方でMemoryAllocateは失敗するとElementSizeがゼロの構造体を
返すので少しアンバランスかなと思いました。
あと、MemoryFreeがboolを返すのであれば、freeの前にNULLチェックを入れて
その結果をMemoryFreeの戻り値としてもいいかなと思いました。
(free関数自体はNULLを渡しても何もしないだけで問題は起こりませんが)
以上お目汚し失礼しました 1回進むごとに
2bitずつに区切って、1の数を各2bitに入れる
4bitずつに区切って、1の数を各4bitに入れる
8bitずつに区切って、1の数を各8bitに入れる
...
となるので
>>489だと各バイトの1の合計が、各バイトに入る
各バイトなので256バイトのテーブルを使う方法もある
チープなCPUだとこちらの方が速い
逆にリッチなCPUだと数える命令が最初から備わってたりするしベクタ化も可能
Icelake以降だとAVX512VBMIの命令を使って
超高速に64バイト分カウント出来る >>500前半
なんか違う
10進数の各桁に関しては
1000a+100b+10c+d
=999a+99b+9c+a+b+c+d
=9(111a+11b+c)+(a+b+c+d)
これを2進数でやると
9のところが1になるからあまり意味がない 分割統治っていうより
レジスタ内の桁数を使ってSIMD演算してるって感じ
01020304 + 02040608
2桁ずつの4個の足し算になってるでしょ? vpsrld
vpermb
vpermb
vpaddb
AVX512VBMIを使うと
レジスタに値がある状態で
4命令で64バイト分 >>501 >>504
レスありがとうございます。
> 各バイトなので256バイトのテーブルを使う方法もある
確かにある程度のビット幅ごとにテーブルを使って計算する方法は
シンプルですが効果が高そうですね。
> 逆にリッチなCPUだと数える命令が最初から備わってたりするしベクタ化も可能
> 4命令で64バイト分
勉強になります。本当に速さが必要ならCPU自体の理解から始めるべきなんですね。
このあたりのハードウェアの違いは標準ライブラリ関数が吸収してくれると最高なのですがw
>>502
10進数の話の数式どうもありがとうございます!大変勉強になりました。
そうすると、>>489 の popcount の最後にやっているのは
2進数というか0x100進数で、
0x1000000*a+0x10000f*b+0x100*c+d
=0xffffff*a+0xffff*b+0xff*c+a+b+c+d
=0xff*(0x01010x*a+0x0101*b+c)+(a+b+c+d)
ということになると思うのですがいかがでしょうか。 >>505 の数式が変でした。正しくは以下のとおりです。失礼しました。
0x1000000*a+0x10000*b+0x100*c+d
=0xffffff*a+0xffff*b+0xff*c+a+b+c+d
=0xff*(0x010101x*a+0x0101*b+c)+(a+b+c+d) 最後の % 0xff を見てなかった
なので各バイトの1の個数と勘違いしてました
>>506はその通り
%は、除算命令を使うと遅いので
コンパイラは
0x0101010101010101
との乗算とシフトに置き換えそうです
PCの64bit環境だとPOPCNT命令がそのまま1命令
Icelake以降だとVPOPCNTQで8個を1命令
で出来ます x % 0xff
よりは
x * 0x0101010101010101 >> 56 & 0xff
の方が直接的でコンパイラを頼らない記述でしょう それだと
剰余 x % 0xff
ではなくて
商 x / 0xff >>507-508
レスありがとうございます。
> x % 0xff
> よりは
> x * 0x0101010101010101 >> 56 & 0xff
> の方が直接的でコンパイラを頼らない記述でしょう
コンパイラの最適化によって一行目が三行目に
置き換えられる可能性があるということですか!?
難しそうですがちょっと考えてみたいと思います。
> PCの64bit環境だとPOPCNT命令がそのまま1命令
> Icelake以降だとVPOPCNTQで8個を1命令
本当に速度を求めるならCPUの命令を直接使えということですね。
覚えておきます。 >>511
コンパイラは普通、定数の除算は乗算に置き換えます
乗算、シフトは1クロック、除算は数十クロックかかるのが普通なので
ただ、
>>508 にまでは最適化されないかも
なので>>508の方が良いです >>512
ありがとうございます。そのようにしたいと思います。
ご親切に甘えてしまい申し訳ないのですが、
もう一つ質問させてください。今、
@ = x % 0xff
と
A = x * 0x0101010101010101 >> 56 & 0xff
について考えていたのですが、
x = 0xff のとき、
@ = 0x00, A = 0xffのように、別の値になりませんか?
これは、どこか書き間違いがあるとういことでしょうか。
それとも、この違いは今回の用途では問題にならないということでしょうか。 >>512
立て続けにすみません。。。たった今理解しました。
「この違いは今回の用途では問題にならない」が正解ですね。 除算命令、
Skylakeで最大90クロックだそうで...
簡単な命令だと1クロックで3〜4個実行出来る事を考えると劇遅ですね
Icelakeだと18クロックなので
改善されてるみたい >>515
> 除算命令、
> Skylakeで最大90クロックだそうで...
なんと!しかも、「最大」という表現が付くんですね。
つまり、ただの数値計算なのに
クロックの数がデータに依存する可能があるということ…? >>516
除算命令の実行時間はデータに依存します
内部的にループしてるようなものなので
SIMDの除算は多分一定
Icelakeももしかしたら一定かもしれません
SIMD乗算も非常に小さな値だと遅い事があったような >>517
小さい値だと遅い!?
すみません、ハードウェアの知識がなさすぎて
タイプミスをされたのか本当にそうなのかの判断すらつかないです。。。 そりゃ並列処理できるような相互依存性の低い大量のデータでもあるならともかく
小さなデータ塊対象だとパック化やアンパック化する手間が掛かる分だけ
総合的にはSIMD使った方が遅くなるだろ
馬鹿となんとかは使いようと言うだろ >>520
馬鹿がSIMD使うと遅くなる
それはそうかも >>519
勉強になります。
非正規化数という言葉はちらっと聞いたことはありますが、こういうデメリットもあるんですね。
そして、それでも非正規化数を使うのは
「浮動小数点数の加減算は決して『アンダーフローによるゼロ』にならない」
という理由があるのだということも初めて知り、とても興味深く感じました。
ところで、ビット演算に関してもう一つ相談させていただいてもよろしいでしょうか。
動的メモリ再確保のコストを減らすために確保するメモリのサイズを必ず 2ⁿ-1 の形にしたくて、
与えられた数を下回らない最小の 2ⁿ-1 の値の値を返すような関数を作って使っています。
つまり引数xを2進数で表したときの一番上位の1以下をすべて1に置き換えるような関数で、
具体的には以下のように記述しています。
int fill_lower_bits(int x)
{
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
return x;
}
この関数は割と使用頻度が高いので、PCの64bit環境にPOPCNT命令があるように、
もしfill_lower_bitsと似た振る舞いをする命令があれば名前を教えていただけないでしょうか。
(続く) (続き)
また、こちらはあまり使い道は思いつきませんが、
int fill_higher_bits(int x)
{
x |= x << 1;
x |= x << 2;
x |= x << 4;
x |= x << 8;
x |= x << 16;
return x;
}
という関数を考えることもできて、これなら
int fill_higher_bits(int x)
{
return -(x & -x);
}
のように簡単な書き方に変更できます。
fill_lower_bitsについてもこういうテクニックがあればいいなと思っているのですが、
もし何かご存知であれば教えていただけると嬉しいです。 >>523
BSR命令といくつかの命令を組み合わせて出来ます
Cからだと _BitScanReverse64
>>524
x | -x
の方が良いと思います >>525
何度も本当にどうもありがとうございます。大変勉強になります。
> _BitScanReverse64
こんな命令があったとは!
この名前で検索したら、今まで知らなかった興味深いページがたくさんヒットしました。
ReverseじゃなくてForwardというのもあるみたいですが、
Forwardの方はマイナスを使う方法でも十分高速になりそうなので、
どちらが速いか検証してみようと思います。
> x | -x
確かに…。
ド・モルガンの法則で ~(x & ~x) が ~x & x に書き換えられるのはすぐに分かるのですが、
もしかしてそれと同じことがマイナスでもできるのでしょうか。
-x が ~x + 1 と同じになることは理解しているので、ちょっと考えてみたいと思います。 >>526
> ド・モルガンの法則
-(a & b) = -a | -b が成り立つかなと期待したのですが、
a = 0, b = 1 のときにつまずいてしまいました。
でも、>>525 に書いていただいた -(x & -x) = -x | x は間違いなさそうです。
こういう式の変形って、どこかテキストに載っていたりするのでしょうか。 自分で頑張って探すんです
~x
x-1
-x
&
|
^
これらを組み合わせれば
一番右のビット関連がいろいろと出来ます
???10000
に対して
11110000
11100000
00010000
00011111
00001111
これらを得る最小回数の演算を考えてみてください ド・モルガンと似た問題で、
「君たち2人は注意されないならば、君たち2人は私語を止めない」
の対偶、
「君たち2人が私語を止めるならば、君たち2人は注意される」
って矛盾にちょっと考えてしまったわ。 >>523
メモリ確保やアクセスの時間に比べれば
サイズ計算の時間は無視出来る
ビット演算の趣味として楽しむ分には良いけど
普通にループでもパフォーマンスは変わらない
パフォーマンスが重要じゃないところ
(つまりほとんどの部分)は
移植性、見やすさ、工数、...
などが優先される
ということは知っておいた方が良いですね 分野によってはループや比較による分岐は遅すぎて使えないなんてことままあるよ 動的メモリ再確保
のサイズ計算の話
オーダーnに対して係数の小さなオーダーlog nは無視して良い
って話 C言語というか、WindowsのCですが、
たとえば strcpyの lstrcpyと _tcscpyの違いは何なのでしょうか
前者は WindowsAPI、後者は VC++CRTという説明を見たのですがよくわからないのです
両者とも UNICODE(後者は_UNICODE) の有無で charとwchar_tを切り替えるようですが、どちらをどんな時に使用するのかが分かりません。 crtへの依存を減らせる分、常にlstrcpyを使えばいいと思うよ。lstrcpyは不正アクセスしたときに例外投げてくれるみたいだし。
自分なら依存減らす&安全性のためにstrncpyとwcsncpyを選ぶけど >>540
ありがとうございます。
539です。
今後は気をつけようと思いますが、過去に書いたコードは何ともいたし難く…orz
なぜ先に lstrcpyを見つけなかった 2014年のオレ…
でも、内容が古いのかもしれませんが、ある記事によると CRTの依存を断ち切るのも容易ではないようで。。。 むしろlstrcpyなんて16bit時代から引きずってる過去の遺物なんじゃ?
今はlstrcpyも非推奨、代替のStringCchCopyはWindowsAPIの体だけどkernel32.dll等を呼び出すのではなくstrsafe.h内にコードが書いてある変わり種なのでtchar.h系の_tcscpy_sでよくね?っていう そうか? 古くからMSCは「高いが安心」というポジションだったが 何の変哲の無いコードを書いてコンパイラのバグが顕在化するMicrosoftのCが安心とは、茶がヘソを沸かす。 唯一のECMA-372対応コンパイラ
壮大なマッチポンプだが… そもそもCはUNIXの為に作られた言語だから
UNIX系以外のOSで使うと齟齬が出るよね それはテキストファイルのコードの違いというだけであって言語の仕様そのものとは直接関係ない OSを記述しやすく意図されて言語という認識だが
UNIXに絞って特化された部分って何だろう? テキストファイルといえば
歴史上どっかの段階で文字列操作や汎用IO関数を捨て専用のもちっと使いやすい内蔵スクリプト言語に任せ
どうしても処理速度を求めるマは自作、非標準ライブラリで配列イジクール形にしたらよかったのにね
システムコールの頻度とか毎度読み解く指定子とかで標準ライブラリも爆速ってほどじゃないしー
printfのうじゃうじゃ増える非互換指定子とか似た使い分け迷う関数の増殖とかを防げたろうに せっかくライブラリとして言語の外に出てるのに、
なんでスクリプト言語なんか内蔵しなきゃいかんの。 >>552
creat()のモード指定が8進数で書ける >>555-556
それはライブラリの問題ではないか。言語仕様とはちょいと違う気がする
まあ「標準ライブラリは言語仕様(キリッ」と言いきっちゃってもいい気もする たしかにunix系以外で8進数って使わないような気もする。 Cは文字列をヌル終端するのが「ほぼ」前提になってるよね。
もしそれ以外の文字列表現を使うつもりだったら、
文字列専用の型を用意していたし、ポインタより配列を重視していたはず。 >>557
おまいがOSに特化したとか言い出したんじゃないのか >>557
違う、8進数で書けると言う「言語仕様」の話 >>561
8進数でも書けちゃう
というだけで、建前としては「ちゃんと定数使え」じゃない?
言語仕様でUnix文化に特化してるところって
mainとreturnの仕様くらいじゃない? >>562
8進数で書くのがchmod互換で直感的なんだべ >>562
> 建前としては「ちゃんと定数使え」じゃない?
建前はともかく0777とか0755とかバンバン書かれてるし…
とまで書いてなんだけど、ちょっとググったらどうも8進数はC言語発祥じゃなくてB言語でも使えたみたいw
PDPシリーズは触ったことないからよくわからんけどHPのミニコンは命令コードが3bit単位に区切られて表記されてた
ブートローダーは手入力してて16個並んでるスイッチでアドレスや命令コードをセットするんだけど見ての通り3bit単位に区切ってある
もう記憶があやふやだけどアセンブラとかも8進表記ができたような気がする
http://www.hpmuseum.net/images/2108A-37.jpg
多分PDPも似たような感じだったんじゃないかと思う
なので8進数云々はあまり関係なかったわ、すまん ソースの見栄えを気にして桁そろえに スペース使わずに 0 を補うんですね やったことあるヤツいるよな?
いやそうじゃなくて
ただの0 017は頭に0があるから、C/C++では8進数として扱う。ただのゼロもリテラルの分類としては8進数。 (6.4.4.1) octal-constant:
0
octal-constant octal-digit
まじか
でも8進だからなんだっていう 16歳の僕でも酒が飲めるぞ。
飲める飲める飲めるぞ酒が飲めるぞ。 012 月はハロウィンで酒が飲めるぞ
飲める飲める飲めるぞ酒が飲めるぞ int main()
{
return 0;
}
8進数ですほんとうにありがとうございました すんごく欲しいならプリプロセッサでも作ればいいんじゃね? >>586
プリプロセッサで10進数にするの?
それじゃ何の為の16進リテラルかわからない
いずれ対応するから待つのみ プリプロセッサ作って言語を拡張とか、昔はけっこうあったけどな。 昔は結構あったはずのものが、今は残ってないのだろう まあそれほど必要がないなら別にいいんじゃね。
IDEしか使わないならそういうことはやりづらいだろうし。 誤差を無くす為の16進小数リテラルなのに
プリプロセッサで10進数に直すの? ビットパターンを直接作って変数のアドレスに放り込むようにできないのかな。
それじゃリテラルじゃなくなっちゃうか。 >>584
C++17に既にあるから、いずれ使えるようになりそう
>>585
普通に10進で書いた浮動小数点数とまったく同じ扱いなので心配無用
>>592
10進でDBL_DECIMAL_DIG桁あれば、元の値を再現できるはず(doubleの場合) >>583
C++14で0b使えるようになって
もう5年も経っているんだが >>593
floatやdoubleとcharのunionにするやつか float や double のビットパターンが IEEE754 前提でごりごりっと… C言語に欲しい機能は、関数オーバーライドとユニファイドコールシンタックス。
3つあったけど一個忘れた。
参照もいいな。
そんなアマチュアC++書きです。 >>602
inline と指定すればなにがあろうと inline に固執する執念深いコンパイラはありませんか? inlineを忠実に守ってたら
指数関数的にコードサイズが増える >>605
それはコンパイラが判断することではなく、人間様が判断することなのでは?気分次第で inline にならない inline 指定なんて何の役にもたたないと思います ループ展開して中のinline関数をぶちまけたら・・・
命令の並べ替えで案外コンパクトに成るかもしれんし
指数は言い過ぎだと思うがね それまた非標準の__forceinlineというキーワード使えばインライン化を強制できる。 >>599 名前空間オヌヌメ。
って言うか、なぜ急に自己紹介なんだろ? ついうっかり再帰する関数を inline にしてし(ry >>607
2箇所でコールする関数がn段ネストで2^n 真の無限ループは作れない。
コンピュータは何れ壊れるし停電になったら終わりだからな。 真の無限ループを現実的に実行することができない≒無限を観測することはできない
概念としては作れる goto は技を極めた者だけが使うことが許される。半端な者が手を出せばおかしなことにしかならない。 >>623
用法用量を守って正しくお使いください。 gotoのなにがいけないのかを知らない者は
スペルがジーオーティーオーでないgotoを平気で使いながら
頓珍漢な教条主義を得意げにぬかす >>628
> スペルがジーオーティーオーでないgoto
wakaran > goto文は危険なんですか?
ああ、とてつもなく危険だよ
こんなことを聞くような>>623にとってはな >>629
ISO/IEC 9899:2018 6.8.6 Jump statements >>631
goto文以外のジャンプ・ステートメントとハナから書きなされ。
というか、goto文を乱用せずcontinue、break等で代用しなさいという教条だべ。
ジーオーティーオーでないgotoを平気で使うのは教条に反しないので、「ながら」と矛盾を指摘する言い方はおかしい。 >>632
そんなにダイクストラらの主張の論点が何かが分かってないのを誇張して何がしたい? いやー、上方へのジャンプを抑制するだけで結構切れますよ? L:
hogehoge();
if(huga)gotoL2;
if(hage)goto L;
L2: キーコンビネーション間違えて投稿してしまった。
>>638 のようなコードは完全にスパゲッティなのでやめましょう。 do{
continue;
}while();
while型goto教の教義のコード。 制御構造のパターンとして何型のものが望ましくないのか、お前ら本当に聞いたこともないの? 安易な無限ループで悲惨なオチに出会う人減ってるかいな? アホばっかりと諦めるのはまだ早いと思う
短気を起こさずにもうしばらく待ってみる >>643
あり
むしろ使わないと階層が深くなったり、フラグを多用したりで余計おかしなことに bool型の変数をprintf関数内でプレースホルダ%dを使って表示すると、
1や0になってしまうのですが、trueやfalseの形式で表示できないでしょうか? printf("%s", (b ? "true" : "false")); %sでboolVar ? "true": "false"とでもすればいい
Cにboolはないよ >>649
どアホ
ISO/IEC9899:2011 7.18
2 The macro
bool
expands to _Bool. C99を (標準の)C と呼んでも差し支えないのだろうか 最新の規格が標準だぞ
C99が定められたのは既に20年前
太古の企画と言っても差し支えないレベル 答えてくれた方ありがとうございました
面倒なんですね >>653
決めているのはISOで
652が勝手に決めているわけではない
現行規格すなわち標準はISO/IEC9899:2018、通称C17だ
https://www.iso.org/standard/74528.html https://ja.m.wikipedia.org/wiki/ANSI_C
ANSI C、ISO C、または標準Cとは、米国規格協会(ANSI) および国際標準化機構(ISO) が発行したC言語の標準の総称である。歴史的にこれらの名前は特に、オリジナルであり、最もサポートされているバージョンであるC89およびC90のことを指す。 C99 later の C++ 非互換部分は、どうでもいいとおもいますね
C++ にあわせて欲しかったのですが、独自色を強めてしまったのは疑問手です 現実問題でもC89オンリーのコンパイラはかなり減ってきてるだろうが
Cライクな非標準全開のコンパイラなら今でもあるが 普及率を根拠にするなら
>>652を取り消してからにしてもらおうか >>647 の質問への直接の答えじゃないけど、
bool(実体は_Bool)型って汎整数拡張の対象だっけ?
拡張されるならprintfの中では引数がbool値だったか整数値だったか、
もう区別がつかないんじゃないか。
区別できなきゃ 0/1 で表示すべきか false/true で表示すべきかも
決められないと思うんだけど。 >>660
たとえ652をボコボコにやっつけたところで
現実は何一つ覆りはせんぞ
無駄な抵抗はやめろ 可変個引数の整数値が char でも short でも int になるのは
「汎整数拡張」とは違う動作、別の用語だったかも知れん。
言語に詳しい人の指摘をお願いしたい。 https://ja.wikipedia.org/wiki/C99
>GCC、Clang、Intel C++ Compiler 等はC99の新機能の大半をサポートしている。
>ただし、GCCは、ほとんど準拠しているが、規格への100%完全準拠は果たしてい
>ない。GCC 4.x までのデフォルトは C89 に GNU 拡張を加えた -std=gnu89、
>Clang のデフォルトは C99 に GNU 拡張を加えた -std=gnu99 である。GCC 5.0
>から C11 に GNU 拡張を加えた -std=gnu11 がデフォルトになる。
>Microsoft Visual C++ は 2013 から C99 の大半を実装した。ただし、tgmath.h
>や snprintf() などが未実装。
>Open Watcom C compiler は標準のうち最もよく使われている部分を実装している。
>かつては、ドキュメント化されていないコマンドラインスイッチを指定しないと
>有効化されなかった。2010年現在の最新版である 1.9 では -za99 オプションを
>付けることで有効化される旨、明記されている。
>Sun Studioは、サン・マイクロシステムズによればC99を完全にサポートしている。
主なコンパイラは大体対応している様だが、まだ完全ではないみたいだ。
GCCだと独自拡張もあるのでややこしそう。すでにC11に向かっているし。 今時Cを使うのって
そういうメジャー所じゃなくて
小規模マイコン用の独自コンパイラがメインでは?
そうでもない? メジャーなところで旗色が悪くなったからって
マイナーなところへ逃げ込む気か
相手すんの馬鹿らしくなるぜ 規格を捏ねくりまわして喜んでいるのは言語マニアだけだしな
実際の現場は殆どが独自コンパイラ 捏ねくりまわすって、工業製品を使って工業製品を産み出すのに
規格票を確認するのは工業人の当たり前の日常だろうがよ 必要なのは規格よりもコンパイラ製造元のマニュアルだ
規格は実際の動作を保証してはくれない コンパイラのマニュアルも必要だが
規格「よりも」という変なバイアスは無用
「と」だろうが テンプレに入れた方がいいな
特に断りがない限りはC89/C90が前提だって 100歩譲ってC99
C17やC20限定の話題は他にスレを立ててそっちでやって 老害でない人たちは、C99スレでも立ててそこに移動で bool 型があったとしても、
printf の引数(... で受ける) に渡すタイミングで暗黙に数値化しちゃうんじゃないかな?
C++での引数型により別のものが呼ばれる機構は期待できない部分 >>674
それは名案ですね、正直言って C89=K&R2 で必要かつ十分ですし、C99 になって追加されたことといえば C++ と均整のとれない糞仕様が多くて役に立つものは一つか二つか… >>663
たしかに規格ISO/IEC9899:1999 のどこにあるか?というと、ちょっとみつからないですね
default argument promotion とはいうみたいですが
これは char, short -> int
float -> double
だったかと >>675
ジジイ、ジジイか…
それじゃお前はなんだ、この餓鬼が
おれはお前さんがこの世に落っこって来る前からバグつくってんだ >>682
ジュニア専用お子ちゃまC言語は他所でおねがいします gotoの何がいけないか説明できるやつ、ここまでゼロ 年取ると新しいことが覚えられないのは理解するよ。
だからって30年前の規格で縛るとかどんだけおつむ弱いんだよ 30年経ってもまだ対応完了しないコンパイラがある件 そらあるだろうさ。だからスレも底辺コンパイラに合わせろとか頭腐ってるんじゃねーの? 上級国民用のC言語スレを建てて,そちらに移った方が良いのでは?w >>685
C++ でコンパイルできない C なんて何の役に立つのか疑問だ、といっているのですよ >>691
じゃあC++使えばいい
C++コンパイラでC非互換の機能を使わない縛りこそ
何の役にも立ちゃしねえ
それをやるやつも役立たず ほんそれ
C++を覚えてさっさとこのスレからいなくなってくれ
ガキんちょは >>691
公開ヘッダだけ互換で書いとけばいいだろマヌケ C言語環境には色々と障害が多いが
その最たるものの一つが老害の多さだとこのスレを見てもよく分かる そもそもC89とC17の違いがそんなに問題になるか?
C89さえ分かっていればC17を差分で憶えるのは大した話じゃない
不勉強なやつが自己弁護のために騒いでるだけだろうが 勉強家はC++に移られたらどうか
貴重な人生を無駄にしないで済む もちC++も使ってるよ
C使いが他の言語をやってないという仮定がそもそもおかしいぜ 勉強家はこのスレに入らないから,さっさと移動したらどうか?
粗大ゴミしかいないスレなんだから,こんな所に居続ける必要ないだろ
お前自身が粗大ゴミだと自覚しているなら仕方がないが うるせえな
どこのスレに来ようが貴様に口だしされる筋合いはない 特定の話題で話したいなら,そういうスレを見つけるか、無ければ作れば良いんだよ
C言語全般を話題にする既存のスレを荒らす必要がこれっぽっちもない そもそも
> 粗大ゴミしかいないスレなんだから
なんて言ってる>>701が荒しだろ
元々は質問スレだぞ >>705
C言語全般を話題にするスレと言ってる奴がC99は別スレに行けとか言ってたのだから、支離滅裂ダナー C言語は
非常にチープな環境でも動く
低レベルな記述が可能
非常に多くの環境で動作する
コンパイラの作成が容易
ということで未だに多くの場所で使われている
これらのメリットを減らす拡張は不要
これらのメリットが不要な環境ではC言語は不要
C++や、よりリッチな言語を使うべき >>693
>C++コンパイラでC非互換の機能を使わない縛りこそ何の役にも立ちゃしねえ
K&R2 の範囲で書くことができるというのは必須の技能だと思いますよ、それができない、そもそもなにが K&R2 の範囲でなにがそうではないかを知らないようでは馬鹿と謗られてもしかたがない >>698
>C89さえ分かっていればC17を差分で憶えるのは大した話じゃない
そのとおり
できる奴にとっては、C99 だろうが C11 だろうが C17 だろうが、どれも大差がなく自由に行き来できるしどうでもいい
しかし、ここで敢えて「C89=K&R2 こそ正義」と煽ってみると、案外「老害死ね」という反応が続出する
そういう点から推察するところでは、このスレに出入りする人間の 50% は K&R2 すらわかっていないレベルではないだろうか、と考えさせられるのですよ >>708
ライブラリとして、他の言語から直に呼んで貰うことを目指すため、C で書き直してしまうという話もよく聞きます、この手の用途を他の言語で聞いたことがない >>692
我々がしているのはヌルポインタの話だ
ただ 0 と書けば済む話のものに誰がタイプ数をつぎ込む?
まして #define NULL (void *)0 と構えて運用するようなものじゃない
マクロ NULL が存在すること自体なにかの間違いなのだ >>710
K&R2の範囲で書くという具体的な案件を1つでも知っているか?
俺も含め、その案件に携わることになったとして困る者は極めて少数だと思うぜ
50%もいるようには全く思わない
K&R1の案件でさえ、今の若いのでもすぐ慣れるだろうさ >>715
そうですか
そのわりには、「老害死ね」という反応がかまびすしいですね >>714
整数とポインタのサイズが違うとき、NULLがないと大変なことになる。 >>717
可変長引数関数に (void *)0 を渡すときだけは (void *)0 は必要ですが、それ以外は 0 と書いてそれがポインタか整数かは文脈で判定できると思っています >>717
ん?可変長引数とか、整数とポインタが曖昧なところでは NULL にもキャスト要るし、
NULL がサイズ違いとか動作上の問題を解決することなんてないのでは?
http://www.kouno.jp/home/c_faq/c5.html#4 > ただ 0 と書けば済む話のものに誰がタイプ数をつぎ込む?
というわけで if(x != 0) じゃなくて if(x) だな プロジェクトリーダー「数字直接記入禁止!全部#define で置き換えろ!」
大昔そんな事があったと聞いた。 あった
フラグを一個も立って無いことを示す0もdefine
デバイスの特性を多項式近似した関数も
各係数を全てdefine
縦と横のそれぞれの座標計算、ループで処理にした方が記述が簡単なので2でループしたら
その2もdefine
他にも意味不明のコーディング規約が多数 それもこれもマジックナンバーにコメント書かなかったおまいらが悪いんやで マジックナンバーの何がいけない、どういう場合にどんな問題があるかを理解しないまま、杓子定規にルールだけ覚えるとそんな奴が出来上がるな。 >>721
> プロジェクトリーダー「数字直接記入禁止!全部#define で置き換えろ!」
良いと思うよ!! 値まで書いたアホっぽい定数 はわりと使うかな・・・
#define EGGCOUNT30 30
みたいに書いちゃうやつ
コード中に即値書きたいけど書くとリファクタリングで死ぬから
リファクタリングのためだけに定数書いてる感じ 当たり前だがリファクタリング以前に定数調整だけで死ぬぞ
#define EGGCOUNT 30
なら
#define EGGCOUNT 40
で済むのに
#define EGGCOUNT30 30
だと
#define EGGCOUNT40 40
で全置換する気か s/30/40/g
は基地外沙汰だが
s/EGGCOUNT30/EGGCOUNT40/g
ならイケそうかも!! フォーマット文字列中のも駄目なんかな
少数以下 3桁に整えるのに "%.3f" → "%.*f" にして引数で渡す ああ フォーマット文字列を define しろということか
#define FORMAT "%.3f"
:
sprintf(buf, FROMAT, double_value);
みたいな >>727
数値一通りdefineして
NUM_56
みたいに数値のかわりに使う
糞コーディング規約の典型
そういう環境だと
大抵defineの数値を変えるだけじゃまともに動かない >>730
文字列リテラルをコード中に記述禁止
その為itoaみたいなのを組み合わせたコードが出来る >>727
そのとおり、全置換をする前提なんよ
置換するのはIDEのお仕事だから漏れは無いと信頼してるし、なにより
ソース改変による影響範囲の割り出しとテストしなおしの強制を兼ねてる エディタの正規表現は使わないのか?
複数パターンでも一回で出来ると思うが >>720
MISRA-C の違反!
if(条件式) には、実質的なbool 値のみを書く!
ただし、if( x ) で、x がbool変数なら、OK x != 0
は、yes/no の2値しかないでしょ?
実質的には、bool 値として使っている それはおまえの思い込み
ISO/IEC 9899:2011
6.5.9 Equality operators
3
Each of the operators yields 1 if the specified relation is true and 0 if it is false.
The result has type int.
これが事実だ 直接コードを書くことを禁止する。スクリプトを使って書け。 BOOL
YESNO
OKCANCEL
ONEBIT
実質的にboolなら中身はdoubleでもenumでもint64_tでもifに入れて良い
っていうコーディング規約 文法は関係ない。
あくまでも、コードの品質・可読性を上げるための、MISRA-C のルール!
if, while などの条件式には、実質的なbool 値しか書けない
条件式に、単なる整数などを書けない。
整数の0 を偽とみなした、条件判断を書けない
MISRA-Cを守っていないと、低品質で、審査に通りませんよと言うことw >>741
よそのスレでRuby基地外っぷりを発揮してさんざん迷惑を掛けているお前がルール遵守を説くなんて、羞恥心はないのか? まともなルールと仮定した場合
>>735 がダメなら
>>743 >>744 もダメだろうな >>741
また MISRA ですか…
MISRA 適合かどうかを診断してくれるプログラムでも配布してくれているんだと思っていましたが、そうではなく、ただ人を縛る規則を決めるのが好きな人間の集団なんですね… > MISRA-Cを守っていないと、低品質で、審査に通りませんよと言うことw
MISRA-Cを守っていれば、高品質で、審査に通ると言いたいのか?
もう罵倒語が喉まで出かかっているんだが 違うナァ
MISRA語ルールを守っているとMISRA語のコンパイラが書けないんだよw
大いなる自己矛盾に陥ってMISRAは沈没する >>726みたいなのはいくつか特定の値しかとれない引数のために使われることはあるね。
まぁenumでもいいんだけど。 >>747
>> MISRA-Cを守っていないと、低品質で、審査に通りませんよと言うことw
これを読んで
> MISRA-Cを守っていれば、高品質で、審査に通ると言いたいのか?
と解釈する奴はもれなくバカ >>750
違うんなら弁明しろよ
それができないだろうという予想で、罵倒語が喉まで出かかっている >>751
マジでバカなのか?w
AならBである
から
AでないならBでない
(当たり前だが真ではない)
って書けばお前のアホさが理解できるかな?
これでわからないなら中学の数学からやり直せ main関数の{ }についてお聞きしたいんですが、
int main(void) {
____/* コード */
}
という表記ではいけないですか?
スッキリCや各種サイトを見ると、
int main(void)
{
____/* コード */
}
となっていることがほとんどなのですが 間を取って
int main(void) { /* コード */ }
でも動くぞ ありがとうございます。
後者にしないといけないという決まりとかあるんですか? 文法じゃなくてコーディングスタイルのこと聞いてるんでしょ。
チーム内で決まったスタイルがあるならそれに従えばいいし、
そうでなければ自分の好みで決めればいい。
俺の好みは1行減るし統一感のある前者。 もう少し考えてみようと思います
深夜にありがとうございました >>752
では、741は何を主張したかったんだ?
> MISRA-Cを守っていないと、低品質で、審査に通りませんよと言うことw
わざわざ、こんな戯れ言をぬかした意図を説明しろ >>764
それは741に聞けや
俺はお前のバカさを指摘しただけ >>756
if (...) {
while (...) {
do {
なのに、
main()
{
という矛盾はよく見かけるが
そうなっている案件で秩序を乱すことはしない >>765
741本人のくせに自分の言葉から逃げてんなよ
まあ、あれじゃ逃げたくなるのはわかるがw >>756
int func(int arg)
{
...
}
という具合に「関数本体を開始する波括弧を次の行に書く」方式だと
ヘッダファイルにプロトタイプ宣言として書き写す際に
1行コピーして行末に ; 追加で完了、楽チンという利点があるわね。
main() の場合は当てはまらないのがやや弱いけど。 >>767
自分のバカさを認められずに自演認定でごまかすのに必死かよw
哀れな奴 >>769
MISRAの話しなくなってやんのw
技術板で技術的な話ができないやつはゴミ以下だぜ >>770
> 技術板で技術的な話ができないやつはゴミ以下だぜ
中学校の数学すら理解してない奴が何言ってるんだかw >>771
いや理解してるよ
そうでなきゃ年収8桁はできねえ こんなところで年収自慢なんかしても虚しいだけじゃないか?
対偶を勘違いしてるなんてみんな気付いてるのに無理につっかかんなって >>766
power(x, n)
int x, n;
{
....
} MISRAで if(x)がまずい理由を教えてくだされ >>731
一般的に特定の非正規形は特定の分析用途には使いやすくても
違う観点で分析しようとすると正規形からデータ変形するよりも多くの手間がかかる
参照オンリーの場合でもデータの利用方法が定型化していない場合は正規形から考えるメリットは大きい
特にRDBで分析用途のDBを用意する場合は参照オンリーでも正規形から考えとかないと手間が異常に増える >>752
高品質で、審査に通っていれば、MISRA-Cを守っている
やっぱり違うなω
元の命題からして可笑しいωωω 元の命題の真偽ではなく元の命題を真と仮定した場合、対偶は真か?という話
本来、対偶は真であるが747は対偶ではない命題を挙げてそれが真であるかのようにレスしているので突っ込まれた
対偶の挙げ方の間違いを指摘したのになぜか元の命題の真偽についてギャーギャー言うから話が噛み合わない >>773
みんな気付いているのは、わざと言っていることだよ
鬼の首でも取ったように得意がってるのがおまえだけ
中学の数学がやっとわかるのか、すごいなあw いきなり年収自慢とか笑える
まあ低能にありがちな行動だけどなw 中卒でも中には総理大臣になった人もいるけどね
そういうことにしといてやろうか? そもそも集合関係と因果関係を混同しているのが間違いの原因
「事象Aが真ならば事象Bは真」の対偶「事象Bが真でないならば事象Aは真ではない」は常に正しい
一方「原因Aが真ならば結果Bは真」に対して「結果Bが真でないならば原因Aは真ではない」は正しいとは限らない >>774
K&R1の時代には改行後に { を書くしかないが、
いまどき持ち出して混乱させるのはやめろ >>782
おまえ747の時点で俺がそう言っているのが読めてないもんな
そうやって教科書を朗読するのもいいことだから頑張んなw
お勉強はまず憶えることが初手だが
現実問題に応用できるようになって始めて完成するんだよ >>783
774は制御文と関数は違うということが766の言う「矛盾」のルーツだと言いたいんだと思うぜ >>747は「事象Aが真でないならば事象Bは真ではない」
集合論で言えば「対偶」ではなくて「裏」の関係 「裏」の「逆」または「逆」の「裏」が「対偶」
ある命題とその待遇が等しいのはそれぞれの事象に因果関係が存在しない場合に限る MISRAの肩を持とうとしてしくじったトンマなやつに
どんな気持ちか聞いてみたのさ 741本人以外がこんなに激怒するわけねえしな
なあトンマ、今どんな気持ち? 対偶と裏の区別もつかずに年収8桁とか学歴とか低能にありがちなレス連発やんw
こんなわかりやすい奴久々に見たわ >>794
あなたのほうが滑っていますよ…
そもそも MISRA 推しな時点でこのスレの住人から疑問の声が挙がっているのに、まだそれに気づかないの?
末期ですね いくらMISRA推しガーとか言っても>>747がバカなのは変わらないんだがw トヨタの車が暴走した問題で、米国議会でも言ってただろ
トヨタは、MISRA-C で、10点ぐらいしか取れてないってw
100ルール中、90に違反してる
守ってない企業があるから、人命を預かる、ロケット・医療系組み込みなどでは、
特に厳しい資格が必要だと議論になってる
組み込みでは、バグで簡単に、人が死ぬから
だから、何十年も研究してる、Elixir みたいな関数型を使う プログラムを書くのに●●は駄目だとか使いにくくなるほど制限かけてもさぁ
書きたい事に必要な関数とか書き方とか知らないようなのに投げてるだけなので脆弱性になるようなバグは出てくるし意味がない
むしろ知ってるような人にとっては制限になって害でしかない JavaScript で言えば、TypeScript, ESLint とか
違反を警告してくれる、lint ツール >>740
> 実質的にboolなら中身はdoubleでもenumでもint64_tでもifに入れて良い
っていうコーディング規約
-0.0は ? >>799
御意
無能のために無能に合わせろと無能がわめく
自己虫以外の何ものでもない MISRAってむしろ>>799, >>802みたいな自称上級者がやらかすのを防止するためのものなんだけどなw もうめんどくさいからMISRA押しのRuby君が害悪ということでいいのではなかろうか? >>798
トヨタなんて下請け丸投げでソース読めなくてレビューもしてくれなくてテスト仕様書も丸投げで無駄なエビデンスばかり要求してる
10点ぐらいしか取れてないのは下請けなんだけどそれを指摘もできない >>803
上級者なんて称号は俺はもちろん客先の誰も使ってねえぜ
仕事がもらえる、それだけだ
わかるかい? 無職君w ちょっと年収の話したらあんなに発狂すると思わなかった
よっぽどコンプレックスらしいな、おーこわ 作業は指示するが仕事は教えないクソ野郎が増えたから
この先の見通しが暗い。 「自称」上級者の意味すら理解できない>>806
だめなのは数学だけかと思ったら国語も壊滅的だなw >>800
そういうものを MISRA 対応として lint ツールとして無償公開するのが筋というものでしょうね 例外項目を設けてスコアで評価するにしても、事前に自動評価できるツールがあるといいですわね スコアとか意味ねえ
違反箇所は違反箇所で数の問題じゃねえ
違反プログラムは遠さねえとぬかすなら絶対に通すな
その結果に責任を持て >>803が仕事を出している側である可能性を考慮できない>>806 >>815
そこにしか突っ込むことが出来ないのですか?みじめですね… 組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、MISRA‐C研究会、2006
この研究会は、トヨタなど大企業から、数十人のベテが集まって、
欧州人に聞きながら、作った本。
未だに、コーディングルールのバイブルだろ
元々は、Andrew Koenig の本
C Traps and Pitfalls, 1988, c1989
Cプログラミングの落とし穴
この本から、Lint が始まったのじゃないか? >>818
別に他のところに興味ないし
まあこんな初歩的なところに突っ込まれるとそりゃ困るわなw
だからROMってりゃいいと思うんだけどな >>819
> この本から、Lint が始まったのじゃないか?
流石にもう少し時代を見てからレスした方がいいぞ… そっかー組み込み屋さんはUNIXの歴史とか知らなかったりするのか >>819
>この本から、Lint が始まったのじゃないか?
違います
初期の lint はベル研の V7 と同時、1979 にはリリースされています
K&R1 は特に引数まわりはスキのある仕様でしたので細かくチェックをいれる lint は必要であったのも理解できます、これは K&R2 になってかなり改善されました
それに最近のコンパイラは lint に似た warning も出せるようになったし はじめてのOSコードリーディング UNIX V6で学ぶカーネルのしくみ、青柳 隆宏、2013
そう言えば昔、こういう本も読んだ ジャンケンのコードを書いてみました
よろしければ、ご指摘等をお願いします
https://pastebin.com/HCLJ5m7p >>823
> それに最近のコンパイラは lint に似た warning も出せるようになったし
初期のlint使ったことないだろw >>815
俺に言わせれば、おまえ文系くせえんだよ
俺はハード設計もやるから負論理だのド・モルガンだのは息をするくらい当たり前なことで
待遇だの裏だのという用語で得意がるやつは専門分野は何だろうと思ってしまうのさ
それから突っ込まれてるのはおまえだぞ、741本人よ 待遇で得意がるvsドモルガンで得意がる
小学生同士かよ >>829
対偶の話に負論理とかド・モルガン?
恥の上塗りか?
あと741に突っ込んでるのは頓珍漢なお前だけだぞw 電子回路・HDL などの組み込みでは、
AND, OR, NOT, NAND,NOR などの回路、
負論理、ド・モルガン、カルノー図とか、初歩だぞw
まず、情報処理の組み込みの教科書を読め! >>831
負論理とかドモルガン知ってる人が対偶の意味知らないと思ってるの? このスレっていつも下らない喧嘩を延々と続けてる奴らがいるけど、何なんだろう。どっちが正しいとか以前に言ってる中身(議論の仕方)が下らなくて他人からはどっちもバカにしか見えないから消えてくれないか。 >>827
Sun OS 4.1 のはやったことがありますが、初期の頃とは変わっていたのかも >>836
彼は分かってない
2回も指摘されてるのに論理が破綻していることに気付いてない
>>747,750,751,752
>>782,784,786 >>836
さあどうだろうね、「ド・モルガンの定理知ってる」なら「待遇を理解してる」という命題が証明されたとか聞いたことないし
そもそもド・モルガン知ってるとか言うのも>>829が言ってるだけだし、>>747が対偶でない事を知ってるのかすら怪しいしなw 読んでないから知らんけどこんな雑談に対偶ガーとか論理ガーとか証明ガーってのは馬鹿馬鹿しいね。 似て非なるもの
ド・モルガン
A ∩ B = ¬(¬A ∪ ¬B)
A ∪ B = ¬(¬A ∩ ¬B)
対偶
A ⇒ B = ¬(¬B ⇒ ¬A) 正直、アスペ馬鹿が下らないことを追求したがってるだけにしか見えない コピペ改変してから何か変だと思い直してみれば正解はこうだったすまん
対偶
A ⇒ B = ¬B ⇒ ¬A >>826
いえ、typedefの文はスッキリCを参考にしましたが、
あとのアルゴリズムはオリジナルです
こんなところで意見を求めるのは図々しいと分かってはいますが、
何とかお願いします C言語のBNFって何種類あるの?
知ってるだけ全部教えて >>842
うん、俺もそう思うよ
>>747が裏も正しいと思い込んでるバカってだけの話だしw
>>844
何を追求してると思うの?
追求すべき事柄なんて特にないと思うけど >>848
https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of%20C%20in%20Backus-Naur%20form.htm BNFで思い出したが
enum { a } func(void) { return a; }
この文法使い道ないよな >>714
エイリアスの否定とはいただけない
直値だけの糞コードはゴメンだわ
意味によって0とNULLは書き分けるよ >>855
その書き分けに意味はあるのでしょうか? >>856
お前にとっては意味がない。
俺や俺以外の書き分けたい人には意味がある。
それだけだから気にしなくていいぞ。 やたら長いコードの中で
it = &a;
*a = 0;
it = 0;
a = 0;
とか書かれたら混乱するだろ。
あ、でも屑はハンガリー人なんだっけ? >>858
混乱するから数値のゼロもdefineしなさい >>825,846
自分ならこんな感じで書く、程度のものですが思うけど良かったらどうぞ
https://pastebin.com/idm94WiU
別の機能を追加する必要とか出てきたとき、
ジャンケン自体を関数化してあげたほうがmain()関数内がゴチャゴチャしなくて良いかなと思って書きました。 typedef char String[1024];
とtypedefしてるのはたしかどこかの教科書の流儀だったはずだ
最近その話題を見かけた あいこでの再戦と、もう一回じゃんけんするのは、
目的が違うんだから別ロジックにすべき。 同じ処理を共通化する
今後異なる可能性のある処理をあらかじめ分けておく
いろんな設計思想がある >>864
配列のtypedefって代入で問題にならんのかな
今のCの仕様追ってないけど昔は構文エラーになるから構造体に入れる必要があった >>825
これは危険なので普通はやらない。
scanf("%s", nextStr); >>868
jmp_bufは配列のtypedefだよ >>871
そういやそうだね
ローカルに作って環境保存にmemcpyした覚えないから代入できるのか
色々忘れてるわ ポインタを受け取る関数先頭では必ずnullチェックを行うコーティングルールが有るのですが
malloc失敗したポインタをそのまま渡した時ぐらいしか使い道が思い付きません… freeしたときに0入れるルールもあるんじゃないのそれ >>873
杓子定規に適用したら形だけの無駄なチェック処理の典型だね。
上位レイヤとの境界のような意味のあるところだけなら現実的だけども。 仕様としてnullを許可する関数ではチェック不要としているのかあるいは一律に
null渡し禁止としているのかで評価は変わりそうだが。 get_state()みたいな関数があって失敗時はnullを返す。それを知らずに別の関数に戻り値を直接渡してしまったとか、nullが誤って渡されるケースなんていくらでもあると思うが。
873が超天才でそんなミスは絶対ありえないとしても、他人のコードやドキュメントが間違ってる可能性もある Player*とEnemy*を取るRPGのバトル関数で
どちらかが死んでたらplayer->attack()関数は盛大に失敗する
この時の当該playerは消滅したわけでは無いが
enemyはメモリ上から消えている
ついでにこのattack関数が実は関数ポインタに付けられたプレイヤーのスキルだった場合、
attackがカラッポだと、徒手空拳になるか防御するか何もしないか、何故か敵味方全員が即死していきなりエンディングが始まるかのどれかになる 安全性を取るならいついかなる時もNULLチェックは行うべき
だがそもそもパフォーマンス至上主義だから
Cという太古の言語を危険を冒してまで使っているということを考えると微妙
パフォーマンスが重要でないならCを使っていることからして論外 成否を含んだtupleを渡し実行時に判別、式全体を読み飛ばす粒度の小さい隠れた分岐構文みたいなの有ればいいのにねー
成否要素だけの反転は !!tulpevalue みたいな感じで
c言語の仕事じゃないだろうしそもそもtupleなんて持ってないし
うんこマが技巧駆使してわけわからんコード書くツールになるだけかもしれんし弊害いろいろ思いつくけど >>878
召喚された悪魔が鼻から出てきて世界滅亡エンドも追加しといて。 >>879
Assertマクロとかでいいだろ
テストとかで引っ掛けるという実利に加えて「nullなんて渡すんじゃねーよボケ」と言うのを表明する意味もあるし nullに意味を持たせないプログラムなら、
null checkしないと落ちる環境ならする意味ないんじゃね Release build だと assert 消えるって知らない人意外と多いんですね >>884
消えるって知ってるからassertにしろっていう意見なんだろう その意見を完全にスルーしてコメントしてる人がいるよね assertを本番環境に持ち込むべきと
主張する痛いやつが昔いたが
奴は今どうしてるかな C++11 の static_assert は便利なんですけれどもね…これ、C に入らないかな…
assert も static_assert と同じ用途・考え方で使うべきものかと思いますね Cにもstatic_assertか
考えたこともなかったが
確かにあったらよさそうだな
もういじるなってのが
俺の基本だが
追加に賛成できる珍しい例だ >>892
> assertを本番環境に持ち込むべきと
> 主張する痛いやつが昔いたが
> 奴は今どうしてるかな
本番用はいちいちassert外してるのか?w >>895
assert は Debug ビルドのときだけチェックを行う実装になってるのが普通 >>897
だから>>892が意味不明なんだけどw >>898
リリースビルドで有効な assert を用意するだけだろ
何が不思議なの? 本番環境に持ち込むべき
影響出ないんだから
こういうことでは 深いところで拾ったエラーを浅層に戻して対応する必要がなく「ダメよ」と述べ落ち許されるプログラムならば
assert残すのも有りよね
実際#ifdef DEBUGで包んでるだけだし
imagemagickなんかも引数チェックを通った後の個々パラメータ内で不整合出たらassertでメッセージ流して落ちるし >>900
assert が発動してアプリが止まるのは終わり方として最悪だとおもいますよ
もし assert が発動する可能性があるんだったら assert ではなくて、きちんとしたエラー処理を記述するべきなのでは?
assert って辞書をみると「断言」「主張」「出しゃばり」くらいの強い意味ですね
私は assert はコメントの一種一様態として使います=>>893 >>899
えっ?
>>892が正しいという主張?
まあ>>901みたいな考え方もあるだろうけどさ >>901
assertに引っ掛かったときの挙動は置いとくとしても、assertの処理内容や頻度によっては実行時コストが問題になる可能性も無くはないから、単純にやってよしとはならないと思うぞ。 効率厨はログ出力を見れるGNUemacsのeshell辺りででもwindowsプログラム立ち上げてみ?
プロプラ、オープンソースに関係なく大半のリリースビルドが膨大な出力を出しっパになってる現状に絶望するだろうから >>905
その環境で動かすと、プリプロセッサ段階で消去されているはずのデバッグ文実行結果が見れる様になるんですか? >>905
処理内容や頻度によって実行時コストが問題になる可能性があると言っただけで効率厨扱いとはw
既存プログラムでログを大量に出しているからと反論しているが、だからそれがどうしたというのだ? ログを出しても性能的に問題ない範囲、頻度、量で出しているだけだろう。 >>907
assertion は「コメントの一種」という私の立場では、重い assertion の罪は軽い、許容できると感じています 組み込みだとタイミング込みで評価するから
ビルドを切り替えられないんだよね
assertはログだけ出すようにしてるが
ウォッチドッグを効かすってのもありかな
起こり得ないところで使うってのはその通り ロケット打ち上げ2秒後でassert出ても意味が無いな
そのまま大爆発だ
衝突する0.5秒前でassert出ても意味が無い
時速90kmでそのまま衝突だ uint64_t を配列の添え字に使えるかどうかって何か規格はありますか?
手元の環境は unsigned int のようなんですが、gcc/ming32-x64 >>911 何を見て「unsigned int のよう」と言っているの? >>911
ISO/IEC 9899:2011 (E)
6.5.2.1 Array subscripting
1 One of the expressions shall have type "pointer to complete object type", the other
expression shall have integer type, and the result has type "type".
7.19 Common definitions <stddef.h>
size_t
which is the unsigned integer type of the result of the sizeof operator;
どこにもunsigned intに限定するとは書いてねえぞ
unsigned integerと書いてあるのが
おまえはunsigned intに見えるのか? >>912-914
コメントありがとうございます
uint64_t と int をいいかげんにチャンポンに使っていたための祟りに襲われてしまっているところでして…
a[i] = *(a + i)
を考えれば、i が int = int32_t, であろうと uint64_t であろうと、うまくやってくれると予想できますね >>916
それを言うならi[a]だ
ドヤるなら動作確認くらいしてからにしろ
そもそも後置演算子の[]が[a]iなわけねえだろ STLの配列の添え字は、std::size_tと同じ範囲が使えるように思う。
このstd::size_tには長さの制約は多分ない。
常識的に考えて、32ビットのプログラムで64ビットの配列を使うことはあまり現実的ではない。
なので、std::size_tの長さはNビットプログラムにフィットするようにコンパイル時にスイッチされる。はず。 思うんじゃなく確認しろ、多分とか寝言ぬかしてねえで
N4713
26.2.1 General container requirements
Table 83 ? Container requirements
X::size_type
size_type can represent any non-negative value of difference_type
26.3.8.1 Class template deque overview
// element access
reference operator[](size_type n);
const_reference operator[](size_type n) const; 具体的な規格の文面を引用して示してくれるのは有難いことでしょ。
手元にPDFとかで持ってても場所を見つけるのが苦労で諦めることが多いし。
size_type can represent any non-negative value of difference_type
の部分を見ると size_t の大きさは difference_type の大きさに依存する、
少なくとも difference_type の正の範囲より広い、で合ってるかな。
ならば difference_type の範囲はどうなってるの? って具合に
疑問の先が移動するね。答えに近づいたけれど到達はしてない感じ。 俺は符号付のほうが好きだな
符号なしって扱いがめんどくさい だがptrdiff_tは符号付きだ
絶対アドレスに符号はなくても
オフセットには符号がある
配列の添え字はオフセットなわけだが
それでもsize_tであるべきか? BSTRのように、ときどき境界より前を参照したいことはあるかな free()とかマイナスオフセットなしでどうやって実装するんだよ、とかね いつになるか激的アーキテクチャの進化でも迎えない限り
64bitでmsbまで使い切る正数アドレスなんて無いから
相対はヌルチェック+自動整数変換に頼っときゃいいんじゃね
fseek/off_tはなんかもやもや放置気味?誰が完全な解決をもたらすのか 俺はCからプログラミング言語は学んだが、Cから入って正解だったな
あの苦難の道を思えばどれも大したことはない
C++とRustを除けば なんだっけそれ
どっかで聞いたことあるんだが思い出せない >>935
熱素やエーテルみたいな架空の物質モデル論のひとつ >>936
アニメで引用されてた気がする
エヴァだっけ?ディラックの海ってリツコが言ってたような 2019年に成長したプログラミング言語ランキング、第1位は? 2020/01/10 09:18 後藤大地
https://news.mynavi.jp/article/20200110-952052/
TIOBE Softwareがこのほど、2019年に最もインデックス値を伸ばしたC言語が2019年のプログラミング
言語・オブ・ザ・イヤーに輝いたと伝えた。第2位はC#で、これにPythonとSwiftが続いている。
C言語のインデックス値が伸びた理由として、IoTおよび小型のインテリジェントデバイスにおいて需要が
高いためだという。C言語は短時間で習得が可能な上、すべてのプロセッサにおいてCコンパイラを利用
できる。TIOBE Softwareは、こうした状況がC言語のインデックス値上昇を招いたのではないかと分析
している。
発表された2019年におけるインデックス増加率と順位は次のとおり。[順位]プログラミング言語(増加率)
[1]C(+2.4%)、[2]C#(+2.1%)、[3]Python(+1.4%)、[4]Swift(+0.6%)、
2019年のプログラミング言語・オブ・ザ・イヤーは、2018年に引き続きPythonが受賞するだろうと考え
られていた。これは、Pythonが2018年に入ってから長期にわたって増加傾向を維持しているためだ。
しかし、2019年はC言語の増加率がPythonを超えて1位となった。C言語は2016年に一気にインデッ
クス値を下落させており、2017年後半から逆に増加に転じている。ずでに減少以前の水準まで戻って
きており、今後も同様のペースで増加を続けるかどうかはわからない。
仮に、今後も同様のペースでC言語の増加傾向が続いた場合、JavaとC言語のポジションが逆転して
C言語が首位になる月が出てくる可能性もある。しかし、過去の動向として、JavaとC言語は推移が同調
する傾向が強く、Javaが第1位でCが第2位という順位のまま推移する可能性もある。(中略)
TIOBE Programming Community Index (PCI)は、複数の検索エンジンの検索結果から、対象となる
プログラミング言語がどれだけ話題になっているかをインデックス化したもの。2020年1月におけるイン
デックスは次のとおり。
1月TIOBE Programming Community Index / 円グラフ
https://news.mynavi.jp/article/20200110-952052/images/002.jpg Cの文法や標準ライブラリがコンパクトだし覚えるべき概念も少ないのは間違いない オブジェクト指向とポインタならポインタの方がラク
それにメモリに沿ってるので分かり易い ポインタとオブジェクト指向は別物だからな
そもそも比べるのがおかしい 考えようによっては、ポインタとメモリの関係を理解してしまえば、
Cほど単純な言語とその標準ライブラリも他にないからなぁ まあ組込みだとCでいいと思うけどテンプレとかも使いたいからオラはベターCだな ま、抽象度が低いと覚えることは少ないんだよ。
論理回路は覚えることが超少ない。 覚えることが少ないというか物理的で直感的だからわかりやすい
クラスとか言われても初心者には「?」だし C++ はひどい言語だ。これは、多くの平均以下のプログラマーが使ってるために
さらに輪をかけてゲロゲロになっていて、どうしようもないゴミが
簡単に生産されるようになってる。正直いって、C を選ぶ理由が C++ プログラマーを
追っぱらうため *だけ* だったとしても、それ自体、C を使う強力な理由になりうる。
C++ はトンでもなく悪い設計の元になりうる。どうせこの言語ではいつも STL やら
Boost やら、その他ゲロゲロベロベロの「素敵な」ライブラリの機能を使って、
それがあんたのプログラムに「役立つ」んだろうが、以下のことが起きる:
- うまく動かないときにもたらされる際限のない苦痛 (あと STL とか、特に Boost が
安定してるとか移植性があるとかいう奴は、どいつもこいつも大ウソつきで、
もはや笑えるレベルを超えている)
- 非効率な抽象プログラミングモデルで、2年たった後にこれらが実はそんなに
効率的じゃなかったことに気づくケース。でもそのときにはすでに全部の
コードがその素晴らしいオブジェクトモデルに依存していて、直すためには
アプリ全体を書き直さなきゃなんない。
言いかえれば、唯一まともで、効率がよくて、システムレベルで使えて、移植性がある
C++ ってのは、基本的に C で使える機能だけに限ったときなんだ。そして C だけに
限定するってことは、他の人がそれをめちゃくちゃにしないってことで、
ついでに沢山のプログラマが実際に低水準の問題を理解することができて、アホらしい
「オブジェクト・モデル」のたわごとを持ちこまないってことだ。 >>950
とりあえずお前はCに留まってろ
話はそれだけだ 初心者がC++を使うのはクラスが便利とかではなくて便利そうなライブラリを引っ張てこれるからだろう。 便利そうなライブラリを引っ張ってこれる時点でプログラミング初心者ではないし
そもそもC++から始めるプログラミング初心者とか存在すんのか? gccコンパイルしたんだが今どきのgccってC++で書かれてるんだな
恥ずかしながらつい最近まで知らんかった 質問です。32bitで確保できるメモリの上限近く(windowsなので1.5GBとか)を
色々なデータで確保した後、いっきに半分以上解放し、またいっきに色々なデータで
上限近く確保しようとするとmalloc()が失敗します(NULLを返す)。
プロセスのメモリを見ても500MBくらいまで落ちてから再確保しているようですがダメです。
これは内部で何が起こっているのでしょうか?断片化とかでしょうか?? 追加ですが殆どのデータを解放して使用量50MBくらいにしてから
しばらく待ってから再確保すると上手く行くようです。ただ500〜1000MBくらい残してから
また上限近くまで確保しようとすると失敗します。何故でしょうか? よくわからんけど、ヒープメモリの仕組みを調べるといいかも。 フラグメント
断片化
アドレス空間2GBの壁
諦めなさい 極端な例
256MBのメモリを8個確保 (2GB分) したあと
1, 3, 5, 7個目を解放
この状態だと
1GB空きがあるのに
連続で空いてるのは256MB
だから512MBの確保に失敗する >>967-969
やっぱり断片化ですか… 一旦使用量50MBまで減らしたら
断片化がかなり無くなったので確保が上手く行ったという事になりますかね。
更にうまくメモリ管理するか64bit化も考えようと思います。ありがとうございました。 細切れにならないように自分ででかく確保して
その中をさらに自分で管理すると良い >>971
もっと効率よくやるならその方法がやっぱいいですね。ありがとうございます。 そこまで大きいデータならオンメモリで処理する手段は捨てるなあ
間違えて数GBのISOファイル読み込んじゃってPC固まったとかそういう挙動は許されざるよ メモリをポインタではなくハンドルで管理すれば
メモリコンパクションができる
ただし、そんなことをしなくても実容量を超えるメモリが提供できるようにするために仮想記憶があるんだが 実容量を超えるメモリーを使いたいだけならオーバーレイとかセグメント方式のメモリー管理機構とか色々あるが >>976-977
32bitプログラムだとメモリ空間が最大でも4GBしか扱えないので
それ以上は無理ではないでしょうか?扱える方法何かあるでしょうか? メインメモリとは別の記憶媒体に退避しておけば、実質使える?かな? >>978
その理屈だと、4GBを超えるファイルは扱えなくことになる 32bit Windows の普通のプロセスのアドレス空間は2GB
OSやAPIを改造してFARポインタを扱えるようにするか
ロックアンロック方式のメモリ管理を自力で実装するか
そんなことをするよりは
素直にアプリのメモリ確保の方法を変えるのが早い
もちろん64bit化出来るならそれが一番 >>978
オーバーレイは同じメモリー空間のデータ/プログラムを入れ替えて実行する機能
メモリー空間の話であればバンク切替とかもあるし >>982
どうしても使ってる一部のライブラリが32bitで64bit化するのが無理でした。
>>983
そちらを調べてみようと思います。 >>980-981
そうやっても必要な時にメインメモリに読み込んで使う必要がないですかね?
しかも上手くやりくりして読み込んでもそこで断片化の問題もありますし。
その場合プールを自分で管理するしかなさそうな気がします。途中でその話をしてましたが。 32bitOSで4GB以上のオブジェクトをメモリに読み込んでどうにかしろ、と言われたら。
最初に検討するのはファイルマッピングだろうなあ。それ以外だとやる気がおきない。
APIを叩く必要があるので、WindowsならCreateFileMappingとかMapViewOfFileとか。 >>986
ありがとうございます。調べてみますね。 >>984
> そちらを調べてみようと思います。
いやいや、オーバーレイとかバンク切替とかは半分ネタだから今更そんなもん調べなくていいよw
>>985
> しかも上手くやりくりして読み込んでもそこで断片化の問題もありますし。
アホほどでかいサイズでなきゃそれほど問題にならないよ
> その場合プールを自分で管理するしかなさそうな気がします。途中でその話をしてましたが。
どうしてもでかい領域を確保/解放する必要あるならそれしかないように思う どうしてそんなデカいデータが必要なんだろう。遺伝子情報でも操作してんのかな? >>988
>いやいや、オーバーレイとかバンク切替とかは半分ネタだから〜
ネタでしたかw 了解しました。
>アホほどでかいサイズでなきゃそれほど問題にならないよ
細かいのと途中で500MBくらいを二つとかがあるので時々断片化のせいでmallocが失敗するんですよねえ…
>どうしてもでかい領域を確保/解放する必要あるならそれしかないように思う
とりあえず作業領域様に500MBの領域を確保して再利用すると他の部分でmalloc失敗はなかったですね。
仰るように小さい領域はかなり確保しても問題にならないですね。大きな領域用にメモリスペースを予め確保しておく方法がよいかもしれないと思いました。 >>990
メモリーマップドは、かなり癖があるから注意して使った方がいいよ
ロジックなどの作りは簡単になるけど、
下手をすると処理が一日で終わらないなんて平気で起きる もう64bitが当たり前になってかなり経つ昨今、そんな案件ごろごろある
映像をリアルタイムでごにょごにょとか言われたら簡単にギガ単位のメモリ使う
稀有な例では無いけど32bit環境でやれって言われたらヤダナとは思う >>991
そうなんですね。了解しました。
>>989 >>992
詳細はあまり言えないのですがメモリ中に
動画データを一部展開しなければいけなくて
メモリ不足や断片化の問題で困ってました。
しかも周辺で使ってるライブラリが32bitで64bit化が難しくて。 8k240Hz動画だと1秒キャッシュするだけでメモリ消費24GBか
まあ今時わざわざCを使うなんて極限環境だけだからそういうこともあるよね >>992
無理かどうか分からないけれど、その32ビットの処理だけ抜き出して
外部プログラムにし、処理結果を受けとるみたいには出来ないのかな? >>996
せめてDLLが別のプロセスモードとかで動いてくれればいいんですが…
よい案がないか引き続き考えてみますー >>978
ちょっと待てや
おまえ単一仮想記憶を前提に話してるか?
今や多重仮想記憶が当たり前で単一仮想記憶はかなり特殊な存在だぞ for (int i = 0; i < 1000; i++) {
puts("1000");
} このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 149日 20時間 47分 30秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。