C++相談室 part139

■ このスレッドは過去ログ倉庫に格納されています
2018/10/06(土) 00:59:48.54ID:CdYUXXMG0
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part137 (正しくはpart138)
http://mevius.5ch.net/test/read.cgi/tech/1535353320/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1530384293/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)

----- テンプレ ここまで -----
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2018/12/23(日) 17:41:57.71ID:Wgmswpxd0
最近、QueryPerformanceCounter() を使って色んな速度測定をしていたら、
32バイトくらいの memcpy() でも、数マイクロ・セカンド位(1.0*10^(-6)(s))かかる事が分かった。
ちなみに、1クロックは、3.3 * 10^(-10) 位なので、たった32バイトに1万クロックくらいかかって
いる事が分かった。
ためしに単純な for ループと DWORD *ptr で転送してみても結局、それ位の
小さなサイズだと、同じくらいかかることも判明。
同じマシンでも、もっと大きなサイズのコピーだと、for ループで行っても、
1回のループで、4クロックくらいしかかからない。

推測だが、jmp 命令は、10バイト程度前の番地に戻る程度でも、ループ回数が
少ない場合は、物凄く極端に遅いが、ループ回数が多くなるとなんと1クロックで
実行できるようになるらしい。

ただし、余り定かではない。
2018/12/23(日) 17:45:32.05ID:Wgmswpxd0
それか、QueryPerformanceCounter() の精度の問題かもしれない。
いくらなんでも、32バイトで1万クロックは遅すぎるように思う。
ちなみに、Sleep(1000); とすると、ちゃんと、1.0 (s) と表示されるので、
速度の計算ミスではないはず。
2018/12/23(日) 17:57:02.41ID:Wgmswpxd0
そうか、これは、RDTSC 使ってないのか・・・。
「高分解能」と言っても、1.0 マクロセカンド位の精度だったとは、予想外・・・。
2018/12/23(日) 19:37:24.93ID:V9dsb1PW0
スレッドのディスバッチ、キャッシュのヒットミス、パイプラインストール、バスのI/O待ち、etc…。
memcpy1つとってもそうそう単純なものではない。
2018/12/23(日) 19:56:30.39ID:AQ4G8Wg10
>>768
引数がどんな型を持つ関数を渡すかを事前にどこで決めるかが問題だし、
それ事前に決められるならクロージャーの必要性は低くなるだろ。
あと資源解放のタイミングをどうするかを明示させるシンタックスってのは多分相当難しい。
その辺、クロージャーを用意する言語は普通はGCに任せる。
2018/12/23(日) 20:38:33.04ID:swCrUp5Z0
クロージャって関数とその外側の環境を合わせたものだろ。
「関数を渡す」って何がどこに関数を渡す話なんだろうか。
2018/12/23(日) 21:40:29.80ID:AQ4G8Wg10
色々シチュエーションは考えらるだろうけれどreactなら
var ChildInput = React.createClass({
_onChange: function (e) {
this.props.onChange(e.target.value);
}
}
)
とかするやつをイメージしてる。
2018/12/23(日) 22:50:15.98ID:zy+sQveZ0
キャッシュミスは犯罪です。
2018/12/23(日) 23:48:12.36ID:UknIutZS0
>>774
>クロージャって関数とその外側の環境を合わせたものだろ
それは新たな関数を作ったことになるんじゃー
>>748
> int X = 10;
> Hoge hoge(X);
という部分は、f(a, b) = a + b + 10という関数を作ってゐる
Xを変えることによってg(a, b) = a + b + 9とかh(a, b) = a + b + 8とか
Hogeクラスのクロージャでいくらでもバリエーションを作れる
2018/12/24(月) 00:09:16.83ID:MCFE6K0T0
>>777
>>748で言えばHoge::operator()が関数でm_xがその外側の環境だろ。
そこで関数を渡すとか作るとかあるいは静的型チェックと相性が悪いというのが
どういうことを言っているのかわからん。
関数オブジェクトを作ってるというならわかるけど。
2018/12/24(月) 01:08:30.96ID:+hyoXfJx0
C++ のラムダ式は関数オブジェクト生成の構文糖でしかないので、
従来と比べて特に良くなったり悪くなったりするわけはない。

オブジェクトの寿命の管理がやりづらいってのは C++ では今更な話で、
ラムダ式がどうこうとか言ってもしょうがなくない?
2018/12/24(月) 01:17:53.78ID:GJkiS2EE0
>>778
>m_xがその外側の環境だろ
オブジェクトhogeの中に囲い込まれている(キャプチャされたブツである)からちげう
hogeをコピーしたり別の関数に引数渡ししたら付いていくという意味でも外側の環境ではない
781デフォルトの名無しさん (ワッチョイ 95b3-6UAB)
垢版 |
2018/12/24(月) 01:47:35.44ID:SeeEk3oh0
>>779
諦めたらそこで終了だよ!!!
2018/12/24(月) 03:46:32.26ID:6FDZj5qC0
長時間のプログラム終了を手元のスマートフォンで確認したい(メールなど)という願望からそういったプログラムを書きたいんですがさっぱり分かりません
開発環境はvisual studioです
2018/12/24(月) 06:57:18.93ID:N0NAok1A0
普通に、Linux コマンドを並べたら、1・2の順番で実行される。
PowerShell でも良い

command_1 ;
command_2 ;

コマンド1 が終わったら、メール送信するなら、

command_1 ;
メール送信 ;

複雑な処理は、コマンド・シェルスクリプトよりも、Ruby などで作る方がよい
2018/12/24(月) 07:58:21.71ID:RySeMjgB0
>>782
今は知らんけど、数年前だったら、メール送信は知識が結構必要だった。
SendMail Transfer Protocol なるものを使うんだけど、それを便利に発行できる
関数なりCUIプログラムがあれば使えるんだけども。
2018/12/24(月) 08:02:13.26ID:RySeMjgB0
>>784
Linux だったら、aaa.txt に以下のような内容を書いて、
---------------------------------------
From: my@mail.address (あなたのメールアドレス)
To: foo@example.com
Subject: This is test mail.
(ここに空行を入れる。ここまでがヘッダ。ここから先がボディ)
メールの内容
.(ドットのみの行を入力すると終了)
---------------------------------------

$ sendmail foo@example.com < aaa.txt

とすると後れるらしい。sendmail は、CUI コマンド。
だから、VisualStudio からだと、

system( "sendmail foo@example.com < aaa.txt" );

