C言語なら俺に聞け 158at TECH
C言語なら俺に聞け 158 - 暇つぶし2ch200:デフォルトの名無しさん
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もアプリも落ちなかった。

344:デフォルトの名無しさん
22/03/15 21:09:49.60 uaV7elHUM.net
>>249
教えられてないし誰も知らないしwhile(1)で事足りるから
::printfとかもな
わざわざ使ってるやつはアホだと思う

345:デフォルトの名無しさん
22/03/15 21:12:16.49 oV08M4Ak0.net
あなたの基準では世界中アホだらけやな

346:デフォルトの名無しさん
22/03/15 21:19:55.67 uaV7elHUM.net
一部のバカに対して言ってる
マジで::printfなんて使ってるやつなんて滅多にいない

347:デフォルトの名無しさん
22/03/15 21:22:08.63 uaV7elHUM.net
誰も使ってない表記法使うアホのせいで改めて調べないといけなくなる
使われてないから敢えて教科書に書かれてないし教科書に書かれてないんだから知らないやつが多数派ってことがわからんバカ

348:デフォルトの名無しさん
22/03/16 00:50:46.44 HRRT9pv8r.net
知らなくて馬鹿にされたのかな?辛かったね、大変だったね。カワイソウニ(´;ω;`)ウッ…

349:デフォルトの名無しさん
22/03/16 05:23:40.43 sZ1wd+Ly0.net
有効範囲解決演算子はスレ違いだぞ

350:デフォルトの名無しさん
22/03/16 13:21:40.48 IYkrMFX0r.net
Cに namespace の概念ってある?

351:デフォルトの名無しさん
22/03/16 13:45:31.87 EozDCnXud.net
gotoラベル
構造体のtag名
構造体のメンバ名
それ以外
という概念のnamespaceならある
typedef struct A{int A;} A;
int main(){ A: return 0;}
で4種類のAを区別できるというだけで、ns::A とかの話ではないが

352:デフォルトの名無しさん
22/03/16 14:57:34.41 IYkrMFX0r.net
ああ
それぞれで固有の識別子を記憶する空間があるから ぱっとみの文字が衝突しててもセーフ
という概念か
コンパイラ記述するときにめんどくさそうね
文意からこっちのテーブルを参照すべきとか

353:デフォルトの名無しさん
22/03/19 11:24:46.11 fvSihUDg0.net
初歩的な質問ですが、
b = a++;
という式はbにaの値を代入してからaをプラス1しますが、
演算子の優先度を考えると、++が優先度高く、=は右優先です
優先度の高い++をしてから代入するように感じるのですが
そうならない理由をご教示ください

354:デフォルトの名無しさん
22/03/19 11:57:41.89 VgIBj69P0.net
a++が返す値は、aをインクリメントする前の値だからだよ

355:デフォルトの名無しさん
22/03/19 12:07:43.36 X795CU5ld.net
b=a++;
のインクリメントが実行されるのは式を評価した後

356:デフォルトの名無しさん
22/03/19 12:40:35.63 fvSihUDg0.net
返信ありがとうございます
演算子の優先度を調べると++が=より優先度が高いはずです
式の処理は優先度の高い演算子から処理されると理解しています
そうすると、++が先に実行された後で=(代入)が実行されてもおかしくないと
考えたのですが、どこに誤りがあるのでしょうか?

357:デフォルトの名無しさん
22/03/19 12:53:26.53 UXt2lmR80.net
そういう時のために
++i
i++
ちゃんと2種類の書き方が用意されてるんだよ

358:デフォルトの名無しさん
22/03/19 12:55:08.49 d0FibUHe0.net
>>351
> 式の処理は優先度の高い演算子から処理されると理解しています
これが間違い。演算子の結合優先度と式の評価順は別。

359:デフォルトの名無しさん
22/03/19 12:56:54.66 X795CU5ld.net
演算子の結合順位と副作用完了点の概念は別
というか b=a;a=a+1; を1文で書くためにa++ 周りのの仕様を特別扱いして実現してる

360:デフォルトの名無しさん
22/03/19 13:30:03.55 fvSihUDg0.net
返信ありがとうございます
++、--の場合は、前置、後置で
式の評価順が通常と異なると覚えました
式の評価順を理論から理解していないので
忘れてしまって失敗するかもしれませんが、
そのうち定着すると思っています

361:デフォルトの名無しさん
22/03/19 15:38:29.74 CZI3HevE0.net
よくわからない場合や使うと分かり辛くなる場合は使わないで冗長な書き方した方が良いかも知れない。
使わなくても最近のコンパイラは最適化掛ければ適当にうまいことやって最終的に作られるコードは同じになる可能性が高いと思う。

362:デフォルトの名無しさん
22/03/19 17:00:25.72 mw5TX/57a.net
b = a++;
の右辺を評価した結果は aの元の値で、副作用として aのアドレスにあるオブジェクトをインクリメントしているのでは
代入されるのは aの内容でなく、アドレスを持たない値で

363:デフォルトの名無しさん
22/03/19 17:03:51.29 mw5TX/57a.net
a++ は右辺値で、 ++a は左辺値

364:デフォルトの名無しさん
22/03/19 17:12:51.80 X795CU5ld.net
どっちも右辺値としないとまずい
int main(){
int a=0;
int* p;
p=&(++a); // コンパイルエラー
p=&(a++); // こっちも
}

365:デフォルトの名無しさん
22/03/19 17:42:57.61 mw5TX/57a.net
そうだね、失礼しました

366:デフォルトの名無しさん
22/03/19 17:50:05.80 nPptgbtB0.net
: BassClass(
std::format (IdPrefix, index, numBank)),(
std::format (NamePrefix, ++index, numBank))
ちょうどこんな感じのコンストラクタでラッパーするコード書いてたんだけど
インクリメントしてない方までつられて増えちゃうんだよね
C++のコード片でスマソン

367:デフォルトの名無しさん
22/03/19 18:11:19.38 8Fsv/onud.net
d = ++a + b-- + --c + a++;
この結果は
++a;
--c;
d = a + b + c + a;
b--;
a++;
だよね
実際はこんな書き方しないほうがいいがw

368:デフォルトの名無しさん
22/03/19 18:25:12.86 d0FibUHe0.net
>>362
> d = ++a + b-- + --c + a++;
> この結果は
++a と a++ とが順序付けされないので未定義動作。

369:デフォルトの名無しさん
22/03/19 18:39:08.49 Uza1/JxDM.net
両方未定義じゃね?
>>361 の方はちょっと自信ないが >>362 の ++a + a++ はダメだったような気がする

370:デフォルトの名無しさん
22/03/19 19:05:15.57 9SMEw2CG0.net
以下のような関数がインラインで実行されてるだけで、評価自体は++が先に行われてるんでないの?知らんけど
int inc(int* a) {
int ret = *a;
*a = *a + 1;
return ret;
}

371:デフォルトの名無しさん
22/03/19 19:10:54.79 fJWxsuK3a.net
引数の評価順なんてCPUでも変わるだろ。

372:デフォルトの名無しさん
22/03/19 20:25:22.26 hj0ig94x0.net
未定義動作警察だ!
未定義動作の動作は定義されていないのでコンパイラは何をしてもいい
> d = ++a + b-- + --c + a++;
このコードの場合、
++a;--c;d=...; b--;a++;相当のコードを吐いてもいいし、
tmp=a;a=tmp+1;--c;d=...; b--;a=tmp+1; 相当のコードを吐いてもいい。
大抵は未定義動作がないことを前提に最適化をかけるが。
極端なことを言えば、d=42としてもいい。
この文の見た目の動作は定義されていないから

373:デフォルトの名無しさん
22/03/20 00:26:15.18 dAApHicf0.net
fgetsのファイル終了・エラー時の戻り値がNULLなのはなぜですか?
他の入出力関係の関数の戻り値はEOFになっています
いま入出力の勉強をしてるんですが、関数の引数や戻り値が少しずつ違うので覚えるのが難しいです
使っていくうちに覚えていくものでしょうか?

374:デフォルトの名無しさん
22/03/20 00:53:13.92 tmhbCmKs0.net
細かな仕様はよく使うもの以外は毎度調べるよ
まあCの関数は数が少ないから全部覚えてるって人も少なくないかも

375:デフォルトの名無しさん
22/03/20 00:57:50.69 rKPZjyik0.net
よく使う関数の戻り値調べると面白いぞ
printfが何を返しているかとか、それは何故なのかとか
戻り値を使っている人を見たことがないけれど

376:はちみつ餃子
22/03/20 01:37:41.92 u4Grkyrm0.net
>>361
こういう場合については未定義ではないが未規定の動作が含まれる。
副作用完了点の間で同一のオブジェクトに複数回の書き換えが生じた場合には未定義の動作となるが、
書き換えが一度の場合はその書き換えがどのタイミングで起こるかわからないというだけで、
未定義の挙動にはならない。

377:デフォルトの名無しさん
22/03/20 08:21:37.14 e7HuEm7id.net
>>368
fgetsの戻り値は文字列へのポインタであり
いっぽうEOFは文字(じゃなくてintだけど気分的には)なのだ

378:デフォルトの名無しさん
22/03/20 10:46:46.29 +oGVYZOT0.net
組み込みのソフトしていると
使わない関数が多くて忘れていきます

379:デフォルトの名無しさん
22/03/20 11:48:15.83 w4XPcyomd.net
<stdio.h>は使えないとして組み込み系って使える標準ライブラリあるの?

380:デフォルトの名無しさん
22/03/20 12:55:28.41 DiBIkIVz0.net
windows.h

381:デフォルトの名無しさん
22/03/20 13:05:34.82 w4XPcyomd.net
使える標準ライブラリを聞いたつもりなんだが
あと<Windows.h>はOS依存のライブラリな

382:蟻人間
22/03/20 13:25:28.64 y5NxTTYed.net
標準っていっても何の標準かわからん。
ANSI CとかC89とかあるだろ。

383:デフォルトの名無しさん
22/03/20 13:41:32.19


384:ID:w4XPcyomd.net



385:デフォルトの名無しさん
22/03/20 13:42:12.13 e7HuEm7id.net
それぞれ組み込むシステムに付属してるだろ
一元的な名前はない
ひょっとしたらstdio.hという名前かもしれない

386:デフォルトの名無しさん
22/03/20 14:14:31.30 4KnLtgrc0.net
組み込みって言っても小さくても Linux 動いちゃうようなのもあるし、何とも言えんな。

387:デフォルトの名無しさん
22/03/20 14:19:28.79 BOo0cJz/a.net
string.h は普通に使えた

388:はちみつ餃子
22/03/20 17:31:23.40 u4Grkyrm0.net
C の規格は「規格合致ホスト処理系」「規格合致フリースタンディング処理系」を規定していて、
フリースタンディング処理系はライブラリとして float.h iso646.h limits.h stdarg.h stdbool.h stddef.h stdint.h の内容に限定している。
この範囲なら実行環境に左右されずに用意できるはずという判断なんだろう。

389:デフォルトの名無しさん
22/03/20 19:31:33.68 w4XPcyomd.net
組み込み向けの最低限の規格があるのか
#defineとtypedefしかないが
なるほどこれなら環境がどんなにショボくても用意できそう

390:デフォルトの名無しさん
22/03/20 20:07:23.09 mxx3UMQ+0.net
ファイルディスクリプタを使ってEOFを知りたいんだけどどうしたらいい?
普通にreadすりゃ0になるからわかるし、そもそもファイルなら



391:求めたサイズより小さく読めるからわかるけど ちょうどぴったりでreadしたあとに、つぎのreadをせずに知りたい feofとかファイルポインタだで使えんがや



392:デフォルトの名無しさん
22/03/20 20:57:34.02 cOd2oDpEM.net
unblocking modeでopenしたfdをreadして判定すれば

393:デフォルトの名無しさん
22/03/20 22:28:44.17 aLyHOWc60.net
ファイルのサイズを取得して、そこへseek するとか?
そもそも、ファイルを開いて、ファイルの終わりにseek できるかも。
元々、ファイルの追記モードもあるぐらいだから

394:デフォルトの名無しさん
22/03/20 22:54:16.07 pl7vy6aed.net
>ちょうどぴったりでreadしたあとに、つぎのreadをせずに知りたい
そもそもreadが終端まで来たらつぎにreadしてもファイルアクセスせずに0を返すから同じだろう

395:デフォルトの名無しさん
22/03/20 23:19:06.05 dAApHicf0.net
>>372
よく分かりました
ありがとうございます

396:384
22/03/21 16:21:59.97 nqBLTVDb0.net
>>387
後出し情報であれやけど
readしたデータをどこかに送信、最後のデータには最後フラグを立てる
みたいなやつなので、ぴったりのときに困ってたんよ
バッファを2面用意して、すぐ送信せず常に1回貯めて送信するのが
正解なんだろうなぁ・・・ まあいいけど

397:デフォルトの名無しさん
22/03/21 17:02:36.51 geQt3ukX0.net
ファイルサイズと読み出し位置から残りサイズ計算するぐらいか?

398:デフォルトの名無しさん
22/03/21 18:07:17.68 bPJRBgFUM.net
>>389
ファイルサイズわかってるならlseek(fd, 0, SEEK_CUR) で現在位置調べりゃいいだけかと

399:デフォルトの名無しさん
22/03/21 21:41:26.44 nqBLTVDb0.net
一応、ファイルじゃないときのことも考慮したかった

400:デフォルトの名無しさん
22/03/21 22:38:50.94 j56ex+kVd.net
ファイルディスクリプタが0とか"/dev/stdin"という名前のファイルを考慮し始めたらそれはもう無理じゃ?

401:デフォルトの名無しさん
22/03/21 23:41:34.24 /12E7ImH0.net
なんかバグやセキュリティホールの温床になりそうだな。

402:デフォルトの名無しさん
22/03/21 23:55:00.11 avj/Dp0k0.net
キャッシュとか、同期・非同期処理とか、ブロックされる・されないとか、
ブロックデバイス・シーケンシャルかとか、リダイレクト・パイプとか、
共有の有無とか、メモリ内共有かどうかとか、
そんな事を考えだしたら、キリがない
なんせ、Linux API の7割は、IO の説明だから、10年以上掛かる

403:デフォルトの名無しさん
22/03/22 02:05:16.87 vyk85loe0.net
1バイト単位なら fdopen() しちゃって FILE * でバッファリングさせた方が楽だな。feof() も使えるし。
1バイト単位ではなく1000バイト単位とか、大きい塊でバッファリングする必要がある場合は自作して feof() みたいなチェックができるようにする。
(それでも FILE * でのバッファリングがあった方が遅いストレージにあるファイルなら読み出し効率上がると思うが)。

404:デフォルトの名無しさん
22/03/24 22:37:34.92 jD8pMP9K0.net
以下はライブラリバージョンが1より大きければ処理を有効する例です
#if LIBRARY_VERSION > 1

#endif
この「LIBRARY_VERSION」は何者ですか?
どこに定義されているのでしょうか?

405:デフォルトの名無しさん
22/03/24 23:58:11.94 ItLF0V9z0.net
>>397
少なくとも標準仕様ではどこにも定義されてないです
説明のための例では?

406:デフォルトの名無しさん
22/03/24 23:59:45.82 bdM8JANZ0.net
MSVC環境ならカーソル合わせてF12キー押せばいい
gccとかは知らん

407:デフォルトの名無しさん
22/03/25 00:14:08.19 sET9XTXv0.net
>>397
独習Cからの抜粋と予想して記載します
複数の開発環境で同じヘッダファイルを使用する際の



408:宴Cブラリバージョンの差異でエラーとなるのを防ぐための テクニックです 各自が自分の開発環境に合わせて #define LIBRARY_VERSION 1などと 定義する必要があります



409:デフォルトの名無しさん
22/03/25 06:50:38.08 0hAphrOld.net
いえ、それはそのライブラリの作者(メンテナンスしてる人)が標準ヘッダ内で定義すべき内容です
ユーザーは>>397を自分のファイル内で使用してバージョンの差異を吸収できます

410:デフォルトの名無しさん
22/03/26 01:22:16.42 EYuSPLit0.net
>>398,400,401
説明のための例のようですね、失礼しました
あと、この定数が未定義の場合の値は0になるのですね
そのあたりを理解していませんでした
どうもありがとうございました

411:デフォルトの名無しさん
22/03/26 16:05:05.08 EYuSPLit0.net
コンパイル(リンク)時に、同じプロジェクト内の別ソースの関数などを呼び出せるのはなぜ?
インクルードして教えてる訳でもないのに、もしかして全ソースを探しに行ってるんですか?

412:デフォルトの名無しさん
22/03/26 17:27:18.26 T/pJeR6z0.net
全ソースから探し出すのがリンク
includeとかで関数宣言だけは見えるようにする必要はあるが。
main.c
-----------
char* func(int size);
int main(){
char* p=func(16);
}
-----------
funcという名前の関数は、
前方宣言(1行目)してるのでリンク時に探しに行く。
リンク時の解決用に定義した関数(とその実装)を.objファイルに一覧としてまとめる。
リンクという作業では、.objと.libと.dllから"func"という名前の関数を探し出す。
見つからなかったり2つ以上見つかったらリンクエラーになる。
古いCだと前方宣言がなければ int func(); 決め打ちで前方宣言扱いしたりする。

413:デフォルトの名無しさん
22/03/26 18:26:49.41 kmPIEuI7d.net
>>403
(古典的な)Cではアセンブラソースに変換してアセンブル→リンクされるが
通常の関数名や変数名はアセンブラのグローバルシンボルに変換され
リンク時に他のアセンブラソースから参照できるようになる
一方関数内のローカル変数やstatic宣言された関数や変数はローカルシンボルとして扱われ他のアセンブラソースからは参照できなくなる

414:デフォルトの名無しさん
22/03/26 23:45:36.64 EYuSPLit0.net
よく分かりました、ありがとうございました

415:デフォルトの名無しさん
22/03/27 21:02:14.58 angONFKk0.net
グローバル変数の修飾子の意味は次の意味で合っているでしょうか?
修飾子なし:変数の実体を定義
extern修飾子:定義済みの変数を参照する
static修飾子:変数の実体を定義して、その変数を他のファイルからexternさせない

416:デフォルトの名無しさん
22/03/28 11:08:20.21 c4HYTfCO0.net
適当にググって見つかったexternとstaticの解説
URLリンク(daeudaeu.com)
URLリンク(daeudaeu.com)

417:デフォルトの名無しさん
22/03/29 00:24:04.59 c+1KPnOj0.net
>>408
そのサイト含めいろいろ見て、それをまとめたのが>>407です
念のためどなたかに確認していただこうかと思って書き込みました

418:デフォルトの名無しさん
22/03/29 06:11:36.84 7UUvIzLId.net
そんなに信用されてもw

419:デフォルトの名無しさん
22/03/29 08:18:01.14 C0VnxRTv0.net
自分で色々なパターンでコンパイルして確認しないのかな?って思う。

420:デフォルトの名無しさん
22/03/29 08:55:46.71 tKmNrPY6d.net
正確な意味を知るには解説サイト見て回るより規格書見るほうがいい
URLリンク(real-c.info)

421:デフォルトの名無しさん
22/03/29 13:03:41.11 M0Gs9C4cM.net
llvm-14 の、ソースツリーの外にcmake ディレクトリができる下品な感じ、なんとかならないの?

422:デフォルトの名無しさん
22/03/29 15:17:04.78 X58TTE+20.net
>>413
cloneしたディレクトリの直下にbuildディレクトリ作ってそこでcmake ~ ../llvmじゃいかんの?
今どきソースのディレクトリで直接ビルドしないのは下品というより上品ではないですか

423:デフォルトの名無しさん
22/03/29 18:15:06.70 U1DxU1KgM.net
>>414
>ソースツリーの外に
下品

424:デフォルトの名無しさん
22/03/29 18:20:46.45 1zZAboUWM.net
ソースツリーの中にbuildフォルダ作るのは上品なん?

425:はちみつ餃子
22/03/29 18:47:55.98 4oPH291+0.net
autotools でも out-of-tree build は出来るようにするのが一般的な作法。
あらゆるプロジェクトでそうしているというほどではないと思うけど、ごく普通にある。

426:デフォルトの名無しさん
22/03/29 22:23:02.11 X58TTE+20.net
URLリンク(llvm.org) を見るとソースフォルダの外でビルドしなきゃいけないような感じに書いてあるけど、
URLリンク(clang.llvm.org) を見るとリポジトリ直下にbuild作ってそこでビルドすればいいように書いてあるから、llvmはお上品にビルドできるのですわ

427:デフォルトの名無しさん
22/04/01 12:18:00.47 BXJ/mUbsM.net
llvm-14
まだゴミw
色んなものがダメになるw

428:デフォルトの名無しさん (ワッチョイ 6fb3-7L1B)
22/04/12 19:31:59 B1tFLWvv0.net
char buf[256];
memset(buf, NULL, sizeof(buf));・・・(1)
memset(buf, 0, sizeof(buf));・・・(2)

(1)と(2)同じ事をしていると思うのですが、どっちで記述するのがメジャーですか?

429:蟻人間 ◆T6xkBnTXz7B0 (スフッ Sd02-qTly)
22/04/12 19:35:46 Dt0TGPDOd.net
NULLはポインタだから(2)が正しいよ。

430:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a23e-vtdv)
22/04/12 20:06:33 5njWaFr40.net
>>420
言語仕様に厳密にいうと前者で初期化しようとした場合に buf が 0 で初期化されることは保証されないし、
コンパイルエラーになることもありうる。

整数定数式の 0 がポインタに変換したときに空ポインタになることは保証されるので
NULL が単に #define NULL 0 として定義している環境もよくあるんだが、
仕様上の NULL は「処理系定義の空ポインタ定数に展開する」ということになっていて
整数の 0 を書ける文脈に NULL を書いて通るとは限らないんだ。

そんで「整数定数式の 0」がポインタに変換されたときに空ポインタになることは保証されるが、
定数式ではない文脈での整数の 0 は空ポインタになることは保証されていないし、
逆に空ポインタを整数に変換したときに 0 であるとも限らない。
if 文などの制御式としてポインタを置いても問題ないのは C の制御式は !=0 が補われたかのように動作するというルールのおかげ。

431:デフォルトの名無しさん (ワッチョイ 6fb3-7L1B)
22/04/12 20:07:57 B1tFLWvv0.net
>>421-422
お早いレスサンクス
わかりました

432:ハノン
22/04/20 22:16:48.28 vxzn/db60.net
>>422
>整数の 0 を書ける文脈に NULL を書いて通るとは限らないんだ。
可変長引数にあるあるの最後に (char *)0 (なんで char * なんだ?)なんかがいい例ですね

433:デフォルトの名無しさん (ワッチョイ 97b3-4qoo)
22/04/22 15:01:50 YxI2bgUE0.net
(ソースtt.c)
#include <stdio.h>
#include <math.h>

void main()
{
double d;
int a;

d = 1.234;
a = round(d);
printf("%d\n", a);
}

$gcc tt.c
/tmp/cc0NPwg6.o: 関数 `main' 内:
tt.c:(.text+0x23): `round' に対する定義されていない参照です
collect2: error: ld returned 1 exit status

こんな短いソースなのに解決できない。助けてー(´・ω・`)
OSはLinuxです

