回答編集履歴

2

更に追記

2020/05/16 16:43

投稿

nac_tnk
nac_tnk

スコア494

test CHANGED
@@ -107,3 +107,17 @@
107
107
  上にも書いたように、tは399までです。範囲外にならないように自分で管理すべきです。
108
108
 
109
109
  今回は、参照だけだったので動きましたけど、書き換えを含んでいたらフリーズです。
110
+
111
+
112
+
113
+ <更に追記>
114
+
115
+ 実際にUNOでこのスケッチを走らせたらほぼ同じ結果になりました。(「ほぼ」は全部を確認した訳では無いという意味です)
116
+
117
+ で、tのアドレスとprime[400]のアドレス見るコードを追加したところ、やはり一致(10進で1103)していました。
118
+
119
+ (※コードを追加する事で変数の並びが変わる事もあり得ますけど、出力内容は変わりませんでした)
120
+
121
+
122
+
123
+ なので、上述のように動作していると断定していいと思います。

1

追記

2020/05/16 16:43

投稿

nac_tnk
nac_tnk

スコア494

test CHANGED
@@ -49,3 +49,61 @@
49
49
  実質的には21進数になっているようです。
50
50
 
51
51
  (Serial.print(t,21);相当)
52
+
53
+
54
+
55
+ ********
56
+
57
+ ついでに言っておくと、
58
+
59
+
60
+
61
+ > int limit=(int)pow(x,0.5);
62
+
63
+
64
+
65
+ これは初期値で右辺の結果が代入されるだけで、毎回計算される訳ではありませんから。
66
+
67
+
68
+
69
+ > int primelist[8000];
70
+
71
+
72
+
73
+ UNO等はSRAM2kBです。なので、2*8000=16kBの変数(配列)は使えません。
74
+
75
+ 今回は、プログラム上で使われていませんから、書いていないのと同等の扱いです。(最適化)
76
+
77
+
78
+
79
+ > while(true) {
80
+
81
+ > s=prime[0];
82
+
83
+ > break;
84
+
85
+ > }
86
+
87
+
88
+
89
+ 一度だけ行って抜けるのならwhileは不要です。単に
90
+
91
+
92
+
93
+ s=prime[0];
94
+
95
+
96
+
97
+ と書けばいいです。
98
+
99
+
100
+
101
+ > Serial.println(prime[t]);
102
+
103
+ > t+=1;
104
+
105
+
106
+
107
+ 上にも書いたように、tは399までです。範囲外にならないように自分で管理すべきです。
108
+
109
+ 今回は、参照だけだったので動きましたけど、書き換えを含んでいたらフリーズです。