C言語なら俺に聞け 158at TECH
C言語なら俺に聞け 158 - 暇つぶし2ch1:デフォルトの名無しさん
21/12/25 12:11:46.61 xxeaCAplM.net
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
URLリンク(paiza.io)
URLリンク(ideone.com)
URLリンク(codepad.org)
C17
URLリンク(www.open-std.org)
C11
URLリンク(www.open-std.org)
C99
URLリンク(www.open-std.org)
URLリンク(kikakurui.com)
C FAQ 日本語訳
URLリンク(www.kouno.jp)
JPCERT C コーディングスタンダード
URLリンク(www.jpcert.or.jp)
※前スレ
C言語なら俺に聞け 157
スレリンク(tech板)
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured

2:デフォルトの名無しさん
21/12/25 12:43:13.14 Ktk9audT0.net
C2x ドラフト
URLリンク(www.open-std.org)

3:デフォルトの名無しさん
21/12/25 17:06:51.38 yFln3WYH0.net
規格が一杯あるけれど、普通はどれを使うの?

4:デフォルトの名無しさん
21/12/25 18:23:03.37 1RbqwiRd0.net
>>3
C89=K&R2

5:はちみつ餃子
21/12/25 20:24:45.71 SzBCpv2O


6:0.net



7:デフォルトの名無しさん
21/12/25 22:11:33.64 UngnJYXc0.net
C++が使えるならC++でいいと思うんだがな。
C99以降が使えるけどC++が使えない|使っちゃダメなシチュエーションてのがあまり思いつかない。

8:デフォルトの名無しさん
21/12/25 22:18:46.07 yFln3WYH0.net
Linuxカーネル

9:デフォルトの名無しさん
21/12/25 22:35:15.30 UngnJYXc0.net
個々のプロジェクトのポリシーとしてならそれこそPLの好みでいくらでもあるだろうけど。
でもLinuxてC99使ってた?

10:デフォルトの名無しさん
21/12/28 07:02:41.51 p+qHklGW0.net
C99か。。。。
変数を途中で定義できたりforスコープは有難いんだけど
そういうのはC++があるからCにはあんまり求めない
わざわざCなときは枯れたところを使いたい
すると半ば無意識にC89になってる

11:デフォルトの名無しさん
21/12/28 11:07:50.33 3O27DpuF0.net
途中宣言なんてブロック内でしか使いたくない

12:デフォルトの名無しさん
21/12/28 11:12:07.15 p+qHklGW0.net
ん? いや、ブロック内でしかできんだろ

13:デフォルトの名無しさん
21/12/29 11:02:54.88 gOGJDejA0.net
1/6までc magazineが1冊55円でセールやってるぞ。

14:デフォルトの名無しさん
21/12/29 12:26:40.10 TemGM5eX0.net
>>12
サンクス!

15:デフォルトの名無しさん
21/12/29 13:44:32.51 Uqmbe8qT0.net
アマゾンにあるな。55円か。俺のアマゾンポイントが56なのでポイントで1冊ただで買えるが。うーん。どれを買うか。

16:デフォルトの名無しさん
21/12/29 13:47:59.87 wwN1RbRp0.net
消費税が6円必要だぞ。

17:デフォルトの名無しさん
21/12/29 13:49:14.80 TemGM5eX0.net
アマゾンは全部税込み表示だよね?

18:デフォルトの名無しさん
21/12/29 13:50:10.27 Uqmbe8qT0.net
>>15
いや、これ、税込み55円のようだよ。本体50円で消費税5円なのではないかな。
更にアマゾンで Kindle unlimited の人は全部0円。

19:デフォルトの名無しさん
21/12/29 13:51:51.39 wwN1RbRp0.net
じゃあ真面目にどれを買うべきか話し合うか。

20:デフォルトの名無しさん
21/12/29 13:54:15.86 wwN1RbRp0.net
バックナンバー一覧を見つけた。
URLリンク(gist.github.com)

21:デフォルトの名無しさん
21/12/29 14:22:36.20 Uqmbe8qT0.net
全部セットで1万ぐらいで買えたりしたら一々選ばんでいいのだがな。
全部読み切れないとは思うが。(てか今となっては読む価値のない記事が多いかな・・・)

22:デフォルトの名無しさん
21/12/29 15:02:06.61 ARRRFsJF0.net
200冊ぐらいか
11000円で買えるぞ