434:デフォルトの名無しさん
22/04/22 15:04:48.71 SxzvmxoM0.net
どうせリンクしてないとかそんなんだろ

435:蟻人間
22/04/22 15:05:51.08 BJPJNuGwd.net
>>425
古いコンパイラにはroundがないかもしれない。

436:蟻人間
22/04/22 15:06:16.30 BJPJNuGwd.net
-lm

437:デフォルトの名無しさん
22/04/22 15:12:16.74 SxzvmxoM0.net
gccなら -lmで動的リンクする簡易オプションがある、プログラム内だけで完結したいならコンパイラ付属のmathライブラリのソースも含めてコンパイル

438:デフォルトの名無しさん
22/04/22 15:14:29.72 SxzvmxoM0.net
動的リンクだとmathは浮動小数点の扱いが実行環境に依存するので静的リンク推奨

439:デフォルトの名無しさん
22/04/22 15:26:22.00 YxI2bgUE0.net
ありがとう
gcc tt.c -lm
でコンパイル通りました。

440:デフォルトの名無しさん (スププ Sdbf-DCm/)
22/04/22 15:44:53 I04xh82td.net
割とよく使う標準ライブラリなのに一々リンク方法をユーザーに選択させるという事の意義を考えるように、おまじないじゃないぞ

