X



【初心者歓迎】C/C++室 Ver.101【環境依存OK】 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2017/07/18(火) 07:07:27.20ID:vzMDiUgd
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。

【アップローダー】(質問が長い時はココ使うと便利)
http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)
http://ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)

前スレ
【初心者歓迎】C/C++室 Ver.100【環境依存OK】
http://mevius.2ch.net/test/read.cgi/tech/1478440682/
0383デフォルトの名無しさん
垢版 |
2017/08/12(土) 22:15:11.32ID:KtFjlZWy
class C {
private:
static int secret;
public:
friend int peep() {return secret;}
};
このpeepはどうやって呼び出すのが正解なんだぜ?
0385デフォルトの名無しさん
垢版 |
2017/08/12(土) 22:25:08.16ID:KtFjlZWy
>>384
コンパイルは通るんだがまるで飲み込まれたようだぜ
c.peep();
peep();
C::peep();
どれも反応しない
0386デフォルトの名無しさん
垢版 |
2017/08/12(土) 22:28:18.66ID:3DdLvbHE
へー、通るんだ。
とりあえず、peep()はメンバー関数じゃないから引数にCを渡すなりするのが普通の使い方だろう。
0388デフォルトの名無しさん
垢版 |
2017/08/12(土) 22:41:10.73ID:KtFjlZWy
おおお
Cクラス渡すと通った
class C {
private:
static int secret;
public:
friend int peep(C data) {return secret;}
};
int PosCalc(BOOL flag) {
C data(0, 0)
int count = peep(data);
//いろいろ計算
}
ダミーでインスタンス渡すってことなんだな
0395デフォルトの名無しさん
垢版 |
2017/08/13(日) 01:36:36.53ID:HI8S2XNx
文脈で判断しないと。CでROMつったら不揮発性メモリのこと。CDROMのことではない。
0396デフォルトの名無しさん
垢版 |
2017/08/13(日) 01:39:15.30ID:PA7iDDOj
それにしてもfirendって付けた関数の方にボディーを書くことが出来るんだな
キモ
0401デフォルトの名無しさん
垢版 |
2017/08/13(日) 08:21:05.43ID:49RznEc3
揮発不揮発は関係ない
読み込みと同等の速度で普通に書き込みが出来るか
Cの場合、普通の代入やmemcpyで普通に書き込み出来るかどうか
0404デフォルトの名無しさん
垢版 |
2017/08/13(日) 10:16:39.11ID:TSMbvEPJ
>>395
メモリの不揮発性ってのは意味合いが違うぞ。
フラッシュメモリは不揮発性だがROMではない。
0418デフォルトの名無しさん
垢版 |
2017/08/14(月) 00:46:16.17ID:NpV9/t44
フラッシュもEEPROMもROMと呼ばれる
ROMの語源はRead Only Memory
でも、今は消去や書き込みが可能なメモリにも使われるようになった

読み書きともランダムアクセスが可能で、アクセス時間も読み込みと書き込みで大きな差が無いものがRAM
DRAMやSRAM, MRAM, FRAMがこの範疇

そうでないものがROM
NAND, NOR, EEPROMなんかはROMという扱い
0419デフォルトの名無しさん
垢版 |
2017/08/14(月) 00:59:13.70ID:qET1a6fj
いろんな人がいるね。
俺の中では電源切っても覚えてるかどうかの違いだよ。
0422デフォルトの名無しさん
垢版 |
2017/08/14(月) 01:33:45.85ID:IT2ffc23
ID:qET1a6fjが非常識なのはよく分かったけどあまり言いふらさない方が生活し易いと思うよ
0424デフォルトの名無しさん
垢版 |
2017/08/14(月) 04:51:13.03ID:qbtpazWw
template <typename T>
class DataStoreArray
{
public:
explicit DataStoreArray(std::size_t size) : mValueArray(new T[size]) {}
~DataStoreArray() { delete [] mValueArray; }
inline T operator[](std::size_t index) const
{
cout << "from primary : T : " << index <<endl;
return mValueArray[index];
}
inline T& operator[](std::size_t index)
{
cout << "from primary : T& : " << index <<endl;
return mValueArray[index];
}
private: T* mValueArray;
};
int main()
{
static const int size = 3;
DataStoreArray<int> iStoreArray(size);
for (int i = 0; i < size; ++i)
{
iStoreArray[i] = i * 10;
}
}
from primary : T& : 0
from primary : T& : 1
from primary : T& : 2
iStoreArray2[i] = i * 10;で[]をオーバーロードした時
戻り値がT&のほうが呼び出されるのはなんででしょうか?
0425デフォルトの名無しさん
垢版 |
2017/08/14(月) 05:23:42.65ID:P3rVXCaa
class Point {
public:
Point() {}
int x, y;
};

