C++相談室 part155

■ このスレッドは過去ログ倉庫に格納されています
2021/03/24(水) 12:07:15.39ID:R+oM8cup
※前スレ
C++相談室 part154
https://mevius.5ch.net/test/read.cgi/tech/1610096040/

テンプレここまで
2021/03/27(土) 01:26:03.40ID:Ly0w36WW
>>28
> ヘッダライブラリ自称

そんなことどこかに書いてあるの?
公式ページのトップにもビルドについて言及があるし、ヘッダのみみたいなニュアンスはないと思うんだが。
30デフォルトの名無しさん
垢版 |
2021/03/27(土) 02:13:45.76ID:FxCpf6Ea
ヘッダのみで使えると過剰に宣伝してるライブラリが多い。

と、あわしろ氏が申しておりました。
2021/03/27(土) 02:17:07.41ID:p6NWEZH2
あわしろってキンコン西野みたいなもん?
2021/03/27(土) 08:19:32.12ID:MzcivD4R
ビルド必要なのは別にいいけどbjamが糞すぎるからさっさと捨てて欲しい
2021/03/28(日) 12:33:00.93ID:11viivYN
class hoge{
public:
constexpr static int aaa[2] = { 1, 2};

static hoge get_hoge();
}

hage::hage()
{
hoge *_hoge = hage::get_hoge();

int tmp;
int i = 0;
tmp = _hoge->aaa[i];
}
とすると、ビルド時、undefined reference to `hoge::aaa'と出るけど、
tmp = _hoge->aaa[0];とするとエラーが出ない
これってなぜ起きて、どうやったら変数を使ってアクセスできるようになるの?
開発環境はSTM32CubeIDEのver1.6.0
2021/03/28(日) 13:05:07.76ID:hha5l0Ce
ちらちら混ざってる hage は hoge の間違いなのか何か別物なのか。
2021/03/28(日) 13:05:58.70ID:IQVnw+L7
>>33
サンプルコードが不足しているので何をどうしたいのかよくわからんのだが、
i が定数式じゃないと駄目だよ。
2021/03/28(日) 13:47:16.98ID:5/FvdRpo
>>35
うそやん?
2021/03/28(日) 17:41:23.48ID:11viivYN
>>34
hogeにはアプリで使う色々な定数が入ってて、hageがそれを参照するようにしてるんだ。
んなもんdefineでいいとかそういう話は置いといて、iが変数だと何がまずいの?
2021/03/28(日) 19:20:58.11ID:PRWHgvt6
三段活用はhoge、fuga、piyoだろ!常識だぞ
ハゲとか言う人にはもう教えません
2021/03/28(日) 19:23:19.81ID:YX9+FjRw
piyoは初めてみるな
2021/03/28(日) 20:20:31.89ID:W2vCV6FV
>>39
それなりに知られてるぞ
https://ja.m.wikipedia.org/wiki/%E3%83%A1%E3%82%BF%E6%A7%8B%E6%96%87%E5%A4%89%E6%95%B0
2021/03/28(日) 21:37:33.38ID:hha5l0Ce
>>37
> constexpr static int aaa[2] = { 1, 2};
クラススコープの↑は変数の定義に見えるけど実は宣言でしかなくて、プログラム中に実体を置くには別途定義が要る。
ただし const な整数型や constexpr な変数が定数式の文脈で即座に値として利用される場合はコンパイル時に直接定数として
置き換えられるので、定義が無くてもビルドできる。

定数 0 ではなく変数 i を添え時にすると定数式ではなくなるので定義が必要になる。
2021/03/28(日) 22:16:07.85ID:11viivYN
>>42
分かったようなわかんないような感じなんだけど、
例えば、
class hoge{
public:
constexpr static int aaa[2];

static hoge get_hoge();
}

hoge::aaa[2] = {1, 2};

みたいにするってこと?
2021/03/28(日) 22:26:27.67ID:hha5l0Ce
>>42
それだと定数評価できなくなるから、たぶんやりたいことと違うよね。
「別途定義」は、宣言の初期化子はそのままで↓をどこかのコンパイル単位に追記するだけでいい。
constexpr int hoge::aaa[];
44デフォルトの名無しさん
垢版 |
2021/03/28(日) 22:50:05.31ID:R4xh1GwG
static constexpr int * constexpr aaa = …

static inline constexpr int aaa[] = … (c++17)
で行けんじゃね?知らんけど。
2021/03/28(日) 23:57:42.15ID:hha5l0Ce
そういえば inline 変数で済むようになったんだっけ。 C++17 でビルドすれば別途定義は要らないね。
https://cpprefjp.github.io/lang/cpp17/inline_variables.html
2021/03/29(月) 08:44:37.72ID:A8t4nM4q
これで思い出したんだけどメンバ変数のconstexprとstatic constexprに違いってあるんだっけ?
2021/03/29(月) 10:42:44.85ID:4VjYBAI0
メモリ上に唯一ここだけしかないんだぞって見る奴に分かるようにしてるんでしょ
コンパイラ的にはあってもなくても同じ
2021/03/29(月) 11:13:21.97ID:a9nDQaAf
>>46
メンバ変数はインスタンス無いとあかんやん
4946
垢版 |
2021/03/29(月) 11:39:07.94ID:jFqdjOB1
インスタンスごとになるのか・・コンパイル時定数なのに(保証は無いのかもしれんけど
普段staticつけてるから疑問に思ってたんだ、ありがとう
2021/03/29(月) 16:52:43.90ID:ZAtZtNlj
>>43
thx
C++の仕様が古いのか分からんけどうまくいかなかったんで、constで宣言して別に定義したわ
2021/04/01(木) 00:44:40.92ID:3rw8Xzm0
クラスを使わずにフリー関数だけで何もかも実装してしまう
2021/04/01(木) 02:23:28.90ID:zgIDekUq
なんでもかんでもクラスに放り込むのは良くないというのはよく認識されるようになってきたみたいだけど、
だからといって C++ を使う以上は非メンバ関数だけで構成するのも不格好だし、いい感じの設計は難しいね。
2021/04/01(木) 05:45:44.25ID:KfB45e5F
知らん馬の骨の好みに合わせる意味はない
2021/04/01(木) 06:17:26.46ID:xkKFGoH+
無駄に上から目線でワロタ
何様のつもりなのかと
2021/04/01(木) 11:54:02.32ID:/m7p4qXu
バカが無理してクラス使っても無駄に状態持つだけだから非メンバ関数使っとけ
2021/04/01(木) 14:49:39.84ID:mwubpVbO
ラムダ式で何もかも実装したらクラスを使ったことになる!
2021/04/01(木) 16:14:27.54ID:b0+JHWqP
>>38
hoge
hage
mage
かと思ってた
2021/04/01(木) 16:49:21.83ID:Ga8mQY/B
>>55
永遠に初心者のままだな
2021/04/01(木) 17:27:07.05ID:mwubpVbO
>>58
別に
2021/04/01(木) 18:40:51.78ID:/m7p4qXu
>>58
永遠に関数型理解できないね
2021/04/01(木) 18:42:28.20ID:zgIDekUq
メンバ関数を使わなければ関数型的ということはない。
2021/04/01(木) 18:48:20.10ID:/m7p4qXu
嫌味の理解できない奴が話をこじらせる。
2021/04/01(木) 22:02:12.44ID:mwubpVbO
誤解の余地がないぐらいしっかり要件定義できたら一人前の入り口
2021/04/01(木) 23:10:26.56ID:klwu+MWY
なんでもかんでもクラスに放り込むのは良くないけど、なんでもかんで名前空間に放り込むのは実に良い
2021/04/02(金) 01:40:11.97ID:UoCieKPr
ま、せやな
2021/04/02(金) 08:19:46.74ID:U50iDt4R
"Raw string literals" は 「生文字列リテラル」 って訳されるけど、「生」の部分をどう読んでいるのですか?
「なま」なのか「せい」なのか、「しょう」なのか
ググってもわかりません
https://cpprefjp.github.io/lang/cpp11/raw_string_literals.html
67デフォルトの名無しさん
垢版 |
2021/04/02(金) 08:32:50.23ID:/UxsPKSF
「生ポインタ」で「なまぽいんた」

界隈で使われてる超専門用語
教科書には読み方はおろかその存在すら一切載って無い
しかしてC/C++使いは総じてその読み方を知ってる
2021/04/02(金) 08:39:51.40ID:U50iDt4R
>>67
「なま」なんですね
早速の解答ありがとうございます m(_ _)m
2021/04/02(金) 13:54:33.57ID:6+Rf0OKV
einsumとか添字の入れ替えくらいの本当に基本的な機能だけ持ってる多次元配列クラスがほしいんだけど、なんでこれしきのものがboostにはないの?
2021/04/02(金) 14:03:29.72ID:q3Egk2LJ
君の実装を世界が待ってるんだぞ
文句言う前に公開せよ
2021/04/02(金) 14:19:38.24ID:6+Rf0OKV
>>70
今は自分で実装して騙し騙し使ってるけど、こういうファンダメンタルかつパフォーマンスが必要なものは誰か信用できるプロバイダに作ってほしい
2021/04/02(金) 17:28:33.51ID:65VwiNme
実用的な必要に迫られている人こそ
変な妥協もお花畑なオーバースペックもない
機能美なコードを書けるんだけどな
2021/04/02(金) 19:20:37.25ID:OIYek4iX
>>72
実用的なコードというのは進化し続けるコードであって、常に古びた無駄を抱えているもんだ。
2021/04/03(土) 03:21:26.87ID:YT89Uc9u
仕様変更できなくなって陳腐化していくことはあるな
2021/04/03(土) 06:35:59.59ID:FsaMqi3u
std::vector<bool>のpopcountを簡単にとる方法をおしえてくだちい
以下のようにして自力で数えるしかない?
size_t popcount(const std::vector<bool>& vec) {
size_t cnt = (size_t)0;
for (auto it = vec.begin(); it != vec.end(); it++) {
if ((bool)(*it)) {
cnt++;
}
}
return cnt;
}
あとstd::vector<bool>::size()は総ビット数を返すみたいなんですが
では実際に占有しているヒープのサイズは
どうやって確かめたら良いんでしたっけ……_○/|_
2021/04/03(土) 07:04:05.36ID:FsaMqi3u
つかstd::count(vec.begin(), vec.end(), true)で一応動くみたいけど
中でbool型の等値判定していると思うんですが問題無いんでしたっけ……
2021/04/03(土) 07:45:13.57ID:lohjPiFl
不安だったらvector<bool>なんか使うな
それは素人が手を出していいものじゃない
2021/04/03(土) 09:24:55.78ID:FsaMqi3u
集合表現のためのビットマップのロジックを新たに新規に作るよりマシ、
という天才の判断
2021/04/03(土) 12:58:35.52ID:cvW9PgHj
std::bitsetじゃいかんのか?
2021/04/03(土) 13:23:18.30ID:FsaMqi3u
天才か!
しかしstd::bitsetは要素数が整数の基本型のビット数を超えられないのでは……
2021/04/03(土) 13:33:00.76ID:3ynmntXR
要素数が本当に動的に変わるの?
2021/04/03(土) 13:49:31.61ID:5dv7xI+Y
2^32以上のサイズが必要だってこと?
何に使うの?
2021/04/03(土) 13:51:40.21ID:FsaMqi3u
>>82
誤: 2^32
正: 32

当然32個以上の要素からなる集合をビットマップ式に表そうとしたとき
、整数の基本型1個では足りない
2021/04/03(土) 13:52:40.69ID:rmK5g90q
int128の整数を使えば
2021/04/03(土) 13:52:47.30ID:FsaMqi3u
訂正orz
誤: 当然32個以上の要素からなる集合
正: 当然64個を超える要素からなる集合
2021/04/03(土) 14:04:02.94ID:5dv7xI+Y
>>80
え?普通に32超えられるけど
2021/04/03(土) 15:15:47.45ID:62Tyvx2d
何かこういう訳のわからない事を書き込んでまで質問するならもっとわかりやすく書けよと思う
そもそも動的じゃないなら配列でええやろ
88デフォルトの名無しさん
垢版 |
2021/04/03(土) 17:28:40.18ID:0zCBAqiq
c++関係あるかわかりませんが、テクスチャをバラバラに分割するロジックってどうやって作るんでしょうか?

例えばジグソーパズルや、このモザイク画のように、1枚の絵をバラバラにしたいのです。
ばらばらにしたものを戻すというゲームを作ろうとしています。
https://docs.gimp.org/2.8/ja/plug-in-mosaic.html

これが作成したサンプル画像です
https://i.imgur.com/abyDlBI.png

グリッドの線がうっすら見えると思いますが、これを2次元配列とみなします。
適当に四角形を選択して、大まかな位置を決めます。

しかし、その後、四角形を三角形や五角形にするにはどうしたらいいのでしょうか?
隣り合う頂点をマージするなどすればできそうですが。

つまり、頂点という概念を使わないとこの機能は実現出来ないでしょうか?
板ポリゴンを2dとして映せば行けるかなと思ってます。

まあ、inkscapeなどで手作業で作れよって話ですけどね。
自動でパズル作ってくれたらいいなと思って。

エンジンはgodotです(´・ω・`)が、processingなどの環境でもいいです。
ヒントください
2021/04/03(土) 17:42:25.44ID:5dv7xI+Y
1ドットずつ走査して近似色以外は透明色で塗りつぶせば
2021/04/03(土) 17:43:36.15ID:Hj8nCIUt
>>88
こういう話? C++ は関係なさそう。
https://ja.wikipedia.org/wiki/%E3%83%9C%E3%83%AD%E3%83%8E%E3%82%A4%E5%9B%B3