441:デフォルトの名無しさん
22/04/22 17:13:59.15 RFW8R+x+d.net
roundかtruncかfloorかはたまたceilかもしれないrintとその一味のヤバいやつら
こんなもんさっさと追放しろよ

442:デフォルトの名無しさん
22/04/22 17:31:11.41 SxzvmxoM0.net
整数型で表せない整数をdoubleで表したい時も稀にある
どうせ前後の整数(±1)は表せない不連続すきっ歯領域だし、どう丸まろうが影響無い部分だよ、って意図の明示に

443:デフォルトの名無しさん
22/04/22 17:49:02.83 SxzvmxoM0.net
用途は思い浮かばないでもないが、適切に使われてないケースが多分99%

444:デフォルトの名無しさん
22/04/23 13:45:19.22 +Gd9xYyP0.net
表せないときは整数型多倍長処理作る

445:デフォルトの名無しさん
22/04/24 11:54:23.21 S9c+iUdl0.net
GMPでそ
C++じゃないとちょっと使いにくいけど

446:デフォルトの名無しさん (ワッチョイ 51e6-DWDP)
22/04/24 15:18:10 Qwrn6LYl0.net
>>437
激しく同意
スレリンク(tech板:84番)

447:デフォルトの名無しさん (スフッ Sd94-6n8/)
22/04/25 03:24:41 LAuA6+3Dd.net
多倍長整数とか言ってる人は意図汲めてなくね?