std::vector<Point*> vec;
vec..push_back(new Point());

こんな感じに作られたvectorの中のPointを解放するにはどうしたらいいでしょうか
以下のようなコードを考えて実行していたところ、free_base.cppというところで例外が発生しました
内容は「block Error reading register value.」です
for (unsigned int i = 0; i < vec.size(); i++) {
delete vec[i];
}
0426424
垢版 |
2017/08/14(月) 05:24:58.54ID:qbtpazWw
>>424
自己解決しました。
0427デフォルトの名無しさん
垢版 |
2017/08/14(月) 05:58:41.65ID:qbtpazWw
>>425
タイプミスとは思うけどvec..push_backのドット2つ付けてるのが原因じゃ
0434デフォルトの名無しさん
垢版 |
2017/08/14(月) 22:21:54.47ID:i3ERgNqH
2chにコード書きこんで質問するんなら
そのコードで問題が再現するのかどうなのかぐらい確認してから
書き込んだ方が良いだろうな、常識的に
0436デフォルトの名無しさん
垢版 |
2017/08/14(月) 23:24:57.28ID:gV3KeQMV
普通は再現する最小限のコードこさえてる時点で
たいていはバグの原因に気付いて質問やめる
0438デフォルトの名無しさん
垢版 |
2017/08/15(火) 01:01:30.84ID:xb8goknd
>>437
WindowsのHeapFreeが出したりするエラーで基本的にはメモリをぶっ壊してる事に起因するらしい
ただしリビルドしたら治ったとかいう話もあったりしてなんだか分からない
0439デフォルトの名無しさん
垢版 |
2017/08/15(火) 01:17:41.90ID:ILMibSrs
なら、流行の方法は知らないけど、ポインタを最初にNULLできちんと初期化して
NULLチェックしてからdeleteして、deleteしたら忘れずにNULLで初期化すれぱいいんじゃないの。
0441デフォルトの名無しさん
垢版 |
2017/08/15(火) 01:43:30.18ID:z7TEyY+0
>>439
deleteするときのNULLチェックていらないよね
NULL(nullptr)のdeleteは何も起こらない保証があるから使い終わった後にNULL代入するのはよくやるけど

まぁ今どきのC++なら素直に>>440だね
0442デフォルトの名無しさん
垢版 |
2017/08/15(火) 02:48:07.41ID:ILMibSrs
調べたらいっぱいあって余計に混乱しそうだわ
auto_ptr
unique_ptr
shared_ptr
weak_ptr
0444デフォルトの名無しさん
垢版 |
2017/08/15(火) 08:15:54.91ID:GzAS59pw
>>442
auto_ptr ⇒ オワコン、使用禁止
unique_ptr ⇒ 共有しないならこれ
shared_ptr ⇒ 共有するならこれ
weak_ptr ⇒ はて?いつ使うんだこれ
0448デフォルトの名無しさん
垢版 |
2017/08/15(火) 15:03:52.07ID:cAweUVNO
話題に便乗して。
new,delete満載の既存のコードをスマポに置き換えてくコツみたいのってあります?
作り直したほうが早いのかな
0449デフォルトの名無しさん
垢版 |
2017/08/15(火) 18:45:11.19ID:tu7eHngw
shared_ptrか生ポの入ったvectorを基底クラスにアップキャストするスマートな方法おしえてください
割と使うくせに良い方法が思いつかない
0451デフォルトの名無しさん
垢版 |
2017/08/15(火) 23:43:12.59ID:VOm+amDT
アップキャストは特に何もしなくても必要になれば勝手に安全にアップキャストされるから
アップキャストするスマートな方法って質問の意図が良くわからない
というか、安全に勝手にアップキャストされるのは静的型のメリットの一つだし
0452デフォルトの名無しさん
垢版 |
2017/08/16(水) 00:01:22.48ID:2E64Am1a
あーやっと質問の意味が分かった
vectorをvectorごとアップキャストして別のvectorに代入するのか
そんなことしたいと思ったこともなかったから分からなかったわ
アップキャストするときにアドレスをオフセットしなきゃならない場合があるから
勝手にはしてくれないんじゃないかな
たしかC#は勝手にしてくれるんだっけか
0453デフォルトの名無しさん
垢版 |
2017/08/16(水) 00:25:49.33ID:2E64Am1a
なにかstd::の中に便利なものが用意されているかもしれないが
template< typename _t, typename _u >
void copy( std::vector<_t> &dst, std::vector<_u> &src )
{
  auto size = src.size();
  dst.resize( size );
  auto dst_ptr = dst.data();
  auto src_ptr = src.data();
  for( size_t i = 0; i < size; ++i )
  {
    dst_ptr[ i ] = src_ptr[ i ];
  }
  return;
}
このような感じの適当なテンプレートでも作って対応したらどうですかね
もうちょっと汎用性を持たせることも出来るけど、std::listとかまず使わんし
vector専用ってことで良いんじゃないかな
0454デフォルトの名無しさん
垢版 |
2017/08/16(水) 00:44:05.66ID:2E64Am1a
あ〜でもデフォルトのアロケータにしか対応しないのはアレか

