トップページ⇒tech
1001コメント325KB

【初心者歓迎】C/C++室 Ver.72【環境依存OK】

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/03/05(金) 16:51:13
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.71【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1264774545/

【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
http://codepad.org/ (コンパイルもできるし出力結果も得られるのでお勧め)

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
03223132010/04/02(金) 17:00:48
>>321
ありがとうございます!
>ただ考え方としては型名で、Cとの互換からTagとしての属性を残している

この一言ですっきりしました。

あと >>315 さんの calc の行と合わせて、>>319 さんの言う 「ほとんど同じ」 も合わせて、
すっきりしました。 ありがとうございました。
0323デフォルトの名無しさん2010/04/02(金) 17:53:27
なぜboostには動的削除子付きの非共有スマポがないの?
0324デフォルトの名無しさん2010/04/02(金) 22:32:56
>>323 それは君がまだライブラリの提案を出していないからじゃないかね?
0325デフォルトの名無しさん2010/04/03(土) 15:29:48
スマートポインタを使うにしろ自作するにしろ
過去の蓄積との整合性を保つのが面倒だし一度使い出すと今後ずっと縛られることになるしなぁ
標準で実装されてるならともかく、
いくらboostみたいな有名なライブラリとはいえ非標準に依存するのはちょっと違和感あるなと時々思う
0326デフォルトの名無しさん2010/04/03(土) 16:49:37
>>325
> 非標準に依存するのはちょっと違和感あるなと時々思う
外部ライブラリもAPIすら使わないで
標準C/C++の範囲だけで書かれた有名なソフトウェアは
俺は一つもしらんのだが。
C/C++の限界でしょそれは。
0327デフォルトの名無しさん2010/04/03(土) 19:02:31
>>326
フレームワークみたいな使い方になっちゃうってことじゃない?
0328デフォルトの名無しさん2010/04/04(日) 02:34:35
メンバ変数のないメンバ関数だけのクラスのサイズは0でよいのでしょうか?
0329デフォルトの名無しさん2010/04/04(日) 02:37:59
>>328
そうとは限らない。
0330デフォルトの名無しさん2010/04/04(日) 02:48:38
>>328
C++では0ではない事が規格で保証されている
理由を聞くとアドレスを取るためだと
0331デフォルトの名無しさん2010/04/04(日) 10:28:12
何故クラスのサイズが0だと思ったのか
0332デフォルトの名無しさん2010/04/04(日) 12:02:22
Cでは空の構造体のサイズが0になるからだろ
C++は仮想関数などポインタに入れて使う使い方もあるので
(もっともvtableなどで元々0ではないかもしれないが)空の
構造体やクラスでも0にはならないように設計されている
0333デフォルトの名無しさん2010/04/04(日) 12:25:49
>>328
> メンバ変数のないメンバ関数だけのクラスのサイズは0でよいのでしょうか?
むしろほぼ間違いなく0にはならないことが保証される。
例外はEBOが働いた時のみ
0334デフォルトの名無しさん2010/04/04(日) 12:31:20
じゃあ空の構造体はCとC++で互換性が無いのか
0335デフォルトの名無しさん2010/04/04(日) 12:43:37
( ・∀・)つ〃∩ へぇ〜初めて知った

EBO (Empty Base Optimization)
空の基底クラスの最適化。

メンバ変数を一個も持たない、空のクラス、というものが出来ることがあります。
しかし空のクラスであっても、アドレスは一意に決めなくてはならないので、
izeof( EmptyClass ) は 0 にはなりません。
EmptyClass arr[100];
assert( &arr[0] != &arr[1] ); // アドレスは違ってて欲しい単独で使う時には
この無駄は仕方のないところですが、 例えばこの空クラスから他のクラスを派生
するときは、EmptyClass の分のサイズは 0 にして、派生クラスのメンバ変数の
分だけを確保する、という最適化が可能です。 C++の規格で許されているこの
最適化のことを、Empty Base Optimization と呼びます。
0336デフォルトの名無しさん2010/04/04(日) 12:43:45
>>334
sizeof(空の構造体)が0になることがC言語の標準規格で保証されていたかは
記憶にないけど、もしそうならC++と互換性が無い点になるだろうね。