gimp のプラグインになってるんならソースありそうだからそれ見ればいいんじゃねとも思う。
2021/04/03(土) 18:06:49.53ID:XWE78oAN
OpenGLとかグラフィックプログラミング系のスレで聞くべき・・といいたいところだが
この板は上から下まで、やれこっちが優れてるだのこのやりかたは汚いだの
アホみたいなマナー・作法論しか議論していない板なのでたぶん書籍かWebを検索したほうがいい
2021/04/03(土) 18:11:14.04ID:FsaMqi3u
適当に点{ p1, p2, p3, ... } をばらまいてボロノイ境界を描いたら
ボロノイ境界が勝手に種々の多角形になりまくり……!
あとは1つの区画内を点{ p1, p2, p3, ... }における画像の色とかの
適当な色で塗り潰せば良い

言うは安し……!!
2021/04/03(土) 22:25:01.27ID:M/dPb3y2
とりあえず2Dゲーをいちいちポリゴンでやるのはやめといた方がいいかも・・
テクスチャの内容を一枚のビットマップとしていじった方が楽な気がする
スワイプやドラッグでピースを動かすときは板ポリ使ってもいいかもしれんけど
94デフォルトの名無しさん
垢版 |
2021/04/04(日) 10:32:13.85ID:b5JcZ1t5
>>89
その機能がゲームエンジンにあるかどうかすで

