[過去ログ] 【初心者歓迎】C/C++室 Ver.101【環境依存OK】 [無断転載禁止]©2ch.net (1002レス)
1-
抽出解除 レス栞

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
7
(3): デフォルトの名無しさん [] 2017/07/21(金) 00:25:40.36 ID:cbDQlmdo(1/6) AAS
・見分け方
lvalueは、名前がある
rvalueは、名前がない
・rvalueの特徴
名前がないということは使い捨ての一時的なオブジェクトだから、処理が終わったら捨てられる
・使い分けの理由
代入演算子(=)や、関数の戻り値に使う時や、vectorなどのコンテナに放り込む時には、
一旦オブジェクトがコピーされるが、rvalueだと分かっていたら、勝手にmoveしてくれるので処理が速い
特に、でかいデータを持った独自のクラスの場合にコピーよりmoveが速くなる
この機能を使いたかったら、クラスのmoveコンストラクタとmove代入演算子(=)を定義しておくこと
でも、それは面倒だろうから、ある条件を満たしたらコンパイラが勝手に作ってくれる
・条件
独自クラスに次のいずれの定義もしていないこと
a) コピーコンストラクタ
b) コピー代入演算子
c) デストラクタ

C++歴1ヶ月の俺が答えてみるテスト
8
(3): デフォルトの名無しさん [] 2017/07/21(金) 00:50:30.03 ID:cbDQlmdo(2/6) AAS
moveコンストラクタを作ったら気づくと思うが、処理内容は結局コピーコンストラクタと同じなわけ
とどのつまり、ポインタをメンバーに持ったクラスを定義する時に有効なんだよ
コピーコンストラクタ(lvalue)だと、コピー元は存在し続ける可能性があるから、
必ず1から全データを作り直して、ポインターのポイント先を新データにしないといけない
でも、rvalueで捨ててもいいデータだと分かっていたら、捨てるデータを捨てずにそのまま使って
ポインタのポイント先をその捨てるデータにすればよいから、楽で速いよねという話
9
(4): デフォルトの名無しさん [sage] 2017/07/21(金) 00:56:26.30 ID:joLx1qFD(1/5) AAS
右辺値参照なら
外部リンク:srad.jp
が一番わかりやすい
これ読んでわからなかったらまだ手を出すのが早すぎたと思って諦めたほうが良い
本を買っても無駄な出費になるだろう
そして↑のページを見つけるのに検索してて出てきたのが↓
外部リンク[html]:woorex.com
で、全然読んでないが、こういった文章に価値はないと思う
ネットの文章のすべてに価値があるわけではないと思ったわ
48
(3): 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2017/07/22(土) 18:39:33.61 ID:WTRjQogU(1/18) AAS
>>47
47(2): ◆QZaw55cn4c [sage] 2017/07/22(土) 18:27:01.28 ID:Yr9CVNZl(1/5) AAS
>>42
いつも不思議に思うのだが、このド・モルガンは議論のスタートとなる公理なの?
それとも、なんらかの公理から導かれる定理なの?
教科書の最初の方でカップハットをやらされる度に思う疑問です
定理って言ってるんだから、定理だろ。
ベン図と真理値表で簡単に証明可能。
50
(3): 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2017/07/22(土) 18:48:30.61 ID:WTRjQogU(2/18) AAS
無限集合の場合は集合の内包的定義により、離散的な論理学に還元され、やはり成り立つ。
133
(5): はちみつ餃子 ◆8X2XSCHEME [sage] 2017/07/29(土) 08:10:20.47 ID:HavpCAcr(1/4) AAS
>>131
131(1): デフォルトの名無しさん [] 2017/07/29(土) 01:30:09.73 ID:wXH6c2tF(1/2) AAS
mapで、あるvalueを持つpairだけを別のmapに移す時はどうやればよいでしょうか?

例えば
unordered_map<int, int> map1{
  {0, -10},
  {10, -1},
  {2, 5},
}
があってvalueが負のもの({0, -1.}と{10, -1})をmap1から削除して
map2へ移す、みたいな場合です。
std::remove_copy_if を使うのが一番簡単な方法だと思う。

std::remove_copy_if(std::begin(map1), std::begin(map2), std::inserter(map2, std::end(map2)), [](decltype(map2)::value_type x) { return x.second < 0; });

みたいな感じ。
143
(3): デフォルトの名無しさん [sage] 2017/07/29(土) 10:19:10.90 ID:zJVnUUbX(2/6) AAS
>>140
140(1): デフォルトの名無しさん [sage] 2017/07/29(土) 09:29:15.29 ID:USfv5Coy(1/3) AAS
>>135
for文のほうがなにやってるかわからんわ
標準なら何やってるかわからなくてもググれば挙動がわかる
どっちにしても、わかりにくいものは構造化して名前をつけるべきだけどね
分かりにくいか?
for(auto pair: map1){
if(pair.second < 0){
map2.insert(std::pair<int,int>(pair.first, pair.second);
}
}
for(auto pair: map2){
map1.erase(pair.first);
}
180
(4): デフォルトの名無しさん [] 2017/07/30(日) 17:25:43.33 ID:w5RmXCUD(1/3) AAS
enum EMFType
{
MF_INT, // 符号付き整数
};

// いろいろなデータを1つの関数で表示します
void MultiFunc(EMFType type, unsigned int data)
{
switch(type)
{
case MF_INT : cout << (int)data << endl; break;
}
}

int main()
{
int a = -10;

MultiFunc(MF_INT , a);
return 0;
}

実行結果
-10

unsigned int にマイナスの値を渡してるんですが、そのまま出力されます。
これが仕様だとすると、パラメーターにunsigned int を指定する意味はなんなんでしょうか?
296
(3): デフォルトの名無しさん [sage] 2017/08/04(金) 14:31:21.93 ID:PHBV9/TP(1/2) AAS
呼び出し規約は実装依存ではないけどアーキテクチャ依存でもないよ
そして、引数の受け渡しにレジスタをどう使うかというのは呼び出し規約と関係なく実装依存
さらに、引数はスタックに積まれるし、それはレジスタどうのこうのとは関係のない話
425
(4): デフォルトの名無しさん [sage] 2017/08/14(月) 05:23:42.65 ID:P3rVXCaa(1) AAS
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];
}
613
(3): デフォルトの名無しさん [sage] 2017/09/05(火) 23:58:54.60 ID:duOUbFWD(2/2) AAS
>>612
612(2): デフォルトの名無しさん [sage] 2017/09/05(火) 23:28:12.79 ID:j8EMa+Cj(1) AAS
>文字列リテラルがchar*に勝手に変換
そんなクソ言語はCだけ
char const*なりconst char*ならおk?
641
(3): デフォルトの名無しさん [sage] 2017/09/09(土) 13:55:13.28 ID:xEPuJyU1(1/2) AAS
低レベルな処理でポインタが便利と言われるのはなぜか
言葉で語るのは大変なのでコードで語ろう
hoge *p = (hoge)nanika_no_memory_block;
p->piyo = 100;
これが出来る言語は、あまりない
671
(4): デフォルトの名無しさん [sage] 2017/09/16(土) 23:11:51.68 ID:F2zb0zkw(1) AAS
C/C++的にはダメ
700
(5): デフォルトの名無しさん [sage] 2017/09/27(水) 12:36:06.37 ID:OnyIuiaa(4/4) AAS
メモリがリニアでないバンク方式やセグメント方式の処理系を知らないとは無知だな。
far、near知らないとか最近勉強し始めたのだろう。

Cは低級言語。処理系依存を書く言語。
コンパイラが勝手に処理系に依存した定義をしろってこと。
701
(3): デフォルトの名無しさん [sage] 2017/09/27(水) 14:25:01.86 ID:hAn/VwKR(2/7) AAS
nearだろうがfarもセグメント方式だろうが
a-b+b=a+b-b=aになるけど
ほとんどの環境で

なんてことは知らないか
703
(5): はちみつ餃子 ◆8X2XSCHEME [sage] 2017/09/27(水) 16:20:12.02 ID:yRzprl02(1/3) AAS
強力な最適化コンパイラはプログラマが未定義を踏んでいないことをあてにした最適化をすることがある。
「ほとんどの環境で大丈夫」なんていうのは現代では思い込みだよ。 全然大丈夫じゃない。
717
(3): はちみつ餃子 ◆8X2XSCHEME [sage] 2017/09/27(水) 21:51:01.70 ID:yRzprl02(3/3) AAS
>>716
716(1): デフォルトの名無しさん [sage] 2017/09/27(水) 21:38:58.24 ID:hAn/VwKR(7/7) AAS
offsetofがどうやって出来たかも知らんとは
じゃあ逆にうまく動かない具体例を知ってる?
たいてい内部はただの整数演算だぞ
いいえ。 たとえば GCC は __builtin_offsetof を持っていて、 offsetof マクロはこれに展開されます。
765
(6): デフォルトの名無しさん [sage] 2017/09/30(土) 01:55:47.47 ID:+yH9ha/d(1/2) AAS
ちょっと不可解な部分があったから質問させてくれ

string型のデータをサーバに送信したくてOSSの関数に渡しているんだが、
データが一部壊れてしまう
問題のコードは、

string str = "{id:abc, ... , }"
void* payload = (void*) str.c_str();
send(payload, str.length());

これをやると、先頭の5バイトがうまく入らない
いくら考えても全然理由がわからず、意味のないことだと思いつつも以下のコードを書いてみたら何故かうまくいった

string str = "{id:abc, ... , }"
char* tmp = (char*)malloc(str.length() * sizeof(char) + 1);
strcpy(tmp, str.c_str());
payload = (void*)tmp;
send(payload, str.length());

下のコードを使えばうまく動いてるから問題ないんだけど、上のコードがダメな理由がわからずすごく気持ち悪い。
何か上の例だとまずい部分があるのかな?