でもsizeof(空の構造体)==0に依存したソースってどんなんだ?
0337デフォルトの名無しさん2010/04/04(日) 16:00:36
>>332
ISO C 6.2.6.1 p2
> Except for bit-fields, objects are composed of contiguous sequences of one or more bytes, ...

C でもサイズは 0 にならないよ。
03383362010/04/04(日) 16:14:04
>>337
ほー。
じゃあむしろEBOが特例でサイズが0となり、
それ以外は標準C/C++では必ず1 or more バイトはかかるわけだ。 

ありがとう。
0339デフォルトの名無しさん2010/04/05(月) 00:47:17
struct hoge {};
struct hoge fuga[42];
で&fuga[0] < &fuga[1]でないと色々厄介だからね。
0340デフォルトの名無しさん2010/04/05(月) 14:34:38
class iface {...};
class impl_a : public iface {...};

impl_a a1, a2, a3(a1); // ok
a1 = a2; // ok

iface &i1 = a1, &i2 = a2; // ok
iface i3, i4(i1); // ng
i1 = i2; // ng

ifaceの生成コピー代入を禁止したままimpl_aの生成コピー代入を許可する、再利用性のあるイディオムはありますか?
protectedな生成コピー代入をifaceに持たせれば仕様は満たすのですがこれは再利用性がなく
boost::noncopyableではimpl_aもコピー代入不可になってしまうので条件に合いませんでした
0341デフォルトの名無しさん2010/04/05(月) 17:54:44
かな、ローマ字入力方式がどちらなのか取得したいのですができません。同じ値が常に出力されます。
どうすればいいでしょうか?


切り替え自体はできてます。
2kXPVista7、OSデフォルトかOffice付属のIME
検証自体はwindows 7 office2007IME VC++2008Expressでしてます。
http://codepad.org/cVmmTnfL
0342デフォルトの名無しさん2010/04/05(月) 20:30:55
>>340
生成すら不可にしたいならインターフェースクラスにするとかかな?
良いのが思いつかないので下で探して。
http://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms
0343デフォルトの名無しさん2010/04/05(月) 23:01:28
コピーコンストラクタでメンバ変数ポインタの中身をディープコピーしようと思うのですが
メンバ変数ポインタの型の代入演算子に依存しないディープコピーの方法はないでしょうか?
0344デフォルトの名無しさん2010/04/05(月) 23:04:54
Hoge(const Hoge &other) : fuga(new Fuga(*other.fuga))
{
}
0345デフォルトの名無しさん2010/04/05(月) 23:05:54
>>343
> メンバ変数ポインタの型の代入演算子に依存しないディープコピーの方法はないでしょうか?
素直に普通にCopy Constructorを書くとそうならない?
テンプレート引数をT型とすると、

// Copy Constructor
MyClass(const MyClass& other)
{
pointer = new T(*other.pointer); // pointerは生ポインタ or スマートポインタ型とする。
}
じゃダメなんすか?
03463452010/04/05(月) 23:06:50
演算子の優先順位が不安になったから少々修正。

// Copy Constructor
MyClass(const MyClass& other)
{
pointer = new T( *( other.pointer ) ); // pointerは生ポインタ or スマートポインタ型とする。
}
じゃダメなんすか?
0347デフォルトの名無しさん2010/04/05(月) 23:37:38
メンバ変数ポインタって A B::*p; とかのことか?
汚いけどこれでどうよ。

#include <new>

class A { public: A() {} };
class B {
public:
B() : m_a(operator new(sizeof(A))) { }
~B() { operator delete(m_a); }
A* GetA() { return reinterpret_cast<A*>(m_a); }
const A A1;
const A A2;
const A A3;
void Copy(const A B::*p) {
GetA()->~A();
new (GetA()) A(this->*p);
}
private:
void* m_a;
};

int main() {
B b;
b.Copy(&B::A1);
b.Copy(&B::A2);
b.Copy(&B::A3);
}
0348デフォルトの名無しさん2010/04/06(火) 00:08:37
メンバ変数ポインタだと別な意味なことにいまさら気がついた
ポインタ型メンバのポイント先とでもいえばいいのかな?

>>346
これも言葉足らずでした
コピーコンストラクタや代入演算子のような相手方の実装に依存しないコピー、ということでした
0349デフォルトの名無しさん2010/04/06(火) 00:50:07
>>340 iface に純粋仮想関数を宣言する。
0350デフォルトの名無しさん2010/04/06(火) 00:51:33
>>348
コピーコンストラクタやコピー代入演算子を使わずにコピーしろというのか?
0351デフォルトの名無しさん2010/04/06(火) 06:40:36
なにそれこわい
0352デフォルトの名無しさん2010/04/06(火) 07:22:33
コピコンも代入演算子も禁止してディープコピーとか正気の沙汰じゃないぞw
というか、相手方の実装に依存しないためのコピコンや代入演算子じゃないのか
0353デフォルトの名無しさん2010/04/06(火) 07:23:23
>>349
相手方の実装におもいっきり制約かけてんじゃん
0354デフォルトの名無しさん2010/04/06(火) 08:22:59
多分、本当にやりたいことは微妙に違うんじゃないの?
void* で持ってて型情報が消えてるんだけど deep copy したいとか。
だったら、type erasure あたりでぐぐれば参考情報があるかも。
0355デフォルトの名無しさん2010/04/07(水) 05:32:01
Windowsでミリ秒まで計測する方法を教えてください
0356デフォルトの名無しさん2010/04/07(水) 05:38:11
>>355
ttp://www14.big.or.jp/~ken1/tech/tech19.html
0357デフォルトの名無しさん2010/04/07(水) 13:23:05
RAIIに関する質問なんですけど、デストラクタでリソースの開放を行った場合
生のリソース開放処理が失敗した場合に例外も戻り値も使えないのでエラーを通知する方法が無いように思えるのですが
開放に失敗した時に、(侵入的ではない方法で)何か処理をしたい場合はどうすればいいんでしょうか?
0358デフォルトの名無しさん2010/04/07(水) 19:30:14
>>353
インターフェースってそういうもんじゃないの?
0359デフォルトの名無しさん2010/04/07(水) 19:34:56
>>357
リソース解放を行って成功したかどうかを返すメンバ関数を追加する。

デストラクタにも解放処理は置くけど、こっちはエラーを通知しない。
かわりにログを吐くか、あるいはその場で死ぬか。
0360デフォルトの名無しさん2010/04/08(木) 16:29:19
clock()を使って計測する際、OpenMP等を使ったりした場合でも、CPU時間を求めることができるのでしょうか?
0361デフォルトの名無しさん2010/04/08(木) 16:44:57
はい。
0362デフォルトの名無しさん2010/04/08(木) 18:44:46
clockって実時間じゃなかったの??
0363デフォルトの名無しさん2010/04/08(木) 19:04:04
>>362
少なくとも、POSIXのclock()はプロセッサ時間だよ。
0364デフォルトの名無しさん2010/04/09(金) 11:16:13
ソリューションSの中にP1,P2という二つのプロジェクトを入れています。
プロジェクトP1の中にLobbyForm.hというヘッダーファイルがあり、プロジェクトP2内のmymain.cppの中でLobbyForm.hをインクルードしています。
当然mymain.cppの2行目に#include "LobbyForm.h"と記載しています。

これでVisualC++2008EEにてソリューションのビルドをかけると以下のエラーが出ます。
エラー 2 fatal error C1083: include ファイルを開けません。'LobbyForm.h': No such file or directory c:\users\********\documents\保存用\projects\lobbyformmain\lobbyformmain\mymain.cpp 2

LobbyForm.h(インクルードするヘッダーファイル)の場所
C:\Users\********\Documents\保存用\projects\LobbyFormLib

mymain.cpp(インクルードの宣言場所)の場所
C:\Users\********\Documents\保存用\projects\LobbyFormMain\LobbyFormMain

