◎正当な理由による書き込みの削除について: 生島英之とみられる方へ:
C言語なら俺に聞け 159 ->画像>3枚
動画、画像抽出 ||
この掲示板へ
類似スレ
掲示板一覧 人気スレ 動画人気順
このスレへの固定リンク: http://5chb.net/r/tech/1659623547/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。
おっ、こないだの会議の結果が反映されたドラフトが出てたのか。
配列の初期化に変数使えるのはGCC拡張ってマジか・・・
これ↓
int arr[3] = { a, b, c };
知らなかった・・・
>>6 あれ?
-std=c11 つけてコンパイルしてもエラーにならないな
>>6は一応C標準てことでいいのかな?
>>6-7 言語仕様を確認してみたら、変数が静的記憶域期間を持つときは
初期化子に現れる全ての式が定数式でなければならない (変数を含められない) という制限はある。
自動記憶域期間なら初期化子に変数を使っても問題ない。
GCC でもそのような挙動になる。
関連する挙動を色々と試してたんだけど、
GCC では const 付きの変数の挙動が少し C++ 寄りに拡張されているっぽい。
C++ では const 付き変数の初期化子が定数式である場合にはその変数も定数式になるが、
C では単に代入できない変数という扱いのはずなんだけど、
GCC では定数式っぽい振る舞いをする場合がある (全面的に定数式扱いというわけではない) ように見える。
K&R Cでは配列の初期化子にも同様の制限があって
その理由は合理的だった
その後ある事情で無理が通って道理が引っ込んだ
staticには意味が複数あるのがC言語の挫折ポイントのひとつ
予約語を増やさないという方針自体は互換性を損なわないために真っ当なものだと思うけど、
名前がかぶったら単に一括置換で対処できる程度のことでもあるしなぁ……。
>>16 そんなので挫折するならもっと前に挫折するだろw
Scheme 手習い、を挫折しました、いつ再トライしようかしら?
自分の性分に合ったものは気合いを入れなくても割とスルっと出来ちゃったりするし、
そういうところから周りに広げていく形でやってけばいいんでないかな。
業務で必要とかならそうも言っておれんだろうけど。
完全な文脈自由文法で設計されていれば、コンパイラも簡単に作れるけどな。
しかし、Javaのその特性は完全に無視され、誰にも気づかれなかった。
お前らも気づいていない。
構文解析だけ簡単でもコンパイラが簡単なわけではないが……。
部分的にでも簡単であるに越したことは無いけどさ。
いや宣言文→実行部のように決まっている文脈ガチガチのほうがコンパイラは作りやすい
今時字句解析とか構文解析で難しいとかないでしょ
それなりのツールもあるからBNF書ければ自動生成できたりするし
>>26 言語仕様のほうも処理しやすいように寄せてきてるからだよ。
パーサジェネレータを前提として設計された言語仕様ならパーサジェネレータで処理しやすいのは当たり前の話。
>>27 難しいって一体どんな言語仕様を想定してるんだ?w
>>29 字句解析と構文解析を一体でやらないといけないから面倒ではあるけど難しいという程じゃなくね?
そもそも人間にとっても分かりにくい言語仕様を採用するのもどうかと思うが
>>30 今の主要なプログラミング言語はそう (処理段階の分離が極端に難しい仕様には) ならなかったという話をしてる。
だから昔のものから例になりそうなものを抽出しただけで、この頃の知見のまま設計された大きな言語があったら
現代的なツールでも扱いにくいだろうということ。
>>31 だから多少面倒なだけだろ
そもそもスペース無視するとか予約語を識別子に使えるとか人間側にも優しくない仕様ででかい言語仕様とか頭おかしい
>>32 漠然と変だとは思ってたとしても、知見の確立がなかったとしたらそのまま進むしかしょうがないだろう。
まあ、そうなっていない世界でのもしもの話、実際に無かった以上は想像でしかないけどな。
>>33 そもそもFORTRAN77以前でも
DO 100 I = 1. 5
なんて言う「代入文」を書く奴なんてほとんどいなかったわけで知見が確立しないまま言語仕様だけでかくなるとかまずありえんわ
まあ妄想に浸りたいだけなら勝手にやっててくださいな
>>35 タイプミスとか、難読大会とか
想像力ないの?
割り込みルーチン内で速度を稼ぐためにグローバル変数をローカル変数にコピーして
それを元に色々処理しようとするとうまくいかない
グローバル変数を直接使って処理するとうまくいく
こういうことはありえるのかな?
すっごく抽象的でさっぱりわからんw
なんの割り込み?
どううまくいかない?
>>37 書いたプログラムのロジックは誤ってないと仮定して、
コンパイラによる最適化が割り込みに配慮しないなら思ったような動作にならないということはあり得る。
ある変数が途中で変更されることはないと確信できる状況なら
レジスタにロード済みの値を使いまわしたりするのはごく普通の動作。
場合によっては定数にまで畳み込まれることもある。
だけど、割り込みはそうしたメインの流れと関係なく問答無用でどこにでも割り込むから齟齬が生じる。
C99 までは割り込みや平行については言語仕様ではあまり取り決めず、
動作の詳細な部分は処理系まかせなものの volatile キーワードを付けた変数は最適化が抑制されるとか、
処理系の拡張で属性指定を付けれるとかいった機能を利用してどうにかしてきた。
(たぶん POSIX にはもうちょっと詳しい規定がありそうだと思うけど私はよく知らない。)
C11 以降はスレッドまわりの整備が進んだので割り込みでも活用できる部分は多いと思うんだけど、
オプショナルな仕様なので C11 の処理系として必須なわけではないんよ。
おそらくは使っている処理系・実行環境で使っているお決まりのパターンがあると思うからそういうのを探して
真似するのが手っ取り早いと思う。
そういやそんな問題に悩んでた奴でvolatileの存在知らない奴がいたな
…大丈夫だよね?
volatile で全ての問題が解決する訳じゃないけどな
知らないのはまずいな
switch文がポンコツ過ぎて二分探索のif文で記述したくなります
case設定がへたくそなのでしょうか?
C++にすらないoperator switch caseでも欲しいのかな
またも抽象化し過ぎの質問…
switchが上手くはまらなかったらelse if地獄でいいんだよ
具体的にどうポンコツなのかわからんけど
例えばaが1だったら処理1、2だったら処理2、3-15だったら処理3、16なら処理4
それ以外は処理default
if( a == 1 ){
処理1
}else if( a == 2 ){
処理2
}else if( a <= 15 ){
処理3
}else if( a == 16 ){
処理4
}else{
処理default
}
こんなんで充分だよ
流れを綺麗にしたいなら
enumやマクロでシンボリックな定数を定義、ロジックはビット演算に埋め込め
>>42 volatile で保証された気分になっている方が問題、ちゃんと pthread を使えよ
割り込みは並行 (または並列) とは違うので pthread ほどの保証は過剰だと思う。
フォールスルーしないなら if else if else if .... って重ねてってもたいして変わらんしね
パーサとか書くなら抽象化のコストに見合うけど、もしそれほど複雑でないなら
caseラベルは各分枝に付き一つにしてしまい、分類は外部委託してしまうが楽
switch(var)→switch(CLASSFY(var))
case 'A': actionA;...
パターン: アクション
…
の並びに落とし込むのが難しいなら、多分switchを使うべき問題ではない
swich case は条件に応じて分岐するジャンプテーブルなのでどの条件に対しても同じ重さ
if else if は書かれた順に評価し、実行するので、起こりそうな条件を前に持ってくると効率化できる、かも
>>55 switchも連続比較する事が基本で、caseラベルの値の最小値と最大値が一定の範囲内だったら最適化でジャンプテーブルになるかもってだけでしょ
絶体にテーブルジャンプさせたければ、自前でやるしかない
リッチな処理系なら switch も常にただのテーブルということはない。 状況に応じて最適化は入る。
ただ、頻出する分岐がどれなのか予測してくれるほど十分に賢くは無いので
条件があり得る頻度によってチューニングが必要なら if に置き換えるしかしょうがないな。
GCC だとプロファイルを取ってその成果をもとに最適化することも出来る。
頻出する条件を __builtin_expect で指定するとその分岐を優先的に検査する (ようなコードを生成する) という便利機能もある。
手作業で微調整するのは不毛な感じがするから使えるものならコンパイラの賢い機能に頼るのもアリだと思う。
(試したことがないから細かいことは知らない。 たいした効果は無いかもしれない。)
まあ確かに
>>49を
switch(a){
case 1:
処理1; break;
case 2:
処理2; break;
case 3..15:
処理3; break;
case 16:
処理4; break;
default:
処理default
}
みたいに書ければなぁって思わなくもない
たまーに、いちいちbreak文を書かなきゃいけないのがダルいなって思うことはあるな
ちょっと自分が作業中断すべきときかなって
>>59 コンパイル時定数なら利益なくね?
case:3 case:4...case:15に展開するRANGE(3, 15)マクロで十分
>>59 なるほどさすが GCC やね、標準に取り込んで欲しいわ
caseラベルの値を数値(範囲)として扱うという発想が無かった
もう素直に比較しろよ
for文の中でswitch使うと、forを抜けるbreakを書けないのがクソ
気付かず使うとデバッグ困難なバグになる落とし穴
switchをifにするか、forの外にgotoで飛ばすしかない
switch文はC言語最大の設計ミス
gotoは悪って前提だな
gotoレス原理主義者?
そもそも多重ループからの脱出もできないし、ややこしい奴は素直にgoto使えってことだろ
>>69 for からの脱出が break
while/do while からの脱出が break
で、あれば、
switch からの脱出も break であっても不適当とはいえないのではないですか?
行儀良くまじめなんてできやしなかった
夜の校舎窓ガラス壊してまわった
逆らい続けあがき続けた早く自由になりたかった
ひとつだけわかっていたこと
この支配からの~break♪
Javaのswitch式を逆輸入して欲しい
評判が良いのかどうか分からんけど
endfor とか endwhile とか endcase とか悪夢でしかない
>>70 switchはループ制御文ではないのになんでwhileやforと同じなのか
break は今いるブロック (波括弧といてもいい) から一つ外のブロックに出る
という意味を持つ
それならif文からも脱出できるはずだができない
あくまでswitchが特例でループ文扱いされてるので脱出できる
switch やループ構文はブロックとは独立した構文で、
これらを使うときにブロックを作らないことも出来るし、
逆に関係ないところでブロックを作ることも出来るので
break をブロックと対応付けさせると変なことになるんだよな。
たとえば以下のコードでの break は実際には switch を抜けるだけなので printf は実行されるが、
ブロックを抜けるほうが自然だと思うか?
#include <stdio.h>
int main(void) {
{
switch(1) case 1: break;
printf("hello\n");
}
}
そんな極端な例でなくても…
case 1:
if( x < 4 ){
………
break;
}
………
break;
普通によく書くと思うが
このif文の中のbreakでもちゃんと一番内側のswitch文の外に飛んでいく
switch(k){
case 1:
{
int tmp_x; //この中だけで使う一時変数
………
break;
}
case 2:
………
}
こんな書き方でも(あまりよくないけど)ブロックは無視してswitch文の外に飛んでいく
for の中の if の中の break で単に if から脱出されても
おまえなにしとんねん
開いた口が塞がらない状態になる罠
do{
やりたいこと
}while(0);
っていう構造に変換するマクロは良く使われるが
switch(0) default: {
やりたいこと
}
なんかもアリなんだな
>>81 switchの方は初めて見た!
知らずに見たらちょっと考えちゃうよw
>>85 環境によるけど割り込みに専用のスタック使ってるシステムとかだとそのスタックサイズはそれほど大きくなかったりするからかもね
てかそのエロい人に聞けよ
割込はなるべく速く返さないといけないので
関数呼び出しのオーバーヘッドを嫌うというのもある
微妙なタイミング調整の_nop()マクロをオプティマイザが勝手に除去するのだがwwwwwwwwww
どうすりゃいいのよ
>>92 インラインアセンブラ
そもそも今時命令実行タイミングに依存する構成にするなよ...
Z80や6800でそんなことしてたけど
今時のCPUはnopでさえ速度が変動するからな
インラインアセンブラも最適化の対象になることがある。
現代的な開発環境なら intrinsic 関数が提供されてないか?
最適化するなよw
そういうのを消すための最適化だろw
インライン記述じゃなく別個にアセンブラソースファイルに書いてアセンブルしろってことだな。
スカイネット 「環境の最適化のため、人類を消去しました」
環境の最適化のためにスカイネット自身の消去が最適だとなったら実行するのかね。
組み込みでは下みたいに使った
__asm__ __volatile__()
>>99 スカイネット「あれっ、誰に報告してんだろ…私ったら(テヘ)
>>100 i cannot self-terminate.て言ってたね
Learn C Programming with Dr. Chuck (feat. classic book by Kernighan and Ritchie)
freeCodeCamp.org
チャンネル登録者数 619万
C言語のサンプルコードで関数内で関数プロトタイプ宣言するコードに出くわしました。
コンパイル通らないだろうと思って、clangで下記のような関数内に関数プロトタイプ宣言する
コードをコンパイルするとエラーなく通りました。
C言語において関数内でプロトタイプ宣言をする利点というか理由というのはどういうものがあるのでしょうか。
#include<stdio.h>
void hello(void)
{
printf("%s\n","hello world");
}
int main(void)
{
void hello(void);
hello();
return 0;
}
>>106 私見だけど、その関数内でのみ呼び出すことを強調しているのかもしれない。
あと余計なこと。お遊びのネタ。本番で使うなキケン。
GCC拡張には関数の中で関数を定義できる機能がある。clangはこの先もおそらくサポートしない。
詳細が気になるなら gcc trampoline nested function で調べてね。
main内の void hello(void); てプロトタイプ宣言(?)意味あんの?
具体的に言うと、ここの
『UMLの状態遷移図をC言語のStateパターンで実装&単体テストしてみる』というタイトルのブログの
void init_last_substate(FSM *fsm);
関数のプロトタイプ宣言です。State.c内でプロトタイプ宣言すればいいのに
なぜかState.c内のState_init関数内でプロトタイプ宣言しているのはなんでかなと。
実装自体はSubState.c内で定義されているのでState.c内で使うのであれば
プロトタイプ宣言が必要であることはわかるんですが、なんで関数内でプロトタイプ
宣言しているのかなと。
>>106 言語仕様にもある有効な文法だけれど、それほど使われることはない。
宣言はそのスコープで有効になるから直接的な理由としては
>>107 が述べている通り限られた範囲での使用を想定しているということだと思う。
範囲を限りたいのが何故かなのかというのはプログラム全体の構成によるので全体を見ないと意図を推し量ることは出来ない。
なので正確な事情はわからないけども、あえて一例として私がそういう書き方をするとしたらという前提で空想すると
・ あまり色々なところで呼ばれたくない関数がある
・ しかし呼び出し箇所は他の翻訳単位にあるので内部リンケージにすることも出来ない
というようなときにはヘッダにもファイルスコープにも宣言を書きたくないと思うことはあるかもしれない。
>>110 確かにそのコードはstatic宣言を各所に織り交ぜており、他ファイルからは関数が
呼び出せないようにしてありました。公開する関数は最小限にという感じ。
関数内でも関数のプロトタイプ宣言できるというのも、C言語の中では単なる変数宣言
double p;
と同じ扱いみたいに考えればいいのかもしれないと思いました。
typedef で関数型定義できますが、それと同じような扱いということです。
とりあえず納得しました。ありがとうございます。
>>106 理由は昔のいわゆるK%R Cの名残だ
main(argc, argv)
char **argv;
{
extern printf(), exit();
auto i 0;
for ( ; i < argc; i =+ 1)
printf("%s\n", argv[i]);
exit(0);
}
今そんなことをする必要は皆無
関数の実体がグローバルなのに
宣言がローカルなのは合理性を欠くだけ
そこらへんはプログラム的な都合だけでなく読む人に対しての意思表示という場合もあるから必要性だけで解釈することは出来ないよ。
今から書くプログラムではやめといたほうが良いが、この場合は今、目の前に実際にそう書かれているものがあるという話だから……。
古い表記を引っ張ってきたのか
意思表示としてそう記述した(可能性が高い)のか
全て俯瞰してみないとい結論は出ないだろうが
そうできたところで、自分が使うことはないだろうといった代物
namespace ってイマドキの C にあるの?
今度の規格には static_assert は入るのでしょうか?
>>122 C23 に static_assert は入る。
C11 から _Static_assert が有ったけどこれも Alternative Spelling として残る。
構造体の一括初期化の仕組みがよくわかりません。
#include<stdio.h>
enum Flag { First = 1, Second = 2, Third = 3, Finish = 4 };
typedef struct _FSM {
size_t eof;
size_t bytes;
size_t flags;
} FSM;
static FSM initState = { 0, 0, First};
void FSM_init(FSM *self) {
self = &initState;
}
int main(void) {
FSM fsm;
FSM_init(&fsm);
printf("%zu", fsm.flags);
return 0;
}
とFSM_initでFSM構造体のメンバの初期化を行おうとしたのですが、fsm.flagsにはゴミの値が入ってしまいます。
&self = initState;ではなく一つ一つ所属物を初期化すればちゃんと初期化できるのですが、
できればこの一括で初期化する方法のどこがまずいのか教えてほしいです。
肝は
static FSM initState = { 0, 0, First};
でここの初期化がまずいみたいですがよくわかりません。
>>126 うまくいきましたが、すいません。
*self=initState;
と
self = &initState;
の違いがわかりません。
ポインタに対してなんでアドレスを渡す形だとまずいことが理解できません。
>>127 >self = &initState;
selfはアドレスをコピーした仮引数
*selfはselfの実体の参照
&initStateはアドレスの参照
>>127 self = &initState;
これはポインタ変数selfにinitStateのアドレスを代入するが
このままFSM_init関数から戻っているので、代入結果が即座に破棄され
何もしていないに等しい
*self = initState;
これはポインタ変数selfが指し示す先つまり構造体変数fsmに
構造体変数initStateの内容を転記する
FSM_init関数から戻ってもmainの変数fsmは残っているので
後続のprintf関数の実行結果に反映される
void func(int a) { a = 10; }
int b = 50;
func(a);
とやっても a は 10 にならず a は 50 のまま
関数引数の型のままの書き戻しは 呼び出し元に反映されない
これを int → int * に読み替えた場合が質問のケース
訂正
int b = 50;
func(b);
とやっても b は 10 にならず b は 50 のまま
・ポインタを渡して関数内ではその指し先を利用して内容を書き換える (scanf みたいな感じ)
・戻り値で内容をどかっと戻す (=呼び出し元で代入してね)
Cの文法ではこの2パターン
>>127 参照 & は「ポインタで書くやりかた」の見せ方を変えただけ、と考えるのがいい
すなわち、ポインタを使った書き方に習熟しないかぎり、参照の意味はわからない
参照をポインタから切り離して理解するのは不可能
参照がわからなければ、まず、ポインタを使った書き方ばかりで書きまくり、ポインタなら自信がある、くらいになるのがいい
参照はポインタを理解してからはじめて使い始めるべきもの
>>134 いやさすがにそこはわかるんで・・・。
ポインタ変数を格納している仮引数に新しいアドレス値を代入しても
関数から出たら破棄されるので意味ないってことやね。
ポインタ変数宣言してたんで勝手に実体参照されるものかと思ってた。
当初fsm構造体のメンバにstateという構造体の変数をおいてそれを初期化していたので、
fsm->state = &initState;
だとうまくいくのになんでだろうと思って聞いた。
この場合、fsm->stateで実体参照しているわけやね。
FILE *fp;
errno_t err;
err = fopen_s(&fp, "file.txt", "rb");
でfopen_s関数の場合、第一引数はFILE構造体のポインタのアドレス参照したものを
渡さないといけないですが、これなんでポインタじゃまずいんですか。
ポインタに入ってる数値を書き換えるからそうじゃなきゃ変えられないでしょ
fopenの中でメモリ確保しててそのポインタの数値を確保したアドレスに書き換えてるの
もっとも、私は pascal から入ったから、ポインタなくして参照を理解していた人なのではありますが‥‥うーむ
ポインタのアドレス取ったときとかポインタのポインタでごちゃごちゃになる人は
とりあえずポインタは整数を保存してるだけって考えればいいよ
整数を関数内で書き換えるためにはそれをポインタ渡しする必要があるので参照演算子つけて渡すの
>>137 なるほど。
FILE *fp の中身が0というアドレスで、
fopen_sの中で例えば123456というアドレスに変更したいんだったらポインタ自体渡しても
変更できないことですね。*つけてポインタにならないと変更できないと。
int hoge(int *a) { *a = 1; }
int hoge(int &a) { a = 1; }
これが全く同じアセンブリ言語にコンパイルされるのを見て、参照を理解した
>>141 int hoge(int &a) { a = 1; }
関数定義でアドレス演算子使えるんですか?
何回も質問しているものです。
base64エンコーディングのプログラムを作っていました。
エンコード部分は作れた、と思ったのですが、certutil -f -encode の結果と
突き合わせると後半合いません。
1行目もなぜか幅が合いません。
状態マシンを初めて作って実装したのでどこが問題かわからないのでだれか見ていただけませんか。
https://ideone.com/rPlXWX >>142 それは C++ の機能の話ね。
機械語にされたときの実体としては参照はポインタと同じことをしている。
最初の付近はうまくエンコードされているんですが、途中でごみの値が入ってくる
ようでずれてきます。どこにゴミが入っているのかわかりません。
tmpfile()で作られる作業ファイルはどこに作られますか?
/tmpですか?
なんかそれらしきファイル無いんですが
OS:Linux Mint
>>146 glibc だと P_tmpdir が使われた上で失敗したら /tmp に作る。
musl だと /tmp に決め打ち。
作ったファイルはクローズするかプロセスが終了したら削除される。
コードの構造が自分でもわかり難かったので、フルスクラッチで書き直しました。
https://ideone.com/ddQPJy でも相変わらずどこかにゴミデータが入り込んでいるようです。
C言語特有の問題に由来していると思うのですが。。
>>148 上から下までスクロールしたら一瞬で分かったw
>>147 サンクス
読み書きは出来るので作業ファイルは作られているんだろうけど・・・
getchar()でプロセスが終了しないようにしててもP_tmpdirの場所(/tmp)に作業ファイルは作られてないわ
なんかモヤモヤするな
>>150 3.11 以降の Linux カーネル、かつファイルシステムのサポートがあれば名前のないファイルを作るということらしい。
他のプロセスからは観測することが出来ない。
>>143 3の倍数と4の倍数でずれるから
穴埋め方法の仕様嫁
8bit目が立ってるデータだと char を size_t にキャストするとよろしくない可能性
あと末尾のパディング処理
最新は rfc4648 か
>>148 わざわざenum定義してるのに使うための変数をsize_tで宣言するとか意味わからんw
>>150 作った直後にunlinkすれば他のプロセスからは見えなくなるしプロセスが異常終了したら勝手に削除されるからunixの時代からテンポラリファイルのtipsとして有名だよ
https://sonic 64.com/2004-12-07.html
>>148 主旨とはずれるが……
下線で始まる識別子はファイルスコープで予約されている。
下線で始まって大文字が続く識別子は常に予約されている。
予約されている識別子についてなんらかの宣言・定義した結果は未定義。
入門用の解説でやってることもよくあるけど真似しちゃ駄目。
構造体タグは使わないなら省略してしまったほうがよいと思う。
>>148 解決したのか知らんけど、freadが必ずBUFSIZE分読み込むとは限らんぞ
なので、直後のforループはnreadまでにしないとゴミを処理してしまう
>>159 ありがとう。まだ未解決。格闘中。
なんとかそこには気づいたんですが、どうすればeofまでの分読み込ませればいいかわからず、
結局1バイトづつ読み込ませるしかないのかと思ってましたが、nread分読み込ませればいいのか。
ただ、最終行以外もゴミデータが紛れ込んでいるようなのでそこの原因がなんなのか。
読み込むデータによってゴミデータが入ったり入らなかったりすることがわかった。
すごい厄介なバグだわ。某所から2進数表示する関数パクッて全部表示させてみると
ある特定の箇所でスタックデータが0b11111....に初期化されているみたい。
https://ideone.com/HRogms 読み込みデータはこのプログラム”base64s.c”だとこの現象がでる。
何がまずいのかな。
わかった。日本語部分が処理できてなかったことが原因だ。
vscodeでWindows、clangでコンパイルしているんだけど、freadで単純に読み込んで
出力すると日本語部分が文字化けしてしまうのはなぜ?
1バイトで読み込んでるから2バイト文字がうまく読み込めないということかな?
1バイトづつバイナリデータを読み込みしたかったので、fread(buf,...)の
bufは
char buf[BUFSIZE];
で宣言したのですがここが2バイト文字のバイナリ読み込むときにまずいんでしょうか。
単純に自分自身のコードを読み込んで標準出力に書き込むと文字化けする。
https://ideone.com/GvpcAm 010111....のビット列を単純に書き込んでいるという理解だったのですが、
そういうわけではないんですかね?
>>153が正しい
size_t stack = (size_t)(unsigned char)c;
>>165 スタックデータが11111・・・に初期化されるという問題は直りました。
charだと11111111の取り扱いまずいんですね。
char 0~255 の値を格納できるという素朴な理解で使ってたんですが、
unsigned char と char ってどう違うのか、ざっと調べたんですけどよくわかんないですね・・・。
>>153 読み返してみると鮮やかですね。昨日の段階では何のことやら?って感じでしたが。
ありがとうございます。
>>166 >unsigned char と char ってどう違うのか
unsigned charは符号なしで値域は 0 ~ 255
signed charは符号ありで値域は -128 ~ 127
charは処理系依存でsignedかもしれないしunsignedかもしれない
他の整数型にキャストしたり比較したりする時は特に注意が必要
>>168 char は 8bit とは限らん、というのは置いといて
> charは処理系依存でsignedかもしれないしunsignedかもしれない
charはsigned charやunsigned charとは違う型だよ
https://www.jpcert.or.jp/sc-rules/c-str04-c.html 数値と文字コードの認識の違いはどこらへんに出てくるのでしょうか?
環境依存によるとこが多すぎて、その都度環境に応じて調べるしかない
プログラム全般に言える事
文字はutf-8でも一文字が数バイト必要な事があるので、charはもはや要らない子と言える
バイト列を使いたければuint8_tを使って、ちゃんと文字として扱うなら、wchar_tとかchar32_tを使うべきだろうね
wchar_tこそ要らない子やん
お前一体何バイトなんだよ
>>169 >char は 8bit とは限らん、
うん、その指摘はされると思ってた。
>charはsigned charやunsigned charとは違う型だよ
なるほど、その認識はなかったは。
自分はvb→C言語→機械語だけど
機械語知らないとダメだよなって思ったわ
大体CPUの仕様と合わせるんだよな
8bitも昔のCPUの慣習出しさ
だからプレステのCPU大好きとかライゼンサイコー、いやいややはりインテルだろう
なんて言う自作オタがやり始めるとかなり速いんだよな
自作PCの構造はCPUの中身に似てるから
>>174 Windowsだと2byteでLinuxだと4byteだな
しかしバイト数を気にしてはいけない
気にしなければ可搬性のあるコードを書ける
文字化けのところは手に負えないですが、おかげさまでbase64エンコーディングプログラムが完成しました。
ここで言われたことは全部含めてみました。
構造体のタグ、enum型、charじゃなくてuint8_t、終端処理など。
https://ideone.com/7wolLZ コードが汚いなど直すところありましたらどしどしご意見ください。
とりあえず、最初に使ってみる言語はbase64エンコーディングプログラムを組んでみて
なれてみようという方針なので。
次はVBAで組んでみるか、sha256プログラムをC言語で組んでみようか考えてます。
struct tmって、冗長な設計になってるよね
たとえば tm_mon == 1 && tm_mday == 1 なら tm_yday == 0 のはずだけど tm_yday >= 1 にもなれる
こういう矛盾がある場合の扱いって規格票のどっかに書いてあったっけ?
たとえば規格書のmktimeにはカレンダー時間で表現できなければ-1を返すって書いてあるかそう実装するのが正しそうだけども
>>180 tm_yday は無視するとも書いてあるぞ。
レス㌧x
カレンダー時間で表現できるか否かということは
tm_year, tm_mon, tm_mdayのことで、tm_ydayには該当しない議論だよね
逆にtm_ydayに合わせるように補正はしないとなると
ここに優先順位があるのかな
>>182 そもそもtm_wdayとtm_ydayは更新されるって書いてあるし
関係ないけど
・tm_mday: 1 から 31 の範囲の日付。
・tm_mon: 1 月からの月数 (0 から 11 の範囲)。
なのは毎回もやるわ、なぜ両方0スタートじゃないのか...
>>185 月は (英語では) 月の名前に置き換える (配列から名前を引く) という都合から自然にそうなったという説は聞いたことがあるな。
日は番号をそのまま表示するもんだから最初から番号通りのほうが都合がいいし。
ローカル変数の宣言で、宣言しようとしているポインタの初期化子に、同じ文で
宣言された変数を参照するのは規格上OKですか?
/* test1.c */
1 | int main(int argc, char **argv)
2 | {
3 | char s[100] = {'A'}, *p = s;
4 | int i = 10, *a[10] = {&i};
5 | return 0;
6 | }
最新の gcc で試したところ、-std=c89 -pedantic の場合に下記の警告が出ます。
特に3行目が OK で、4行目が駄目な理由がよく分からないです。
どちらもスタック上の相対位置はコンパイル時に決まると思うのですが。
Cの文法について詳しい方、教えてください。
gcc --version
gcc (GCC) 12.2.1 20220819 (Red Hat 12.2.1-1)
gcc -O0 -std=c89 -pedantic -Wall -Wextra -Wno-unused-parameter -Wno-unused-variable -c test1.c
test1.c: In function ‘main’:
test1.c:4:27: warning: initializer element is not computable at load time [-Wpedantic]
4 | int i = 10, *a[10] = {&i};
| ^
gcc -O0 -std=c99 -pedantic -Wall -Wextra -Wno-unused-parameter -Wno-unused-variable -c test1.c
警告なし
C99より前は集成体(配列、構造体)に対する初期化子定数式(アドレス定数式)でスタックは認められていないっぽい
3行目の初期化対象は配列じゃないでしょ
int main(void)
{
int a = a;
}
これもOKなんだが
>>189 スタック上のアドレスを使ってポインタを初期化できるかって話だろ
>>187 {&i}だけだったら初期化は簡単だけど
その書き方だと本来{&i,&グローバル変数,NULL...}などと書けるのでそうなると特殊な初期化が必要になるんじゃないかな
一見
スタックに実体をもつ配列の先頭はセーフで (3行目)
スタックに実体をもつ変数のポインタはアウトというふうに見えるけど (4行目)
{ } の中か否かの差もあるんやね
>>190 そんなん言い出したら自動変数をポインタで指せるのかさえ怪しくなってくるな
スコープ内でアドレスが参照されたならば
自動変数はレジスタ変数にはならなくなる
「自動」の意味
win10(以下win)
strawberry perl入れた時一緒にいれたgcc
wsl
ubuntu22.04 gcc
どっかでみた配列関係のサンプルで
(間違えるとnull見つかるまで一生探し続けるよ的なコード)
で試したら
winで値がおかしい
linuxで正しい
とりあえずwin側でgdbで見ると
winで格納アドレスが逆順になってました
例えばコード上で
array1うんたら
array2かんたら
とあって
array2がアドレス100番台
array がアドレス200番台
みたいになってました
この挙動は環境依存なのかバグなのか知りたいです
まぁ結局両方windowsなんですが
ネットワークオーダーとかエンディアンとかが絡んでる可能性はあるけど、コードを見ないとなんとも
因みにこっちのwin環境だと
上サイトで24byteになるはずの所が10byteになります
strlenのことか?
文字列と違ってchar配列の末尾には自動的にnull挿入されたりしないから、nullまで数え上げるstrlenが何を返すかわからないし、環境によってはメモリアクセス違反で落ちるかも
いや多分違います
アドレスが逆
多分ここが重要なんですがその原因が
と言うところです
環境依存です
ゼロで終端されていないものにstrlenを呼んではいけません
そのコードが誤り
うーん
そう言うことじゃなくて・・・
なんでメモリアドレスの格納が逆になるの?
と言うところです
cの規格的な話じゃなくてですね・・・
そのページを作った人の環境(コンパイラとバージョン)ではarr,arr2の順で
あなたの環境ではarr2,arrの順なんでしょ
たまたまそうなっただけです
文系脳で行き着く先っていつもそうなんですよね
でも残念ながら「それ」がないんですよ
この世界
たまたま
なんかわかんないけど
偶然
楽しけりゃいいじゃん
なんで生きてるのお前?
馬鹿は嫌い 回線で首でも吊ってろカスが
ジパング馬鹿しかいないからもう寝る
スタックはアドレス高位から低位の方向に積まれることが多いから、arr2のアドレスがarrのそれより小さくなるとかですかね
スタックの方向などは環境依存だろ
環境依存は他にも、little/big endian とか、
char が、0〜255, -128〜127 のどちらなのかとか
文字コードが、BOM 無しUTF-8 以外とか
>>210 大きく言語自体から脱線するようだとあまりよくないかなと思うけど、
ささいなことなら多少は良かろうと思うし、程度次第じゃね。
>>209 UTF-8 に BOM は本質的に不要です
なぜならば BOM = Byte Order Mark ですが、UTF にバイトオーダーなど存在しません
BOM なし、と断ること自体、頭が悪い証拠を如実に表出していると愚考させていただきます
馬鹿は死ね
はじめてのC言語完全入門!【Hello World〜ポインタまで徹底解説】
91,121 回視聴
freeCodeチャンネル
>>212 BOM はエンコード方式の識別に使われる場合もあると公式 (unicode consortium) の資料に書かれている。
BOM が BOM という名前である以上は本来の用途からの転用ではあるが、
バイトオーダーだけを根拠にして不要と断じるのはエンジニアリング的に良い姿勢ではないな。
>>212 いい大人がバカとか4ねとか言ってるの見ると悲しくなってくるわ
人付き合いをろくにしてこなかった精神的にガキのおっさん痛すぎる
>>205 めちゃくちゃだよアンタw
文系ポエムは他でやんなさい
>>205 よく見るとそのページ内容がむちゃくちゃだなw
データが格納される順番はコンパイラ依存なのでそんなサンプルコードは作ってはいけない
「まず、arr のオブジェクトサイズは 24 バイトと表示されますが、」じゃねえよw
「内部の詳細を無視してしまうと恐ろしいエラーが発生する可能性があります。」もう起こっているw
以上
>>198 そもそも上のコード
size = 24 bytes
size = 17 bytes
この2つはどこから出てきたんだ?
printCharArray のあとの printf("size = %lu bytes \n", ... ); はひとつしかないのに
>>195 array1とarray2がそれぞれスタックに積まれるなら array2、array1の順は正しいし
array1とarray2がリテラルとしてコード上に存在するならarray1、array2の順は正しい
ただの最適化の問題じゃないのか
文系は全称と単称の区別が出来ない
大抵の馬鹿はこれで判別出来る
そういう表現も、大体根拠が希薄
血液型占いと同程度
>>203 規格では一切順序の保証はないので
同じ結果が欲しければそのぺーじと同じ環境を用意してください
機械翻訳まるだしだし
Pythonのおまけで載ってるだけだから
そんなページあてにするなとしか
>>212 Windowsのメモ帳でUTF-8で保存するとBOMが先頭に入った状態になるよね。
そういう変な出力をするソフトがあるせいでUTF-8なのにBOMの有無を意識しなきゃいけなくなるんだよ。
>>223 UTF-8 ではない形で保存されている可能性はいつでもあるわけだが……。
メモ帳で保存する場合、選択はこの中から
wcharはutf8圧に負けて廃れるんかね
Cのようなロートル言語使ってると固定幅(但し幅は決まっていない)エンコの有り難みをひしひしと感じる
ストレージはutf-8
メモリーはwchar_t
じゃね?
>>225 それでBOM付き選んじゃうやつが居るんだろうな。選択肢無くして欲しいものだ。
>>226 入出力でJavaみたいに変換すれば良いじゃん。
iconvライブラリとか使って。
メモ帳は、BOM 付きUTF-8 になるから、ダメ
BOM無しUTF-8は、VSCode, サクラエディタなどを使う。
TeraPad は、新し目の文字に対応していないので、ダメ
メモ帳、デフォルトでBOM無しで保存する
BOM付けるにはセレクトで一番下を選ぶ操作が必要
UnicodeのBOMはUTF-{8, 16, 32}で並び順が違うから判別に使える
逆に無いと推測に頼るしかない
メモ帳はSJISのテキストを開かれることもあるから、BOM無しUTF-8の場合は推測している
BOMが有れば確実に判別出来る
なのでBOM付きUTF-8は悪くない
WindowsではBOM付きのほうが便利だけどね。
UTF-8にBOMが要らないと主張しているのは今の現実について言っているわけじゃなくて
「UTF-8しか存在しない美しい世界」を目指している活動家だからな。
説明したところで話が?み合わない。
>>236 よくわかっていますね、実はそうなんですよね
自覚したなら今度からはバイトオーダーにかこつけたアホな主張はやめとけよ。
美しい世界(爆笑)のために、今後も活動を続けていきます!
ユニコードの上位セットであるGB18030もあるんだけど。
>>233 ASCII (8bit以内) しかないテキストに BOM 付いてたらさすがにうざいと思う
>>242 ですよね!
コードは普通コメントも英語で書くし、なんで BOM がつかなきゃならないのか意味不明なんですよ、ましてや UTF-8 に BOM つけてもいい規約なんて後付けなんでしょう?
美しい世界(爆笑)のために今日もがんばります!
>>241 まさに今、話が噛み合わないことを痛感した。
どれでもいいけど規格で決めないという対処には愚痴を言いたくもなる。
>>242 ウザいの定義を言え
普通にテキストエディタで編集してるだけなら気付きもしないだろう
10年前ならともかく今時BOMの有無で困ることなんてほぼなくね?
BOMなしUTF-8のデータを読ませるとエラーになるプログラムを作ったやつがいる。
こういうやつをどうするべきか?
仕様で読めることになっているのにエラーになるならバグだがそうでないなら読ませる方が悪い。
日本語Windows向けアプリの大半はそうだな。
仕様ではUTF-8と書いてあるだけ。ならばBOMの有無に関係なく読めるようにするべき。
仕様ではUTF-8と書いてあるなら、あったら読み飛ばせば良いだけだな
にも関わらずBOMがないとわざわざエラーを出して終わる
> こういうやつ
BOMなしUTF-8のデータそのものを修正したいのか
BOMなしUTF-8のデータを読めるようにプログラムを修正したいのか
プログラムを作ったやつに復讐したいのか
どれだ
BOM はもともと UTF-16 のためのものでしょう?
それを、UTF-8 に対しても無条件に BOM をつけてしまうウンコエディターを量産している奴等に問題があるんですよ…
また、正直にいって、規格で決めればいいとかいう思考停止にも我慢ならないんですよ
美しい世界(爆笑)のために今日もがんばります!
HTMLの場合、「BOM」付けると、PHP で謎の空白ができてしまう など動作や表示に不具合が出る可能性があるそうです。
それは、BOM付けるのがPHPの仕事だからじゃないの?
PHPは中途半端に歴史が古いから、Unicodeといえば、UTF-16なんだよな。
でもそのおかげでWindowsとの相性は悪くない。
そもそも UTF-8 には、エンディアンの違いがなく、BOM(バイトオーダーマーク)を付ける必要がないんだそうだ
HTMLの場合はHEADに使っている文字コード情報が入っているのでそれを見れば良い事になる
>>264 たしか規格でBOMを優先することになってなかったっけ?
文字列としてバイトオーダーが実際に問われるのは、
UTF-16やUTF-32のケースだけです
その場合は必要ですね
確認したところ、なってたわ。
HTMLパーサー書いたことがあるから、おぼろげに覚えてた。
・BOMがある場合、BOMに従う。
・ない場合、500ms、あるいは1024バイト読み込むまで待機し、エンコーディング走査アルゴリズムを呼び出す。
エンコーディング走査アルゴリズム内で、ヘッダー内の情報が読み取られる場合もある。
(このアルゴリズムでも、他に優先される情報がある。)
やはり、HTMLにおいては、BOMをつけるべきだな。
読み込みが速くなるし、文字コードの違いを利用した攻撃を避けることが出来るし。
HTMLの場合は、HEADに使用するcharsetが記述されてますから心配ありません
昔の外国映画で「ふにゃちん野郎が!」という悪口があったよね。
今後は「BOM無し野郎が!」と言うことを提案いたします。
>>269 規格上、BOMのほうが優先される。
BOMがある場合、エンコーディング走査アルゴリズムは呼び出されない。
BOMをつけましょう。
付けたWebサイトをここで公開して下さい
楽しみにしています
すべてのUTF-8にBOMがついてたらSJISはもっと早く消えてくれたと思うんだよね
この話題は、BOMをつけましょうということで、良いのでは?
>>276 違います
BOM を付けるべき正統な理由がある時には付け、特に理由がなく惰性で付けてるんだったらやめよう、です
BOMを付けていない人を見かけたら、注意して差し上げましょう。
ということで、良いのでは?
テキストファイルを開いたとき最初の三文字がゴミかどうかいちいち判断するの?
2つのテキストファイルを結合するときゴミをひとつにまとめる処理するの?
BOMという考えが誤りなんだよ
法令でBOMを義務付けるべきでは?
BOMが無かったら通報するみたいな。
Windowsの一部アプリでBOMがないと動作不具合起こすんだよ
Officeとか、Officeとか、その辺
この辺への思いやりが必要な時は付けてあげると良い
>>278 それに加えて BOM を無駄につけている人を見かけたら、注意して差し上げましょう、も追加してください。
>>280 その法令は間違っていますね
正直いって、規格で決めればいいとかいう思考停止にも我慢ならないんですよ
美しい世界(爆笑)のために今日もがんばります!
>>279 ふたつのテキストファイルが Unicode である保証もない。
メタ情報で保証があるなら BOM があっても困らないし、
保証がないなら BOM があろうがなかろうが困る。
>>281 たしかに office とか office とか office とか office とかに思いやりを示す寛大な処置ということであれば、付けて差し上げることにやぶさかではないのですけれどもね
>>277 後半に関して言えば、そのテキストがどのエンコードを用いているかが他の手段で示されているなら
BOMは用いるべきではないとされているからそれに従えばいい話だね。
「俺が扱うテキストは全部UTF-8に決まってるんだからBOMは要らない」という自己中心的な主張と
混同してくれなければいい。
まあ私はどちらでも良いんですけれども。
(レイヤード・ストリームをつこてますので)
gccがBOMに対応したのだから、BOM付ける陣営の勝利では?
ところで明日は地下鉄が止まるかもしれないので、調べておいた方が良いですよ。
わたくし思うのですが、BOMに対応しないソフトウェアを企画してしまう技術者って、もはや技術者で無いのでは?
ユーザーが必要としてるわけですからね。
WindowsはBOMがあった方が判別しやすいが、LinuxやUNIXはBOMがあると余計なものが付いているという感じになる。
マルチバイト圏への配慮が足らなかったマイクロソフトが一番悪い。
だいたい2バイトで漢字がすべて収まると思ったアメリカ人に対して、早く日本人が漢字は何万字もあると教えなかったのが失敗だった。
MS-DOSの頃は、これで十分って思ってたからな。
>>290 >だいたい2バイトで漢字がすべて収まると思ったアメリカ人
CJK 漢字統合なんて醜い仕様のひと言に尽きますよね
>>286 自己中心的、という言葉の使い方が間違っていますよ
その昔は Shift-JIS, JIS, EUC が入り乱れまくっていましたが、だれもテキストデータにエンコードを示すプリフィックスを付けようなどとは思わなかった事実があります
UTF-8 にバイトオーダーマークなんか絶対に不要なのにバイトオーダーマークを安易につける発想そのものが自己中心的なのでは?
美しい世界(爆笑)のために今日もがんばります!
「俺が扱うテキストは全部UTF-8に決まってるんだからBOMは要らない」というのが自己中心的な主張だと言ったんだが?
こんな単純な日本語の文章すらまともに読解できない奴に間違ってるとか言われても困惑するわ。
>>294 同じことを繰り返しますが、
①過去、エンコードの違うテキストを各種取り扱っていたからといって、「テキストの内部に恣意的にエンコードを示すマークを入れる」などという自己中心的なことをした歴史はなかったのです。
特にそういうことをしたいときは、ソースコードにその言語のコメントでエンコードを示す、くらいの配慮をしていたものです
②UTF-8 でエンコードされている限り、そのコンテンツがアスキーコードのみで構成されているのならば、特にバイトオーダーコードは不要で、as is で使えるように、欧米諸国に配慮した設計です
特に②が重要で、バイトオーダーコードを要れずとも、C のソースコードは UTF-8 であれば普通にコンパイルできる、はず、なのに、なぜわざわざバイトオーダーコードを付加して既存の処理系がそのままでは使えなくなってしまったのか?
コンパイラは MS-VC だけではなく、gcc も clang も lsi-c (w)もあるというのに、既存のコンパイラの動作を妨害してまで、バイトオーダーコードを付加するエディター側の方が自己中心的といえるのではないでしょうか?
そしてエンコードを示すマークなどではないバイトオーダーマークをエンコード種を示すマークに乱用するしている二重の矛盾も指摘しなければなりますまい
私の言っていることがわかりますか?
>>264 そのHEADの箇所に行くまでエンコードが分からないのだよな?
そこまでどうやって読むのか?
まあ、現実問題としてASCIIで入れておきゃいいわけだけど、厳密にはそれじゃいかんよな。
>>290 エンコード切り替えの規格は ISO/IEC 2022 がある。
PC-9801 時代あたりにはマニュアルで KI/KO コードという名前で説明されていた。
ヨーロッパ言語も ISO/IEC 8859 として十種類以上の文字セットが定義されているんだ。
日本での事情以上に混在は深刻な問題であって、対処する規格は当然ある。
>>296 おっしゃるとおり、そこまでは、ただのアスキー7bit で記述するんですよ
大概は第一行目にエンコード種をアスキーで書くものでしたけれどもね
厳密っていうけれども、あなたのおっしゃる厳密の意味がよくわかりませんね
>>297 英語が一番簡単で、ウムラウトとか苦労していたと思いますよ、ウムラウトは確か 7 ビット領域に侵食していたような気が
>>297 おっと、私のいっていたことが少し不正確でしたね、たしかに KI/KO は生 JIS にありましたね
自然言語なんて数千年単位の歴史的経緯の塊だ。 その文字も。
綺麗に整理しようとしたって元がグダグダなんだからどこかしらでグダグダになる。
そんでそのグダグダをひとつに寄せ集めたのが Unicode なんだぞ。
そりゃグダグダで当たり前だし、そういうもんだと思うしかしょうがないだろ。
そんでもって Unicode がかなり広まったといっても従来の文字コードが消滅したわけでもない。
https://xkcd.com/927/ >>240 チャイナ規格ですか‥‥(差別意識満々)
調べてみましたが基本的に4ビット固定長であり、UTF-8 を包含してはいないようですね、UTF-8 の上位規格というのはどういう根拠でそういっているのですか?
どっちかというと 現行中国漢字エンコード規格の上位規格でしょう
私の理解
・7 ビット圏は 1 バイト
・拡張部分は可変長ではなく 4 バイト固定
・現行の中国の漢字エンコード規格 GBK(シフトJIS と同じ仕組み)を包含するように第二・第四バイトの範囲を GBK と被らない範囲に制限している。
>>302 ユニコード・コードポイント全てを内蔵したうえで、さらに少数民族の文字を追加してあるからでしょ。
そういう生い立ちなんだから。
>>301 How standards have been overproducted とか易しい英語にしてほしいなあ
>>303 コードポイントの数は十分確保している、って言う意味で「ユニコードの上位規格だ」と主張しているわけですか
この理解で正しいですか?
EBCDIC なんていうコード体系もあるんだよな
これはASCIIよりも古い
このコードで動いていたPCもあった(今もあるかは知らない)
>>290 2千字の常用漢字で済ませという時代だったから。
> だいたい2バイトで漢字がすべて収まると思ったアメリカ人に対して、早く日本人が漢字は何万字もあると教えなかったのが失敗だった。
>>295 ここまでくると狂気しか感じないが。
>>286で自己中心的と書いた内容と全然関係ない内容を
延々と繰り返すのはなんでだろう。
ついでに
>>295の内容について言えば、規格で定めているもののどこがどう自己中心的なんだか。
この場合の「自己」って誰のこと?
>>270 PHP+SJIS全盛の頃にBOMの代わりに「美乳」が使われてた時代があったな
>>275 そうかな
全てのファイル名にBOM付いてたら嫌だな
>>313 BOM付けろ派はASCIIかどうかもBOM付いてないと判らないみたいだし
>>309 >
>>286で自己中心的と書いた内容と全然関係ない内容
>>286 >「俺が扱うテキストは全部UTF-8に決まってるんだからBOMは要らない」という自己中心的な主張と混同してくれなければいい。
まあ、活動家のなりきりをしているので、そういうスタンスをとっているけれども、本質的には
>>295 1. 過去、エンコードの違うテキストを各種取り扱っていたからといって、「テキストの内部に恣意的にエンコードを示すマークを入れる」などという自己中心的なことをした歴史はなかった
2. UTF-8 でエンコードされている限り、そのコンテンツがアスキーコードのみで構成されているのならば、特にバイトオーダーコードは不要で、as is で使えるように、欧米諸国に配慮した設計
が言いたいことですね
UTF-8 ならば通常は as is で使えるんですよ、特に C/C++ のコード(コメントは英語・これって普通でしょ?)をそのまま使えるのに、どこぞのエディターが勝手につけるバイトオーダーマークまで正当化する風潮に苛立ちを感じているんですよ
長いものに巻かれよ、みたいなみっともない風潮を正当化するあさましさにあきれ果てているのです
あなたがそうだ、とはいいませんけれどもね
どこでも演説をおっぱじめるガキにいらだちを感じてる
gdbについて質問いいですか?
ステップ実行でfopenを通過しようとすると
"iofopen.c: そのようなファイルやディレクトリはありません"
とメッセージがでて先に進めません。どうすれば回避できますか?
OS:Linux
ちなみにソースは以下の感じです
fopenで開くファイルは実行ファイル(a.out)と同じ場所に置いてあります。
#include <stdio.h>
void main(void){
FILE *fp;
fp =fopen("aa.txt", "r");
fclose(fp);
}
includeガードって割と使われてるように思いますが、エラい人の批評とかありません?
依存関係を把握しきれてないヤバい状態の発覚を先延ばしにするだけのハックだと個人的な経験から思うのですが…
とりあえず各ソースファイルの実行部、なければinit_xxxみたいなエントリーポイント作って
#ifdef XXX perror("xxx loaded twice"); exit(XXX);
みたいの置いたりしてます
init_xxxを呼び忘れると無意味なので、文法エラーで落とせたら良いと思うんですが、分かりやすいメッセージ吐いて落ちてくれる違法構文(あるいはそうするときの標準的なイディオム)あったら教えて欲しいです
>>323 エロい人の批判ねえ。。。
#pragma onceなんか色んなコンパイラの中の人が真似してるけど?
依存関係を把握っていうけど、じゃあ
#include <stddef.h>
#include <stdio.h>
なんて書かされたいわけ?
ライブラリだって-lstdcじゃなく
fputc.o iobuf.o fprintf.o printf.oなんて書くべきだと思う?
何かを使いたいときの窓口を1つにまとめておくのは
作る側として行儀のいいことだと思うぞ
>>326 むしろグッドプラクティスとされてる感じですか、確かにシステムヘッダにも見掛けますね
標準ライブラリは使うものを共通ヘッダにまとめてますね
ライブラリとして公開する場合は当然慣習に従うべきだと思いますが、書いてる時には丁度必要十分でなく、余計なヘッダがあると何処に何があったか混乱したりしません?
コードを弄らずスタティックアナライザとか道具に頼った方がいいのかな
>>323 ライブラリはそのライブラリの使用者に対して
インターフェイス部分だけを公開したいのが普通で、
細かい依存関係が見えてしまうのは悪い設計だろ。
でも C のヘッダファイルの仕組みは隠蔽しきれない部分が出てしまうので
そもそも C の言語としての仕組みが悪い。
C を使う以上は悪い部分ともつきあわないとしょうがないし、
インクルードガードは比較的マシな解決方法だと誰もが考えているからこそそうなってる。
C++ にはモジュールが導入されたけど今のところはヘッダファイルとも共存し続ける必要があるから
完全な移行にかかる時間は数十年単位かもしれんな……。
>>327 >余計なヘッダがあると何処に何があったか混乱したり
へたくそなライブラリだとそういうの見掛けるが
上手なライブラリはすっきりしてるイメージ
>>328 FILE * とかって結局使う方からしたら void * でも動くしな
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <memory.h>
typedef struct {
int year;
int mon;
int mday;
int hour;
int min;
double high;
double open;
double close;
double low;
} CSV_T;
void f(CSV_T *csv){
CSV_T *work;
for(int i=1; i<1001; i++){ //★
work = realloc(csv, sizeof(CSV_T)*i);
if(work == NULL){
puts("error");
exit(0);
}
if(work != csv) {
puts("ココ通過でアウト"); //▲
csv = work;
}
}
csv[0].year = 1;
csv[0].low = 1.1;
csv[998].year = 9;
csv[998].low = 9.9;
printf("%d %f\n", csv[0].year, csv[0].low);
printf("%d %f\n", csv[998].year, csv[998].low);
}
void main(void){
CSV_T *csv;
csv = realloc(NULL, 1);
f(csv);
printf("%d %f\n", csv[0].year, csv[0].low);
printf("%d %f\n", csv[998].year, csv[998].low);
free(csv);
}
・やりたいこと
CSVファイルを1行読み込むごとに構造体のエリアをreallocで拡張して格納
元のソースをそのままアップするには長いのでファイルの読み込み部分を削除したソースが上のやつです
・悩んでいるところ
コメント★のとこのループが1000程度なら動きます。
しかし10000を超えるループにするとコメント▲部分を通過するようになり
mainのprintfが正しい値を表示しなくなります。
なぜ?
領域拡張がそのままでは出来ずに新たな領域に指定サイズで取り直すからでは?
どっちにしてもそんなに細かくrealloc()するものでは無いし
ある程度の大きさで取っておいて足りなくなったらrealloc()するのが本来の使い方
reallocが別のメモリを確保して返す場合
▲のほうを通ります
このときfの内部でcsvを変更しても
mainのcsvは変化しません。
返り値にするかfの引数をCSV_T**にするか
変更すればよいです。
>>293 昔はデータ容量を節約する必要があったから、データ容量が増えることは避けたかっただけ。
>>295 ①や②を使っている時点で日本人の都合を世界に押し付けていることがわからないのか?
丸数字はUnicodeに登録されてるから心配ないよ
㋿ですら存在するし
>>293 そんなこと言ってたらUnicodeには肌色を指定する文字があって、これは通常表示されない
これらを組み合わせると家族絵文字はたった1文字を表示するのに最大で41byteになる
もはや文字を正しく表示する事は簡単じゃない
BOMの有無なんてかわいいもんだ
私が Unicode のグダグダさについて言いたいことは
>>301 が全てなので繰り返しになるんだが
そもそも自然言語がグダグダなのが問題の根源。
文句があるなら自然言語を規格化して普及させてみせろや。
人それぞれなんだが、
自分が一番困るのは
~
これの扱いでいつもトラブル
「が」と「か゛」が混ざってる事もある(見た目じゃ判別付かない)から、先ずはUnicode正規化しないと、なぜか文字列が一致しないとかもある
>>335 >>333-334 で work を書き換えて csv に上書きしてるつもりで
main の csv は上書きされていない
f 側では CSV_T **csv で受けて *csv = work; と描いて上書きする
main から &csv を渡す
ここと
work = realloc(*csv, sizeof(CSV_T)*i);
ここも
if(work != *csv) {
変更汁
>>346 ここも直さんとエラーになるぞ
void f(CSV_T **csv){
>339
日本の都合に合わせたOSを作ったらアメリカから(ry
BOMはいるとかいらないとか
自分を中心に語っている間は自己中心的、なんじゃないですか?
BOMあったほうが良い環境と無いほうが良い環境があるなら、それに合わせて利用するでは?
>>349 いまはネットでつながってる時代なので、BOMを付けるべきでしょう。
自分だけで使う資料なら、何も言いません、自由にしてください。
>>336-347 動きました。
指摘頂いた箇所を直してコンパイルすると、コンパイラが
error: ‘*csv’ is a pointer; did you mean to use ‘->’?
っと吐くので、コンパイルメッセージ通り
csv[0]->year = 1;
csv[0]->low = 1.1;
csv[998]->year = 9;
csv[998]->low = 9.9;
と修正したら Segmentation fault (コアダンプ) となるので随分悩みましたが
以下のようにすることで望む動作となりました。サンクスです。おわり。
csv[0][0].year = 1;
csv[0][0].low = 1.1;
csv[0][998].year = 9;
csv[0][998].low = 9.9;
printf("%d %f\n", csv[0][0].year, csv[0][0].low);
printf("%d %f\n", csv[0][998].year, csv[0][998].low);
>>348 そんな幻覚を信じてる奴がC言語使うなw
中国がやられていることを、以前は日本がやられていた。
アメリカは許さん。
いつかアメリカが弱くなった時、必ず仕返しをする。
アメリカはほんとジャイアンだよな
色々な国から恨み買ってると思うわ
そういう下らない話はどっかの陰謀論スレでやれ
CもUNIXもパソコンもどこの国が作ったんだよw
だから国産のCやUNIXが必要なんだよ
アメリカにずっと依存してたらいつか痛い目を見ると思うわ
Cのどこに陰謀なんかあるんだよ
ちゃんと理解して使ってる人なら絶対にありえない妄想だな
いつまで経ってもHello worldの域を出られないウルトラ低脳だけだろそんなこと言ってるのは
ビジコンの小島社長が技術だけでなく、世界を目指していたら
今頃は世界を制覇して太ろうに
>>351 そこまで csv[0] 多用するなら
引数を void f(CSV_T **pcsv) にして
関数内で CSV_T *csv = *pcsv; すると良い
最後に *pcsv = work; だけ気を付ける
>>358 じゃあLINUXはどこの国の人が作った?
一行でもプログラム書いたことないのがバレバレだぞw
くだらねえ陰謀論書くヒマあったら
イギリス人のノイマンが考えてアメリカのEDVACに搭載されたのが最初だっけ
ジョン・フォン・ノイマンはハンガリー出身のアメリカの数学者。
両親はハンガリーに移住したユダヤ系ドイツ人。
>>362 五橋研究所の一件は絶対に忘れない。
アメリカを許さない。
>>363 何を以てCPUと呼ぶかという定義の違いによってどれが世界初のCPUかが変わる。
ノイマンは原爆は地上100mで爆発させるのが最もダメージを与えられるという計算を一生懸命してた人
技術が政府を必要なくするという妄想を主軸に据えた改定アナーキズムを提唱します。
国を細分化し、一つの国の力を十分に小さくすれば、戦争は消え去ります。
それも改定アナーキズムの効果のひとつです。
>>362 Linuxの開発はC言語依存だろ
そしてC言語はアメリカ産の言語
国産のC言語で国産のLinuxを作る
これが真の国力だよ
どの国で作られたとかアフォかと。その国だけで使ってくれって思ってるとでも?他国でDLさせたり、販売しといて?
技術者らしく、アメリカをぶっ倒す方法論を考えよう。
アメリカの良し悪しなんて、倒した後で誰かが考えてくれる。
この認識って一般的じゃないのか?
えーまじかよ
将来アメリカと戦争になったらどうすんの
gccとかダウンロードできなくなるんじゃないの?
>>338 だからといって三カ国の漢字コードを無理遣りに統一する!とか言い出す必要があったのか?
各国とも各国なりのちゃんとした漢字コード体系が成立していたというのに
>>339 ①②はアメリカ人の都合でしょ?
どうして①②が日本人の都合か説明いただけませんか?
>>341 絵文字はねえ‥‥、絵文字をねじ込んだのは日本人ですし、確かに酷いことになっていますよね、ご意見に同意します
>>374 そうだな。
文字コードは一番詳しい日本が主軸となって作り直す必要があるな。
まず、新しい文字コードの名前から考えよう。
ところで、JISが日本工業規格ではなくなったって知ってるか?
まずそこからだぞ。
>>370 日本にはLSI-C86試食版があるじゃあないか!
>>342 >文句があるなら自然言語を規格化して普及させてみせろや。
人工言語エスペラント(人工言語といったら発案者は怒りますね、彼は謙虚に「国際補助語」といっていますね)に始まる「ふつくしい世界」の探求ですね
ロジバンがいい感じに見えるのですが私の年齢では、もうとりかかるのにためらわれますね、若い方でやっている方はおられますか?
>>373 いまあるパソコンで最大に困ってることは何かと考えるとセキュリティじゃないかな?
乗っ取られないOSを考え付いたら、世界をとれるんじゃないか?
>>382 真面目なC言語の話題が投稿されるまで。
>>370 Linux はスウェーデン系フィンランド人(ムーミンの作者トーベ・ヤンソン(女性)もそうですね)で、アメリカ人とはいいがたいですねえ
>>388 理屈じゃねえんだよ。
統一教会は最高なんだ!
>>370 マジで言うぞ、アホかお前は
科学技術の功績がどこ人とか地の果てまで関係ねえんだよ
0をインド人が発見したからってブール代数はインドの国力か?
理系と文系の区別がガチでわからんやつめ
>>391 とても興味があります
インドの強みはなんでしょうか?インドの言語・サンスクリットが強みなんでしょうか?
ラマヌジャンが見つけたπの計算式は他の人では不可能じゃないかな
世界のIT系企業中心の三大都市として
米国のシリコンバレー
中国の深セン
印度のバンガロール
は有名な話ではある
>>390 科学技術はまーそうだけど
依存してる状態はよくないでしょ?
まぁC言語については国産のコンパイラ作ればそれでいいけど
たとえばトップが中国人になって日本にだけ冷遇してくるとかさ
そういのってあるでしょ?
アメリカに冷遇され続けてるのに。
なぜか「日本はアメリカに愛されているんだ!」とか。
愛されない子供ようなこと言ってる。
そもそも、現代のアメリカと真っ向から戦った国なんて一つしかないのに。
警戒されてるに決まってるじゃん。
こっちだっていつか復讐しようと爪を研いでるのに。
>>397 やっぱりな
ム板に来るやつだからと万が一の奇蹟に期待してたが
予想どおりガッカリなやつだな
出てけよ、技術板にそぐわないやつめ
>>400 なんでそんなに怒ってるのか謎だわ
俺は間違ったことは言ってないと思うが
全く間違っていない。
自給率確保は日本の安全保障の大原則だし。
「日本をぶっ壊す」とか言い始めた、ここ30年の日本政府は別として。
ニュース系板が規制きびしくて
耐えられなくなった難民どもが
無関係なスレを徘徊して荒らしている
今日この頃
今まで政治に関心が無かった人が、関心を持ち始めて、良いことでは?
民主主義的に言って。
自給率は安全保障の指標の一つですから、国産OSが必要だと思います。
全てを過去に変える偉大なOS!!!
ではなく、誰もが普遍的に使える小さなOSが良いと思います。
TRONのソースかき集めてPC/スマホで動くように改修すればええねん
アイドル板とかゲーム板で政治の話が出るのが、健全な民主主義じゃないっすか?
>>400 あんた、サタンが憑りついてるんじゃないか?
言動がめちゃくちゃだぞ。
>>405 LinuxでOK
どこの国にも属してないぞ
>>410 忘れる以前に知らない
検索するのでキーワード教えて
>>411 バトルプログラマーシラセ「五橋研究所 Redhat」
俺たちサタンは、アメリカを許さへんからな、絶対!!!
>>391 そしてやがてインドでOSが作られる。名前は
インドーズ
国産OSガーと言ってる人は超漢字を使ってここに書き込むこと。
>>416 使いやすそうだけど、文字一個分なにかが足りないんでしょうね!
五橋研究所はRedhatとパートナー契約を結び、RedhatLinuxの日本語化を行った。
充分な日本語化を達成して時点で、Redhat社はパートナー契約を打ち切り、Redhat自身で日本語版Linuxを自社販売した。
・明日からWindowsは使えません。
・明日からmacOSは使えません。
・明日からiOSは使えません。
・明日からAndroidは使えません。
> Imagine all the people
> Living for today
いま中国のSNSで写真の加工が流行ってるんだよね。
ブドウの粒粒を星形にする加工。
みんなが加工してウプしてる。
なんでだろね?
ファーウェイはAndroid搭載機器を販売できなくなって、スマホから撤退したからね。
アメリカン・リスクだわ。
>>376 絵文字の表示と編集まで出来るように対応するのは大変な労力だけど、お陰で日本語を知らない外国人のソフトウェアでも、自然と日本語に対応されるという利点がある
もっと細かいところまで対応するのはネイティブじゃないと無理だけど、かなりの進歩だ
もう日本はアメリカなしでは生きていけない
中国やロシアみたいにアメリカ発のサービスが止められるような状況になったらバンザイするしかない
なので考えるのはやめよう(スレちだし)
>>428 ファーウェイはAndroid搭載機器を販売できなくなっていないと言いたいのか?
>>426 そもそも日本は敗戦国だから少なくともアメリカに対しては自由はない。
お爺ちゃんの代からCIAと繋がっていようがいまいが日本はアメリカンの属国だ。
この事は逆の立場になって考えてみれば分かると思う。戦争してやっと勝った相手に対して戦後に自由を認めるか?そんなことは普通に考えてあり得ないだろう。
>>429 Android そのものはフリーだから Android のスマホが作れないことはない。
ただ Google のサービスは全滅なのでその辺を独自に作る必要がある。
中国国内からは検閲の都合で Google へは繋がらないだろうから最初からそういう独自のサービスは用意しているのではないかと思う。
ロシアで売れる理由はそれのロシア語版があるからではないか。
日本ではまだ売ってるだろうが普通に Google のサービスが使えないのでは商品価値がないのでほとんど売れず、また日本で新機種投入はしないということだろう。
Amazon の Fire タブレットも似たような状態だな。Android ベースのOSだけれど GooglePlay からのアプリ取得はできない。
で、Amazon が独自にアプリダウンロード出来るようにしている。
結局、アメリカン・リスクがあるから、独自OSが必要ってことじゃないか。
>>432 あと数週間で日本でもWindows11でAmazonのアプリが使えるようになるらしいぞ。
ちなみに私はファーウェイのタブレット使ってたけどね。
ペンが使えるちょっといいやつ。
アメリカの規制以降、Androidは8から更新できないままになってた。
>>434 もう利用できるよ
ただAmazon App StoreではGoogle Playには到底及ばないので殆ど使われていない
アメリカからの独立を目指す政党が立ち上がればよいのだが。
政治と宗教の話は食卓でするなってばっちゃが言ってた
>>436 うちにはまだ来てないぞ。
きさま、マイクロソフトの回し者だな?
なんだ最後は他人任せか
「俺が独自OS作ってやるぜ!」とか「俺が政党を立ち上げるから支援してくれ!」とはならないのか?
でなきゃ「口だけなやつだな」で終わるぞ
朝鮮からの卒業、アメリカからの独立。
必要。
絶対。
>>437 君が作れば良い。ていうかそういう政治団体なら既に沢山あるのでは?
>>440 私には私の持ち場があるので。
自分の持ち場を守る。
自分の立場では、中韓が主敵となる。
アメリカとは力の差がありすぎて同じ戦場に立つことすらできない。
>>442 他国の支援を受けていない政党は共産党しかないが、共産党はダメだ。
>>438 虫ケラとして生き抜く知恵だけど、もう無理じゃないの。
日本自体が無くなろうとしてるのに。
GDPがドイツに抜かれた。
8000万人しか人口ないのに。
自民党は統一教会の支援受けてるし、日本のために働くことが出来ない。
>>444 じゃあ自分で作れ。
大丈夫。現実に1人で国政政党作っちゃった人も居るから。やってやれないことはなかろう。頑張れ。
国民ファーストの政治を必要とするなら、自分で政党を立ち上げなければならない。
これ、もはや国家崩壊してるでしょ。
主権が国民に無い。
主権者が統一教会になっちまってる。
>>420 詳細知らんけどそれって単に契約のやり方がまずかったって話じゃねーの?
契約書に書いてないのに未来永劫パートナー契約し続けてもらえると思ってたなら頭おかしい
書き込み順位&時間帯一覧
1 位/32 ID中 時間 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Total
書き込み数 9 0 12 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23
使用した名前一覧 書き込んだスレッド一覧
デフォルトの名無しさん (ワッチョイ 5f01-JEMU)
デフォルトの名無しさん (ワッチョイ b701-JEMU [60.87.151.68])
C言語なら俺に聞け 159
【統計分析】機械学習・データマイニング32
東大・財務省が中華。
御用学者の浜田・伊藤などが、日本の借金が千兆円あると嘘を流して、
30年間緊縮財政を続けて、軍事費を減らした
だから、高橋洋一・三橋・中田敦彦・山本太郎などが、
借金は本当に千兆円あるのかとか、YouTube で言い出した
30年間で金融緩和をしたのは、安倍・黒田だけ。
だから円安になって、労働人口が増えた。
それが民主党・中華に都合が悪かった。それで暗殺された
NHK 党の黒川がNHKの討論番組で歌った歌がある
「安倍は、おじいちゃんの代からCIA」
安倍の祖父・岸信介はCIAだから、戦犯を許されて総理になった。
CIAが共産党と戦うために、文鮮明・統一教会と組んだ。
これが反共産主義の国際勝共連合
でも、また財務省が円安を嫌って、為替介入した。
これには米国・欧州もあきれた。
金融緩和して、0金利を続けているのに、それとは逆の円高にするの?w
岸田ロボットを操作している木原官房副長官も、東大・財務省だから中華。
楽天も中華資本が入ってる。
だから、ガーシーに叩かれている
RAPT理論プラスアルファ
ガーシーは中共のハニトラ工作員!! NHK党は中国共産党の工作機関
YouTube に動画あるけど、
このデマには、さすがにNHK 党も怒って、この動画の謎の美人2人を訴えると言ってるw
これはラプト様を使っての、ロリ谷・木原の逆襲かも
むしろ、中華のハニートラップは林。
大王製紙の井川が、安倍から聞いたと言ってた。
たぶん、林はハニトラに掛かっていると
構造体のメンバー変数にstaticが書けなくてつらい悲しい
struct Hoge {
static int x;
static int y;
};
C言語的には
int Hoge_x;
だな
C++的には::で繋ぐところを、Cでは_で繋ぐ
それでええやん
>>455 static struct Hoge hoge; じゃダメなの?
もう覚えてないんだけど、countだけシングルトン風に管理したかったんだと思う。
struct Hoge{
static int count;
int data;
};
Hoge *hoge;
hoge=malloc(sizeof(Hoge)*n); // dataは配列
Hoge.count // countはシングルトンっぽく
>>460 ああなるほど、やりたくなる気持ちはわかるし実装もそんなに難しくはないように思う
ただそんな要望がどれだけあるかと言うと...
>>453 10年以上かけて、ドイツにGDPを追い抜かれるんだから、アベノミクスは大失敗だよ。
専業主婦だった人はもとより、70歳以上の人まで働いてるんだよ。
そこまでして、国際的地位が落ちて行ってる。
これはもう、力の差を認めて、地道に教育に力を入れるしかない。
30年後の復活を目指して。
女性や老人を働かせたことで、子供を見る人が居なくなり、出生率がさらに低下してる。
20年後の見通しもさらに悪化した。
>>461 いや実装は無理だろw
mallocしてんのに、一部分だけ共有するんだぞ
もっとデカイ単位なら仮想記憶のトリックで可能だろうけど
Cにnew演算子を導入するところから始めないといけないから、変更点がデカすぎる
count だけポインタにして初期化の時に static の変数へのポインタ入れておけば良いんじゃね?
>>464 static の変数は静的領域に割り付けてそれ以外の変数だけをヒープやスタックに確保するだけでいいだろ
>>460 の例なら
static int _Hoge_count;
struct Hoge{
int data;
};
みたいな感じ
まあインスタンスを生成してないのにcount が割り付けられるのは気持ち悪いとかあるけど
要するに C++ でやってるみたいに出来ればいいねという話だろう。
構造体を名前空間の一種としても使うとなるとマングルが必要になるから割と面倒な話だと思うよ。
>>460 C言語のstaticの意味を他の言語と勘違いしてるっぽい
そこはC言語固有のキーワードではなく
言わんとするところをくみ取って許してやろう
>>469 関数内のstatic変数みたいな奴ってことだろ
>>425 ふむふむ、なるほど、複雑怪奇な仕様をねじ込むことで、より簡単な処理まで改善される、という理解でいいですか?
>>474 複雑かどうかは重要じゃない。
対応せざるを得ない状況を押し付けるってことだよ。
>>431 Huawei App GalleryはAppleストアやGoogle Playを凌ぐ世界最大市場らしいが、少し考えれば当たり前の事だけど
かくいう俺のHuawei製スマホにはHuaweiとPlay両方入ってた、まあ日本向けアプリはPlayの方が充実してるのであまり使ってない
>>475 うふふ、絵文字は各国ともやりたがっているので絵文字には対応せざるを得ない、すると漢字にも完璧な対応を強いられる、ってことですか、策士ですねえ‥‥
unicodeのハングル文字登録で揉めたって聞いたけどどう決着ついたのかな。
>>477 それが完璧にはならんのよ
東アジアの文字幅(East Asian Width)問題がある
ただ色々ワークアラウンドが有るからなんとかなる事が大半
>>340 そういう話ではない。外国人に対して見慣れない表現を使うのは古臭い。
>>344 それは単に日本語みたいな言語が世界の主流ではないから起こる現象。
半角のカナ文字だと濁点、半濁点はそれだけで1文字になる。
英語で日本語を打つときは濁音、半濁音記号を文字として打つ方が楽なのでそうしていることがある。
>>375 その数字と記号の融合表現は日本語独特のものだから。
英語圏はタイプライターの流れを受け継いでいる。
タイプライターだとたくさんの文字には対応できなかった。
>>483 役所とかでフリガナ振る時、升目が有ると濁点を1文字として書いちゃうからな
そういう時に「か゛」みたいのに対応してるのは助かるのだろう
Unicodeはちゃんと1文字として表示してくれる
ま、しょうもない文化だよw
○の中にアラビア数字
別に違和感感じないと思うけどな
①②・・・ああ、機種依存文字だから使うな!と言ってた時代があったなぁ。
黒丸に白抜きで1~199
白丸に黒字で1~199
も準備してほしいなあ
アルファベットにアンダーライン入れるなんて普通にやってたけどな
LaTeXだと、これで○内に文字入れられる
\ajMaru{1}、\ajMaru{100}、\ajMaru{101}
>>487 それは日本で生まれ育って、ずっと日本にいるから。
>>488 それむしろ逆で、外国とのやり取りの際は、避けるのがいまの主流。
日本語事情に詳しくない外国人にとっては、丸囲みのニュアンスがわからない。
>>490 それ文字として分ける必要がないだろうに
丸数字も同じでしょう
アラビア数字の修飾なんだから
漢数字を丸囲みしたら、それは読めないかもしれないが
中味は万国共通のアラビア数字なんですよね
ローマ数字なんかよりは遙かに分かりやすいでしょう
>>497 今と言うか昔から海外の資料で丸付数字なんて見たことない
って言うのは理由にならんか?
使われていないということと
避けるのが今の主流という主張では、
開きが大きすぎる
使ってはいけないものなら、
国際化される際に却下されても良いでしょう
ウムラウト等のアクセント記号も使ってはいけなくなりそう
英文字のアンダーラインと同様アラビア数字の修飾と受け取れば良いのでは
特に異議がなければ、スレ違いですので、私はこの話題は止めたいと思います
続けるまら、この板の文字コードスレに移動した方が良いと思います
>>497 日本のグローバル企業は、PCですら英語キーボードで統一している。
ファーストリテイリング社は日本でもすべて英語キーボード。
日本語、英語、中国語が社内公用語で、日本語特有の文字は使わない。
>>502 あのさ、英語のドキュメントや、英語のマニュアルが原文の日本語で①や②なんて見たことねえだろ?
しかも丸で囲むことにたいした意味がない。
①だったら、1. と書けばいい。
>>505 >>499 が実現すると記譜が書けるようになるんですけど
>>504 使う文字とキーボードってほとんど関係ないんじゃ?
>>507 じゃあ、英語のキーボードで日本語の記号をどれだけ変換なしで入力できるか、やってみて感想を書いてくれ。
英語のキーボードはとにかくキーが少ないから苦労するよ。
アプリケーションのショートカットキーも日本語版と英語版のアプリケーションで違ったりもする。
英語キーボードで、ドイツ語のsや、フランス語のcってどうやって入力するんだろう
変換無しで頼む
ちゃんと貼り付いてなかった
ドイツ語のエスツェット(βに似ている奴)、フランス語のシーセディーユ(ヒゲのあるC)
それぞれの国用キーボードだと入力は簡単なんだろうが
>>508 変換なしって、カナ入力か?使ったことないからわかんないや。
というか、漢字の入力でさえ変換が必要なのにそんな変な縛りを入れる意図はなんだろう。
ctrlなんとかで打つか
記号や数字のキートップを犠牲にしているようですね
>>510,511
ß "s-zet" (ß): Hold down "control" and press the ampersand (&) (i.e. Shift + 7)
Cédille (ç), type ' then c. Circonflexe (ê), type ^ (shift + 6) then e. Tréma (ö), type ” (shift + ') then o. To type French quotation marks « » use ctrl + alt + [ and ], respectively.
スレチだったら申し訳無いんですが…
WinFormsやQt、WindowsOSのエクスプローラといったGUIのコントロール(ボタンやテキストボックス等)って
一般的にどの程度のインターバルでユーザの入力を監視しているものなんでしょうか?
モニターのリフレッシュレート?60Hzとか決め打ち?
1文字キー入力するとイベントが発生するので1文字毎じゃないの?
そういう話じゃなくて?
ゲームじゃないんだからフレームレート毎の判定になんて普通はならない
(大昔のゲームならボタンなどが押されたか判断する為に、レジスタをVBlank中にチェックするみたいなのはあった)
>>516が言う通り、OSがキーイベントが発生してGUI部品にも伝播されるからOSの処理に依存しているという感じかと
もっと細かく言えば、キーボードを押されると割込みが発生してOSがそれを処理し
該当のウィンドウのイベントキューにキーイベントを設定するみたいな流れかと思う
ボタンなどは大体が親ウィンドウから伝播される流れかと思う
>>515 昔のデバイスではハードウェア割込みを使っていたが USB はホスト側からのポーリングが必要で、ポーリング周期は 1 ミリ秒。
監視の周期は 1 ミリ秒といえると思う。
私も詳しいことは知らんから規格を読んで。
画面の更新とは独立して検知しているんですね。
レスくれた方ありがとうございます。
このスレは言語だけでなくハードにも詳しい人がいるから面白い
Linuxでマウスのポーリング間隔を計測したら124Hzだった
かなりの高頻度でポーリングしてんだな
USB3.0ポートに繋いでるからかもね
安もんマウスなんで高頻度過ぎて多分無意味w
ここで聞いていいかわからないんですが、↓こういうことをCでできますか?
https://ideone.com/TqQjef func1〜3を並列で動かしたいということです。
おかしな質問だったらごめんなさい。
字面通りの仕様ならばFIFO QueueとThreadかな。あと排他制御も必要。
C++にはdequeというのがあるがC言語には無いのでFIFO Queueは自作。
threadとmutexはpthreadにある。
そもそも並列処理にする必要があるのかという疑問。
>>523 なるほど、マルチスレッドならできそうですね。
ありがとうございました。
1reader 1writer なら、ロックの要らないリングバッファが有るからそれ使えば簡単
>>515 それ機械的な割り込みのことを聞いているのか?
出力と入力が同じようなものと思うの発想が斬新だなw
質問者はキーボードやマウスなど入力と、画面の表示が一緒だと思っているようなコンピューターオンチだ。
画面はパラパラアニメだということもわかっていない。
アニメや映画の仕組みもわかっていないレベル。
ハードウェアよりBIOS、BIOSよりOSが低レベルを担っていると思うのは、すべてが逆だよな。
日本人は機械がなくてもWindowsがあれば、掃除機が出現すると思うレベルまでITオンチが進んだのか。
とにかくおそろしい。
>>518 http://www.kumikomi.net/archives/2007/03/22usb1.php?page=5 本家あたるのはしんどいので、似たところでこれか
USB の電線上では 1ms(125us) だけど
USBホストコントローラから CPUへ割り込みの発生もやってるっぽい (ホットプラグ関連)
一部のゲームだとOSから発生したマウスイベントを処理するんじゃなくてゲームのメインスレッドでボタン押下をチェックしてボタン押下の処理をすることもあるし、
質問者がそう思うのも不思議じゃないかな。
普通のGUIフレームワークじゃイベントはキューに貯まると思うけども。
家庭用ゲーム機の場合は入力をポーリングしてる気がしないな
ゲームコード側から1/60秒毎に要求が有るからそれに対応すれば良いだけだし
ま、確証は無いけどね
実際処理落ちするとフレームが更新されるまでボタンを押し続けないと駄目なゲームって結構あるでしょ。そういうことだよね。OpenGLなんかでプログラム書くと普通にグラフィック更新とキー処理なんかは同じスレッドでするしね。
普通のGUIアプリでもOSのカーネルタスクがめちゃくちゃ重くなるとキー入力を取りこぼしたりするのは、ポーリングが人間の入力に間に合ってないからだと思うな。遅れるわけじゃなくて初めと最後だけ入力されたりとかする。
アプリケーションレイヤでの話としては Windows のコントロールは基本的にメッセージを介した非同期的な
処理なので周期もくそもないんだけどこのスレに現れて GUI フレームワークの知識があるくらいの人 (
>>515) が
イベントドリブンの理念を知らないなんてことあるだろうか?
根本的な勘違いをしているのか質問が下手なのか。
どういう事情があってこういう質問をしたのか気になる。
一応はある瞬間に状態を取得する API (GetAsyncKeyState) もあってゲームとかではそれを使うこともあるが……
その場合にはディスプレイのフレームレート (というかそのソフトで画面を書き換える頻度) 以上の頻度で読んでもあまり意味がないから
フレームレートに合わせるということはあるかもしれんね。
ある8bitPCのBASICでVsync割り込み時にキーボード信号読み取ってたの思い出した。
(INPUT、INKEY$等キーバッファ関連用)
ファミコンやスーパーファミコン時代はVSync割込みが始まってVBlank期間内に
あらゆるレジスタの入出力をしないといけないので、キー関連はそのタイミングで取得して
内部の特定ワークに保存(一つ前の情報も残しておいて押しっぱなしかどうかの判断も出来るようにする)してた
最近だとUnityでもキーの状態を取得する処理があるので
ゲームだと処理タイミングの時点で取得も普通にあるという事なのだろう
>>535 それDirectXとかの場合でしょ?、
>>540 ハードウェア上の要求というより
画面上のキャラが1単位動く間に2回以上キー入力できても意味がないから…
ゲームセンターあらしではパックマンのモンスターが1/60秒に一回しか動けないことを見きってそれ以上の速度で動いてかわしてたっけなw
炎のコマw
自機だけ超速で動かすとか、絶体不可能なのはちょっと考えれば分かる事だが、子供の頃は夢中になって読んでたな
平和な時代だった
高橋名人は16連射してたけど、1ギガ連射位すれば高周波で誤動作させたりできるんじゃね? 知らんけどw
某レースゲームは画像は60fpsでも内部では120fpsだか240fpsで処理(挙動計算?)
してるってインタビューあったわ。
当時はすげぇと思ったけど、PCの場合モニタのフレーム数(60/144Hzの違いとか)によって挙動(操作感覚)
が変わるの防ぐには必要な仕様なんだと思った。
>>515 ポーリングじゃなくてハードウェア割込みでメッセージキューに入るんだろ
敢えてポーリングってことで言うならメッセージループディスパッチャを回す速度に依存
>>534 USBじゃなくて受信機がUSB接続のリモコンとか
bluetoothの可能性もあるな
>>549 (Windowsで)キーボード・マウスの HIDドライバがどういうことやってるか調べることになりそうだな
イベントドリブンになってるのか、テーブル更新しつつ親元でポーリングしてもらうのか
>>546 物理エンジンは1フレーム内でほんのちょっとずつ動かしながら何10回も計算するよ
現実を模倣するには無限大回数計算しないといけないけど、コンピューターでそんなこと不可能だし、floatの精度の問題も有るから適当なところで妥協しないといけない
その辺が工夫のしどころなんだろう
処理回数なんてメインループのsleep(0.1)をsleep(0.05)にするだけじゃね
>>552 いや、1/60秒は余りにも刻みが粗すぎる
もちろん表示するのは1/60秒の1フレーム単位だけど
画面表示の仕組みを知らないやつは延々と変なことを言い続けるんだろうな
昔は単純だったな
1/60か1/30程度の違いしかなかった
今では画面リフレッシュ・画面レンダリング・ゲームメインのすべてフレームレートが違うこともあり得る
ここはC言語のスレなんだから、もうちょっとC言語寄りの話題に
最小tickがOSのAPIに依存する件
(というか関数毎に違うよね)
APIは単に最少論理単位を定義してるだけで実際の最少単位はOSバージョンやハード構成によって変わるはず
>>558 >CGの用語では、この処理レートを「フレームレート」と呼ぶ場合があったため、混乱が生じた。
VRAMにあるデータを決まった間隔でモニターに表示する。
VRAMのデータの書き換え速度はビデオボードによる。
C言語そのものは画面表示の速度の規約がない。
C言語は画面表示のライブラリすら持っていない。
日本が世界に誇るハイレゾリューション VGA 640x480 60 Hz インタレース。
日本の技術は世界一。
おじいちゃん、その昔話は耳にタコが出来るくらい聞いたわよ(´・ω・`)
PC98やファミコン時代の話は誰も求めてないだろw
>>565 PC-9801 は 640x400 じゃなかったかな?
640x480 の VGA は IBM-PC の方だからアメリカでは?
IBM-PC 最初の頃の規格だとCGAで80x25、640x200だったような
8000シリーズでもこれに合わせてたような
VGAはPS/2あたりから出てきたんじゃなかったかな
EGA, MCGA, VGA, SVGA, XGAとか、色々あったっけな
>>569 だよな
98は400を「超高解像度」と言ってたw
VGAと言ったら320x200だな
1ドット1バイトなので丁度64KBになって、16bitコードがリニアにアクセス出来た
ただ、1ドットが正方形じゃないので、正方形のMode X(320x240)を使うにはDOSエクステンダーが必要だったな
>>572 どーでもいいことだが
聞き捨てならんw
320x200は65536じゃねーよw
画面に表示されない、VRAMの余り部分はCG用ワークエリアに使われることが多い。
88とかは1プレーンに16Kバイト用意されてるけど、表示されるエリアは640ドット(80バイト)x200ラインで16000バイト。
あまった384バイトを使って背景とキャラを重ね合わせ描画をして表示エリアへ転送とかやってた。
話をプログラム寄りにもどして、
ゲームでCG表示が他ゲーより余りに遅いの見かけると、
CG周りをアセンブラじゃなくてC等の高級言語で書いてるんじゃないかと邪推してた。
縦が200ドットというのはNTSCでの出力の都合だろうな。
>>573 丁度じゃなかったw
ま、64KB以内ということで
そういや昔インターレースなのを利用して400ドットを表示するなんてことやってなかった?
チラチラして見れたもんじゃないが一応表示はされるという。
>>578 Basic Master Level 3 かな
かな文字表示のためにインターレース表示しててチラつき防止のために専用の長残光ディスプレイがあった
わー懐かしい
カーソル点滅が速くて仲間内でハイフラって呼んでた
PC98でラスター480表示するTSRも存在した希ガス
26行計画だっけか?
表示エリアの外に表示しますってプログラムがあったね
FDDのオーバートラック
286のHMA
CRTCをプログラムでハード破壊
なんか、こういうの色々あったな
C言語ってパソコンの内部まで理解してないとムズイ?
メモリがどうとかクロック数が幾つとか
>>585 > メモリがどうとかクロック数が幾つとか
そんなものは知らなくても組めるけどそもそもC言語使う必要あるのか?
>>585 C の言語仕様は言語仕様上で規定する仮想的な機械の挙動として記述されていて
現実の処理系がどのような機械語を生成するのかは規定してない。
見かけ上の挙動が仕様通りならどういう機械語が生成されてもよいことになってる。
現代的な処理系はすごく高度な最適化をするのでどういう機械語が生成されるのか事前に想像するのは難しいし。
どうしてもすごく高速に動いてほしいプログラムを気合い入れてチューニングしたりする場合には
ハードウェアの知識が必要になることも有るし、
他の言語との接続が必要なときにはメモリの管理方法を協調させないとおかしなことになったりもするけど
結局のところやりたいこと次第だし、入門レベルでは気にする必要はない。
今ならアプリケーションレイヤで動くプログラムでクロックを意識するようなことはまずない。
現代のパソコンやスマホくらいの高級な CPU では機械語を分解して
最適化した内部命令 (インテルだと μop と呼んでいるようだがメーカーによって名称はいろいろ) を生成したりする
工程があるので、クロックも一定とは限らない。
そこまで高度なことをしない CPU でもだいぶん前からパイプラインは採用されてるから、
単純に命令ごとのクロック数を合算した値が処理時間になったりはしないし。
i++; 辺りは効率の良い機械語翻訳を期待していると思う
言語仕様で規定する仮想的な機械が (C が初期に使われ始めたコンピュータである) PDP と親和性が良すぎるので C のことを PDP エミュレータと揶揄することもあるらしいね。
>>585 何のプログラムを作るかによる
おまえさんが言うようにハードがわかる必要があったり
簿記や不動産取引がわかる必要があったり
おそらくそこまで高度なことは求めてないよ
クロックという言葉を知ってたから口走ってしまっただけで意図としてはハードウェアの知識をつけないとC言語は使えないのかと聞きたかっただけだと思う
C言語関連のシステム系の質問していいですか?
微妙にスレチっぽいですが、このスレの人が一番詳しそうなのでご容赦ください。
最近Windows Server 2019マシンを導入し、Windows10で使っていたソフト(他社製)を持ってきたところ
ほぼ全部問題なく動くのですが、一つだけ10倍以上遅いソフトがありました。
そのソフトはexe1個のみの構成で、Dependency Walkerで調べると C:\Windows\System32\msvcrt.dll に依存していました。
(他の正常動作するソフトでmsvcrt.dllに依存するものはなし)
Cにはあまり詳しくないのですが、昔mallocが異様に遅い環境で苦しんだことを思い出し
もしかしてWindows Server 2019のmsvcrt.dllの出来が悪いor相性問題が原因なのではと思いました。
そこで考えたのですが、Windows10のmsvcrt.dllを持ってきて使ってみるというのはどうでしょうか?
とりあえず速度が正常に戻ってくれれば十分なのですが、やめたほうがいいでしょうか?
>>593 やっぱりそうですかね・・・
リソースモニターとかで調べてはみたものの原因がさっぱり分かりません。
特にIOが遅いように感じるんですが、ハイグレードなSSDを積んでいるのでハードとしては問題ないと思います。
100万円クラスのマシンですし他のハードもスペック的には問題ないはずです。
ちなみに試しにWindows10のmsvcrt.dllをexeと同じフォルダに置いてみたのですが、どうも使われていなさそう。
dll検索順ってカレントディレクトリが最優先じゃなかったでしたっけ?
できるか知りませんが、System32のdllをspecificに参照するようになっていたらそもそも無理ですね。
開発元に聞けたらいいのだけど諸事情でそれが不可能です。
微妙じゃなくて完全にスレチw
Windowsシステム関連のスレで聞いたほうがいいと思う
>>594 > dll検索順ってカレントディレクトリが最優先
もし単純にそういう順序を適用するとマルウェアがファイルをそこに置くだけでプロセスを乗っ取れてしまう。
レジストリのどこかに登録されているやつは別扱いにするとかのややこしいルールがあったはず。
> 特に IO が遅いように感じる
IO が遅いというのが事実だとしたら
① 物理的に乗っているのが SSD でもハードウェアの自動認識が誤っていて古いインターフェイスでやり取りしている
② たまたまそのアプリケーションがデバイスドライバかコントローラのバグを踏むような制御になっている
② HDD で性能が出るようにアプリケーション内で凝った制御をしていたが SSD が速すぎて狂った
などの事情は思いつくけど……
>>595 Windowsシステム関連のスレがないか探しましたが、どうもこれというのがないんですよね。
Windows板かな?あそこは一般コンシューマが多くてこの手の質問はしにくいのが・・・。
引き続き海外フォーラムを漁ってみます。
>>596 詳しくありがとうございます。
ご提示のものが原因とすると、ちょっと自分の手に余りそうです。
他の似たようなソフトは軒並み問題ないのに何でこのソフトだけ・・・と釈然としませんが
どのWindowsでも同じように動きますなんてそう甘い話はないということかな。
存在しないネットワークドライブにアクセスしに行って、タイムアウトするまで固まるとかは時々遭遇するけどはたして
鯖機だとベンダー独自の機器やドライバが入ってたりするだろうから分かる奴はほぼいないだろうな
>>597 >一つだけ10倍以上遅いソフト
この製造元に聞くのが最短だと思う
製造元には軽く聞いてみたのですがサポート対象外ですと一蹴されました。
諸事情により相手のほうが立場が上で、現段階でこれ以上聞き出すのは難しいのですが
上手く機会を作って情報を得たいと思います。
皆さんありがとうございました。
Windows Server で Hyper-V 動かしてその上に Windows 10 入れてそのアプリ動かせばええやん
ハイパーバイザー型よりホスト型の方が融通効くしフリーのもある
個人利用なら好きにすればいいけど共用のサーバー機でそんなことして問題起きると責任問題になるよ
>>606 Hyper-V は両方あるからわざわざ 「Windows Server で」って書いてある
>>607 普通はシステムのdll置き換えようとしてる時点で責任問題になるしそもそも Windows 10からアプリ持ってきてる時点でライセンス大丈夫か?って思うだろ
msvcrtってMicroSoft Visual C/c++ RunTimeなんだよね
C言語ってライブラリを静的リンクすることが多いけど共通部分をdllにしたらディスク容量が少なくて済むんじゃねって発想で作られた過去の遺物
今は積極的に使うべきものじゃない
おそらく古い古いソフトなんじゃね
そういう古いソフトは当然のように32ビット(ひどい時には16ビット)だから64ビット環境ではエミュレーションが働く
その辺に何かありそうな気がするな知らんけど
コンパイルし直せば直るような気がしないでもないがメーカーが対応する気ないんじゃどうしようもない
>>585 メモリとハードディスクの違いくらいはわかってないと無理でしょ
>>610 16ビットはエミュレーションは利きません!
64bit Windowsでは16bitアプリは動かせない(エミュレーション環境は32bitだけ)
32bit版Win10 ならかろうじて可能性はあるがWinServer2019は64bitだけなので完全に無理
>>614 それは 32 ビット版 Windows の話
64 ビット版 Windows は 16ビットアプリを捨てました、AMD64 アーキをもっと勉強してね!
>>616 サードパーティだがWineVDMというのを使えば動くようだ
勉強になったか?
32ビット版の仮想を動かしてその中で16ビットアプリを動かす事は出来る
そういう多段ロケット使えば良いんだがそこまでして今動かすものがないw
>>616 64bitホストに32bitゲスト載せるとさ
普通に16bitアプリを実行できるんだけど
本当にハード的に不可能なんかね?
32bit OSでは4GB超えできないとかさ
マイクソの集団催眠にかかったやつの言う
ちったあ勉強しろってマウントは
呆れるの通り越して笑う価値もない
エミュレータ使うならできない理由はないなあ
単にマイクロソフトが自前のエミュレータの提供をやめたというだけでAMD64がどうとか言うのは知識不足のマウンターの妄言としか思えないな
じゃあまずお好きな言語でエミュレータを作ってそこで動くZ80プログラムを作れ。
リロード忘れた。間に山盛りに他の書き込みが。
削除できないからもういいや。わすれてくれ。
>>617,619
それってエミュレータでしょ?仮想的なCPUをコードでガリガリ書いてインタプリタしているって奴、そんなのでもまともに動く時代になったんですねえ
>>618,619
私も 16 ビットを 64 ビットで動かすときはエミュっています
http://takeda-toshiya.my.coocan.jp が有名で私も便利に使っています
>>626 AMD64の勉強したらこの話に関係ないことがわかったか?
まあ私も「エミュレーション」という言葉を、ソフトウェアによるエミュレーションか、80386 がやり始めた仮想86モードという意味でのエミュレーションかをはっきり区別せずにパンパン書いたせいもありますね、ごめんなさいね
WOW64とサンクはその話とはまた別だぞ
それはハードの話だろ
MSが提供しなくなったのはサンクだ
なぜつまらないとわかっていてオヤジギャグを何故言ってしまうのか
チコちゃんで脳科学的に分析してて笑ったわw
>>633 歳を取ると語彙が増えていき頭の中でダジャレが浮かびやすくなる
それと同時にセンスが低下して面白いギャグかどうかがだんだんわからなくなる
結果的におっさんはつまらないダジャレを思いついたらすぐ言うようになる
オヤジギャグやダジャレより
連想したものをただ言ってれば、
例えツッコミ扱いしてくれて楽だろう
つまらなくても笑えよ。敬老精神が欠如しているのか。
ソースではなく、make終了時にBIGCOCKと表示させてた奴を知ってる
本人いたら、ゴメンナサイ、バラしました
そう、こういうの
全然どうでもいい事をさも重要な秘密のようにw
独り言です
インデントは4を使ってきたのだがプロの世界?では2みたいだな
軽くショックを受けた
プロの現場にそういうところもあるというだけだよ
1つ目撃したからってそれが全てだと思うのは
早まった一般化という誤謬だ
誤謬を多発するやつは論理思考が苦手ってことだ
むろんプログラマとしての適性ではマイナス要素だ
昔は画面が狭かったからそういう主義のやつも割といた
そろそろ淘汰されてる頃じゃね
今でもそこそこ使われてるだろ
一画面とは言わないまでも100行ルールとかの発展型も多い
ひとつの関数が何千行もあればコードレビューで問題にされる
名前空間やクラスを使わないC言語は特に文が長くなりがちだから、2のほうが使い勝手がいいと思うことはよくある
>>647のcatソース見たけれど、
私にはブロックが分かりにくいと感じた
見慣れれば良いのかも知れないが
>>647 rms仙人の直筆か
プロ?と言って良いのかはさておきスーパーハッカーではあるね
関数呼び出しの()前の空白とかは結構独特なスタイルだと思うぞ
✗直筆
✓監修
プロとは我らIT土方の事を指すのです
中括弧の位置とか関数呼び出しのスペースとかなんでこんな独特なスタイルなの?
なんのメリットが?
もともとは egrep とかで使いやすい
とかいう理由だった気がする
http://web.sfc.wide.ad.jp/~sagawa/gnujdoc/standards-19981118/standards-ja_5.html
GNUのソースは読もうと思って読んだがあのスタイルに拒否反応が出て駄目だったわ
インデントごときで読む気が無くなるのは、単に向いてないだけだなw
スタイルがあるなら従うべきだけど、300-500行目に連発する
}
else
{
はさすがに目が滑る
スクロールして追うのも辛い
ブロックの前にインデントを入れてるのはブロックも文なんだから単一文の時と同じようにインデントを入れるべきという理屈かな?
>>667 それ自体は一貫してるからいい、ただしこの場合は対応するifから平気で50行以上も離れているので、elseだけじゃスクロールバックしないと条件が何か分からん
エディタのfold機能を活用するのもアリだけど、プレーンテキストとして読めるべきという姿勢のようだから、まさに
>>660にある
#ifdef foo
...(長いコード)
#else /* not foo */
のようにelseにコメントを添えさえすれば、俺的にはオッケー
余談だけど
個人的にはプリプロセッサの条件も自由にインデントしてる
# ifdef foo
...
# ifdef bar
....
のように
殆ど見かけないから決して他人には勧めはしないけど
GNUのインデントは、Pythonを考慮すると利にかなってんだよな
if foo:
bar
if (foo)
{
bar;
}
という対応がある
Pythonはインデント自体にブロック要素があるから余計なカッコが要らないけど、Cはブロック要素にカッコが必要だから書いてあると考えれば、実はPythonと一緒なんだよ
これに気付いた時はrmsは天才なんだと思い知らされた
>>669 結果的に同じ形に落ち着いてるけど、pythonとは正反対の思想から生じている事もお忘れなきよう
尊師の第一言語はcでなく言語に構文要素自体が存在しないlispだから、改行のみからコードブロックとインデントレベルがフォーマッタを問わず一意に定められる
c系統(いわゆるブレース言語)は言語に構文を採用しつつ、フリーフォーム記述の許す折衷だから、フォーマッタとスタイルにバリエーションが生じる
翻って、エディタ入力支援/フォーマッタプログラム無しにlispを記述するのは事実上不可能に近いので賛美してるわけではないよ
念の為
))))))))くらいは序の口だし、括弧を数えてたら気が狂うわな
ネストレベルに応じて機械的に挿入されるインデントのみによって構造を把握するから、Lispは実質的にPython並にインデント強制
今となっては C だってエディタの支援なしに書く気にはならんけどな。
LISP は先にあるんだし、Python の文法は諸々の言語の影響結果だろ
ブロックの開閉で改行するってのは、ALGOL系のBEGIN~ENDの強い影響を感じる
Cではむしろ、少し自由な書式書法になっていたのが退化した
初心者のために、本来不要だけど括弧を付けるときはあった
>>679 俺は未来の自分のために言語仕様としては不要な括弧を付ける
若手に優しい配慮は必要だと思う
いらないと言うことに気がつけば
それはそいつの進歩だ
>>658 呼び出し前スペースはプリプロセスをm4で強化するときに少し面倒になるな
GNUはm4大好きなのにな
大昔、sendmail.cf を生成するのによく使われてな。久しぶりに名前を聞いた。
autoconf をがんがん使うプログラマがいればワンチャン。
sendmail.cf なつかしす
postfix に乗り換えちゃった
https://atcoder.jp/contests/abc273/submissions/35667282 このコードを実行するとscanfで入力を待つはずなのですが即座に終了してしまいます
たまにそういうコードを見かけるのですが何が原因なのでしょうか
printfを入れても実行されないのでmainがスキップしているような。。
>>699 典型的な scanf() あるあるだな
最初の scanf() で数字 + 改行が読み込まれるが"¥d"だと数字だけ取り出して改行が残っちゃう
2回目以降のscanf()は改行が残っているから入力をスキップしてしまう
scanf 改行 読み込み とかでぐぐると色々出てくる
https://hiroyukichishiro.com/scanf-problems-in-c-language/ 回避方法はいくつかあるけど、個人的には
static b[100];
fgets(b, sizeof b, stdin);
N = atoi(b);
...
fgets(b, sizeof b, stdin);
d[i].key = atoi(b);
みたいにするかな
>>700 釣りか?
普通のマージソートを読んでるだけで別に酷くなくね?
エラーハンドリングしてないってことなら競プロではそれが常識だぞ
何を見て酷いと言ってるのか説明してくれ
>>702 \dじゃなく%dのことかな?
そのコードの下にACが30個並んでるだろ?
これは用意された30通りのテストケースにおいて想定通りに動いたということなんだよね
つまりコードのせいではないよ
改行が問題になるのは%cのときくらいで
%dのあと%dだから空白類文字は問題ないよ
>>701 ちなみにこのコードを書いたのはオレンジコーダー
https://atcoder.jp/users/ygussany?contestType=algo オレンジというのは一部上場企業でも一人もいないことが珍しくないレベルの高レベルプログラマを超える化け物レベルの超高レベルプログラマを超える頭おかしいレベルのプログラマ
y[200001];とd[200001]がスタック壊してしまいます涙
>>707 Linuxではメモリの許す限りスタックが使えるから
>>708 とはいえmallocにしたほうがいいんでない?
>>712 C++ で見捨てられた VLA なんか使いたくないですね
>>712 VLAはC99で採用されたけどC11でオプション仕様に格下げされたよ
Cで通信系いじりたいんやけどなにからすればええ?
まずはゲームとか作ってC言語に慣れた方がええんやろか
「無線 C言語」と調べてもコロナ社の本しか出てこん
本買った方がええんか?
右も左もわからん、どなたか教えてください!!!
まず何がやりたいのかはっきりさせろ
何もわからんぞ
通信系って、無線通信?
C言語には電波を飛ばす機能はないよ
ネット通信とか無線通信はC言語だとどっかで耳にしたからとりあえずやりたくなったんや
なんかいい通信系の入門サイトとかあれば教えてほしい
>>718 無線通信系に興味ある
電波飛ばす機械をC言語でなんかするんじゃないん?
通信をする方法が無線かどうかはハードウェアの問題。
更にOSやデバイスドライバやOSのシステムコールをどのように呼べば良いかを知る必要がある。
C言語の知識が必要になるとすると通常はここからだ。
そうではなくてハードウェアはあるがOSがなくI/Oポートを直接読み書きするようなプログラムを
作る必要がある場合はアセンブラかC言語で作ることになると思う(必ずしもそうである必要は
ないが)。その場合はOSのデバイスドライバを自作するような感じになる。
有線にしろ無線にしろ、通信という以上は相手があって
その相手とルールの取り決めをしてからそのルールにしたがってやり取りする
だから最初に、誰と、どういう取り決めでデータのやり取りをするかを決めないといけない
インターネットもそういうルールをみんなで決めてやり取りをしている
とりあえずインターネットの通信を学んでみたらどうだろう
この掲示板に書き込みをしているのだから、その通信が可能だし、
その機種を使って試すところから始めると良い
>>712 スタックの仕様は機種依存が激しいから可搬性を考えたらスタックは無限にあると考えないほうがいい
というかLinuxではデフォルト8MBみたいだけど
というかスタックというのは一番効率の悪いメモリの使い方なので
本を片っ端から積み上げて下の方は取れなくなってしまうイメージ
大規模な配列はスタックに置かないほうがいいというのは基本では
断片化があるとはいえmallocのほうが効率的
スタックが上のデータに埋もれて下のデータが取り出しにくくなるなら、ヒープでも全く同じことが発生するはず。
適当なアナロジーで間違った理解をしている典型例だと思う。
デカいデータで最適化が効くことがあるのはグローバル変数
Cのローカル変数は、マシン語レベルではスタック領域に生成されるが
相対アドレシングで自由にアクセスするので問題ない
領域の確保開放が上からしか出来ないだけで読み書きはどこでもできるもんな
>>723 え、無限にあると考えることがあるの?
・・・あれか、マイクソソフトが吹聴してる例の有害なやつか
有限さん「おい、スタックが無限にあると考えられるとはどういうことだ?証明して見せろ!!」
ムゲンさん「わかりました。では無限なメモリを積んだコンピュータを用意してきてください。そしたら証明して見せます。」
有限さん「そんなことできるわけないだろ!」
ムゲンさん「ザンネン。じゃああなたのご希望に沿うことはできないですね。」
ボク「それってつまり、無限のスタックは存在しないってことなんじゃ?」
ムゲンさん「『無限なメモリを積んだコンピュータは存在しない』というのは悪魔の証明であって、存在しないと断言すること自体が不可能です。」
ボク「屏風の虎…一休さんかよ」
観測可能な宇宙に原子が8e79個あり、
DDR4のセル電荷が2.4e-14クーロンとすると
メモリは6.7e73バイトまでしか作れない
∴ 無限のメモリは存在しない
観測不可能な宇宙領域がまだあるではないか
そこには無限の(ry
>>725 速度の問題ではなく
用済みになっても開放できずにいつまでも抱え込んでいなければならないことが問題
スタック上の変数って、その関数内でしか用は無いのだから
関数が終了と同時二メモリーから消え去ります
抱え込むことはありません
効率悪い実装してれば効率悪くなるだけの話やな
スタックは一時変数の効率的確保の極みなんだけど関数化を怠った結果そうなる
児童変数を関数の戻り値にするのは実体渡しだけにしておかないと痛い目に逢ったなぁ
>用済みになっても
と言うことだから、関数間の受け渡しは考慮しなくて良いでしょう
自動変数用のスタックは本物のスタックポインタ無視して別に作っちゃってもできるな。
そういうコードを吐くコンパイラも作れるというだけのことではるが。
でもその方がリターンアドレスが詰まれている所に変数混ぜるより安全な感じはする。
特にC言語の場合は配列の範囲をオーバーしても平気でどんどん書き換えちゃって関数の終わりで明後日の方向にリターンなんてものも作れちゃうから。
8ビット時代にゃスタックジャンプは普通にやってたなぁ
>>742 > 自動変数用のスタックは本物のスタックポインタ無視して別に作っちゃってもできるな。
当たり前だろ、その本物とやらのスタックポインタもたないマシン(例えば汎用機)もあるんだし
> でもその方がリターンアドレスが詰まれている所に変数混ぜるより安全な感じはする。
暴走するか変なデータになるかの違いしかない
どっちがマシかは状況による
いや暴走のがマシなんて状況あるん?
変なデータは使用する時点でチェックすれば防げるけど
>>747 > いや暴走のがマシなんて状況あるん?
今時のプロセッサーなら暴走したら不当命令とか
>>745のリンク先にあるデータ実行防止で止まる可能性が高い
> 変なデータは使用する時点でチェックすれば防げるけど
それが完全なら良いけど例えば金額が多少間違っててもチェックできないケースもあるだろ
>>737 抱えたまま他の関数を呼び出したり
あと再帰呼び出しとかスタックを利用する一番の利点とされてるけど?
問題なのは呼び出された関数がすでにスタックが残り少ないのを知る手段がなく
そこでクラッシュしても原因がわかりにくいという開発上のトラップだな
まあ大規模なソフト開発してみればわかるよ
それはメモリー不足が何時起きるか分からないと言ってるのと同じ事ですが
スタックオーバーフローという
エラーメッセージがあるのでは?
スタックオーバーフローという
エラーメッセージがあるのでは?
スタックオーバーフローという
エラーメッセージがあるのでは?
スタックオーバーフローという
エラーメッセージがあるのでは?
スタックオーバーフローは、大規模なソフト開発とはあまり関係ないデスね
大規模なソフト開発してて、スタックオーバーフローでプログラム落ちたら、
笑われると言うか、怒られるかも
スタック上に大領域確保するにしても
内部で余計な関数呼ばない結果だけ返す関数作って抱え込まない
深さを限定できない再帰呼び出しもありえないし
699 デフォルトの名無しさん (ワッチョイ 972d-zuBb) sage 2022/12/01(木) 15:02:39.09 ID:ZPuEPm3M0
https://atcoder.jp/contests/abc273/submissions/35667282 このコードを実行するとscanfで入力を待つはずなのですが即座に終了してしまいます
たまにそういうコードを見かけるのですが何が原因なのでしょうか
printfを入れても実行されないのでmainがスキップしているような。。
Win98時代は1Mバイト程度の配列変数作っただけで動作がおかしくなってたな。
スタック増やせって言われてコンパイルオプション弄ったけど改善しなかった記憶・・・。
DOSからWinに来たときは64kバイト以上のメモリ確保さえ避けてた。
そりゃー8086のセグメント方式なんだから64k超えは問題ありまくりんぐでそ
>>761 > Win98時代は1Mバイト程度の配列変数作っただけで動作がおかしくなってたな。
それは今でも一緒だろ
Windows の既定のスタックサイズは1MBのままだぞ
https://learn.microsoft.com/ja-jp/windows/win32/procthread/thread-stack-size MS-DOSの頃は、メモリ1MB積んだPCってスゴイ豪華な印象だったな
搭載メモリーを使い切る様なプログラムを、オレは書けるんかって思ってた
本当のメインメモリとして使えたのは640kBまでで
残りの384kBはバンクかEMSの増設メモリだった
最初はハードウェアで実装してたけれど
そのうち仮想86モードだったかで、
特別なハードを追加せずにメモリアクセス出来る様になってたね
>>766 残りはハードウェアのIOやらROMやらVRAMなどだ
EMSウインドウはその開いている隙間アドレスにねじ込んだだけ
>>767 あったねー、ソフトウエアEMS>ハードウエアEMSなんて珍現象
#include <stdio.h>
#include <time.h>
void
main(void)
{
time_t now, now2;
now = time(NULL);
now2 = time(NULL);
struct tm *tm1 = localtime(&now);
struct tm *tm2 = localtime(&now2);
tm2->tm_mday = 1;
tm2->tm_mon = 1;
printf("%d %d\n", tm1->tm_mday, tm1->tm_mon);
printf("%d %d\n", tm2->tm_mday, tm2->tm_mon);
}
tm2を変更するとtm1も同じ値になってしまいます。
回避方法を教えて下さい。
OS:Linux Mint
コンパイラ:gcc です
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/ctime.3.html localtime_r()を使いましょう
struct tm *tm1 = localtime(&now);
こんな使い方をするって時点でlocaltime()が「何」を返すのか、察しましょう
このへん、言っちゃなんだけどクソだね
なんでこんな変な設計にしたんだろう
ローカルで構造体を定義してそこへのポインタを返すとスタックから消えてデータが壊れますか?
>>775 いちいち使う人に領域確保させる手間をかけさせたくなかったってことでしょ
マルチスレッドなんてない時代だし
>>776 構造体に限らずローカル変数へのポインタを返すとポインタの指す先の内容は壊れる(かもしれない)
何らかの要因でテンパって煮詰まってコーディングしてて
変なものができてしまうこと、皆さんも経験あるのでは
>>776 スタックから消えるというか、言語仕様的な用語でいうと生存期間が終了していることになる。
そんでオブジェクトを生存期間の外部で参照したときの動作は未定義なので何が起こるかわからん。
C でいう未定義ってのは「何が起きてもいい」なのでデータが壊れる (意味不明の値が読みだされる) だけでは済まないかもしれない。
>>776 すぐ消えないことがあるので読めてしまうかも知れない。しかし何かをすると一瞬にして破壊されて終わるかも知れない。
あてにしてはいけない。
ていうかこの頃のコンパイラってそういうのは警告出したりエラー扱いにしない?
warning C4172: ローカル変数またはテンポラリのアドレスを返します: hoge
VS2022
そういうときはレジスタ変数のアドレスを返すようにコーディングしなさい
int *fuga(void){
register int i = 123;
return &i;
}
error C2103: '&' レジスタ変数のアドレスを得ようとしました。
ふむ
>>788 説明とコードが対応してる気がしない
どういうこと?
>>348 レジスタに割り当てた変数には左辺値はないよ
だって、ハードウェアのレジスタだから
言いたいことはわかるけど日本語が変
左辺値はメモリアクセスを意味する式なので
レジスタに左辺値がないのではなく
記憶クラスがregisterの変数の識別子は左辺値ではない
>>793 floatからdoubleへ変換したうえでその参照を返してる
パッと見分かり辛くて人間の認知への挑戦かと思うなw
>>792 register 指定が付いたらアドレスを取る操作自体が出来なくなるように制限されてるよ。
配列を register 付きで宣言したらなにも出来なさ過ぎてワロタwwwというのはよくあるネタ。
(言語仕様的には配列 (の要素) へのアクセスもポインタ演算の構文等になってるから暗黙にアドレスを取る操作。)
>>794-795 左辺値であるかどうかと記憶クラスは関係ない。
必ずしもメモリにアクセスすることを意味しない。
register 宣言でアドレスを取れなくなるのは左辺値でなくなるからではなく
& のオペランドは register 付きで宣言されたものであってはならないという直接的な制約。
どこをどう見ても左辺値の定義自体には register 指定は関係しない。
更に C99 の 6.5.3.2 から単項 & の制約について抜粋
> The operand of the unary & operator shall be either a function designator, the result of a
> [] or unary * operator, or an lvalue that designates an object that is not a bit-field and is
> not declared with the register storage-class specifier.
JIS の日本語だとこうなってる。
> 単項&演算子のオペランドは,関数指示子,[]演算子若しくは単項*演算子の結果,又は左辺値でな
> ければならない。左辺値の場合,ビットフィールドでもなく,register記憶域クラス指定子付きで宣言
> されてもいないオブジェクトを指し示さなければならない。
左辺値のときは register 指定されていてはいけないというのは逆に言えば register 指定されている左辺値というものも存在することを示唆する。
> register 指定されている左辺値というものも存在することを示唆する。
具体例ある?
>>799 具体例というか、 register 指定は左辺値か右辺値かの定義に無関係なので
左辺値なものは register 指定されていようがいまいが左辺値って話。
変数の宣言のときに register 指定を付けたら全て register 指定のついた左辺値だよ。
メモリにアクセスすることを意味するでしょ。
6.3.2.1 左辺値
左辺値が評価されたときにオブジェクトを指し示していなければ,動作は未定義とする。
3.14 オブジェクト(object) その内容によって,値を表現することができる実行環境中の記憶域の部分。
参考オブジェクトを参照する場合,オブジェクトは,特定の型をもっていると解釈してもよい(6.3.2.1 参照)。
なんでそういう決まりになっているのかを理解せずに条文の字面に書いてあることだけ表面的に言う人とは歯車が噛み合わないな。
>>792みたいなのはレジスタ変数じゃなくてもやっちゃダメだけどw
昔の CPU はレジスタが少なくて
なんでもかんでも register 付けて宣言すると
CPU の持ってる実 register 数以上に宣言してしまうことが多い
では使い切った後の変数はどこに割り当てられるのか?
>>801 話を
>>794 といっしょくたにしたのが誤りだった。 すまぬ。
> ハードウェアのレジスタだから
の続きで
> メモリアクセスを意味する式なので
をハードウェア的なメモリアクセスの意味で解釈してしまった。
むしろそんなん関係なく言語仕様上の意味で反論してたんだね。
(後から読む人のために補足すると C の言語仕様でいう実行環境は言語仕様で規定する仮想的な実行環境の
ことであって実際の機械語とどう対応づけるか規定されない。 どういう機械語が生成されるかは
言語の意味の根拠にならないので言語仕様で再解釈しようとしたのが
>>795 だと私は解釈した。)
が、言語仕様の解釈として
> registerの変数の識別子は左辺値ではない
の部分が誤っているということには変わりないよ。
レジスターにもアドレスを割り当てておいたら良かったかも
昔6800系CPUはメモリの固定番地をレジスターと同格に扱うダイレクトメモリアドレッシングで見かけのレジスタ数を増やしていた
レジスタを指すポインタをインクリメントすると、別のレジスタの値を書き換えられる、とか
組込み用の8ビットCPUでも同じような機能があるものもある
ダイレクトアドレッシング、ダイレクトページアドレッシングなど殆どは8ビットアドレスのゼロページ目をレジスタと見做して
メモリ経由することなく直接ALUで演算を行なうことが出来る
レジスター配列とかプログラムコードをレジスタに置くとか
>>804 左辺値がメモリアクセスを意味するのに?
>>810 言語仕様では抽象計算機での動作として記述される。 (C99 なら 5.1.2.3?を参照)
記憶域として書かれているものは抽象的な意味の上での記憶域であって、
実際のメモリにアクセスするかどうかはコンパイラの裁量。
register 指定は変数の意味に関与せず、抽象機械の動作の上ではごく普通に記憶域に割り当てられているのと同じ。
その上で register 指定は「可能な限り速いアクセスを期待する」というヒントであることと、アドレスが取れなくなるという制約が付く。
register 指定は抽象機械の上での記憶域をハードウェアのレジスタに割り当てるなどして高速化してくれたらうれしいなぁ (/ω・\)チラッ
という指定であって、言語の理屈の上ではアドレスを取れない以外の何の意味も持たない。
抽象計算機の記憶域がメモリではないって?
もういい、あんたとは話にならん
>>812 根本的には register 指定で左辺値でなくなったりはしないという話をしてるんで。
その話の根拠に疑問を示したんだけど、例の屁理屈に逃げるんでもういい
>>814 言語仕様でそうなっているという以外に根拠が必要か?
>>805 そういうプロセッサーはあるよ(ディスコンしてるけど)
Z80 の裏レジスタは裏側のレジスタを直接触れなくてモヤモヤしたけどこいつは他のバンクのレジスタも直接さわれるからちょっと便利
PCとかもメモリー空間に見えてるプロセッサーもあったような気がするけど具体的なプロセッサー名を思い出せない
>>806 それはちょっと話が違う
単にアドレッシングモードとしてゼロページやダイレクトページが短いコードで扱えると言うだけのことでメモリーはあくまでもメモリー
例えば6800はPSH AでAレジスタをスタックにプッシュ出来るけどゼロページの内容を直接プッシュ出来るわけじゃない
6502 のインダイレクト・インデックストYぐらいの機能ならまあベースレジスタをメモリー上に置けるとは言えるけど
>>817 しつこいのは君かと
そもそも左辺値なんて言語仕様で定義されてるんだから仕様書で反論できない時点でお前の負け
>>819 べつに勝ち負けを競っているわけじゃない。
根拠 (この場合は言語仕様) に基づく解釈の妥当性がそれで変わることはないので納得しない誰かがいても不都合もない。
5ch に書き込むのはただの暇つぶしだ。
どうせほかに話題もないんだからしつこくてもいいんじゃね。
反応するかどうかは知らんけど。
ポインタは卒業した。コンパイラあるんだから、ググるより書いて結果を見たほうが早いぞ。
何十回も繰り返せばわかるはず。
亀レスだが機械語を知らないと、いい高級言語は書けない、ってのはわからん。
機械語と高級言語は別物だろう。
機械語を簡単に理解できる知能水準の人は、高級言語を新しく学習したときも
たやすく理解できる、
というのが実態なのに、ネットでは背びれ尾ひれついて、「ハードウェアを知らないと、〜」みたいな
論調が市民権を得ているな。
CやC++はアセンブラレベルが理解出来ないとそもそも実装が無茶苦茶だったりするけど
ポインタとかが無いJavaとかはそこまでアセンブラレベルでどうのこうのってのは無いが
それでもコンピュータ的な知識が皆無な奴は論理演算を理解出来なかったりするし
ビットシフトみたいなことやってると、何でこんな書き方しているの?みたいな事言う奴出てくるからなぁw
それがメモリー上二銅格納されてるか位は知っておいた方が良いよ
配列データをソートする時、どうやると効率的かがすぐ分かる
2の補数表現の知識は機械語の範疇だろう
スタックもそうだ
Cの仕様にスタックなんて言葉は出てこないからな
register指定も完全に機械語だ
タイマとか割り込みを扱う場合は機械語の知識も必要だな
setjmp longjmpも何が保存されてるのか理解するには機械語の知識が必要だ
要するに機械語の知識は必要だ
>>825 ポインタ演算は未定義動作を簡単に引き起こせてしまうので
十分に理解できてない状態で実際に動作させてみるというのはあまりあてにならない。
ある程度は理解した上で実際にやってみたら納得しやすいってことならわかるけど。
何十年前の話題を蒸し返してるのか知らんけど今のコンパイラは賢いからregisterとか使う必要ないぞ
むしろ人間が余計な指示を出すことで効率が悪くなる可能性すらあるからハードウェアの知識が云々とかいう老害理論はパイプラインとかキャッシュとかを全て把握してから言ってくれ
君たちの時代は終わったんだよ
register なんてあてにならんもん、使ってる奴いなかったと思うよ
本当に速くしたい所は、それこそインラインアセンブラ使ったり
アセンブルしたルーチン呼んでたし
>>833 コンパイラが本当に愚直な時は最適化無しで使ってたぞ
少なくとも gcc とか clang くらいのモダンな処理系ではコンパイラの判断のほうが賢いわな。
低レイヤのコードだと人手で指定を付けたいときもあるかもしれんが
そういう分野ではどうせ処理系の拡張がなきゃどうにもならんので
register キーワード程度のあやふやなものひとつを言語仕様に入れてもあまり役に立たない。
C++ では register は削除された (機能は削除されたがキーワードとしては予約語のまま) わけだし、
C でもその内に削除されるんじゃないかな。
register なんて要らんとか昔からずーっと言われてるけど
つけたらつけたで速くなったのその目で見たやつも居るでしょ?
gcc と gprof だけで頑張ってたとき確かに速くなったけど
だから register は有効有用使うべきとは言わないけどね
>>830 >setjmp longjmpも何が保存されてるのか理解するには機械語の知識が必要だ
基本スタックポインタとプログラムカウンタだけだと思っていましたが、まあレジスタ全部と他何を保存してましたっけ?
>>836 >C++ では register は削除された (機能は削除されたがキーワードとしては予約語のまま)
auto のように別の形で復活しそうですね
あと、asm はどうなりましたか?
>>838 基本レジスタ全部だな(OSが使うレジスタは含まず)
他は無いはずだけど
ただ、戻り値にレジスタを使ってる場合は、そのレジスタは書き換えられてるだろう
メジャーどころのCPUは大抵、戻り値はレジスタだね
static記憶クラス指定子の理解はできますが、いざプログラムを組んでみると、使い方がわかりません。
意訳
メジャーどころのCPU(に対応したCコンパイラ)は大抵、戻り値はレジスタだね
ではないかと
VCだとコンパイルオプションで変化した記憶がある
>>844 呼び出し規約 (を含む ABI) の策定はアーキテクチャを設計したところが主導するもんじゃないのかな。
CPU の特性に反した使い方を基本にされても困るだろうし。
ざっと調べた感じだとよく使われている System V ABI はインテルが議長の委員会で決める体制っぽい。
マイクロソフト (Windows) は引数の渡し方がちょっと違う規約でやってて
文句も出てない (出てないよね?) からそんなに強い強制力があるわけでもないんだろうけど、
CPU ごとに常識的な使い方というものはあるだろう。
>>847 マイクロソフトが作ってるハードはSurfaceとかだろ?
DOS時代にグラフィックライブラリとかをMASMでアセンブルして出来たobjファイルを
Cコンパイラで作ったobjとをリンクさせて
Cからアセンブラのルーチン呼び出したりしてたけど、
COBOLやFORTRANで作った関数をリンクさせて
Cで呼び出したりも出来るの?
FORTRANなら呼べると思うが、COBOLは分からない
FORTRANやCOBOLからならCの関数は呼べたと思う
objファイルは流石に無理があるけどDLLや静的ライブラリでも作れば良いだけでは?
gfortranならexe以外にもDLL等が作成出来る
引数の積みかたやらスタックフレームの巻き戻しはどっちがやるか等の約束事が
シンプルに固定されてるDLLなら他所言語への持ち出しや持ち入れがやりやすいわね
>>828 まあ・・C言語を触るぐらいだから、一般的には大学とかのコンピュータサイエンス教科を
履修しているのが前提だろうから、そこはあえて省略したのですが・・
昔の高校生は頭がよかったけど。
今は「仕事でC言語を触らせてくれる身分」になるためには基本、情報系の大卒でしょうし・・
>>828 配列のソートってメモリ意識しますかね。フラグメンテーションとか考えたこともないな・・。
単純に演算オーダー(log O^n とか・・)そんな感じである程度予測を立てて、あとは扱うデータ次第かと。
アルゴリズムのレベルではある程度の効率は事前に考えるけど
断片化とかキャッシュヒットとかはチューニングが必要な状況になるまで考えないな。
むしろ考慮したくなっても意識的に忘れるようにする。
いわゆる「早すぎる最適化」の一種だから。
当然ながら必要になったときには知っている必要はあるんだけどそんな機会は多くないよね。
普通の (アルゴリズムのレベルでは充分に配慮された) プログラムを書いて極端に効率が悪いようなら
メモリアロケータやキャッシュの設計のほうが悪い。
(そうは言っても目の前にあるものがそうなってるなら自分のほうが合わさないとしょうがないんだろうけどさ……)
>>847 win32api はなぜ PASCAL にしたんでしょうかね?
>>847 AMD64 は AMD が呼び出し規約まで決めちゃったけれども、普通は OS 屋が決めるものという気がしますけどね
>>839 register というキーワードが将来に転用 (repurposing) 出来るようにというのは書かれている。
https://timsong-cpp.github.io/cppwp/n4659/diff.cpp14.dcl.dcl auto という名前が新しい用途にぴったり (少なくとも不自然ではない) なので
それと同じくらいに register という名前が丁度良い場面というのは全く想像がつかないんだけど
思いもよらぬ形で上手いこと使われることはあるかもしれんね。
メンバ関数の宣言のときの default とか delete とかも考えたやつは天才じゃん……と私は思ったよ。
switch文のdefaultはたまに綴りを間違えてしまうw
>>861 あれの問題点は綴りを間違えてもラベルという扱いになってしまってエラーとして検出されないところなんよね。
処理系やオプションによっては使われていないラベルとして警告が出たりはするんだけど。
転用とかややこしいだけだから勘弁
自動でautoだからあんまり気にすんなよ、ちなc++ではこんな意味だよと、またややこしい補足が増えるだけ
むしろアンスコ付きの変な名前の方がかえってキーワードなんだなと分かりやすい、ソースは醜くなるけど、それは今更
auto も B言語の名残りだか後方互換だかで、
Bではデータ型がなくて、変数=整数が文脈により、ポインタとしても使われた
その storage classesとして、automatic, external, internal の3種類があった
main() {
extrn putchar, n, v;
auto i, c, col, a;
(略)
putchar('*n*n');
}
v[2000];
n 2000;
という風に auto で変数を宣言していた
他に触る言語で明示的にauto宣言するのはbcかな、オモチャみたいなもんでPOSIXも有名無実で仕様なんぞ無いに等しいが
ポインタは明示的に触らないけど、エミュる時は配列の添字にauto変数(整数)突っ込むからむしろCよりBっぽい
可変長で必要に応じて伸び縮みする配列とか、
桁数制限無しの整数型や計算誤差のない実数型とか
誰か作って(人任せ)
計算誤差の無い実数型って不可能だけどなw
decimalを使うと2進数は10進数の浮動小数点数を正確に表現出来ない問題を解消できる
ratio(分数)を使うと、1/3とかをそのまま保持出来るから誤差が出ない
ちなみに、Common Lispは分数を凄い簡単に扱えるしbignumも使える
Cでもそうなって欲しいもんだ
なぜ分数や多倍長整数が必要な案件にCなんかを使うのか
虚数や複素数も扱えてたよね
あまり使い道はないかも知れないが
区間を分割して評価、終了判定がintegerpで判定とか細かい所で色々楽はできるだろう
単にスケールしても済むし、何回もやるなら任意精度でない有理型くらい構造体とgcdさえ書ければ誰でも書けるだろ
用途が違うし別にclは推さんが、標準の一つであるcltl2はあらゆるプログラマに貴重な書
浮動小数点演算に関しても複素関数の豊富なプロット載せて定義やブランチカット選びの良し悪しにかなりページ割いて、その図の生成に使ったpsコード生成コードも載ってる
つーか
>>866はbcって言って欲しいだけでしょ、おまえら釣られすぎ
<cmath.h>徹底解剖みたいな文献って無いんだろうか
complex.hだった
最近触り始めたpythonでcmathだから素で間違えた
んでc++はmath.hが<cmath>と…
math.h と cmath とは事情がややこしいので単に名前が変わっただけとは思わないほうがいい。
math.h の関数は多相化されてなくてマクロで多相化された版は tgmath.h にある。
cmath の多相化にはテンプレートが使われている。
Cのtgmathの方が(実装的な意味で)エグいよね
よくマクロの真髄みたいに色んな実装が紹介されるし、ちゃんと動いてるんだろうけど
ちょっと訳がわからないものは避けたい…
_Genericでスッキリ書けたりしないのだろうか
ヘッダに直書きされてるから目につく機会が多いだけで、内部的にやっても同じロジックが隠れるだけか
気にし出せばきりがないようにも思う
>>877 _Generic で素直に分岐すれば問題なくかけるよ。
tgmath.h が規格に入ったとき (C99) は規格の範囲内でやる方法は無かったので
処理系の拡張を使ったり新たな拡張を作ったりしてなんとかなったのだがやっぱりそれは
あかんやろと思ったのか C11 で _Generic を入れることになった。
ただ、処理系は C99 に厳密なモードを持つことがあるからそのモードで動かしたときに
ヘッダ内の _Generic についていちいち警告なりエラーなりが出るのもよろしくないし、
#ifdef で分けるのも二度手間だし、
旧来通りの実装で残すのはそれなりに合理的なんだと思う。
ありがたいことに普通に使う分には標準ヘッダの実体を気にする必要はないのだから忘れておくのが幸せだろう。
// エラーを報告するための関数
// printfと同じ引数を取る
void error(char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
fprintf(stderr, "\n");
exit(1);
}
これってprintfをerrorに変えただけって認識でok
これってprintfをerrorに変えただけって認識でok?
error("引数の個数が正しくありません");と
fprintf(stderr, "引数の個数が正しくありません\n");
の違いを誰か教えてくれ
>>881-883 その認識でいいけどそれに加えて最後に exit で終わっているから
復旧不可能なエラーを報告するための関数なんだろ。
そのerrorならexit以外そうじゃね
perror(msg)はもう少し賢くて
fprintf(stderror, "%s: %s\n", msg, strerror(errno))
相当(by k&r2e)
>>884 こんな時間にありがとう、助かる。
fprintf(stderr, "引数の個数が正しくありません\n");と同じってことやな
これにexitを加えて関数にしたのがerrorってことやね
わざわざerror関数にする必要性がわからんかったから助かったわ
私なら、error()を呼び出した側でexit()呼ぶなあ
ステータス選べるしな
わざわざexitに渡すステータス引数を拵えるくらいならexit読んだ方が早い
>>881 あ、地味にfprintf(stderr, "\n")でフラッシュしてるのに気付いた
あるいはfmtへの\n付け忘れ防止配慮か
基本stderrはこまめにフラッシュされるものと思ってるけど、fflushや"\n"で念を入れても損は無いな
言語仕様では exit で終了とか main の終端に到達した場合に全てのオープンされているファイルはクローズする
(そのときに全ての出力ストリームをフラッシュする) というのは保証してる。
エラーが起きている状況でどこまで信用できるかよくわからんから念押ししても損はないだろうけど。
http://codepad.org/noY0x7K2 これの70行目と79行目の*ってただただ関数でポインタを扱うよってだけ?
なんか関数ポインタと似ててどうなんやって思った
int (*func1)(char*, int);
なんか質問者はexit呼ばないんだったら関数化しないでええやろって思ってそうで怖いな
設計方針次第でもあるが心配になるな
>>893 今学習段階だからかなりの無知なんや、すまん
あと上のURLのプログラムのcallocではメモリ解放してないけど大丈夫なのか?
>>892 返却値の型が Token* であるという意味。
でも文法的には * は宣言子に含まれていて Token の側じゃなく関数名がある側のグループなんよ。
だから右側に寄せて書く習慣になってる。
C の宣言の文法が無茶苦茶なのはイマサラな話なので……。
可変長引数の扱いも低レイヤの事情が見え隠れするような古の設計なので
歴史的事情を知らんとわけわからんのもしょうがないとは思う。
一貫性が大事って意味ならそう思う、特にdiagnosticなエラー(最後まで残る)は
俺は手入力で適当なエラーメッセージ書くのは極力控えてる、例えば数学関数書いてるなら
errno = EDOM;
perror(__func__);
→my_func: Argument to the math function out of domain.
的な
手続き的なルーチン(main)なら__FILE__/__LINE__とかで
用意されてるシンボル定数で意味論が合うなら活用すべき
EDOMなんかは好きに使っていいけど、システム、IO関連のエラーは意味が直感的でなかったり、規約に厳密に従わないとerrno見るcallerが騙されたりでバグの素なので、ちゃんとマニュアル参照のこと
>>896 こりゃかなわん。
基礎から出直してくる
ああ、当たり前だけどerrnoを上書きする前に気付いてないフラグ立ってないかif(!errno)チェックは忘れずに
割と立ってる事がある()
>>895 勿論使い終わったら解放する必要があるので解放関数を用意してあげよう
>>895 exit() したら解放されるからいいんじゃん
って言う層が一定数いる
再起動なんてちまちましたことやってられるかい
電源ぶっこ抜いて入れ直すんだよ、それか蹴れば直る
アプリ(強制)終了後に使ったファイル削除→このファイルは使用中です。
OSで保証されてないならアプリ側でやるしか無いじゃん。
プロセス終了に関しちゃ今時のOSでハンドル握りっぱなしにはならんでしょ
/* 文字列を逆順にして返す関数 */
#include <stdio.h>
#include <string.h>
void reverse(char *ss);
int main(void)
{
char tt[]= "programing game";
reverse(tt);
printf("tt=%s\n",tt);
return 0;
}
void reverse(char *ss)
{
int wk,pos1=0,pos2;
pos2=strlen(ss)-1;
while (pos1<pos2) {
wk=*(ss+pos1)
*(ss+pos1)=*(ss+pos2);
*(ss+pos2)=wk;
++pos1;
--pos2;
}
}
このプログラム、gccだとコンパイル出来ますが、clangだと以下のエラーになります。なぜでしょうか?
~/CCR/UserFiles/sample26.c:22:3: error:
invalid operands to binary
expression ('int' and 'char *')
*(ss+pos1)=*(ss+pos2);
^~~~~~~~~~
1 error generated
>>909 wk=*(ss+pos1) の後にセミコロンが抜けてる。
事例としては面白いよ。
セミコロンが抜けても一応は式の形式として成立するから
型が合わないというところがエラーとして報告されちゃうんだな。
ナウいヤングな文字列の掛け算はサポート外なんだわ
strcatで頑張れ
exit on free 論争か・・・ そういう論争があったというのは知っているが
どっちに帰着したのか知らない
プロセス終了を検知してOSで良きに測って欲しいよね
>>917 膨大なリストなんかはいちいち解放しないで exit( ) でヒープごと解放する方が効率的なんて言う奴までいたんだよ...
いっそプログラム開始時に、
ドーンとでっかくメモリ確保して
自前でチマチマ割り当てて、
終了時にドーンと解放で良い気もする
そういう戦略をとっている有名なプログラムもある。
確保したメモリが結局はプログラムの最後までほとんど使用されっぱなしだということがわかっているなら
ちまちま管理しなくても終了と同時に全部が回収されることをあてにしても総合的なメモリ使用量は変わらない
(むしろ free のコスト分だけ節約できる) という考えをすることはあって、
リンカの LLD や Mold がそういう戦略をとっていたはず。
http サーバの h2o はセッション単位でドカンとメモリの確保と解放をしてる。
つってもプログラム全体のメモリについて見通しが立てられるということと
実行環境の事情を把握してるからそういう戦略を取れるのであって、
普通は小さなモジュールに分割するし、モジュール単位でメモリ管理に矛盾がないように設計するので
結果的にチマチマした確保と解放になる。
そこそこの規模になるとプログラムを分割せずに把握するのは大変なので凡人は小さな単位で
確保と解放をするように設計するのはしょうがないよ。
>>921 > 結果的にチマチマした確保と解放になる。
解放が必要なものまで
>>920みたいなことしちゃダメだろ
リンカーのシンボル表みたいなのは処理中は追加オンリーで処理終了後に解放することになるから一気に解放が有効なわけで
DOS時代の拡張子COMアプリは起動時に空いてるコンベンショナルメモリ全部(PC98ならVRAMの前まで)COMアプリに割り当てられるんだっけ。
やればできるよ
EXEとの違いはリロケーションテーブルがないってだけ
コード次第で出来んことは無いィィィ
>>923 考え方は近いがもっと特化した手法
なのでシンボル表みたいなものにしか適用できない
空いてるコンベンショナルメモリ全部というと大きなメモリが割り当てられるように聞こえるけどコンベンショナルメモリは640キロバイトしかないからな
逆に小細工しないと拡張メモリ(exeで使える大きなメモリ)が使えないと言った方が正しい
リアルモードの「拡張メモリ」ならCOMでもEXEでも同じことだぞ
プロテクトモード用の「EXE」はまた別物だ
バイモーダルEXEなんてのもあったね
ラージモデルのexe、拡張子をcomに書き換えても動くのは秘密です。
exeとcomってファイル先頭のエントリーアドレスの解釈が違ってなかったっけ?
拡張子だけ変更しても暴走したような気がする
>>924 自力でシステムコール(あるいは farmalloc()) と far ポインタを扱うんだったら出来る
OSは、EXEかCOMかの判定をファイル先頭2バイトで行うので
拡張子は同名実行ファイルの優先度以外には影響ありません
>>925 LSI-C試食版のコード64KB の制限はなんとかなりませんかね?
試食版のコードで生成する実行プログラムを、動かす環境もってるの?
W32が動く環境があるなら、そこでネイティブに使えるコンパイラにした方が良くないかな?
試食版って事はそれを業務で使うわけではないんでしょ?
8086 の SBC とか使って趣味でなんか作ってるんじゃね
俺も会社でだけど 80186 ボードのために Visual C++ 1.52c をずっと持ってた
C使用でも何も考えずにVC++無料版入れてるわ。
バージョンアップの度にプロジェクト作成項目に悩む・・・。
関数のポインタの配列を返す関数の宣言を教えてくさい
>>935 試食って書いてあるの見えない?
そういう類いには意図的に制限かけてあるんだよ
有料の正規バージョンを買ってねって意味
PS3のlinux封じとは訳が違う
怒る人のいないやり方なので
脱獄は誰も手伝ってくれないよ
>>942 返す関数は定義出来るだろ
確保した領域の生存が関数内のみかそうじゃないかで結果は変わるが
>>941 思ってるものを描いてみ?
まあ関数イテレータ的には使えるのか
int getNoTest1(int x, int y, int z){return x*100+y*10+z;}
int getNoTest2(int x, int y, int z){return x*200-y*20-z;}
int getNoTest3(int x, int y, int z){return x*1000-y*100+z;}
typedef int(*FuncType)(int, int, int);
FuncType *getFuncAddrArray(void){
static FuncType fa[3];
fa[0] = getNoTest1;
fa[1] = getNoTest2;
fa[2] = getNoTest3;
return fa;
}
int main(int argc, char *argv[]){
FuncType *funcAddr = getFuncAddrArray();
for (int i = 0; i < 3; ++i){
printf("%d\n", funcAddr[i](rand(), rand(), rand()));
}
return 0;
}
>>945 できねーよ
配列が第一級オブジェクトじゃない珍しい言語
void(*func(void)[2])(void);
できるとしたら、こうなるが
固定長配列を戻すなら struct を経由したくなるわ
const char *f() {return "関数のポインタの配列";}
https://ideone.com/DiokCM strust ひっぺがして 戻り値が配列となる宣言だとおこられた
FUNC_PTR_T getFuncs(void)[3];
>>949 てか struct で包めば配列も返せるよね
>>944 近藤嘉雪 パーサ担当
森 公一郎 コードジェネレーター担当
近藤さんの本は20年くらい前本屋でよく見かけたな
配列も値型だったら一貫性が有っただろうな
でも、配列を丸ごとコピーするなんて普通しないから、利便性を優先したんだろう
それによって、ポインタと配列は似てるけど違いもあるみたいな、初学者泣かせな仕様が生まれてしまった
ベースアドレスが配列の初めの要素を指すCスタイルの配列には一貫性があるだろ、だから0-based indexを採用する蓋然性があるわけで
何らかのbookkeeping、サイズ、ストライドやランク情報等のメタデータをスカラで一緒に渡す明示的なもの、あるいはstructで包む、メンバに.flagを設けるのはdope arrayの再発明
一方、dope arrayをネイティブ採用する為には
ベースアドレス+0は配列要素ではなく、メタデータを指さねばならない
だから初めの配列要素はベースアドレス+1(いわゆる1-based index)であるべき、という蓋然性がある
最も邪悪な配列の設計はメタデータを持つにも関わらずC慣習にすり寄って来て0ベース採用のやつな、設計に何の一貫性も無い
アドレス計算はCスタイルの方がスッキリして好き、個人的にはだけど
array[0]がarrayの始めの要素を指す、という伝統を尊重しつつ整合的にメタデータを持たせる拡張をしたいなら、arrptr-1に持たせるって手もあるね
文字列はchar型の配列だし
文字列のコピーなんか、あらゆる言語で基本中の基本だ
処理コスト軽減の為に配列自体ではなく配列の先頭ポインタでやり取りしましょう。
配列が固定長なのは仕方がないと言うか、当然かなと思うが
文字列は、編集がもっと自在に出来た方がありがたかったな
>>960 同じことだぞ
式の中では配列はポインタそのものだ
昔、こんなバカいたよ
printf("%d", sizeof "abc");
見ろ、文字列はポインタだ(キリッ
式がどういう意味かわかった上で他人をバカ扱いしてる?
965なんかもあくまで式だよ
int a[100];
int *b;
(sizeof a) + (sizeof b); ←これも式であり、式の中に配列もポインタも居る
a++ 非合法
b++ 合法
これも式
あの~
誰か excel マクロで動く cc を作ってくれませんか?
うちの会社、cygwin 禁止なんです、cygwin インストーラですら実行できないんです、すごく弱っています
コンパイラが手元にないと私は無力……
VBA使えよ
安心しろお前は自分で思ってるほどCが得意じゃないから
visual studioの稟議を上げられない社畜?
C#のコンパイラなら、何もせずともWinのどっかにはいっているような気がした
>>971 仕事に関係のない VS なんて認可されませんよ、べつにソフトウェアの人じゃないんだから
>>970 コンパイラが手元にないと、どうもやる気がでなくって…
>仕事に関係のない VS なんて認可されませんよ
>誰か excel マクロで動く cc を作ってくれませんか?
仮に誰か作ってもインストール認可されないんじゃないの?
そういう環境だと読み取ったけど
>>973 勤務中にくだらねえことやってんじゃねえって上司に怒られるの?
まあ仕事に関係ないって自分で言っちゃってるからなぁ
>>975 >仮に誰か作ってもインストール認可されないんじゃないの?
>そういう環境だと読み取ったけど
マクロはインストールするものじゃないから自由に使えるんですよ、インストール権限の必要なソフトはインストールできないってだけでして
>>976 そうはいっても、単一ディレクトリの全ファイルに対して、ファイル名の冒頭に連番を振るプログラムを 3 時間ほどでチョロっと書いて、業務に生かしているんですけどね
いちいち手作業でファイル名を変えるとかやってらんないでしょ?自分のために自分で書く分くらいは許容してほしいよね
あと、巨大な csv ファイルを結合するプログラムも便利に使っていたんですけどね、大概の機械はデータを csv で吐いてくれますますからねえ
>>979 屁理屈なら上司に言って怒られてこい
なぜまともなソフトがインストール不可なのにお前の作ったソフトなら大丈夫と思うんだ
ファイル名の頭に連番打つとかPowerShellでもバッチでもVBAでもできるしそもそも打つ必要があるかどうかさえ怪しい
お前のやってることが本当にみんなにとっていいことなら業務効率化のためにコンパイラの申請を通すのは何も難しくない
拒否られてるところで気づけよマジで
職場に不和の種をまくんじゃねえ
>>976 操作記録をいちいち記録されて、裏でこっそり査定に響く仕組みですよ、たぶん
ああ、こんなところでここまで書いちまったらもう私の給料は来年は半額になっちまいますねえ、当の昔に諦めてるけど
>>982 power-shell はたぶん入っていないと思いますよ、あったら使うに決まってますもん
VBA はいちいち excel を起動してマクロを走らせて、ああ、もうめんどくさくって死にそう
実行ファイルワンクリックで、ピシッと全ファイルを改名したいだけですよ、そうすればさくさく錯綜するメールスレッドを管理できますからね
バッチファイルで改名?できるというのなら見せてくださいな?
>>981 業務効率改善のため自分のために自分で作り自分が使うだけのソフトと、多数の人が使う商用の売り物のソフトとを一緒にしないでくれる?
>>983 そりゃ、業務そっちのけで得体の知れないプログラムを書いてばかり(星新一の短編にそんなのがありましたね…)だったら叱られますけど、ぱっぱと3時間で書いて後はノーメンテ、それで半年実用になっているんだから遊んでいるわけじゃないんですけど
>>982 >業務効率化のためにコンパイラの申請を通すのは何も難しくない
難しいんですよ…
あらかじめ効用をきちんと提示しなければならないなんてめんどくさくってやってらんない、
作りたいソフトが具体的に念頭にあるわけではなく、将来的に使いたい可能性が発生する可能性があります、で稟議を通るわけがないでしょう?
マ板で相談してみたら?
ここは大分場違いになってきてる
>>988 (職業)マじゃないただの一般人なので、マ板はたぶん板違い
>>989 ブログみたいな上等な場所に書くことではなく、便所のチラ裏で愚痴るに相応しい話題だと私は思いますけどね
まあ、もうやめます
別に職業プログラマでなくても良いんだよ
プログラム(ロジック)についての悩みならここで良いが
プルグラムを書こうとする人の悩みは、マ板の方が相応しい
> バッチファイルで改名?
これが出来なきゃ何のためにバッチファイルが存在してんだよw
バッチやシェルスクリプトは、ファイルのコピーやリネームとか、ファイル関連の処理が簡単に出来る事が最大のメリットだ
兎に角グクれば山ほど出てくる
-curl
lud20241209095810caこのスレへの固定リンク: http://5chb.net/r/tech/1659623547/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。
TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像
↓「C言語なら俺に聞け 159 ->画像>3枚 」を見た人も見ています:
・C言語なら俺に聞け 140
・C言語なら俺に聞け 151
・C言語なら俺に聞け 150
・C言語なら俺に聞け 148
・LinuxカーネルはC言語なのにオブジェクト指向
・道州制は地域性や言語など語り継がれるべき
・C言語を教えてください!!
・[システム]プログラム言語など学習スレ[初心者]
・C言語でRADって作れるんでしょうか?
・言語学徒に聞きたいんだがチョムスキーってどのぐらい凄いの?
・海外「なんて論理的な言語なんだ」 日本語の構造を簡易化した図が外国人に大好評
・コンテンツ言語『 Curl 』情報交換スレ
・久々にC言語触ってるけどクソすぎじゃねこれ
・ラズパイ4でc言語開発する方法教えてくれ
・野田クリスタルが使ってるプログラミング言語、HSPだった 20年ぶりに聞いたは
・C言語はバイトオーダー等のハードウェア構造を意識しなければ
・お前らC言語で通信ライブラリ作れって言われたら出来る?
・【デイリー新潮】「熱帯」「紅茶」は日本語なのか、中国語なのか? 日本と中国の不思議な言語関係を物語る「和製漢語」の世界[12/27] [仮面ウニダー★]
・C言語でツール作ろうと思うんだけど何かいい案ある?
・C言語でTCP/IP通信勉強(プログラミング)したいんだが
・玄人「まずC言語から覚えろ!」「Cはすべての基礎!」これまじ??
・ネパール、日本の外国人奴隷問題が影響か人気言語1位が韓国語になる
・おまえら「C言語は独学できない!!」 ぼく「いうほど難しいか?」
・敵「プログラミングはやりたいことを見つけてからやれ」俺「よし見つけたぞ!C言語始めてみよう!」
・【IT】Swiftがトップ10入り、Pythonは3位から4位へ--10月TIOBEの人気言語ランキング
・【プログラミング】止まらないC言語の下落 - 12月言語ランキング [無断転載禁止]
・【企業】「”C言語…?どこかで見た”程度でOK」 名古屋のアテック、求人広告が話題に エンジニアの人材不足、面白求人でカバーできる?
・【SE】「C言語…?どこかで見た程度でOK」 名古屋のアテック、求人広告が話題に エンジニアの人材不足、面白求人でカバーできる?★3
・次世代言語アンチスレ19
・言語聴覚士になったことを後悔している人★9
・宇部が自分にしか理解できない意味不明な幻覚妄想言語障害ヘリクツをほざいたらあげるスレ9 [無断転載禁止]
・【天才】スーパー中学生誕生、プログラミング言語わずか数週間で開発、U-22プログラミング・コンテスト2019
・【天才】スーパー中学生誕生、プログラミング言語わずか数週間で開発、U-22プログラミング・コンテスト2019 ★4
・【八街・児童5人死傷】被害児童の祖母「“視力が無い、味覚も無い、言語もわからない、生きてるだけかもしれない”と医者に言われた…」★9 [potato★]
・J言語
・言語哲学
・言語学史
・歌詞英語なのに日本語に聞こえる懐洋曲を書くスレ
・言語分析哲学
・キャンプの事なら俺に聞け! [無断転載禁止]
・D言語 Part35
・言語学卒論スレ
・言語の起源について
・D言語ってどうなの?
・関東弁はバカの言語
・馬鹿が話す言語
・言語に優劣はあるのか?
・質問スレッド in 言語板
・動的言語で大規模開発
・ポケモン言語学w
・新型コロナの言語学
・人工言語を作りたい
・数学を言語として考える
・歴史言語学総合 ★3
・Web言語ってどれがいいんだ
・どの言語が一番優れているか
・日本における言語学最大の問題
・プログラミング言語
・応用言語学・第二言語習得
・人造言語を作りたいスレ
・多言語間の完全自動翻訳技術
・人工言語・淫夢語を作ろう
・言語学的な俗説・トンデモ
・言語障害があるかもしれない
21:16:21 up 18 days, 7:40, 1 user, load average: 9.89, 9.32, 9.29
in 2.172819852829 sec
@2.172819852829@0b7 on 123011
|