送信関数は以下
send(void* payload, size_t length);

環境はVC++ 2012
Windows 7 64bit

ちなみに、同じコードを別環境(gcc 4.4.7 Cent OS 32bit)で動かすと、両方うまくいった
771
(3): 765 [sage] 2017/09/30(土) 10:38:13.12 ID:+yH9ha/d(2/2) AAS
みんな回答ありがとう。

>>766
766(1): デフォルトの名無しさん [sage] 2017/09/30(土) 02:12:16.55 ID:/jgYbdHq(1) AAS
>>765
c_str()ってどんな関数?
string型のメソッドで、文字列をconst char*にするやつ

>>767,769
767(1): デフォルトの名無しさん [sage] 2017/09/30(土) 02:45:21.56 ID:mQbjCOfm(1) AAS
非同期やbufferedの関数を正しく使えてないんだろ
たしか以前にboost.asioかなんかの同じような質問をきいたことがあったような
769(1): デフォルトの名無しさん [sage] 2017/09/30(土) 07:12:02.93 ID:7qICbiUO(1) AAS
そのインターフェースで非同期なのに 内部で実体のコピーをとってない場合とかだと
実際に送信完了するまで 渡した引数の実体が生きてる必要があるね
非同期送信にはなってるんだけど、sendの後に送信結果を受け取る関数を呼んでる。
そのあとでpayloadは解放されるようになってるから、送信完了までは実体は生きてると思う

>>770
OSSの関数がそう定義されてるから変換したんだ

{id:abc. ... , }
のうち先頭5文字の{id:aがおかしくなってるんだよね・・
Wiresharkでみると、バイトコード88ってなってたけどなんでそうなったのかが全然わかんない
810
(3): デフォルトの名無しさん [sage] 2017/10/10(火) 15:59:13.06 ID:3nxFazlM(1/2) AAS
p==p_rgh + rho*gh;
とあるのですが意味がわかりません。
p=p_rgh+rho*gh;であるべきと思うのですが、==と=が使い分けされているので
タイプミスではなさそうです。どなたかよろしくお願いします。
814
(3): デフォルトの名無しさん [sage] 2017/10/10(火) 19:04:42.99 ID:3nxFazlM(2/2) AAS
>>812
812(1): 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2017/10/10(火) 16:14:41.98 ID:RmsAElXw(2/3) AAS
>>810
演算子「==」より演算子「+」の方が結合が強いんだった。
「p==p_rgh + rho*gh」は、pとp_rgh + rho*ghが等しいときtrueになる。
ご回答ありがとうございます。が、やはりわかりません。
たとえば、
if (p==p_rgh + rho*gh)
{

}
や、q=p==p_rgh + rho*gh;とかならわかるのですが、


p==p_rgh + rho*gh;

と独立しているのでどんな処理をしているのか・・・
856
(4): デフォルトの名無しさん [sage] 2017/10/14(土) 23:37:16.03 ID:q9IpA67V(2/2) AAS
>>851-854
ということは、255サイズのリングバッファ作りたいときって

unsigned char buffer[255] = {0};
unsigned char head=0, tail=0;

unsigned char pop(){
if(head==255) head = 0;
return buffer[++head];
}

void push(unsigned char data){
if(tail==255) tail = 0;
buffer[++tail]=data;
}

このサイズチェックのif文なくても大丈夫ってことですか?
870
(3): デフォルトの名無しさん [sage] 2017/10/16(月) 08:04:32.95 ID:iBTaJQF1(1) AAS
>char が9ビットとか16ビットの機械/コンパイラもあるんだよね。
え゛?まじで
879
(3): はちみつ餃子 ◆8X2XSCHEME [sage] 2017/10/16(月) 21:19:32.17 ID:8llzdgRf(1) AAS
>>870
ISO などでは 2008 年に 1 バイトは 8 ビットという定義を決めた。
外部リンク[htm]:diode.matrix.jp
1 バイトが 8 ビットではない (それなりに広く使われている) アーキテクチャが事実上消えたのは決め手のひとつだと思う。

C でこの定義を採用すると明記されているわけではないので、
C の言語仕様としては依然として処理系定義という扱いのはずだし、
何かの用途に特化したプロセッサでは変則的なものはいくらでもありうるんだけど、
自分で書くプログラムでそこまで想定することはまず無いわな。
897
(3): はちみつ餃子 ◆8X2XSCHEME [sage] 2017/10/18(水) 02:21:26.88 ID:8euWiZGY(1/3) AAS
>>895-896
「それなりに広く使われているアーキテクチャとしては」と限定して書いているのは、
そうでないアーキテクチャでは残っていることは承知しているという意味だよ。
自分ってのはまさに「私」のことなので実際気にする場面に遭遇したことがないし、
それをどうこう言われても俺に組込み系の仕事をして欲しいというのでもなけりゃ何の意味があるのかわからん。
1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.060s