どの部分を直せばビルド可能になりますでしょうか?教えてください。
0365デフォルトの名無しさん2010/04/09(金) 11:17:30
パスとおせ
0366デフォルトの名無しさん2010/04/09(金) 11:26:15
>>365
できました、ありがとうございます!
0367デフォルトの名無しさん2010/04/09(金) 14:32:04
ポート番号のwell-known portというのはなぜ存在するのでしょうか?
65536種類もポート番号があるならば、最初からプログラムごとにバラバラの番号を指定しておけばよいような気がします。
HTTPは80などと標準を作ることによるメリットとはなんでしょうか?
0368デフォルトの名無しさん2010/04/09(金) 14:48:37
>>367
例えば
IE は 80
FireFox は 81
Netscape は 82
Lynx は 83
Opera は 84
みたいにしたほうがいいって思ってるの?
0369デフォルトの名無しさん2010/04/09(金) 14:52:29
ISPによってはwell-known port以外のパケットはポートアタックと
見なして通さない所があるからだよ
NNTPは119だっけ
0370デフォルトの名無しさん2010/04/09(金) 16:16:25
>>368
いいというか、大量に番号がある中でわざわざバッティングするようなことをしなくてもと思ってました。
>>369
そういった守り(?)の理由があるのですね、勉強になりました、ありがとうございます。
0371デフォルトの名無しさん2010/04/09(金) 17:46:09
ポート番号ってのは電波の周波数みたいなもんでな…
予めどれを使うのかわかってなければ通信を成り立たせる事も出来ないだろうが
0372デフォルトの名無しさん2010/04/09(金) 18:07:15
もしかしてサーバー側とクライアント側の区別が付いてないんじゃない
0373デフォルトの名無しさん2010/04/09(金) 20:11:37
double型の数値を0.0から1.0の範囲で安全性を確保した上でできるだけ小さい幅でインクリメントしたいと考えています。

double d = 0.0;
for (...);
{
 d += DBL_EPSILON;
}

みたいなコードはそれを保証してくれるのでしょうか?
演算の誤差判定にしか使えないのでしょうか?
0374デフォルトの名無しさん2010/04/09(金) 20:24:39
>>373
等間隔でインクリメントということだよね?
そのコードは規格上では多分何も保証してくれてないけど、
IEEE754準拠の環境上ならそれでOK。

まぁdoubleでそれやると4500京回以上ループ回るが。
0375デフォルトの名無しさん2010/04/09(金) 20:34:50
>>374
52bit程度だからそんなに精度はないはず
0376デフォルトの名無しさん2010/04/09(金) 20:44:07
時間測定してみりゃいいじゃん
今時のCPUなら速いだろ
0377デフォルトの名無しさん2010/04/09(金) 20:45:40
すぐに桁落ちして増えなくなるな
0378デフォルトの名無しさん2010/04/09(金) 20:53:35
でも今のOSは簡単にループを止めれていいわ

DOS時代はリセットしかなかったからなあ
03793752010/04/09(金) 20:56:59
>>375
おお、4500兆か。

億、兆、京と数えていたつもりだったんだが、万をすっかり忘れていた
0380デフォルトの名無しさん2010/04/09(金) 20:57:19
374ね。
0381デフォルトの名無しさん2010/04/09(金) 21:17:14
>>374

[0.0 - 1.0]
の間で常に
d + DBL_EPSILON > d
を満たせばいいということです。

できるみたいですね、ありがとうございます。
0382デフォルトの名無しさん2010/04/09(金) 21:26:27
> d + DBL_EPSILON > d
むりっしょ
0383デフォルトの名無しさん2010/04/09(金) 21:30:26
その精度は本当に必要なのかまず考える
必要ないなら整数最大値で整数を割った値を使う
0384デフォルトの名無しさん2010/04/09(金) 21:50:05
>>382
無理じゃねーだろ
0385デフォルトの名無しさん2010/04/09(金) 22:14:58
DBL_EPSILONの精度が0附近ではあっても1附近でもあるかどうかが問題だな。
0386デフォルトの名無しさん2010/04/09(金) 22:21:41
>>385
定義は
1.0+DBL_EPSILON > 1.0
が成り立つ最小の数値だから大丈夫
0387デフォルトの名無しさん2010/04/09(金) 22:38:03
この程度が限界だな 1.0にしたらいつ終わるかわからん
struct foo {
__int64 start, end, freq;
HANDLE hprocess;
DWORD oldclass;

foo() : hprocess(GetCurrentProcess()), oldclass(GetPriorityClass(hprocess)) {
Sleep(10);
// SetPriorityClass(hprocess, REALTIME_PRIORITY_CLASS);
QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
QueryPerformanceCounter((LARGE_INTEGER*)&start);
}
~foo() {
QueryPerformanceCounter((LARGE_INTEGER*)&end);
// SetPriorityClass(hprocess, oldclass);
std::cout << (int)(end - start) << std::endl;
}
};