>>90
そんな感じですね。
ボロノイというより、三角と四角と五角形で分割したいわけですが
openglはできませんからね、擬似的にそう見せる方法でもいいのですが

アホなので
95デフォルトの名無しさん
垢版 |
2021/04/04(日) 10:37:45.94ID:b5JcZ1t5
>>93
ビットマップでやるってのは、マスでなんとかするってことですか?
2021/04/04(日) 10:58:31.72ID:xtAOreBW
領域を分割する頂点と辺を決めたらあとは各ピクセルごとにどの領域に含まれるかを判断すればいいように思うが
2021/04/04(日) 13:16:57.18ID:Qg2Ccl1w
>>88のサンプル画像からすると、分割された領域の頂点は格子点上にないといけないっぽい
ボロノイ境界の交点は都合良く格子点上に来るとは限らないから、ボロノイ「領域」
の作図式にやるのはいろいろな点でイマイチ感が、
2021/04/04(日) 13:46:45.93ID:Qg2Ccl1w
ちゅか要件定義的に(三角形は良いとして)
(1) 四角形や五角形への分割において凹図形を許容するのか否か
(2) ある図形の1つの辺を2つ以上の隣接図形で共有することを許容するのか否か
とか決めねばならない

いや決めたからといって別に頂点決定アルゴリズムの妙案とか無いが_○/|_
99デフォルトの名無しさん
垢版 |
2021/04/04(日) 18:57:03.43ID:b5JcZ1t5
ここは飛ばしてゲーム作ります(´・ω・`)、、、別に面白さと関係ないしね、、、。
100デフォルトの名無しさん
垢版 |
2021/04/04(日) 19:04:13.20ID:b5JcZ1t5
processingで似たような事できますか?ちょこちょこ練習しようかな
ゲームエンジン使うほどでもないので

https://processing.org/download/support.html
これダウンロードできます?寄付しろと言われるんですけども
101デフォルトの名無しさん
垢版 |
2021/04/04(日) 19:10:44.91ID:b5JcZ1t5
できた すみあmせん
2021/04/05(月) 08:59:16.68ID:8ugS0e8D
c++言語をググるとビャーネも必ず出てきて
彼が設計者だとのことですが、コンパイラを作ってるのは彼ではないですよね
具体的に彼は何をしたの?
2021/04/05(月) 09:24:06.09ID:YIdyLrea
言語仕様の策定だろ
まあ最初のコンパイラー(コンバーターかも)ぐらいは作ってるとは思うけど
2021/04/05(月) 09:27:14.80ID:cScuzdm0
当初はCのプリプロセッサだから今で言うとTypescriptみたいなものだな
2021/04/05(月) 11:51:16.82ID:zIvWtxBS
C++標準化委員会は誰が組織したんや?
2021/04/05(月) 11:53:41.43ID:zIvWtxBS
それとも国際標準化機構(ISO)か何かの配下なの?
2021/04/05(月) 12:36:06.42ID:ESZTLEZZ
>>105
K&R Cにクラスの概念を取り入れて見よう
ということを思いつきcfrontを実装した
TC++PL及びARMを著しC++を広く世界に知らしめた
108デフォルトの名無しさん
垢版 |
2021/04/05(月) 17:28:39.12ID:2Tvboykg
そして世界は闇と混沌に包まれた……
2021/04/05(月) 19:55:46.69ID:rNcivJgw
c++はクソだが、プログラマが求めたクソなのだ。
2021/04/05(月) 22:13:27.34ID:zIvWtxBS
https://livedoor.blogimg.jp/namekkutake/imgs/3/f/3fc1c9fe.jpg
2021/04/05(月) 22:24:25.87ID:vDuR7coO
ビヨーン先生の功績は
ハゲても立派なプログラマになれるという勇気をくれたことだろう
2021/04/06(火) 06:59:06.97ID:rUOwZVXJ
質問ですが
 std::vector<SomeBigObject> arr;
 std::vector<int> indices;
というデータがあり、
SomeBigObjectは大小比較可能だがarr自体は未ソートで、
 for (int i = 0; i < N; i++) { indices[i] = i; }
 auto cmpFunc = [](int a, int b)->bool{ return (arr[a] < arr[b]); }
 std::sort(indices.begin(), indices.end(), cmpFunc);
としてindices上で間接的にソートされているとき、
指定されたSomeBigObject x以上の値が現れるarr[i]の最小のiを高速に取得するには
どうづればSTLでやるには良いですのん?
2021/04/06(火) 06:59:22.44ID:rUOwZVXJ
arrがソートされていれば
 auto cmpFunc2 = [](const SomeBigObject& a, const SomeBigObject &b)->bool{ return (a < b); }
 std::lower_bound(arr.begin(), arr.end(), cmpFunc2);
で済む話なんだども、SomeBigObjectはコピーの手間がかかるので直接std::sortしたくないという、
2021/04/06(火) 07:00:25.45ID:rUOwZVXJ
また手動で組めということなら明らかに組める
int custom_lower_bound(int bgn, int end, const int N, const SomeBigObject& x) {
 while (bgn < end) {
  int mid = bgn + (end - bgn) / 2;
  if (arr[mid] < x) {
   bgn = mid;
  } else if (x < arr[mid]) {
   end = mid;
  } else {
   while (mid > 0 && arr[mid - 1] == x) { mid--; }
   return mid;
  }
 }
 while (bgn < N && arr[bgn] < x) {
  bgn++;
 }
 return bgn;
}
みたいなことをしたら多分逝けるが、しかしこんなもん使う都度書きたくないし、
ライブラリとして展開して責任負いたくもないんじゃー
STLはこういうケースのためにあり、論理的に実現できる以上やり方が考えられていないとおかしいはず……
2021/04/06(火) 07:42:07.19ID:w+lldWjr
 auto cmpFunc3 = [](int a, int b)->bool{ return (arr[a] < arr[b]); }
 i = std::lower_bound(indices.begin(), indices.end(), cmpFunc3);
arr[i];
じゃいかんのかしら
2021/04/06(火) 15:08:28.23ID:rUOwZVXJ
>>115
lower_bound()の第3引数に検索キーxを指定する必要があるから
>>115では解決しないっていうかビルドエラーなヨカン、

ここで気づいたが>>113のlower_bound()の例は間違ってたわスマン、orz
↓これに訂正
 auto cmpFunc2 = [](const SomeBigObject& a, const SomeBigObject &b)->bool{ return (a < b); }
 std::lower_bound(arr.begin(), arr.end(), x, cmpFunc2); // 3番目の引数は検索キーx

ところがソートされているindices上の検索キーは、検索したい実際のオブジェクトxから
ただちには求められない(普通にやったら線形探索の手間がかかる、。n_
2021/04/06(火) 17:08:29.35ID:mAZMW+WU
 auto cmpFunc3 = [&](int idx, const SomeBigObject& xx)->bool{ return arr[idx] < xx; }
 auto i = std::lower_bound(indices.begin(), indices.end(), x, cmpFunc3);
arr[*i];
じゃあこれで
2021/04/06(火) 18:31:21.10ID:rUOwZVXJ
>>117
ムリス、

つか次のように死ぬほど腐った書き方をしたらとりあえずできるた、
/// 間接ソート版lower_bound
int custom_lower_bound(const std::vector<SomeBigObj>& arr, std::vector<int>& indices, const SomeBigObj& x)
{
 // SomeBigObjの間接ソート用比較関数
 // xのコピーを避けるため[&](a, b)とする。
 auto cmpFunc = [&](const int a, const int b)->bool {
  // 有り得ないindex値が渡ってきたらxとみなす。
  const SomeBigObj& obj1 = (a < 0) ? x : arr[a];
  const SomeBigObj& obj2 = (b < 0) ? x : arr[b];
  return (obj1 < obj2);
 };
 // lower_bound()の第3引数(検索キー)を有り得ないindex値にしておく。
 auto found_it = std::lower_bound(indices.begin(), indices.end(), -1, cmpFunc);
 // Indexに変換
 return (int)std::distance(indices.begin(), found_it);
}

動作するサンプル例:
https://ideone.com/xbSHmi
2021/04/07(水) 00:39:13.23ID:C05ugDVV
const int lb = std::distance(indices.begin(),std::partition_point(indices.begin(), indices.end(), [&x,&arr](const int i){ return arr[i] < x; }));
これでどうかな?
2021/04/07(水) 01:13:46.41ID:B+YGKOyD
>>115
エピさんかしらん
2021/04/07(水) 01:17:07.25ID:KcAzRCeR
>>118
動くってば
http://ideone.com/v9R75s
2021/04/07(水) 05:42:50.50ID:FlnHFJBF
>>121
しらそん
おま環
2021/04/07(水) 06:26:08.77ID:hpqJGpH8
>>122
動かないのをおま環言うのはよく聞くがその逆を聞いたのはこれが初めてかも
2021/04/07(水) 07:24:58.99ID:FlnHFJBF
確かに動いているように見えるが(呼び出し回数も2分探索相当に見えるが)
Compにそんな引数渡して委員会?!
錯覚じゃないの;;;
2021/04/07(水) 08:00:02.53ID:FlnHFJBF
std::lower_bound(first last, value, comp);
という呼び出しにおいて、compはcomp((firstやlastと同じ型のiteratorが指す要素), value)
という呼び出され方しかされないこと、および
valueの型はfirstやlastが指す要素の型とま無関係に好きな型にして良いと規格で決まっている?!
2021/04/07(水) 09:20:20.01ID:F9L3hm15
チラッと規格見た限り
value は first、last と無関係でいいし
comp の第一引数はfirst、lastのiteratorが指す型で、第二引数はvalueの型に決まっているように見える
2021/04/07(水) 12:44:59.78ID:94shRdbf
>>51じゃないが、オブジェクト指向で設計する意味が分からなくなった
汎用性の高いフリー関数が沢山あればそれで良いじゃん
2021/04/07(水) 15:37:37.40ID:2guWvkPP
>>126
> comp の第一引数はfirst、lastのiteratorが指す型で、第二引数はvalueの型に決まっているように見える
そこは決まってないと思う。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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