正確性も表現力も不要だけど、それでも整数に相当する巨大数が要るのは極を利用した求根アルゴリズム(方程式解法)とかでしょうよ

たとえば、求めたい関数fの根がその逆数関数1/fの極と等しい事を利用するとか

もしdoubleの範囲を多倍長整数/任意桁数演算で308桁を陽に扱必要があるけど、そもそも極判定は指数部のみで行えるわけで、各桁の数字を陽に保持する意味が無い


一方で指数が巨大なdoubleを生で足すのは悪手
丸めれば各々の積分経路での評価値は真値から一旦遠ざかるけど、一貫した丸めを行う限りは10000万回も足せば互いに相殺されて均される

448:デフォルトの名無しさん
22/04/25 03:38:21.89 LAuA6+3Dd.net
ちょっと拵えすぎたような設定だったかもしれないけど、300桁を陽に保持して、ハードウェアの恩恵も無しに一万回加算とか、向かないどころかあまりにも非現実的過ぎる例もある
という例程度に
あとdouble使ってればinfが返ってくる可能性があるのが最大の利点
もしinfを引き当てられれば、それを与正入力がその浮動小数点実装における最高精度の解だと理論的に保証される

449:デフォルトの名無しさん
22/04/25 03:44:18.07 LAuA6+3Dd.net
訂正と補足
それを与正→与えた入力
(1/f)(x)→inf

f(x) → 0

fの根はそのx
は論理的に同値

450:デフォルトの名無しさん
22/04/25 05:05:51.34 ueJIdSJ50.net
INF見付かれば恣意的に収束/発散閾値を調整しなくてエレガントだよな
俺は素性の事前に分かってて留数定理使えるような関数くらいしか扱わないから、気にせずそのまま足しちゃうわ
積分経路は(楽だから)正方形に取り、均等に4分割して極のある範囲を再帰的に絞り込んでる、下手にニアミスしたりするとかえって桁落ちしたりして整数倍からズレる
±0.1くらいなら、きっと極を囲めてるものと想定
Cで数値計算入門みたいな本で勉強してるけど、浮動小数点の特殊値とかエラーの扱いとかの記述が一切抜け落ちてて困る

451:デフォルトの名無しさん (スフッ Sd70-6n8/)
22/04/25 19:15:48 o7ajKrF0d.net
実質ハードの実装に収束(発散)判定任せて綺麗に見えてるだけだがな
しかし比較無しに符号、複素数なら東西南北まで得られるのは便利

452:デフォルトの名無しさん (ワッチョイ 73b3-jUKb)
22/05/09 06:57:39 Egg1/KgR0.net
20年くらい前、Windows98が使われてた頃なんですが
char s = ''; // ←シングルクォーテーション2個
っという書き方が許されてた記憶があるんですが、記憶違いかな?
今Linux上のgccでコレをコンパイルすると「error: empty character constant」になる

453:デフォルトの名無しさん
22/05/09 07:35:16.71 QnLN+NJ0a.net
あえてなのかバグなのかは知らんけど20年前のコンパイラがそういう記法を通してたってだけだろ

454:デフォルトの名無しさん
22/05/09 08:27:27.53 Egg1/KgR0.net
>>445
冷静に考えてみたらコンパイラもOSも違うからそういうことだな