int main()
{
{
std::cout << "test1 : ";
foo f;
double d = 0.0;
while (true) {
d += std::numeric_limits<double>::epsilon();
if (d > 1e-7)
break;
}
}
}
0388デフォルトの名無しさん2010/04/10(土) 00:40:59
C++使ったアプリ設計能力ってどこで身につけるんだ
0389デフォルトの名無しさん2010/04/10(土) 00:42:51
>>388 チーム開発の現場で。
0390デフォルトの名無しさん2010/04/10(土) 10:24:51
VC++なんですが、自動でインデントを設定させる方法はどこで設定すればよいのでしょうか
VBだとデフォルトでそうなっているので、同じようにしたいのです
0391デフォルトの名無しさん2010/04/10(土) 13:53:28
前提としてVC++2008Expressの話で、特に設定とかしてないけど、
普通に改行だけでちゃんと続きのインデントになってるぜ?

VB(6/.NET)がどうなのかは知らないが
0392デフォルトの名無しさん2010/04/10(土) 14:01:12
はい、VC++2008Expressです。自動的、といより強制的と言うべきでした
VBで↓を入力すると、強制的にこの形になるんです。二行目にタブを余分に入れても、タブを消してもこの形に戻ります
ある程度コードを書いてから、全体をifやforで括りたくなったときに威力絶大です
そういった機能は無いでしょうか?
Class tex
    Inherits TextBox
    Sub New()
        Text = 123
    End Sub
End Class
0393デフォルトの名無しさん2010/04/10(土) 14:21:27
無いと思う
範囲選択して Ctrl+K, Ctrl+F くらいしかできないな
0394デフォルトの名無しさん2010/04/10(土) 14:28:30
ありがとうございましたー
ショートカットキー使わせてもらいます
0395デフォルトの名無しさん2010/04/10(土) 14:30:37
>>393
一気に生理できました!すごく見やすいです。感激です。
0396デフォルトの名無しさん2010/04/10(土) 19:12:42
>>395
初潮迎えたのか
0397デフォルトの名無しさん2010/04/10(土) 21:57:01
>>396
俺が思っても言わなかったことを・・・
0398デフォルトの名無しさん2010/04/10(土) 22:47:07
一気にてwww

初潮の年齢は幅があるだろうが普通は10〜14歳だから、
その年齢でそれだけのプログラミングをする女って
すげぇ優秀だな
0399デフォルトの名無しさん2010/04/10(土) 22:54:05
天才ハッカー美少女と聞いて
0400デフォルトの名無しさん2010/04/10(土) 22:57:47
天才ハッカー少女って
ところまではあっているだろうが。。。
0401デフォルトの名無しさん2010/04/11(日) 10:25:37
以下のソースがclでは通るのですが、bcc32 (ver5.5.1)では通りません。
原因分かる人がいたら教えて下さい。

#include <cstdio>
#include <windows.h>

int main()
{
return 0;
}
0402デフォルトの名無しさん2010/04/11(日) 11:14:41
エラーメッセージも貼れないの?
04034012010/04/11(日) 11:20:36
>>402
エラーメッセージです。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10567.txt
0404デフォルトの名無しさん2010/04/11(日) 11:46:47
>>401
#include <windows.h>
#include <cstdio>

int main()
{
return 0;
}
0405デフォルトの名無しさん2010/04/11(日) 11:50:17
>>403
ああそれBCC5.5.1が古すぎてインクルードの前後関係で
エラーが出てしまう奴だね

