C++相談室 part152
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2020/07/12(日) 13:42:20.13ID:TX1mpKr6361はちみつ餃子 ◆8X2XSCHEME
2020/09/15(火) 17:33:54.20ID:Gxy/396Z362デフォルトの名無しさん
2020/09/15(火) 17:49:15.00ID:3HBrgqD1 実は、
z x(a,b);
の形式は、コンパイラが関数xのプロトタイプ宣言と、引数付きのコンストラクタ
呼び出しによる変数xの初期化の区別を付けるのが難しい例として知られている。
その区別は、基本的にはaの部分が型名なのか、型名でないのかで区別される。
それに加えて、zの部分にtypedef名を書くと、コンパイラはいろいろなことを配慮
しなくてはならなくなる。
関数のプロトタイプ宣言と、メンバ変数の定義では、コンパイルの流れが大きく変わるので、
なるべく早い段階でそれらを区別しなければならない。
余り深く解析しすぎてはコンパイル時間が増大してしまう。
だから、適度にヒューリスティックな方法で判別していることがある。
ヒューリスティックな方法なので、滅多に書かない特殊な書き方をした場合、間違えてしまう可能性があるかもしれない。
z x(a,b);
の形式は、コンパイラが関数xのプロトタイプ宣言と、引数付きのコンストラクタ
呼び出しによる変数xの初期化の区別を付けるのが難しい例として知られている。
その区別は、基本的にはaの部分が型名なのか、型名でないのかで区別される。
それに加えて、zの部分にtypedef名を書くと、コンパイラはいろいろなことを配慮
しなくてはならなくなる。
関数のプロトタイプ宣言と、メンバ変数の定義では、コンパイルの流れが大きく変わるので、
なるべく早い段階でそれらを区別しなければならない。
余り深く解析しすぎてはコンパイル時間が増大してしまう。
だから、適度にヒューリスティックな方法で判別していることがある。
ヒューリスティックな方法なので、滅多に書かない特殊な書き方をした場合、間違えてしまう可能性があるかもしれない。
363デフォルトの名無しさん
2020/09/15(火) 19:13:25.13ID:glwHIVnw なんでここってそんな殺伐と喧嘩腰みたいなやつ多いの?
もっと柔らかくさ切磋琢磨してこうよ
もっと柔らかくさ切磋琢磨してこうよ
364デフォルトの名無しさん
2020/09/15(火) 19:25:55.43ID:cZkGG5+C class TEST {
hoge_t h;
TEST() : h{1, 2} {}
};
のほうがわかりやすくね
hoge_t h;
TEST() : h{1, 2} {}
};
のほうがわかりやすくね
365デフォルトの名無しさん
2020/09/15(火) 19:25:55.43ID:cZkGG5+C class TEST {
hoge_t h;
TEST() : h{1, 2} {}
};
のほうがわかりやすくね
hoge_t h;
TEST() : h{1, 2} {}
};
のほうがわかりやすくね
366デフォルトの名無しさん
2020/09/15(火) 19:26:49.33ID:cZkGG5+C うおダブルクリックしちゃった
てかJavaScriptで防止しとけよw
てかJavaScriptで防止しとけよw
367デフォルトの名無しさん
2020/09/15(火) 19:28:11.48ID:cZkGG5+C コンストラクタにpublicつけ忘れた
368デフォルトの名無しさん
2020/09/15(火) 20:39:52.74ID:Zw0qp59Z コードを書くとききは、最低限簡単なテストコードで
コンパイルが通るかどうか確認してから書きなさい
技術系ブログですらそのルール守ってない事があり
そういうブログはたいてい読むに値しない
コンパイルが通るかどうか確認してから書きなさい
技術系ブログですらそのルール守ってない事があり
そういうブログはたいてい読むに値しない
369デフォルトの名無しさん
2020/09/15(火) 20:59:22.26ID:eg5KpnfE >>351
#include <iostream>
using namespace std;
struct Hoge{
int x;
int y;
Hoge(int x, int y){
this->x = x;
this->y = y;
}
};
int main() {
Hoge h(1, 2);
cout << h.x << endl;
return 0;
}
GVkKul - Online C++0x Compiler & Debugging Tool - Ideone.com
https://ideone.com/GVkKul
余り深く考えないならこんなんでいいんじゃなかろうか
#include <iostream>
using namespace std;
struct Hoge{
int x;
int y;
Hoge(int x, int y){
this->x = x;
this->y = y;
}
};
int main() {
Hoge h(1, 2);
cout << h.x << endl;
return 0;
}
GVkKul - Online C++0x Compiler & Debugging Tool - Ideone.com
https://ideone.com/GVkKul
余り深く考えないならこんなんでいいんじゃなかろうか
370デフォルトの名無しさん
2020/09/15(火) 21:01:17.48ID:cZkGG5+C explicit Hoge(int x, int y)
にしろと言う派もいそう
にしろと言う派もいそう
371デフォルトの名無しさん
2020/09/15(火) 21:07:56.21ID:YjwP830M アホ人口が過密すぎ
372デフォルトの名無しさん
2020/09/15(火) 21:43:29.84ID:sNNyLA9G こうですか?
わかりません><;
■ 小数を含む10進数の表記の再現に関する定理
有限桁の10進数で表記された非負の数x0をIEEE 754形式(2進数版)に変換して
xを得たとして、x0の最小の桁が10^mの位、xの仮数部のLSBが2^pの位ならば、
m > p * log10(2)
を満たす限り、xからx0の最小の桁まで正確に再現できる。
■ 証明
x0の最小の桁が10^mの位(10^mより小さい位が無い)ということは、
x0は周期10^mの格子点上にある。(kを適当な整数として、x0=k*10^mと表すことができる。)
一方、x0をxに変換する際、仮数部のLSBが丸めで繰り上がらなかったとすると、
x ≦ x0 ≦ x + 2^(p-1)
が成り立ち、仮数部のLSBが丸めで繰り上がった場合は
x - 2^(p-1) ≦ x0 ≦ x
が成り立つ。(全ての不等号が等号付きなのは、偶数丸めの可能性を考慮している。)
合わせると、どっちにせよ以下の式が成り立つ:
x - 2^(p-1) ≦ x0 ≦ x + 2^(p-1) -- (1)
x0が周期10^mの格子点上であることから、式(1)より
(2^(p-1) - (- 2^(p-1))) < 10^m ∴ m > 2 * log10(2)
であれば、xから式(1)を満たすx0が一意に定まり、
周期10^mの格子点上に位置する他の数と区別できる。
□
わかりません><;
■ 小数を含む10進数の表記の再現に関する定理
有限桁の10進数で表記された非負の数x0をIEEE 754形式(2進数版)に変換して
xを得たとして、x0の最小の桁が10^mの位、xの仮数部のLSBが2^pの位ならば、
m > p * log10(2)
を満たす限り、xからx0の最小の桁まで正確に再現できる。
■ 証明
x0の最小の桁が10^mの位(10^mより小さい位が無い)ということは、
x0は周期10^mの格子点上にある。(kを適当な整数として、x0=k*10^mと表すことができる。)
一方、x0をxに変換する際、仮数部のLSBが丸めで繰り上がらなかったとすると、
x ≦ x0 ≦ x + 2^(p-1)
が成り立ち、仮数部のLSBが丸めで繰り上がった場合は
x - 2^(p-1) ≦ x0 ≦ x
が成り立つ。(全ての不等号が等号付きなのは、偶数丸めの可能性を考慮している。)
合わせると、どっちにせよ以下の式が成り立つ:
x - 2^(p-1) ≦ x0 ≦ x + 2^(p-1) -- (1)
x0が周期10^mの格子点上であることから、式(1)より
(2^(p-1) - (- 2^(p-1))) < 10^m ∴ m > 2 * log10(2)
であれば、xから式(1)を満たすx0が一意に定まり、
周期10^mの格子点上に位置する他の数と区別できる。
□
373はちみつ餃子 ◆8X2XSCHEME
2020/09/15(火) 22:07:33.21ID:Gxy/396Z >>364
それはどうだろう。 慣れという面は大きいと思うよ。
普通のローカル変数は変数の宣言と初期化は一体なわけだし、
その記法と一致させた方がよくない? ってのは有るでしょ。
でも初期化のタイミングが (ある程度は) 見かけ通りになって欲しいという感覚からは
コンストラクタの方で初期化した方が自然だよなってのも有る。
それはどうだろう。 慣れという面は大きいと思うよ。
普通のローカル変数は変数の宣言と初期化は一体なわけだし、
その記法と一致させた方がよくない? ってのは有るでしょ。
でも初期化のタイミングが (ある程度は) 見かけ通りになって欲しいという感覚からは
コンストラクタの方で初期化した方が自然だよなってのも有る。
374デフォルトの名無しさん
2020/09/15(火) 22:07:55.51ID:y4mQo5lg それもういいから
375はちみつ餃子 ◆8X2XSCHEME
2020/09/15(火) 22:08:53.69ID:Gxy/396Z そういう感覚的な部分は置いてちょっと便利な使い方としては、
コンストラクタが複数あってそれぞれが初期化したい対象が違う場合に
共通する部分は宣言と同時に初期化するように書くという方法。
こんな感じね。
struct foo {
int mem_i = 1;
double mem_d = 2;
char mem_c = 3;
foo(int i) : mem_i(i) {}
foo(double d) : mem_d(d) {}
foo(char c) : mem_c(c) {}
};
以下のように書くよりはマシでしょ。
struct foo {
int mem_i;
double mem_d;
char mem_c;
foo(int i) : mem_i(i), mem_d(2), mem_c(3) {}
foo(double d) : mem_i(1), mem_d(d), mem_c(3) {}
foo(char c) : mem_i(1), mem_d(2), mem_c(c) {}
};
宣言と同時の初期化が書かれていてコンストラクタでも初期化が書かれているときは
コンストラクタでの初期化のみが有効になる。
コンストラクタが複数あってそれぞれが初期化したい対象が違う場合に
共通する部分は宣言と同時に初期化するように書くという方法。
こんな感じね。
struct foo {
int mem_i = 1;
double mem_d = 2;
char mem_c = 3;
foo(int i) : mem_i(i) {}
foo(double d) : mem_d(d) {}
foo(char c) : mem_c(c) {}
};
以下のように書くよりはマシでしょ。
struct foo {
int mem_i;
double mem_d;
char mem_c;
foo(int i) : mem_i(i), mem_d(2), mem_c(3) {}
foo(double d) : mem_i(1), mem_d(d), mem_c(3) {}
foo(char c) : mem_i(1), mem_d(2), mem_c(c) {}
};
宣言と同時の初期化が書かれていてコンストラクタでも初期化が書かれているときは
コンストラクタでの初期化のみが有効になる。
376デフォルトの名無しさん
2020/09/15(火) 22:17:19.74ID:cZkGG5+C 今まで全部下の方法で書いてたわ
そしてやめる気もない
そしてやめる気もない
377はちみつ餃子 ◆8X2XSCHEME
2020/09/15(火) 22:33:53.09ID:Gxy/396Z ただ、 >>375 にも良くない面はあって、
ヘッダファイルでクラス定義をして
コンストラクタの実装は .c に書いた場合、
// foo.h
struct foo {
int mem_i = 1;
double mem_d = 2;
char mem_c = 3;
foo(int i);
foo(double d);
foo(char c);
};
// foo.c
foo::foo(int i) : mem_i(i) {}
foo::foo(double d) : mem_d(d) {}
foo::foo(char c) : mem_c(c) {}
ヘッダファイルからは 1, 2, 3 で初期化するかのように見えて実際にはそう初期化しないことがある
ってのは混乱の元になるかもしれないと思う。
ワイとしてはどう運用 (使い分け) すればいいのかはっきりした見解を確立できてない。
どうすればいいんやろね?
ヘッダファイルでクラス定義をして
コンストラクタの実装は .c に書いた場合、
// foo.h
struct foo {
int mem_i = 1;
double mem_d = 2;
char mem_c = 3;
foo(int i);
foo(double d);
foo(char c);
};
// foo.c
foo::foo(int i) : mem_i(i) {}
foo::foo(double d) : mem_d(d) {}
foo::foo(char c) : mem_c(c) {}
ヘッダファイルからは 1, 2, 3 で初期化するかのように見えて実際にはそう初期化しないことがある
ってのは混乱の元になるかもしれないと思う。
ワイとしてはどう運用 (使い分け) すればいいのかはっきりした見解を確立できてない。
どうすればいいんやろね?
378デフォルトの名無しさん
2020/09/15(火) 22:40:25.54ID:cZkGG5+C struct foo {
int mem_i = 1;
double mem_d = 2;
char mem_c = 3;
foo(int i);
foo(double d);
foo(char c);
};
こういうことするとfooは文脈依存で意味が違う紛らわしい存在になる
このfoo自体存在しないでほしい
int mem_i = 1;
double mem_d = 2;
char mem_c = 3;
foo(int i);
foo(double d);
foo(char c);
};
こういうことするとfooは文脈依存で意味が違う紛らわしい存在になる
このfoo自体存在しないでほしい
379デフォルトの名無しさん
2020/09/15(火) 22:49:45.29ID:h5acecX0 class foo {
foo(int i);
foo(double d);
foo(char c);
private:
int mem_i = 1;
double mem_d = 2;
char mem_c = 3;
};
これなら別にいいでしょ
全データメンバー丸出しの単純structに中途半端なコンストラクタ付けてるのが問題の本質に見える
foo(int i);
foo(double d);
foo(char c);
private:
int mem_i = 1;
double mem_d = 2;
char mem_c = 3;
};
これなら別にいいでしょ
全データメンバー丸出しの単純structに中途半端なコンストラクタ付けてるのが問題の本質に見える
380デフォルトの名無しさん
2020/09/15(火) 23:18:01.40ID:cZkGG5+C381デフォルトの名無しさん
2020/09/16(水) 01:22:34.43ID:g8ss57Sd382デフォルトの名無しさん
2020/09/16(水) 06:20:12.78ID:y7ydVkjJ カリー化して畳み込む。
383デフォルトの名無しさん
2020/09/16(水) 07:41:27.27ID:h+KbCdxN385デフォルトの名無しさん
2020/09/16(水) 20:55:15.73ID:hkK/AQSl >>341,342,347
へえありがとう
へえありがとう
386デフォルトの名無しさん
2020/09/17(木) 00:12:18.70ID:yBGxmNW2 というわけで自己解決しますた!
https://ideone.com/Zz21oH
仕様としては15桁以内の10進数で、IEEE 754で表せる範囲で、
なおかつ最小桁の位が10^0以下だったら何でもおk
(原理上は最小桁の位は10^0より上でも逝けるやつは作れるが今回はパス
https://ideone.com/Zz21oH
仕様としては15桁以内の10進数で、IEEE 754で表せる範囲で、
なおかつ最小桁の位が10^0以下だったら何でもおk
(原理上は最小桁の位は10^0より上でも逝けるやつは作れるが今回はパス
387デフォルトの名無しさん
2020/09/17(木) 16:47:32.96ID:9/9M+ZB2 いまいち、つまらんかった
388デフォルトの名無しさん
2020/09/17(木) 17:47:56.72ID:cSYZrhyC まぁ証明自体はいいと思うよ
あってるか知らんけど
あとはがんばって
>>279 の10億行の手入力のテストデータが確実に
15桁以内の10進数であるか確認しないとな
そこをスクリプトにするぐらいなら最初から書き換え案でよかったよな
あってるか知らんけど
あとはがんばって
>>279 の10億行の手入力のテストデータが確実に
15桁以内の10進数であるか確認しないとな
そこをスクリプトにするぐらいなら最初から書き換え案でよかったよな
389デフォルトの名無しさん
2020/09/17(木) 22:51:21.16ID:vYrubRbh 彼の手入力は完璧だから確認とか必要ないらしいぞ
390デフォルトの名無しさん
2020/09/17(木) 23:19:34.76ID:NGdGxMy6 それはbionicだな
391351
2020/09/20(日) 10:14:33.56ID:YAin65a3 色々とありがとうございました。
class TEST {
hoge_t h(1, 2); // expected identifier before numeric constant
};
の部分を
class TEST {
HOGE h(1, 2);
};
にしたら大丈夫になりました。(hoge_t を使わないで HOGE のほうを)
ここで疑問が出ました。
typedef struct HOGE
{
...
} hoge_t;
の HOGE と hoge_t の違いはなんでしょうか。
片方がなくても動くようですが、先ほどの話のように HOGE を使ったほうが間違いがないような気がします。
そこで、
typedef struct HOGE
{
...
};
という風にしてしまいつつあるのですが、どういう副作用があるのでしょうか。
class TEST {
hoge_t h(1, 2); // expected identifier before numeric constant
};
の部分を
class TEST {
HOGE h(1, 2);
};
にしたら大丈夫になりました。(hoge_t を使わないで HOGE のほうを)
ここで疑問が出ました。
typedef struct HOGE
{
...
} hoge_t;
の HOGE と hoge_t の違いはなんでしょうか。
片方がなくても動くようですが、先ほどの話のように HOGE を使ったほうが間違いがないような気がします。
そこで、
typedef struct HOGE
{
...
};
という風にしてしまいつつあるのですが、どういう副作用があるのでしょうか。
392デフォルトの名無しさん
2020/09/20(日) 10:24:48.86ID:gADwnK29 >>391
そこに書かれた範囲だと HOGE と hoge_t とは同じものを指すことになるから、
そこを置き換えて大丈夫になるなんてことは無いはず。
たぶん書いてないところに問題があったんだろうと思う。
それはそれとして、その typedef には意味がないので単に struct HOGE で済ませておけばいい
という結論は問題ないと思うよ。
C で struct 省略のための typedef を変に覚えただけでしょ。
そこに書かれた範囲だと HOGE と hoge_t とは同じものを指すことになるから、
そこを置き換えて大丈夫になるなんてことは無いはず。
たぶん書いてないところに問題があったんだろうと思う。
それはそれとして、その typedef には意味がないので単に struct HOGE で済ませておけばいい
という結論は問題ないと思うよ。
C で struct 省略のための typedef を変に覚えただけでしょ。
393デフォルトの名無しさん
2020/09/20(日) 11:36:33.24ID:YAin65a3 HOGE が型名で、hoge_t が変数名、という認識は合ってますか?
394デフォルトの名無しさん
2020/09/20(日) 11:43:51.29ID:gADwnK29 >>393 合ってませんね。
395デフォルトの名無しさん
2020/09/20(日) 11:53:42.36ID:YAin65a3 「struct HOGE ・・・」 を hoge_t 型 と定義する、みたいなやつですか。
C++ 使ってる限り、忘れていい過去の遺物と思っていいんですね。
C++ 使ってる限り、忘れていい過去の遺物と思っていいんですね。
396デフォルトの名無しさん
2020/09/20(日) 12:05:47.95ID:dGmNK3yI struct Hoge{...};とtypedef stuct Hoge hoge_t;をまとめて書いてるだけ
古のCマスター様のイキリ構文だから忘れなさい
古のCマスター様のイキリ構文だから忘れなさい
397はちみつ餃子 ◆8X2XSCHEME
2020/09/20(日) 12:39:45.45ID:7quNJlhN >>395
C++ のことだけを考えるなら typedef を使う理由はもう無くなった。
少なくとも C++11 以降は型の別名を付けるにしても using で全ての状況をまかなえる。
C では構造体タグと型名は別物として管理されていたけど
C++ ではそうではないのでわざわざふたつの名前付ける必要もあまりない。
C++ のことだけを考えるなら typedef を使う理由はもう無くなった。
少なくとも C++11 以降は型の別名を付けるにしても using で全ての状況をまかなえる。
C では構造体タグと型名は別物として管理されていたけど
C++ ではそうではないのでわざわざふたつの名前付ける必要もあまりない。
398デフォルトの名無しさん
2020/09/20(日) 14:03:58.31ID:rXNNPQAl399デフォルトの名無しさん
2020/09/20(日) 15:44:00.22ID:0QrwQpRm #define も使用禁止ですね判ります
401デフォルトの名無しさん
2020/09/20(日) 15:52:26.96ID:ujAaBpzc 気に入らなければお前が説明しなおせばいいんじゃない?
402デフォルトの名無しさん
2020/09/20(日) 15:53:19.29ID:ujAaBpzc あ、本人がレス返してた
余計だったなすまん
余計だったなすまん
403デフォルトの名無しさん
2020/09/20(日) 18:56:35.09ID:HMivgeXQ _から始まって次の文字が大文字はCでも禁止?
404デフォルトの名無しさん
2020/09/20(日) 19:00:51.76ID:dGmNK3yI C89の頃から禁止だったはず
405蟻人間 ◆T6xkBnTXz7B0
2020/09/20(日) 19:07:53.10ID:JknVjK4K406デフォルトの名無しさん
2020/09/20(日) 19:24:22.31ID:PidwIaps Cでもタグ名とtypedef識別子は衝突しないんだから
typedef hoge_t HOGE;なんてしなくていい
C++14みたいに_tと_vにするなら意味あるけどね
typedef hoge_t HOGE;なんてしなくていい
C++14みたいに_tと_vにするなら意味あるけどね
407デフォルトの名無しさん
2020/09/21(月) 01:11:32.44ID:YHO9o1ct408はちみつ餃子 ◆8X2XSCHEME
2020/09/21(月) 08:40:38.86ID:sulqQktu409デフォルトの名無しさん
2020/09/21(月) 09:07:56.01ID:apXLM6YN さすがにそれは国語力を疑う
410デフォルトの名無しさん
2020/09/21(月) 09:08:40.94ID:apXLM6YN411デフォルトの名無しさん
2020/09/21(月) 09:29:06.87ID:uGOMtfu/412はちみつ餃子 ◆8X2XSCHEME
2020/09/21(月) 09:54:25.81ID:sulqQktu >>411
むしろ using を使えという方が俺の言いたかったことなんだ。
しいて言えば typedef は「構造体の宣言と同時に」別名の定義もできるという点が
using ではできないけどそうする意味が失われている (ので特に優位性ではない) という意味で後半の補足を入れた。
むしろ using を使えという方が俺の言いたかったことなんだ。
しいて言えば typedef は「構造体の宣言と同時に」別名の定義もできるという点が
using ではできないけどそうする意味が失われている (ので特に優位性ではない) という意味で後半の補足を入れた。
413デフォルトの名無しさん
2020/09/21(月) 10:26:30.49ID:YHO9o1ct あー、まぁ実質typedefは忘れた方がいい、というのは同意するけどね(初心者に教えるという意味では
414デフォルトの名無しさん
2020/09/21(月) 17:14:51.54ID:zhVYtERB C++ではstructをtypedefする必要は無くなった
ただ、typedef(やusing)は
typedef vector<Coord> Path;
typedef vector<Path> Pathes;
みたいな時に使っている
ただ、typedef(やusing)は
typedef vector<Coord> Path;
typedef vector<Path> Pathes;
みたいな時に使っている
415デフォルトの名無しさん
2020/09/21(月) 17:16:28.09ID:Y5gLvI08 >>414
using使おうぜ
using使おうぜ
416デフォルトの名無しさん
2020/09/21(月) 17:28:58.81ID:5fzDdes6 しかし、typedefに不満が無い人に対して、書き方が違っているだけのusingを
推進しようとするC++勢の姿勢は嫌い。
Cが好きで延長線上で使っていたのに、いつのまにかCとはまるっきり別言語に
強制されていっている。
推進しようとするC++勢の姿勢は嫌い。
Cが好きで延長線上で使っていたのに、いつのまにかCとはまるっきり別言語に
強制されていっている。
417デフォルトの名無しさん
2020/09/21(月) 17:54:21.89ID:PNFNM3Vd >>416
typedefは文法的に非合理的なところがあるんだけど気付いてる?
typedef std::basic_string<char, std::type_traits<char>, std::allocator<char>> string;
typedef std::mersenne_twister_engine<std::uint_fast32_t, 32, 624, 397, 31, 0x9908b0df, 11, 0xffffffff, 7, 0x9d2c5680, 15, 0xefc60000, 18, 1812433253> mt19937;
↓
using string = std::basic_string<char, std::type_traits<char>, std::allocator<char>>;
using mt19937 = std::mersenne_twister_engine<std::uint_fast32_t, 32, 624, 397, 31, 0x9908b0df, 11, 0xffffffff, 7, 0x9d2c5680, 15, 0xefc60000, 18, 1812433253>;
typedefは文法的に非合理的なところがあるんだけど気付いてる?
typedef std::basic_string<char, std::type_traits<char>, std::allocator<char>> string;
typedef std::mersenne_twister_engine<std::uint_fast32_t, 32, 624, 397, 31, 0x9908b0df, 11, 0xffffffff, 7, 0x9d2c5680, 15, 0xefc60000, 18, 1812433253> mt19937;
↓
using string = std::basic_string<char, std::type_traits<char>, std::allocator<char>>;
using mt19937 = std::mersenne_twister_engine<std::uint_fast32_t, 32, 624, 397, 31, 0x9908b0df, 11, 0xffffffff, 7, 0x9d2c5680, 15, 0xefc60000, 18, 1812433253>;
418デフォルトの名無しさん
2020/09/21(月) 19:06:32.78ID:IzAwgxqY using使うとtemplateも使える
template <class T>
using vec = std::vector<T>;
vec<int> vi;
template <class T>
using vec = std::vector<T>;
vec<int> vi;
419デフォルトの名無しさん
2020/09/21(月) 19:11:20.08ID:BKUa/6+Z usingはこういうのが嬉しいと思う。
// C++11
using func = void(*)(int);
// C++03 equivalent:
// typedef void (*func)(int);
>>417
文法的に非合理的?
// C++11
using func = void(*)(int);
// C++03 equivalent:
// typedef void (*func)(int);
>>417
文法的に非合理的?
420デフォルトの名無しさん
2020/09/21(月) 19:15:17.99ID:IzAwgxqY C/C++みたいな低レイヤーの言語を触る時代はいつまで続くのかね
421デフォルトの名無しさん
2020/09/21(月) 19:15:52.15ID:J2iLBa+b typedefだと本体がわかりにくいのだ
422デフォルトの名無しさん
2020/09/21(月) 19:33:47.96ID:zhVYtERB 10年後でも100年後でも一番下のところは必ず存在する
アーキテクチャが変わってもC言語のような低水準言語は必ず出てくる
つまり世の中から『一番下』が無くなるとは思えない
アーキテクチャが変わってもC言語のような低水準言語は必ず出てくる
つまり世の中から『一番下』が無くなるとは思えない
423デフォルトの名無しさん
2020/09/21(月) 19:40:50.05ID:IzAwgxqY AIによる最適化技術がコンパイラに積まれたら
C/C++みたいなのは不要になる気がする
アーキテクチャの一番下のアセンブラとかは残るとしてもね
C/C++みたいなのは不要になる気がする
アーキテクチャの一番下のアセンブラとかは残るとしてもね
424デフォルトの名無しさん
2020/09/21(月) 19:49:44.87ID:NkrhQtlS >>423
AIによる最適化技術って具体的になぁに?
AIによる最適化技術って具体的になぁに?
425デフォルトの名無しさん
2020/09/21(月) 19:58:28.08ID:IzAwgxqY コンパイラの最適化もしらないの???
426デフォルトの名無しさん
2020/09/21(月) 20:04:55.13ID:NkrhQtlS >>425
現行のLLVMとかによる最適化なら知ってるけど、まだ実現されてないAIによる最適化ってなにかなぁと思って。
現行のLLVMとかによる最適化なら知ってるけど、まだ実現されてないAIによる最適化ってなにかなぁと思って。
427デフォルトの名無しさん
2020/09/21(月) 20:11:19.83ID:I28tUppa typedefがわかりにくいのではなくてC言語以来のポインタ定義構文がおかしいんである
これは聖典『プログラミング言語C』でも「批判を浴びることがある」みたいに書かれている
これはどうせCベースの言語なら乗り越えねばならない関門なのでノーカンとして、
単に型のエイリアスが欲しいときはtypedefで十分やし、
定義型をテンプレートにしたいとか別の型にしたいときはクラスにしたら宜しい
かと
これは聖典『プログラミング言語C』でも「批判を浴びることがある」みたいに書かれている
これはどうせCベースの言語なら乗り越えねばならない関門なのでノーカンとして、
単に型のエイリアスが欲しいときはtypedefで十分やし、
定義型をテンプレートにしたいとか別の型にしたいときはクラスにしたら宜しい
かと
428デフォルトの名無しさん
2020/09/21(月) 20:12:23.44ID:IzAwgxqY 普通に考えて
機械語を入力としてそれと等価で高速に動作する機械語を出力する
作業をAIに任せるってことなんじゃないの(たぶん)
機械語を入力としてそれと等価で高速に動作する機械語を出力する
作業をAIに任せるってことなんじゃないの(たぶん)
429デフォルトの名無しさん
2020/09/21(月) 20:13:49.74ID:I28tUppa 同じことをするのにいくつも書き方があるようだと
C++はますますプログラミング言語界のPerlになってしまうま、
C++はますますプログラミング言語界のPerlになってしまうま、
430デフォルトの名無しさん
2020/09/21(月) 20:19:15.08ID:I28tUppa AIによる最適化はそもそも最適な最適化が何なのかは計算不能(コルモゴロフ複雑性
というのはどうすんじゃ………
というのはどうすんじゃ………
431デフォルトの名無しさん
2020/09/21(月) 20:20:24.50ID:NkrhQtlS >>428
ごめんね、喧嘩売ってるつもりじゃないんだ。
コンパイル最適化技術は興味あるんだけど俺の知識が数年前で止まってるので新しい知識として取り入れたかっただけ。
>機械語を入力としてそれと等価で高速に動作する機械語を出力する
それってAIと関係なく何十年も前からあるなんの変哲もない最適化だと思うの。
ごめんね、喧嘩売ってるつもりじゃないんだ。
コンパイル最適化技術は興味あるんだけど俺の知識が数年前で止まってるので新しい知識として取り入れたかっただけ。
>機械語を入力としてそれと等価で高速に動作する機械語を出力する
それってAIと関係なく何十年も前からあるなんの変哲もない最適化だと思うの。
432デフォルトの名無しさん
2020/09/21(月) 20:27:18.34ID:WONfy98d433デフォルトの名無しさん
2020/09/21(月) 20:29:32.74ID:WONfy98d >>428
AIなら何でも解決するとか思ってそうw
AIなら何でも解決するとか思ってそうw
434デフォルトの名無しさん
2020/09/21(月) 20:32:17.31ID:IzAwgxqY >AIによる最適化はそもそも最適な最適化が何なのかは計算不能
AIって解析的に解くわけじゃないから計算不能でもいい感じに動いてくれるんじゃないの
>それってAIと関係なく何十年も前からあるなんの変哲もない最適化だと思うの。
最適化技術は素人だから知らないけど現状が割と決まった最適化ルールに当てはめてる
だけだとしたら改善の余地はあるんじゃないのかな
想像だけど
AIって解析的に解くわけじゃないから計算不能でもいい感じに動いてくれるんじゃないの
>それってAIと関係なく何十年も前からあるなんの変哲もない最適化だと思うの。
最適化技術は素人だから知らないけど現状が割と決まった最適化ルールに当てはめてる
だけだとしたら改善の余地はあるんじゃないのかな
想像だけど
435デフォルトの名無しさん
2020/09/21(月) 20:33:13.25ID:IzAwgxqY >>433
わりとまじでそう思ってるけど
わりとまじでそう思ってるけど
436デフォルトの名無しさん
2020/09/21(月) 20:39:34.82ID:NkrhQtlS もちろん、LLVMのようにJITの結果をAOTしてくれるような俺の脳味噌で考えられる最大限の最適化より、もっと進んだ技術が将来的に出てくるとは思うんだよ。
最近そういう技術から離れてたので、俺の知らないうちに新しいブレークスルーがあったのかと思って純粋な興味で質問しました。
最近そういう技術から離れてたので、俺の知らないうちに新しいブレークスルーがあったのかと思って純粋な興味で質問しました。
437デフォルトの名無しさん
2020/09/21(月) 21:20:09.92ID:PNFNM3Vd >>419
それを言うならこっちでしょ
template <typename T>
auto func(T&&) -> enable_if_t<is_integral_v<T>, void> {}
これとどっちが合理的だと思う?
template <typename T>
enable_if_t<is_integral_v<T>, void> func(T&&) {}
typedefとusingの話ではないけど
合理性という論点では同じことだよ
それを言うならこっちでしょ
template <typename T>
auto func(T&&) -> enable_if_t<is_integral_v<T>, void> {}
これとどっちが合理的だと思う?
template <typename T>
enable_if_t<is_integral_v<T>, void> func(T&&) {}
typedefとusingの話ではないけど
合理性という論点では同じことだよ
438デフォルトの名無しさん
2020/09/21(月) 21:21:22.91ID:PNFNM3Vd >>418
そう、だからtypedefはもういじるのやめてtemplate化はできないまま放置されてるんだよな
そう、だからtypedefはもういじるのやめてtemplate化はできないまま放置されてるんだよな
439デフォルトの名無しさん
2020/09/21(月) 21:22:17.03ID:WONfy98d440デフォルトの名無しさん
2020/09/21(月) 21:25:30.85ID:I4V/hlGb 深層学習、機械学習のことをざっくりAIと呼ぶ人は
まぁおおよそ技術わかってない人だろうね
まぁおおよそ技術わかってない人だろうね
441デフォルトの名無しさん
2020/09/21(月) 21:36:38.22ID:REl65Gaj プログラミングを知らない人が「こんぴゅーたって何でも出来るんでしょ」って言ってるのと似てる
442デフォルトの名無しさん
2020/09/21(月) 21:39:42.46ID:PNFNM3Vd >>441
そう聞こえちまう発言を見かける頻度が高すぎてやだよな
そう聞こえちまう発言を見かける頻度が高すぎてやだよな
443デフォルトの名無しさん
2020/09/21(月) 21:40:29.70ID:BKUa/6+Z444デフォルトの名無しさん
2020/09/21(月) 21:55:50.30ID:PNFNM3Vd >>443
では言い方を変えようか
関数識別子でも型識別子でもそれを一覧しやすいところに集めやすいことを合理性と言っている
概要と詳細はどっちを先に書くべきかってことだよ
typedefは右端に宣言対象の識別子
usingは左端から7文字目という決まった位置に宣言対象の識別子
trailing-return-typeも5文字目という決まった位置に宣言対象の識別子がある
可読性という観点からどう思う?
では言い方を変えようか
関数識別子でも型識別子でもそれを一覧しやすいところに集めやすいことを合理性と言っている
概要と詳細はどっちを先に書くべきかってことだよ
typedefは右端に宣言対象の識別子
usingは左端から7文字目という決まった位置に宣言対象の識別子
trailing-return-typeも5文字目という決まった位置に宣言対象の識別子がある
可読性という観点からどう思う?
445デフォルトの名無しさん
2020/09/21(月) 22:03:23.74ID:REl65Gaj typedefは変数宣言を流用した手抜きだからこんな糞みたいなのも書けてしまう
typedef int are, kore, sore, dore, *hare, **yore, (*more)(float, long), (*ore)[42];
typedef int are, kore, sore, dore, *hare, **yore, (*more)(float, long), (*ore)[42];
446デフォルトの名無しさん
2020/09/21(月) 22:18:42.28ID:PNFNM3Vd typedef int (*more)(float, long); //この書き方に抵抗は全くないが
using more = int (*)(float, long); //それでも俺はこっちが好き
using more = int (*)(float, long); //それでも俺はこっちが好き
447デフォルトの名無しさん
2020/09/21(月) 22:19:03.41ID:BKUa/6+Z >>445
その点については統一感あってむしろ美しいと思うけどw
typedef int are, kore, sore, dore, *hare, **yore, (*more)(float, long), (*ore)[42];
sore g(float, long) {}
int main() {
are a = (int)0;
kore b = a;
hare c = &b;
yore d = &c;
dore e[42];
more f = g;
ore h = &e;
return 0;
}
その点については統一感あってむしろ美しいと思うけどw
typedef int are, kore, sore, dore, *hare, **yore, (*more)(float, long), (*ore)[42];
sore g(float, long) {}
int main() {
are a = (int)0;
kore b = a;
hare c = &b;
yore d = &c;
dore e[42];
more f = g;
ore h = &e;
return 0;
}
448デフォルトの名無しさん
2020/09/21(月) 22:21:35.15ID:PNFNM3Vd int are, kore;
変数のareとkoreが本質的に同じ型であることが重要なときに統一できるのはいいけどね
intの同義語をそんなに量産してどうするんだと
変数のareとkoreが本質的に同じ型であることが重要なときに統一できるのはいいけどね
intの同義語をそんなに量産してどうするんだと
449デフォルトの名無しさん
2020/09/21(月) 22:22:41.71ID:I4V/hlGb usingとtypedefでいうと関数ポインタ、配列の扱い違うよね
あのあたりよくわかってない
誰か解説して
あのあたりよくわかってない
誰か解説して
450デフォルトの名無しさん
2020/09/21(月) 22:34:38.79ID:IzAwgxqY >>440
まるでさも自分がわかってるみたいな言い方
まるでさも自分がわかってるみたいな言い方
451はちみつ餃子 ◆8X2XSCHEME
2020/09/21(月) 22:58:02.34ID:VM5g8L/y 別のスレでちょっと書いたことがあるが……。
人工知能 (AI) ってのは人間の知能を代行するものという意味合いで私は考えてる。
昔はコンパイラそのものが人工知能の枠内で扱われていたこともある。
それ以前にルールベース、つまり if 文の羅列のようなものまで人工知能の一種だった。
でもそれらが分野として確立されたら人工知能とは呼ばれなくなっていた。
機械でやるのが当たり前のものになったから。
普通の道具になったから「知能」ではなくなったんだ。
人工知能を実用化するってのは人工知能を人工知能でなくすること。
逆に言えば人工知能と呼ばれている間は曖昧模糊としてよくわからんのが当たり前なんだと思う。
これはいろんな使い方をされる「人工知能」という言葉について私なりの解釈であって
正しさを主張するつもりはないが、それなりに実態に合った解釈ではあると思う。
人工知能 (AI) ってのは人間の知能を代行するものという意味合いで私は考えてる。
昔はコンパイラそのものが人工知能の枠内で扱われていたこともある。
それ以前にルールベース、つまり if 文の羅列のようなものまで人工知能の一種だった。
でもそれらが分野として確立されたら人工知能とは呼ばれなくなっていた。
機械でやるのが当たり前のものになったから。
普通の道具になったから「知能」ではなくなったんだ。
人工知能を実用化するってのは人工知能を人工知能でなくすること。
逆に言えば人工知能と呼ばれている間は曖昧模糊としてよくわからんのが当たり前なんだと思う。
これはいろんな使い方をされる「人工知能」という言葉について私なりの解釈であって
正しさを主張するつもりはないが、それなりに実態に合った解釈ではあると思う。
452デフォルトの名無しさん
2020/09/21(月) 23:08:20.77ID:PNFNM3Vd かなり酔ってるな
ビール? 今日何本目?
ビール? 今日何本目?
453デフォルトの名無しさん
2020/09/21(月) 23:08:24.99ID:I4V/hlGb そんなこねくり回した理解いる?
たんなる学術分野を指すだけの言葉じゃん
意味が広いだけ
たんなる学術分野を指すだけの言葉じゃん
意味が広いだけ
454はちみつ餃子 ◆8X2XSCHEME
2020/09/21(月) 23:13:49.84ID:VM5g8L/y455デフォルトの名無しさん
2020/09/21(月) 23:33:11.93ID:I28tUppa 最適化方面へのAIの適用というと、
高度なルールベース(80年代のAI)までいったん後退したものに
収束が必ずしも保障されない最適化処理(有限ステップで終わる保証がないからもはやアルゴリズムと呼ぶのは抵抗があるがGAとか
を組み合わせたものになりそうなヨカン
FPGAの論理合成エンジンみたいなやつを考えたら宜しいかと、
もはや冪等性は気体できない
ビルドをやるたびに結果が変わるorz
高度なルールベース(80年代のAI)までいったん後退したものに
収束が必ずしも保障されない最適化処理(有限ステップで終わる保証がないからもはやアルゴリズムと呼ぶのは抵抗があるがGAとか
を組み合わせたものになりそうなヨカン
FPGAの論理合成エンジンみたいなやつを考えたら宜しいかと、
もはや冪等性は気体できない
ビルドをやるたびに結果が変わるorz
456デフォルトの名無しさん
2020/09/21(月) 23:38:03.83ID:I28tUppa この場合LPはAIに含めて良いものかどうか、
457デフォルトの名無しさん
2020/09/22(火) 01:59:39.72ID:ZtayyY2i458デフォルトの名無しさん
2020/09/22(火) 02:02:23.48ID:xLdkMK4R >>447
やめてくり〜
やめてくり〜
459デフォルトの名無しさん
2020/09/22(火) 03:43:14.70ID:sfaT76Ga 文字列の内容を1行毎に配列に入れたいのですが
以下のプログラムだと一部の文字しか抽出できていませんでした
完全が必要な点を教えてください
for (unsigned int i = 0; ; i++) {
for (unsigned int j = 0; ; j++) {
if (*str == '\0')
return;
if (*str == '\n')
break;
datalist[j][i] = *str;
str++;
}
str++;
}
以下のプログラムだと一部の文字しか抽出できていませんでした
完全が必要な点を教えてください
for (unsigned int i = 0; ; i++) {
for (unsigned int j = 0; ; j++) {
if (*str == '\0')
return;
if (*str == '\n')
break;
datalist[j][i] = *str;
str++;
}
str++;
}
460デフォルトの名無しさん
2020/09/22(火) 03:58:17.38ID:ZtayyY2i datalistに行ごとに抽出するならiとj逆のような気もするけど
とりあえずdatalistの方にも、各行の終わりに\0(文字列の終端)が必要じゃね?
ゼロ終端文字列として扱わないとか、最初にmemsetしてるなら別だけど
とりあえずdatalistの方にも、各行の終わりに\0(文字列の終端)が必要じゃね?
ゼロ終端文字列として扱わないとか、最初にmemsetしてるなら別だけど
■ このスレッドは過去ログ倉庫に格納されています