455:デフォルトの名無しさん
22/05/09 10:42:17.80 qGH53jdv0.net
''で何が代入されるの?

456:デフォルトの名無しさん
22/05/09 11:12:38.36 DLFHVgdp0.net
'\0' や 0 と同等の動作なんかねぇ

457:デフォルトの名無しさん
22/05/09 11:15:27.95 DuxsXAR8M.net
普通に考えれば空文字だと思う

458:デフォルトの名無しさん
22/05/09 11:35:54.50 lTlzTKNA0.net
NULL 「何もないよー」な意味をあらわす単語
空文字 長さ0文字の文字列のこと
この解釈でOK?

459:デフォルトの名無しさん
22/05/09 11:37:44.15 DLFHVgdp0.net
文字と文字列は違う 今話題に上がってるのは文字のほう

460:デフォルトの名無しさん (ラクッペペ MMe6-PUK/)
22/05/09 12:02:23 ItS/vT2KM.net
長さ0文字の文字列なら""(ダブルコーテーション)では?

461:デフォルトの名無しさん (アウアウウー Sa1f-KEdX)
22/05/09 14:03:39 KBCMvYUWa.net
>>448
まあそれが一番ありがちかと

462:はちみつ餃子
22/05/09 17:13:19.74 9vSL2/iz0.net
>>444
言語仕様にはそれを通す規定は見つからないな。
少なくとも一文字は必要であることになってる。
C89 ではすでにそうなってるし、後の仕様でも変更はない。
出来る処理系があったのだとしたらあくまで処理系の拡張。
「たとえば 'ab' などのように二文字以上を含む場合は処理系定義」という意味の規定はあるので
雑に任意個の文字を受け付けるようにしたらうっかり 0 個も通してしまったとか、
意図的ではない挙動 (コンパイラのバグ) だった可能性もあるし。

463:デフォルトの名無しさん
22/05/09 17:32:30.12 x5IK3MV30.net
立方根を自作関数で求める方法教えてください、、、、、

464:はちみつ餃子
22/05/09 17:46:08.50 9vSL2/iz0.net
>>455
要件次第だけど実装が一番簡単なのは log を使うことだと思う。

465:デフォルトの名無しさん
22/05/09 17:47:02.53 x5IK3MV30.net
>>456
ニュートン法を使いたいです、、

466:はちみつ餃子
22/05/09 17:50:27.78 9vSL2/iz0.net
>>457
方法がわかってるなら何をききたいの?

467:デフォルトの名無しさん
22/05/09 18:03:26.90 jsi1f5HY0.net
何も入っていない変数が作れます

468:デフォルトの名無しさん
22/05/09 18:36:55.77 4JqWZIdB0.net
だからその
> 何も入っていない
は0から0xffのうちの何なのよ。
1 Byteの領域はあるんでそ。

469:デフォルトの名無しさん
22/05/09 18:39:59.52 jsi1f5HY0.net
そこは未知の領域

470:デフォルトの名無しさん
22/05/09 19:59:08.45 UxqgrJa1a.net
>>460
ネタに全力で食いつくなよw

471:デフォルトの名無しさん (ワッチョイ ea02-zDU0)
22/05/09 20:46:46 poYUryAv0.net
一番簡単なのは挟み撃ちだと思うけどな
1の三乗は
0.5の三乗は
と1/2づつ狭めていく

472:デフォルトの名無しさん
22/05/10 09:30:11.65 79aB+w7Md.net
>>450
NULLはポインターに代入できる「無意味な位置」を表すアドレス

473:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-PvPk)
22/05/10 11:28:15 dIEMLhL70.net
だいぶんボケたことを書いてしまった。 (>>456)
式変形をする必要すらなく pow ひとつで良かった。

double cube_root(double x) {
return pow(x, 1.0/3);
}

474:デフォルトの名無しさん
22/05/10 19:36:27.76 gxi5OEx30.net
それを自作関数で求めるとは言わんやろ

475:デフォルトの名無しさん (ワッチョイ 6aad-zDU0)
22/05/10 23:29:45 CQsKbFR90.net
言うだろう

476:デフォルトの名無しさん
22/05/11 06:53:21.08 zyEQjrH3d.net
コンビニ弁当買ってきて料理したというレベル

477:デフォルトの名無しさん
22/05/11 10:08:25.28 jCepvp6u0.net
通はコンパイラの自作から始める?

478:デフォルトの名無しさん (ブーイモ MMd6-RieT)
22/05/11 10:35:21 a8uVrD+/M.net
情報学科ならCPU設計からだよ

479:デフォルトの名無しさん (ラクッペペ MMe6-PUK/)
22/05/11 10:39:55 3yHJq16kM.net
CPU設計だと情報学科なのか電子工学科なのか微妙なところ

480:デフォルトの名無しさん (ワッチョイ be63-PvPk)
22/05/11 10:43:04 jCepvp6u0.net
CPU設計ソフトを作る事から

481:デフォルトの名無しさん
22/05/11 12:00:05.99 2wozbOYLd.net
普通は自作関数作りたいんですって言ったら
>>463みたいなアルゴリズムを求めてるだろ
何の用途かは知らんが

482:デフォルトの名無しさん
22/05/11 12:53:38.63 rJ/SGv8Sa.net
>>471
素子の物理設計からなら電子工学
アーキテクチャからなら情報工学
じゃね?
まあ素子の物理設計なんてやってる学校があるかどうかは知らんけど

483:デフォルトの名無しさん
22/05/11 12:57:11.03 3n2UFvlUM.net
CPU設計の半導体物性や加工技術は情報学科の範疇外だと思う

484:デフォルトの名無しさん
22/05/11 21:22:30.22 Uorg83Yar.net
>>455
もう解決したってことでいいよね

485:デフォルトの名無しさん (ワッチョイ 7e02-jKFb)
22/05/11 23:25:04 eEErnLrt0.net
>>457
精度を組み込み関数より高めたいのかな?
なら一回で十分だよ、ループする必要も収束を確かめる必要もなくて、
y-=fx / f'x
だけで数桁精度が上がる

486:デフォルトの名無しさん
22/05/12 00:07:01.33 a2iZs8ls0.net
たぶんニュートン法を使いたいけどアルゴリズムを実装できないだけだと思うな

487:デフォルトの名無しさん
22/05/12 00:13:44.54 rHUhttMxr.net
反論がないし解決したってことで

488:デフォルトの名無しさん (ワッチョイ 1746-OCox)
22/05/12 03:09:36 DwGZHhAI0.net
simulink coderが便利すぎて手打ちする気にならない件

489:デフォルトの名無しさん
22/05/14 10:01:08.50 JFqjXnq80.net
>>444
許されていないよ
char *ss = “”;
char ch = ‘a’;
の記憶違いでしょう

490:デフォルトの名無しさん
22/05/14 10:23:10.43 yelWKEO3d.net
char ch = NULL;
という書き方ならよく見かけた
これはもちろん間違いなのだが

491:デフォルトの名無しさん
22/05/14 15:45:11.14 fRXCxvkXd.net
>>444 これどうなったの



493:デフォルトの名無しさん
22/05/15 13:21:26.16 evMzyiSb0.net
'' が使えるかどうかはコンパイラ次第なのでは?
文法的にダメだろうがなんだろうが使えるようにコンパイラ作られたらそれまでだし。
そういやGCCにも void * の変数に ++ とかの計算が出来たりして衝撃を受けたことがあったなあ。
他のコンパイラでコンパイルしてエラーになって発覚。