とすれば、sendmail コマンドが存在しているなら動作する。
2018/12/24(月) 08:28:06.03ID:N0NAok1A0
Linux に、mail コマンドある
2018/12/24(月) 08:57:29.99ID:MCFE6K0T0
>>780
>>774で言っている関数の外側の環境って意味だよ。それがクロージャの中なのは当然。
いいかげん、元の「関数を渡す」って話からずれまくっているが、結局どういうことを言いたいんだろう。
2018/12/24(月) 10:01:04.57ID:JYq0MjYj0
>>779
いやだからc++なら継承でメソッドでオーバーライドする方が
わかりやすいし、資源も管理しやすいんじゃない?って話。
他の言語にあるからみたいな理由で合わんもの入れてもなということなんだけど。
2018/12/24(月) 11:33:35.23ID:GJkiS2EE0
>>787
>結局どういうことを言いたいんだろう。
クロージャ=関数
特に()のオーバーライド(int Hoge::operator()(int a, int b) { ... })までやった場合、
HogeクラスのインスタンスhogeはC++の構文的にも関数同然に機能の呼び出しを行える
(関数オブジェクトとかファンクタとか呼ばれるやつになる

>元の「関数を渡す」って話
クロージャ=関数なのであるから、クロージャを、クロージャを受け取る他の関数またはクロージャに渡すという話、-- (A)
継承を使う場合のsome_typeのベースクラスをsome_typeのベースクラスを受け取る他の関数に渡すことに対応する --(B)

この場合、クロージャを使うやり方に対する継承を使うやり方のデメリットは…
、と静的型チェック周辺の話に持っていくことができるが、その前に(A)や(B)が共通認識になったのか、それとも理解不能なのかどうか確認しておきたい
2018/12/24(月) 12:11:45.35ID:up8qL/8xM
デリゲートとクロージャを混同してるって話?
2018/12/24(月) 12:34:04.96ID:MCFE6K0T0
>>789
>クロージャ=関数

そういう前提で言っていたのか?
ID:AQ4G8Wg10は明らかにクロージャと関数を使い分けているようだが。>>766>>773

じゃあそこは了解したとして、(A)(B)の条件の下でもう一度>>768の質問をするよ。
関数の静的型チェックとクロージャの相性が悪いところってたとえばどんな?
2018/12/24(月) 12:42:22.68ID:GJkiS2EE0
デリゲートは、オブジェクトを参照キャプチャするクロージャと同じ
(マルチキャストみたいなおまけ機能もファンクタとして実現したクロージャになら追加できる
ファンクタとしてクロージャする分には型安全性も同等なので、ファンクタとデリゲートは混同上等のはず…
2018/12/24(月) 12:55:51.01ID:GJkiS2EE0
>>891
>関数の静的型チェックとクロージャの相性が悪いところってたとえばどんな?
知らん
>>766はクロージャの実現方法について黒魔術的な何かを想定しているのではないか…
C++におけるクロージャの簡単な実現方法はファンクタ、であって、ファンクタには特に型安全や資源解放に関するファンクタ固有の問題は無いと思う
何しろファンクタは普通のクラスHogeの普通のインスタンスhogeとして>>748風に書けるので…

一方、広義のクロージャは、変数を束縛するしくみ=クロージャなので、型安全という概念をそもそも含まない
この広義のクロージャをC++上で実現しようとしているのだとしたら知らん
2018/12/24(月) 13:03:08.89ID:+hyoXfJx0
>>788
> いやだからc++なら継承でメソッドでオーバーライドする方が
> わかりやすいし、資源も管理しやすいんじゃない?って話。

だからそんなことはないと私は述べてる。

ラムダ式を使いたいときというのはほとんどの場合は小さな関数を作りたいときなんだよ。
それも一回しか使われないような使い捨てのものをだ。
使い捨てるのならば、別の場所で定義して (名前を付けて) から使うのはまわりくどい。
わかりにくくて管理しづらくなる。

もちろん、場合によってはラムダ式が適さない場合だってある。
そういう場合まで何もかもをラムダ式に置き換えろってんじゃないだ。
ラムダ式が適しているときにラムダ式を使えってだけのことで、しかもそれは案外に多いってことだ。
2018/12/24(月) 13:07:57.67ID:MCFE6K0T0
ああわかった。
>>776ではクロージャと関数を区別して書いていたのに対して、>>777は単に

>クロージャ=関数

と言いたかっただけなんだな。
2018/12/24(月) 13:15:42.46ID:MCFE6K0T0
アンカー間違えた。>>776じゃなくて>>774か。
2018/12/24(月) 14:08:48.90ID:GJkiS2EE0
訂正orz
誤: 変数を束縛するしくみ=クロージャ
正: 変数を束縛して作った関数(ただし束縛すべき変数のリストが空のときもある)=クロージャ

型安全な言語なら型安全に、そうでない言語でもそれなりにやっぱクロージャ=関数ェ、
2018/12/24(月) 18:39:17.08ID:JYq0MjYj0
>>794

>ラムダ式を使いたいときというのはほとんどの場合は小さな関数を作りたいときなんだよ。
>それも一回しか使われないような使い捨てのものをだ。
ここが自分の感覚と違う。
ラムダ式を使いたい時ってもう少し動的な関数作成に関わる場合という感覚。
単に名前付けを省略したいくらいならどうとでもなると思うし、個人的にはそんな興味ない用途。
2018/12/24(月) 20:19:23.43ID:5oUfBIDD0
C++のラムダ式でどうやって動的関数生成なんかやるの?
何かを根本的に勘違いしてるとしか思えない
2018/12/24(月) 20:43:50.96ID:NsJUy6rqa
生成と作成は違う・・・
2018/12/24(月) 20:57:22.56ID:xV9Qcj/20
どうやって動的に生成するんだ
2018/12/24(月) 21:38:45.00ID:SeZ4reQO0
jsのノリをc++に持ち込もうとして、
面倒だってぶつくさ言うやつ定期的に現れるよな
なぜc++使おうとしているのか、自分を見つめ直した方がいいぞ
803デフォルトの名無しさん (ワッチョイ 95b3-6UAB)
垢版 |
2018/12/24(月) 22:54:19.63ID:SeeEk3oh0
Javascriptのほうが速いのにな。
2018/12/24(月) 23:31:10.01ID:RySeMjgB0
>>803
有り得ない。
805デフォルトの名無しさん (ワッチョイ 95b3-6UAB)
垢版 |
2018/12/24(月) 23:33:25.79ID:SeeEk3oh0
さてはオヌシ、Javascript使ったことござらんな。
806デフォルトの名無しさん (スッップ Sd43-/Sup)
垢版 |
2018/12/24(月) 23:40:50.37ID:osgTLlKWd
何が速いの
2018/12/24(月) 23:56:41.67ID:ckTogqpu0
ガイジやん
2018/12/25(火) 00:08:46.01ID:66hcSiRr0
new演算子について教えてください。

自分で定義したクラスをインスタンス化してグローバル変数として扱いたいです。
グローバル変数には実体がないといけないと思うのですが、new演算子は
ポインタにしか使えないですよね?
この場合どうしたらいいでしょうか
2018/12/25(火) 00:19:05.74ID:wezhkWA50
newなんか使わずそのままグローバル変数として
myclass mc;
とか定義すればよい
2018/12/25(火) 00:20:38.06ID:C9xreq1F0
>>802
いやだからc++でなんでラムダ式とか入れちゃうのかっていう話をだね。。
jsのノリを無理やり入れたがってるのはc++の仕様の方で別に俺は入れたくない
って意見なのだが。
2018/12/25(火) 00:27:18.17ID:elDAcQKF0
>>810
wwwwwwwww
2018/12/25(火) 00:50:16.50ID:MFQdZUcza
無名関数としてのラムダはないと困る。
2018/12/25(火) 00:53:54.64ID:HIPAf7J10
>>810
オブジェクトとクロージャはメカニズム的には似たようなもんだ
という感覚は言語処理系に明るい人の感覚としては元々ある。

C++ にラムダ式が追加される前に書かれたこの記事が面白いよ。

"クロージャとオブジェクトの微妙な関係"
http://www.itmedia.co.jp/enterprise/articles/0703/29/news069.html

JavaScript の「オブジェクト」だって、その内実は環境への操作だ。
つまりはクロージャを基礎にしてオブジェクトに見せているんだから、
その逆をやる言語があったって別に不自然なことではなかろ。
2018/12/25(火) 01:47:45.90ID:66hcSiRr0
>>809
なるほど!
教えてもらったとおりnew使わないでできました!
2018/12/25(火) 03:05:41.87ID:hUN0giiJ0
クラス・クロージャは、同じ。
関数・メソッドから、引数渡しでもないのに、外側の変数を参照できるから

Ruby のブロックがクロージャ。
ブロックの外側の変数が参照できる

一方、Ruby の関数は、外側の変数を参照できないから、
JavaScript, Python, PHP よりも、すごい強固

Ruby だけは、クロージャの外に、関数をスコープを作っている。
さらに関数の外側がクラスで、クラスの外側がモジュール

モジュール > クラス > メソッド(関数) > ブロック(クロージャ)

Ruby 独特の構造!
2018/12/25(火) 17:51:31.77ID:Twr4vy9N0
エディッタだけで、Visual Studioコンパイル済まで持って行けた。。。
2018/12/25(火) 18:10:25.20ID:Ra4BufOa0
サンタさんがくれた素敵な奇跡。だからその瞬間を宝物にして、書き込みしたくなっちゃうんですね
2018/12/25(火) 18:35:59.59ID:HIPAf7J10
恥ずかしいセリフ禁止!
2018/12/25(火) 18:44:45.00ID:C73Cga6+0
はちみつ餃子さんってC++を使ってる業務に就いてるんですか?
2018/12/25(火) 18:50:42.42ID:HIPAf7J10
前にも書いたことあると思うけど、ワイは完全に趣味でやっとる人やで
2018/12/25(火) 19:33:29.77ID:C9xreq1F0
理解が深まった。ありがとう。
しかし理解すればするほど、c++ならやっぱクラス生成でよくね?って気になるが。
2018/12/25(火) 19:48:34.00ID:KqaRCMCm0
クラス生成するのがC++のラムダ式なんだが
2018/12/25(火) 21:36:34.76ID:HIPAf7J10
>>821
繰返して述べるが、 C++ のラムダ式は単純なクラスの定義と使用を同時に出来る構文糖でしかない。
何故か「クロージャ」と混同した書き込みがあるが
(もちろんいわゆるクロージャの概念からおおいに影響は受けているのだろうが)
C++ のラムダ式は C++ に新しい概念を導入するものではない。
2018/12/26(水) 00:41:02.88ID:qfoPSrF6a
c++の属性構文が出来たけどc++17で不明な属性は無視するという規定が出来たからには、コンパイラによっては独自の属性があるの?
2018/12/26(水) 06:42:20.48ID:GQqJjkng0
> C++ のラムダ式は C++ に新しい概念を導入するものではない。

これはさすがに言い過ぎ
関数型のリテラルという概念は C++98 にはなかった
だから C++11 になったとき新しく憶えた
既存の概念の組み合わせでできているから
割とすんなり憶えられたけどね
2018/12/26(水) 07:11:59.75ID:Y8+MwfS4M
元々各社の属性指定方法を統一化したものだし
827デフォルトの名無しさん (アウアウウー Sac9-6UAB)
垢版 |
2018/12/26(水) 21:22:57.27ID:qfoPSrF6a
VC++で[[deprecated]]使ったら警告じゃなくてエラーになっちゃう。
いやまあ正解なんだけどさ・・・
2018/12/27(木) 10:07:41.48ID:1rJdmURK0
>>827
ん、cl.exe の 19.16.27024.1 では通るが?
2018/12/27(木) 18:09:20.50ID:DLCsZ7Bsa
警告になる?
2018/12/28(金) 06:03:28.17ID:4iocbykD0
ならない
2018/12/28(金) 06:04:31.02ID:4iocbykD0
つーか、[[deprecated]]って書いてある関数を使っても警告しないのはつまらない
2018/12/28(金) 15:46:17.14ID:50PB7VSs0
Emscripten で、マウスの動きに合わせて JS の canvasに直線を描いたりする
ようなGUIプログラムを作って試していて、local auto 変数に確保した
16バイトの char 配列に、sprintf で色の #RRGGBB の文字列を合成
して JS に渡して canvas の context の style に直線の色を設定していた。
で、同時に、KeyDown イベントでで20文字ほどのグラフィック文字列を出して
いた。なお、そっちの方でも、全く同じ関数を使って、上記の色の文字列
を合成していた。
すると不思議なことに、KeyDownイベントで文字列を書いた後は、
必ず、直線の方の色が変わってしまう。必ず青色で書くようにしているはずなのに。
ログをとってみると、
char szBuf[16];
sprintf(szBuf, "#%02X%02X%02X", r, g, b);
で szBuf に対して、最後の 0終端文字が、書き込まれていないことが判明。
よく見ると、KeyDownイベントで色のためではなく、出力したい
文字列そのものの文字の一部が直線描画の方の szBuf の #RRGGBB の直後に
残ったままコピーされているように振舞っていた。

ためしに、sprintf() の命令の直前に、memset(szBuf, 0, 16); とすると
正常化することも確認した。

Emscripten のライブラリの不具合だろうか?
833デフォルトの名無しさん (ワッチョイ 91e3-h5Ay)
垢版 |
2018/12/28(金) 16:23:41.67ID:50PB7VSs0
char szCol[16];
memset( szCol, 0, 16 );
memset( szCol, 'W', 10 );
szprintf( szCol, ・・・ );

とした場合は、W の文字が残ったままになることも分かった。
2018/12/28(金) 16:55:00.81ID:bcsUwMQ/0
szprintf() の直後に
szCol[7] = 0;

とすると、正常化することも分かった。
2018/12/28(金) 19:27:07.61ID:NSIH2Vow0
C++でクラスポインタにnewしたオブジェクトを配列の様に複数作りたいのですが、
エラーがでてしまいます。

ポインタの宣言
TimerParameter *_timerParameter;

インスタンス化
_timerParameter[_timerSize] = new TimerParameter(time, function, one_loop);

TimerParameterコンストラクタ
TimerParameter::TimerParameter(ULONG time, void(*function)(), bool one_loop)
{
_function = function;
_oneLoop = one_loop;
_timeSpan = time;
resetTimer();
}

自分で作ったTimerParameterクラスをnewして_timerParameterメンバに入れると以下のエラーが発生してしまいます
sketch\timerState.cpp: In member function 'bool TimerState::timerSet(long unsigned int, void (*)(), bool)':
timerState.cpp:14:30: error: no match for 'operator=' (operand types are 'TimerParameter' and 'TimerParameter*')
_timerParameter[_timerSize] = new TimerParameter(time, function, one_loop);

インスタンス化の左辺が適切でないのが原因だと思うのですが、この書き方はダメなのでしょうか?
2018/12/28(金) 19:48:22.38ID:S+ORIZ660
配列の実体がないじゃん
2018/12/28(金) 20:14:43.49ID:NSIH2Vow0
>>836
newすれば実体確保できるとの認識でしたが、やはり別に実体を用意しないといけないのでしょうか

https://www.s-cradle.com/developer/sophiaframework/tutorial/Cpp/newdelete.html
2018/12/28(金) 20:30:07.39ID:t3Tixi/x0
ポインタの配列が無いって話だろ
2018/12/28(金) 21:37:00.90ID:IR9VtjpT0
_timerParameter[_timerSize]の型はTimerParameter
new TimerParameter(...)の型はTimerParameter *

あと、
Type * ptr;
ptr[2] = createType();
なんてやっちゃダメなのわかってる?

Type * ptr;
ptr = new Type[10];
ptr[2] = createType();
ならいいんだけど

あと、"_"で始まる名前は処理系予約だし
timeはcの標準関数にtime_t time(time_t *t);があるんでやめれ
2018/12/28(金) 23:30:44.23ID:2sBVkvJt0
アンダーバー2つかアンダーバー+大文字で始まるものが予約されてるだけでアンダーバー+小文字で始まるのは大丈夫
2018/12/28(金) 23:49:39.38ID:foyNhCLxM
vector<vector<float>> = {
{1.33333334, 3.99918277},
{2.56883338, 1.29994666}
}

このようにvector<vector<float>>をdouble型の要素で初期化しようとすると縮小変換が必要とのエラーが出ます
どうしたら縮小変換しつつ初期化出来るんですかね?
2018/12/29(土) 00:24:51.94ID:igG8GHWt0
floatのリテラルを使わない理由が分からない
2018/12/29(土) 02:57:26.73ID:9LI18QIG0
>>839
>ならいいけど
よくないだろ。なぜコピーさせるのか
2018/12/29(土) 06:39:32.70ID:2E+KpNh/a
>>841 数字の末尾にf
2018/12/29(土) 06:40:13.70ID:2E+KpNh/a
もしくはstatic_cast<float>
2018/12/29(土) 17:02:40.74ID:UQDnLnHIM
BoostやSTLのDeveloperになりたいんですけど、テンプレートを極めればなれますか?
2018/12/29(土) 17:05:30.58ID:mHcV7M6o0
テンプレートに限らずC++を極めてるのは当然の前提として
Developerとして参加するプロジェクトをどうしたいとか、どんな価値を提供できるかとかが重要じゃないかな
2018/12/29(土) 17:17:06.00ID:U1nQeVxJ0
BoostならBoost相当の性能のライブラリを作って水準に合うドキュメントと何故それがBoostに必要なのか説明する提案書を書いて提出すれば100回リジェクトされる頃には採用されるかも知れない
2018/12/29(土) 17:35:17.80ID:UQDnLnHIM
>>847
C++をより良い言語にしたいです
今はアルゴリズムの研究をしてるのですが、C++をより良い言語にしたいと個人的に思ってるのと、自分が作った言語機能を人に使ってほしいんです
>>848
Boost‥
100回リジェクトされた頃には相当な経験が詰めるはずなので挑戦してみます
2018/12/29(土) 17:56:06.46ID:mHcV7M6o0
>>849
C++自体を改良したいなら標準化委員会に行くかコンパイラの開発に参加しよう
2018/12/29(土) 18:16:38.42ID:UQDnLnHIM
>>850
どっちも検討してみます
2018/12/29(土) 18:34:59.20ID:EkrQifAZ0
すばらしい、C++標準化に参加して、文字コードの扱いの混乱した現状をなんとかしてほしいw
char型はwindowsがsjis、それ以外がutf8、
wchar型は64bit linuxが32bitで、それ以外は16bit、
どのプラットフォームでも同じようにつかえるchar16_t/char32_tはAPIやライブラリが未整備な上、エンディアンの問題がつきまとう、
と、マルチプラットフォームで各種文字コードの透過的な相互運用は事実上不可能な状態だからな……
2018/12/29(土) 18:45:45.22ID:fhXB+EYEa
bomの有無とか?
2018/12/29(土) 19:04:16.27ID:EkrQifAZ0
そう、それな、ポータブルな保存形式はutf8で良いと思うんだけど、BOMの有無とか、冗長コードの問題とかで実際にやってみると意外と面倒なんだよね。
2018/12/30(日) 05:24:49.23ID:I1/5m0WE0
Windows では Shift_JIS (CP932) という前提もホント駄目な勘違い。
2018/12/30(日) 08:17:58.30ID:vtZx8IN+a
visual studioはいろんなエンコードに対応してるように見せかけてshift-jis前提で動いてる気がする。


デバッガでpngのシグニチャ確認したら臼ngとなるとか、コメントにπを書いたら赤の波線が出るとか。
2018/12/30(日) 11:01:04.79ID:KcpheNgcd
>>856
ユーザーのコードページを変える以外に方法がないらしい。
2018/12/30(日) 11:15:52.66ID:vtZx8IN+a
>>857
方法あったの!?
2018/12/30(日) 11:36:24.11ID:JDxg8BDU0
Windowsの言語パック入れて表示言語を選択すればたぶん変わる。
2018/12/30(日) 11:43:21.51ID:TL6Cx54I0
windowsは英語設定安定
2018/12/30(日) 11:59:41.73ID:bm6ZOgnS0
まぁ、マイクロソフトも徐々にUTF8を標準サポートにする方向みたいだから、2〜3年したらVisual Studioもデフォルトがutf8になるかもね。
エンディアンの問題も、x86,ARMに続いてRISC-Vがリトルだから、流れとしてはリトルで統一ってことになるのかな。そうなったら楽でいいなw
2018/12/30(日) 13:40:53.27ID:Ux/rKcR40
RISC CPUが出始めたときはビッグの勢いあったけど
結局リトルに収斂したな
おれは昔からリトルが自然と感じてたのでいい流れだ
ネットとの相性が悪いのは残ってしまうが
2018/12/30(日) 13:46:05.24ID:31DgsdhN0
Emscripten で Cソース中に以下のようなプログラムを作ると、MyPrintf()内の
(2) で (3)の vsprintf() を呼び出そうとした瞬間に、なぜか (4) に来ずに、
(5)に戻ってきて a4 に制御が戻って来てしまうことが判明。タイマーイベント
を使ってる。誰か原因の見当が付く人いない?
EM_ASM( {
  function js_OnTimer() {
    console.log( 'begin of js_OnTimer()\n' ); //a1
    var cl_OnTimer = Module.cwrap('OnTimer', 'number', ['number']);
    console.log( 'js_OnTimer(), before calling cl_OnTimer(1)\n' ); //a2
    var rc = cl_OnTimer(1);       //a3
    console.log( 'js_OnTimer(), after calling cl_OnTimer(1)\n' ); //a4
    console.log( 'end of js_OnTimer()\n' ); //a5
  }
  setInterval(js_OnTimer, 1000);
});
extern "C" int OnTimer( int a ) {
  OnTimerCore();
  return 0;
}
void OnTimerCore() {
  MyPrintf( "begin(MyPrintf) of OnTimerCore(), %d", 123 ); // (1)
  printf( "begin(printf) of OnTimerCore(), %d\n", 456 ); // (5)
}
2018/12/30(日) 13:46:34.18ID:31DgsdhN0
>>863
void MyPrintf( const char *pszFormat, ... ) {
  char      szBuf[2048];
  va_list     va;
  va_start( va, pszFormat );
  EM_ASM( { console.log( 'MyPrintf, before call vsprintf()\n' ); }); //(2)
  vsprintf( szBuf, pszFormat, va );    // (3)
  EM_ASM( { console.log( 'MyPrintf, after call vsprintf()\n' ); }); //(4)
  va_end( va );
}
2018/12/30(日) 14:57:17.90ID:31DgsdhN0
>>863
原因は、main 関数の最後に書いておいた、次のループにあった :
for ( ;; ) {
  emscripten_sleep(36000000);  // 何日間も待つ。
}
このループをコメント・アウトするだけで、vsprintf() が1つ前の戻り先に
戻ってしまう不具合も、sprintf() が 0 終端文字を書いてくれない不具合も
共に起きなくなった。

このループを書いていたのは、Emscripten 1.35 で、かつ、
wasm ではなく、asm.js で試していたときに、キー押下イベント
などが発生した時に
 Assertion failed: the runtime was exited (use NO_EXIT_RUNTIME to keep
 it alive after main() exits)
というエラーが出るためだった。つまり、main() 関数が終わると、
「ランタイム」(ランタイム・ライブラリ?) も終了してしてしまうので、
main() を終わらせられなかった。だから、main() の最後に、なんらかの
無限待機の仕組みが欲しくなって書いていたのだった。

現在は このループを除去しても警告が出なくなっているが、
Emscripten の Version を上げたせいか、asm.js ではなく、wasm の方を
使うようになったせいかは分からない。
866デフォルトの名無しさん (ワッチョイ 557c-Oscs)
垢版 |
2018/12/30(日) 16:16:05.88ID:Y/PcKL5Q0
なんでリトルが自然なん?
あとから拡張しやすいって意味か?
2018/12/30(日) 17:21:44.51ID:JDxg8BDU0
加算器は下の桁から処理していって桁上げする方が自然とか、複数バイト長のワードで
ビットアドレスとバイトアドレスの増加方向が同じになるとかかな。
ワードサイズが変わっても低位バイトの位置が変わらないから拡張しやすいってのも
もちろんあると思う。
2018/12/30(日) 17:42:37.29ID:8KuoxE+z0
ハード作ってる時はビッグエンディアンの方が自然な気がするがソフト作ってる時はリトルエンディアンの方が自然な気がする
まあ、FPGAと高級言語を使うようになってからは滅多に気にすることは無くなったけど
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況