template< typename _t, typename _u >
void copy_vector( _t &dst, _u &src )



template< typename _t, typename _u, typename _v, typename _w >
void copy( std::vector<_t, _u> &dst, std::vector<_v, _w> &src )

の方が良いのかね
0458デフォルトの名無しさん
垢版 |
2017/08/16(水) 16:09:03.15ID:53LlWcIm
>結果は規定されてますか?
Yes
ISO/IEC 9899:2011 7.1.1/1では終端ヌルはstringの一部なので同じと見なされるだろう
ISO/IEC 14882:2014 21.8のstrcmpはCの規格丸投げなので同じだろう
0459457
垢版 |
2017/08/16(水) 16:17:21.15ID:mnlpMbS3
ありがとうございます
0460デフォルトの名無しさん
垢版 |
2017/08/16(水) 19:58:01.86ID:SkaUp3/b
>>454
こういうtemplateやtypenameが入り混じったc++のソースってc#好きの俺には耐えられん。ごちゃごちゃしていて見た目が美しく無いよね。
0462デフォルトの名無しさん
垢版 |
2017/08/16(水) 21:21:06.13ID:64ASz8nj
int main() {
std::deque<int> deq(10);
const std::deque<int>::size_type size = deq.size();
for (int i = 0; i < static_cast<int>(size); ++i) { deq[i] = i; }
std::cout << deq.front() << std::endl;
}
配列のサンプルコードで
const std::deque<int>::size_type size = deq.size();
こういう記述を良く見るんですが、
int size = deq.size();
では駄目なケースとかあるんですか?
0463デフォルトの名無しさん
垢版 |
2017/08/16(水) 22:14:04.28ID:1Ba2PBWP
テンプレートのウザイ仕様です
型に依存したコードにならざるをえないのに、
使えと強要するような型定義
0465デフォルトの名無しさん
垢版 |
2017/08/16(水) 22:45:16.00ID:zl8YLx97
それより
auto size = deq.size();
for (int i = 0; i < size; i++ );
で比較の部分に警告が出るのを何とかして欲しい
0470デフォルトの名無しさん
垢版 |
2017/08/17(木) 03:45:02.07ID:sil69yD8
この手の話をする時間が勿体ない
c++の言語仕様に悩む時間が無駄
俺も頃合みて捨てるわ
0472はちみつ餃子 ◆8X2XSCHEME
垢版 |
2017/08/17(木) 03:49:09.87ID:K5IWxEsn
>>469
あかんよ。
この場合、 deq の型はたぶん deque を想定してるんだと思うけど、
deq.size() の返却値が size_t である保証はないはず。 (他のコンテナでも同様)
この型はあくまでも deque::size_type なので、
まあ一般的には size_t と同じになるだろうけど厳密に言えばそれをあてにするのはよろしくない。
0473デフォルトの名無しさん
垢版 |
2017/08/17(木) 06:22:12.53ID:zzoRHhsR
sizeとdeq.size()が同じ型である必要はない
sizeがdeq.size()の値を保持出来れば何でもいい
charでもビットフィールドでも
0474デフォルトの名無しさん
垢版 |
2017/08/17(木) 07:08:05.04ID:6E9r52D/
グダグダ感が半端ないな。そりゃ全てを捨ててJavaやC#を作りたくなるわ。
でもJavaやC#がC++と同じ道を歩んでて笑える。
0475462
垢版 |
2017/08/17(木) 08:47:14.10ID:XAlxh4c7
とりあえず万全を期すためにってやつみたいですね。
レスありがとうございました。
0477デフォルトの名無しさん
垢版 |
2017/08/18(金) 08:19:11.14ID:cQGhZEXD
二つを含んだ構造体やクラスを返す
引数にアドレスや参照を渡してそこに書いてもらう
グローバル変数経由で返す
ファイル経由で返す
...
■ このスレッドは過去ログ倉庫に格納されています

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