494:デフォルトの名無しさん
22/05/15 13:31:38.71 +H3bKj0ad.net
キャスト式に代入とかね

495:デフォルトの名無しさん
22/05/15 13:39:44.18 tGTiPFBf0.net
void *型のインクリって一体何バイト進むんだ?

496:デフォルトの名無しさん
22/05/15 13:48:28.89 +dMN0zqr0.net
>void *型のインクリって一体何バイト進むんだ?
codepad のC言語 → 1バイト
codepad のC++ → エラー
ISO C++ forbids incrementing a pointer of type 'void*' compilation terminated due to -Wfatal-errors.

497:デフォルトの名無しさん
22/05/15 13:53:41.23 evMzyiSb0.net
>>486
1だったよ。char * と同じように計算していた。
お近くの gcc でお試しください。

498:デフォルトの名無しさん
22/05/15 14:00:59.60 tGTiPFBf0.net
即レスサンキュー

499:はちみつ餃子
22/05/15 14:07:27.97 PUHmRytO0.net
gcc だと sizeof(void) が 1 を返したりするんだよな。
C++ だとこれがエラーになることを SFINAE のトリックに使ったりすることもあるんで、
どうやって辻褄を合わせているのかよくわからん。

500:デフォルトの名無しさん
22/05/16 14:17:30.76 KxReCtrr0.net
こういう質問が来るたびに自分で試せばいいのにって思う。
仕様がどうなってるのかという質問なら理解できるけど。

501:デフォルトの名無しさん
22/05/16 20:01:48.66 YQrK3HARa.net
いや、マニュアル読めよ...
URLリンク(gcc.gnu.org)

502:デフォルトの名無しさん
22/05/17 11:31:17.17 HihepIbQd.net
単に好奇心で聞いてるだけだと思うよ
実用的に使おうと言うんじゃなく
というか関数ポインタも1バイトになるのかw

503:デフォルトの名無しさん
22/05/17 11:43:19.86 VUKzLr9a0.net
何か有用な使い道ってあるか?

504:デフォルトの名無しさん (ワッチョイ eb69-wjZZ)
22/05/17 17:06:43 FuWQL0zJ0.net
汎用ポインタとして void * で受けておいて
char * でキャストすることなく そのポインタを 1バイト単位で操作できたとしても
*で実体を取得する瞬間にキャスト必須になるし どうなんだろ

505:デフォルトの名無しさん (スップ Sd03-m0tN)
22/05/17 18:02:18 HihepIbQd.net
ただのうっかりミスだと思うんだが
修正するとコンパイルできなくなるんで仕様にしてしまったのか

506:デフォルトの名無しさん
22/05/17 18:51:17.67 Qbd65aeba.net
>>493
> というか関数ポインタも1バイトになるのかw
んなわけないだろw
関数ポインタは普通に4/8バイトだよ
関数のサイズが1バイトになる
URLリンク(codepad.org)

507:デフォルトの名無しさん (ワッチョイ 5b63-yvGd)
22/05/17 19:17:06 kg0MHFY+0.net
バグからさめると別のバグの世界のような気がする。

508:デフォルトの名無しさん
22/05/17 20:20:31.65 HihepIbQd.net
>>497
君以外はみんなわかってる気がするw

509:デフォルトの名無しさん
22/05/17 21:01:08.19 xzGoH14A0.net
>>495
Cスタイルキャストだとあまり気にならないかもしれないけどC++スタイル2回重ねるのはちょっと嫌になる。

510:デフォルトの名無しさん
22/05/17 21:09:29.94 JCWwsd/Ra.net
>>499
関数ポインタが1バイトとか言ってたアホがいたんだけどw
てかお前意味わかってないだろ

511:デフォルトの名無しさん
22/05/17 21:17:57.23 VUKzLr9a0.net
>>501
文脈を踏まえれば >>493 が言ってるのは「関数ポインタでも (インクリメントで進む量は) 1 バイト」というのは理解できるだろ……。

512:デフォルトの名無しさん
22/05/17 21:26:34.47 cXB/OW/Na.net
文脈?
> gcc だと sizeof(void) が 1 を返したりするんだよな。

> というか関数ポインタも1バイトになるのかw
恥の上塗りかよw

513:デフォルトの名無しさん
22/05/17 21:35:35.34 xzGoH14A0.net
>>503
↓これを踏まえてのsizeof(void)だろ。なんでポインタそのもののサイズが出てくるのよ。
>void *型のインクリって一体何バイト進むんだ?

514:デフォルトの名無しさん
22/05/17 22:33:22.42 HihepIbQd.net
>>503
お前がな…

515:デフォルトの名無しさん
22/05/17 22:45:15.36 pcmvPs1uM.net
>>503
お前よりはな

516:デフォルトの名無しさん
22/05/18 07:47:41.31 PdG/XNB8a.net
スレチだったら申し訳ない
とあるフリーソフトが起動しなくてdllファイルを読み込んでないのが原因っぽいんだけど
VSでdumpbinを使って関数を調べた所LNK4044のエラー 〇〇.dllは無効です、無視されます
との文が出るんだがこうなるともうdllに原因があるから対処しようがないってこと?
ここから修復出来る方法ありますかね

517:デフォルトの名無しさん
22/05/18 11:53:43.44 bslzKqYb0.net
>>507
状況によるのでその情報からだけではわからない。

518:デフォルトの名無しさん
22/05/18 14:03:00.61 G19C49df0.net
ぶっ壊れではなく、OSにVCランタイムが入ってない可能性
Dependency Walker (URLリンク(www.dependencywalker.com)) で
その DLL をトレースしてみて、そいつが vcランタイム 要求していないか確認する
(そして古いverのVCランタイムをどうやって入手するかという話に)

519:デフォルトの名無しさん
22/05/18 14:10:31.11 G19C49df0.net
>>500
C++ だと void * のインクリメントがエラーになるので C限定のお話やね

520:デフォルトの名無しさん
22/05/18 22:34:39.58 CFFEhoB20.net
ガチ初心者なんやが、まず何すればいいん?
HtmlとCSSだけ少し触ったことがある

521:デフォルトの名無しさん
22/05/18 22:40:25.27 E1vMcGgB0.net
ガチ初心者なら、なにもC言語に手を出さなくても……

522:デフォルトの名無しさん
22/05/18 22:52:35.00 yp09HIZB0.net
何が目標なのかを書いてみて

523:デフォルトの名無しさん
22/05/19 05:23:54.79 UJCwwVidd.net
>>510
それgcc限定のお話だな

524:デフォルトの名無しさん
22/05/19 07:44:23.05 KBg+aMKFd.net
>>511
こういうよくある質問
何答えればいい?ってなるよな

525:デフォルトの名無しさん (スプッッ Sddb-f+Gq)
22/05/19 09:14:35 TZT0OIWkd.net
へてむるとCSSてことは、関心事はネットかな?

526:デフォルトの名無しさん
22/05/19 12:14:13.87 kqStXWIg0.net
>>511
世の中は流動的で、何が正解なのかは後にならないとわからない。
正解の道筋があるわけではなく、たくさんの知識があればどれかが役立つこともあるってだけ。
最初は物量だ。 詰め込め。

527:デフォルトの名無しさん
22/05/19 18:09:46.73 KBg+aMKFd.net
こういう奴はめんどうくさいことが嫌いで
とにかく近道が行きたくて聞いてるので
目的地なんて知らんとにかく近道教えろ!ってことなので
教えようがないんよ

