【初心者歓迎】C/C++室 Ver.101【環境依存OK】 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
エスケープシーケンスや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/ ROM に書ける内容だったら constexpr
RAM に置かなければならないのなら const >>364
どちらもコンパイル時に決まるものも決まらないものも扱うUNKO仕様なので常人が理解できないのは致し方ない
一つ知っておくべきなのは「constexprの変数はコンパイル時に決まるもののみ」ということ >>367
一般人はRAMも見たことないよ
組み込み用マイコンだと、フラッシュROMからそのまま実行したりする
コードもconstデータもROMに置いてそのまま実行出来る メモリ増設の時ぐらいしかスロット見ないし
え?別の話? デシタルネイティブ「RAMもROMを見たことがない」 >>373
> デシタルネイティブ「RAMもROMを見たことがない」
デバイスの話なのか
チップの話なのか
ダイの話なのか >>374
そんなこともわからんのかジジイは
「どんなものかは知らんがRAMとかROMとか呼ばれるモンを見たことがない」
ってことだ
それ以上の意味はない CDショップやDVDレンタルショップがあってもそこに並んでいるのがROMだと認識できない無知なだけでは >>376
いまどきの若者は CD も DVD も使わんのやで。 まあスマホのスペックにはROMとRAMの容量が書いてあるけど
殆どの利用者は理解してないな スマホの表記で ROM って言ってるの、そもそも ROM じゃないだろっていう。 class C {
private:
static int secret;
public:
friend int peep() {return secret;}
};
このpeepはどうやって呼び出すのが正解なんだぜ? >>384
コンパイルは通るんだがまるで飲み込まれたようだぜ
c.peep();
peep();
C::peep();
どれも反応しない へー、通るんだ。
とりあえず、peep()はメンバー関数じゃないから引数にCを渡すなりするのが普通の使い方だろう。 >>380
「そもそもROM」ってなに?
マスクROMしかダメとか? おおお
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);
//いろいろ計算
}
ダミーでインスタンス渡すってことなんだな ROM 不揮発メモリ
RAM 揮発メモリ
リードオンリー何それ secretはstaticだったか。見落としてた。 >>387
Read Only つってるのに、意味が拡大して結局それどういう意味なんだよっていう 文脈で判断しないと。CでROMつったら不揮発性メモリのこと。CDROMのことではない。 それにしてもfirendって付けた関数の方にボディーを書くことが出来るんだな
キモ 揮発不揮発は関係ない
読み込みと同等の速度で普通に書き込みが出来るか
Cの場合、普通の代入やmemcpyで普通に書き込み出来るかどうか >>398
おまえのマイコンにはCDROMが内臓されてるのかよ。馬鹿は休み休みいえ。 >>395
メモリの不揮発性ってのは意味合いが違うぞ。
フラッシュメモリは不揮発性だがROMではない。 EEPROMの一種だろうが。組み込み経験ない奴はもうレスすんな。 >>404
フラッシュメモリはROMの仲間だけど… 肉抜きのステーキとかチーズ抜きのチーズバーガーみたいなもの? >>356
そういう仕事をするハメになったら
タラタラ文句言うだけで成果出せなくてもいいの? フラッシュもEEPROMもROMと呼ばれる
ROMの語源はRead Only Memory
でも、今は消去や書き込みが可能なメモリにも使われるようになった
読み書きともランダムアクセスが可能で、アクセス時間も読み込みと書き込みで大きな差が無いものがRAM
DRAMやSRAM, MRAM, FRAMがこの範疇
そうでないものがROM
NAND, NOR, EEPROMなんかはROMという扱い いろんな人がいるね。
俺の中では電源切っても覚えてるかどうかの違いだよ。 ID:qET1a6fjが非常識なのはよく分かったけどあまり言いふらさない方が生活し易いと思うよ 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&のほうが呼び出されるのはなんででしょうか? 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];
} >>425
タイプミスとは思うけどvec..push_backのドット2つ付けてるのが原因じゃ >>425
ここに書いてない部分に問題がある気がする >>431
delete済みのポインタを更にdeleteしてたりしてな >>425
stackoverflow.comで聞くといいよ 2chにコード書きこんで質問するんなら
そのコードで問題が再現するのかどうなのかぐらい確認してから
書き込んだ方が良いだろうな、常識的に 普通は再現する最小限のコードこさえてる時点で
たいていはバグの原因に気付いて質問やめる > block Error reading register value
これ何のエラー? >>437
WindowsのHeapFreeが出したりするエラーで基本的にはメモリをぶっ壊してる事に起因するらしい
ただしリビルドしたら治ったとかいう話もあったりしてなんだか分からない なら、流行の方法は知らないけど、ポインタを最初にNULLできちんと初期化して
NULLチェックしてからdeleteして、deleteしたら忘れずにNULLで初期化すれぱいいんじゃないの。 >>439
deleteするときのNULLチェックていらないよね
NULL(nullptr)のdeleteは何も起こらない保証があるから使い終わった後にNULL代入するのはよくやるけど
まぁ今どきのC++なら素直に>>440だね 調べたらいっぱいあって余計に混乱しそうだわ
auto_ptr
unique_ptr
shared_ptr
weak_ptr >>442
auto_ptr ⇒ オワコン、使用禁止
unique_ptr ⇒ 共有しないならこれ
shared_ptr ⇒ 共有するならこれ
weak_ptr ⇒ はて?いつ使うんだこれ weak_ptrってかシンプルなreference_ptrみたいなのがほしい 話題に便乗して。
new,delete満載の既存のコードをスマポに置き換えてくコツみたいのってあります?
作り直したほうが早いのかな shared_ptrか生ポの入ったvectorを基底クラスにアップキャストするスマートな方法おしえてください
割と使うくせに良い方法が思いつかない >>448
p = malloc()
を
p = std::make_shred<てきとー>() に置き換えて delete() を消す… アップキャストは特に何もしなくても必要になれば勝手に安全にアップキャストされるから
アップキャストするスマートな方法って質問の意図が良くわからない
というか、安全に勝手にアップキャストされるのは静的型のメリットの一つだし あーやっと質問の意味が分かった
vectorをvectorごとアップキャストして別のvectorに代入するのか
そんなことしたいと思ったこともなかったから分からなかったわ
アップキャストするときにアドレスをオフセットしなきゃならない場合があるから
勝手にはしてくれないんじゃないかな
たしかC#は勝手にしてくれるんだっけか なにか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専用ってことで良いんじゃないかな あ〜でもデフォルトのアロケータにしか対応しないのはアレか
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 )
の方が良いのかね x.assign(y.begin(), y.end()); strcmp で長さ0の文字列同士を比較した場合の結果は規定されてますか? >結果は規定されてますか?
Yes
ISO/IEC 9899:2011 7.1.1/1では終端ヌルはstringの一部なので同じと見なされるだろう
ISO/IEC 14882:2014 21.8のstrcmpはCの規格丸投げなので同じだろう >>454
こういうtemplateやtypenameが入り混じったc++のソースってc#好きの俺には耐えられん。ごちゃごちゃしていて見た目が美しく無いよね。 ああ、454さんを批判する意図は無いのでお間違いなく。 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();
では駄目なケースとかあるんですか? テンプレートのウザイ仕様です
型に依存したコードにならざるをえないのに、
使えと強要するような型定義 ■ このスレッドは過去ログ倉庫に格納されています