[過去ログ] C言語なら俺に聞け 163 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
745(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ ed32-p0tU) 03/28(金)13:32 ID:gM96YdDw0(2/3) AAS
x86-64 なら System V ABI ではどうせ 64 ビットレジスタで受け渡されるからそこんところでは問題にならないのだが、最適化したときにどうなるかまるで予想がつかない。 放置してよいとは言えない。
いったん intmax_t にキャストするのが正当な方法だと考えられている。
外部リンク[html]:www.jpcert.or.jp
746: (ワッチョイ 6eef-29WZ) 03/28(金)15:39 ID:Gm0qUC0n0(1) AAS
struct X* x;で自動変数を定義した場合
スタック上のどこかにstruct Xの領域が確保されたりしますか?
747: (ブーイモ MM26-xG3a) 03/28(金)15:47 ID:v2Oxq7uoM(2/2) AAS
されない
748: 740 (ワッチョイ 492a-mzfN) 03/28(金)17:27 ID:+OZuQWBg0(4/4) AAS
>>745
> printf("%ju", (uintmax_t) x);
なるぽろ。ありがとう。
749(1): (ササクッテロラ Spf1-7PGi) 03/28(金)19:09 ID:Yj8GIx0sp(1) AAS
なんだよjって、何の略だ?
750: はちみつ餃子◆8X2XSCHEME (ワッチョイ ed32-p0tU) 03/28(金)22:16 ID:gM96YdDw0(3/3) AAS
>>749
なんらかの単語の略 (頭文字) というわけではないらしいよ。
> j is sort of like "i" for integer
外部リンク[htm]:www.open-std.org
751: 警備員[Lv.2][新芽] (ワッチョイ 6dcd-maST) 03/28(金)23:06 ID:UFqBPtr80(1) AAS
μ→uみたいなものか
大文字の I はもう使われてふのかな?
752(2): (アウアウウー Saa5-WcQO) 03/29(土)16:07 ID:M3jsTRd4a(1) AAS
long long や unsigned long long の出力に %lld や %llu って昔は使えてた気がするが
最近はだめなんかな
%I64 とか %U64 みたいなのになってるん
753: はちみつ餃子◆8X2XSCHEME (ワッチョイ ed32-p0tU) 03/29(土)16:54 ID:HRez4USp0(1) AAS
>>752
I64 とかはマイクロソフトの拡張。
新しい方法じゃなくてむしろ古い方法が互換性のために残されているだけ。
今となってはあえて使う理由はない。
754: (ワッチョイ 2e2a-aKLX) 03/29(土)17:30 ID:bd7PveSA0(1) AAS
>>752
> %I64 とか %U64
移植が大変そうね。
755(4): (ワッチョイ a92a-K+vz) 04/08(火)18:05 ID:f9O97Hv70(1) AAS
sudo で実行すると execl が動作しないように見える。なぜ?
$ cat -n e.c
1 #include <stdio.h>
2 #include <unistd.h>
3
4 int main() {
5 pid_t pid;
6 if ((pid = fork()) > 0) return 0;
7 else if (pid < 0) return 1;
8 execl("/bin/bash", "/bin/bash", "-c", "echo $$ $PPID >> /tmp/log", NULL);
9 _exit(2);
10 }
$ gcc -g e.c
$ ./a.out
$ cat /tmp/log
10593 1566
$ sudo ./a.out
$ cat /tmp/log
10593 1566
$
756: 627 (ワッチョイ 22ca-VGeA) 04/08(火)19:31 ID:HmugccjD0(1) AAS
まずコピーするなら手を入れるな手を入れると他も全部疑わなきゃいけなくなる
それからsudo -E ./a.outとsudo strace ./a.outを試せ
757: (ワッチョイ 798a-GhsC) 04/08(火)19:45 ID:dAM9KaxA0(1) AAS
縦の数字はなに?
普通にエラーになるだろそれ
758: (ワッチョイ a9b3-K+vz) 04/08(火)20:08 ID:0fraKCca0(1) AAS
catの引数に-n指定してるからだろ
759(1): (ワッチョイ 4dc4-xzp7) 04/08(火)20:57 ID:brzdTu7q0(1) AAS
手元にあるfedora で試したが、
sudo ./a.out の結果表示は2行になった
多分、正常に処理できたようだ
760: 警備員[Lv.1][新芽] (ワッチョイ 4df5-hVWE) 04/08(火)22:40 ID:NxLLuNcW0(1/2) AAS
うちはダメでした
>>755 と同じような結果です
ubuntu22.04 lts
761: 警備員[Lv.1][新芽] (ワッチョイ 4df5-hVWE) 04/08(火)22:43 ID:NxLLuNcW0(2/2) AAS
あ、次のようにしたときです
sudo ./a.out
/tmp/log に追記されませんでした
762(1): 755 (ワッチョイ a92a-ZtHn) 04/08(火)22:49 ID:Rmhs1Vne0(1) AAS
>>759
えー!? と別環境で実行したら、sudo でも execl が動作したように見える。なにこれ。
$ ./a.out
$ cat /tmp/log
13706 1
$ sudo ./a.out
$ cat /tmp/log
13706 1
13721 1
$
取り敢えず、うちの Ubuntu の「おま環」問題のようでした。お騒がせしました。
ただ、今回のは bash の $PPID が init (1) になるという新たな謎が...
763: はちみつ餃子◆8X2XSCHEME (ワッチョイ cd32-xzp7) 04/09(水)00:22 ID:06ntJanv0(1/3) AAS
親プロセスが先に死んだら子は init の養子になる。
だけどこの場合だとどちらが先に死ぬかはプロセスのスケジューリング次第で状況によるってことなんじゃないのかな。
Linux の事情はよく知らんけど。
764: (ワッチョイ 4df4-bRAX) 04/09(水)00:23 ID:Z/QH/Jgt0(1) AAS
Linux 板で聞いた方が回答ありそうな気がする。
765(1): (ワッチョイ ae7e-GhsC) 04/09(水)15:00 ID:cB69i6Vg0(1/2) AAS
const unsigned char t100_day[3807] PROGMEM = { 0x89, 0x50, 0x4e, 略, }
const unsigned char t100_night[3568] PROGMEM = { 0x89, 0x50, 0x4e, 略, }
String tenki_i = "01";
char*const unsigned char t100_day[3807] PROGMEM = { 0x89, 0x50, 0x4e, 略, }
const unsigned char t100_night[3568] PROGMEM = { 0x89, 0x50, 0x4e, 略, }
String tenki_i = "01";
char* y_icon; // FIXME 型が分からない
if (tenki_i == "01") y_icon = "t100_day";
else if (tenki_i == "01_n") y_icon = "t100_night";
else if (tenki_i == "08") y_icon = "t200_day";
else if (tenki_i == "08_n") y_icon = "t200_night";
else y_icon = "t999_day";
sprite.drawPng((std::uint8_t*)y_icon, sizeof(y_icon), 0, 25);
t100_dayなどは画像なんですけど、tenki_iの中のstrによって画像を変えたいです。
y_iconはどうやって指定したらいいでしょうか?
766: (ワッチョイ ae7e-GhsC) 04/09(水)15:01 ID:cB69i6Vg0(2/2) AAS
>>765
コピペ間違えました
正しくは以下です
char*const unsigned char t100_day[3807] PROGMEM = { 0x89, 0x50, 0x4e, 略, }
const unsigned char t100_night[3568] PROGMEM = { 0x89, 0x50, 0x4e, 略, }
String tenki_i = "01";
char* y_icon; // FIXME 型が分からない
if (tenki_i == "01") y_icon = "t100_day";
else if (tenki_i == "01_n") y_icon = "t100_night";
else if (tenki_i == "08") y_icon = "t200_day";
else if (tenki_i == "08_n") y_icon = "t200_night";
else y_icon = "t999_day";
sprite.drawPng((std::uint8_t*)y_icon, sizeof(y_icon), 0, 25);
t100_dayなどは画像なんですけど、tenki_iの中のstrによって画像を変えたいです。
y_iconはどうやって指定したらいいでしょうか?
767: (スッップ Sd22-yI6P) 04/09(水)15:16 ID:qDwL9bg0d(1) AAS
>>755もそうだし書いちまったもんはしょうがねーけどコードを載せる時は
どうしろこうしろって書いてあんだから従えよ
アンタどこ行ってもそんな感じなのか?
768(2): (ワッチョイ 79f9-GhsC) 04/09(水)15:24 ID:Hnk7Q6m60(1) AAS
すみません、書き直しました
外部リンク:ideone.com
t100_dayなどは画像なんですけど、tenki_iの中のstrによって画像を変えたいです。
y_iconはどうやって指定したらいいでしょうか?
769(1): (ワッチョイ 06a6-9hLw) 04/09(水)15:27 ID:lI8vd/RJ0(1) AAS
>>755
fork呼んだ親プロセスがreturn 0でいきなり終わってるのがダメ
wait呼んでプロセスの終了待ちしろ
770: はちみつ餃子◆8X2XSCHEME (ワッチョイ cd32-xzp7) 04/09(水)18:01 ID:06ntJanv0(2/3) AAS
>>768
その断片的なプログラムではよくわからんが型を合わせるだけなら y_icon の宣言はこうなるべきだと思う。
const unsigned char* y_icon;
771: はちみつ餃子◆8X2XSCHEME (ワッチョイ cd32-xzp7) 04/09(水)18:30 ID:06ntJanv0(3/3) AAS
>>768
ところでそれは C++ じゃない?
なんでこのスレで聞くの……。
772: 755 (ワッチョイ 6e2a-ZtHn) 04/09(水)19:53 ID:dFJfWRF+0(1) AAS
>>769
「お騒がせしました。」と言ったので、勝手ながら質問を終えた気がしていた。見てくれて有り難う。
>>755,762 については、Ubuntu においても sudo で execl は動作していた。
動作しないように見えたのは、Ubuntu 特有のファイル権限設定があり、root といえどもファイルにアペンドできないせいだった。Qiita にあったサマリが解りやすい。
外部リンク:qiita.com追記
> Ubuntu の /tmp のユーザファイルに root で追記できない
全く C言語に関係なかった。ごめんちゃい。
773(1): (アウアウウー Sa21-NXaD) 04/20(日)14:12 ID:RiHDJnuQa(1) AAS
stdbool.h 真面目に使ってる人いる?あるいは使ってない方がおかしい?
774: はちみつ餃子◆8X2XSCHEME (ワッチョイ 7932-C6fW) 04/20(日)16:06 ID:srj6a33k0(1/2) AAS
原則としては論理型が必要であれば stdbool.h (内で定義される bool) を使うべきだと思う。
論理型が C99 で導入されるより前の古いプログラム中で bool という名前を使っている場合に配慮して論理型の名前を _Bool にした上でその別名の bool を stdbool.h 内で定義するという変な構成になっている。
(もし bool という名前を独自の定義で使っている場合は単に stdbool.h を使わないという選択が可能。)
このような状況から、互換性の問題がなければ論理型は bool という名前にしたかったし、論理型の値は true, false と書きたいという意図が感じられる。
自分が書くプログラム内で名前が衝突するような問題がないのなら意図に乗っかっておくのが無難そうに思われる。
C23 からは bool, true, false がキーワードとして直接にサポートされるようになって stdbool.h は意味を失いただ存在するだけになった。
こういう変更をする以上はこれが C のあるべき新しい姿と考えられてるってことなんだろう。
stdbool.h を使うことで (古い規格でも) 新しい姿を先取りできるわけ。
ただ、 C23 の変更はちょっとだけ互換性を損なう部分があるから注意を要する。
stdboo.h で定義される旧来の true, false は 1, 0 に展開されるマクロで、要するに型で言えば int だった。
C23 からの true, false は bool 型のリテラルという立場を持つ。
これが問題になるケースはそれほどないとは思うけど……。
上下前次1-新書関写板覧索設栞歴
あと 228 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.012s