C言語なら俺に聞け 162
計算量や使用メモリがネックになるのわかってたら最初からc++かcuda
インタラクティブかつビジュアライズして試行錯誤するときはpython(Jupyter) 構造体変数の宣言の初期化のとき、ヌルポインタを,{ }でくくらないと、警告が出るのですが、なぜですか? 例えばこんな具合にしないと警告が出ます
struct monster {
char name[80];
int HP, MP;
};
int main(void)
{
struct monster template = {{0}, 7, 4}; >>646
char name[80];に入るのはポインタではなくchar型の配列か文字列 >>647 よくわかりました ありがとうございます 構造体云々言う前に、配列の初期化方法についてまず調べろ >>621
Perlでメモリ不足になるってことは循環参照が発生してメモリが解放されない(PerlはリファレンスカウントGC)
もしくは深い再帰でPerl管理のVMスタックが枯渇したか
どちらにしろCで書いてもメモリをバカ食いするのは間違いないから
データ構造を見直すべき
循環参照を見直す、再帰をループに変えるなどを試してみてはどうか グラフ構造を使う場合は循環参照は容易に生まれるからな
PerlのScalar::Util::weakenで変数をラップしてやる
こうするとその変数は弱参照になる #include <stdio.h>
#include <string.h>
void main(void)
{
char c[32];
char *pc;
strcpy(c, "JAPAN-TOKYO-OSAKA");
pc = &c[0];
//for(int i=0; i<strlen(c); i++, *pc++){
for(int i=0; i<strlen(c); i++, pc++){
printf("%c", *pc);
}
printf("\n");
} コメントアウトしてる方のforにしても出力結果は同じになります
*付きポインタ変数は、中身へアクセスを意味するからめちゃくちゃな文字列が出力されるはずじゃ・・・?
どうしてなの? このソースを何という名前で保存して、何というコンパイラでコンパイルしたかとか、色々 >>657
文句を行ってもしかたがない
そういうものとして納得するしかないんだろうけど、”おかしい”と思ってるCプログラマーは世界中に2億人くらいいると思う *も++も単項演算子で適用される優先順位がある
優先順位を意識してコーディングしないと痛い目に合う
a + b == cは想定通りだろうが、a & b == cは想定外の結果になるとかねw 足し算掛け算の掛け算をシフトに書き換えたら上手く動かなくなって焦った シフト演算子は加減算より優先度低いのにカッコで囲わなかったって事でしょ シフトは乗除っぽいイメージだから加減算よりも先でいいよなぁ
ビット演算子が比較よりも後なのは完全に仕様バグだろ… 冴えてないときの自分のためにも、他人のためにも、なるべくカッコはつけるかな いまさら言って仕方ない事をいちいち書くなよ
お前が次のC言語でも作って人生を棒に振ればいいだけだよ >>667
便所の落書きにぶちギレw
お前の人生はいつも焦燥感に満ちてんだろうなw >>655
後に現れたC++のiostreamがシフト演算子をオーバーロードし入出力演算子として流用するのに
好都合で、思わぬ役に立つことになったからまあ良いだろ。もしシフト演算子が四則演算子より
優先順位が高かったら、cout << 1 + 2 * 3 << endl を cout << (1 + 2 * 3) << endl と
書かなければならず面倒だった。(C++がシフト演算子を全く別の機能に流用したのは不適切
だったという意見もあるが…) >>669
シェルのリダイレクトと概念が一致してるから、最初見た時は天才かよと感心したな
でも、出力の整形が激ムズなんでやっぱり駄目じゃんと気付くまではそう思ってた >>656
*pc++ はまず *pc の処理をする。これで pc の差している先にある値を取り出すことになる。その次に pc を一つ分進ませる(実際に加算される値は sizeof(*pc))。
では最初に *pc で取り出した値はどこへ行ってしまうのか? それは何にも使われずにただ捨てられる。 *pc++の形はcやってたら所々で見るから否応なく慣れる
個人的にはケチくさい書き方で避けたい気持ちもあるがまぁそういう文化が根付いてるなら合わせざるを得ない >>665
初期のCでは||が無くて論理和も|使ってたためのはず
KかRのどっちかが「後悔してるけど今さら変えられないし」とか言ってた C言語の標準化委員はC++のほうも兼任してたりするから、ぶっちゃけC言語の改善にはやる気無しだから。 C++はRustと比較されて安全性に劣るとレッテルを貼られて、どうしたもんか考えあぐねてるところだろうw
言語の拡張に対して完全に方向転換を強いられてるのは間違いない
それはCも一緒だな パフォーマンスを損なわずにRustと同等の安全性を追加するか、もうこのままそっとしておくかw、の2択だろう >>674
もはやbetter Cでも何でもないのに、このスレでも繰り返しc++の話題出す奴居るし、やっぱユーザーも被ってるんだろな
まあCの設計の良否を他言語よりは比較的小さな差異から論じるのに有用だとは思う
おれみたいにC++は書かずともcpprefとか読んで式や文、宣言など局所的な構文知識だけちょっとある人は多かろう(ClassとかCに無い概念は読み飛ばしてて無知)
生まれた順序が逆だけど、FortranがC++とすればF言語/JuliaがCだね
大体サブセット+独自進化、標準化コミュニティ丸被り C++は好きじゃないからC言語はもっと改善していって欲しい。
nullptr型とか入るの遅すぎじゃね? C++はCの機能を保ったまま、ありとあらゆるプログラミングパラダイムを突っ込んだもの
それがベターかどうかは人によるな
ただ、Cと互換性を保ったままそこまで進化したのは奇跡に近い でも、Rustが安全性と性能は両立出来ることを証明してしまってから、一気に旗色が悪くなったw
今まで性能を免罪符にして、多少(かなり?)の安全性を犠牲にしてきたけど、もはや通用しない時代になった
今後どう進化するか見物だな
Cだって対岸の火事ではない ちなみに、Rustは安全な代わりに書きたいコードを書けるとは思わない方がいいw
これは書いてみないと分からん感覚だ
書きやすくて安全な言語は存在しないことも証明されたw 必ず遠回りをさせられる感覚は非常にムズムズするよな
あれならgccでstack-protectorとかsanitizeとかガン盛りした方が
気分良く高効率に書けると思った 今日から戯れに数十年前のx86なGUIのソースをx64に移植し始めたんだが
とりあえずエラーになるGetWindowsLongだかをx64用に書き換えていったらそこそこ動いてしまって、後は文字列が関係する処理だけだ
俺が書いた過去のコードがよっぽど優秀だったようだ
やはり若い頃にソースを沢山書いといてよかった x64化でちょっとsize_tの扱いで躓いたので書いておこう
ポインタが64bitだから、その差を取る場合もあるsize_tも64bitなのは理屈では理解できるんだが
明らかに64bit幅が不要な箇所でsize_tに出くわすとおいおいと思ってしまう
これはbit数を明示した型を別に定義した方がよさそうだ
ああまいったまいった >>686
Windows1.0のexeもWindows10(32bit版)でも動くからな
64bit版は16bitコードの実行が廃止されたから無理
APIの方は割と変わってるけど、それでもちょっと直せばビルドできる
優秀なのはMicrosoftの方だなw Windows11は最初から32bit版が無いんだよな…
ポインターに64bitも必要ない
36bit(64GB)有れば十分
farとnearポインター復活しても良いよw win10使ってるけどOffice 97をバイナリコピーして使ってるぞ、とうとう11では動かんのか…?
主にExcel使うが関数の数は劣ってもヘルプは古い方がよく出来てて一般ユーザとしては好み、一々ブラウザ起動されてたらい回しは嫌だ Office97は32bitだから動くでしょ
駄目なのはWindows3.1までの16bitアプリ
じぶんもフリーソフトをいくつか64bit化したけどほとんど修正してない
早めにUnicodeにしてたおかげもあるかな あえて使う人もあんまりいないだろうけど、メンテナンスが止まってる(32bit 化、64bit 化されない)ようなソフトを使いたいってことはそれなりにあることじゃないの。
メーカーがつぶれて消えたりするのもよくあることだしな。 アプリは32bitだがインストーラが16bitなのが結構あるらしい もしもそんなのがあったら、メチャクチャ話題になってると思うよ 知り合いにエミュレータ入れたりして凄く苦労してロータス123を動かして業務で使っている人が居る。 使うのに手間はあるとはいえエミュレータが成熟してしまったので
かなり古いソフトウェアを動かしたいならそっちでやれと言えてしまうようになったとも言える。
Windows の互換性維持システムも結局はエミュレータをサブシステムとして
組み込んでるようなもんだしな。 >>697
ファーレントゥーガとかそのパターンだね プリプロセッサでモジュール作れるようになるとC++使わなくてもCで十分だな
もっと早めにマスターするべきだった CでCOMやれって言われても困るし
逆にC++のがマシってのはその程度か cでもできるってのと、c++使ったほうが楽ってのでは全然意味違う
チームで混乱を招くという理由以外でのc++ディスりは、大抵理解不足によるアレルギーから来るヒスのことが多い
まあ、そういうヒス起こす人が多いからチームでは使用禁止とかになっちゃうわけだから、り繋がってはいるんだけど >>708
なわけ無いだろ
我慢ができないのはただのガキだぞ >>711
そうやって我慢できずに突っかかってきてるのもどうかと思うけどな… linuxカーネル縛りと趣味以外でc言語使うってどういうプロジェクト?
実際仕事でそういう人いる?
組み込みでも今時c++使えるだろ メモリ構成が非常に小さいシステムの場合Cじゃない?
8bitのPICとか こういうの考えたんだけどどうだろう?
実用性無いだろうか
#include <stdio.h>
typedef void (*exception_handler)(void);
void register_exception_handler(exception_handler handler)
{
handler();
}
void exception_occurred()
{
printf("例外が発生しました。\n");
}
void may_throw_exception(int condition)
{
if (condition) {
register_exception_handler(exception_occurred);
}
}
int main()
{
may_throw_exception(1);
return 0;
} >>716
例外でもなくでもなくて草
Cで例外起こしたいならsetjmp/longjmpでやると決まってる >>716
「こういうの」とは何であるか説明が必要。
提示されたコードは関数 exception_occurred の呼び出しを回りくどくやっているだけで、
途中のメカニズムに意味がない。
(このコードでの使い方の範囲では。)
言葉で説明しづらいならこれが有用になるような使い方の例を示して欲しい。 >>722
C の言語仕様の範囲内でやる方法は setjmp/longjmp のみ。
setjmp/longjmp を自分で書きたいってことなら
アセンブラ (またはインラインアセンブラや intrinsic 関数) を使って
スタックポインタ操作したりレジスタの待避・復旧などをやる必要があるが……。
モダンな処理系だと最適化だのなんだのの都合でスタックフレームを省略したりだとかもあるので
それらと協調しないとまともに動作しない。
たとえば gcc だと setjmp/longjmp の実体は
組み込み関数の __builtin_setjmp/__builtin_longjmp として提供されてる。
処理系自体の機能として持たないとちゃんと動作させられんのだ……。 >>713
九州大学の人工衛星・イザナミ/イザナギは、mruby だから、C 言語
ベンチャーで上場したらしい Windows処理系の場合SEHがあるからsetjmp/longjmpをわざわざ使う事ないよ
というか外部ライブラリ等から例外を受ける場合SEH必須だよ 名古屋にスターキャットというケーブル会社があるんですが、この名前もしや もとはstringなのは置いておいて
英語の発音だとストラの方が近い
まスチョラって感じだが
スターは無理だな >>731
英語はラテン語系じゃないから、最後にaの発音は付けないよ? >>732
敢えて「らりるれろ」で表現すると、どれに近いの。 C言語を256倍使う本にコードを音読せよと書いてあっただろ 会社などで開発してれば「ここのストラレンが~」とか言うだろ 俺はstrをストロと読んでる
ストロレン
ボッチナノデモンダイナイ 「そのすたーちゃー(strchr)使うのやめろよ言うまでもなくすたーあーちゃー(strrchr)もな」って言うかも
今更C言語の話なんてしないけどストラ云々なんていっても伝わらんのは判ってる 普通に
エスティーアールレン
エスティーアールキャット
エスティアールエスティーアール
って言ってる
stdioは
エスティディーアイオー ぶっちゃけローマ字でもバンドの名前でもstrをスターなんて読むこと無いだろ KAT-TUN かっつん
ONE OK ROCK おねぇオッケーロック
正しく読むのむずすぎだろ わかったアールだからアーって発音するのか
そんなん聞いたことないな
どこの界隈で言ってるんだ
それにstrならエスティアーになるはずではw strlen ストリング レン
strcat ストリング キャット
strstr …
stdio スタンダード アイオー
strcspn 使い方すら分からない >>748
つうかrはアーって発音すんだよ
まさかvをブイとか言わないよなw
vはヴィーだよ >>748
で、partyをパーリーと発音するように、tでアーと続くからラと発音してると思われる
ググるとフラップTと言うらしいな >フラップT は、 t が前後を母音に挟まれており、かつ、t を含む音節にアクセントが置かれていない場合に起こります。
全然ちゃうやんw
母音に挟まれてないしアクセントはターにあるだろ 英語を自分ルール作って勝手に読んでる奴は暗黙の合意をわかる能力が低いということ
これはコンピュータ言語でも同じだ
自分で標準ライブラリ作り直すくらいの覚悟ならいいが中途半端に自分流突き通す奴は上達しない >>756
突然どうしたw
tはラと発音される事が多々ある
適当にググったからルールの呼称を間違えたようだ
それだけの事だろ r の発音が難しいのであーる
と語尾を整えて欲しかった。 Let it ... DIE!
ttps://letitdie.jp/common/age-verification/index.html