他にもRogueWaveのiostreamなどを使っていてバグはいくつか
知られているよ
04064012010/04/11(日) 11:57:12
>>404, 405
コンパイル通りました。ありがとうございます。
インクルードの前後関係でエラーになるんですね。
0407デフォルトの名無しさん2010/04/11(日) 13:07:33
>>405
これはひどいなBCC
0408デフォルトの名無しさん2010/04/11(日) 13:11:59
今BCCはEmbarcadero CC 6.2.1になってバグはほとんど取れ、
Boostにも部分的にではありますが対応してます

吐くコードの質もかなり向上してます

でもVC9には全然叶いませんが
それからコンパイル速度が遅くなりましたね
0409デフォルトの名無しさん2010/04/11(日) 13:46:00
>>408
> 今BCCはEmbarcadero CC 6.2.1になってバグはほとんど取れ、
> Boostにも部分的にではありますが対応してます
ECC6.2.1とか無償で使えないんだよね?
BCC大好きっ子でもない限り、ECCに金を払ってみる気にならんし・・・。

はやくBCC5.5.1に取って代わってくれ。
0410デフォルトの名無しさん2010/04/11(日) 13:47:22
VC9って無料版は最適化積んでなくね?
0411デフォルトの名無しさん2010/04/11(日) 14:12:26
>>410
そんなことはない。
プロファイル使った最適化は使えないが、/O1、/O2くらいは使える。
0412デフォルトの名無しさん2010/04/11(日) 14:29:16
>>410
一体なんでそう思ったんだ
0413デフォルトの名無しさん2010/04/11(日) 15:02:25
で、入力補完の充実したエディタはないんですか?
0414デフォルトの名無しさん2010/04/11(日) 15:37:37
emacsでabbrevでもしてればいいよ
0415デフォルトの名無しさん2010/04/11(日) 19:36:14
勝手に入力補完されるとうっとおしいんで、
いつも M-x fundamental-mode してる
0416デフォルトの名無しさん2010/04/12(月) 13:36:17
C++で3Dアクションゲームを作ろうと思うのですが、
Directx+ライブラリ
http://homepage2.nifty.com/natupaji/DxLib/index.html
を使うか、
ODE
http://www.koj-m.sakura.ne.jp/ode/
を使うかどちらの方が楽でしょうか
ジャンプ等の移動関係は後者が有利そうで、描画に関しては前者が優れてそうなかんじなのですが
0417デフォルトの名無しさん2010/04/12(月) 13:44:20
>>416
そのODEって知らないけど、サイトの説明見た限りで言えば、
多分初心者が手を抜いて簡単にゲーム作る為の物じゃないと思うぜ。 そのライブラリの方言をどっさり覚えないといけないと思う。
単にシミュレーションなどのデモ作るには良さそうだけどね。 リアルタイムゲーム的な物向けじゃない気がする。

あと、質問内容から察してなんとなくDirectX自体良くわかってなさそうなんだけど(失礼)、
多分3Dアクションってあたりから、最終的にやらねばならないコーディング内容は、
DxLib でも DirectX直接でもあまり変わらないと思うので、どちらかと言えば DirectX 直接の方が
いろんな意味で楽で作業も早いかもしれない。

よく、初期化処理とか面倒で、みたいな事言う人もいるけど、あんなの定型処理なので意味さえわかってれば簡単だし、
メッシュモデルを移動や回転などさせる処理も単に行列用意してかけるだけ、みたいな簡易な関数も用意されてるので、
やってみれば意外にすんなりいけると思う。 そんな感じ
0418デフォルトの名無しさん2010/04/12(月) 13:57:01
>>417
ありがとうございます
実際よくdirectxは分かってないです・・
directxを直で書いてみます
0419デフォルトの名無しさん2010/04/12(月) 14:10:55
つーか、3Dゲームに必要な数学の素養はあるのかと。
0420デフォルトの名無しさん2010/04/12(月) 15:14:53
全くないです!作りながらおぼえます
0421デフォルトの名無しさん2010/04/12(月) 15:47:42
ある関数が定義されているかどうかを知る方法を教えて
■ このスレッドは過去ログ倉庫に格納されています