528:デフォルトの名無しさん
22/05/20 00:03:31.03 SEOso9Vd0.net
すみません、visual studio communityを使っています
関数は呼び出すより前に定義の必要があることが分かりました
ですがソースファイル(.c)を分けて、一方に関数を定義すると定義する順番を気にせず使えます
インクルードが必要だと思いますが、インクルードせずに関数を呼び出せます
何故でしょうか?

529:デフォルトの名無しさん (ワッチョイ eb69-yvGd)
22/05/20 00:55:01 tfeu1OX00.net
>>519
> 関数は呼び出すより前に定義の必要があることが分かりました
いいえ、宣言しておけば定義は後でもいいです

> インクルードが必要だと思いますが、インクルードせずに関数を呼び出せます
しなくてもできるってことは必要じゃないってことです

530:デフォルトの名無しさん
22/05/20 01:27:17.95 1uCl4yv30.net
>>519
#include等の先頭に#が付いたやつはCコンパイラに処理を引き渡す前にソースのテキストに対して行われる編集を指示するものだ。
つまり #include で何かファイルが指定されていたらそのファイルを読んできてその行に挿入する。そしてそれからコンパイルが行われる。
なので #include で指定するファイルの内容を直接そこに書いてしまっても結果は同じになる。

531:デフォルトの名無しさん (ワッチョイ efd2-ydBh)
22/05/20 03:28:01 QfqNLeQw0.net
>>519
C言語では関数宣言がなくても関数っぽく使われてるものがあったら int func(); の宣言があるものとして決め打ちする。
.hとかで前方宣言してなくてもコンパイルは通る。
利用側の.cでは引数の数と型と返り値型が分からんが、合ってれば問題なく使える。

間違ってた使い方をしたときにエラーを出せないから極力避けるべき(コンパイラによっては出るかもしれんが)
この仕様はエラーを見つける観点からすればクソなので、長い歴史があるC言語以外では採用されてないはず

532:はちみつ餃子
22/05/20 05:08:48.27 YhZHNcJW0.net
暗黙の関数宣言は仕様から削除されてるよ。
C99 の時点でもう項目がない。
互換性の都合で出来るようにしてある処理系も多いと思うけど
警告くらいは出てるはずだと思うんで読み飛ばさずにしっかり見て欲しいな。

533:デフォルトの名無しさん
22/05/20 06:35:34.02 QdnN/13A0.net
まあわかるんだけど
K&R Cの楽しさがどんどん消えていく寂しさが・・・

534:デフォルトの名無しさん
22/05/20 08:04:15.92 px60Na0ad.net
みんな>>519の意味がよくわかるな
というかこれらの解答であってるの?

535:デフォルトの名無しさん
22/05/20 08:18:47.95 xUD6u/k80.net
昔大学の授業で使ったTurbo Cで
printf()等がincludeせずに使えた。
warningぐらいは出てたかも。

536:デフォルトの名無しさん
22/05/20 09:35:03.59 qCLhnuk6r.net
警告出てもコンパイル通ることあるよね
大学のシステムプログラミングの授業の教科書のサンプルコード、インクルード不足で警告よく吐いてた

537:デフォルトの名無しさん
22/05/20 10:00:52.44 px60Na0ad.net
どんなコードでもラベルがどこかで定義されてる限りコンパイル・リンクはできるんだよ
実行時に望みの結果にならなかったり最悪保護エラーになったりするだけ

538:デフォルトの名無しさん
22/05/20 10:12:25.64 mW5NTdIj0.net
コンパイルエラー・リンクエラーになるコードなんていくらでもあるだろ何言ってんだ。

539:デフォルトの名無しさん
22/05/20 10:15:14.87 px60Na0ad.net
ほら変なのが絡んできたw

540:デフォルトの名無しさん
22/05/20 12:57:31.73 xUD6u/k80.net
動的リンクってやつかな?
C言語はDOS時代に独学でやってたんで(大学はコードの書き方しか教えてくれんかった)どうしても
「宣言だけしておけばコンパイルは通るけど、リンク時に実態が無いとエラーになる」
ってイメージが。

541:はちみつ餃子
22/05/20 14:41:08.78 YhZHNcJW0.net
>>531
無関係。
動的リンクは実行時にリンクする (いわゆる DLL とか so とか) 仕組みで、ホスト環境側の機能。
暗黙の関数宣言は暗黙に宣言する言語機能。

542:デフォルトの名無しさん
22/05/20 16:18:15.28 px60Na0ad.net
ごちゃごちゃしてきたな
>>519に戻って「プロトタイプ宣言しなくても参照できるのは何故か」と言えば
古典的Cでは関数名は単純にfunc()→_funcというアセンブラシンボルに変換してるだけなので
別のソースでも同じ名前で定義してさえいればリンクは通る
ただCでは引数をスタックに積んで呼び出すので引数の数や順番が関数と呼び出し側で統一されてないと引数を正しく処理できないので見つけにくいエラーを起こしたり最悪スタック上の戻りアドレスを書き換えてしまって停止する
だからインクルードファイルでプロトタイプ宣言して統一しようということ
C++では[関数名_引数の数や種類]というアセンブラシンボルに変換するので、正しい引数で呼び出さないとリンク時に見つからないと言われる
それ以前にプロトタイプが必須になってるけど

543:デフォルトの名無しさん
22/05/25 01:22:00.94 gs0SnL//M.net
519です
遅くなってすみません
皆さんありがとうございました
まず、宣言と定義の違いを理解していませんでした
同一プロジェクト中の別ソースにある関数を、宣言しないで呼び出せるのが何故か知りたいです
戻り値がint型だと暗黙の宣言で使えるようですが、戻り値がchar型の関数を呼び出せます
関数を呼び出すより前に宣言されているはずなので、先に関数を記述したソースが解析されているということ??
試しにその関数をmain関数の後に持ってくると当然コンパイルエラーになります
恐らく>>533に頂いた回答が近いと思うのですが、リンクを理解していないためか理解できません…
勉強不足で質問するのも申し訳ないのですが、ご回答いただけると嬉しいです

544:デフォルトの名無しさん
22/05/25 01:31:16.14 Q47fXgzra.net
呼び出せないと思ったほうが良い

545:はちみつ餃子
22/05/25 01:35:46.79 9QZiEKx+0.net
>>534
コンパイラは宣言の辻褄が合っていると「仮定して」処理する。
宣言の辻褄が合うようにするのはプログラマの責任。
辻褄が合ってないときにどうなるかは言語仕様上は未定義のなのでなんとなく動いているように見えてもあてにならない。

546:デフォルトの名無しさん
22/05/25 09:42:18.14 mSxNHOMI0.net
C言語に慣れない頃はmain関数はファイルの最後に書いて、
呼び出される順番にソースの上の方に関数追加していったわ。
-----ccc.c-----
int FuncB(){
return 1;
}
int FuncA(){
return FuncB();
}
int main() {
return FuncA();
}

547:デフォルトの名無しさん
22/05/25 10:12:31.53 dvdfNrTHa.net
>>537
呼び出しじゃなくて依存の順序で書くね
宣言はなるべく書かない!

548:デフォルトの名無しさん
22/05/25 10:18:58.73 aeVycjmX0.net
間接再帰ができない間だけ通用する

549:デフォルトの名無しさん
22/05/25 11:11:34.92 f6RSTkPjd.net
>>537
簡単なプログラムで急いで書いてる場合や
関数の仕様を手探りで作りながら書いてる状態ならそんなでもいい
ただFuncBからもFuncAを呼び出すようになった場合困るから

550:デフォルトの名無しさん
22/05/25 11:27:04.22 f6RSTkPjd.net
>>534
何を悩んでるのかよくわからないが
今のCPUは8ビットレジスタなんて持ってないので戻り値がintでもcharでも戻り値の入ってるレジスタは同じになる
だから戻り値charの関数を暗黙のint関数として呼び出しても結果は特に問題なく使えるはず
ただ8ビットより上のビットにゴミ(不定値)が入ってる可能性はある

551:はちみつ餃子
22/05/25 11:49:22.28 9QZiEKx+0.net
>>541
(現代の一般的な) 呼び出し規約的には区別がないので動的リンクだと割と問題なさそうだが、
最適化が絡むと何がどうなるか想像もつかない。

552:デフォルトの名無しさん
22/05/25 11:52:13.52 aeVycjmX0.net
やはりCを上っ面でなく根っこから理解するにはアセンブラの知識も必要だな

553:デフォルトの名無しさん
22/05/25 12:06:51.94 mSxNHOMI0.net
コンパイラやアセンブラのnパス(ソースを読み下す回数)って仕様を思い出した。
DOS時代にアセンブラは2パスでCコンパイラは1パスが普通だと聞いて、
Cで先に関数/変数を宣言、定義しないとエラーになるのは1パスでコンパイラが知らない関数/変数が出てくるからだと思ってた。
正しい理解かは知らない。ラベルとかはgotoの後に出てくることもあるし。

554:はちみつ餃子
22/05/25 13:02:50.97 9QZiEKx+0.net
>>544
バックパッチで処理できるのでコードの頭から読みなおす必要はないよ。
知らない名前が出てきたときに型かもしれないし変数かもしれないってのでは構文解析が難しくなるが
goto の後ろにくるのはどこかで定義されているラベルだと決め打ちできるから単純な処理でいける。
(gcc だとアドレス (を生成する式) を goto に与えることも出来るように拡張されてるからもうちょっと複雑なことをしてると思う。)

555:デフォルトの名無しさん
22/05/25 16:04:37.76 ppEY2jmgd.net
gccはプロセス置換なんかで生成した一時ファィルを食わせられないから、少なくとも2回以上はソース通読してると思われる

556:デフォルトの名無しさん
22/05/25 19:05:44.16 pzbMw6fx0.net
関数コメントを書く場所だけど、
➀ヘッダファイルの関数プロトタイプ宣言の頭に関数仕様コメントを書く
②Cファイルの関数実装本体の頭に関数仕様コメントを書く
③両方に同じ内容を書く
のどれが今の多数派?
昔は②が多かった印象だけど最近は➀が主流なのかな?

557:デフォルトの名無しさん
22/05/25 19:22:25.67 6XrkLlxn0.net
外部仕様ならユーザーに読ませるからヘッダだし、内部仕様なら逆に見せるべきでないから本体、とかだろ。

558:デフォルトの名無しさん
22/05/26 07:54:06.06 BbTLBX4q0.net
将来Libファイル化とか考えると①の方が合理的かなとは思う。
VisualStudioの関数参照で、自動でコメントも表示されたと思ったけど、
そのときは①と②どっちが優先だったのかな?

559:デフォルトの名無しさん
22/05/27 16:12:39.64 01BAkppM0.net
質問失礼します
あるCのプロジェクトを見ていて
typedef struct X X;
struct X { ... some fields ... };
って記述がソース中の随所で見受けられますが、これ以前にもstruct Xの宣言がないのにtypedefできるのが非直感的に感じられます。これはtypedefを宣言するのと同時に、初めてここでstruct Xも宣言しているってことなのでしょうか?

560:デフォルトの名無しさん
22/05/27 17:20:28.72 HNJHF6TRd.net
それは構造体メンバーの中にその構造体自身へのポインタを含めさせるためのトリックじゃなかったかな
struct HOGE{
  色々なメンバー…
  struct HOGE *next;
};
とやろうとするとHOGEの定義はまだ終わってないのでundefinedエラーになる
typedef struct HOGE STRUCT_HOGE;
struct HOGE{
  色々なメンバー…
  STRUCT_HOGE *next;
};
これなら通るはず(?)

561:デフォルトの名無しさん
22/05/27 17:23:59.27 Dxs4BKy40.net
え?それ大丈夫じゃなかったっけ?

562:デフォルトの名無しさん
22/05/27 17:32:35.88 Dxs4BKy40.net
struct でメンバの定義がない不完全型はポインタ変数のみ宣言出来るので再帰的なやつも大丈夫だ。
ポインタはサイズが分かるから。
ポインタでない普通の変数はサイズが分からないので作れない。

563:はちみつ餃子
22/05/27 17:59:48.73 /qASUmj+0.net
>>550
その場合の typedef struct X X; の struct X は C99 の 6.7.2.3 にある
「不完全構造体型又は不完全共用体型を宣言し,その型のタグとして識別子を宣言する」
に該当する。
つまり struct X の宣言にもなっているという解釈で正しい。
あえて typedef を先に書く必然性はないんだが……
仕様にはこういう形でも書けるという例が載っているので考えなしに真似してるだけかもしれん。

564:デフォルトの名無しさん
22/05/27 18:06:40.28 01BAkppM0.net
>>554
詳しい説明ありがとうございました
確かによくよく考えると
typedef struct X { ... some fields ... } X;
と同じでしたね
こちらは違和感ないんですけど確かにこちらもいきなりtypedefのdeclspec内でstruct X { ... some fields ... }初めて使ってますね

565:デフォルトの名無しさん
22/05/27 20:53:33.56 v5HQQ34i0.net
struct Y;
struct X {
struct Y* next;
};
struct Y は struct X と同じでした

566:デフォルトの名無しさん
22/05/27 22:59:30.30 Uk6q3si00.net
エアプ使いばかり

567:デフォルトの名無しさん
22/05/28 11:23:05.30 81XaDMLN0.net
typedef struct X {
struct X *hage;
char a[0];
} X;
これはokだが
typedef struct X {
X *hage;
char a[0];
} X;
これはだめやろ

568:デフォルトの名無しさん (アウアウウー Sac5-MppQ)
22/05/28 13:26:19 CfHVy9pGa.net
よくてもよさそうだけどなあ

569:はちみつ餃子
22/05/28 15:18:56.42 IqCM7SI40.net
C++ ではアリだが、それはそれとして配列の大きさは 0 は駄目だよ。

570:デフォルトの名無しさん
22/05/28 18:03:45.61 2wkU6YYXa.net
配列要素0個はgccの拡張やね、標準規格に取り込んで欲しいわ

571:デフォルトの名無しさん
22/05/28 18:11:56.00 I3uIL+k90.net
いっそのこと要素数指定無しの配列も認めて欲しい

572:デフォルトの名無しさん
22/05/28 18:22:29.20 GsM4WAAy0.net
>>562
それはポインタと何が違うのん?
もしかして自動reallocとか?

573:ハノン
22/05/28 18:26:01.93 HcUv+NxjH.net
>>560-561
C99 ではすでに取り入れられた可変長構造体ですが、C++ ではまだなんですかね?
URLリンク(www.kouno.jp)


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