23:デフォルトの名無しさん
21/12/29 16:45:16.84 TemGM5eX0.net
まだ読んでないkindle本あるのに・・・16冊購入(´・ω・`)

24:デフォルトの名無しさん
21/12/29 19:45:04.56 vNNNNQH+0.net
はるか昔の bit の小話にて人間の「感覚の受信→解釈→意識・自覚」の一連の情報処理にはタイムラグがある、という「受動意識仮説」がすでに提示されていましたが
その小話が載っている bit って何年何月でしたっけ?
意識は幻想か?―「私」の謎を解く受動意識仮説
URLリンク(www.youtube.com)
準備運動電位
URLリンク(ja.wikipedia.org)

25:デフォルトの名無しさん
21/12/29 22:11:44.70 Uqmbe8qT0.net
検索していたらこんなページ見つけた。しかしここでの販売は6冊単位で600円なので1冊100円。
C Magazine セット販売
URLリンク(tatsu-zine.com)

26:デフォルトの名無しさん
21/12/29 22:57:46.13 wwN1RbRp0.net
C MAGAZINE 2005・2月号 特集2 グラフ理論入門

27:デフォルトの名無しさん
21/12/30 23:16:11.26 4vPJ4A600.net
質問
#include <stdio.h>
int main (void){
char str[100];
int i,j,n,m,a,b;
char A[100];
scanf("%d %d %s",&n, &m, A);
for(a=0;a<n;a++){
j=0;
for(b=0;b<m;b++){
scanf("%s",str);
for(i=0;str[i];i++) {
if(str[i]== *A) {
j++;
}
}
}
printf("%d\n",j);
}
return 0;
}

っていうコードを書いてみたんだけど、思うような出力が出ない
どうすればいいか教えてくださいお願い
以下問題
URLリンク(i.imgur.com)

28:デフォルトの名無しさん
21/12/30 23:17:59.44 4vPJ4A600.net
問題がうまくはれてなかった
URLリンク(i.imgur.com)

29:デフォルトの名無しさん
21/12/31 00:46:48.51 TgisNlKh0.net
なんで、N, M, KのKを文字列として受けてるの?

30:デフォルトの名無しさん
21/12/31 05:03:08.34 4SEvuYeQ0.net
>>27
paizaの問題って公開しちゃいけないと思ったが、その問題は大丈夫なのか?

31:デフォルトの名無しさん
21/12/31 05:08:21.26 4SEvuYeQ0.net
>>26
これって入力は全て数値だから scanf() のフォーマットは全て %d で良い筈だが、何故文字列として受け取ろうとしている個所があるのか?

32:デフォルトの名無しさん
21/12/31 05:14:19.43 4SEvuYeQ0.net
>>27
公開しても良い問題だったね。しかも問題のURLをコピーしたりも出来る。
だったら画像貼ってないで素直にURL貼った方が良い。スマホでWi-Fi使わず見てたりしたらパケット余計に使うことになるからね。(だから専ブラではいきなり画像をダウンロードしない設定にしてあったりして、見られる率が下がる)。
URLはこれな。
URLリンク(paiza.jp)

33:デフォルトの名無しさん
21/12/31 09:00:32.53 VTzS4kbc0.net
とりあえずfgetsとstrtok_rを使って、
一行まるごと読み込んで、読み込んだ一行分の文字列を空白で分割して表示するだけのプログラムを書いてみたらどうかね

34:デフォルトの名無しさん
21/12/31 09:38:23.12 AQXYYOVd0.net
>>30
俺の地元のルールだと、
22 22 22 ...(25回22を選ぶ)
みたいなピックしてkが2だと50ポイントもらえるルールだったから文字列として扱わんといかんかとおもてた

35:デフォルトの名無しさん
21/12/31 11:20:32.87 2Zk/vij+0.net
3[山田、山田、佐藤、田中、・・・]
7[・・・]
12[・・・]
というような表を作っておけば良いのでは?

36:デフォルトの名無しさん
21/12/31 21:31:16.10 AQXYYOVd0.net
URLリンク(paiza.jp)
これ教えて

37:デフォルトの名無しさん
22/01/01 00:39:58.19 gOXFnTf60.net
何が分からんかぐらい書きなよ

38:デフォルトの名無しさん
22/01/01 01:18:03.81 1OHQMytp0.net
何がわからんかも分からん
方針もわからん

39:デフォルトの名無しさん
22/01/02 13:30:00.29 o9R7ffl70.net
>>35
ソートするだけだよ。
まずは入力を配列変数に貯め込んでそれに対して並べ替えをする。
ソートする部分を自作するのが面倒なら qsort() 使えば良いんじゃないかな。
(この辺はC言語使わない方が楽かも知れないが)

40:デフォルトの名無しさん
22/01/03 21:40:15.76 qalXVoDK0.net
入力データの1行目を読みデータ件数を取得する
データ件数にあわせて配列を確保する
(予めMax値の配列を用意するのでも構わない)
2行目から最終行まで順に読み込み、配列に格納する
問題文の財産評価ルールに従いデータをソートする
並び変わったデータを出力する

41:デフォルトの名無しさん
22/01/06 15:33:37.60 soGE7KAW0.net
文字配列なんですが
char str[] = { 'A', 'B', 'C' };
↑のstrにはnull文字は付加されないという認識で合ってますか?

42:デフォルトの名無しさん
22/01/06 15:39:28.79 XZjVJACa0.net
('A')

43:デフォルトの名無しさん
22/01/06 15:50:14.25 OD+qNx/80.net
付加される保証がない、かも

44:デフォルトの名無しさん
22/01/06 16:43:04.90 NntPX0Am0.net
>>40
合ってる
境界調整の結果として'\0'のように見える
詰め物が入る可能性はあるが騙されてはいけない

45:デフォルトの名無しさん
22/01/06 16:53:16.90 soGE7KAW0.net
>>41-43
そうなんですね
ありがとうございました

46:はちみつ餃子
22/01/06 16:54:16.61 U9j/lfCJ0.net
>>40
付加されない。
"ABC" と書いた場合に char 四個ということになるのと違ってその場合には要素が三個の配列と解釈されることが保証される。
つまり str の型を言うなら char[3] ってことね。
ちなみに
char str[4] = {'A', 'B', 'C'};
というように書いた場合 (初期化子に書かれている要素が配列の要素数より少ない場合)
は足りない分は 0 が補われたかのように動作することが保証されるので str[3] には 0 が入ってる。

47:デフォルトの名無しさん
22/01/06 17:05:22.56 OD+qNx/80.net
分かって使うのは良いけれど
そのまま文字列処理関数に渡すと
困った事が起きるんだよな

48:デフォルトの名無しさん
22/01/10 23:16:11.54 rD3Qvv+7a.net
プログラミングで y = 1 / (1 / x) ってやったらどうなるの?
スレリンク(news4vip板)
1 名前:以下、5ちゃんねるからVIPがお送りします 投稿日:2022/01/10(月) 23:04:17.072 ID:expyRxlYa
頭のいいコンパイラなら y = x にしてくれるのか?(機械語にするとき)
あっ、ちなみにインタプリタ言語やLLでは普通に t = (1 / x) を計算して y = 1 / t にするだろうそりゃ
うちは自動車メーカーだからな、使ってるのはC言語で、コンパイラは GHS MULTI っていうお前らが知らないコンパイラだよ

49:デフォルトの名無しさん
22/01/11 01:08:21.74 Q8SCQHSH0.net
xが整数ならしてくれないよね
浮動小数点数なら
if (x==0) y=NAN; else y=x;
にしてくれるのかなぁ

50:デフォルトの名無しさん
22/01/11 01:38:43.94 2o/IB+MZ0.net
0除算とかオーバーフローはプログラマが考慮してくれるんじゃないのかな?

51:デフォルトの名無しさん
22/01/11 02:04:19.39 Wr4lWyid0.net
gccなら-ffast-mathを付ければy=xになるはず
ieee754準拠なら変形しない

52:デフォルトの名無しさん
22/01/11 08:27:46.21 3vsFi49bd.net
整数型なら0除算が未定義動作だから変な最適化がかかるかもしれん
x==0 で未定義動作
2回目の割り算で x!=1&&x!=-1で未定義動作
signedなら最終的にy=xになりうる
unsignedならx=-1がありえないのでy=1になるかもしれん

53:デフォルトの名無しさん
22/01/11 19:52:42.66 pJ1mRDMY0.net
整数前提
カッコついてるから (1/x) まで評価してソレを整数化とり得る値は符号付きで-1,0,1,<0割未定義>
その評価値が分母に 分子が 1 の演算で 符号付きで 1,-1,<0割未定義>
ほとんど0割未定義を踏みそう

54:デフォルトの名無しさん
22/01/11 20:03:51.62 W/ZD5G+Pd.net
未定義は「相手せんでいい」だからな

55:デフォルトの名無しさん
22/01/15 17:45:56.79 MXtcLzFoa.net
ものにもよるがだいたいはダメだな。
printf()で%.3sみたいなフォーマットにするとかstrncpy()で文字数指定するとかなら大丈夫だろうが。何れにしてもプログラマーが意識してないといけない。

56:デフォルトの名無しさん
22/01/15 17:47:19.94 MXtcLzFoa.net
ぐはっ
リロードしても出てこなかった書き込みが沢山出てきた

57:デフォルトの名無しさん
22/01/16 13:28:18.74 E45iSBlB0.net
C言語学び始めたんだけど今のところJavaで自動でやってることをCは明示的にやってるって事くらいしか分からん
Cはガベージコレクタが無いからアルゴリズムを学ぶには最適って聞いたんだがいまいち理解できん
メモリの確保と解放を任意にできることで他と違って何ができるようになる?

58:デフォルトの名無しさん
22/01/16 14:08:25.07 H6PAG9rn0.net
何で?
確保した資源を解放するという当たり前のことを
自動でやってもらうことの何がそんなに大事なの?
当たり前のことがどうなっているのか把握するほうが大事だと思うけど

59:デフォルトの名無しさん
22/01/16 14:13:24.52 3oi0BVHh0.net
別に何も
Cはよく高級アセンブラと言われるくらい低級なもの
JavaはVMで動かす高級なもの
高級なものは低級なもので実現されてるのよ

60:デフォルトの名無しさん
22/01/16 14:24:28.62 H6PAG9rn0.net
マジで意味わからん
何が言いたい?

61:デフォルトの名無しさん
22/01/16 15:21:59.54 sWhCnDyn0.net
int __cdecl main(int argc, char** argv)
この時二つの引数はどの時点で突っ込まれるのでしょうか?
引数とかって言われてもこのくらいしかわかんないです。
int add(int a,int b){return a+b;}
int main(){cout<<add(1,2);}
__cdeclあるときはmainの中身が実行される前にmain内にある二つの引数を・・・
すみませんよくわからないので教えてほしいです。

62:デフォルトの名無しさん
22/01/16 15:47:09.71 3oi0BVHh0.net
>>60
そりゃmain()が呼ばれる時だけど
何が疑問なのかよくわからん
そのadd(int a, int b)もadd(1,2)と呼ばれた時にaに1、bに2が入る
それと同じ
>>59
>58は>56への応答だよ

63:デフォルトの名無しさん
22/01/16 15:55:52.82 sWhCnDyn0.net
>>61
ありがとうございます。
c++やり始めたばかりで、初めて__cdeclというものに出会い、
main()に引数が指定されるのも初めて見ました。
__cdeclを調べてみたのですが、よくわかりませんでした。
URLリンク(docs.microsoft.com)
ここのコードに出てきたやつです。
argc, argvこの二つにはどこから来た値がどのタイミングで入るのかがよくわかりません。
サーバー側の方でそれぞれの構造体や関数は一応ですが、調べました。
(ディスクリプタが良くわかんなかったけど部品の形状みたいな感じで覚えました)

64:デフォルトの名無しさん
22/01/16 15:57:48.95 sWhCnDyn0.net
main関数が一番最初に読み込まれる関数という風に思っていて、
includeやdefineを済ませた後に一番最初にmainが実行されるのなら、
argc, argvこの二つの変数の値がどうやって決まるのかわからないのです。

65:デフォルトの名無しさん
22/01/16 16:00:01.63 sWhCnDyn0.net
今更なのですが、mainを実行するときにmainの中の
ローカルな空の変数(?)を宣言するだけ宣言しといてるとかですか?

66:デフォルトの名無しさん
22/01/16 17:07:18.79 rX32u5GR0.net
>>63
OSから引き渡される。普通はコマンドラインの引数をシェルが加工して渡してくる。
OSのない組み込みのようなやつの場合はそのmain()を呼び出すプログラム次第になる。

67:デフォルトの名無しさん
22/01/16 17:11:54.22 rX32u5GR0.net
>>64
何を疑問に思っているのかよくわからないが、Javaとか他の言語とほぼ同じでmain()に限らず関数は呼ばれたらそのブロック内でローカル変数のメモリを確保する。(ただしCの場合は宣言だけだと初期化されない)。

68:デフォルトの名無しさん
22/01/16 17:30:57.83 sWhCnDyn0.net
>>65
ありがとうございます。
OSからもらってくるのですね。
謎が解けました。

69:デフォルトの名無しさん
22/01/16 18:32:43.61 E45iSBlB0.net
>>57
>>58
自分でメモリの確保と解放を行う事でメモリの仕組みを知れるのは大事なのは分かる
ただgcが動かない事でアルゴリズムとどう繋がるのかがイマイチ分からん
連結リストはメンバを参照して動的配列実現してるけどgcは関係ないと思う
gcが動かない事で何かメリットないん?

70:デフォルトの名無しさん
22/01/16 19:07:47.21 8yj7aXgd0.net
純粋にアルゴリズムを学ぶことが目的ならC以外のぬるい言語のほうが良いのでは?
ただ、考えたアルゴリズムを誰よりも早く動かしたいならCは役立つと思うよ

71:デフォルトの名無しさん
22/01/16 20:55:00.02 qRjB4bc50.net
純粋に、なら pascal でしょう…
pasca から C へは機械的に書き換えられるから C でもいいでしょうが
それ以上の高級言語になると、例えばソートアルゴリズムの「インプレイス」の概念も有耶無耶になってしまうので、初等アルゴリズムくらいは C で勉強したほうがいいですね

72:デフォルトの名無しさん
22/01/16 20:57:35.96 YLrls7710.net
メモリーリークなどは、痛い思いをしてでも学ぶ価値はあると思う
根性論ですまん

73:デフォルトの名無しさん
22/01/16 20:58:56.40 uYZKVP770.net
>>68
プログラマの望むタイミングでGCができるというメリットがある
GCが動くとどうしても遅くなるので
その遅くなると時をプログラムで決めることができる

74:デフォルトの名無しさん
22/01/16 23:05:47.94 YLrls7710.net
確保と解放はDB扱うときにもあるからね

75:デフォルトの名無しさん
22/01/17 00:45:04.90 VBYSAUJW0.net
rustがCの代替になる理由がメモリ関連のバグが減るからってのはどう言う事?

76:はちみつ餃子
22/01/17 00:56:25.55 jU2WrI4n0.net
オブジェクトは複雑に依存関係が出来る場合もある。
参照 (C 的に言えばポインタ) が残っているのにオブジェクトの寿命が尽きていればダングリングが生じてしまう。
C では寿命の管理をするのはプログラマの責任であって、無効なポインタを使った結果は未定義。
そういうのを静的にチェックしてエラーにしてくれたらありがたいなぁというのを実現したのが Rust 。
そのかわり制約の記述がちょっと面倒くさくはあるんだが、どちらにせよ依存関係の管理は C でもやってたことではあるからね。
Rust で制約を書けないようならたぶん C でもちゃんとメモリ管理できてない。

77:デフォルトの名無しさん
22/01/17 02:01:49.66 4l2NkMK40.net
Ubuntuのgcc9で
size_t i = -100;
printf("%ld\n", i); // -100
と出力されたんですが、なぜsize_tで負数が扱えるんですか?
stddef.hでは
typedef long unsigned int size_t;
になってました
怖いです

78:はちみつ餃子
22/01/17 02:09:51.98 jU2WrI4n0.net
>>76
扱えていない。
printf の書式指定と実際の型に不整合がないようにするのはプログラマの責任で、
それができていないときにどういう挙動になっても知ったことじゃない。

79:デフォルトの名無しさん
22/01/17 02:13:20.92 4l2NkMK40.net
>>77
printfですかなるほど

80:デフォルトの名無しさん
22/01/17 02:32:10.74 4l2NkMK40.net
>>77
あと
size_t n = -100;
if (n == -100) {
puts("-100");
}
これが真になるのは-100がsize_tに暗黙的にキャストされてるせいですかね

81:デフォルトの名無しさん
22/01/17 06:34:55.39 J3jxIzMN0.net
>>68
gcって思考放棄だろ
資源管理の中でメモリだけ後片付けを特別扱いできたからって何ってこと
資源管理にはアルゴリズムがいらないと思うのか?

82:デフォルトの名無しさん
22/01/17 08:24:31.68 y6/SFoBh0.net
>>76
-100は32bit 2の補数表現で0xFFFFFF9Cになる。
これはunsigned longで4294967196に相当し、符号なしのiにはこの値が入ってる。
ただprintfの指定が%ldと符号付きになってるので0xFFFFFF9Cを符号付きで表示したらやっぱり-100になる。
>>79
-100がsize_tに変換されるのではなく、どちらの値域も含めることができるように両辺がlong long intに拡張される。

83:デフォルトの名無しさん
22/01/17 08:24:40.15 6BYLlYWJd.net
>>79
signed longかsize_tかどっちかに暗黙的にキャストされる
-Wallすると警告出るだろうけど

84:デフォルトの名無しさん
22/01/17 13:06:53.33 RA8YXgQS0.net
サイズがおっきい側にあわせて拡張されるけど
拡張の際に符号付で拡張されるかは、拡張される側の型による でいいのかな?
左辺が size_t で 右辺が (__int16)-1 と (unsigned __int16)0xffff とで変わってくる

85:デフォルトの名無しさん
22/01/17 19:03:14.06 4l2NkMK40.net
>>81
なるほど、わかりました
ありがとうございます
>>81-83
比較の計算のために型を合わせるってことですね
納得しましたありがとうございます

86:デフォルトの名無しさん
22/01/17 21:09:27.93 VBYSAUJW0.net
>>80って>>57
よく分からん話し方が似てる

87:デフォルトの名無しさん
22/01/18 07:11:42.98 gNdHIxeHd.net
おまえさん、匿名掲示板に向いてないな

88:デフォルトの名無しさん
22/01/20 11:09:59.27 3tZE3jDgH.net
#defineの効果を全体に適用させる方法は無いの?
書いてあるヘッダを取り込まなくても

89:デフォルトの名無しさん
22/01/20 11:14:24.09 hwIlnS+y0.net
コマンドラインで指定

90:デフォルトの名無しさん
22/01/20 14:48:47.15 n7chvAG30.net
>>87
ヘッダに書かないメリットは何?
暗黙の効果があると全体の見通しが悪くなるだけだと思うんだが

91:デフォルトの名無しさん
22/01/20 16:57:56.31 JLPh4iSLd.net
gcc -DUNKO
とかでコンパイル時分岐させるのはよくやる
これで "#define UNKO" 相当

92:デフォルトの名無しさん
22/01/20 17:35:43.55 JsGuh7u5K.net
>>90
細かいツッコミだが、
> これで "#define UNKO" 相当
"#define UNKO 1" 相当な

93:デフォルトの名無しさん
22/01/20 18:12:26.02 Eie73JRu0.net
この問題なんで答え0なん?
難しいURLリンク(i.imgur.com)

94:デフォルトの名無しさん
22/01/20 19:26:05.14 8odJS2DdM.net
%rbp の値を pushq でスタックに退避して他の処理をやって popq で下ろしてきてるから最初に入ってた 0 が出てくる

95:デフォルトの名無しさん
22/01/20 19:30:17.07 6OdGtD3E0.net
>92
なんか80286~80486時代に見たアセンブラと違うorz

適当にググった予想
;レジスタ %rbp、%rbx の値をスタックにコピー
pushq %rbp
pushq %rbx
...
popq %rbx
popq %rbp
;コピーしておいた値を%rbx,%rbpに戻す
呼び出し前と同じ値になるだけだね。

96:デフォルトの名無しさん
22/01/21 00:21:23.88 3gUGA9pL0.net
>>92
0の入った%rbpをpushqして最後にそれをpopqして%rbpに戻しているから。
pushq, popq の数は合っているので他の値にはならない。

97:デフォルトの名無しさん
22/01/21 06:05:07.87 mAmuRLc0a.net
>>89
ライブラリの中なんで書き換えるのはちょっと

98:デフォルトの名無しさん
22/01/21 06:13:28.12 mAmuRLc0a.net
マイコン系のやつでヘッダのインクルードする前に
マクロ定義すれば使うピンを選択できるようになってるはずなんだけど
当然ながら別にコンパイルされるソースの中には効力がないと

99:デフォルトの名無しさん
22/01/21 07:37:29.62 hGKgCtXH0.net
「マクロ定義すれば使うピンを選択できるようになってる」メーカー提供の何かを使った
自前のライブラリで なんとかしたいと?
それライブラリの設計ミスじゃね?

100:デフォルトの名無しさん
22/01/22 12:31:56.24 90hTt9580.net
日立の悪口はやめろ

101:デフォルトの名無しさん
22/01/23 06:37:18.36 Li0julahd.net
ライブラリはコンパイル済みだから#defineしても無駄だろ

102:デフォルトの名無しさん
22/01/26 09:09:47.27 iLK8Wqk90.net
>>75
Rustは間違いがあるとコンパイラが色々指摘してくれる点でいいよね
例えばこの部分にこういうメモリの安全でない使い方をしていますよ、とか
ここにこんなデータ競合が発生していますよ、とか

103:デフォルトの名無しさん
22/01/26 09:32:17.82 Ppmaq+BpM.net
メモリ管理って言っても大層なことしないけどな
単一コンテキストなら対照的にctr/dtr置けばいいし、複数コンテキストならリンクリストに繋いでrefget/refputでいいし
まあメモリ上限やフラグメント、メモリプールとかやり始めるとなかなか面倒になってくるけど…

104:デフォルトの名無しさん
22/01/26 21:10:17.71 z6fCP1j50.net
Cのサーティファイ3級の問題集で
int main(void){
int i,j;
for(i=3, j=10;i-->0 && j-->0;);
printf("iは%d.jは%d\n",i,j);
return 0;}
でiが-1 jが7になるのはどうしてでしょうか?

105:デフォルトの名無しさん
22/01/26 21:34:45.68 4bRyoani0.net
>>103
i-->0 && j-->0が偽になるのはi==0, j==7のとき
iはi--で-1になってjの方は短絡評価でj--が評価されずにj==7のまま

106:デフォルトの名無しさん
22/01/26 21:37:25.63 94PZZUq60.net
課題や問題としてはアリなんだろうけど、こういうコードはキモいよなぁ

107:デフォルトの名無しさん
22/01/26 21:41:05.71 R08bxH5q0.net
ルールを知ってるか?という問題に
実用上どうのと言ってるやつ
わからんから負け惜しみにしか聞こえんぞ

108:デフォルトの名無しさん
22/01/26 21:44:03.93 zNP9VNXb0.net
条件に副作用がある式を書くと糞コードになるよ、って例かな

109:デフォルトの名無しさん
22/01/26 21:48:11.38 z6fCP1j50.net
>>104
ありがとうございます!大先輩! _(._.)_

110:デフォルトの名無しさん
22/01/26 21:49:35.56 R08bxH5q0.net
関数ポインタを使っただけで糞コードと言い出すやつと変わらんな

111:デフォルトの名無しさん
22/01/26 22:02:05.94 iLK8Wqk90.net
偶然だけどRustがCから唯一受け継がなかったのがfor(;;)文と前置/後置の++と--だね
Rustではfor(;;)の代わりにもっとわかりやすいイテレータを使うfor inになって
イテレータ利用で++と--を使う場面が激減したため +=1と-=1で十分となった

112:デフォルトの名無しさん
22/01/27 08:19:14.30 1WN6znb60.net
#include <stdio.h>
void main(){
 int a[5];
 printf("%d\n", &a[0]);
 printf("%ld\n", &a[1]);
 printf("%d\n", &a[2]);
}
結果:
1860819792
140735054207828 ←★
1860819800
1860819796になるところがprintfで%ldにすると★のようになりました。どうして?

113:デフォルトの名無しさん
22/01/27 08:40:51.15 hGoB7Zi60.net
%dはint、%ldはlong
LP64環境(Linux等)なのだろう
ってか、ポインタを%dや%ldで出すのが変なんだけどね
%pで出しましょう

114:デフォルトの名無しさん
22/01/27 09:28:40.94 Fupo2oO/d.net
挙動がわかっててやるのはともかく
なんで?になるのはギルティだな
担当教官が

115:デフォルトの名無しさん
22/01/27 11:12:04.00 HehBpiSx0.net
++は、アセンブラコードを意識していると思うよ

116:デフォルトの名無しさん
22/01/27 12:53:54.43 cK3g3Gve0.net
>>114
大昔はコンパイラが直訳だったからね
今はコンパイラが賢いからx++でもx+=1でもx=x+1でも同じ結果
さらにアセンブラ側もレジスタを介すinc命令ではなくメモリ上に直接add 命令で1加算とか
そもそもポインタの++なら対象の型が8/16/32/64bitに応じて1/2/4/8をaddとか
だからアセンブラは今は関係ないし言語としても++がなくても影響なくなってしまってる

117:デフォルトの名無しさん
22/01/28 07:31:33.24 Tsd33EHWd.net
ポインタから次々読んでいく場合
a=*(p++);
のほうが便利

118:デフォルトの名無しさん
22/01/28 07:43:00.03 y3i0lS6h0.net
格好つけるダサいやつ

119:デフォルトの名無しさん
22/01/28 08:12:12.92 LR3qN1W70.net
一種のイディオム化しているがふつうその括弧はつけないな。

120:デフォルトの名無しさん
22/01/28 08:17:06.42 2Fs3iqwoM.net
まあ、あっても悪さしないし心配なら付けるのは正しいと思う
>>118の言う通りよく見るイディオムになってるので違和感はあるけど

121:デフォルトの名無しさん
22/01/28 08:25:24.42 D0DTDHxMd.net
char *src, *dst;
while(*dst++=*src++);
みたいな書き方はよく見るけど
最適化とか存在しない古いコンパイラのための書き方だよなといつも思う

122:デフォルトの名無しさん
22/01/28 09:16:27.33 grc2q108d.net
いい意味の面倒くさがりだよ

123:デフォルトの名無しさん
22/01/28 09:23:04.37 Tsd33EHWd.net
最適化だけの問題ではないぞ
while(*dst=*src){dst++;src++;}
では変数名を変更する必要が出た場合2ヵ所づつ書き換えねばならない
→ミスにつながる
それにループが終わった後でdstとsrcは最後の要素を指しているので余計なインクリメントが要るかもしれない

124:デフォルトの名無しさん
22/01/28 11:00:14.06 yXxqNK5h0.net
初心者や他言語ばっかりやってた人の誤読回避は考慮する?

125:デフォルトの名無しさん
22/01/28 11:17:11.26 udo1auGz0.net
この頃発見した printf() のフォーマット
% の後に # を付けると x 変換の時に頭に 0x を付けてくれると知り、早速こう書いてみた。
printf("%#x\n", 0xab);
0xab が出力される。
これはいい、と思い16進4桁出そうとしてこう書いた。
printf("%#04x\n", x);
すると 0x は付いたがその後が2桁になった。どうやら 0x の部分の桁数も含めなければいけないようだ。仕方がないのでこう書き直す。
printf("%#06x\n", x);
やった!できた!
しかし幸せは長くは続かない。やがて x に 0 が入った状態でここを通過。以下の出力を得る。
000000

126:デフォルトの名無しさん
22/01/28 11:22:43.44 dRbZojn90.net
Cは初心者向けではないし、可読性は考慮していない
やりたい�


127:魔ウっとコード化出来る人に向いている言語



128:デフォルトの名無しさん
22/01/28 12:25:59.28 6cofCgvGM.net
>>124
そんなフラグ初めて見たけど、仕様見たら確かに0以外の時に0xを付加するんだな
いまいち使いづらい

129:デフォルトの名無しさん
22/01/28 12:32:45.35 obJ/SPWt0.net
文字列のエスケープシーケンスでバイナリ直接したんだけど、例えば"\x10"の後に"a"という文字を続けようとして"\x10a"って書くと値が大きすぎるってエラーになる。
"\x10" "a"と分割するしかない?

130:デフォルトの名無しさん
22/01/28 12:35:51.06 grc2q108d.net
Cはプログラマを信頼する言語だ
悪いことをさせない制限より
自由度を優先させている
怠けるやつより進歩する者を優先するのもしかり

131:デフォルトの名無しさん
22/01/28 13:19:26.12 vyOOr9LZM.net
>>127
> "\x10" "a"と分割するしかない?
それしかなさげ
8進表現は最大3文字となってるから "\0123" は '\012' と '3' になるけど16進表現には桁数の制限がないので "\x10a" を1文字に解釈しようとしてエラーになる
char * の文字列は2文字、wchar_t の文字列は4文字までにすればいいと思うんだけど

132:デフォルトの名無しさん
22/01/28 13:57:54.02 obJ/SPWt0.net
>>129
ありがとう。やっぱりそうなのね。
ESCシーケンスが書きにくくてしょうがないわ。

133:はちみつ餃子
22/01/28 16:18:28.78 hT9TavA00.net
>>127,129
マイクロソフトのドキュメントにも言及があるのを見つけた。
URLリンク(docs.microsoft.com)
不格好だけど C はそういうもんだからしょうがないね。

134:デフォルトの名無しさん
22/01/28 16:49:19.01 obJ/SPWt0.net
>>131
わざわざ調べて頂いてありがとうございます。
 #define ESC_UP "0x1b" "A"
のようにマクロで逃げることにしました。
使う側では
 printf("今からUP" ESC_UP "UP完了");
と少し気持ち悪いですが。

135:デフォルトの名無しさん
22/01/28 17:55:44.80 sJpZ8snBM.net
ESC しか使わないなら
printf("今からUP\033AUP完了");
とかでもいいかも
今更8進数かよって感じもするけど…
もしく


136:は #define ESC(c) "\x1b" #c printf("今からUP" ESC(A) "UP完了"); くらいかなぁ



137:unko
22/01/29 18:53:20.85 cvNc/NLr0.net
ごめんなさい高校のc言語の課題で乱数とじゃんけん対決をして結果と手を動的配列に格納して最後にまとめて結果を表示するというやるをやってるんですが
whileループで代入した結果とその後のforループでカウントしながら表示している値が違うみたいでずっとプログラム見てても何が原因なのか分からないのでわかる方いたら教えて欲しいです.
URLリンク(github.com)

138:デフォルトの名無しさん
22/01/29 19:18:32.81 mAwlWFlr0.net
>>134
scanfで表示出力は出来ません。分けましょう。
printf("times: "); scanf("%d",&j);
しかし、それでもまだ問題がある。

139:デフォルトの名無しさん
22/01/29 19:22:51.55 wjo4lb340.net
44: どっから配列が出てきた
デバッガ使えばプログラムの動き見るの捗るから使え
使えないなら怪しそうなとこにひたすらprintfを埋めろ

140:デフォルトの名無しさん
22/01/29 20:13:03.39 mAwlWFlr0.net
(&janken->man)[i] = man;
printf("man:%2d ",(&janken->man)[i]);
構造体配列のメンバーアクセス方法が間違ってる
case 0:
  countDraw++;
この直後にはbreak;を入れること(全てのcase文に適用)
while(i<=j && man<=2 && man>=0) {
ここにmanを入れる意味は?
入力範囲チェックを意図するなら、ここではなく
scanf直後に、範囲外ならcontinueさせる方が良い
無駄もあるけれど、この辺を直せば動くんではないか?

141:unko
22/01/29 20:51:58.61 cvNc/NLr0.net
>>137
ありがとうございます
break;忘れてたので実行結果変でしたね
ポインタとかは最近やり始めてまだよく分かってないのでちゃんと勉強しておきます

142:unko
22/01/29 20:54:58.88 cvNc/NLr0.net
>>136
一応whileの直前当たりでかろっくで配列確保してます

143:デフォルトの名無しさん
22/01/30 01:38:43.74 05k5AmyC0.net
44: (&janken->man)[i]
janken->man は配列ではない。
jankenは配列とみなせるポインタだが関係ない
たぶんコンパイルを通すためにこの形になってるんだろうけど
janken[i].man とするべき

144:デフォルトの名無しさん
22/01/30 07:23:03.99 qcbJpmhr0.net
ソケット関連の質問です。
この前ドメイン名取得してきたのですが、(練習のため)
webブラウザにurlを打ち込んだ時に自分のパソコン内のサーバーソケットにつなげて
htmlで”HelloWorld”と吐き出したいのですが、ドメイン名IPアドレスの紐づけ
ってどの段階でやればいいのでしょうか?
ソケットを作るときにするのかなと思っているのですがそもそもこの考え自体が間違っているでしょうか?

145:デフォルトの名無しさん
22/01/30 08:48:53.30 v3wXXGPY0.net
名前-IPを関連させる(D)DNSの話であって、ほぼソケット関係無いような

146:デフォルトの名無しさん
22/01/30 09:18:12.24 uPZ//xKSM.net
>>141
> ドメイン名IPアドレスの紐づけ
紐づけと言うか解決はgetaddrinfo()でやる
URLリンク(linuxjm.osdn.jp)
文字通りの紐づけなら>>142が言うようにDNSの話だからシステム管理者なりに聞いてくれ
てか、まずOS書いてくれ

147:unko
22/01/30 09:28:39.21 ft1MsLjp0.net
>>140
ありがとうございます
構造体のポインタを宣言してるのでその表現が正しそうですね
以前の課題だと構造体のメンバのポインタに配列を割り当てていたのでそれと同じように何も考えないでアロー演算子でアクセスしちゃってました

148:デフォルトの名無しさん
22/01/30 10:55:49.17 qcbJpmhr0.net
>>143
ありがとうございます。
Windows11とVC2021でc++です。
DNSもっと調べてきます。

149:デフォルトの名無しさん
22/01/30 11:46:45.94 qcbJpmhr0.net
VSやった・・・

150:デフォルトの名無しさん
22/01/30 12:38:44.79 x0r2XrqVM.net
VSに2021はない…

151:デフォルトの名無しさん
22/01/30 15:19:39.90 wVIChEm/0.net
>>134
33行目と34行目は入れ替えないと構造体の配列のメモリ確保が一つ分少なくなる。

152:デフォルトの名無しさん
22/01/30 15:27:39.02 wVIChEm/0.net
>>141
ソケットで connect() する前には接続先アドレスが分かっている必要があるが、
そのアドレスを調べるのは connect() 前のどの時点でやっても良い。
というか後々ソケットのconnect()で利用するかどうかとは無関係に調べて良い。

153:デフォルトの名無しさん
22/01/30 19:53:38.68 F7MhehSXM.net
このスレの猛者が書く>>134の課題ってどんなコードになるんやろ?

154:デフォルトの名無しさん
22/01/30 21:12:41.91 olbUxhsiM.net
初級クラスであっさり書ける

155:デフォルトの名無しさん
22/01/31 16:42:11.29 uGjzp6vA0.net
VisualStudioをつかっています。
_MSC_VER
これって(マクロ?)VSのバージョンを表す定数を返すと言うことで間違いないでしょうか?

156:デフォルトの名無しさん
22/01/31 16:56:08.70 uGjzp6vA0.net
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif
これの意味がよくわからないのですが
(_MSC_VER)というマクロが使えて
かつ
その値が1200以上であるなら
#endifまでをコンパイルする。
# pragma onceはこのコードが乗っているファイルと同名のファイルが
既にインクルードされているならこのファイルをインクルードしないと言うことで
合っているでしょうか?

157:デフォルトの名無しさん
22/01/31 17:32:45.71 eqy2NGbAd.net
合ってる
URLリンク(docs.microsoft.com)
VisualStudioの1200以降の環境ならごにょごにょするって時に使う
アンダーバー+大文字で始まるマクロ(変数も)はコンパイラ側で定義するので
勝手に定義してはいけない

158:デフォルトの名無しさん
22/01/31 17:46:24.93 uGjzp6vA0.net
ありがとうございます。
メンタルやられて退職してしまったので、のんびりとブースト読んでいきます。

159:デフォルトの名無しさん
22/01/31 18:19:27.99 JSQ8RYi00.net
自前でユニークな識別子考える必要のないインクルードガードがあるなら
そっち使ったほうが間違いないしね

160:デフォルトの名無しさん
22/01/31 18:47:08.25 uGjzp6vA0.net
ヘッダファイルの先をたどって行ってよくわからなくなったのですが
ヘッダファイルが全部コメントアウトされているのですが
これはインクルードするときにコンパイラに無視されますよね?
boost/config/user.hppをインクルードするときに最初にインクルードしますって
コメントして書かれてあるんですけど、使うかもしれないから一応置いておいているのでしょうか?
それとも//を外してコンパイルすることが出来るのでしょうか?

161:デフォルトの名無しさん
22/01/31 19:08:10.67 uGjzp6vA0.net
もしかしてその名前のファイルがインクルードされているかが重要で、
インクルードする中身は関係ない的な感じでしょうか?

162:デフォルトの名無しさん
22/02/13 15:26:31.67 SDlFynth0.net
C言語において配列のリテラルはchar型(文字列)以外存在しないのでしょうか?
例えば以下のようにchar型ポインタを初期化すると、リテラル値"test"の先頭アドレスがstrに格納されると思います。
char *str = "test";
ですが、これを次のようにint型にするとエラーになってしまいます。
int arr = {10, 20, 30};
これは{10, 20, 30}が配列を表していないということでしょうか?

163:デフォルトの名無しさん
22/02/13 15:48:05.55 YeyzPZAO0.net
初期化は普通の代入と違ってプログラムを書き易くするために特殊な表現になっていることがあると覚えておいた方が良い。
で、その int 型の初期化だが、{10, 20, 30} は int の配列変数に対する初期化ではないからエラーになる。
int arr[] = {10, 20, 30}; ならエラーにならない。

164:デフォルトの名無しさん
22/02/13 15:49:17.27 YeyzPZAO0.net
ごめん。間違えた。
> {10, 20, 30} は int の配列変数に対する初期化ではないから

> {10, 20, 30} は int の配列変数に対する初期化だから

165:はちみつ餃子
22/02/13 16:21:43.07 nD0XyBZB0.net
>>159
一応はコンパウンドリテラル (複合リテラルとも言う) というものがあってこう書けなくもない。
int *arr = (int []){1, 2, 3};
だけど文字列リテラルの生存期間が常に static なのに対してコンパウンドリテラルは
それが現れる場面に応じて static な場合と automatic な場合があるのでちょっとわかり難いね。

166:デフォルトの名無しさん
22/02/13 17:48:50.08 SDlFynth0.net
配列型のリテラルは、char型のみ使用できる特殊な形と言うことですね。
ありがとうございました。
>>159の下の文のarrは*arrの間違いでした。失礼いたしました。

167:デフォルトの名無しさん
22/02/20 00:39:00.54 Pf4iignB0.net
文字列リテラルはアドレスを持つので左辺値ですよね?
いま読んでいる参考書に右辺値だと書いてあるのですが…

168:デフォルトの名無しさん
22/02/20 00:44:54.40 Pf4iignB0.net
というか、右辺値と左辺値の違いってアドレスを持つか持たないかの違いだと思っていたのですが
違うのでしょうか?

169:デフォルトの名無しさん
22/02/20 00:55:29.91 BGIr1fua0.net
え、右辺値と左辺値の違いってイコールの左辺になりえるかどうかじゃねーの?

170:デフォルトの名無しさん
22/02/20 01:39:48.34 e2U3ATgO0.net
>>164
左辺値です。「アドレスを持つか」という分類でだいたい間違いないと思います。
>>166
「イコールの左辺になりえるかどうか」は語源の話としては正しいですが、現状の語義は違ったものになっています。
規格の "lvalue" に対する脚注でも「オブジェクトに対する "locator value" を表すものと考えたほうがよいだろう」とされています。

171:デフォルトの名無しさん
22/02/20 06:54:02.60 uDi/Wll10.net
>>167
すみませぬ。
アドレスを持たないってどういうのを言うんですか。

172:デフォルトの名無しさん
22/02/20 08:47:32.72 liZElF75d.net
書き込み可能かどうかもあるだろ

173:はちみつ餃子
22/02/20 08:56:21.85 eF5vmZw/0.net
>>164
配列は lvalue だが、ポインタに変換する規則が適用された後は lvalue ではない。

174:デフォルトの名無しさん
22/02/20 09:33:21.73 e2U3ATgO0.net
>>168
たとえば数値リテラルや算術演算子の結果など。これらに対して "&" でアドレスを取ることはできない。

175:はちみつ餃子
22/02/20 09:45:32.09 eF5vmZw/0.net
>>168
仕様上の理屈ではアドレスをもたないものが右辺値 (rvalue) なんじゃなくて右辺値がアドレスを持たないので逆なんだが……。
たとえば
int a=1;
a=2;
というように変数に代入できるが、
1=2;
という式がおかしいことは感覚的にわかるだろう。
a には 1 が入っているんだから a を評価すれば 1 になるはずなのに 1=2; と同じではない。
このとき a は a に入っている値のことであると同時に場所としての性質を持つ。
アドレスを持たないのが右辺値であるのとは対照的にアドレスを持つ (場所としての性質を持つ) のが左辺値だ。
左辺値は現れる文脈によって「値 (右辺値)」に変換される。
左辺値が値に変換される場合とされない場合が上手く使い分けられているから代入が成立するわけ。
一例をあげると以下のような式の途中経過として現れる一時的な値は右辺値であるので、
単項 & を適用できずにエラーになる。
#include <stdio.h>
int main(void) {
int a=1, b=2;
printf("%p\n", &(a+b)); // a+b の結果は rvalue なので & を適用してアドレスを知ることは出来ない
}

176:デフォルトの名無しさん
22/02/20 10:14:14.54 bcGZeCSm0.net
>>168
int a;
&a //OK.これがlvalue
&1 //NG. これがrvalue
const int b = 1;
&b //OK.これもlvalue
b = 1; //NG. lvalueには書き込み可能でないものもある

177:デフォルトの名無しさん
22/02/21 00:31:16.06 Zv8l603i0.net
164です、ありがとうございます
以下の内容で理解しました
場所としての性質を持つのが左辺値、持たないものが右辺値
左辺値は場所としての性質を持つためアドレスを持つ
参考書には文字列リテラルと配列はアドレスを持つ右辺値だと書いてあります
誤植かもしれませんね
ちなみにですが関数も左辺値でしょうか?これもアドレスを持つ右辺値と書いてあります

178:はちみつ餃子
22/02/21 02:00:05.75 B02tltHQ0.net
>>174
関数については関数指示子という概念があらたに登場するのでちょっとややこしくなる。
「関数そのもの」は C では値として扱うことができないので左辺値でも右辺値でもない。
式中に関数名を書くとそれは関数ポインタに型変換されて、その関数ポインタは右辺値。

179:はちみつ餃子
22/02/21 02:20:48.63 B02tltHQ0.net
ついでの補足しておくと、
普通の関数呼出しも (言語仕様の理屈の上では) 関数ポインタに変換されてから解釈されている。
有名なネタとして
(**********printf)("hello,world\n");
というように * をいくつ付けても問題なく通る。
関数指示子が関数ポインタに (暗黙に) 変換されるという規則のせいで結局は関数ポインタとして解釈されるので。

180:デフォルトの名無しさん
22/02/21 15:15:43.51 031T4g5n0.net
C++だと関数も左辺値とされていて、そのことで互換性の問題が起こったりしていないので
性質の面で関数指示子は左辺値と大差無かったりする。

181:デフォルトの名無しさん
22/02/21 19:49:07.11 gBEocJIsd.net
宣言された関数(のポインタ)はconst左辺値の認識でいたけどC言語だと違うのか?
typedef double(*functype)(double);
functype f;
f=sin; // 可能
sin=f; //不可能

182:デフォルトの名無しさん
22/02/21 20:49:24.13 wtPLXwv80.net
関数は左辺値
ただしsizeofと代入を除きポインタに変換され
そのポインタは右辺値

183:デフォルトの名無しさん
22/02/21 23:36:20.06 Zv8l603i0.net
関数についてまとめると、
関数そのものは右辺値でも左辺値でもない、式中の関数名は関数ポインタに変換されて右辺値になる
(C++では関数は左辺値である)
初心者なので誤植があるとパニックになりますね…
どうもありがとうございました

184:デフォルトの名無しさん
22/02/22 12:55:52.35 4nLtmRUA0.net
C言語の範囲内なら用語に惑わされず振る舞いだけを考えれば
そこまで混乱することはないんじゃなかろうか (>>176 の例のような変態的なのはおいといて)
C++ の ムーブセマンティクスがなかなか なかなか

185:デフォルトの名無しさん
22/02/22 13:23:00.75 9avL3EWo0.net
URLリンク(www.toyokawa.jp)
初心者すぎる質問なんだが、C言語系のループは目的に応じて1始まりにする
必要があるとブログ記事で読んだんだが、実際はどちらが良いの?
このブログにように九九を計算して配列に入れる場合に九九だから1始まりで計算して、配列へのアクセスは-1する。
今までやっていたようにゼロからループして、計算するときに+1して、配列にはそのままアクセス。
現場だと何も考えずにゼロからループし、目的に応じてオフセットさせていたけど特にコードレビューで突っ込まれた経験も無いので。

186:デフォルトの名無しさん
22/02/22 13:27:08.07 XXijF8a20.net
プログラミング初心者なんやが、まずC言語の何からすればいいんや。
初歩的な質問ですまない。

187:デフォルトの名無しさん
22/02/22 13:27:08.07 XXijF8a20.net
プログラミング初心者なんやが、まずC言語の何からすればいいんや。
初歩的な質問ですまない。

188:デフォルトの名無しさん
22/02/22 13:27:23.55 9avL3EWo0.net
>>182
あと、比較するときも無意味だから<=や>=は使わずに<、>を使えば良いって指示は受けたことがある。
for(i=10;i<=20; じゃなく
for(i=10;i<21; とすれば文字が少なくなり間違えが減ると言ってた。
ただ、ブログをみると、21と言う数字は唐突なので10から20までループさせるのなら <=20を使うべきと書かれている。
どちらが正しいのか?

189:デフォルトの名無しさん
22/02/22 13:33:05.20 1CIJj7s5d.net
それC言語の仕様じゃなくて現場の慣例に従うべきだろ

190:デフォルトの名無しさん
22/02/22 13:44:24.82 4nLtmRUA0.net
変数を定数と比較するなら変数を右辺にもってこいとかの
文法外のコーディングルールは郷に従え としか

191:デフォルトの名無しさん
22/02/22 14:17:27.30 KAmBmnWqd.net
>>184
とりあえずHello world
これがなにか分からない場合は
カーニハン&リッチー著のプログラミング言語C
という本を何とかして手に入れろ
文庫本サイズの小さな本だが
Cの発明者が書いている本で
基本はこれでOK

192:デフォルトの名無しさん
22/02/22 15:24:23.33 9avL3EWo0.net
>>186
まあ、そうする

193:デフォルトの名無しさん
22/02/22 15:29:17.78 9avL3EWo0.net
C言語の構造体ってメモリーの割当って全てで保証されているのだろうか?
ビッグエンディアン、リトリエンディアンで異なるのは分かるのだが
全てリトル、Windowsで動くとして同じなのだろうか?
昔、アプリケーションの保存データを一つの構造体に収納し、それをそのままバイナリーとして
ディスクに出力していたのだが当時から気持ち悪く思っていた。
公式ドキュメントで保証でもされていれば良いのだが。

194:デフォルトの名無しさん
22/02/22 16:43:25.69 4nLtmRUA0.net
実行ファイルがそのままで、実行環境のOSのを行き来するならまず変わらんだろう
ソースをコンパイルしなおした結果として同じ配置になるかどうかは使ってるコンパイラ次第
ソースを別のコンパイラでコンパイルした時も同じ配置になるかどうかは使ってるコンパイラ次第
どんな場合においてもなんとかポータビリティを維持しようとするとテキスト化する羽目になる

195:デフォルトの名無しさん
22/02/22 17:47:31.50 HCzuhowO0.net
まあ
{
 char ch0;
 int int0;
}
みたいになるときは
{
 char ch0;
 char dummy[3];
 int int0;
}
って入れてるよ俺は

196:デフォルトの名無しさん
22/02/22 17:53:48.17 FDkOG5bL0.net
[3]というマジックナンバーがイヤ
詰め物の不定がイヤならmemsetでゼロクリアすれば済むこと

197:デフォルトの名無しさん
22/02/22 17:57:32.88 FDkOG5bL0.net
エンディアンを合わせて読み書きなんて朝飯前だし
構造体を渡された関数は中でfread/fwriteを1回じゃなきゃいけないなんて縛りはナンセンス
構造体の中に構造体があるときは、その構造体の読み書きも関数化しておけば何も問題はない

198:デフォルトの名無しさん
22/02/22 18:33:22.53 XFNPZHqh0.net
パディングの距離、何バイトでアライメントされるかを制御したいとなると
コンパイラ依存の #pragma に頼るわ

199:デフォルトの名無しさん
22/02/22 18:40:08.78 9avL3EWo0.net
>>191
10人規模のプロジェクトだったが、構造体のデータをそのままファイル出力してた。
特にパフォーマンスを求められる部分でも無かったので、自分でマッピングして出力したかったのだが、現状できているからと言うことで却下。
ただ、気持ち悪さは残る。案の定といってもよいが、Sun Sparkが混在したときは当然問題が出たらしい。
関係ないが、そのソフトハウスって、OracleにInsertした順序でselect出来るって信じているところもあった。
実際、そうなるが気持ち悪い。

200:デフォルトの名無しさん
22/02/22 18:52:09.49 9avL3EWo0.net
C言語で冗長化と称して同じ内容を複数の変数に書き込みバックアップをするってプロジェクトが有ったが、意味有ったのだろうか?
今でも、変数ってプログラマが意図して変更しない限り値が変わることは無いし、仮に変わったとしたらもうプログラマレベルでは対処できない問題だと思う。
あと、そんな可能性があったらループ変数だってループ中に意図せずに変わると思うが。
(ハイレベルな一般的なアプリで、OS保護下で動くもの、DMAとか他ハードウェアとメモリを共有するような低レベルな話ではない)

201:デフォルトの名無しさん
22/02/22 19:02:11.86 pG+m+rIk0.net
昔、組込みやってた時は全部ではないけど特に動作中に変化すると致命的な箇所は同内容を複数の変数に保存していたことはある
製品評価でノイズ試験やサージ試験おこなっていると意外にマイコン内のメモリのデータはよく化ける

202:デフォルトの名無しさん
22/02/22 19:03:01.04 6JePgkF30.net
疑うことを知らずに一生を終える人は幸せである

203:デフォルトの名無しさん
22/02/22 19:21:24.62 IWqq52SNa.net
>>197,198
素朴な疑問なんたが、それ不一致起こしてた場合どっちが正しいと判断してたんだ?

204:はちみつ餃子
22/02/22 19:32:40.86 xH13yj0x0.net
>>190
言語仕様としての保証はあんまりないよ。
ABI (Application Binary Interface) と呼ばれる規格を作って同じアーキテクチャでは同じレイアウトにする通例はあるし、
既存のライブラリと組み合わせられないと不都合だからだいたいのコンパイラはそれに従ってる。
x86 (64ビットも含む) については歴史的事情で Windows はマイクロソフトが決めた ABI があって、
Windows 意外 (Linux とか BSD とか) はおおよそ System V ABI を採用してる。
で、自分が作るプログラムがターゲットにする範囲 (開発環境・実行環境) で ABI が共通ならそれでいいし、
違うなら適当に切り分けて対処するとかでも問題ない。
まあ結果的に問題なかったとしても検証せずにやってたんだとしたら良くはないけどな。

205:デフォルトの名無しさん
22/02/22 19:47:53.56 pG+m+rIk0.net
>>200
不一致が起きた場合はとにかく最優先でシステムを安全に停止させる
制御不能で暴走させることだけは何としても回避する
その後はソフトリセット処理を実行して再起動させていた

206:はちみつ餃子
22/02/22 19:51:42.70 xH13yj0x0.net
PC でもデータが化けることは思ったよりも頻繁に起きているらしい。
データ破損を検出して補正する ECC と呼ばれる機構を持ったメモリもあるんだが、
コンピュータの値下げの圧力と信頼性の高い現代のメモリでは ECC は必要ないという論から ECC を付けてない機種が増えてきてる。
でもリーナスは ECC は要るにきまってんだろという感じの発言をしてる。
URLリンク(linux.srad.jp)
実際問題として化けるんだよ、化けたことを検出したり補正したりする機構がいたるところに入ってるから
アプリケーションからは気にせずに済んでるだけで……。

207:デフォルトの名無しさん
22/02/22 20:27:20.57 x7wwxQmEK.net
>>192
よく見かける手法だな。ただ、後からメンバー追加したのか以下のようなアホな事になっている件もたまにあるw
{
 char ch0;
 char ch1;
 char dummy[3];
 int int0;
}

208:デフォルトの名無しさん
22/02/22 20:27:50.66 affn0mKeM.net
「メルキオール (MELCHIOR)」「バルタザール (BALTHASAR)」
「カスパー (CASPER)」 という3つの独立したシステムによる
合議制をとっていた。

209:デフォルトの名無しさん
22/02/22 20:56:32.44 IWqq52SNa.net
>>204
パックや共用体にしとこうぜ

210:デフォルトの名無しさん
22/02/22 21:00:04.31 mN73zrRIM.net
>>204
コンパイラによるけど警告レベル上げれば検出できるぞ

211:デフォルトの名無しさん
22/02/22 21:02:51.52 9avL3EWo0.net
>>200
3箇所の変数で多数決だった。3つ違う場合はアプリ終了。
ちなみにOSのメモリ保護された普通なプログラムです。
組み込みマイコンでも、DMAアクセスされるメモリーでも有りません。

212:デフォルトの名無しさん
22/02/22 21:10:15.11 9avL3EWo0.net
>>203
>>アプリケーションからは気にせずに済んでるだけで……
なのでOSで保護された上で動くアプリケーションはデータの冗長化は必要ないのでは?
というか、データを冗長化するという方針で作られたシステムもいわゆる神経質という
設計思想があり。 データ認定?された物は3重化されて変数に保管されるが
ループのi,j,kや一時的にデータを取得するaと言った変数は多重化されていなかった。
仮に変数の冗長化が重要だと言うことになった場合。なぜデータ認定されたものだけ冗長化され
ループ変数は冗長化せずに単体で使うのかって部分に気持ち悪さを感じる。
どの変数も「平等に」食らう可能性はあると思うから。

213:デフォルトの名無しさん
22/02/22 21:17:01.78 9avL3EWo0.net
>>201
「変数をバイナリーでファイルに出力する」と聞いてリーダーに求めたのは
メモリーマップ。当然、準備しているものだと思っていた。
ただ、メモリーマップなど知らないし意味も分からない、サンプルを見てくれ?
という指示だった。
バイナリーでのデータ交換をするのにメモリーマップを定めないことに関しては今でも気持ち悪さを感じている。

214:はちみつ餃子
22/02/22 21:27:02.48 xH13yj0x0.net
>>209
> OSで保護された上で動くアプリケーションは
OS では解決できない。 だからリーナスはインテルにマジムカという話。
変数を何か所にも増やすのが意味ないというのは、それはそう。
どうやったってどうにもならんので考えるだけ無駄。
職人技でどうにかできるような規模の小さな組み込み分野ならともかく、
複雑高度なコンピュータで低レイヤが信頼できないなら信頼できない箇所にコストをかけて改善すべき。

215:デフォルトの名無しさん
22/02/22 21:56:15.32 ntDF8W1ma.net
>>208
それなら気持ちは分かる
意味は解せぬが

216:デフォルトの名無しさん
22/02/22 21:59:25.84 fFHtSmjBd.net
>>209
ハードウェアエラーが原因ならプログラムの実行バイナリも平等に化ける可能性あるよね

217:デフォルトの名無しさん
22/02/22 22:00:17.02 FDkOG5bL0.net
>>204
そんなんテスト通るんか?
テストもせずに放置?

218:デフォルトの名無しさん
22/02/22 22:07:46.87 6JePgkF30.net
アポロ計画だったか、3台のコンピュータに計算させて多数決で決めてたな

219:デフォルトの名無しさん
22/02/22 22:18:57.41 6JePgkF30.net
それとCのようにロジックが追え、時間さえあれば
人でも答えが出せる場合ではなく、
AIシステムのようにブラックボックス化していると、
複数台による合議制もあるかも知れない

220:はちみつ餃子
22/02/22 22:31:59.79 xH13yj0x0.net
深層学習ってニューラルネットワークを多層構造にしたモデルなんだよね。
AI の仕組みの中に (重みづけされた) 多数決が既に組み込まれていると言えなくもない。

221:デフォルトの名無しさん
22/02/22 23:00:22.43 9avL3EWo0.net
>>215
それなら分かる。計算結果を多数決専用のワイヤロジックで決め
また、3台の入力に戻して計算していれば。

222:デフォルトの名無しさん
22/02/22 23:05:44.26 9avL3EWo0.net
>>213
そう思う。本当に冗長化するなら、ストアされているプログラムも
カウンタ変数も信頼性は平等だと思う。
レジスタに収納されてればより信頼性が上がると言われそうだが、
ループ変数だってメモリに退避されていることが多いから信頼性は同じだと思う。

223:デフォルトの名無しさん
22/02/22 23:14:07.01 AiPUeoxY0.net
>>211
> OS では解決できない。 だからリーナスはインテルにマジムカという話。
Xeon 使えばいいだけだろ
サーバーによってはECCだけじゃなくてミラーリングも使えたりするし
URLリンク(jp.fujitsu.com)

224:はちみつ餃子
22/02/22 23:21:36.39 xH13yj0x0.net
>>220
この場合は出来るハードウェアもあるってのは反論にならないんだよ。
出来ないハードウェアが世の中に溢れてるってのが問題なんだから。

225:デフォルトの名無しさん
22/02/22 23:34:31.66 AiPUeoxY0.net
>>221
溢れてて何が問題なんだ?
リーナスは金持ってるかもしれんが世の中ECCマシンを買える奴ばかりじゃないんだし

226:はちみつ餃子
22/02/23 00:08:53.35 o4j3GXmb0.net
>>222
安ければデメリットもあるのもしょうがないといえばしょうがない話ではあるけどね。
デメリットはない (あるいは十分に小さい) と言い張ってインテルは ECC なし製品を推し進めたけど、
実際にはそうじゃないことがわかったとなれば文句を言いたくもなるだろう。

227:デフォルトの名無しさん
22/02/23 07:03:47.68 6oKgGQho0.net
>>223
> 実際にはそうじゃないことがわかったとなれば文句を言いたくもなるだろう。
そうじゃないと言ってるけど実際どれくらいあるんだ?
仕事で上に書いたようなサーバーでシステム構築してたけどメモリーエラーなんて見たことないし

228:デフォルトの名無しさん
22/02/23 08:03:17.13 FxZT1eeTd.net


229:el="noopener noreferrer" target="_blank" class="reply_link">>>210 WindowsでのBITMAPFILEHEADERとか主要なファイルヘッダの構造は全部構造体で定義されてるから気にしたことないなあ ダミーパディング込みで 気になるなら定義部分を見てみるといい 余計なパディング入れないプラグマとかも使われているはず



230:デフォルトの名無しさん
22/02/23 08:27:04.99 JOM9/OKLa.net
URLリンク(www.itmedia.co.jp)
MS「ECCメモリを標準搭載にしろ」
インテル「やだ」

231:デフォルトの名無しさん
22/02/23 08:44:18.35 FxZT1eeTd.net
>>226
> それは、Microsoftは今調べているドライバの問題から、Windows XPのシステム・アプリケーションのクラッシュの主な原因がメモリの欠陥にあることを知ったからだ。
えっ?w

232:デフォルトの名無しさん
22/02/23 09:11:50.93 pngadACwM.net
リーナスもMSもECCメモリーがーって騒ぐ前にやることがあるだろw

233:デフォルトの名無しさん
22/02/23 09:34:02.54 vebGIGPQ0.net
>>224
20年間プログラマをやってたが、勝手に値が変わっていたことは一度もない。
(全てOSで保護されたアプリケーションレベルの経験)

234:デフォルトの名無しさん
22/02/23 09:37:11.21 vebGIGPQ0.net
>>225
URLリンク(docs.microsoft.com)
これでファイルの読み書きしても良いんだ。
MS公式文書で書かれているということで、今まで引っかかっているところが解消した感じ。

235:デフォルトの名無しさん
22/02/23 09:42:44.82 hrDKDc9G0.net
昔宇宙線だかなんだかがメモリデータを破壊するとかそんな記事を読んだ気がそこはかとなく(ry

236:デフォルトの名無しさん
22/02/23 10:39:13.43 6oKgGQho0.net
>>229
万が一書き換わってても気付かない事の方が多いだろ

237:デフォルトの名無しさん
22/02/23 10:44:14.42 6oKgGQho0.net
>>231
アルファ線とか宇宙線中性子とか
URLリンク(www.hitachi.co.jp)
メモリーを心配するならFPGAも心配しろよ
URLリンク(www.hitachi.co.jp)

238:はちみつ餃子
22/02/23 11:25:09.62 o4j3GXmb0.net
>>229
勝手に書き換わっているかどうかどうやって検証したんだ?
ICE とかでわかるもんなの?

239:デフォルトの名無しさん
22/02/23 12:31:11.32 v1sPphh80.net
Windowsならメモリーエラーでブ


240:ルースクリーンになるよな



241:デフォルトの名無しさん
22/02/23 12:39:56.12 stefKGxD0.net
ならねえよ
「何となく調子悪い」PCがmemtest86で問題発覚はあるけどな

242:デフォルトの名無しさん
22/02/23 12:54:35.71 FxZT1eeTd.net
再現性がまったくないから
端子の接触不良か熱暴走で片付けられると思う

243:デフォルトの名無しさん
22/02/23 13:35:22.91 vebGIGPQ0.net
Cで変数を分散するって話は人生で一回だけ。
それ以降は、どの言語でも意図して変更していなければ絶対に変数は変わらないという事を前提にコーディングしている。
でも、問題は無い。

244:デフォルトの名無しさん
22/02/23 13:42:56.07 n4QLtIZ70.net
eccメモリ積んだサーバー使えばいいじゃん

245:デフォルトの名無しさん
22/02/23 13:44:37.23 vebGIGPQ0.net
>>231
ケースをシールドしたり、信号ラインを絶縁して対応していると思われる。

246:デフォルトの名無しさん
22/02/23 16:46:51.15 vebGIGPQ0.net
while(1){
a(&x);
if(x==1) break;
b();
}
ってコーディングを禁止している案件もあった。break文じゃなく、しっかりと条件式がfalseになるように書けとのことだった。
ただ、このやり方って入門書にも書いてある普通な方法だと思うけど。ループの中間くらいで抜けたいときはその後の処理をifで実行できないようにしていたので可読性は悪かった。
もちろん continue も封印されていた。
while(x!=1){
a(&x);
if(x!=1) b();
}
みたいに

247:デフォルトの名無しさん
22/02/23 16:49:25.49 n4QLtIZ70.net
whileの中で関数呼べばいいじゃん

248:デフォルトの名無しさん
22/02/23 17:07:12.12 FxZT1eeTd.net
inline関数ならオーバーヘッドもないはずだしな
それで何が聞きたいんじゃ?

249:デフォルトの名無しさん
22/02/23 17:08:55.71 6oKgGQho0.net
俺なら
a(&x);
while(x == 1){
b();
a(&x);
}
って書くかな

250:デフォルトの名無しさん
22/02/23 19:16:45.48 Q2o1N4Td0.net
理不尽だと思われるコーディングルールも歴史があってそうなってたりするから
長いものに巻かれるしかない

251:デフォルトの名無しさん
22/02/23 22:15:21.75 PssNo99E0.net
俺なら嫌味のように
{
bool need_break=false;
while(... && !need_break){
//前半処理
if(!(need_break=...)){
//後半処理
}
}
}
とでも書くかな

252:デフォルトの名無しさん
22/02/23 22:33:27.74 ek+gncWLM.net
for (;;)
なんでみんなこれ使わないの?

253:デフォルトの名無しさん
22/02/23 22:36:06.79 v1sPphh80.net
泣いてるみたいで悲しい

254:デフォルトの名無しさん
22/02/23 23:22:31.05 lJym8p+qM.net
あと制御文の括弧前にスペース入れるのは少数派なんだろうか…

255:はちみつ餃子
22/02/23 23:26:41.88 o4j3GXmb0.net
個々の場面で不適切でもチーム全員が適切に判断できないようなら
比較的マシそうな側に統一するルールにも合理性はある。
それとか「わからんかったらこうしとけ」みたいな口伝が
拡大解釈されていったりするのもありそうな話だ。

256:はちみつ餃子
22/02/24 00:03:57.70 KIw+63Ii0.net
>>249
Google のガイドでは if や for の後に空白を入れる方針になってる。
私は入れないけど。

257:はちみつ餃子
22/02/24 00:21:21.22 KIw+63Ii0.net
>>247
それが無限ループになるというのが読み取り難いからではないかな。
初期化やインクリメントの部分を省略したら単に何もしないのだろうと類推できるけど、
省略された条件式が真に判定されるのか偽に判定されるのかというのは例外規則として知ってなきゃわからない。
慣用句 (イディオム) と化してるので慣れてしまうと普通に読めるけど、
while(1) のほうが明示的な分だけわかりやすいのかもしれない。

258:デフォルトの名無しさん
22/02/24 00:27:00.80 DLFV0+Dqa.net
関数っぽさをなくすためにスペース空ける方がいいと思う

259:デフォルトの名無しさん
22/02/24 02:22:52.59 9O+r6lMKM.net
>>252
while文で無限ループを作れるにも関わらず
Rustではloop式を導入してる点が興味深いよね
loop文ではなくloop式なのでbreak 値; で値を返せて凄く便利

260:はちみつ餃子
22/02/24 02:31:22.55 KIw+63Ii0.net
>>254
ループとしては無限ループにしておいて break で抜けるような構造は良くないといえばあんまり良くないんだけど、
そうは言っても存在する以上はその場合を明示的に表せるような構文があると便利ってのも確かで、
そのあたりは設計思想の違いとしか言いようがないよな……。

261:デフォルトの名無しさん
22/02/24 02:44:45.66 9O+r6lMKM.net
>>255
その構造が良くないというのは自分も昔はそうだったが単なる思い込みだと気付いたw
さらにwhileは先頭でif break、do whileは最後でif breakしているだけであるし
ある程度計算を進めてから途中でようやくif breakできないとwhileだと困ることもloop式で解決された
さらにループを抜けてbreakしたい時は値を返したい時が多いからloop文ではなくloop式が非常に便利

262:ハノン
22/02/24 05:13:17.42 SpBJKMB7H.net
>>251,249
K&R2 では if や for, switch の後にはスペースを入れますね
私は基本的に K&R2 に沿って書きますが、関数の始まりを示す { は例外的に宣言に続けて書きます
int main() {
return 0;
}

263:デフォルトの名無しさん
22/02/24 06:47:25.50 iDpw9I/70.net
>>247
俺は使うよ
while(1) だと警告出るから

264:デフォルトの名無しさん
22/02/24 06:53:42.23 MBzpszCI0.net
俺もマジックナンバーがないほうが好き

265:デフォルトの名無しさん
22/02/24 08:03:43.62 PbuedMT9d.net
#define FOREVER for(;;)

266:デフォルトの名無しさん
22/02/24 08:20:28.13 MBzpszCI0.net
>>260
こう書くとbreakやgotoが嘘つきに見えるな

267:デフォルトの名無しさん
22/02/24 11:30:55.34 XK2EQ9NF0.net
#define DEATH_MARCH for(;;)

268:デフォルトの名無しさん
22/02/24 12:02:15.07 7WoYZRJzd.net
#define DISALLOW_BREAK for(;;)
#define FOREVER for(;;)
DISALLOW_BREAK FOREVER{
...
if(...)break;
}

269:デフォルトの名無しさん
22/02/24 17:23:09.91 bIfpVEhP0.net
>>261
正規表現ライブラリとか使って、複雑な制御を見えなくするのも一つの手かも?
自分のところのbreak continueは嫌がられるが、他所なら見えないので。
結局機械語になれば、中でGoto(jmp)しまくっているわけなので。

270:デフォルトの名無しさん
22/02/24 17:32:25.81 MBzpszCI0.net
jmp命令は構造化プログラミングで問題視されるgotoとは違うぞ

271:はちみつ餃子
22/02/24 17:36:24.61 KIw+63Ii0.net
抽象度が違う話だからなぁ。

272:デフォルトの名無しさん
22/02/24 17:36:30.96 MBzpszCI0.net
ダイクストラは「高級言語では」という限定をつけてgotoを問題視していたのであって
アセンブラや機械語に出てくる分岐命令はあの議論の対象外だ

273:はちみつ餃子
22/02/24 17:38:56.51 KIw+63Ii0.net
>>267
だから >>264 は見えないところでやってる分には知らんって言ってるんだろ。

274:デフォルトの名無しさん
22/02/24 17:43:46.24 MBzpszCI0.net
>>268
てことは結局何も言ってないのと同じだな
Cを使えばjmpが見えなくなるなんてくだらん話は
break continueを禁止する理由とは無関係だ

275:デフォルトの名無しさん
22/02/24 17:44:23.55 5fQRd2wi0.net
SQL埋め込みのC言語goto使いまくってた

276:デフォルトの名無しさん
22/02/24 17:50:29.88 PbuedMT9d.net
K&Rでもgotoは醜いが使わないと余計な変数や不自然な構造が必要になるからねーとクギをさしてる

277:デフォルトの名無しさん
22/02/24 17:53:57.59 8VCxJpwXa.net
コードが80x120に収まれば俺はgotoなんて気にしない

278:デフォルトの名無しさん
22/02/24 17:55:30.50 9O+r6lMKM.net
>>271
そういうのもloop式導入で解決するから導入しよう

279:デフォルトの名無しさん
22/02/24 21:02:28.06 Qe3Dm4uv0.net
抜け出しgotoは分かる
飛び込みgotoはつらい

280:デフォルトの名無しさん
22/02/25 13:00:32.72 2Pynziee0.net
構造化プログラミングを盲信する気は毛頭ないが
それは違うぞ
抜けだしであろうが飛び込みであろうが
ループの端に設定された条件に従わない分岐は
ダイクストラが問題視する対象だ

281:デフォルトの名無しさん
22/02/25 13:19:00.10 Eg3DloqN0.net
MISRA-C でも、制御パスを変える、
goto, 複数return, (多重脱出からの?)break/continue などは禁止。
だから、ループ内で、やたらとフラグを持ち回る
でも、Linux では、
早期return, goto でエラー処理をまとめたりするから、フラグを持ち回らない

282:デフォルトの名無しさん
22/02/25 13:35:54.50 aDhOSI3tM.net
>>275
そんな無意味な制約を課しているとダメなプログラマーになってしまうね
>>276
MISRA-Cは本末転倒としか言いようがないね
結局その無意味な制約によって目的としたメモリ安全性などの成果を得られなかった
その長年の未解決だった課題はRustが全く別方向からようやく解決した

283:デフォルトの名無しさん
22/02/25 16:58:20.86 2Pynziee0.net
>>277
おまえさんもダイクストラみたいに学会誌に投稿したら?

284:デフォルトの名無しさん
22/03/01 11:42:38.47 iGO9Qf02a.net
break;とかcontinue;はいいの?

285:デフォルトの名無しさん
22/03/01 12:15:17.30 qblu1Z+O0.net
switch以外のbreakは制御式にない条件での脱出
continueは違う

286:デフォルトの名無しさん
22/03/01 12:24:02.66 QP0iZO8FM.net
どこでもexit

287:デフォルトの名無しさん
22/03/03 13:53:35.02 2Y1y5HDI0.net
グローバル変数禁止プロジェクトがあって、固定値が全てリテラルでばらまかれていたので、仕様変更でチーム員は苦労してた。
自分の担当箇所は謎関数を一つ作り、そこから値を得ていた。

288:デフォルトの名無しさん
22/03/03 14:05:48.79 o7MH0vY5M.net
グローバル変数禁止なのになんで定数まで禁止なんだ

289:デフォルトの名無しさん
22/03/03 14:16:38.79 bgg8zGG60.net
>>282
グローバル「変数」と「固定」値がリテラルでばら撒かれてるのは全然違う話だが?
苦労してるのはお前さんの能力に問題があるんじゃ…

290:デフォルトの名無しさん
22/03/03 14:18:42.95 iO+E/Lewd.net
マクロは使わんのか?
ただの素人のスパゲッティだな

291:デフォルトの名無しさん
22/03/03 15:16:49.50 dDnSjvDO0.net
センス悪いやつがいるせいで
必要なものまで制限されるんだよな
ロクに精査もせずに横暴な制限を作るやつらも
センス悪いやつの一員

292:デフォルトの名無しさん
22/03/03 15:48:11.59 NNobhPIrM.net
昔グローバル変数はなるべく使わないようにねってお願いしたら、グローバル変数が関数内のstatic変数になって返ってきて状況悪化させしまったことを思い出した…
依頼は正確でないとな

293:デフォルトの名無しさん
22/03/03 15:52:02.14 nN/xu0Sn0.net
>>287
望んだ改善ではないにしてもグローバル変数よりは関数内static変数のほうがマシで、悪化はしてないのでは?

294:デフォルトの名無しさん
22/03/03 15:55:02.85 7Ur+27OW0.net
必要なものが制限されるのは腹立たしいだろうけど、
現実にセンスないやつが今、現場にいる状況で比較的マシにしようと思ったら制限も已むなし。

295:デフォルトの名無しさん
22/03/03 15:55:56.96 9ZWmTo8BM.net
君は関数内static変数の破壊力を知らない

296:デフォルトの名無しさん
22/03/03 16:02:36.91 dDnSjvDO0.net
int *just_function(void)
{
static int not_global_variable;
return &not_global_variable;
}
struct common_variables
{
int fool;
int jerk;
int idiot;
};
struct common_variables *a_function(void)
{
struct common_variables cv;
return &cv;
}

297:デフォルトの名無しさん
22/03/03 16:03:41.51 dDnSjvDO0.net
static struct common_variables cv;
だった
笑い処でミスってどうするw

298:はちみつ餃子
22/03/03 16:09:12.32 7Ur+27OW0.net
やりたいことは分割統治なんだよね。 プログラムを機能単位ごとに分割して部品にしたいの。
部品を束ねた部品があって、それを束ねて大きな部品にして……という綺麗に階層的な依存関係にしたいの。
色んなところからアクセスされるものがあるのが目に付くと綺麗に分割できてねぇなあと感じるという話であって
言語機能としての「グローバル変数」を使わないようにすれば綺麗になるというわけではない。

299:デフォルトの名無しさん
22/03/03 16:17:38.32 9ZWmTo8BM.net
グローバル変数一つ新規に作るのに何枚も書類を書かないといけないプロジェクトがあって、
その時は一つだけ管理テーブルという名称の構造体を作成登録した。
その後は必要に応じて構造体にメンバーを追加した。
追加の場合には許可がいらない。

300:デフォルトの名無しさん
22/03/03 16:23:37.12 dDnSjvDO0.net
俺のジョークそのまんまかw

301:デフォルトの名無しさん
22/03/03 16:28:52.42 rhQumEoNd.net
int型のグローバル変数が2つあればvoid*アドレスを分割して突っ込める
291みたいなstructへのポインタ突っ込んどきゃやりたい放題だよやったね!

302:デフォルトの名無しさん
22/03/04 08:30:10.22 kn6yruMU0.net
C++ の singleton クラスと
関数内static から戻ってくるのも 似たようなものになる?のか?

303:デフォルトの名無しさん
22/03/06 14:20:18.71 RiucPZY70.net
ref class SampleCls
{
internal:
property int A[int]
{
int get(int n)
{
int value = n * 100;
return value;
}
void set(int index,int n)
{
}
}
};
SampleCls objを実体化させた後に
s = s + "n= " + obj.A[i]+ "\n";
を5回繰り返したら0,100,200,300,400になったのですが
0に100をかけると100になるのでしょうか?

304:デフォルトの名無しさん
22/03/06 14:24:03.50 RiucPZY70.net
A[i]の値がどんなふうに決まっているのか知りたいのですがよくわかりません
どなたか教えていただければ幸いです。

305:デフォルトの名無しさん
22/03/06 14:42:22.06 RiucPZY70.net
すみません、解決しましたSet()とget()の動きをちゃんと理解していなかったことが
原因でした。

306:デフォルトの名無しさん
22/03/06 16:10:19.16 g5zD4gJoM.net
まず、自分が何の言語で書いてるか理解したらもっと早く答えが手に入ると思うよ…

307:デフォルトの名無しさん
22/03/07 04:27:05.03 t70FSnsj0.net
ダイクストラって名前を聞くたびに大工が屋根の上で仕事をしている姿が浮かんでしまう

308:デフォルトの名無しさん
22/03/07 06:18:54.97 RhJCMKRm0.net
キャスバルレム大工ん

309:デフォルトの名無しさん
22/03/08 12:29:53.09 Ki3D6geg0.net
アルゴリズム系でかっこいい名前はダイクストラとラグランジュ

310:デフォルトの名無しさん
22/03/08 14:05:47.68 0fUGXJlMd.net
構造化プログラミングはアルゴリズムじゃない

311:デフォルトの名無しさん
22/03/08 20:30:43.45 Ki3D6geg0.net
ダイクストラ法な

312:デフォルトの名無しさん
22/03/09 01:38:28.31 D4BPG9+J0.net
大屑虎

313:デフォルトの名無しさん
22/03/10 20:38:39.30 kXeE1dtK0.net
malloc,freeを多用すると断片化でいずれOSが落ちるってのは
Windows11やLinuxでも起きる問題ですか?

314:デフォルトの名無しさん
22/03/10 20:42:14.86 4CPsM6xv0.net
使い方間違えていればOS問わず不味いだろ

315:デフォルトの名無しさん
22/03/10 21:22:58.66 kXeE1dtK0.net
正しく使っていれば問題ないということでOK?
なんか、正しく使っていても断片化が発生するみたいなのを聞いたもので

316:デフォルトの名無しさん
22/03/10 21:47:12.08 0nt+oQbsF.net
昔のCPUならともかく
MMUを使ってるOSなら断片化しないだろ

317:デフォルトの名無しさん
22/03/10 22:40:12.59 iIk3GhqfM.net
MMUのページサイズとmalloc/freeの管理サイズは全然違うぞ

318:デフォルトの名無しさん
22/03/11 14:14:05.09 Yxv/2BSs0.net
>>308,310
断片化は発生するだろうけど、そのせいでOSが落ちるなんてことは最近のOSではたぶん無い。
断片化によるメモリ確保失敗によってアプリが落ちることはあるかもしれない。
「正しく使っていれば」という条件で質問されても何をもって正しいと言うのか示してもらわないと答えようがない。

319:デフォルトの名無しさん
22/03/11 21:28:24.41 FGXUCKCr0.net
1MiB以上と未満で挙動を分けているmallocはよく見かけるね

320:デフォルトの名無しさん
22/03/11 21:50:14.89 o502mXGNM.net
>>308
実装を知っていれば意図的にフラグメントは起こせる、という程度で気にしなければ普通起きない

321:デフォルトの名無しさん
22/03/12 00:08:34.44 NOu0XfGq0.net
>>310
32bit環境なら大きい領域は早めに確保するか、
あるいはmallocじゃなくAPIで確保したい領域のアドレスを逆方向から取得

322:デフォルトの名無しさん
22/03/12 01:41:51.18 NpUzvYny0.net
>>308
普通のアプリ動かしているだけなのにOSが落ちるとすると、そのOSは何かおかしい。OSにバグがあるのではないか?

323:デフォルトの名無しさん
22/03/12 13:07:51.07 aRaeBtiY0.net
普通に車を運転してたら事故った
車に欠陥があるはず

324:デフォルトの名無しさん
22/03/12 15:32:14.60 XvQpUkSW0.net
九州のタクシー暴走事故はプリウスのせいだと思っている。

325:デフォルトの名無しさん
22/03/12 16:34:06.63 aRaeBtiY0.net
プリウスの制御プログラムを書いた人、ここにいませんか?

326:デフォルトの名無しさん
22/03/12 18:00:40.48 WugjRoTQM.net
仮にいたとしても名乗り出ないだろw

327:デフォルトの名無しさん
22/03/12 18:10:20.20 kaM/Ypx70.net
>>318
当然、疑うことだね

328:デフォルトの名無しさん
22/03/12 18:29:57.19 0pfFD5zX0.net
ドライバーの単体テストは実施してたんですか?

329:デフォルトの名無しさん
22/03/12 23:53:51.20 NpUzvYny0.net
>>318
それは今回の話には当てはまらない。普通のアプリを動かしていたらアプリが落ちた、だったら当てはまる。
今回の話を喩えるなら普通の車を運転していたら道路が陥没したみたいになる。OSの方が落ちたんだから。

330:デフォルトの名無しさん
22/03/12 23:56:33.44 aRaeBtiY0.net
そうか?
池袋事故では最後まで車の欠陥を主張してたぞ
普通にって表現は、あくまでも本人の主観だからな

331:デフォルトの名無しさん
22/03/13 00:27:55.58 8TmiOcWs0.net
上級国民は医師に運転を止められていた欠陥アプリなので、譬喩に用いるには特殊すぐる。

332:デフォルトの名無しさん
22/03/13 00:30:40.49 giayljWn0.net
事故起こした奴って自分が原因だと思ってないだろう

333:デフォルトの名無しさん
22/03/13 06:05:08.20 g8VV1ENe0.net
常に自分を疑え、なんて根性論めいた主張には興味ないし
弁護士に譲歩的なことを言うなと指示されて本当に思っていることと違うことを陳述するのもこの議論とは関係ない

334:デフォルトの名無しさん
22/03/13 06:10:49.96 kdm08K3Td.net
>>308
多用、ってのがおかしいな
一ヶ月も動かし続けてたらどうしても多用になる
それで落ちるようなことはWin95とかの時代の話だろ

335:デフォルトの名無しさん
22/03/13 11:39:10.82 HQz48e8Z0.net
>>308
malloc,freeを多用すると
解放し忘れが多くなり
メモリが断片化して
新規メモリが確保できなくなってエラー吐いてんのに
エラーチェックもせずにポインターにアクセス
そしてプログラムが落ちる
さらにOSを巻き込んでPCごと落ちる
でも今時のOSは生半可なことでは巻き込まれない

336:デフォルトの名無しさん
22/03/13 17:40:39.42 5qwn5s+60.net
解放し忘れ(メモリリーク)と断片化は別概念
16byteを4回確保した後に1回目と3回目で確保したメモリだけ解放すると、
合計32byte空いてるのに飛び地になってるから32byte領域として扱えない

337:デフォルトの名無しさん
22/03/13 22:53:37.11 A2eUK16/a.net
malloc/freeを多用すると解放忘れが多くなるものなのか?

338:デフォルトの名無しさん
22/03/14 01:27:18.72 OOlFm33n0.net
そりゃプログラムがおかしいだけ

339:デフォルトの名無しさん
22/03/14 10:46:27.63 z8DyGqYY0.net
C言語ではなくスクリプトだが、
無限にSubdirを掘り続ける奴書いて動かしたら、OS落ちたな
XPだったが

340:デフォルトの名無しさん
22/03/14 11:00:21.69 GQP59fXj0.net
fork爆弾みたいな実験か

341:デフォルトの名無しさん
22/03/14 16:40:21.91 LP3GQSIPd.net
OS名はあえて書かないが
Visual C++のmallocで1GBを256回確保しただけで落ちたな

342:デフォルトの名無しさん
22/03/14 17:46:29.09 OOlFm33n0.net
Windowsは昔から落ちやすい印象
なんというか、OS自体もなんか少しユルい上にみんなして色んなドライバ作って組み込むもんだから余計に落ち易くなってんじゃないかな。

343:デフォルトの名無しさん
22/03/14 17:51:09.33 L/zgcwZ50.net
Win98で512バイトぐらいをいくつmalloc出来るかと試したことがあって、
10万回ちかくでNULL返した・・・いや、1万回だったかな?。
とりあえずOSもアプリも落ちなかった。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch