【初心者歓迎】C/C++室 Ver.94【環境依存OK】 [転載禁止]©2ch.net

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

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

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

前スレ
【初心者歓迎】C/C++室 Ver.93【環境依存OK】
http://peace.2ch.net/test/read.cgi/tech/1412495628/
2デフォルトの名無しさん:2014/11/28(金) 21:55:19.03 ID:QcGoPiaz
テンプレここまで
3デフォルトの名無しさん:2014/11/28(金) 23:10:20.05 ID:/kbuZX05
いまのところ、統計的に一番需要が大きいのはどのOSですか?
4デフォルトの名無しさん:2014/11/29(土) 03:30:55.83 ID:SoXvwZNw
               ノ      ゚.ノヽ  , /}      ...
            ,,イ`"     、-'   `;_' '    ..::::::::::::::...
   ,-、  _.._   (        (,(~ヽ'~     ..:::::::::::::::::::::::
 )'~  レー'  〉   ヽ       i`'}       .:::::::::::::::::::::::
 ~つ     '-ー、  i       | i'     ...:::::::::::::::::::::::
 /       <  /     。/   !  ......:::::::::::::::::::::::::    これは>>1乙じゃなくて
/         ~^´     /},-'' ,●::::::::::::::::::::::::::::::::::::
i、        ,i' _,,...,-‐-、/    i  ::::::::  .:::::::::::::
..ゝ        <,,-==、   ,,-,/      .:::::::::::            放射能がうんたら
 )       {~''~>`v-''`ー゙`'~       ..:::::::::                          ........::.
 {        レ_ノ            ..::::::::.                         ......:::::::::
ノ         ''           ..:::::::                        ...::.:...:::::::::
                     .:::::::::                     ...:......:::::::::::: .
                    .:::::::::::.        .....      ..  ..::::::::::::::::::::::::   :::.
                    ::::::::::::::::.::::::....:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::.. ::  ::..
                    .:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::    ::.
                    ::::::::::::::::: :::::::::::::::::::::::::::::: :::::
                          .::    ::.  :::
5デフォルトの名無しさん:2014/11/30(日) 06:07:00.87 ID:KU6YIKgX
>>3
windodws7 32bit
6デフォルトの名無しさん:2014/11/30(日) 06:08:23.21 ID:b4nmdqGs
スレだぶってるよ
7デフォルトの名無しさん:2014/11/30(日) 15:37:07.41 ID:2hiiWexa
今時32ビット使ってるのは労害エロゲーマーかNEC社員ぐらいだろ
8デフォルトの名無しさん:2014/11/30(日) 20:06:36.53 ID:HpzzSpTs
保守上げ
9デフォルトの名無しさん:2014/11/30(日) 23:20:16.87 ID:dPZ+5hvT
初心者死ねよ
10デフォルトの名無しさん:2014/12/01(月) 04:11:40.74 ID:tnBdCQuY
関数の戻り値について質問なのですが、例えば何か計算して
その結果をvectorに入れて返したいので、データを入れる構造体を定義して、
struct MyData{
  ...
};

vector<MyData> func1()
{
  vector<MyData> vmd;
  ...
  return vmd;
}
みたいな感じの関数を良く使います。
この時に、さらにその関数の実行が上手く行ったかどうかも返したいので、即席でヘンテコな構造体を作って、
struct ReturnData{
  vector<MyData> vmd;
  bool success;
};

ReturnData func2(){
  ReturnData rd;
  ...
  rd.vmd.push_back(..);
  ...
  rd.success = true;
  return rd;
}

みたいな事を良くやります。
自分でも安易なやり方だと思うのですが、もう少しスマートな定番方式はありますか?
関数の引数で値を返すと言う方法もありますが、私としてはどちらかというと引数ではなく
戻り値で返したいのです。上級者の皆さんのアドバイスをお願いします。
11デフォルトの名無しさん:2014/12/01(月) 04:19:00.43 ID:Z5eoidtc
そういう時こそboost::optionalですよ
12デフォルトの名無しさん:2014/12/01(月) 04:28:01.58 ID:tnBdCQuY
boostですか。
標準のC++の機能では無理でしょうか?
13デフォルトの名無しさん:2014/12/01(月) 04:29:53.67 ID:Z5eoidtc
テンプレだしいいと思うが
じゃあstd::pairで
14デフォルトの名無しさん:2014/12/01(月) 04:32:52.23 ID:GzfBkz+h
unique_ptrでもいいな
15デフォルトの名無しさん:2014/12/01(月) 04:32:52.00 ID:6glZ0bPp
戻り値を複雑化するのはおすすめではないだろ。たとえばスクリプト言語から動的リンクで関数を使おうとするとシンプルな型でないと動かない。
16デフォルトの名無しさん:2014/12/01(月) 04:33:07.12 ID:tnBdCQuY
>>13
レスありがとうございました。
早速ググりました。こんなのが有るとは知らなかったです。
でもメンバ変数名がfirst、secondに固定されるようなのですが、
ちょっと抵抗有ります。
17デフォルトの名無しさん:2014/12/01(月) 04:34:28.93 ID:Z5eoidtc
>>16
じゃあstd::tuple
18デフォルトの名無しさん:2014/12/01(月) 04:37:22.78 ID:Z5eoidtc
型指定getはC++14からだからダメか
19デフォルトの名無しさん:2014/12/01(月) 04:40:51.16 ID:tnBdCQuY
>>17
たびたびレスありがとうございます。
さっそくググりました。こんなのが有るのは知らなかったです。
std::tuple<vector<MyData>, bool> func(){
  ...
}
ってやればいいんですね。でも、これだと、即席のヘンテコ構造体でやるのと同じような感じです。

>>14
>unique_ptrでもいいな
どうやるんでしょうか?

使っているのはVisual studio 2013です。
20デフォルトの名無しさん:2014/12/01(月) 04:45:42.80 ID:GzfBkz+h
>>19
std::unique_ptr<MyData> func() {
auto pvmd = std::make_unique<MyData>();
pvmd->push_back(..);
if (...)
return pvmd; // 成功
else
return nullptr; // 失敗
}
21デフォルトの名無しさん:2014/12/01(月) 14:29:33.50 ID:tnBdCQuY
>>20
レスありがとうございました。
試したら上手く行きました。
unique_ptrというのは使ったことが無いのですが、こういう用途に
使うものなのでしょうか?
もしtrue/false以外の別の情報も返したい場合には、
どんな方法がありますか?
22デフォルトの名無しさん:2014/12/01(月) 16:16:10.64 ID:hOHEB5gl
つーか、vectorのsize()がでかかったら鬱陶しいから戻り値は状況だけ返すとして
引き数でvectorの参照を渡せばいいよ。
23デフォルトの名無しさん:2014/12/01(月) 23:46:42.46 ID:DT2fS000
>>22は素人
>>10が完成形
24デフォルトの名無しさん:2014/12/01(月) 23:59:11.63 ID:8Fp5dgvs
>>10 はコピーコストが高そうだが、それでも完成形なの?なんだか Java とかから来た人がやりそうだね >>10
25デフォルトの名無しさん:2014/12/02(火) 00:01:10.97 ID:shurURxW
コピーコスト?
どこでコピーが起こるというの
26デフォルトの名無しさん:2014/12/02(火) 00:10:37.34 ID:deKVkNPa
moveセマンティクスを使える環境の人ばかりじゃないだろう。
27デフォルトの名無しさん:2014/12/02(火) 00:11:56.24 ID:/z1AotGw
vector<T> f()
{
  vector<T> v;
  ;
  return v;
}
と vector をベッタリかえすのだから、v全体がコピーされる、と考えてしまうのだが
Java だとこれでもいいかもしれないが
>>10 が完成形とかなんの冗談だ?
28デフォルトの名無しさん:2014/12/02(火) 00:19:27.50 ID:PXdmhxP8
move関係ないし、NRVO: named return value optimization でググっときなさいな
29デフォルトの名無しさん:2014/12/02(火) 00:26:53.17 ID:JIq5qYWA
横からだけど、RVO(returnで直接構築したらOKってやつ)は知ってたがNRVOは知らなかった
勉強になった
30デフォルトの名無しさん:2014/12/02(火) 01:56:11.60 ID:SAWFqoM+
ローカル変数は暗黙moveされるようになったからRVOもNRVOが効かなくても大丈夫
31デフォルトの名無しさん:2014/12/02(火) 13:01:34.36 ID:4lPIVtOy
こういう用途にはmaybe monadすばらし
32デフォルトの名無しさん:2014/12/03(水) 00:45:22.91 ID:gaGGe+Cv
void* を経由して std::shared_ptr を運びたい時って、

std::shared_ptr<T> a(ptr);
void *UserData = &a;
...
std::shared_ptr<T> b = *(std::shared_ptr<Type> *)UserData;

で大丈夫なの?
33デフォルトの名無しさん:2014/12/03(水) 03:29:04.25 ID:DGNVFO0Q
aの寿命にさえ気を付ければ
34デフォルトの名無しさん:2014/12/03(水) 18:17:41.63 ID:WxiYAD3t
クラスのコピーを禁止したい
クラスの生成を関数の返り値に制限したい
これって両立不可?
35片山博文MZ次期CEO ◆T6xkBnTXz7B0 :2014/12/03(水) 18:19:43.77 ID:ZVIn2no0
friend関数
36デフォルトの名無しさん:2014/12/03(水) 18:25:14.76 ID:ZoY3w5R8
コンストラクタとコピーコンストラクタをprivateに
生成はファクトリーパターンで
37デフォルトの名無しさん:2014/12/03(水) 18:42:13.82 ID:WxiYAD3t
http://codepad.org/Wbn8rOh1
どうするんでしたっけ・・・
38デフォルトの名無しさん:2014/12/03(水) 18:42:54.40 ID:o987ZOaf
c++ではクラスはコピーできないし、生成もできない。
出来るのは宣言と定義。
39デフォルトの名無しさん:2014/12/03(水) 19:00:43.60 ID:6lRqEEU9
gen()をAのメンバーにする
A()もprivate
40デフォルトの名無しさん:2014/12/03(水) 19:06:41.38 ID:WxiYAD3t
http://codepad.org/jKSVjg1L
ダメみたいですが・・・?
41デフォルトの名無しさん:2014/12/03(水) 19:15:09.69 ID:GXUScfW3
42デフォルトの名無しさん:2014/12/03(水) 19:18:51.17 ID:EEGJ9Grg
c++でクラスを毎回newして使うのと、パブリックなサブルーチンの関数を呼び出して使うのでは、
後者の方が早いんでしょうか。
43デフォルトの名無しさん:2014/12/03(水) 19:19:50.19 ID:ZoY3w5R8
その程度なら最適化で消えそうだが
44デフォルトの名無しさん:2014/12/03(水) 19:35:04.81 ID:WxiYAD3t
>>41
やっぱコピーコンストラクタを開放するしかないっすかね
45デフォルトの名無しさん:2014/12/03(水) 19:47:07.20 ID:6lRqEEU9
ポインタで返すのは駄目なのか?
46デフォルトの名無しさん:2014/12/03(水) 19:47:35.07 ID:GXUScfW3
>>44
コピーコンストラクタはprivateだけど
47デフォルトの名無しさん:2014/12/03(水) 19:49:41.30 ID:+PNtgzjY
class Bar {
// き・ん・し.
Bar &operator=( Bar const& );
Bar( Bar const& );
Bar(){}
public:
int a;
static Bar &generate(){ return *new Bar; }
static void erase( Bar &bar ){ delete &bar; }
};

int main()
{
// 受け取るのはこれで.
Bar &a = Bar::generate();
// Bar b; // これエラー.
// Bar *c = new Bar; // これももちろんエラー.
Bar::erase( a );
}
48デフォルトの名無しさん:2014/12/03(水) 19:53:27.23 ID:+PNtgzjY
Bar &aが嫌なら
class Bar_ {
// 中は同じ.
};
typedef Bar_ &Bar;
でBar_::generate();とか。

どっちかっていうとFactoryクラスをfriendにしてgenerateとeraseをそっちに移す方が好み
Bar b = Factory::generate();

って書けるし
49デフォルトの名無しさん:2014/12/03(水) 20:39:25.03 ID:cd9cih+w
C言語既習で、rubyとかpythonとかjavaとかscalaとかhaskellとかその辺のメジャーどころも書いたことあるんだけど、C++は書いたことがなかった。
今度C++を書かなきゃいけないのだけど、なにかいい書籍はありますか?
プログラミングの基礎的な部分とかC言語とかぶる部分は飛ばしたいのだけど
50デフォルトの名無しさん:2014/12/03(水) 20:39:57.95 ID:cd9cih+w
あ、もちろんサイト等でもかまいません。連レスすみません。
51デフォルトの名無しさん:2014/12/03(水) 20:40:13.20 ID:Kz7mO3Xi
ロベールでいいんじゃね
52デフォルトの名無しさん:2014/12/03(水) 21:01:26.40 ID:+PNtgzjY
え、独習C++?
53デフォルトの名無しさん:2014/12/03(水) 21:17:48.37 ID:U2a4HdIu
独習はいいよ、中盤どころで string クラスを自分で作れ、という最大の山場があるが、ここにいたるまでの説明が比較的親切だ
54デフォルトの名無しさん:2014/12/03(水) 22:36:34.22 ID:GGHHEiei
>>34
class Uncopyable
{
 public:
  Uncopyable(const Uncopyable&) = delete;
  Uncopyable& operator= (const Uncopyable&) = delete;
  Uncopyable(Uncopyable&&) = delete;
  Uncopyable& operator= (Uncopyable&&) = delete;
};
55デフォルトの名無しさん:2014/12/03(水) 22:38:33.87 ID:xJtNBUDm
こういう、単語レベルで猿のように反応して
とんちんかんなURLを貼りまくる馬鹿ってよくいるよな
56デフォルトの名無しさん:2014/12/03(水) 22:55:51.28 ID:WRoQBeep
C++ポケットリファレンスでいんじゃね
57デフォルトの名無しさん:2014/12/03(水) 23:15:20.30 ID:cd9cih+w
ありがとうございます!いただいた意見を参考に探してみたいと思います。
C++11だとかC++14?だとかは最初はあんまり気にしなくて良いんですかね。
C++はテンプレートとかboostとか難しそうというか覚えることが多そうで怯みますね
58デフォルトの名無しさん:2014/12/03(水) 23:56:59.39 ID:PeV925Ei
C++は多くの概念をその身に宿している。
C++は手続き型であり、構造化であり、オブジェクト指向であり、ジェネリクスであり、半関数型である。

どんな人の好みにでも合致する部分があり、嫌悪する部分がある。
故に、自分の好みの部分を最大限に生かすように使えばいいのだ。決してすべてを網羅する必要などない。


boostはあくまで外部ライブラリだから!言語として考えるものじゃないから!
59デフォルトの名無しさん:2014/12/04(木) 07:43:08.18 ID:4D2VbvpK
ただ、現実には自分の好みが許されることなど決してなく
どこかの誰かの意味不明な好みを押し付けられる!
60デフォルトの名無しさん:2014/12/04(木) 07:48:13.59 ID:UwyMS5sV
61デフォルトの名無しさん:2014/12/04(木) 09:19:18.83 ID:ILmf5FI6
c++で a って言うフォームが有って、これがインスタンス化されているかを調べる時は、

 
if (a != NULL)
 ↑
フォームのポインタ

とかで問題ないですかね。
62デフォルトの名無しさん:2014/12/04(木) 09:25:11.45 ID:hVhP7pu1
どうやってインスタンスを作ったかによるだろう
63デフォルトの名無しさん:2014/12/04(木) 11:14:14.78 ID:NIw8k+Ja
・ポインタが ヌルかどうか
・ヌルでないポインタが有効なメモリ(オブジェクト)を指しているかどうか
・オブジェクトが有効なウインドウハンドルを持っているかどうか

気の利いたライブラリを使っているなら上のいくつかを省略できる
64デフォルトの名無しさん:2014/12/04(木) 12:45:55.86 ID:bgy3WeAZ
予め初期化しとけばいんでね?
ま でもポインタなら何が入るかは保証できしんしね。
65デフォルトの名無しさん:2014/12/04(木) 14:26:22.61 ID:aeP/K117
NULLじゃなくてnullptr使いなさい
66デフォルトの名無しさん:2014/12/04(木) 14:29:32.81 ID:08jQOl/9
if (a)だけでいいよね
67デフォルトの名無しさん:2014/12/04(木) 14:34:51.86 ID:aeP/K117
それは宗教の問題だからアンタッチャブル
68デフォルトの名無しさん:2014/12/04(木) 17:36:19.43 ID:Q5URs8EI
そか 皆気をつけて
69デフォルトの名無しさん:2014/12/06(土) 18:44:37.04 ID:T3VPTifq
例外について質問です

何種類かの例外クラスを投げうる関数を使うのに、tryブロックで囲みcatchしたあとの処理を共通化したいのですがどのように書けばいいですか?
今まではcatchをダラダラといくつか書いてたのですが、 catchしうる例外の種類が増えた時その関数を使う箇所全てのcatchを増やさないといけないことに気が付きました。
投げられる例外は必ずstd::exceptionを継承した例外クラスなので、とりあえずはstd::exceptionの参照でキャッチして、
受け取りうるエラークラスの型のオブジェクトを引数に取るようなポリモーフィックな関数で処理しようとしたのですがうまくいきません。
例外処理を共通化するにはどう実装すればよいですか?
70デフォルトの名無しさん:2014/12/06(土) 18:55:39.89 ID:pl1CQQsq
try catchの部分を関数化したらあかんの?
71デフォルトの名無しさん:2014/12/06(土) 18:57:18.46 ID:7IWME+c9
> catchしうる例外の種類

その関数から出す例外の共通ベースクラスを作って
例外は全部そのベースクラスの派生クラスだけ投げる
そのベースクラスだけcatchする
72片山博文MZ次期CEO ◆T6xkBnTXz7B0 :2014/12/06(土) 19:01:26.94 ID:Z6yqpce/
try {
...
}catch(const std::exception& e)
{
catcher(e);
}
73デフォルトの名無しさん:2014/12/06(土) 19:01:49.08 ID:T3VPTifq
>>70
なるほど、確かに
解決しました、有難うございました
74デフォルトの名無しさん:2014/12/06(土) 19:03:38.43 ID:T3VPTifq
>>72
これでcatcherを派生クラスごとに書いたんですがうまくいかないということでしたが、
一回try catchする関数でラップすることで解決しました
75デフォルトの名無しさん:2014/12/06(土) 20:04:28.52 ID:47cvncTJ
関数化するしかないんだろうけど
必要な変数を渡すのが面倒なんだよな。
C#6.0みたいに条件指定できるようにならないものか
catch (exeption &e) if (e.SomeValue ==2 || e.OtherValue!= null) {
}
76デフォルトの名無しさん:2014/12/07(日) 09:51:35.94 ID:RIZYWRwW
基底クラスで先にキャッチしてて派生クラスの分岐に行かないというオチでは

>>75
そんなのいちいち構文拡張しなくてもリスローすればいいやん
77デフォルトの名無しさん:2014/12/07(日) 13:55:50.82 ID:YhbOfaXo
>>76
再スローしたら後続のキャッチハンドラにいかなくね?
78デフォルトの名無しさん:2014/12/08(月) 08:34:31.21 ID:qdtwuYGK
というか例外なんかを使うやつがいるのか?
再帰で書くようなコンパイラを書くか、窓でメインとスレッドエントリーポイントで囲んで謝罪メッセージを出力するぐらいしか使わないんだが。
例外を掴んでリカバリコードを与えた上でリトライ、スキップが書けないから使いどころが少ない
79デフォルトの名無しさん:2014/12/08(月) 08:50:19.47 ID:RosCv9n9
もちろん
正常系にエラー処理をずらずら書きたくないからな
80デフォルトの名無しさん:2014/12/08(月) 12:43:31.77 ID:4KHGvKuG
言語で例外を強要するのもあるから、ま、多少はね・・
81デフォルトの名無しさん:2014/12/08(月) 13:58:04.25 ID:X7nA68GZ
Goなら例外自体を言語仕様から抹消したぜ!
まあ、panicとrecoverで例外相当の事が出来ちゃうんだけどね
82デフォルトの名無しさん:2014/12/08(月) 14:26:40.68 ID:QWYJ80kV
茫洋さんのポインタの本買おうと思ったけど廃版になってた
仕方ないから前橋さんのにしたよ
14年前の本か・・・
83デフォルトの名無しさん:2014/12/08(月) 21:15:58.85 ID:PwuM5X3u
ポインタまわりなんて20年経っても変わらんやろ
84デフォルトの名無しさん:2014/12/09(火) 08:35:32.85 ID:FiVhwApy
Win7のVS2013で
FILE *fp;
wstring logFile = "ログファイル.txt"
errno_t err = _wfopen_s(&fp, logFile.c_str(), L"at, ccs=UTF-8");
みたいな感じでファイルオープンして、vfwprintf_s()を使って日本語を書き出しているのですが、
文字が時々化けるのです。
ログファイルなので、プログラムの実行中にいろんな情報を書き出しています。ファイルが既に有る場合には追加で書き込んでいます。
デバッグなどでプログラム実行中に強制的に中止することもあります。なので、ログファイルに書き出している途中で中断した
場合などに、ファイルが中途半端な状態で閉じられ、そういう不完全なファイルに、次の実行時に追加で書き出すと、
化けるのかななどと推測していますが、根拠はありません。
プログラム開始前にファイルを削除して新規に作成すれば化けることはないのですが、それだと長期的なログが収集出来ません。
ログファイルが文字化けする理由は何でしょうか?どのような対策が良いでしょうか?
85デフォルトの名無しさん:2014/12/09(火) 08:58:18.86 ID:BAVYOY2g
フラッシュしたら?
86デフォルトの名無しさん:2014/12/09(火) 12:41:05.09 ID:wZ/MoV2C
まずどう化けるのかを言うべき。
だが多分排他してないからじゃね
8784:2014/12/09(火) 19:56:43.15 ID:FiVhwApy
原因が分らないので、ログファイルは諦めます。
しばらく修行してまた出直します。ありがとうございました。
88デフォルトの名無しさん:2014/12/09(火) 21:39:04.28 ID:C9WRahhU
自分は書き出したつもりでも、実はメモリ上に溜まっていて
ある程度溜まったところで実際のファイルに書き出される仕組み
89デフォルトの名無しさん:2014/12/09(火) 22:57:08.38 ID:1v5rgyWL
文字化けの原因が自分のプログラムだけにあると思い込まない方がいい。
utf-8は、まだ普及途中の文字符号化方式だから不具合も希にある。

だが、86が指摘している通り、俺も排他制御せずにログファイルに書き込んでいる事が原因だと思うな。
確かめたいならば、一度ccs=UTF-8を外して実行してみることを勧める。
Cの一行、ストリーム関数の中の処理と、スレッドがプリエンプションするタイミングは無関係に発生する。
90デフォルトの名無しさん:2014/12/10(水) 20:47:20.10 ID:xebn7APd
unsigned char Max = 0;

・・・

Max = std::max( Max, 0 );

とすると、引数の型が揃わないからエラーになります。

0を0uとしてもダメです。

unsigned char( 0 )にしたら通りますが、
unsigned charな数値リテラルの書き方ってあるんでしょうか?
91デフォルトの名無しさん:2014/12/10(水) 20:49:06.99 ID:Lk9vW6tq
ない
92デフォルトの名無しさん:2014/12/10(水) 20:57:38.98 ID:SSG8QMHt
ないからstatic_castでキャスト、
Cキャストやreinterpret_castは死すべき、慈悲は無い
93デフォルトの名無しさん:2014/12/10(水) 21:00:47.98 ID:OE3nWLD+
>reinterpret_castは死すべき、慈悲は無い

無いのは慈悲じゃなくて、>>92の脳みそじゃね?
94デフォルトの名無しさん:2014/12/10(水) 21:19:47.64 ID:o0U1RKIw
>>90
揃わないなら揃えなくてもいいように指定すればいい
std::max<unsigned char>(Max, 0) とか
std::max<std::decay<decltype((Max))>::type>(Max, 0) でOK
95デフォルトの名無しさん:2014/12/10(水) 21:30:21.38 ID:OE3nWLD+
>>89
>文字化けの原因が自分のプログラムだけにあると思い込まない方がいい。
>utf-8は、まだ普及途中の文字符号化方式だから不具合も希にある

じゃあその不具合の一例を出してみろ
9690:2014/12/10(水) 22:22:48.33 ID:xebn7APd
>>91-92
ありがとうございます。

>>94
おお、そんな書き方ができたとは!
前者にします。
ありがとうございました。
97デフォルトの名無しさん:2014/12/11(木) 00:21:22.17 ID:eHXhGFzQ
そもそもmaxの意味がないというのはスルー?
98デフォルトの名無しさん:2014/12/11(木) 00:40:13.74 ID:IvniPlhW
用例でそれをいったらキリが無い
99デフォルトの名無しさん:2014/12/11(木) 00:42:06.78 ID:lUWBGmWZ
話の本質はそこじゃないから良いんでねーの
10090:2014/12/11(木) 00:50:53.63 ID:ykbWZu7K
>>97
あ、ホントは

Max = std::max( Max, b ? Val : 0 );

みたいな感じです。
>>90は問題を示すために簡略化しました。
101デフォルトの名無しさん:2014/12/11(木) 01:21:52.53 ID:f/Eu3uQU
>>90
VC++だったらこれ使ったら?
std::max( Max, 0ui8 );
10290:2014/12/11(木) 01:26:59.08 ID:ykbWZu7K
>>101
え!?そんな書き方できるんですか!?
ちょっとキモいですけど、文字数少なくてナウいですね。
明日会社で試してみます!
ありがとうございます!
103デフォルトの名無しさん:2014/12/11(木) 02:28:37.86 ID:+X5/HCeV
Max = b?std::max( Max, Val ):Max;
104デフォルトの名無しさん:2014/12/11(木) 04:42:56.41 ID:JvQXLAia
>>95
つい最近そのバグ見つけて報告したらパッチ出たよ
105デフォルトの名無しさん:2014/12/11(木) 08:24:27.06 ID:Efs37Jrl
具体的に
106デフォルトの名無しさん:2014/12/11(木) 08:25:35.47 ID:g7NuR/qo
BOMを省略したがるエディタが文字化けを起こしやすい
HTMLも編集できるタイプは自動認識して、かつ履歴にあるとチェックしない時がある

最初にASCIIやSJISで認識して、そのあと実はUTF-8に更新されると化ける
まあUTF実装の不具合じゃないけど、直面するとバグだー不具合だー実装者無能と騒がれる
107デフォルトの名無しさん:2014/12/11(木) 08:30:52.22 ID:g7NuR/qo
開発に鬼の首を取ったように煽りにいくバカが蔓延しているからエディタ名は言わないからな
もとの質問と違うしね
108デフォルトの名無しさん:2014/12/11(木) 08:31:27.93 ID:Efs37Jrl
UTF-8 に BOM が?
109デフォルトの名無しさん:2014/12/11(木) 08:42:55.64 ID:RrJEy+mk
え!!おなじUTF-8でBOMを!?
110デフォルトの名無しさん:2014/12/11(木) 09:22:23.87 ID:pDWjQEFu
if(a && (!b)) は
if(a && !b) と書いても同じですよね?
111デフォルトの名無しさん:2014/12/11(木) 09:32:51.12 ID:vPIcYGSk
112デフォルトの名無しさん:2014/12/11(木) 09:54:27.64 ID:pDWjQEFu
>>111
ありがとうございました。
良く迷うので、あえて
if(a && (!b))
のように書くことにします。
113デフォルトの名無しさん:2014/12/11(木) 10:30:00.39 ID:HAPX7Bnj
>>112
それが正解
114デフォルトの名無しさん:2014/12/11(木) 15:03:37.93 ID:lvwk8IPr
可読性だな
115デフォルトの名無しさん:2014/12/11(木) 15:16:39.75 ID:+X5/HCeV
>>106
> まあUTF実装の不具合じゃないけど、

で、結局何が言いたかったの?
116デフォルトの名無しさん:2014/12/11(木) 15:23:02.60 ID:SXmyeFPJ
まぁ、UTF-8にBOMがあるなんてMSの妄想を真に受けている位だから
自分の妄想垂れ流したいだけなんじゃないの?
117デフォルトの名無しさん:2014/12/11(木) 15:54:04.45 ID:+X5/HCeV
WindowsみたいなASCIIのお供に互換性の全くない各言語専用のコード使っててそれを切り捨てない環境だったら
判別の為にBOMを付けざるを得ないってのも解らなくはないけどな。

個人的に今更SJISなんか使わねえから設定でUTF-8をデフォルトにしてくれんかなとは思う。
仕事でWindows使ってないからあんまり困ってないけど
118デフォルトの名無しさん:2014/12/11(木) 18:19:12.99 ID:SiH2jPo3
UTF-8にBOMが無いとでも言いたげな奴は
何を根拠に物申してるんだ。
Unicode規格読んだ上で言ってるのか?
119デフォルトの名無しさん:2014/12/11(木) 18:27:04.39 ID:xoNSZmlN
102 90 sage 2014/12/11(木) 01:26:59.08 ID:ykbWZu7K
ちょっとキモいですけど、文字数少なくてナウいですね。

このスレもう嫌だ
120デフォルトの名無しさん:2014/12/11(木) 18:32:15.94 ID:g7NuR/qo
この子鳥羽通り
そう思うんだったら、そうなんだろうな
と。
121デフォルトの名無しさん:2014/12/11(木) 20:23:43.57 ID:A1vk36Nn
Unicode 7.0ではUTF-16のBOMに相当するUTF-8のシグネチャーは
「<EF BB BF>と言うシーケンス」という表現になっていて
BOMという用語は避けているようだ。
3.10章D95, 23.8章
122デフォルトの名無しさん:2014/12/11(木) 20:32:47.37 ID:Knr7owVD
ボマーつかまえた
123デフォルトの名無しさん:2014/12/11(木) 20:46:37.82 ID:3e12kUSR
VSでUTF-8が文字化け

まだ普及途中の文字符号化方式だから不具合も希にある

じゃあその不具合の一例を出してみろ

つい最近そのバグ見つけて報告したらパッチ出たよ

具体的に

(世の中の)エディタが文字化けを起こしやすい。
俺のプログラムに非が無いのにバグと言われた経験ある。

何なのこのアホは
12490:2014/12/11(木) 21:03:27.00 ID:ykbWZu7K
>>101
その記述でコンパイル通りました。
ui8以外にも色々あるんですね。
勉強になりました。

>>103
あ、たしかに、それでOKですね・・・w
数値リテラルを使わない上に、文字数も最小になったので、
今回はその記述でいくことにしました。

ありがとうございました!
125デフォルトの名無しさん:2014/12/11(木) 22:58:31.99 ID:2YwrX4ci
いまのメモ帳ってUTF-8がデフォなのな
126デフォルトの名無しさん:2014/12/12(金) 00:18:17.71 ID:Znidw3Lc
BOMと呼んでいるけど、元々はUnicodeで普通に定義されている文字コードだからね。
そのコード配列をBOMという別名でエンコード判定にも使っているだけで。
127デフォルトの名無しさん:2014/12/12(金) 01:32:22.91 ID:ByYC3ZHE
class formA : publicB {

private:
   ここ
}

void formA::test(){
 ・・・
}

の時、privateの所に、

void test() と宣言するのと、
void formA::test(); で宣言するのでは違うんでしょうか。

どっちもコンパイルされて動くんですが
128デフォルトの名無しさん:2014/12/12(金) 01:48:33.07 ID:+hKqCGtl
内部に定義するとinlineキーワードを書かなくともインラインになるね。
129デフォルトの名無しさん:2014/12/12(金) 02:02:41.86 ID:66O80gtq
class formA : publicB {

private:
void formA::test();
};
みたいに(クラス内での)メンバ関数の宣言で修飾名を使うのは規格違反
クラス外での定義のときだけ許される
vc++で通るのは独自拡張
130127:2014/12/12(金) 02:27:24.01 ID:FMxaf1vD
なるほど。なんとなくわかりました。
131デフォルトの名無しさん:2014/12/12(金) 05:35:04.73 ID:iNQHvDR7
>>126
一時期ファイルの先頭に「美乳」って書いておくと
そのバイト列がBOMの代わりに使えるって話があったな
132デフォルトの名無しさん:2014/12/12(金) 10:48:12.88 ID:IIqhtssG
C++では関数のプロトタイプ宣言は、どこに書いてもいいのでしょうか?
Cだとファイルの先頭に書いていたのですが、今日、関数の中でプロトタイプ宣言してみたのですが、

void func1()
{
  int func2();     // 別のファイルで実装
  int a = func2();
}
これでも問題なく行けたのですが、これは問題ないでしょうか?
133デフォルトの名無しさん:2014/12/12(金) 10:54:19.16 ID:8BqNZxMW
実行してみろよ
134デフォルトの名無しさん:2014/12/12(金) 11:08:27.34 ID:IIqhtssG
実行は出来るんですが、ググってもこんな書き方が
見つからなかったので、何かの間違いかと思っているのですが。
135デフォルトの名無しさん:2014/12/12(金) 11:23:01.22 ID:66O80gtq
func1の中でだけfunc2を使うなら問題ない。func1の外で他の宣言なしにfunc2を使おうとすればエラー
ついでにC++固有ではなくCから引き継いだ仕様だ
136デフォルトの名無しさん:2014/12/12(金) 11:24:09.94 ID:IIqhtssG
>>135
サンキュウ、君は詳しいな。助かったよ。ありがとう。
137デフォルトの名無しさん:2014/12/12(金) 12:01:07.33 ID:JIdeGDe7
>>136
変数宣言と同じだろ
スコープ内か外かの違い
138デフォルトの名無しさん:2014/12/12(金) 12:11:51.41 ID:7CN2W1ZV
なるほど。
自分も参考になった。
139デフォルトの名無しさん:2014/12/12(金) 12:41:54.76 ID:xeh3XKfG
でも使わないよな。
別ファイルの関数呼ぶのにそんな宣言してるやつ見たらとりあえずディスる
140デフォルトの名無しさん:2014/12/12(金) 15:08:49.77 ID:WKe2cl7P
引き数プロトタイプもない時代のロートルは今でもやるぞ。
例えば、こんな感じ。
--
int main()
{
double sin();
printf("%g\n", sin(0.0));
return 0;
}
--
今となっては飛んだアナクロ仕様だな。
141デフォルトの名無しさん:2014/12/12(金) 15:12:12.08 ID:z5EZhpJA
stackずれてきたりしませんか
142デフォルトの名無しさん:2014/12/12(金) 15:14:52.49 ID:7CN2W1ZV
>>140
そんなロートルが勤めれるなんていい会社じゃないか。
143デフォルトの名無しさん:2014/12/12(金) 16:05:41.97 ID:Htsdk0RS
使わね−よ で済めばいいが他の構文と混じって嫌らしいことが起きる
144デフォルトの名無しさん:2014/12/12(金) 16:13:35.54 ID:z5EZhpJA
組み込みだと使われてるのか
145デフォルトの名無しさん:2014/12/12(金) 16:21:08.29 ID:Htsdk0RS
Foo a(0,1);
Foo b(1);
Foo c();
146デフォルトの名無しさん:2014/12/12(金) 18:47:21.80 ID:msKuYMsR
+演算子のオーバーロードに関する質問なんですけど、
次のようなクラスがあったとして、
template<typename T>
class A
{
public:
A(T val_) : val(val_) {}
...
private:
T val;
};
このクラスのための+演算子(2項バージョン)を実装したいと思って、
template<typename T>
A<T>&amp; operator+(const A<T>&amp; lhs, const A<T>&amp; rhs)
{
...
return ret;
}
というようなものを作ったんですけど、次のようにするとエラーがでてしまいます
A<int> a(1), a2(2);
A<int> a3 = a1 + a2;
A<int> a4 = a3 + 1; //←ここでエラー
ここでintからA<int>への変換が働いてうまく動くと期待したんですが、ダメでした
こういうコードが動くように+演算子を実装したいんですけどどうすればいいですか?
147デフォルトの名無しさん:2014/12/12(金) 18:51:03.20 ID:rt+9hUOc
エラーメッセージは?
148デフォルトの名無しさん:2014/12/12(金) 18:55:51.20 ID:iNQHvDR7
template<typename T>
A<T>& operator+(const A<T>& lhs, const T& rhs)
{
return lhs + A<T>(rhs);
}
149146:2014/12/12(金) 19:01:29.43 ID:msKuYMsR
コンパイル時に、たくさんエラーメッセージが出るんですが、だいたい以下のようなかんじです

...テンプレート 引数を 'const A<T> &' に対して 'int' から減少できませんでした
...クラス、構造体、共用体に既定のコンストラクターがありません
...これらのオペランドと一致する演算子 "+" はありません オペランドの型: A<int> + int
150146:2014/12/12(金) 19:13:12.95 ID:msKuYMsR
>>146
A<T>&amp; operator+(const A<T>&amp; lhs, const A<T>&amp; rhs)
のところで
A<T>&amp;となってるのは2chに書き込むときのミスです
A<T>&amp;→ A<T>&
に修正します、すいません
151146:2014/12/12(金) 19:21:25.51 ID:msKuYMsR
>>148
ありがとう、動きました
ただ、左オペランドがTのバージョンも書く必要がある思いますけど、
そういうものなんでしょうか?
152デフォルトの名無しさん:2014/12/12(金) 19:40:10.46 ID:ljMGzqE+
はい
153デフォルトの名無しさん:2014/12/12(金) 20:23:58.38 ID:algHi5GG
154デフォルトの名無しさん:2014/12/13(土) 01:28:49.03 ID:RaYBIhz1
C言語なら関数を呼び出す時には、
ヘッダをインクルードしてれば普通に a = kansu(); って呼び出せますが、

C++でオブジェクト指向で作る場合に、別のBって言うクラスの中に作ったkansu()を呼び出す時は、
毎回Bをnewしてインスタンス化して kansu()を使って、必要無くなったらnewしたのをdeleteするんですか。

めんどくさくないですか。  
155デフォルトの名無しさん:2014/12/13(土) 01:33:35.55 ID:rg/f35yI
>>154
しません
156デフォルトの名無しさん:2014/12/13(土) 01:37:40.14 ID:TNRjqhpJ
>>154
勉強不足
157デフォルトの名無しさん:2014/12/13(土) 01:39:39.48 ID:RaYBIhz1
static 付けとけって事ですか?
158デフォルトの名無しさん:2014/12/13(土) 01:43:09.21 ID:rg/f35yI
>>157
ちげーよ
お前はC言語でオブジェクト指向的に作るときどうしてんだよ。
そういう場合がないっていうんであればお前にはC言語以外のあらゆるモダンな言語をさわる必要がない。
159デフォルトの名無しさん:2014/12/13(土) 01:44:44.10 ID:RaYBIhz1
オブジェクト指向で作ったことないから聞いてるんですが
160デフォルトの名無しさん:2014/12/13(土) 01:50:03.00 ID:rg/f35yI
>>159
pythonとかから始めた方がいいよ。オブジェクト指向のメリットも解らないうちからクラスを使っても無駄。

あとC++でnewは必須ではないnewはC言語のmallocの代わり
161146:2014/12/13(土) 01:59:00.67 ID:0ma+/H0C
>>154
newしなくても呼び出せるよ
B b;
b.kasu();
これでいい
162デフォルトの名無しさん:2014/12/13(土) 06:19:44.82 ID:7YfznIJB
B().kasu()じゃいかんの?
163デフォルトの名無しさん:2014/12/13(土) 06:36:11.46 ID:ePw/V6Zq
>>154
Cでオブジェクト指向で作る場合にファイル内移動のfseek()を呼び出す時は、
毎回ファイルをfopenしてFILE*を取得して fseek()を使って、必要無くなったらfopenしたのをfcloseするんですか
164デフォルトの名無しさん:2014/12/13(土) 06:45:29.95 ID:54ajxy39
>>162
やることによるだろうが、初心者への回答としては >>161 だろうな

> 別のBって言うクラスの中に作ったkansu()を呼び出す時は

を満たすだけならスタティックメソッド定義して B.kansu() でもいいわけだし
165デフォルトの名無しさん:2014/12/13(土) 07:05:22.27 ID:dDUZkoJj
>>162
オブジェクト指向って、まずはデータありき

例えばだけど、
FILE* fp; の実体は構造体で、それに対してfpを引数に取る関数が有るが、
fputs(str, fp);
fclose(fp);

こういうのを、データとそれに対する処理をまとめて、例えばだけど、
File fp;
fp.fputs(str);
fp.fclose();
こういう風に書く、と言えば理解出来るかな?
(ちなみにこれは例で作ったでっちあげコードだから)

そういう意味で、fpに相当するデータが無い処理であれば、
File::kansu()
のように、fpを作らずC言語風に直接呼び出すようにすることも出来る。
166デフォルトの名無しさん:2014/12/13(土) 07:28:09.18 ID:3zNPC1A7
namespace にすべきか class 内 static にすべきか
167デフォルトの名無しさん:2014/12/13(土) 07:37:43.67 ID:KcZztYF+
B.kansu()
168スッキリ厨:2014/12/13(土) 08:13:03.36 ID:3ehKG0WS
>>154
関数には2種類ある
各インスタンスのデータを利用するメソッドと、
どのインスタンスにも関係しない、単なる関数

例えば上は、f(){
処理中に、そのインスタンスのデータをさわる
}

下は、f(a,b){return a+b;}など。
また同様に、staticメソッドも、
各インスタンスのデータを利用しない

オブジェクト指向を知らないなら、
スッキリわかる Java入門 第2版、2014を読んでみ
169デフォルトの名無しさん:2014/12/13(土) 08:26:59.44 ID:HH3VwBsv
using でばら撒ける利点と欠点があるのが namespace
170名無しさん@そうだ選挙に行こう:2014/12/13(土) 12:15:56.11 ID:hd+JAN++
すたちっく・めそっど?
171名無しさん@そうだ選挙に行こう:2014/12/13(土) 13:32:49.82 ID:uSXcAy/+
忘れるのがやな人はnamespace を使わないんだって
172名無しさん@そうだ選挙に行こう:2014/12/13(土) 16:09:08.14 ID:uXNkXewX
staticおじさんかな?
173名無しさん@そうだ選挙に行こう:2014/12/13(土) 23:59:15.84 ID:br/4A+04
しっくりこない
174名無しさん@そうだ選挙に行こう:2014/12/14(日) 04:39:03.82 ID:GV6oAgHg
http://usi58.blog16.fc2.com/blog-entry-155.html
この人と同じ疑問を持ったのでURL貼らせてもらいます

int str_char(const char str[], int c)
この仮引数cはint型
でも関数呼び出しの際に実引数として使っているのは・・・
char ch;
no=str_char(str, ch)+1;
char型

int型の方が守備範囲が広いのでchar型に格納された整数値を
int型に引き渡しても問題ないという感覚ですか?
問題が起きないとしても、わざわざstr_char関数の仮引数にint型を使うメリットはあるのですか?
演習問題として出題されているのですが、仮引数部分は問題文でこのように指定されているんです。
ちなみにchar型を使っても問題は起きませんでした。

型をそろえるという話をするのであれば
main関数の方で使っているchar ch;を
int ch;とする事も考えられれるのですがコンパイル失敗します
http://newcomer.s368.xrea.com/clang/src/9/9-3.c.txt
例えば↑このサイトだとint型変数を使っているのですがコンパイルできません
int main(void)
{
int a;
scanf("%c", &a);
printf("%c\n", a);
return 0;
}
これにaを入力してもちゃんとaが表示されるので
演習問題でもいけるか?とも思ったのですが・・・
175名無しさん@そうだ選挙に行こう:2014/12/14(日) 04:40:39.05 ID:GV6oAgHg
ちなみにポインタはまだ習っていないとの前提で解く問題です。
176名無しさん@そうだ選挙に行こう:2014/12/14(日) 04:43:13.68 ID:GV6oAgHg
ちなみにこの本の筆者は関数にはポータビリティを持たすべきだと各所で主張しているので
int型を指定したのはその関連なのかなとも思うのですがどうなのでしょう
177名無しさん@そうだ選挙に行こう:2014/12/14(日) 04:52:47.80 ID:ATeR7lG0
本がクソ
178名無しさん@そうだ選挙に行こう:2014/12/14(日) 04:58:12.55 ID:GV6oAgHg
>>177
それが答えなら納得できるんですけどね。
この演習問題の次の問題でも同様に検索する文字をint型で引き受けるように
仮引数が指示されてるんで、何か意味があるのかと思ってしまうんです
179名無しさん@そうだ選挙に行こう:2014/12/14(日) 04:58:57.42 ID:7UFBlXTF
getcharの戻り値がintだからとか?
180名無しさん@そうだ選挙に行こう:2014/12/14(日) 05:07:34.06 ID:GV6oAgHg
>>179
この解答ではgetchar関数は使っていません
181名無しさん@そうだ選挙に行こう:2014/12/14(日) 05:14:39.78 ID:7UFBlXTF
だからもしsscanfをgetcharに変えたりするときに変更しなくてもいいように
182174:2014/12/14(日) 05:27:25.96 ID:l0UGMelp
連投規制に引っかかったのでIP変えました
>>181
気づきませんでした
ごめんなさい
なるほどです

もしかしてgetcharを使うように暗に促しているのかなとも今考えているのですが・・・
例題等の流れからするとそこまでの要求はしていないかな・・
getcharの知識をまだあまりもってないのでまた考えてみます
183名無しさん@そうだ選挙に行こう:2014/12/14(日) 06:37:41.82 ID:QEpJ0bQG
>>174
>int c;
>scanf("%c", &c);

自分が何やってるか判っててやってる?
コンパイル通れば良いってもんでもない
184名無しさん@そうだ選挙に行こう:2014/12/14(日) 06:38:27.03 ID:OD3AYqGS
本に言えよ
185名無しさん@そうだ選挙に行こう:2014/12/14(日) 07:03:24.49 ID:QEpJ0bQG
しらんがな
186名無しさん@そうだ選挙に行こう:2014/12/14(日) 07:10:28.00 ID:uroqpNDp
マジレス
その本が クソ でいい。いや本当に
本だから正しいってことは無いから
187名無しさん@そうだ選挙に行こう:2014/12/14(日) 07:12:06.95 ID:ZbbL2D6A
if(str[i]==c) ってやってんだから、str[i]で取り出した時点でたぶんint型だろう。
それと比較するんだからcもint型にしてた方が良い。
188名無しさん@そうだ選挙に行こう:2014/12/14(日) 07:20:19.23 ID:2Jvuuix5
どうせintに自動拡張されるんだろ
189名無しさん@そうだ選挙に行こう:2014/12/14(日) 07:53:16.02 ID:5XjgYXbt
>>174, >>178
C言語では関数引数のcharはintに昇格されるから
getchar云々のレスは何か勘違いしてるから無視していい
まずはC言語の基礎を勉強すべき

printf("%d\n", sizeof('a'));     // C言語では4(intが4byteの場合)になる。
                     //なおC++だと1になる
190名無しさん@そうだ選挙に行こう:2014/12/14(日) 08:04:38.76 ID:/W5tLUsz
単にC言語の‘a’がint型だから。
それ以上でも以下でもない
191名無しさん@そうだ選挙に行こう:2014/12/14(日) 08:25:23.41 ID:qF8SNqwq
>>174
>int型に引き渡しても問題ないという感覚ですか?

理由が3つ。
一つはその通りです。
二つ目は、C標準関数にはcharの代替でintを用いる関数があるため
それに合わせたと考えられます。
すべてのchar値に加えEOFなど特別な値も表現させるためです。
三つ目は、printfなどの可変個引数の関数に渡す際には
自動的にintに変換されて渡されるため
それに何となく合わせたのだと思われます。

しかしここで少し問題があります。
charが符号付きの処理系ではそのままintに変換すると
C標準ライブラリでの文字のint表現と互換のない表現になります。
例えば
char ch = (char)'\xFF'; //0b1111'1111(マイナス1)
はintにすると
~0 // 0b11111'1111'…1'11111'1111(マイナス1)
になりますが、これはfgetcなどの表現0x000000FF(255)と違うのです。
これはstr_char内部でstr[i]==cを評価する際のstr[i]に合わせたものですが、
あまり使われる表現ではありません。
まあ間違いではないと思います。
192名無しさん@そうだ選挙に行こう:2014/12/14(日) 08:42:25.21 ID:qWIyAP97
まあ、若いうちはintやcharやそういうのが気になるんだな。
いつか、そんなのは気にならなくなるよ。動けばいいんだよ。
193名無しさん@そうだ選挙に行こう:2014/12/14(日) 08:46:12.06 ID:4Q3P90q+
>C言語では関数引数のcharはintに昇格されるから
以前もこういうこという人いたよな
ソース出せといわれて出せなかったけど
ISO/IEC 9899:2011の6.5.2.2読んでから出直した方がいい
194174:2014/12/14(日) 08:48:21.05 ID:l0UGMelp
>>183
一文字の文字コードをint型変数cに格納  かな
自分が何が分かってないのかが分からないところが独学の怖いところですね
それを自分で発見しないといけないからやっかいで・・・
>>186
分かりましたw
>>189
自分の理解だと・・
'a' は「文字定数」といい、「char型ではなく」 「int型である」
よってsizeofの引数に 'a' を指定すると、そもそもchar型ではなく
int型が引数に指定されるということになる。
つまりsizeof関数によってint型に昇格したのではなく
そもそも元からint型である
aはchar型だが、'a' はint型である
と必死に書いていたら、すでに簡潔に書いてくれていました>>190

>>191
なるほどです。
一応意味はあるだけど突き詰めていくとグレーの部分に触ってしまうとも言えるのですね
なんかスッキリしました
たぶんこの辺はもっと学習が進めば分かっていくと思うのでがんばります
>>192
はいw
195名無しさん@そうだ選挙に行こう:2014/12/14(日) 09:41:14.99 ID:hOKj1DJv
charは1バイトの整数なんだから、文字型って読んでるだけで文字でも何でもねえんだよ
196 ◆QZaw55cn4c :2014/12/14(日) 12:16:29.02 ID:OpFAx2j5
>>193
ISO/IEC 9899:2011 6.5.2.2 p6
If the expression that denotes the called function has a type that does not include a
prototype, the integer promotions are performed on each argument,
プロトタイプ宣言ではない表現であれば、すべての引数について整数格上げが実施される

ISO/IEC 9899:2011 6.3.1.1
If an int can represent all values of the original type, the value is converted to an int;
otherwise, it is converted to an unsigned int. These are called the integer
promotions.
整数格上げの定義

>>193
どこ読んでんだ?
197名無しさん@そうだ選挙に行こう:2014/12/14(日) 13:18:20.07 ID:/W5tLUsz
それってプロトタイプに型が宣言されてないprintfみたいな関数は整数は格上げされるしfloatはdoubleにされるって話じゃねーの?

そもそもsize_ofは関数じゃないから発端の >>189 はどう考えてもおかしいんだけど。
198名無しさん@そうだ選挙に行こう:2014/12/14(日) 14:31:16.83 ID:hqX94Jho
>>196
それはプロトタイプが無い場合って書いてあるだろう。
その直後にはプロトタイプが有っても可変個引数の場合の記述もある。

プロトタイプが有って可変個引数じゃない場合は段落7の通り
f(const volatile char p1); に対して char p1 = 実引数;
を実行したかのようにcharに変換される。
If the expression that denotes the called function has a type that does include a prototype,
the arguments are implicitly converted, as if by assignment, to the types of the corresponding parameters,
taking the type of each parameter to be the unqualified version of its declared type

↑ 最後に「declared type」って書いてあるだろう?
199名無しさん@そうだ選挙に行こう:2014/12/14(日) 14:41:03.55 ID:qF8SNqwq
>>189
どうでもよいけれど
× printf("%d\n", sizeof('a')); // 未定義動作
○ printf("%zu\n", sizeof('a'));
200名無しさん@そうだ選挙に行こう:2014/12/14(日) 15:28:29.91 ID:Twa9q4id
%z規格は最近だから使えるかが問題だな
キャストが安全
ビッグエンディアンじゃなければ%dでも範囲内ならたぶん大丈夫
201名無しさん@そうだ選挙に行こう:2014/12/14(日) 15:55:15.00 ID:+Whl+z54
AIXとかSolarisはこのスレに来ないでください。
あと複数のsize_t引数を%dで受け取ると読みとり位置がずれる糞処理系も。
202デフォルトの名無しさん:2014/12/14(日) 20:04:27.03 ID:uU8Xu0Kx
printf("%d\n", (int)sizeof('a'));
これで環境非依存
203デフォルトの名無しさん:2014/12/14(日) 20:26:32.87 ID:KSIBAwbk
符号ビット部の情報欠損してんじゃん
204デフォルトの名無しさん:2014/12/14(日) 20:27:57.11 ID:KSIBAwbk
脊髄反射だった、欠損じゃないや、データビットから符号ビットになってしまうじゃん、って事
205デフォルトの名無しさん:2014/12/14(日) 20:32:31.44 ID:/W5tLUsz
>>204
別にその程度だったら実用上問題なくね?
206デフォルトの名無しさん:2014/12/14(日) 20:43:09.83 ID:qF8SNqwq
【制限】「sizeof(type)」が32767を超える処理系では使わないでください
例:
struct s {char x[1024LL*1024*1024*2]};
printf("%d", (int)sizeof(struct s));//oops...
207デフォルトの名無しさん:2014/12/14(日) 22:28:51.52 ID:Twa9q4id
そんなにでかいのスタックやヒープで取っちゃダメww
低レベルAPIよべえええ
208デフォルトの名無しさん:2014/12/14(日) 23:17:23.04 ID:NsSmhBua
2ギガぐらいヒープに確保させてよ
器の小さい男だな
209デフォルトの名無しさん:2014/12/14(日) 23:50:22.09 ID:g1m5xeWZ
低レベルAPIはどこに確保してると思ってるのかな?w
210デフォルトの名無しさん:2014/12/15(月) 05:36:46.03 ID:0zemH3Hd
VirutaAllocみたいなん使えってことだな
211デフォルトの名無しさん:2014/12/15(月) 07:39:01.48 ID:EZkZoVoc
ヒープに確保してんじゃんw
212デフォルトの名無しさん:2014/12/15(月) 20:18:04.85 ID:zp/a3var
ところでcharが1バイト8ビットというのは、今後、
永久に変わらない保証はあるのか?
213デフォルトの名無しさん:2014/12/15(月) 20:20:44.77 ID:nZ6SURCk
お前、永久に生きるつもりなのか?
214デフォルトの名無しさん:2014/12/15(月) 20:28:18.07 ID:zp/a3var
>>212の質問に対して
>>213の疑問を持つ君の思考回路が不思議だ。
215デフォルトの名無しさん:2014/12/15(月) 20:37:09.15 ID:IvJkw6p6
>>212
ない。
と言うか、まず1バイト=8ビットと言うのが環境依存。
バイト、と言う用語自体が8ビット単位だとは規定されてなくて
あくまで大手が採用した8ビットをよく使ってるだけだからな。
9ビットとか7ビットとかの環境も実在してたらしい。
216デフォルトの名無しさん:2014/12/15(月) 20:41:51.10 ID:oPGdzw77
RFCみてると、byte という単位はあいまいなので
あえて octet として 8ビットで1まとまりの集合 と表現してるケースがあるけど

それを取り扱えるC/C++上での型は生き残って欲しいね
217デフォルトの名無しさん:2014/12/15(月) 20:47:01.41 ID:/RjxNv/g
>>212
そんな保証ないし
218デフォルトの名無しさん:2014/12/15(月) 20:49:19.37 ID:/RjxNv/g
>>215
> 9ビットとか7ビットとかの環境も実在してたらしい。

8以上でないとダメなので、9 はいいけど 7 はダメよ〜ダメダメ
219デフォルトの名無しさん:2014/12/15(月) 20:58:38.17 ID:IvJkw6p6
>>218
あそっか、Cの仕様としては8以上だっけ
220デフォルトの名無しさん:2014/12/15(月) 20:59:14.58 ID:o90Fdm/h
実際問題1バイトを7bitとか9bitにしてもメリット無いから
221デフォルトの名無しさん:2014/12/15(月) 21:10:53.94 ID:zp/a3var
>>218
>8以上でないとダメなので、9 はいいけど 7 はダメよ〜ダメダメ
そうなのか。君は博識だな。感心した。
しかし、
8以上でないとダメなので、9 はいいけど 7 はダメ
みたいな曖昧さを残しているから混乱のもとでは無いのかな。
この際、『charは永久に8ビットです。』みたいに長嶋監督みたいに
言いきれば良いのに。そしたら、混乱は無くなる。
ついでにshortは2バイト、intは4バイト、longは8バイトと決めてしまえよ
と言いたい。
218、おまえ頑張ってCの規格決める委員になってやってくれ!
222デフォルトの名無しさん:2014/12/15(月) 21:14:23.85 ID:G6SMH/U8
組み込み用16bitCPU辺りを使っているときに、intが4バイトを強制されるのは鬱陶しい。
4バイト極め打ちが欲しければint32_tを使え。
223デフォルトの名無しさん:2014/12/15(月) 21:17:03.44 ID:zp/a3var
もしshortは2バイト、intは4バイト、longは8バイトになったら
16バイト整数は何て呼ぶのがいいかな。そんな整数使わないか?
224デフォルトの名無しさん:2014/12/15(月) 21:31:21.79 ID:0zemH3Hd
最初にlong型を定めた環境では8バイト整数だったけど8バイト整数扱えないチープな環境でハイエンドマシン用に開発されたlong多用のソースコードを手直し無しでコンパイルできて満足な速度で実行したいという要望に応えるためにint型と同等にするコンパイラが相次いだ
もはやlongがintのシノニムになってる環境が多かったのでそれより大きな整数型を定めるとき新たにlong longが型を作った
225デフォルトの名無しさん:2014/12/15(月) 21:37:28.41 ID:zp/a3var
>long long
なんて安易な名前付けた奴を10時間くらい説教したいわ。
226デフォルトの名無しさん:2014/12/15(月) 21:42:14.52 ID:/RjxNv/g
>>221
> ついでにshortは2バイト、intは4バイト、longは8バイトと決めてしまえよ
> と言いたい。
> 218、おまえ頑張ってCの規格決める委員になってやってくれ!

言いたいお前がやれよ...
227デフォルトの名無しさん:2014/12/15(月) 21:50:38.18 ID:o90Fdm/h
規格に
int8_t int16_t int32_t int64_t
あるだろ。
それ使えよ
228デフォルトの名無しさん:2014/12/15(月) 21:56:44.00 ID:aecnUL4g
だってそれ実装必須じゃないんだもん
229デフォルトの名無しさん:2014/12/15(月) 21:58:29.29 ID:zp/a3var
>>227
本当かい?
良い事を聞いた。ありがとう。2014年に得た知識の中で最高の情報だ。
230デフォルトの名無しさん:2014/12/15(月) 22:09:15.96 ID:z6FuPzm/
>>229
なんか悲惨だなお前
231デフォルトの名無しさん:2014/12/15(月) 22:11:46.44 ID:Rz0RJQQL
うそん charは8ビットって憲法に書いてるとおもた
232デフォルトの名無しさん:2014/12/15(月) 22:19:02.71 ID:I5N8rwo4
>>218
>8以上でないとダメなので

ソースは?
233デフォルトの名無しさん:2014/12/15(月) 22:30:28.82 ID:/SsCOr8K
>>221
個人的には

char : 8bits
short : 32 bits
int: 64 bits
long: 128 bits
long long : んなもの作るな
intX_t : 必須にしろ
234デフォルトの名無しさん:2014/12/15(月) 23:09:03.37 ID:kqwLJzNR
5.2.4.2.1 整数型の大きさ<limits.h>
次に列挙する値は, #if 前処理処理指令の中で使用するために適した定数式に置き換えられなければならない。
さらに, CHAR_BIT 及び MB_LEN_MAX に対する値を除き, これらの値は, 対応する型のオブジェクトだけからなる式が整数拡張に従って変換された場合の型と同じ型を持つ式に置き換えなければならない。
これらの処理系定義の値は, それぞれの項目の右に示してある値と同じ符号をもち, その値以上の大きさ (絶対値) をもたなければならない。

ビットフィールドでない最小のオブジェクト (バイト) におけるビット数
CHAR_BIT 8
235デフォルトの名無しさん:2014/12/16(火) 00:28:13.49 ID:3/HbEtru
今一番使われてる文字エンコーディングのUTF-8やUTF-16を1バイトが8bit以外の環境で扱う事を考えるとそんな物が普及するとは思えない
236デフォルトの名無しさん:2014/12/16(火) 08:23:46.46 ID:WAE7fsVo
#ifdef _DEBUG
 printf("デバッグ i=%d\n", i);
#endif
みたいなのを沢山入れると見づらいので、一行でスッキリ書く方法ありますか?
printfに限定すれば自作出来そうなのですが、
printfの部分が他の関数の場合でも使える上手い方法教えて下さい。
237デフォルトの名無しさん:2014/12/16(火) 09:04:13.81 ID:SFv2CbUY
>>236
linux kernelのpr_debugみたいなの?
238片山博文MZ ◆T6xkBnTXz7B0 :2014/12/16(火) 10:09:14.66 ID:SjAIoHMV
#ifdef _DEBUG
#define _DEBUG_ONLY(x) x
#else
#define _DEBUG_ONLY(x)
#endif

_DEBUG_ONLY(printf("デバッグ i=%d\n", i));
239デフォルトの名無しさん:2014/12/16(火) 10:51:27.17 ID:cBSRYRo6
>>238 予約識別子使うな
240デフォルトの名無しさん:2014/12/16(火) 10:54:10.77 ID:WAE7fsVo
>>238
ありがとうございます。片山先生に教えていただけるとは光栄です。
早速使わせていただきます。
_DEBUG_ONLY(x)は長いのでD(x)にしました。
241デフォルトの名無しさん:2014/12/16(火) 12:01:54.23 ID:8Ehx8+/f
>>238
よい
242デフォルトの名無しさん:2014/12/16(火) 12:22:24.48 ID:sfpQIcv2
fprintf(stderr, __VA_ARGS__)
じゃないの
243デフォルトの名無しさん:2014/12/17(水) 06:08:32.12 ID:JT1Z8OMa
void main()
{
  _tsetlocale(LC_ALL, _T(""));
  wstring str1 = L"abc";
  wstring str2 = L"abcdefg";
  wstring str3 = L"ABC";
  wstring format = L": %20.15lf, %d\n";
  wprintf((str1 + wstring(10 - str1.size(), ' ') + format).c_str(), 12.345, str1.size());
  wprintf((str2 + wstring(10 - str2.size(), ' ') + format).c_str(), 12.345, str2.size());
  wprintf((str3 + wstring(10 - str3.size(), ' ') + format).c_str(), 12.345, str3.size());
}
VS2013で出力の ":" の位置を揃えたいので上のようなのを試したのですが、文字列の中に全角文字があると
ずれてしまいます。どうすれば良いでしょうか?
244デフォルトの名無しさん:2014/12/17(水) 06:49:06.64 ID:hbZ0TZdX
なんで%-10sを使わないんだ?
それはさて、どの途プロポーショナルフォントなら揃わないだろ。
245デフォルトの名無しさん:2014/12/17(水) 07:45:20.75 ID:JT1Z8OMa
>>244
>なんで%-10sを使わないんだ?
そうですね、それでも良いのですが、兎に角、位置を揃える方法ありますか?
どんなに変な方法でも構いません。
246デフォルトの名無しさん:2014/12/17(水) 07:54:26.07 ID:OmIW45Ki
>>245
グラフィックとして文字を表示、かな。
247デフォルトの名無しさん:2014/12/17(水) 07:54:36.84 ID:SKijSNg0
想定している端末上での全ての文字について
表示幅を配列にでも格納しておき、それを使って計算する。
248デフォルトの名無しさん:2014/12/17(水) 07:57:48.19 ID:JT1Z8OMa
表示はVSのコンソールウインドウです。
あるいはファイルに出力する場合もあります。
使うフォントはMSゴシックです。
この前提で、何か良い方法ありますか?
249デフォルトの名無しさん:2014/12/17(水) 09:46:07.25 ID:ljfuwyTd
.size() の所だけマルチバイトに変換して呼び出すくらいかな〜
250デフォルトの名無しさん:2014/12/17(水) 10:10:45.50 ID:1UMPa1MZ
>>248
string使えば揃う

#include <stdio.h>
#include <string>
using namespace std;
int main()
{
string str1 = "abc";
string str2 = "abcdef";
string str3 = "ABC";
printf("%-20s:%20.15f,%d\n", str1.c_str(), 12.345, str1.size());
printf("%-20s:%20.15f,%d\n", str2.c_str(), 12.345, str2.size());
printf("%-20s:%20.15f,%d\n", str3.c_str(), 12.345, str3.size());
}
/*
abc : 12.345000000000001,3
abcdef : 12.345000000000001,6
ABC : 12.345000000000001,6
*/
251デフォルトの名無しさん:2014/12/17(水) 11:00:20.78 ID:JT1Z8OMa
>>249>>250
レスありがとうございました。
wstringでやりたいのですが、無理そうですね。
252デフォルトの名無しさん:2014/12/17(水) 12:14:17.97 ID:ev+qw7pl
そもそも一文字が同じ幅って原則がないのに無理だろ。
253デフォルトの名無しさん:2014/12/17(水) 12:39:49.74 ID:1UMPa1MZ
>>251
前提から、全角文字の表示幅が半角文字の環境なんだから
表示したい文字列の一つ一つの文字種を調べて、全角なら半角2文字文として表示幅を計算すればいい

stringで揃ったのは全角が2バイトだからだけど、とても環境依存だから要注意
254デフォルトの名無しさん:2014/12/17(水) 22:11:31.32 ID:xIXyOP7G
255デフォルトの名無しさん:2014/12/18(木) 09:58:16.56 ID:9zdFGHwA
>>254
ありがとうございました。いい感じで行けました。感謝です。
ビット演算はよく分らないので普段あまり使わないのですが
size += (ch & ~0xFF) == 0 ? 1 : 2;  // オリジナル
size += (ch <=255) ? 1 : 2;
こんなのでも問題ないでしょうか?いちおう同じ動作のようなのですが。
256デフォルトの名無しさん:2014/12/18(木) 13:15:31.19 ID:81l/o61z
>>255
chが負数のとき動作が変わるけど、ほぼ大丈夫だと思う
windowsのwchar_tはunsignedみたいだし
257デフォルトの名無しさん:2014/12/18(木) 13:53:07.38 ID:M1EWXYxl
>>254
>>255
半角カナが全角扱いされるけどいいのか?
258254:2014/12/18(木) 14:45:54.46 ID:Mboq20NA
>>257
存在を忘れていたすまぬ
size += (ch<127 || (0xFF61<=ch && ch<=0xFF9F)) ?
1 : 2;
259デフォルトの名無しさん:2014/12/18(木) 20:11:25.44 ID:on3AHD1c
ギリシャ文字はどっちなんだ?
260デフォルトの名無しさん:2014/12/18(木) 21:24:09.44 ID:0A0mu87l
アルファベット以外のラテン文字もあるよな
261デフォルトの名無しさん:2014/12/18(木) 21:26:24.61 ID:XRwKyCQA
いえ、MS ゴシックにそんなものはありません
262デフォルトの名無しさん:2014/12/19(金) 10:15:27.82 ID:Gv3qWP/n
ちょっと変な事質問しますけれど、エディタで編集しているときに
新しい関数など追加する時、ファイルの末尾に追加しますか?
先頭に追加しますか?私は基本的には先頭に追加しています。
不可意味はありませんが。
263デフォルトの名無しさん:2014/12/19(金) 10:22:15.08 ID:Gv3qWP/n
X 不可意味
○ 深い意味
264デフォルトの名無しさん:2014/12/19(金) 11:21:46.10 ID:DKkZHFaw
先頭に追加するタイプの人は、ひとつの関数に対して
プロトタイプと実装の不整合が起きるのを嫌う人が多いように思う
俺もそう思って先頭に書くことが多い

後ろに追加するタイプの人は、それは揃いで修正するものだし
そもそもヘッダ書くときは自然とそうなるじゃんって考えるのかもな

…でも、別ファイルの場合は、ファイル毎にカーソル位置が維持されてるけど
同一ファイルだと画面分割やジャンプマーカー、
IDEの定義ジャンプ使うとかになるから微妙に感じが違うんだよなあ
265デフォルトの名無しさん:2014/12/19(金) 15:57:15.63 ID:M007GgfU
途中に挿入することも普通にあるわ
前後に関連する関数が並んでた方が都合良い場合
266デフォルトの名無しさん:2014/12/19(金) 19:29:29.56 ID:IN4kTmtP
局所的なら関数オブジェクトや構造体作ってそこに静的関数書いてしまう
267デフォルトの名無しさん:2014/12/19(金) 20:24:05.80 ID:HBs21ByZ
局所的なら無名名前空間に書いちゃうな。
268デフォルトの名無しさん:2014/12/19(金) 20:37:22.69 ID:KN8cPhgb
関数内限定ならstd::functionでローカル関数にしちゃうな
269デフォルトの名無しさん:2014/12/19(金) 20:47:06.98 ID:3n+MCOD2
先頭に追加するタイプの人は馬鹿
後ろに追加するタイプの人も馬鹿
意味を理解できず形式でのパターン認識しかできないアスペ

意味を考えて関連する関数の隣に追加する>>265が正解
270デフォルトの名無しさん:2014/12/19(金) 21:38:14.13 ID:oEjuXAA4
宣言順に合うように定義する
271デフォルトの名無しさん:2014/12/19(金) 22:17:01.06 ID:djnaYo+5
↑どうしようもないアスペ
272デフォルトの名無しさん:2014/12/19(金) 22:36:01.77 ID:hnfO2v+W
基本的には関連を並べるとして
末尾のほうがdiff失敗しにくい気がするからそうしてる
273デフォルトの名無しさん:2014/12/20(土) 00:03:20.11 ID:jir7SMap
起動時初期化関係
プログラム起動中の処理
 さらにその初期化・動作部・後始末
終了時後始末関係

って感じでやってるわ
274デフォルトの名無しさん:2014/12/20(土) 00:06:45.11 ID:m/I2dwZE
俺は初期化と始末は近くに置く
その方が対象になってて読みやすいし、その2つは大概セットで弄るから近いほうがいい
275デフォルトの名無しさん:2014/12/20(土) 00:07:12.74 ID:QOAtTpic
なんでコンパイルエラーこんなにわかりにくいのん
276デフォルトの名無しさん:2014/12/20(土) 00:25:17.05 ID:vyTasIsK
コンパイラさんの気持ちになればわかるよ
277デフォルトの名無しさん:2014/12/20(土) 00:27:31.84 ID:dFj/JFMf
関連する関数はひとまとめにして宣言するから宣言順の定義はありだろ
何も考えずに適当に定義する奴が一番うざい
複数人で編集してそれぞれが別々のポリシーだと更につらい…
278デフォルトの名無しさん:2014/12/20(土) 10:38:06.68 ID:DXs99VMy
>>276
最近のコンパイラさんは親切
CLANGのprintfの書式までみたエラー報告を観て、乗り換えることに決めたし
279デフォルトの名無しさん:2014/12/20(土) 13:30:45.46 ID:e+FqSQyU
>コンパイラさんの気持ち

こんな糞コード書きやがってボケが
280デフォルトの名無しさん:2014/12/20(土) 13:33:30.15 ID:e+FqSQyU
>>277
PHPですね判ります
281デフォルトの名無しさん:2014/12/20(土) 15:15:21.98 ID:eYLVnGdK
隠しオプションでコンパイラが文句言うのも楽しいかと。
初期化してねーよ。
ほんとに代入文でいいのか。
returnがねーんだよ。
何回 エラー出すんだよ やめちまえ
282デフォルトの名無しさん:2014/12/20(土) 16:44:49.79 ID:acQ5HpBR
>ほんとに代入文でいいのか
if文とかでよくお世話になてますgccさま
283デフォルトの名無しさん:2014/12/20(土) 18:30:26.22 ID:/92Bh633
なんじゃその 0x81 な文字は

全角スペースになってた
284デフォルトの名無しさん:2014/12/20(土) 21:31:56.51 ID:dbUt4Kp+
enum classというのを知ったのですが、これはclassと言う名前が付いています
けれどメンバ関数やメンバ変数を持つ事は出来ますか?
285デフォルトの名無しさん:2014/12/20(土) 21:33:49.01 ID:acQ5HpBR
ええ
286デフォルトの名無しさん:2014/12/20(土) 21:51:24.19 ID:QOAtTpic
そんな誰も使わないようなのは忘れてしまいなさい
287デフォルトの名無しさん:2014/12/20(土) 22:10:44.44 ID:dbUt4Kp+
>>285>>286
使えるんですか?本当ですか?
toString()みたいなメソッドを追加してenumの要素の名前を
文字列化することが出来ないかなあと思ったのですが、、、
出来ますか?
288デフォルトの名無しさん:2014/12/20(土) 22:29:04.46 ID:cUhMXe+F
>>284, >>287
持てないので無理
>>285-256 は老害なので無視していい
289デフォルトの名無しさん:2014/12/20(土) 23:04:33.69 ID:G6vI+a3j
delete this;
っていいの?

struct Koo
{
 void del()
 {
  delete this;
 }
};

Koo koo;
koo.del();

なんて合法ですか?
290デフォルトの名無しさん:2014/12/20(土) 23:11:03.98 ID:vyTasIsK
newしたのなら問題ない
291デフォルトの名無しさん:2014/12/20(土) 23:45:43.13 ID:mIAMy6Br
それ一番最初みたのはCOMのIUnknown実装だったな
292デフォルトの名無しさん:2014/12/21(日) 00:58:35.85 ID:r5O7MXix
警告とエラーの区別がついていない奴が居るな
293デフォルトの名無しさん:2014/12/21(日) 02:18:57.27 ID:ANxxvVGk
ご相談に乗っていただきたいです
現在OpenCV2.4.10とDxLibを併用して使っているのですが、findContoursメソッドを使用すると
ヒープが壊れたというランタイムエラーが発生してしまいます
どうにか回避方法を教えていただきたいです


↓ソースです
http://codepad.org/hS14MmrI

環境はWindows vista(32bit) visual studio 2010
294デフォルトの名無しさん:2014/12/21(日) 02:28:52.48 ID:M3TgxH+N
295デフォルトの名無しさん:2014/12/21(日) 02:31:43.61 ID:ANxxvVGk
>>294
一応ひと通り検索して上記のサイトの通りcv::Matでも試してみましたが同じエラーでした
296デフォルトの名無しさん:2014/12/21(日) 06:58:00.56 ID:JuGLyqd7
>>287
enum class Word {FUCK, SHIT};
std::string ToStr(Word word)
{
 switch (word)
 {
  case Word::FUCK: return "FUCK";
  case Word::SHIT: return "SHIT";
 }
}
297デフォルトの名無しさん:2014/12/21(日) 08:44:42.22 ID:ca+yvWC9
for(int i=0;i<1000;i++)
{
  ... // 処理
}
みたいなループの処理の中で、例えばi=200のときに原因不明のエラーが
発生するのでデバッガのブレークポイント●置きたい時に
 if(i==200)
●   int aaa = 777;
みたいに適当な文を入れてブレークポイント●で止めているのですが、上級者の方は
どのようにされているのでしょうか?
298デフォルトの名無しさん:2014/12/21(日) 09:16:16.34 ID:7WbNxZ9e
条件付ブレークポイントを設定すれば?
299デフォルトの名無しさん:2014/12/21(日) 09:17:15.87 ID:4JRzeYEu
>>289
合法、但しdelete thisより後には自身のメンバを参照したり設定したりといったことはせずに抜けること
戻り値などに必要なら、ローカル変数などに予め計算し退避してからdelete this、退避した値をすぐ返して抜ける感じ
300デフォルトの名無しさん:2014/12/21(日) 09:29:07.64 ID:DnWIXG3h
>>297
C/C++の話じゃなくてIDEの話やな
301デフォルトの名無しさん:2014/12/21(日) 09:36:16.20 ID:ca+yvWC9
>>298
ありがとうございました。こんな便利な機能があったとは。
302デフォルトの名無しさん:2014/12/21(日) 10:20:05.15 ID:jGyxCecV
下記のようなプログラムはメモリリークを起こすでしょうか?
また、メモリリークを起こすかどうか調べる方法はありますか?
struct STest0 {
char* p;
STest0 () { p = new char[1000]; }
~STest0 () { delete[] p; }
};
struct STest1 {
STest0* p;
STest1 () { p = new STest0[1000]; }
~STest1 () { delete[] p; }
};
int main(void) {
STest1* p;
p = new STest1;
delete p;
return 0;
}
303デフォルトの名無しさん:2014/12/21(日) 10:44:53.60 ID:DnWIXG3h
しないよ
メモリリークを調べるにはIDEの用意した機能を使うか
よくやるのはplacement newを使って確保したメモリを全部しらべるか
304デフォルトの名無しさん:2014/12/21(日) 11:16:32.02 ID:/0FePQ7L
>>302
単にそれだけなら問題ないが生ポインタを直接使うとリークと二重解放の危険がある
{
Stest0 a,b;
a = b; //aのポインタはリーク
} //a,bともに同じポインタをdeleteして未定義動作
boost.optional使っとけ

>>303
無能は黙ってろ
305デフォルトの名無しさん:2014/12/21(日) 11:20:03.33 ID:pUBdq9m4
いや、下記のようなプログラムと名打ってるんだから、
(そのmain処理の場合は)メモリーリークは起こらないよ(、ただし、常に起こらないとは限らない)、が正しい
306デフォルトの名無しさん:2014/12/21(日) 11:25:39.60 ID:/0FePQ7L
君もアスペかな?単にそれだけなら問題ないと断ってるんだけどな
307デフォルトの名無しさん:2014/12/21(日) 11:35:03.17 ID:DnWIXG3h
>>304
俺が無能呼ばわりされたのはなんで?
308デフォルトの名無しさん:2014/12/21(日) 11:40:23.12 ID:/0FePQ7L
>>307
生ポインタを直接使う危険な書き方について初心者にお墨付きを与えるような回答をしたから。
君のアスペの典型例のような回答によってまた世の中に信頼性の低いゴミプログラムが量産されることなる。
あとplacement newじゃなくてnewのオーバーロードだろ君か言いたいのは
309デフォルトの名無しさん:2014/12/21(日) 11:44:25.99 ID:yks2ucd5
> 生ポインタを直接使う危険な

あのさあ…

>>307
そいつのことはほっとこう。
310デフォルトの名無しさん:2014/12/21(日) 11:45:33.30 ID:DnWIXG3h
newはオーバーロードだったかな、訂正します

もちろん上のコードを見た時は色々言いたいことがあったけど
掲示板上で相手の姿を勝手に想像して余計なことを言うよりはマシだと思ったので
聞かれたこと以上のことは言わなかったよ
311デフォルトの名無しさん:2014/12/21(日) 12:00:03.61 ID:/0FePQ7L
>>309
すくなくともクラスのメンバに生ポインタを持たせるときは
コピーコンストラクタと代入演算子を定義するべきだとアドバイスするべきだと思うんだ
312デフォルトの名無しさん:2014/12/21(日) 12:11:30.00 ID:HpxqpUIE
スマポ信者ウザいぞ
布教活動なら駅前でやれ
313デフォルトの名無しさん:2014/12/21(日) 12:15:05.13 ID:kuosliUP
>>308
現在はオブジェクトの配置を操作する場合に限らず全部ひっくるめて placement new と
呼ぶのが普通だろう。
314デフォルトの名無しさん:2014/12/21(日) 12:24:53.70 ID:iboby73v
>>313
何処の普通なの?
315デフォルトの名無しさん:2014/12/21(日) 12:30:03.51 ID:/0FePQ7L
今気づいたけどoptionalって配列扱えないよね。すまん。
316デフォルトの名無しさん:2014/12/21(日) 12:31:30.08 ID:iboby73v
配列ならvectorで十分よね
317デフォルトの名無しさん:2014/12/21(日) 12:40:37.37 ID:kuosliUP
>>314
たとえばWikipedia「New演算子」
http://ja.wikipedia.org/wiki/New%E6%BC%94%E7%AE%97%E5%AD%90
ここの「配置new」の項とか、Effective C++ 第3版 p.278とか。
318デフォルトの名無しさん:2014/12/21(日) 13:03:50.24 ID:RezxTVbj
会話が噛み合ってないぞ
 A.配置を目的としたもの
 B.配置を目的としないけどnew(引数※1) 型(※2)の※1を伴うもの
 C.new演算子のオーバーロード全般
Cを含むかどうかはっきりさせろ。
ちなみにISO/IEC 14882:2011でA Bを配置と読んでいる
319デフォルトの名無しさん:2014/12/21(日) 13:20:18.85 ID:kuosliUP
もし>>308が否定した placement new が最初からBを指していたのだとしたらおかしな話だ。
実際、Bの placement new でリークチェックを行う環境はあるわけだし。
320デフォルトの名無しさん:2014/12/21(日) 13:33:13.93 ID:NUMS41YM
皆aについて話をしていたのに
>>313が違う話をしだした。
>>313の内容自体は正しくて
それまでの話とも矛盾はしてないのに
それまでの話を否定をしているかの様な言い回しだったため
混乱を招いた
321デフォルトの名無しさん:2014/12/21(日) 13:40:19.32 ID:e2fIb+kJ
>>303
すまんが placement new はすでに確保してある領域に対してコンストラクタを走らせる **だけ** の機能なので、
領域確保と解放の整合性に使えるとは思えないが、どうしてそんなものを思いつくのか?

C で malloc()/free() をラップするように、C++ では延々と new をオーバーロードするのが、回り道のようにみえて手っ取り早い
322デフォルトの名無しさん:2014/12/21(日) 13:47:29.36 ID:XqMqoIPN
訂正します
>>310で述べているものを
>>303の主張がおかしいと称して
話を混乱させる>>321であった
323デフォルトの名無しさん:2014/12/21(日) 15:49:15.34 ID:OSCBEJaL
>>314
世界の
324デフォルトの名無しさん:2014/12/22(月) 07:46:30.88 ID:rVdLl1iU
Wikipediaには
「配置new (プレースメントnew, placement new)は、new演算子からnew演算子関数へ引数を与えられる機能である。
 当初、インスタンスを特定のメモリアドレスに「配置」するための機能ということで配置newと命名された。
 後に配置に限らず様々な使い道に応用できることが明らかとなったものの、今でも慣習的に配置newと呼ばれる。」
とか書いてあるが、初めて聞いたぞこんなの。
325デフォルトの名無しさん:2014/12/22(月) 08:22:09.63 ID:kdPOQGvB
>>318
ところで、配置newではないnewのオーバーロードってどういうものを言うんだろう?
326デフォルトの名無しさん:2014/12/22(月) 08:47:45.78 ID:rVdLl1iU
std::nothrowを渡すやつとか

個人的にもやもやするんで調べたのだが
Wikipediaの記述の参考にしているらしいEffective C++ 第三版には
「... ここでは追加で一つのvoid*引数を取るnew演算子をplacement newと呼ぶが
 追加の引数を取るnew演算子全般を指してplacement newと呼ぶこともある」
って書いてあるっぽい(雑な役)
https://books.google.co.jp/books?id=Qx5oyB49poYC&printsec=frontcover&dq=effective+c%2B%2B+revised+3&hl=ja&sa=X&ei=YFmXVP_SLOi8mgXczoKQAg&ved=0CEsQ6AEwBjgK#v=onepage&q=placement%20new&f=false
の258ページ。

検索上位に来ていたロベールには
http://www7b.biglobe.ne.jp/~robe/cpphtml/html03/cpp03049.html
>引数付きの new のことを placement(プレイスメント)形式の new といいますが、
>このコンストラクタを呼ぶだけの new のこともただ単に placement new と呼びます。
と書いてある。

事実上、追加の引数を取るnewオーバーロード全般を指して「placement new」と呼ばれることがあるらしい。
個人的にはあんまり納得できないけど。
327318:2014/12/22(月) 09:34:43.95 ID:UkKFD8pd
>>325
メモリリーク検出とあったので
struct STest0 {
 void * operation new (std::size_t s) {
  …//ログhere
  return ::operator new (s);
 }
};
のシリーズのつもりで書いた
これをオーバーロードと呼ぶかどうかは確認せずに掻いた
328デフォルトの名無しさん:2014/12/22(月) 20:48:10.59 ID:PJrTpgsR
まぁ「無能は黙ってろ」とか言うやつは叩かれても仕方が無いな
人のふり見て我がふり直せだな
329デフォルトの名無しさん:2014/12/22(月) 22:00:28.03 ID:3C7mXd7r
>>327
::operator new 自体をラップして delete と対にしたいところだ
330デフォルトの名無しさん:2014/12/22(月) 22:57:33.43 ID:kdPOQGvB
>>329
>>327は省略してるだけで、当然、対応する operator delete も定義するんだと思うが。
このうえさらにグローバルな ::operator new をラップするのって何か役立つのかね?
というかそれ以前に、どこでラップするんだろう。
331デフォルトの名無しさん:2014/12/22(月) 23:30:14.04 ID:3C7mXd7r
>>330
デバッグ時限定で、delete 忘れがないか、あるいは二重に delete していないか、チェックしたいところだが
そういうときに ::operator new や ::operator delete あるいは ::operator new[], ::operator delete[] をオーバーライドして、これらのチェックをコードで確かめておくのはよくあることだと思うけれども
332デフォルトの名無しさん:2014/12/22(月) 23:48:51.17 ID:5zcMGUms
>>331
delete直前でassert p != NULL
delete直後にp = NULLじゃあかんの?
333デフォルトの名無しさん:2014/12/23(火) 00:02:45.08 ID:BjZtfoSn
アドレスをダンプしておいてどこで確保されさものか分けるようにするとかの発想は無いのか
334デフォルトの名無しさん:2014/12/23(火) 00:11:00.59 ID:ghEK2YZT
>>330-333
そんなごちゃごちゃしなくてもスマートポインタ・標準コンテナ使えば大方解決する問題じゃないの?
335デフォルトの名無しさん:2014/12/23(火) 00:18:43.98 ID:dkZcT41A
>>331
それは>>327でもできるんじゃないの?というかそのための>>327でしょ。
そのかわりに ::operator new でやるというのはあるだろうけど、それぞれ得失はあるよね。
::operator new を置き換えたら元の ::operator new は使えないから、メモリ管理全部自前で
実装しなきゃならないんじゃなかったかな?
336デフォルトの名無しさん:2014/12/23(火) 00:40:32.00 ID:4lbeIKul
>>334
流れ無視?
337デフォルトの名無しさん:2014/12/23(火) 01:10:04.67 ID:wokCfcTD
<まとめ>
生ポでメモリリーク検出したい
 ↓
配置newでおk
 ↓
配置newは関係ないだろ
 ↓
オーバーロードの間違いでした。例えば>327
 ↓
グローバルnew使うのがフツー
 ↓
クラスメンバーのnewでいいだろ
 ↓
スマポ使えば? ←アスペ
338デフォルトの名無しさん:2014/12/23(火) 04:39:12.70 ID:n6FqVsoT
プレースメントnew結構つかうな
普段はnewするだけのクラスで、そのオブジェクトを管理するオブジェクトの削除時に一気に全削除するようなとき
VirtualAllocで十分なメモリ空間リザーブして必要に応じてコミット拡張、実際の解放はdeleteでやらずVirtualFreeで全領域リリースとか
339デフォルトの名無しさん:2014/12/23(火) 08:09:35.89 ID:ATuB6kuL
>>335
>メモリ管理全部自前で実装しなきゃならないんじゃなかったかな?
まあ、そういうことだが、そんなに大変じゃない‥
340デフォルトの名無しさん:2014/12/23(火) 09:31:59.72 ID:wii8BwF3
>>338
そのような用途のために
std::vector<T, ★>
コイツがあるんじゃないの
341デフォルトの名無しさん:2014/12/23(火) 13:01:39.97 ID:Hv7cUDq/
>>337
生ポでメモリリーク検出したい に スマポ使えば?
これ、日本のマなら普通だろう。
コミュ能力なくて他の仕事に就けない奴でもマには普通になれるし
342デフォルトの名無しさん:2014/12/23(火) 13:30:13.09 ID:1GUI4T67
要件は「メモリリークを検出したい」であって「メモリリークを防ぎたい」じゃないでしょ
343デフォルトの名無しさん:2014/12/23(火) 13:34:41.39 ID:zn+tl5Qa
visualstudio使えば簡単に検出してくれる
だがや
344デフォルトの名無しさん:2014/12/23(火) 14:05:30.06 ID:BwyGxBnA
>>341
コミュ能力 ないの?
生ポのメモリリークから始まって、new演算子オーバーロードによる
フック的な使い方の実現方法の話になっていた矢先に
>>334がスマポとか言い出したから
>>336が「流れ無視?」と言ったんだよ。
345デフォルトの名無しさん:2014/12/23(火) 14:24:35.93 ID:7c77wjGC
>>341に無いのはコミュ能力じゃなくて、
初歩的なところの理解力だと思うがw
346デフォルトの名無しさん:2014/12/23(火) 16:20:07.71 ID:gTJoh1O6
ライブラリを探していますが,ここで聞いても良いですか?
347デフォルトの名無しさん:2014/12/23(火) 16:24:39.67 ID:zkNCry36
釣りはいりません
スマホとPCでIPと文体変えて
自作自演するんだろ?
348デフォルトの名無しさん:2014/12/24(水) 00:16:43.51 ID:0gOuJHpS
struct A {virtual void test() {}}
struct B : public A {virtual void test() {}}
struct C : public B {virtual void test() {}}
みたいな関係の三つのクラスを定義して
A *a = new C;a->test();するとき、
BやCのtestにvirtualつけるか否かって意味ないですよね?
今確かめたらそうなってました。

Bでvirtual外すと、Cでオーバーライドできない、
なんてことがあった時代がありますか?(←質問)
おぼろげながら、十数年前はそういう理解だったのですが、
それは当時も俺が勝手に勘違いしてただけでしょうか。
349デフォルトの名無しさん:2014/12/24(水) 00:18:40.64 ID:89gWHyFb
いいえ
350デフォルトの名無しさん:2014/12/24(水) 00:18:58.95 ID:ndV3e2Ga
>なんてことがあった時代がありますか?

ありません。
今は
struct C : public B {virtual void test() override {}};
としておくのが良いでしょう。
351デフォルトの名無しさん:2014/12/24(水) 00:31:32.93 ID:jLPsl9W6
>>349-350
さっそくありがとうございます!
すっきりしました。overrideキーワードについても早速ぐぐりました。
352デフォルトの名無しさん:2014/12/24(水) 08:46:59.00 ID:i2RnFyzZ
finalも
353片山博文MZ ◆T6xkBnTXz7B0 :2014/12/25(木) 21:23:08.86 ID:gEw73of1
template <typename T_CONTAINER>
site_t total_size(const T_CONTAINER& c)
{
return c.size()*sizeof(T_CONTAINER::value_type);
}
template <typename T_VALUE, size_t t_siz>
size_t total_size(const T_VALUE (&)[t_siz])
{
return t_siz*sizeof(T_VALUE);
}
どや?
354デフォルトの名無しさん:2014/12/25(木) 21:39:56.60 ID:XFKTSJbC
キチガイ警報発令中
会話のできないコミュ障は無視してください
355片山博文MZ ◆T6xkBnTXz7B0 :2014/12/26(金) 00:18:24.45 ID:rmtyj285
いちおう説明しとくと、これらは、
コンテナの実データサイズを求めるテンプレート関数、
並びに配列の実データサイズを求めるテンプレート関数である。
356デフォルトの名無しさん:2014/12/26(金) 03:51:53.07 ID:D07w3ybz
t_sizが小文字なのが気持ち悪い。
ついでに言うと、中途半端な略語も気持ち悪い。
typename T_VALUE, size_t T_SIZE>でいいだろうに。
357デフォルトの名無しさん:2014/12/26(金) 07:07:58.62 ID:JqjrriTa
意味不明な断片コードを投下して
後から 一 応 説明とか
スレ荒らすなボケ
358デフォルトの名無しさん:2014/12/26(金) 07:25:25.68 ID:oCZZOout
お前なに欠番に向かって喋ってんだよ
359デフォルトの名無しさん:2014/12/26(金) 14:14:24.94 ID:QU2ITzw/
UTF8と16の相互変換て何か定石ありますかね?
360デフォルトの名無しさん:2014/12/26(金) 14:20:10.71 ID:KN+qDrDJ
ある
361デフォルトの名無しさん:2014/12/26(金) 19:38:26.37 ID:Eg1IvU+Y
>>359
1.仕様通り一旦コードポイント値を経由して変換
2.UTF16のサロゲートペアをくっつけて本来の範囲外の値になったら
セキュリティ攻撃の可能性あり

以上
362デフォルトの名無しさん:2014/12/26(金) 19:39:49.53 ID:y3Oe54D2
codecvtを使う
363デフォルトの名無しさん:2014/12/26(金) 20:20:42.84 ID:QU2ITzw/
>>360-362
ありがとうございます
今結局自力でゴリゴリ書き始めてしまったので
後ほどレビューなどお願いするかもです
364デフォルトの名無しさん:2014/12/26(金) 21:07:27.67 ID:y8SP1A+Y
UTF-8でも同じ値でも一番短く表現できるものより長く表現されてるものは攻撃の可能性あり。
365デフォルトの名無しさん:2014/12/27(土) 07:33:03.44 ID:x6PZI0I4
using namespace std;

int add(int a, int b, int c)
{
return a + b + c;
}

int main()
{
// 第1引数のみを先に渡す
using namespace std::placeholders;
std::function<int(int, int)> f = std::bind(add, 2, 3,_1);

// 残りの引数を渡して関数を呼び出す
const int result = f(4);

std::cout << result << std::endl;
}

ってなんで怒られるんですか?
366デフォルトの名無しさん:2014/12/27(土) 07:52:41.58 ID:rEUVsFml
std::function<int (int)>
じゃね?
367デフォルトの名無しさん:2014/12/27(土) 09:42:09.61 ID:CuOP4Fsp
bindって何のために存在してるの?
function<int (int)> f = [](int p3){return add(2,3,p3);};
って書けばいいのに
368デフォルトの名無しさん:2014/12/27(土) 10:33:22.27 ID:quCM7twS
bindの方がすっきりする場面があるから
369デフォルトの名無しさん:2014/12/27(土) 10:39:43.28 ID:AKOS2ykD
jsのprototypeのオブジェクト指向を廃止して
classの指向オブジェクト指向を強制
370デフォルトの名無しさん:2014/12/28(日) 09:47:40.91 ID:P1K5BTgM
>>367
それっぽさを演出できるから。
あるいは計算機とエンドユーザーへの責任を度外視して、
プログラマー to プログラマーへの視野狭窄に導けることにうま味が在るから。
371デフォルトの名無しさん:2014/12/28(日) 10:54:40.87 ID:wGcMfnl7
それっぽさ、とバッサリ表現した感性は評価したい
372デフォルトの名無しさん:2014/12/28(日) 10:58:36.54 ID:IcTImvMZ
>>370
bindの対象はパラダイムだったのか…
373デフォルトの名無しさん:2014/12/28(日) 12:11:24.98 ID:eu5U9PUP
そもそもbindってなんだかよく分かってない
C++版クロージャ?
374デフォルトの名無しさん:2014/12/28(日) 12:13:50.50 ID:y0iU2hTK
引数を束縛する関数オブジェクト
375デフォルトの名無しさん:2014/12/28(日) 12:52:34.97 ID:9q//Spjc
どっちかって言うと、C++版カリー化、
例えばこんな事出来たり
http://ideone.com/EjIPbh
376デフォルトの名無しさん:2014/12/28(日) 12:57:02.03 ID:9q//Spjc
スマソ、こっちの方がカリー化の意味として適切だな
http://ideone.com/iDFhJn
377デフォルトの名無しさん:2014/12/28(日) 13:07:35.25 ID:jziI97g3
>>373
クロージャだけど、
多変数関数の変数をその場の環境の変数を取り込んで
変数の数を減らすことに特化した関数です。
378デフォルトの名無しさん:2014/12/28(日) 19:28:47.72 ID:y4TfDgzk
>>374-377
”束縛”の意味がようやくしっくりきたわ
意外と単純なんだなサンクス
379デフォルトの名無しさん:2014/12/29(月) 01:06:38.85 ID:knqa+3O7
std::mem_funとstd::mem_fnってどう違うんですか?
380デフォルトの名無しさん:2014/12/29(月) 01:20:13.23 ID:WSMIpiRw
>>379
mem_fun : 引数無しで呼び出す関数オブジェクトを作成。
使い物にならずC++17で無くなる予定。
mem_fn : 引数ありも対応した関数オブジェクトを作成。
381デフォルトの名無しさん:2014/12/29(月) 01:45:47.32 ID:knqa+3O7
>>380
分かりやすい説明ありがとうございます。
382デフォルトの名無しさん:2014/12/29(月) 17:58:36.07 ID:dD2FvgMN
関数の引数で質問なのですが、
void func(int *x){}    (1)
void func(int x[]){}   (2)
って、厳密に同じなのかどうか知らないのですが、同じように動きますよね。
じゃあ、const を付けて
void func(int const *const x){}
とすると、これに相当する(2)はどう書けば良いのでしょうか?
383KUSO KOTE ◆unko./w.Osri :2014/12/29(月) 18:04:10.43 ID:46K90WCY
>>382
厳密に同じです。
(2)は書けません。
384デフォルトの名無しさん:2014/12/29(月) 18:19:46.49 ID:dD2FvgMN
>>383
レスありがとうございました。
厳密に同じですか。すっきりしました。
385KUSO KOTE ◆unko./w.Osri :2014/12/29(月) 18:33:56.51 ID:noPqS2+S
>>384
失礼、スレを間違えた。
C++では指定できませぬ。Cなら
 void func(int const x[const]);
386デフォルトの名無しさん:2014/12/30(火) 02:30:08.91 ID:8Geo16ji
クラス内の2つの関数がテキストファイルにログを出力するようになってて
プロジェクトによって出力内容が少し変わるような場合ってどうしてる?

そのクラスは機能毎に分けられてる小さなクラスで
将来プロジェクトAとBに使用された場合ログ出力部分だけが
プロジェクトAとBで違う動作になる感じ
387デフォルトの名無しさん:2014/12/30(火) 02:31:29.09 ID:Bg2J28qP
void test(){
//なんやかんや時間のかかる処理
}

マルチスレッド、マルチコア処理で記述していなかったら
testの実行を開始したプロセッサと、実行中のプロセッサと終了時のプロセッサは必ず同じなのですか?
388デフォルトの名無しさん:2014/12/30(火) 02:33:22.01 ID:/MaaffoK
>>387
OS依存です。
389デフォルトの名無しさん:2014/12/30(火) 02:36:06.60 ID:Bg2J28qP
>>388
win7だとどうなんですか?
390デフォルトの名無しさん:2014/12/30(火) 02:44:33.76 ID:/MaaffoK
>>389
同じとは限りません。
タスクマネージャーなどから特定のプロセッサのみで実行するよう変更出来ます。
しかし通常のプログラムはどのプロセッサで実行されているか意識する必要はありません。
391デフォルトの名無しさん:2014/12/30(火) 03:19:40.61 ID:Bg2J28qP
test()を開始したときプロセッサ0で
スケジューラによってプロセッサが奪取されて、プロセッサ0は別プロセスの別スレッドに割り当てられたとして
そのとき、プロセッサ1は暇だとしたら
testの実行はプロセッサ0が空くのを待つのか、プロセッサ1で実行されるのかを知りたいです。
392デフォルトの名無しさん:2014/12/30(火) 03:23:46.74 ID:XvnsidX9
0で実行されるかもしれないし1で実行されるかもしれない
またまた3で実行されるかもしれない
393デフォルトの名無しさん:2014/12/30(火) 03:31:26.97 ID:Bg2J28qP
0が他プロセスで使用されていると仮定しているから0で実行はありえないですよね
0を待つか、他の空きを使用するかと質問しているのですが。
394デフォルトの名無しさん:2014/12/30(火) 03:35:33.12 ID:XvnsidX9
お前のOSでは二つのプロセスしか動いていないのか?
395デフォルトの名無しさん:2014/12/30(火) 03:45:17.75 ID:Bg2J28qP
はい、そうです。
もういいや、あなた方では答えれない内容なんでしたねw
396デフォルトの名無しさん:2014/12/30(火) 03:47:55.25 ID:/MaaffoK
なんだ。釣りか。
397デフォルトの名無しさん:2014/12/30(火) 04:15:51.37 ID:XvnsidX9
タワーディフェンスかな
398デフォルトの名無しさん:2014/12/30(火) 04:26:41.92 ID:iV8mgJ7+
>0が他プロセスで使用されていると仮定しているから0で実行はありえないですよね
んなこたーない。

>0を待つか、他の空きを使用するか
オペレーティングシステムの気分次第。
だが明示的にアフィニティーを指定しない限り
変わったところを見たことがない
399デフォルトの名無しさん:2014/12/30(火) 04:34:31.67 ID:iV8mgJ7+
>>386
その少し違う設定変更をする関数を作るんでは?
log::configure(プロジェクトA);
400デフォルトの名無しさん:2014/12/30(火) 08:22:56.74 ID:Bg2J28qP
>>398
>>0が他プロセスで使用されていると仮定しているから0で実行はありえないですよね
>んなこたーない。
となると、1つのプロセッサが同時に別のコードを実行していることが可能になりますね
他プロセスがそのプロセッサを奪取されない限り、他のコードが実行できるとは思えませんが。
401デフォルトの名無しさん:2014/12/30(火) 09:54:13.10 ID:zkZ/8BgU
>>400
「アフイニティ」というキーワード教えてもらっただろ。
調べてから出直せ。
402デフォルトの名無しさん:2014/12/30(火) 09:54:45.64 ID:zkZ/8BgU
>>400
「アフィニティ」というキーワード教えてもらっただろ。
調べてから出直せ。
403デフォルトの名無しさん:2014/12/30(火) 09:58:11.20 ID:4ECZ2rvD
>>386
> 将来プロジェクトAとBに使用された場合ログ出力部分だけが
> プロジェクトAとBで違う動作になる感じ

出力ルーチンをプロジェクト毎に持ちたいだけなら、派生させて出力ルーチンをオーバーライドすればいいと思う
404デフォルトの名無しさん:2014/12/30(火) 11:41:48.76 ID:zX6Ie/Md
>>400
「プリエンプション」を調べて出直せ。
調べるまでもう来るな。
405デフォルトの名無しさん:2014/12/30(火) 16:27:00.13 ID:f6h/n6k9
> 将来プロジェクトAとBに使用された場合ログ出力部分だけが
これだけならprintf、boost::formatなんかのフォーマット部分、streamならプロダクトごとに違う文字列をマクロにするだけでいいような気がする
406デフォルトの名無しさん:2014/12/30(火) 16:28:25.48 ID:vcq00+gc
マクロ=バカ発見器
407デフォルトの名無しさん:2014/12/30(火) 20:00:38.20 ID:Bg2J28qP
ほんと馬鹿ばっかだな
408デフォルトの名無しさん:2014/12/30(火) 20:23:20.90 ID:r9t5aSE4
↑一番の馬鹿
409デフォルトの名無しさん:2014/12/30(火) 20:29:09.38 ID:/MaaffoK
中二病患者なんてほっとけよ…
410デフォルトの名無しさん:2014/12/30(火) 22:23:47.80 ID:4Rm6u9YB
中二病でもCがしたい
例:「JAVA? フッ俺らCだから。コンピューターの基礎だぜ」
411デフォルトの名無しさん:2014/12/30(火) 23:57:27.06 ID:8Geo16ji
>>399,403,405
ありがとう!
412デフォルトの名無しさん:2014/12/31(水) 11:28:22.65 ID:3wvmlGUB
C++でネット接続を確認する方法はありますか?

オンラインゲーム(三人以上)を作ろうとしているのですが、サーバーマシンが用意できそうにないので
参加者同士でネットワークを形成するデザインにしようと思っています。
しかし、お互いの接続を確認するだけだと、自分がネットから切断された状況とほかの参加者が全員同時に切断された状況の区別がつきません。

Googleなど、インターネットにつながっていればまず繋がるサイトにリクエストを出してみる方法も考えましたが、あまりスマートとは思えません(外部から切断されたLAN接続にも対応できませんし)。

ネットワークトポロジーをフルコネクトでなくスター型にするれば参加者の切断を検知することは容易ですが、ハブが切断した時の対応を考えると無理がありそうです。
(ゲームが中断しないようにほかの参加者をハブに立てようとすると結局全員の接続を確認する必要があるため、フルコネクトと同様の問題が起こる)

かなりワガママな話ですがうまい方法はないでしょうか……。

開発環境はWin8.1、VC++
動作環境は極力広くお願いします
413デフォルトの名無しさん:2014/12/31(水) 12:06:23.87 ID:4sDUohW8
なぜその区別をしたいのか、もう少し掘り下げて考えてみることだな。
414デフォルトの名無しさん:2014/12/31(水) 12:16:17.02 ID:Imw1KDaA
ブラウザ起動してユーザーにネットにつながってるか聞けば分かるよ
415KUSO KOTE ◆unko./w.Osri :2014/12/31(水) 12:28:37.19 ID:Bw72ym5w
>>412
ネトゲーは知りませぬが遠隔地クラスタリングでは
「自分を含めて過半数と通信できるグループ(ノードマジョティー)はただ一つ」
と言う考え方があります。
全員が孤立した場合は全てのノードがノードマジョティーでなくなりますが
これは致し方ない。
416デフォルトの名無しさん:2014/12/31(水) 12:33:06.40 ID:3wvmlGUB
切断されたら最下位としたいので、切断されたほうから見ると最下位、切断した方から見ると一位と矛盾が起きてしまうからです。
切断したら無効試合とすれば矛盾は起きませんが、自分に都合の悪い戦局となった時にLANを切断するチートまがいができてしまいます。
417デフォルトの名無しさん:2014/12/31(水) 12:48:57.94 ID:Imw1KDaA
P2Pじゃ無理だあきらめろ
418デフォルトの名無しさん:2014/12/31(水) 12:50:47.43 ID:y3Bru/20
明らかに設計とやりたいことが噛み合ってない
サーバなしでランキングなんかできん
419デフォルトの名無しさん:2014/12/31(水) 12:51:42.38 ID:3wvmlGUB
>>415
ノードマジョリティーのことですか? 調べてみましたがよくわかりませんでした。。。
もう少し詳しくお願いできますか?

よく考えたらLAN対戦でルーターに障害が起きた場合はどれが切断したとは言えないですね。
LAN対戦とネット経由での対戦で別のモードにしますか。。。

LAN対戦はおそらく知り合いに(少なくとも近場に)対戦相手がいることになるのでペナルティーは勝手にやってもらうとして、
インターネットを経由した遠距離での対戦の場合のみ障害判定をするとします。
つまりインターネットにつながっているかどうかのみわかればよさそうです。
そうすると>>414さんの方法も条件には合いそうですね。あまりスマートとは思えませんが。。

要点がまとまっていなくてすみません。。。
420デフォルトの名無しさん:2014/12/31(水) 12:52:31.77 ID:zCewkils
LAN切断だけじゃなくて相手の接続だけ切った場合はどうなるんだ?
自分はネットに繋がってるから相手が切ったように見せかけられるだろ?
421デフォルトの名無しさん:2014/12/31(水) 12:56:13.49 ID:3wvmlGUB
>>418
全プレイヤーのランキングではなく、小規模な対戦の中での順位づけです。

あとサーバーがないといっても自由にプログラムを動かすことができるようなサーバーがないだけで
レンタルサーバーでCGIを動かすぐらいはできます。まあそうするとなおのことチート対策は万全にする必要がありますが
422デフォルトの名無しさん:2014/12/31(水) 13:12:00.44 ID:3wvmlGUB
うまく伝わってないようなので構想段階ですがやりたいことを晒します。
まとまってないのでわからないところ、無理そうなところがあったらバンバン言ってください。

最終的にやりたいことは、対戦リストやIPアドレスから対戦相手を指定して行う小規模(多くみても20人程度)のオンライン対戦ゲームです。
ポイント制にして対戦の報酬として受け取ったポイントで対戦に参加したりレベルアップしたりします。
構造としてはこのブラウザゲームに似ています→http://kyucon.com/tank/
対戦リストはCGIで書き込まれたネット上のファイルから取得します。
試合を立ち上げた人がゲームからCGIを経由してネット上にIPや人数上限などを書き込み、
その情報から対戦リストを表示して、他のプレイヤーがアクセスします。
対戦が終わると、順位に応じたポイントが手に入ります。
423デフォルトの名無しさん:2014/12/31(水) 13:17:42.65 ID:3wvmlGUB
切断すると順位は最下位扱いとなり、ポイントは最下位相当の分しかもらえません。
ネットを通じては、毎フレームごとに入力情報、数フレームごとに座標情報(近距離にいるプレイヤーほど高頻度で通信)、送信された時だけチャットデータ、同じく発生したときのみ退室連絡(あと必要なら切断情報も)です
424デフォルトの名無しさん:2014/12/31(水) 13:23:39.26 ID:Imw1KDaA
そんな細かいことより先に完成品を作ることが先じゃないか
425デフォルトの名無しさん:2014/12/31(水) 13:34:05.76 ID:3wvmlGUB
>>424そう。。かもしれませんね。
出直してきます。
426 ◆QZaw55cn4c :2014/12/31(水) 13:54:05.81 ID:vgeDgSob
ネット碁でも形勢が動かせないほどはっきりするとブチンとやるやつがいたりするしね
まあ囲碁なら時間が切れて勝つことになるけれども

ゲームルールの方で対処してはいかが?
427デフォルトの名無しさん:2014/12/31(水) 14:19:33.15 ID:oAGy3gWf
サーバーなしで接続判定するのは難しいのでは。対等でなく長くつないだ実績のあるところに判定させるとかは。
428デフォルトの名無しさん:2014/12/31(水) 14:34:28.85 ID:oy55ZnpW
bitcoin式に幾人かの監視者第三者を用意すればいい。
報酬は対局中の発声権(チャットの文字数)とか本筋に作用していいなら消費型の運パラとか
429デフォルトの名無しさん:2014/12/31(水) 14:45:55.07 ID:oAGy3gWf
bitcoin式でも送受信のバグをつかれてマウントゴックスは潰れたが。
上手いこと運営側で対処したら出来たようだが。
当初から知られてたセキュリティ・ホールだったようだが。
430デフォルトの名無しさん:2014/12/31(水) 15:00:49.66 ID:oAGy3gWf
ビットコインの送金に失敗したか成功したかわからなくさせる攻撃だったはずだが名称忘れた。
ビットコイン本体で改善されたか調べようとしたがわからん。
マウントゴックスは、顧客から送信に失敗したので再送して下さいという
シグナルが出ると自動で再送して、何度も送金してたのに放置してたらしい。
431デフォルトの名無しさん:2014/12/31(水) 15:00:55.10 ID:oy55ZnpW
が。
が。
が。
432デフォルトの名無しさん:2014/12/31(水) 15:41:44.30 ID:oAGy3gWf
ビットコイン価格急落:ビットコイン財団が認めたバグの正体とは
http://coinchannel.blog.jp/archives/3363097.html

Bitcoinウォレットを実装する - ビットコインの仕組み
http://bitcoin.peryaudo.org/implement.html


トランザクション展性とは - ビットコインの仕組み
http://bitcoin.peryaudo.org/malleability.html

mt.Goxの攻撃につかわれたTransaction malleability とはどういうものか?
http://nomad-ken.com/2945
433デフォルトの名無しさん:2014/12/31(水) 17:17:57.18 ID:sgzK7Ywh
ぬるぽ
434デフォルトの名無しさん:2014/12/31(水) 17:23:12.74 ID:dkqWrKiB
だがだがだが
435デフォルトの名無しさん:2014/12/31(水) 22:37:12.37 ID:1CgnRKKQ
ポインタへの参照を返却するには?
int*& foo()
{
 static int bar;
 return &bar;
}
ではなぜダメなの?
436デフォルトの名無しさん:2014/12/31(水) 23:04:04.46 ID:oy55ZnpW
アドレスを格納した参照先がないからだよ
437デフォルトの名無しさん:2014/12/31(水) 23:08:37.04 ID:6ZI7gUY1
>>435
そりゃ参照先の変数を確保してないからね。
int *& foo()
{
 static int bar;
 static int * p_int = &bar;
 return p_int;
}
でもやりたかったのは
int *foo() {
 static int bar;
 return &bar;
}
int &foo() {
 static int bar;
 return bar;
}
じゃないのか?
438デフォルトの名無しさん:2014/12/31(水) 23:54:35.55 ID:1CgnRKKQ
>>437
ご丁寧に解説して頂いて、ありがとうございます。
439デフォルトの名無しさん:2015/01/01(木) 09:52:57.50 ID:kIsn05xG
wstring 文字列を
unsigned char配列に変換したいのですが、ググッても良く分りません。
お勧めの変換方法を教えて下さい。
440デフォルトの名無しさん:2015/01/01(木) 10:48:31.69 ID:uA7/S4Xl
>>439
L"あいう"
これをunsigned char[] にしたときに
どのような結果を期待しているのか述べたまへ
441デフォルトの名無しさん:2015/01/01(木) 10:51:32.08 ID:kIsn05xG
>>440
"あいう"
だと全部で6バイトだと思うので、その6バイトの値を
unsigned char[] 配列に入れたいのですが。
442 【小吉】 【1286円】 :2015/01/01(木) 11:48:00.85 ID:g7S+XSL4
リトルエンディアンとかビッグエンディアンとか

メモリ上のバイナリイメージそのままで良ければ、
unsigned char * でキャストするとか
443デフォルトの名無しさん:2015/01/01(木) 12:21:37.37 ID:UpaUaorn
l12バイトじゃないの?
444デフォルトの名無しさん:2015/01/01(木) 12:38:50.15 ID:kIsn05xG
>>442
キャストで行けました。
445デフォルトの名無しさん:2015/01/01(木) 15:38:09.31 ID:3u4q8tXn
終端の \0 も勘定にいれてあげて
446デフォルトの名無しさん:2015/01/01(木) 15:44:01.88 ID:kIsn05xG
>>445
終端の\0は必要ないので"あいう"の例なら、6バイトの配列に入れています。
447デフォルトの名無しさん:2015/01/01(木) 15:48:59.41 ID:kIsn05xG
Visual Studioで
void func1(){
  try{
    func2();
  }catch(...){

  }
}
のようにしておけば、func2でどんな例外が起こっても、必ずcatchできますか?
ちょっと試したらcatch出来ずに異常終了する場合があるのですが、何か設定など必要ですか?
448デフォルトの名無しさん:2015/01/01(木) 16:43:38.31 ID:BK9p898t
>>447
> catch出来ずに異常終了する場合

ヌルポインターアクセスとかは捉えられないよ
捉えたいなら、構造化例外で
449デフォルトの名無しさん:2015/01/01(木) 17:30:54.60 ID:pWC4yf5K
>>447
C++言語の規定の範囲内のことであればcatchできます
未定義動作のコードがあれば何が起きても文句は言えません。
450デフォルトの名無しさん:2015/01/01(木) 17:55:04.53 ID:3u4q8tXn
Visual Studio ならば
構造化例外を C++例外に乗せる コンパイラオプションの設定があったような C++ の項かのう
451デフォルトの名無しさん:2015/01/01(木) 18:24:12.10 ID:kIsn05xG
try catchを
__try {
}
__except(EXCEPTION_EXECUTE_HANDLER) {
}
に変えてみたら
error C2712: オブジェクト アンワインディングが必要な関数内で __try を使用できません。
っていうのが出ます。エラーメッセージの意味が、ググッても良く分らないのですが、何ですかこれは?
452デフォルトの名無しさん:2015/01/01(木) 20:46:05.98 ID:kIsn05xG
構造化例外って、何だかいろんな制約が多くて、使い物にならないですね。
ダメだこんなの。
453デフォルトの名無しさん:2015/01/01(木) 21:22:46.45 ID:yTun5dKq
そんな分かり切ったこと今更言われても…
454デフォルトの名無しさん:2015/01/01(木) 22:35:18.02 ID:cBeecbtC
>447
>異常終了する場合があるのですが、何か設定など必要ですか

異常終了するのはバグが有るからです。
設定の問題じゃなくてバグを直してください。
455デフォルトの名無しさん:2015/01/02(金) 00:38:29.15 ID:HVPQQAO2
stdライブラリで使われている &&ってなんですか?
aaa(Function& f);
なら
Function func;
aaa(func);
でいいんでしょうけど、

aaa(Function&& f);
ってどういう風に呼び出されるのを期待しているのでしょうか?
456デフォルトの名無しさん:2015/01/02(金) 02:36:25.06 ID:hWXODlaZ
右辺値参照という
aaa(Function&& f);
Function bbb();
aaa(bbb());
っていう風に呼び出されるのを期待している
bbb()の戻り値は一時オブジェクトなので通常の参照は取れないが右辺値参照は取れる
ぶっちゃけムーブコンストラクタやムーブ代入演算子を実装するためのもの
457デフォルトの名無しさん:2015/01/02(金) 06:07:06.63 ID:/jUPfUiG
>>456
質問を読めよ
『stdライブラリで使われている &&って』
458デフォルトの名無しさん:2015/01/02(金) 06:19:11.16 ID:7UbCEqjn
>>457
456と別人だけど何を指摘したいのか解らんよ。
456の回答で違和感ない。
もっと具体的に言わないと伝わらないよ。
459デフォルトの名無しさん:2015/01/02(金) 07:01:46.46 ID:KJ45sHVc
>stdライブラリで使われている &&ってなんですか?
 ↓
>通常の参照は取れないが右辺値参照は取れる
>ムーブコンストラクタやムーブ代入演算子を実装するためのもの

通常の参照は取れるし、ムーブコンストラクターを実装するためのものでもない
460デフォルトの名無しさん:2015/01/02(金) 08:35:27.08 ID:7UbCEqjn
>>459
通常の参照(lvalue reference)が取れるのはtemplate<typename Tp>void f(Tp&& v){}
こういう風に定義されてるときだけ(&&が無視されるから)だろ?
std::vectorのpush_backみたいなvoid f(T&& v){}
こういうのだとそっちで取れない

元の質問がC++11で追加されたvoid push_back(T&& value);みたいなのを言ってるなら456で正しい。例の渡し方おかしいし、moveコンストラクタやmove演算子を実装するものじゃなくてそれらを使用するためのものだけど。
あれ?つまり正しくない所の方が多いな。
461456:2015/01/02(金) 11:13:18.68 ID:hWXODlaZ
俺の書いたことが正しくないらしいということはわかったので、誰か代わりに正しい回答を書いてくれると助かる
462デフォルトの名無しさん:2015/01/02(金) 11:26:19.31 ID:7UbCEqjn
>>461
> aaa(Function&& f);
ってあったら呼び方は
aaa(Function());
だろ?
もしくは
Function a;
aaa(std::move(a));
463デフォルトの名無しさん:2015/01/02(金) 12:15:58.38 ID:rZN9ITIb
横からだけど
他の関数の戻り値を、変数に格納せずにダイレクトに他の関数の引数にした場合
ムーブしてくれるものだと勝手に思っていたが・・・
464デフォルトの名無しさん:2015/01/02(金) 12:25:04.99 ID:rZN9ITIb
http://ideone.com/WQcvtX
不足のありそうなテストコードだけど
関数の戻り値を直接でも右辺値参照のオーバーロードが動くみたいよ
こういう話じゃなかったらスマン
465デフォルトの名無しさん:2015/01/02(金) 12:27:37.47 ID:YebgAn5k
ユークリッド最大公約数再帰関数の
int gcd(int a,int b){
if(a%b==0)return b;
else gcd(b,a%b);
}
aとbの大小判定をしなくても
a%bがaになり自動で入れ替わり正常に機能する理由が解らないです。
先頭に大小判定を入れたほうが正しいんでしょうか?
466デフォルトの名無しさん:2015/01/02(金) 12:43:51.36 ID:rZN9ITIb
処理を一つ一つ追ってみるといいよ
もし a < b だった時には、 a%b の値( a を b で割った余り)は a そのものになるから
再帰呼び出し gcd(b, a%b) の部分は実質的に gcd(b, a) になって
2段目に呼び出された gcd() の中では、a(元b) < b(元a) になる。

大小判定を入れても動作に問題は無いけど、せいぜい再帰の段数が1個減るぐらいで
入れても殆ど無意味だと思う・・・
467デフォルトの名無しさん:2015/01/02(金) 12:47:15.45 ID:rZN9ITIb
× 2段目に呼び出された gcd() の中では、a(元b) < b(元a) になる。
○ 2段目に呼び出された gcd() の中では、a(元b) > b(元a) になる。
だった。
468デフォルトの名無しさん:2015/01/02(金) 12:55:26.80 ID:YebgAn5k
ありがとうございます。
a<b時のa%bがaというのは仕様なんですね。
469デフォルトの名無しさん:2015/01/02(金) 13:39:42.63 ID:gt3qlz2l
>>468
仕様というか算数ちゃうか…
a=2 b=3に当てはめてみなさい
470デフォルトの名無しさん:2015/01/02(金) 13:41:19.95 ID:tLxmF+4E
割り算の余りだもの 仕様ではなく定義だな
a < b ならば a は b で割れるはずもなく、全て余りになる という自明の話

(負の数の時の剰余取り扱いについては仕様になるだろうが)
471デフォルトの名無しさん:2015/01/02(金) 15:59:58.69 ID:gjfA+vAB
>>455
aaa ( [](){} );
472デフォルトの名無しさん:2015/01/03(土) 00:28:44.48 ID:MxPJttgJ
>>461
あっているよ

Function func();
はFunction型の値を返す関数の宣言だもの。
473デフォルトの名無しさん:2015/01/03(土) 02:44:39.42 ID:abdcPBX0
>>456は単なる右辺値参照の説明であって、質問の回答としてはあってねーよ。
>>460がヒント出してるだろ。二種類の目的で使われている。
const T &とT &&がオーバーロードされてるような場合は>>456の通りだが
template<typename Tp>void f(Tp&& v);
のように使われている場合は
完全転送(perfect forwarding)を目的としている。
474デフォルトの名無しさん:2015/01/03(土) 03:25:47.66 ID:ekZNF4RP
でとどのつまり
template<typename Tp>void f(Tp&& v);
はどういう風に使うの?
A a;
f(std::move(a));

でいいの?
475デフォルトの名無しさん:2015/01/03(土) 04:14:43.85 ID:Cj8CgFQv
いいよ
476デフォルトの名無しさん:2015/01/03(土) 06:23:21.21 ID:S9XSxOyh
>>474
そいつはどうとでも使える。
標準ライブラリならmoveが許されるrvalueを渡されたらmoveするし、そうでないなら普通のコピーする。
moveして欲しいならあんたが書いてるようにstd::move()したものを渡してやればいい。
477デフォルトの名無しさん:2015/01/03(土) 11:48:55.13 ID:sytQLtmt
俺もいまいち整理できてないけど
関数テンプレートで && の場合は、非const参照のオーバーロードが考えられる
理由は、右辺値も左辺値も受け取れるようにしたいからと。

こういうのさあ…、初心者に分かりやすい一覧ないの。ちゃんと理由が書いてある
478デフォルトの名無しさん:2015/01/03(土) 12:00:17.75 ID:y2ZzUwkx
そんなの見りゃわかるだろ
479デフォルトの名無しさん:2015/01/03(土) 12:05:14.44 ID:1H0KnqhC
templateメソッドの&&引数って値コピーでもrvalueでも使えるって風に特殊化されてなかったっけ
480デフォルトの名無しさん:2015/01/03(土) 12:53:25.47 ID:1H0KnqhC
スマソ、それが>>477だわ、
template展開後のコードを見れたら良いんだがなあ
481デフォルトの名無しさん:2015/01/03(土) 13:20:27.45 ID:zznC6x/d
if文で
if( 2 <= x < 5 ) みたいな書き方出来ませんか?
482デフォルトの名無しさん:2015/01/03(土) 13:20:39.67 ID:Cj8CgFQv
できません
483デフォルトの名無しさん:2015/01/03(土) 13:22:59.20 ID:XgnEofgF
>>481
if( 2 <= x && x < 5 )
で我慢しろよ
484デフォルトの名無しさん:2015/01/03(土) 13:48:03.41 ID:zznC6x/d
>>483
c++の高度な機能を駆使して
どうにか出来ませんか?
485片山博文MZ ◆T6xkBnTXz7B0 :2015/01/03(土) 13:51:09.74 ID:XgnEofgF
>>484
構文解析に影響するので、コンパイラーが替わらない限り不可能だ。
486デフォルトの名無しさん:2015/01/03(土) 13:56:12.26 ID:Cj8CgFQv
できません
487デフォルトの名無しさん:2015/01/03(土) 14:28:14.45 ID:zznC6x/d
ちょっと考えてみたのですが、
#define IF(xmin, a1, x, a2 , xmax) if(((xmin) a1 (x)) && ((x) a2 (xmax)))
とすると
IF(2, <= , x, <, 5)
みたいに行けたのですが、問題ありますか?
488デフォルトの名無しさん:2015/01/03(土) 14:33:41.24 ID:fEHuClGw
頭に問題があります
489デフォルトの名無しさん:2015/01/03(土) 15:06:03.45 ID:rT9ShsFT
普通にbetween関数でも作ればいい
490デフォルトの名無しさん:2015/01/03(土) 16:43:25.63 ID:8BccSE7H
>>477
よし教えてやろう。
1.「完全転送」をしたい時はtemplate<T> auto f(T&&);の形だ。
 たいていは可変個引数になる。
2.それ以外は普通に&と&&を使い分ける。

完全転送はテンプレートの展開後のコードが無かったかのように
直接渡したい場合だ。例えば
vector<A> v; v.emplace_back(…★…); は
追加するメモリ位置に配置newで
new (追加位置) A{…★…};
とするのが目的で、本当はAのコンストラクターに値を渡すために
emplace_backの関数呼び出しすらしたくない。だからT&&で完全転送させる。
491デフォルトの名無しさん:2015/01/03(土) 19:32:38.25 ID:y1GBLXop
template<template<typename U> class comp1_t, template<typename V> class comp2_t>
bool between(T lower, T const &v, T upper);

between<std::less_equal, std::less>(2, x, 5);
492デフォルトの名無しさん:2015/01/03(土) 23:50:28.29 ID:fdcOcyfu
double f() {
 static double d = 100.0;
 return d;
}
このfはマルチスレッドで呼んでも安全ですか?
493片山博文MZ ◆T6xkBnTXz7B0 :2015/01/03(土) 23:53:33.16 ID:XgnEofgF
>>492
constを付けろ
494デフォルトの名無しさん:2015/01/03(土) 23:57:32.86 ID:htJS8xrt
>>492
C++11 以降なら問題ない。 6.7 [stmt.dcl] p4
495デフォルトの名無しさん:2015/01/04(日) 09:45:37.44 ID:EjbbMTMU
>>494
C++11 以前だとなんか問題あったっけ?
496デフォルトの名無しさん:2015/01/04(日) 09:55:29.27 ID:k0mCYKYO
スレッド1が書き込んでる途中に
スレッド2が初期化完了と思って初期化途中の値を返すと困る
あと二重初期化も
497デフォルトの名無しさん:2015/01/04(日) 10:02:17.88 ID:SXr0Npw7
doubleの定数の代入でそういう問題出る?
498デフォルトの名無しさん:2015/01/04(日) 10:20:33.94 ID:+b+eo/V4
ブロック内static変数の初期化保護がC+11に入ってたはずつまり=>>492
doubleは古いCPUで32bit転送すると問題起きそう
あと並列処理で変更する可能性あるならvolatile
変更するつもりないなら関数も一緒にconstexpr
499デフォルトの名無しさん:2015/01/04(日) 10:35:12.11 ID:EjbbMTMU
>>496
static 変数って関数に入る度に代入しないでしょ?
500デフォルトの名無しさん:2015/01/04(日) 10:41:02.17 ID:nrY/dO4R
しないがマルチスレッドだとまた事情が違う
501デフォルトの名無しさん:2015/01/04(日) 11:07:06.00 ID:EjbbMTMU
>>500
どう言うこと?
d への代入/参照以外に競合しそうにないんだけど...
502デフォルトの名無しさん:2015/01/04(日) 11:09:39.19 ID:nrY/dO4R
そもそもどうやってstatic変数が初期化されていると判断していると思う?
503デフォルトの名無しさん:2015/01/04(日) 11:10:58.64 ID:lrHbTIEs
doubleはアトミックな代入ができないから、
マルチスレッド対応の排他処理が必要ということか
504デフォルトの名無しさん:2015/01/04(日) 11:17:32.01 ID:EjbbMTMU
>>502
どうやってるの?
505デフォルトの名無しさん:2015/01/04(日) 11:21:19.14 ID:nrY/dO4R
判断用の別のstatic変数を使っている
506デフォルトの名無しさん:2015/01/04(日) 12:14:18.84 ID:SXr0Npw7
javaでdoubleの代入がアトミックじゃないというのは有名な話だけど、C++でも同様に
アトミックであることが保証されていないとして、同じ定数の代入で問題出る?
この場合、二重初期化にはなるかもしれないけど結果は変わらないように思うんだが。
507デフォルトの名無しさん:2015/01/04(日) 12:25:03.10 ID:EjbbMTMU
>>505
もう少し面白いレスを期待したんだが w
508デフォルトの名無しさん:2015/01/04(日) 12:45:59.61 ID:oiumm62h
>>507
つい最近、関数内static変数の初期化タイミングについて調べたんだが
VS2013はこうだったよ
静的変数領域に初期化済みフラグ変数が作られてて
それが0だったら初期化とatexitにデストラクタを登録して、フラグを1にしてた
509デフォルトの名無しさん:2015/01/04(日) 12:48:22.18 ID:XPPzqmKU
規格で保証されているのは初期化完了まで他のスレッドが待つことのみ。
あるスレッドが書いた結果を別のスレッドが読めることは保証されていない。
例えばスレッド1が書いた結果がCPU1のキャッシュに書かれ、
スレッド2がCPU2のキャッシュから違う値を読み出す可能性もある。
510デフォルトの名無しさん:2015/01/04(日) 13:13:36.30 ID:dRV17Ydg
int型のstatic変数の値取得・値設定を複数スレッドから行う場合、
std::atomicかvolatileのどちらを使えばいい?
511デフォルトの名無しさん:2015/01/04(日) 13:26:06.42 ID:+b+eo/V4
Winならvolatile longにしてInterlock~系の組み込み関数使う
512デフォルトの名無しさん:2015/01/04(日) 13:36:28.08 ID:x5miDuez
それはどちらが良いかの回答でなく
「俺のスタンダードはこうだぜ」
でしかないのだが
513デフォルトの名無しさん:2015/01/04(日) 13:39:19.81 ID:x5miDuez
Unixならfopenなんて使わずにopenだぜ!的な
514デフォルトの名無しさん:2015/01/04(日) 16:15:22.67 ID:VX3mvVTy
>>509
でも初期化完了してから代入が無いうちに読めば初期値が読み出せることは
保証されてる (C++11 1.10 [intro.multithread] p3) から、問題ないよね?
515デフォルトの名無しさん:2015/01/04(日) 16:18:45.84 ID:VX3mvVTy
>>510
一般的には atomic を使わないと複数スレッドから同じ変数の値取得・値設定を行った場合の
結果は保証されない。

厳密には未定義動作の範囲になるけど int なら volatile でなんとなく動いちゃう環境も多そうで、
「いい」の基準にもよってはそっちかもしれない。
516デフォルトの名無しさん:2015/01/04(日) 16:34:48.86 ID:XPPzqmKU
>>514
むむ、確かにそうなるようように読めるな。
517デフォルトの名無しさん:2015/01/04(日) 16:53:44.13 ID:VX3mvVTy
>>509
この「待つ」の意味が曖昧だという issue はあった。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1784

でも >514 の規定もあるんで、これが問題になるのはコンストラクタのあるクラス型の
初期化(に伴う代入)に限られるかな。
518デフォルトの名無しさん:2015/01/04(日) 20:55:28.17 ID:xMUR5ASN
Foo test()
{
 return Foo();
}

int main( int argc, char *argv[] )
{
 Foo foo = test();

 return 0;
}

上記コードでfooはコピーコンストラクタで初期化されるのですか?
operator= ですか?

どちらも呼ばれていないようなんです。
519デフォルトの名無しさん:2015/01/04(日) 20:57:08.99 ID:AMdUkF9B
そういう釣りは要りません
520デフォルトの名無しさん:2015/01/04(日) 20:57:29.24 ID:nrY/dO4R
RVOでコピーコンストラクタが呼ばれてないだけ
521デフォルトの名無しさん:2015/01/04(日) 21:21:20.32 ID:j/60c7YT
>>519
釣りだと思うなら、書き込まなければよくね?
そうじゃないかもしれないじゃん
522デフォルトの名無しさん:2015/01/04(日) 21:32:17.55 ID:oRJJvZ0W
>>518
・operator=ではありません
・Fooにムーブコンストラクターが有る場合はムーブコンストラクターで初期化されます
・Fooにムーブコンストラクターが無い場合はコピーコンストラクタで初期化されます
・でもコンパイラーの気分次第でどちらも呼ばれないことがあります
523デフォルトの名無しさん:2015/01/04(日) 23:54:27.39 ID:UYKSJFA2
>>518
test関数内の『Foo()』よって
呼び出し元のfooの構築予定位置に直接構築されることがあります。
{
 Foo foo=test();
 …
}
Foo test() {
 return Foo(…);
}
 ↓ コンパイラーによる実装
{
 char foo_buf[sizeof(Foo)];//メモリだけ確保
 Foo &foo = *(Foo *)foo_buf;
 test(&foo);//testの内で構築
 …
 foo.~Foo();
}
void test(Foo *p_ret) {
 new(p_ret) Foo(…);//p_retの位置に構築
}
524デフォルトの名無しさん:2015/01/05(月) 00:42:51.59 ID:Z4kH2usD
おー凄いですね、
ありがとうございます。

そんなコードがさっと書けるなんて私のレベルからみたらハッカーレベル
525デフォルトの名無しさん:2015/01/05(月) 01:03:12.80 ID:HQBfrJ95
今更だけどc++の文法はクソだな
X &x = ...; と &x の「&」が
こうも違う意味で使用されるとは
526デフォルトの名無しさん:2015/01/05(月) 02:56:27.42 ID:J4h7NkXr
>>525
元々ポインタの宣言とアドレスからのデリファレンスに同じ*を使ってたのがC言語だし、今更かと
527デフォルトの名無しさん:2015/01/05(月) 03:00:45.27 ID:joXgI9aC
文法は慣れちゃったけど、コンパイル時間短縮の作業が冗長かつめんどい、
fwdヘッダ用意したり、前方宣言にしたり、pImplイディオム使ったり
528デフォルトの名無しさん:2015/01/05(月) 07:20:55.38 ID:aOzM7H2S
ポインタなら******と何個書いても
意味ありますが、&は二個までしか
使わないんですか?
&&&みたいなのが使われる事は
有りますか?
529デフォルトの名無しさん:2015/01/05(月) 08:41:06.96 ID:yIG755cC
型としての&とオペレータとしての&があってだな
530デフォルトの名無しさん:2015/01/05(月) 11:38:38.41 ID:6dicJpBg
ポインタ型の*とポインタ参照の*は対になるからいいんだよ
参照型の&とアドレス取得の&は何の関係もない
531デフォルトの名無しさん:2015/01/05(月) 11:46:40.87 ID:8wARtoFz
^よりマシ
532デフォルトの名無しさん:2015/01/05(月) 12:32:35.04 ID:dcVDuqIP
>>530
ポインタでなくアドレスの参照なんだけどな
533デフォルトの名無しさん:2015/01/05(月) 17:45:14.95 ID:c8QM0CpZ
いやポインターだな
型情報の無いものをデリファレンスすることは不可能
534デフォルトの名無しさん:2015/01/05(月) 18:07:38.46 ID:bnx5ljY/
*はポインタと関係ない掛け算に使われてるけどそれはいいの?
535デフォルトの名無しさん:2015/01/05(月) 19:15:34.71 ID:o8IVACxb
operatorには右結合と左結合があってだな
536デフォルトの名無しさん:2015/01/05(月) 19:45:37.08 ID:eW15SvL+
なんで演算子に # 使われなかったんだろう…
537デフォルトの名無しさん:2015/01/05(月) 20:37:22.50 ID:dcVDuqIP
>>536
プリプロセッサの実装がかなりカオスになるかと…
現行仕様なら文字リテラルや文字列リテラルだけチェックすりゃいいと思う

てか#が演算子だと #define はプリプロセッサ指令なのか?
それとも「#演算子」+「識別子define」なのか?
538デフォルトの名無しさん:2015/01/05(月) 20:43:02.08 ID:eW15SvL+
あー!!! プリプロセッサに使われてたね(;^ω^)
539デフォルトの名無しさん:2015/01/05(月) 21:04:03.86 ID:k+i5FUHX
プリプリの#は行頭縛りが有るんだから
単独はともかく複合は何とかなるだろ
それより$はどこいったんだ?
540デフォルトの名無しさん:2015/01/05(月) 21:13:17.40 ID:OqXHqOuF
>>534
&もC言語の頃から論理演算やビット演算に使われてるしなー
541デフォルトの名無しさん:2015/01/05(月) 21:30:30.66 ID:JFeb/Dkj
カンマ演算子はいらない子
542デフォルトの名無しさん:2015/01/05(月) 21:32:01.97 ID:8OfiKVjh
>>541
for (;; i++, j++)
これはちょっと捨てがたい
543デフォルトの名無しさん:2015/01/05(月) 23:13:20.12 ID:6ZakQqWP
>>541
http://peace.2ch.net/test/read.cgi/tech/1313183984/594
カンマ演算子がないと、三項演算子をフルに活用できない
544デフォルトの名無しさん:2015/01/05(月) 23:13:47.04 ID:F38A7Xb0
>>541
func(value1, value2, ...)
どうすんの区切り
545デフォルトの名無しさん:2015/01/05(月) 23:33:30.48 ID:FJgPpSw6
546デフォルトの名無しさん:2015/01/06(火) 00:40:13.69 ID:rU9M9NSl
三項演算が必要ない言語仕様を求める
カンマ演算子はどーでもいい
547デフォルトの名無しさん:2015/01/06(火) 00:42:28.84 ID:VMQ4U3C+
Lispも知らないアホウが三項演算子とか。自虐ギャグか?
548デフォルトの名無しさん:2015/01/06(火) 05:33:38.06 ID:3D6Su9d8
>>544
それはカンマ演算子じゃない

>>547
三項演算子は Lisp 由来とはいいにくい、とはC/C++関連スレではよく言われるところ
549デフォルトの名無しさん:2015/01/06(火) 09:51:10.70 ID:2O/Tv4gz
stringのsizeとlengthは同じだと思うのですが、
適当に両方を使うので、ソースの中にsizeやlengthが混じっています。
上級者の人は、どちらか一方しか使わないと決めていますか?
550デフォルトの名無しさん:2015/01/06(火) 10:20:23.02 ID:1VvNcLrk
>>549
size_t size() const noexcept;

Return length of string
Returns the length of the string, in terms of bytes.
This is the number of actual bytes that conform the contents of the string,
which is not necessarily equal to its storage capacity.
Note that string objects handle bytes without knowledge of the encoding that may eventually be used to encode the characters it contains.
Therefore, the value returned may not correspond to the actual number of encoded characters in sequences of multi-byte or variable-length characters (such as UTF-8).
Both string::size and string::length are synonyms and return the same value.
551デフォルトの名無しさん:2015/01/06(火) 11:07:07.91 ID:VMQ4U3C+
>>548
Short-circuit evaluationがMcCarthy evaluationという別名を持ってる事を知らないアホウ。
552デフォルトの名無しさん:2015/01/06(火) 12:00:09.24 ID:hvbSszuS
>>550
お前の脳内定義を長々と書かれても…
553デフォルトの名無しさん:2015/01/06(火) 14:00:54.62 ID:MIXF2/W4
enable_shared_from_thisについて教えてください
機能させる条件として「shared_ptrで管理されている状態でなければならない」みたいな説明をされていたのですが
使い方としては(Tはenable_shared_from_thisをpublic継承しているものとして)

 T* ptr = new T(...);
 shared_ptr<T> sp{ ptr };
 // またはmake_shared使って直接shared_ptr<T>で作るとか
 ptr->shared_from_thisを使う操作();

はOKで

 T* ptr = new T(...);
 ptr->shared_from_thisを使う操作();
 shared_ptr<T> sp{ ptr };

ではダメ、という認識で合っていますか?
554デフォルトの名無しさん:2015/01/06(火) 14:37:50.31 ID:IOY8OATq
その認識でおk
ちなみに用途としては、メンバメソッド内部で自身のshared_ptr要求してる時に型解決するって単純なのから、
非同期処理時にshared_ptrを取得して、処理終了までインスタンスが残るのを保証したりとか
if (auto p = t->shared_from_this()) {
&nbsp;&nbsp;p->asyncHoge();
}
555デフォルトの名無しさん:2015/01/06(火) 16:22:19.21 ID:MIXF2/W4
回答ありがとうございます
不安点が解消されたので、ようやく手を出せそうです・・・
556デフォルトの名無しさん:2015/01/06(火) 21:02:36.00 ID:3D6Su9d8
>>551
その短絡評価が、三項演算子やコンマ演算子とどう関係するのか?

>>547
>Lispも知らないアホウが三項演算子とか
え?三項演算子と Lisp になんか関係があるのか?

http://peace.2ch.net/test/read.cgi/tech/1408017352/46
>カンマ演算子や3項演算子もAlgol 68が元祖でそれから受け継いだもの。

http://peace.2ch.net/test/read.cgi/tech/1408017352/49
>McCarthyはAlgol 68には全くタッチしていない。
>そもそもAlgol 60の設計をやった連中はWijngaardenのチームが出してきたAlgol 68の提案を見て
>ほぼ例外なくあきれ返って愛想をつかしたのだから。

信者はこれだから‥
http://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3AScheme%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E3%83%AC%E3%83%99%E3%83%AB10
>カッコだらけですごくわかりにくい言語があることは知っているが、 最強とか主張する信者がいるらしいのでなるべく関わらないようにしている。
557デフォルトの名無しさん:2015/01/06(火) 21:40:01.21 ID:VQBi/vCZ
Lispとか言ってるのはキチガイなので触れないでください
558デフォルトの名無しさん:2015/01/07(水) 07:16:08.23 ID:whm40mKL
C/C++を使ってデスクトップ上で使えるアプリを作りたい。
猫でもわかるWindowsプログラミング以外にいい書籍ないですかね?
559デフォルトの名無しさん:2015/01/07(水) 08:07:54.41 ID:F9tFXwtq
>>556
>その短絡評価が、三項演算子やコンマ演算子とどう関係するのか?

>>Lispも知らないアホウが三項演算子とか
>え?三項演算子と Lisp になんか関係があるのか?


lispをしらないアホウがドヤ顔でかいた「三項演算子をフルに活用する」から抜粋。

>>543
>http://peace.2ch.net/test/read.cgi/tech/1313183984/594
>カンマ演算子がないと、三項演算子をフルに活用できない
(k == M - 1) ? putchar('\n') : 0,g(s, r, r),

Short-circuit evaluationなしで、意図した通りに動くとでも?
560デフォルトの名無しさん:2015/01/07(水) 08:38:54.85 ID:yOI2m8ms
>>559
その引用したコードのどこに短絡評価が使われているのか?

だいたい切り出し箇所を間違えている、コンマ演算子は優先順位は最低だ
0, に引き続いて g(n, s, r, r) が常に実行されるわけじゃない

(s[r] == 0) ? ( printf("%-3d ", r),
(k == M - 1) ? putchar('\n') : 0,
g(n, s, r, r),
h(n, s, r + 1, (k == M - 1) ? 0 : k + 1) )


そのコードはちゃんと動くからしっかり読め馬鹿?
http://ideone.com/PF7IFU
561デフォルトの名無しさん:2015/01/07(水) 11:12:37.12 ID:R14m8Fcb
相談
#define VERSION_XXX
...
#ifdef VERSION_XXX
...
#endif
みたいな方法でコード区切って、VERSION_XXXがdefineされててもされてなくても
コンパイルされるコードを書いているのですが
間違って
#ifdef VRESION_XXX // RとEが逆!
みたいな区切りをしてしまってもコンパイルが通ってしまいます
なんらか誤字を検知するいい方法ってありませんか?
562デフォルトの名無しさん:2015/01/07(水) 11:13:34.05 ID:J9Js0gVS
手打ちじゃなくてコピペするようにする
563デフォルトの名無しさん:2015/01/07(水) 11:18:37.62 ID:R14m8Fcb
基本すね
インテリセンスが聞くとコピペより楽だから手打ちがクセになっちゃってますけど
心がけて参ります
564デフォルトの名無しさん:2015/01/07(水) 11:59:36.15 ID:R65SynMt
ヘッダなら#pragma onceとか
565デフォルトの名無しさん:2015/01/07(水) 12:51:46.31 ID:qRf9hh7I
専用のテストツール作るとか
そうでなければコンパイル後の実行テストで発見するしかないかな
そこだけ丸々抜けてるんだから実行時には必ず見つけられないと可笑しい
566デフォルトの名無しさん:2015/01/07(水) 20:46:20.47 ID:ArlGb+1Q
#ifdef VRESION_XXX
//
#else
#error "VERSION_XXX is Not defined."
#endif
とでもしとけばいいんでないの?
567デフォルトの名無しさん:2015/01/07(水) 21:42:15.24 ID:MxHTewdX
#if VER==1
#elif VER==2
#else
# error
#endif
568デフォルトの名無しさん:2015/01/07(水) 21:46:13.11 ID:DXg8c96r
定義を必須にするならそもそも論で定義自体が要らなくなっちゃうな
569デフォルトの名無しさん:2015/01/07(水) 22:29:52.94 ID:nd/axr2U
>>566
なんのために #ifdef 使ってるんだよ w
570デフォルトの名無しさん:2015/01/07(水) 22:47:59.80 ID:F9tFXwtq
>>560
http://peace.2ch.net/test/read.cgi/tech/1408017352/46
>カンマ演算子や3項演算子もAlgol 68が元祖でそれから受け継いだもの。
こんな与太話をうのみにしてドヤ顔で貼りつけるアホウには理解できないだろうが、
特別に教えてやる。

> その引用したコードのどこに短絡評価が使われているのか?
short-circuit evaluationはlazy evaluationの特殊形。
Cのconditional operatorもshort-circuit evaluationに分類される。
571デフォルトの名無しさん:2015/01/07(水) 23:47:54.51 ID:BnVzqaG6
「特別に教えてやる」ワロタ
その話はもう終わりましたよ
572デフォルトの名無しさん:2015/01/08(木) 02:04:51.23 ID:dZQr24t7
>>570
独自研究?
要出展。
573デフォルトの名無しさん:2015/01/08(木) 02:59:34.28 ID:dQf1lgek
>Cのconditional operatorもshort-circuit evaluationに分類される。
and や or がないのに短絡評価とはこれいかに?

お前の好きな McCarthy evaluation に言及している http://en.wikipedia.org/wiki/Short-circuit_evaluation では、
>when the first argument of the AND function evaluates to false, (以下略)
>when the first argument of the OR function evaluates to true,(以下略)
conditinal operator (三項演算子)の話は(全然ないわけではないが)関係ないね。
分類?興味はないから勝手に分類すればぁ?

#専用ブラウザを締め出しにかかったのか?
574デフォルトの名無しさん:2015/01/08(木) 09:31:28.52 ID:97n2OZ0x
>>572
どっちの話だ? 前者ならBCPLで検索してみな。
後者ならhttp://en.wikibooks.org/wiki/Introduction_to_Programming_Languages/Evaluation_Strategiesあたり
Cのlogical operatorもconditional operatorもLazy Evaluation/Call by Needに分類される。(とは明記されてはいないが、本質的に同じもの)
575デフォルトの名無しさん:2015/01/08(木) 09:46:23.05 ID:6nWj+k4o
Cの経験はあるのですが、C++初心者なのですが、
static_cast
const_cast
reinterpret_cast
などの使い方が良く分らないので、キャストする時は (char *) みたいにCのやり方でキャストをしまくっている
のですが、何か問題ありますか?VisualStudio2013 C++です
576デフォルトの名無しさん:2015/01/08(木) 09:47:40.46 ID:97n2OZ0x
>>573
予想通りアホウには理解できなかったか。
お前の「三項演算子をフルに活用した」コードはうんこ。グロ。
肥溜から汲み出して陳列するな。

中学生でも「FPの真似事してみました」くらいの事はできるぞ。
577デフォルトの名無しさん:2015/01/08(木) 09:50:43.80 ID:Kii/PXQd
それぞれの意味を理解することあきらめたのならそんでいいんじゃない
としか言いようがない
578デフォルトの名無しさん:2015/01/08(木) 10:09:22.36 ID:dZQr24t7
>>574
本質的に同じものと明記しているURLが欲しい。
579デフォルトの名無しさん:2015/01/08(木) 19:04:10.00 ID:AQCXdgrR
>>575
クロスキャストが正しい結果にならなかったような
ついでにそれだとdynamic_castのチェック機構が働かない
580デフォルトの名無しさん:2015/01/08(木) 20:31:44.57 ID:dQf1lgek
>>576
オペレータ op による
(op A, B, ....)
の多項演算において、A を評価した結果によっては B 以降を評価しない、というのはよくわかる、しかし

if A then B else C
で当たり前のことだが

B が評価されるときは C は評価されない
C が評価されるときは B は評価されない

それをもってして、
「"if A then B else C" は lazy だ、short-circuit だ」と主張しているようにしかみえないが、そんな当たり前なことを主張したところで誰得?
それとも分類したつもりで納得したつもりな、頭が幸せな人なの?

>お前の「三項演算子をフルに活用した」コードはうんこ。グロ。
光栄だね、>>543 は狙って書いたからね、お気に召されたようでなによりだ
581デフォルトの名無しさん:2015/01/08(木) 22:24:36.91 ID:xIJvBvn3
>>580
お前、スレを荒らすときはちゃんとクソコテ付けろよ
NGしにくいだろ
582デフォルトの名無しさん:2015/01/08(木) 22:58:17.62 ID:97n2OZ0x
>>587
Lazyな言語で検索すれば沢山あるだろ。例えば
https://books.google.co.jp/books?id=nh0okI1a1sQC&pg=PA34
583デフォルトの名無しさん:2015/01/08(木) 23:41:30.06 ID:97n2OZ0x
>>578
Lazyな言語で検索すれば沢山あるだろ。例えば
https://books.google.co.jp/books?id=nh0okI1a1sQC&pg=PA34
584デフォルトの名無しさん:2015/01/09(金) 01:31:08.80 ID:S/l7jDeL
ち、負けたよ‥Cの三項演算子
if C then A else B / C : A ? B
に生来の自然な lazy 性があるというのだろう、その主張は認めよう
585デフォルトの名無しさん:2015/01/09(金) 09:32:23.87 ID:UAUytMwx
やっぱり理解していないアホウ。そんな事はお前以外は全員知っていた。
conditional operatorをshort-circuit evaluationと呼んで良いかが争点だった。

二度と肥溜から汚物を汲み出して陳列するな。
586デフォルトの名無しさん:2015/01/09(金) 12:33:23.34 ID:S/l7jDeL
そうか、>>574 と微妙に変化しているが、short-circuit のほうかね
私は汚物どころか、ふつくしくまとめたものだと考えているが‥あこがれの R
587デフォルトの名無しさん:2015/01/09(金) 12:34:12.80 ID:S/l7jDeL
RWH まで動員されたら、ちと遠慮するしかないな‥
588デフォルトの名無しさん:2015/01/10(土) 05:34:25.93 ID:Ogdmrgtc
関係ないけど3項演算子の?を条件文にくっつけて書くのが好き。Ruby のみたくなる
589デフォルトの名無しさん:2015/01/10(土) 10:34:36.82 ID:e5lVGhD9
>>587
ちょっと考えれば
c ? a : b == (c && a) || (!c && b)
である事は明白だけど、こういっても難癖つけるだろ。
590デフォルトの名無しさん:2015/01/10(土) 11:59:14.45 ID:gEQY0px8
そういえばお前らはちゃんとeffective modern c++買ったのか?
591デフォルトの名無しさん:2015/01/11(日) 05:24:44.01 ID:6BuzDaMr
6000円で日本語訳無しか
ちと考えるな
英語でもいいけど見出し付きPDFにしてくれないと読む気がしない
592デフォルトの名無しさん:2015/01/11(日) 05:57:19.03 ID:/K47z1BX
>>584
間違ってね?
593デフォルトの名無しさん:2015/01/11(日) 06:01:20.29 ID:6BuzDaMr
これ以上キチガイクソコテに触れないで下さい
コイツはQですよ?
594デフォルトの名無しさん:2015/01/11(日) 10:59:57.97 ID:aK2tqeoS
>>589
残念だがその等式は C に関しては成立しない
残念な点は2つ
1. 左辺は a, b のいずれかの値を返す、右辺は 0, 1 のどちらか
2. 左辺のCの評価は1回、右辺は場合によってはCが二回評価されることがある、Cが副作用をもっているとき、これは重大な相違|
595デフォルトの名無しさん:2015/01/11(日) 11:37:10.14 ID:gcpaqSvI
アホウには理解不能だろうけど、そういう事じゃないから。
596デフォルトの名無しさん:2015/01/11(日) 12:03:32.28 ID:3ahz/Tk9
具体的な反論できないけど、悔しくてアホ呼ばわりするしかないのはわかった
597デフォルトの名無しさん:2015/01/11(日) 13:36:50.98 ID:09KNadFP
rubyとJavaScript は少し経験あり、
C++を勉強中です

ruby では pp
JavaScript では JSON.stringify で
変数の情報を参照していました

C++でおなじように変数の子要素もまとめて出力するような機能はありますか
598デフォルトの名無しさん:2015/01/11(日) 13:39:05.86 ID:qXCt624L
いいえ
599デフォルトの名無しさん:2015/01/11(日) 13:39:34.12 ID:GCkLh1u2
>>597
言語仕様にはありません
適当なライブラリを探してください
600デフォルトの名無しさん:2015/01/11(日) 15:40:03.53 ID:gcpaqSvI
アホ呼ばわりではない、アホウだと言っている。
601デフォルトの名無しさん:2015/01/11(日) 15:43:45.43 ID:2uQnlC2S
アホウにはアホウと言ってもいいと思っている
モヒカン的な思想ですね
もう少し社会に適応した方がいいですよ
602デフォルトの名無しさん:2015/01/11(日) 16:08:35.26 ID:wfXxgM2H
既存のバイナリファイルに対し、指定した2バイトのみ書き換えたいのです。
しかし、下のようなソースではファイルが新規作成されてしまいます。
いくつもまずいところあるかもしれませんが、どこをどのように直せばよいか、あるいはどこのサイトをみればよいか教えてくださいませ。
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ofstream fout ;
char outfile[] = "workfile.bin";
int i1;
fout.open(outfile,ios::out|ios::binary|ios::ate ) ;
if (!fout){
cout << "workfile.binが開けないですいません";
}
short s1 ; //書き替え用2Byte
cout << "何番目(2byte単位)を書き替えますか"<<endl;
cin >> i1;
cout << "いくつに書き換えますか"<<endl;
cin >> s1;
fout.seekp ( (i1-1)*sizeof ( short ) );
fout.write( ( char * ) &amp;s1, sizeof( short ) );
fout.close();
return 0;
}
603デフォルトの名無しさん:2015/01/11(日) 18:54:32.65 ID:lYBxwBIS
>>602
そうだな
まずiostreamという糞ライブラリを使うのを止めることをオススメする
604デフォルトの名無しさん:2015/01/11(日) 18:54:33.69 ID:FnSQDCUV
そのファイル(workfile.bin)は、はじめから存在しているファイルなのか?
605デフォルトの名無しさん:2015/01/11(日) 18:57:04.53 ID:3ahz/Tk9
>>600
で、具体的なことはなにも書けないと w
606602:2015/01/11(日) 19:17:36.28 ID:4/5dMjSN
>604
はい、別途作成済のファイルです。

>603
iostreamは糞なんですか。もっといいのがあれば教えてくださいませ。
607デフォルトの名無しさん:2015/01/11(日) 19:35:50.86 ID:/SWGABMQ
フラグの意味ぐらい調べてから使えよ
608デフォルトの名無しさん:2015/01/11(日) 19:39:44.19 ID:wJL8ZTbg
俺のフラグが立つのはいつですか
609デフォルトの名無しさん:2015/01/11(日) 19:51:26.95 ID:FnSQDCUV
>>606
コードよく見てなかったが>>607の通りだな。ios::outは既存のファイルがある場合は
それを削除して開くことになる。代わりのフラグを設定しる(ios::appか?)
610602:2015/01/11(日) 21:24:36.19 ID:4/5dMjSN
ありがとうございます。これで指定した位置の書き換えができるようになりました。
fout.open(outfile,ios::in|ios::out|ios::binary ) ;
611デフォルトの名無しさん:2015/01/14(水) 16:53:09.61 ID:qg2WOmMy
class Callback
{
virtual void onNannka(Manager *pMngr) = 0;
}
みたいなコールバックの中でのみpMngrにアクセスを許したいんですがどうすればいいんですか?
612デフォルトの名無しさん:2015/01/14(水) 17:11:20.90 ID:bm2MApp4
friend
613デフォルトの名無しさん:2015/01/15(木) 20:42:13.86 ID:lMW8kkLc
for(int i=0;i<10;i++){
}
みたいなループ変数や、
int array[10][20];
int x=2;
int y=6;
array[x][y] = 100;
みたいな配列のインデックスなどのちょっとした変数にintを良く使うのですが、
size_tを使うべきなのでしょうか?
特に64bitをターゲットにビルドする場合、intよりsize_tを使うほうが
実行速度が速くなったりしますか?Windowsです。
614デフォルトの名無しさん:2015/01/15(木) 20:58:51.27 ID:QsGAtWbU
どっちでも一緒よ、
size_tはlongだけど、このページ見るとどっちもバイト境界超えないから、どの環境でも変数のR/Wは同じ
http://ja.wikipedia.org/wiki/%E6%95%B4%E6%95%B0%E5%9E%8B

32bitOSでC#使うと速度差出るかも、
他にもLP64コンパイラで構造体メンバにsize_t使うとバイト境界超えちゃったりするかもね
615デフォルトの名無しさん:2015/01/15(木) 21:09:47.58 ID:lMW8kkLc
>>614
レスありがとうございます。同じですか。
では質問を変えて、上級者の皆さんはintを使いますか?
size_tを使いますか?
616デフォルトの名無しさん:2015/01/15(木) 21:17:13.33 ID:YwRI9yA0
intは処理系の一番得意な整数型になるのが望ましいって決まってるから理由が無いならintの方がいいよ
617デフォルトの名無しさん:2015/01/15(木) 21:20:28.85 ID:cnFFIXA8
>size_tはlongだけど

どうしてこう、息を吸って吐くように嘘が言えるのか
618デフォルトの名無しさん:2015/01/15(木) 21:39:13.36 ID:lMW8kkLc
>>616
なるほど。今までintを良く使ってきたのですが、
vectorなどを使い始めて
for(int i=0;i<v.size();i++){}
とした場合や、文字列に対して
int len = strlen(str);
などで警告が出るので
for(size_t i=0;i<v.size();i++){}
size_t len = strlen(str);
のように、徐々にsize_tを使うようにして来ました。
なので世の中はどっちを使うのか主流なのかなと思いまして。。
619デフォルトの名無しさん:2015/01/15(木) 23:00:29.34 ID:QsGAtWbU
>>617
すまん、処理系によるな、ヘッダ覗いて書きこんでた
620デフォルトの名無しさん:2015/01/16(金) 01:03:17.27 ID:Uo0Zlj+1
signed(符号あり)は負にもなる整数
unsigned(符号なし)は負にならない整数(0以上)

ただしunsignedは、オーバーフローせずに、wrap around する

例えば、byteなら0〜255だから、255の次は、0に戻る
621デフォルトの名無しさん:2015/01/16(金) 01:20:11.72 ID:zcVrzqx4
>>618
range based for使おう
622デフォルトの名無しさん:2015/01/16(金) 07:05:25.03 ID:+KdRxbjW
>>621
ループインデックスの値が必要なケースについて訊いてるんだろ
そのくらい理解しろ
623デフォルトの名無しさん:2015/01/16(金) 08:26:50.60 ID:oLGQ6wLb
>>622
range based for 知ってる俺スゲー君だろ
そのくらい理解しろ
624デフォルトの名無しさん:2015/01/16(金) 10:05:12.01 ID:xsGnLZU7
やっぱりループは
for(int i=0;i<10;i++)みたいな書き方が落ち着くわ。
iteratorでbegin endや
auto みたいな書き方は、馴染めない。
625デフォルトの名無しさん:2015/01/16(金) 10:26:26.47 ID:WEjV0wIz
そうでもない
626デフォルトの名無しさん:2015/01/16(金) 10:29:44.22 ID:FzR9lXNE
rangeってindexアクセス出来る配列以外でも一貫性を保ちつつループ出来るから、変数削除以外にも恩恵あるよ
まあ慣れだよ
627デフォルトの名無しさん:2015/01/16(金) 12:53:21.78 ID:oLGQ6wLb
range based for と scoped enum はもうないとやっていけない体になっちまったわ
628デフォルトの名無しさん:2015/01/16(金) 15:18:41.03 ID:tPfzoFnH
クラスの関数と、コンストラクタの違いって何?
629デフォルトの名無しさん:2015/01/16(金) 15:39:03.66 ID:b2lSaBcL
>>628
聞きたいことを詳しく
630デフォルトの名無しさん:2015/01/16(金) 15:41:29.18 ID:E/p9EfDE
たしかにたいした違いはない、インスタンスの確保の後で最初に呼ばれるように言語上縛りがはいっているが、ただそれだけのメンバ関数ということでもいいかもしれない
631デフォルトの名無しさん:2015/01/16(金) 15:45:45.08 ID:AaRGFWR5
明示的に呼べるしな
632デフォルトの名無しさん:2015/01/16(金) 16:07:08.37 ID:WEjV0wIz
戻り値
633デフォルトの名無しさん:2015/01/16(金) 16:53:18.69 ID:FzR9lXNE
クラスの関数
・戻り値がある
・インスタンス確保後のメンバ変数を操作する時に使われる(カプセル化)

コンストラクタ
・戻り値が無い
・インスタンス確保時に呼ばれる
・メンバ変数の初期化に使われる
・コンストラクタ内で例外が投げられた時、デストラクタが呼ばれない
 →例外の懸念がある時はtry - catch
・値渡しでコンストラクタを呼べる(呼べてしまう)
 →呼ばれたくない時はexplicit

こんな所かな
634デフォルトの名無しさん:2015/01/16(金) 17:25:54.28 ID:+cZ2zonb
コピーコンストラクタの定義漏れ
635デフォルトの名無しさん:2015/01/16(金) 23:05:21.99 ID:3nkqbk8P
>例外の懸念がある時はtry - catch

貴様、さてはJAVA()ドカタだな
636デフォルトの名無しさん:2015/01/16(金) 23:54:19.63 ID:d6vd/A8u
>>635
なんでだよw確かにJavaは業務で触った事あるが
デストラクタでハンドラ解放必要な処理の場合はcatchで解放しとかないとリークするんだぞw

まあスマポでカスタムデリータに解放処理書いときゃそんなの要らないが
637デフォルトの名無しさん:2015/01/17(土) 00:13:52.55 ID:v4dny9bU
C++禁止、リンクライブラリなど禁止
の条件(実質.c, .hファイルと#include)で2つのアプリケーション間で通信をしたい場合どのような方法を使うべきでしょうか?
環境はwindows8です
638デフォルトの名無しさん:2015/01/17(土) 01:12:21.39 ID:C457VsFp
C言語のスレあるんだからそっち行けば良いのに
639デフォルトの名無しさん:2015/01/17(土) 04:29:02.45 ID:Vi+da9/m
void callback(Manager *pMgr)
{
//この中でpMgrを勝手にコピーさせない方法ってありますか?
}
640デフォルトの名無しさん:2015/01/17(土) 06:35:10.23 ID:BHVrc4CM
>>639
レビューをしっかりやる
641デフォルトの名無しさん:2015/01/17(土) 12:06:11.26 ID:rF9ZzbWp
CentOS6.x/7で使われてるglibcって、
実行時ロードでCPUの細かいフィーチャ
(サポートしているsseのバージョンなど)で
リンクするAPIを替える機能ってありますか?
642デフォルトの名無しさん:2015/01/17(土) 15:24:03.01 ID:P217qn7A
>>637
リンクライブラリ禁止といつことは
数値演算・論理演算・メモリアクセスしかできないということだから
Windowsでは無理。
Visual C++標準のライブラリ以外禁止ということなら
パイプかソケットでも使っておけば?
ただアプリケーション間通信をC++で書くという選択が微妙
643デフォルトの名無しさん:2015/01/17(土) 15:28:29.27 ID:Myj9loPB
>リンクライブラリ禁止といつことは
>数値演算・論理演算・メモリアクセスしかできないということだから

それは可笑しい

ライブラリのソース入手してまとめてコンパイル&リンクすれば良い
それがだめで完全リンク禁止って言うなら実行ファイルすら作れない
644デフォルトの名無しさん:2015/01/17(土) 15:51:21.07 ID:MW9qauOG
それじゃKernel32のソースくれよ
645デフォルトの名無しさん:2015/01/17(土) 15:53:02.13 ID:sqhqU9t5
エントリポイント探して呼ぶだけならソースなくてもリンクもなくても出来ないことはないな
646デフォルトの名無しさん:2015/01/17(土) 15:58:17.68 ID:Vi+da9/m
>>640
なんかええ感じのスマポとかないんすか?
647デフォルトの名無しさん:2015/01/17(土) 18:17:59.23 ID:BHVrc4CM
>>646
そもそも pMgr をコピーさせたくないのか、*pMgr をコピーさせたくないのか
どちらにせよ、値を読み出すだけでもコピーだし...
pMgr 渡さなきゃいいじゃん、としか言えない
648デフォルトの名無しさん:2015/01/18(日) 07:32:17.49 ID:AOSxsRns
>値を読み出すだけでもコピーだし

ちょっと何言ってるかわからない
649デフォルトの名無しさん:2015/01/18(日) 08:42:29.94 ID:+NpXYm5M
>>648
コピーの定義書いてみ
650デフォルトの名無しさん:2015/01/18(日) 08:47:58.27 ID:AOSxsRns
>>649
ストレージの別の場所にコピー元を模倣する
オブジェクトが作られることでしょ
651デフォルトの名無しさん:2015/01/18(日) 10:32:46.45 ID:+NpXYm5M
>>650
オブジェクト限定ならコピーコンストラクタ禁止しときゃいいんじゃね?
652デフォルトの名無しさん:2015/01/18(日) 10:47:50.57 ID:QMgHICUY
>>651
コピコンでどうやって防ぐのか教えてもらおうか

void callback(Manager *pMgr) {
Manager pCopy = pMgr; // NG
}
int main() {
Manager m{};
Manager pMgr = &m;
Manager pCopy = pMgr; // OK
}
653デフォルトの名無しさん:2015/01/18(日) 16:33:24.90 ID:aCeCeZGw
それポインタのコピーじゃね?
「オブジェクト限定なら」と書いてあるようだが
654デフォルトの名無しさん:2015/01/18(日) 17:22:37.19 ID:yCk+PJhr
c++ (ちんぽ ぷらぷら) >>all
655デフォルトの名無しさん:2015/01/18(日) 18:22:50.11 ID:FVveS/hd
>>652
まともにコード書けるようになってから、出直してこいよ
656デフォルトの名無しさん:2015/01/18(日) 18:44:35.18 ID:yCk+PJhr
>>652
コンパイル通らないよねそれ
657デフォルトの名無しさん:2015/01/18(日) 19:09:23.39 ID:vb1wMicd
こういう質問見るとなぜそういう間違った手法へとたどり着いたのか背景を聞いてみたくもするけど、やっぱりどうでもいいや。
658デフォルトの名無しさん:2015/01/18(日) 19:35:27.72 ID:k4kja4YC
>>653
ポインター変数はオブジェクトであると規格で定められてるぞ
659デフォルトの名無しさん:2015/01/18(日) 20:05:38.08 ID:gvUCsrNP
>>652
つまり、>>639
callbackの中はコピーNGにしたい、
で、それ以外のところではコピーOKでってことか。
なんでこうすることになったのか>>657じゃないが気になるな
660デフォルトの名無しさん:2015/01/18(日) 21:07:53.84 ID:AOSxsRns
friend地獄にするかプロキシーを使うしかない
661デフォルトの名無しさん:2015/01/18(日) 21:16:37.69 ID:aCeCeZGw
>>658
俺は「オブジェクト」=「クラスや構造体の実体」と文脈から読んだんだけども
規格だとそうなんだ、知らなかったよ
物知りだねぇ
662デフォルトの名無しさん:2015/01/18(日) 21:37:21.82 ID:N3BwmN9T
friend地獄
noexcept地獄
const地獄
C++には地獄が多いですね
Cだとグローバル変数地獄とか
663デフォルトの名無しさん:2015/01/18(日) 23:40:20.64 ID:wOPRs65H
地獄でなく落とし穴
664デフォルトの名無しさん:2015/01/19(月) 01:08:11.99 ID:BdGCwO3o
>>662
const地獄ってどんなの?
なんかデメリットある?
665デフォルトの名無しさん:2015/01/19(月) 02:29:49.09 ID:SwI2Cekr
デフォルトの属性にしちまえよってくらいconst
constだらけでチカチカして記述を忘れたりする
マーフィの法則で記述忘れがそのままmake通ってよくわからないバグを生む
666デフォルトの名無しさん:2015/01/19(月) 02:46:46.14 ID:6ksYFsZ+
それでバグってんのはconstつけてるつけてないのせいじゃねーから!
667デフォルトの名無しさん:2015/01/19(月) 04:16:37.17 ID:nqrjGtBd
>>659
例えば
http://msdn.microsoft.com/ja-jp/library/e6htdchf.aspxmfc
これの引数であるpDCはこのメンバ関数をオーバーライドした中でしか使ってはいけませんよね?
このようなことを明示するためにpDCをコピー禁止にしたかったのですが…
668デフォルトの名無しさん:2015/01/19(月) 04:22:17.07 ID:nqrjGtBd
669デフォルトの名無しさん:2015/01/19(月) 04:23:15.40 ID:7cvqsiOh
コメントで書いてれば充分だろ
670デフォルトの名無しさん:2015/01/19(月) 04:28:29.24 ID:nqrjGtBd
>>669
やっぱりそういうもんですかね?
671デフォルトの名無しさん:2015/01/19(月) 04:58:54.54 ID:uJhqVOMo
あえてやるならこんな感じか
http://ideone.com/IZX6Zh
672デフォルトの名無しさん:2015/01/19(月) 05:25:19.50 ID:sDzJfvsV
実行時にコメント消すコンパイラばっか
673デフォルトの名無しさん:2015/01/19(月) 05:28:24.47 ID:uJhqVOMo
所有権のないポインタを保存しておくのは常にdangling referenceの危険があるから
常識として普通は保存しないしコメントは冗長
674デフォルトの名無しさん:2015/01/19(月) 07:07:16.21 ID:Cyk/lQNq
所有権って概念を理解してない初心者にありがちな間違いではあるね。
所有権が理解出来てないとクラス設計も壊滅的に酷い物になる。
675デフォルトの名無しさん:2015/01/19(月) 07:37:45.73 ID:TqSS9iKL
有効性判定なら shared_ptr/weak_ptr かなぁ
676デフォルトの名無しさん:2015/01/19(月) 09:44:06.66 ID:nqrjGtBd
>>674
つまり、コピーを取られないことを前提で作って良いってことですか?
677デフォルトの名無しさん:2015/01/19(月) 10:16:07.12 ID:KaaVf0G8
コンパイラの機能やライブラリの範囲で防ぐのは不可能

だがD言語ならきっと何とかしてくれるかもしれないっ…!!
678デフォルトの名無しさん:2015/01/19(月) 13:51:52.63 ID:Cyk/lQNq
>>676
一般的にポインタ保存することをコピー取るなんて言わないから、そういう意味で使ってるなら誤解招くからやめた方がいいぞ
679デフォルトの名無しさん:2015/01/20(火) 20:07:40.33 ID:KZw9T2mJ
シャローコピーとディープコピーの概念はわかり易いと思うけど
680デフォルトの名無しさん:2015/01/21(水) 00:15:39.68 ID:7IR5jjAd
ハンドルで書き直すとかは
681デフォルトの名無しさん:2015/01/21(水) 09:58:23.25 ID:hIJga017
code readingに出てくる
バリアント、インバリアントがよくわかりません

例えば
int x=0,y+=10,z;
while (x<y) {
z=x;
x++;
}

インバリアントがx<y
バリアントがその他でおk?
682デフォルトの名無しさん:2015/01/21(水) 16:16:08.63 ID:rHc4ND4l
どんなスペルなの?
683デフォルトの名無しさん:2015/01/21(水) 17:50:17.63 ID:65s3laC/
class invaliantだろが
684デフォルトの名無しさん:2015/01/21(水) 17:51:02.25 ID:65s3laC/
まちがえたw
class invariant
685デフォルトの名無しさん:2015/01/21(水) 19:01:05.21 ID:I9/tMJB1
>>681
> インバリアントがx<y
> バリアントがその他でおk?
まったくだめ、というかそれ以前
そのバリアント・インバリアントはコードではなくコードが表現する処理の意味に関するものだから
無意味な処理のテストコードで形式だけで考えても意味はない
686デフォルトの名無しさん:2015/01/21(水) 21:22:30.37 ID:rHc4ND4l
まずわ意味をぐぐればいいわけね
687デフォルトの名無しさん:2015/01/22(木) 22:30:17.16 ID:QOe1Cpix
char[]の中に、こういう文字列が有るんですが、
Name = "データ"\r\n
ここから データ という文字列の部分を取り出したいのですが、
いろんな方法があると思うんですが、スマートな方法教えて下さい。
なお、"データ" という文字列の部分は、いろいろ変わりますが、
改行とか変な文字は含みません。
688デフォルトの名無しさん:2015/01/22(木) 23:50:29.01 ID:axQWmtg/
>>687
何をしたいのかその文ではさっぱり分からんが、
想像するに\r\nを削りたいってところだろうか

char *Name="データ\r\n";
return strsep(&Name, "\r\n");
689デフォルトの名無しさん:2015/01/22(木) 23:54:51.76 ID:hGP5IRk0
Name1 = "Data1"
Name2 = "Data2"
……
ってたくさんあって、Name1のデータは"Data1", Name2のデータは"Data2"みたくしたいのかな?
690デフォルトの名無しさん:2015/01/23(金) 00:35:11.91 ID:uMcR+6pK
>>687
エスパーすると、
"Name = 1234¥r¥n"
"Name = abcd¥r¥n"
"Name = 東京都品川区¥r¥n"
こんな感じ?
691デフォルトの名無しさん:2015/01/23(金) 00:59:49.40 ID:M2u72OkA
\r と \n が複数回いろんな場所に登場する事もあったりしてw
頭から全角半角判定して、一個一個調べて行くのがいいのかな。
692デフォルトの名無しさん:2015/01/23(金) 01:01:16.66 ID:B6TLxfZL
getlineでおk
693デフォルトの名無しさん:2015/01/23(金) 01:06:35.32 ID:VC3FF7ui
>>688
本題と違うけどリテラル文字列を変更しちゃあかんやろ
これだからCゲンガーは
694デフォルトの名無しさん:2015/01/23(金) 01:14:15.29 ID:RhfD23E2
kansu() const throw()

kansu() const noexcept


は何か違いはありますか?
695デフォルトの名無しさん:2015/01/23(金) 01:37:55.25 ID:9tnFJzS/
>>690
そう、そんな感じですけれど、一点だけ違います。
"Name = 1234\r\n"
ではなくて
"Name = \"1234\"\r\n"
です。
ファイルから読み込んだ文字列なので末尾に\r\nが付きますが、それ以外の部分には
\r\nや、それ以外の制御文字などは入りません。
696デフォルトの名無しさん:2015/01/23(金) 02:15:09.07 ID:ru/IpI5u
>>695
https://ideone.com/wiDaEr
ただ、これは"データ"内に"が文字として存在しない場合に限るけど
697デフォルトの名無しさん:2015/01/23(金) 03:20:19.06 ID:Iw65TJKV
>>695
柔軟性で選ぶならregex
http://ideone.com/AJbpI5
698デフォルトの名無しさん:2015/01/23(金) 03:39:34.21 ID:ofrdGIC1
C++で使えるスキップリストの実装で、おすすめの物などあったら教えてください。

当初std::multimapを使用していたのですが、全要素に対しての
先頭からの反復処理が非常に低速であるため、スキップリストを利用したいと思いました。
検索して見つけたCS::SkipList ( http://sourceforge.net/projects/csskiplist/ ) を試したところ
反復処理で満足のいく速度が出たため使っていたのですが、使っているうちに
 * C++03時代の物であるためムーブが行えない
 * 軽微ではあるがメモリリークのバグがある
 * 要素の大量追加 => 大量削除を行うとその後の各操作が非常に低速になる?
  (細かい検証はしていません。もしかしたらただのメモリフラグメンテーションかも)
のような問題が見られ、別の実装を探した方が良いのではと考えるに至りました。

要件は以下の通りです:
* GPL/LGPL等でなく、ライセンスが比較的緩いこと
 (成果物はバイナリ形式で無償で不特定多数に配布予定)
* multimap同様、「重複可能なキー」と「値」のペアを格納するタイプのスキップリスト
* できればムーブに対応していると嬉しい(emplace等)
* できればC++11の拡張forで扱えると嬉しい(begin, end)

自分でもこれから色々探して、最悪自作することも視野に入れていますが
もし既に良い実装をご存じの方がいたら、教えて欲しいです。
699デフォルトの名無しさん:2015/01/23(金) 11:38:27.61 ID:9tnFJzS/
>>696
>>697
サンプルありがとうございました。
istringstreamもregexも、難しそうなのでふだん使わないので参考になりました。
自分でも作ってみたのですが、
char c_str[] = "Name = \"1234\"\r\n";
string str = c_str;
string::size_type is = str.find("\"") + 1;
string::size_type ie = str.find("\"", is);
string data = string(&str[is], &str[ie]);
いちおう目的は達成できたのですが、こういうやり方はどうでしょうか?
700デフォルトの名無しさん:2015/01/23(金) 16:08:31.27 ID:R2ihxFB7
Cで、sizeofは内部でどういう計算がされていますか
701デフォルトの名無しさん:2015/01/23(金) 16:12:50.60 ID:mBK4/sG6
足し算で計算されていると思います
702デフォルトの名無しさん:2015/01/23(金) 16:21:10.45 ID:Iw65TJKV
>>699
後端の"が見つからなかった場合のエラー処理ができてない。
703デフォルトの名無しさん:2015/01/23(金) 16:53:41.82 ID:9tnFJzS/
>>702
文字列には必ずペアでダブルクオーテーションがあることが前提なのですが、
そういう場合でも、エラーチェック処理をするべきでしょうか?
704デフォルトの名無しさん:2015/01/23(金) 17:01:51.59 ID:m9gdTXpE
前提を崩した入力があった時に
・エラーで文句言う
・落ちる
・鼻から悪魔
705デフォルトの名無しさん:2015/01/23(金) 17:06:34.53 ID:Iw65TJKV
>>703
その文字列がプログラム埋め込みでもない限りするべきだと思うけど
706デフォルトの名無しさん:2015/01/24(土) 00:00:03.81 ID:qgW96dGE
>>704
・HDDを消去する
707デフォルトの名無しさん:2015/01/24(土) 01:35:33.39 ID:OAbMDKxg
・PCを再起動する
708デフォルトの名無しさん:2015/01/24(土) 01:42:37.17 ID:MUCQBpQd
・ハングアップさせる 逆にむずいか
・自爆させる 捕まるか
・入力者の個人情報をツイでさらす これいいかも

鉄則 『入れちゃいけないデータは入れちゃいけない』
709デフォルトの名無しさん:2015/01/24(土) 02:47:39.21 ID:agcMAP5l
Mac、C++で
ディレクトリ内のファイル一覧の取得、
ディレクトリまたはファイルが存在するかどうかのチェック、
ディレクトリまたはファイルの作成
をするにはどうしたらよいですか
Objective-CでいうところのNSFileManagerみたいなイメージです
710デフォルトの名無しさん:2015/01/24(土) 07:34:19.87 ID:fHbROJyl
>>708
中途半端に安全宣言して実は漏れてました
よりも最初から危険だと判ってた方が良いよね
原発と同じ
711デフォルトの名無しさん:2015/01/24(土) 10:57:57.69 ID:Kmb3zjvG
C#だと文字列の頭に@を付けて
str = @"c:\path\file" ;
みたいに出来ますが、C/C++でも似たような事出来ませんか?
現状だと
str = "c:\\path\\file" ;
みたいに \\ を入れるのが面倒なので。
712デフォルトの名無しさん:2015/01/24(土) 11:09:46.78 ID:innueIxY
>>711
c++11のRAWストリングリテラルを使う
713デフォルトの名無しさん:2015/01/24(土) 11:28:57.33 ID:Kmb3zjvG
>>712
ありがとうございました。
便利なのが有るんですね。助かりました。
714デフォルトの名無しさん:2015/01/24(土) 12:45:27.80 ID:Kmb3zjvG
enum class MyEnum :int
{
  one,
  two,
  three,
};

int func()
{
  return MyEnum::one;
}

とすると、VC++2013では
  IntelliSense: 戻り値の型が関数型と一致していません
と出るのですが、関数をMyEnum型にするか、戻り値をintにキャストすれば解決はするのですが、
MyEnum :int と宣言しているので、MyEnumはintになると思ったのですが。
ググったら暗黙の型変換はしないと書いて有ったのですが、ではMyEnum :intの
intはどういう時に使うのでしょうか?有っても無くても同じですか?
要するに関数はint型のままで、キャストせずに戻り値にMyEnumを使う事は出来ませんか?
715デフォルトの名無しさん:2015/01/24(土) 12:46:26.72 ID:ZR5shUeN
できません
716デフォルトの名無しさん:2015/01/24(土) 12:55:05.36 ID:ZR5shUeN
>>714
>intはどういう時に使うのでしょうか?

クラスのバイナリイメージを扱いたいときに便利
struct AbcHeader {
 int ver : 4;
 int reserved : 28;
 enum class MyEnum type;
};
717デフォルトの名無しさん:2015/01/24(土) 13:26:49.73 ID:jVEAYvO6
>>714
> ではMyEnum :intのintはどういう時に使うのでしょうか?
int以外の整数型を指定したいとき

> 有っても無くても同じですか?
enum classの場合はあってもなくても同じ

> 要するに関数はint型のままで、キャストせずに戻り値にMyEnumを使う事は出来ませんか?
enum classの場合はできない
718デフォルトの名無しさん:2015/01/24(土) 15:00:04.93 ID:+P7E5oiJ
コンソールアプリケーションでゲームを作っているのですが
全角文字が一文字分右にずれて表示され動かしているキャラクターの前回の座標を上書きすると○の文字の場合○の右半分だけ残ってしまいます
同じコード(少しいじって途中でおかしいのに気付きCtrl+zで戻しました)なのに急にこのような状況になってしまいました
理由がわかる方がいればお願いします
719デフォルトの名無しさん:2015/01/24(土) 15:09:33.04 ID:1f2SI/kI
それはわからん。今後はバージョン管理ツールやバックアップツールを導入しとけ。
720デフォルトの名無しさん:2015/01/24(土) 15:23:29.46 ID:/AQI/IFI
>>718
UnicodeとMBCSのどっち?
721デフォルトの名無しさん:2015/01/24(土) 15:30:37.35 ID:SBUC5aCD
>>698ですが
色々あって自作する事になりましたので、質問を取り下げます
ありがとうございました
722デフォルトの名無しさん:2015/01/24(土) 15:51:41.08 ID:vo9it+x1
>>720
マルチバイトです
723デフォルトの名無しさん:2015/01/24(土) 16:55:31.38 ID:/AQI/IFI
>>718
二次元配列で仮想画面を保存して全角の後ろを上書きすれ
724デフォルトの名無しさん:2015/01/24(土) 22:19:35.41 ID:CVvB/wzu
Cのポインタの問題をお願いします

配列変数aを{2,1,7,3,6,4,8,5,9}で初期化し、バブルソートで大きな順に並び替えて表示するプログラムを作成せよ
配列要素の参照にはポインタ変数を用いること
725デフォルトの名無しさん:2015/01/24(土) 23:00:57.11 ID:OmHyRM5u
宿題スレいけ
C/C++の宿題片付けます 168代目
http://peace.2ch.net/test/read.cgi/tech/1408962564/
726デフォルトの名無しさん:2015/01/25(日) 00:00:18.23 ID:l2NWKfU1
>>723
それでも直らなかったのですがMSゴシックを標準のフォントに戻すと直りました
他のPCではMSゴシックでも動いてたので結局根本的な原因は不明です
727デフォルトの名無しさん:2015/01/25(日) 00:22:01.40 ID:PYkp2Zoh
>>715>>716>>717
解説ありがとうございました。class無しでやる事にしました。
構造体で
int ver : 4;
の :4 は何を表しているのでしょうか?
ググりたいのですがキーワードを教えて下さい。
728デフォルトの名無しさん:2015/01/25(日) 00:25:59.54 ID:6pmbh6NX
ビットフィールド
729デフォルトの名無しさん:2015/01/25(日) 04:15:53.25 ID:P8ARGA9y
709です
Cのstatとsystemを使って出来るみたいですね。
しかしもう少し抽象化されたものはないんでしょうか。
730デフォルトの名無しさん:2015/01/25(日) 04:27:46.19 ID:q//XhoOI
boost::filesystemを使う
731デフォルトの名無しさん:2015/01/25(日) 04:50:16.61 ID:HQ3aG4X8
NSFileManager をC++でラップする
732デフォルトの名無しさん:2015/01/25(日) 20:17:59.89 ID:jnERKKsI
boostなんて、仕事じゃ使えねーよ
遅すぎるし
733デフォルトの名無しさん:2015/01/25(日) 20:38:16.56 ID:Wnz0wilq
ヘッダによる、
fwdヘッダ用意してなかったりasio、format、regexだったりは遅くなるけど、
それ以外はプリコンパイルヘッダに含めればそこまで足引っ張らない
734デフォルトの名無しさん:2015/01/25(日) 20:39:50.56 ID:jnERKKsI
動作が遅いっていってんだけど
735デフォルトの名無しさん:2015/01/25(日) 20:43:43.36 ID:pVReJ80Y
お前のやってる仕事ではそうなのかもな。
736デフォルトの名無しさん:2015/01/25(日) 20:44:30.35 ID:Wnz0wilq
(ヾノ・∀・`)ナイナイ
737デフォルトの名無しさん:2015/01/25(日) 21:40:14.60 ID:q//XhoOI
boostつったって色々あるしなぁ
738デフォルトの名無しさん:2015/01/26(月) 00:30:57.11 ID:UM6C6XDi
どれだけ遅いのですか。
データはありますか。
739デフォルトの名無しさん:2015/01/26(月) 00:47:39.69 ID:CYa04E4M
ブーストなのに遅いとか
740デフォルトの名無しさん:2015/01/26(月) 01:02:32.94 ID:5Hop7PEH
仕事には使えないな。そういう用途のものでないな。
実装実験のためのものだし、バージョン依存も激ししい。
741デフォルトの名無しさん:2015/01/26(月) 01:03:38.74 ID:XNIaxWEk
書くのが早いというだけで‥
742デフォルトの名無しさん:2015/01/26(月) 01:07:34.43 ID:aJ+RSSru
>>740
仕事用でasioの代用だと何使ってる?
743デフォルトの名無しさん:2015/01/26(月) 05:51:49.64 ID:wwEyx5FJ
ID:jnERKKsIがアレなのを別にしても
boost.poolテメーはダメだ。
744デフォルトの名無しさん:2015/01/26(月) 06:18:40.46 ID:fhQPsb6z
format regex 使ったけど遅すぎて止めた
745デフォルトの名無しさん:2015/01/26(月) 06:21:42.54 ID:bg9QqCyi
そこはxpressive使うべきだろ
746デフォルトの名無しさん:2015/01/26(月) 23:15:44.30 ID:9eewx3ez
質問させてください
javaは経験してますが、C++は最近0から独習しています
今回教えていただきたいのはC++のクラスの多重継承についてなのですが
これは本来の基底クラスの拡張という以外に、javaのインターフェースの代替として使用しても良い機能でしょうか?
したいことといえば、例えばjavaであればインターフェースを使用して
class Bar extends Foo implements IMovable, IContainerable,ISpeakable
とクラスの親子関係と性格を決めていたところを
C++ではその目的で
class bar : public foo, public mover, public container, public speaker
のように全て継承で一緒くたに扱う形で実装してよいのでしょうか
javaのインターフェースが実装を保障するものであるのに対し
C++ではそれに相当するものが見あたらず、とりあえず実装上同じような事が出来そうなのが多重継承だったのですが
C++本来の継承の意味合いからしてそういう使い方をしてよいのか気になっています
747デフォルトの名無しさん:2015/01/26(月) 23:22:01.37 ID:3+xNlERk
>>746
良い
748デフォルトの名無しさん:2015/01/26(月) 23:37:21.36 ID:a9uK3KSB
>class bar : public foo
これはC#のインターフェース相当かな。
Javaのインターフェースに相当するC++の記述は
class Bar : public virtual foo
749デフォルトの名無しさん:2015/01/26(月) 23:41:53.42 ID:3ZfUr7hf
fooはインターフェースじゃなくて普通の基底クラスじゃなかろうか
750デフォルトの名無しさん:2015/01/26(月) 23:50:56.82 ID:ZzAwnl5E
>>748
違うから。
嘘教えんなよ
751デフォルトの名無しさん:2015/01/27(火) 00:00:11.04 ID:6+4RVPqa
>>747
ありがとうございます
では、とりあえずその方向で移植しながら勉強してみます
752デフォルトの名無しさん:2015/01/27(火) 00:07:34.76 ID:RrImLxtB
>>751
そのinterface用のクラスで
virtual void a()=0;
って感じで後ろに=0;を付けて定義するとinterface用クラスを派生した側でvoid a()を実装しなければ実体化出来なくなるからJavaとかのinterfaceに近くなる。
詳しくは 純粋仮想関数 でググれ
753デフォルトの名無しさん:2015/01/27(火) 01:47:04.24 ID:e342vVi2
C++はインターフェースが無いから、>>752のやり方でインターフェースとして振る舞うクラスを定義するのが普通だね、
そして共通メソッドもBaseクラスじゃなくこのインターフェース用クラスのメソッドとして実装しちゃうので、ここでJavaとの実装方法に違いが出てた、

ただ、JavaもJava8からインターフェースにdefaultメソッドを実装できるようになったから、
C++と同じく多重継承は出来るようになった。

だけど、それはインターフェースに限定され、クラスの多重継承は未だに出来ない事から、
実装をインターフェースに集約出来るってメリットが生まれたって考えとけば良いと個人的には思ってる。
754デフォルトの名無しさん:2015/01/27(火) 03:00:56.45 ID:QKfojaOJ
java の interface は元から多重継承でしょう。
それより仮想継承についてここまで説明なしなんだが。
755デフォルトの名無しさん:2015/01/27(火) 03:05:24.02 ID:RrImLxtB
>>754
interfaceに仮想継承関係ないから
756デフォルトの名無しさん:2015/01/28(水) 11:36:45.00 ID:0I4WdO58
C++でクラスを使ったプログラミングでは、
p1->p2->member
みたいにポインタの->が出てくるのが普通だと思いますが、
c1.c2.member
みたいに . だけでプログラムを書くことは可能でしょうか?
どっちの方法が良いとかありますか?
好き好きですか?
757デフォルトの名無しさん:2015/01/28(水) 12:18:16.41 ID:RtqNScsl
わざわざ(*p1).(*p2).memberって書くのか?
そんなことにこだわる意味が分からないよ
758デフォルトの名無しさん:2015/01/28(水) 12:27:05.03 ID:U/zfeC5A
(A){
Hoge hoge();
hoge.pointer->method();
hoge.reference.method();
}

(B){
Fuga *fuga = new Fuga();
fuga->pointer->method();
fuga->reference.method();
delete fuga;
}
759デフォルトの名無しさん:2015/01/28(水) 12:54:59.27 ID:0I4WdO58
>>757 >>758
レスありがとうございます。
-> を使うということは、new をしているということですよね。
なので質問の意図としては、newやdeleteを使わずに
. だけでプログラムを組むなんていうのは出来るのかな?現実的では
ないのかな?実際のところはどうなんだろうという質問です。
760デフォルトの名無しさん:2015/01/28(水) 12:56:55.48 ID:4k8FABlu
ポインタを使うのはポインタを使う理由があるからやっている
(多態を使うとかnewで構築したとか)

そうした理由が無ければ好きにすればいい
761デフォルトの名無しさん:2015/01/28(水) 15:05:31.44 ID:Uf2MmTr/
>>759
new使わなくてもアローは使う事がある

func1()
{
A a;
func2(&a);
}

func2(*A pa)
{
pa->member
}
762デフォルトの名無しさん:2015/01/28(水) 21:58:25.98 ID:JxueOrGN
C++ なら new 使っても . でいけるし

func1()
{
A* a = new A;
func2(*a);
}

func2(A& pa)
{
pa.member
}
763デフォルトの名無しさん:2015/01/28(水) 22:47:19.01 ID:anpOJbJr
クラスのメンバに参照使うこともできるぞ
メンバに参照があるとoperator=がデフォルトで定義されなくなるし大抵の場合不便だからポインタにすることが多いけど
764デフォルトの名無しさん:2015/01/28(水) 22:50:41.67 ID:P3TzAr8+
ポリモーフィズムでBaseクラス型のポインタが必要になった時にアロー使ったり、
一応templateでポリシークラス渡す方法だとアロー消せるけどこっちはダックタイピングだから主旨ずれちゃうけど
765デフォルトの名無しさん:2015/01/28(水) 23:07:35.37 ID:anpOJbJr
そんなことができそうな提案がいくらか出されてるから(operator .とかinline valiablesとかexpression aliasとか)将来のC++ではできるかもしれない
766デフォルトの名無しさん:2015/01/29(木) 01:14:59.53 ID:Du6RynO1
>>759
とりあえず、見た目にこだわっての話なら、そのこだわりは早めに矯正したほうがいい
それらの使い分けは、構文的なこだわりとは全く別の視点で行われるべき
例えば大量のデータに対する順次処理はインライン関数内でスタック処理したが早い
ただし再帰でやったら死ぬから、自分が何をしようとしているかがわからない内は無理して使い分けはしないほうがいい
尚、ポインタであっても参照にとればアロー使わずメンバにアクセスできるけど、これに特に意味はない
767デフォルトの名無しさん:2015/01/29(木) 02:26:57.54 ID:q7BZe7Bx
>>766
その変数がnullでない事を保証するぐらいの意味はあるだろ
768デフォルトの名無しさん:2015/01/29(木) 10:16:32.39 ID:wMkjI3CS
 
お世話になります。
私、責任者の加茂と申します。以後、宜しくお願い致します。
http://www.apamanshop.com/membersite/27009206/images/kamo.jpg
浪速建設様の見解と致しましては、メールによる対応に関しましては
受付しないということで、当初より返信を行っていないようで、今後につい
てもメールや書面での対応は致しかねるというお答えでした。
 
このように現在まで6通のメールを送られたとのことですが、結果一度も
返信がないとう状況になっています。
 
私どものほうでも現在までのメール履歴は随時削除を致しております
ので実際に11通のメールを頂戴しているか不明なところであります。
 
 
 ・T   http://s-at-e.net/scurl/ia-T.html
 ・Zle  http://s-at-e.net/scurl/ia-Zle.html
769デフォルトの名無しさん:2015/01/29(木) 12:34:49.33 ID:+k0iBMBa
Visual Studio 2012 Professional を使用しています。
Win32 プラットホームだとビルドできるのに x64 だと
デストラクタなどが未定義というリンクエラーが発生してしまうのには
どんな原因が考えられるでしょうか?

エラー自体は以下の様な感じです。
コンストラクタに関しては宣言すらしてないのに未定義と言われてしまいます。
error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: virtual __cdecl Hoge::~Hoge(void)"
error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: __cdecl Hoge::Hoge(void)"
770デフォルトの名無しさん:2015/01/30(金) 15:15:38.64 ID:TnZuFfmI
仮想PC(vmware)内でVirtualQueryExを行うと戻り値が0になって
情報が得られません。
ホストPCではきちんと取得できるのですが・・・。
原因が分かる方、どうかアドバイスをお願いします。

仮想PCのOSはwindows7 32bitで
そのときのpid、OpenProcessの値は特に問題なさそうです。
OpenProcessのアクセスフラグにPROCESS_QUERY_INFORMATIONをきちんと追加してあります。
試しに同じハンドルでReadProcessMemoryを使って読み込み可能なアドレスを
読んでみましたが、問題なしです。
771デフォルトの名無しさん:2015/01/30(金) 16:38:50.26 ID:NPtMLJeu
If the function fails, the return value is zero.
To get extended error information, call GetLastError.
Possible error values include ERROR_INVALID_PARAMETER.
772デフォルトの名無しさん:2015/01/30(金) 18:19:02.70 ID:qhLo8LD3
>>769
多分これと同じような問題だと思うが
バージョンは違うが同じ線で解決できるんじゃないかな
http://stackoverflow.com/questions/15294606/compiling-32-bit-code-to-64-bit
773770:2015/01/30(金) 19:05:38.20 ID:TnZuFfmI
自己解決しました。すみません。
774デフォルトの名無しさん:2015/01/31(土) 03:33:51.34 ID:HKGnWIrq
Win32でなんか問題あったら英語のリファレンス見ろ
日本語の自動翻訳は古いしごっそり抜けおちてる
775デフォルトの名無しさん:2015/01/31(土) 08:35:04.41 ID:YMt5PyZL
日本語訳は意味が正反対になってたりするから見ない方が良い
776デフォルトの名無しさん:2015/01/31(土) 22:14:24.84 ID:cjFh9ic9
ある型の演算子+を定義する際、下記のどちらがよいのでしょうか?

struct Hoge
{
  friend Hoge operator+(const Hoge& rhs,const Hoge& lhs)
};

struct Hoge
{
  Hoge operator+(const Hoge& rhs)
};
777デフォルトの名無しさん:2015/01/31(土) 22:16:41.56 ID:W7HhQqzU
>>776
好きにしろ
778デフォルトの名無しさん:2015/01/31(土) 22:25:00.72 ID:JW07CSIR
>>776
下の方こうな
  Hoge operator+(const Hoge& rhs)const;
779片山博文MZ ◆T6xkBnTXz7B0 :2015/01/31(土) 22:25:24.92 ID:NOJeJgIt
>>776
前者の方が自由度が高い
780デフォルトの名無しさん:2015/01/31(土) 22:27:30.29 ID:cjFh9ic9
>>779
どのように自由度が高いのか、教えてください
781デフォルトの名無しさん:2015/01/31(土) 22:34:48.45 ID:pbDgT3cF
>>778
こうだろjk
Hoge operator+(const Hoge& rhs) const &;
Hoge operator+(const Hoge& rhs) &&;
782片山博文MZ ◆T6xkBnTXz7B0 :2015/01/31(土) 22:39:41.91 ID:NOJeJgIt
>>780
オーバーロード
Hoge operator+(int rhs,const Hoge& lhs);
Hoge operator+(const Hoge& rhs,int lhs);

rhsとlhsが逆だよ。rhsはright hand sideだろ。
783デフォルトの名無しさん:2015/01/31(土) 22:40:18.05 ID:cjFh9ic9
>>781
そいうこと聞いてるわけはないんだけどな・・・
784デフォルトの名無しさん:2015/01/31(土) 22:41:21.87 ID:cjFh9ic9
>>782
別にrhsはright hand sideなんて主張はしてませんけど・・・
785デフォルトの名無しさん:2015/01/31(土) 22:42:57.40 ID:pUcWKA/a
何だ。釣りか
786デフォルトの名無しさん:2015/01/31(土) 22:43:55.72 ID:NOJeJgIt
>>784
右と左が違う
787デフォルトの名無しさん:2015/01/31(土) 22:53:25.91 ID:6bqytg64
ホゲ使いと糞コテハンにはマトモな奴がいないことがわかる
788デフォルトの名無しさん:2015/01/31(土) 23:00:37.21 ID:NOJeJgIt
左右なんて幼稚園児でも知ってる
789デフォルトの名無しさん:2015/01/31(土) 23:09:14.02 ID:JW07CSIR
>>781
別に必須じゃないし、それだと右がmoveに対応してないから片手落ち
790デフォルトの名無しさん:2015/01/31(土) 23:17:52.59 ID:9f9nMqsh
じゃあこれだな。
Hoge operator+(Hoge&& rhs) const &;
Hoge operator+(const Hoge& rhs) const &;
Hoge operator+(const Hoge& rhs) &&;
791デフォルトの名無しさん:2015/01/31(土) 23:21:08.36 ID:uiYKM1ql
>>776
どちらもいまいち、二項演算子の基本はこう。11以降ならmoveを考慮した変形もあり
// 非friend
inline Hoge operator+(Hoge lhs, Hoge const & rhs) // 左辺は参照ではなくコピー
{
return lhs += rhs; // operator+=も自身(Hoge)の+を使わず別に定義
}
792デフォルトの名無しさん:2015/01/31(土) 23:25:07.98 ID:DdagF+N6
>>790
これだと
Hoge{} + Hoge{}
が解決できないと思うが
793デフォルトの名無しさん:2015/01/31(土) 23:27:08.38 ID:SXaozwOR
Hoge operator+(Hoge&& rhs) const &;
Hoge operator+(const Hoge& rhs) const &;
Hoge operator+(const Hoge& rhs) &&;
Hoge operator+(Hoge&& rhs) &&;
だろjk
794デフォルトの名無しさん:2015/02/01(日) 11:14:38.73 ID:TzQjRziG
左辺が左辺値で右辺が右辺値のときにオブジェクトを一個無駄に作るのは何とかならないの?
795デフォルトの名無しさん:2015/02/01(日) 11:16:01.24 ID:TzQjRziG
>>791のコードね
796デフォルトの名無しさん:2015/02/01(日) 11:48:08.81 ID:qD0MVFLG
代表的なstd::complexの仕様を確認してみるという発想は無いんだね おまいら
797デフォルトの名無しさん:2015/02/01(日) 12:07:20.71 ID:cy3G0Gxv
>>794
右辺に結果入れて return std::move(rhs);
798デフォルトの名無しさん:2015/02/01(日) 12:36:47.48 ID:fuhak8XW
char a[1];

a[0]='A';
a[1]='\0';

ってやると、 A \0 \0 って3文字分メモリを取って、隣接する配列とかがおかしくなるんですが何でですか。
799デフォルトの名無しさん:2015/02/01(日) 12:45:24.79 ID:+XxUWgAM
範囲外に値書き込んだら
何が起こってもおかしくない。
800デフォルトの名無しさん:2015/02/01(日) 12:49:21.99 ID:ofkZJOEV
一次元配列のメモリ領域の一部分を借りて変数の配列にしてるんだから、
配列外にアクセスしたら別の変数にアクセスしてしまう場合もあるわな
801デフォルトの名無しさん:2015/02/01(日) 12:50:56.27 ID:viDnpXeU
>>799-800は会話のできないアスペ
802デフォルトの名無しさん:2015/02/01(日) 13:02:28.61 ID:ofkZJOEV
> ってやると、 A \0 \0 って3文字分メモリを取って
解読してくれよエスパー
803デフォルトの名無しさん:2015/02/01(日) 13:12:25.51 ID:DsQLSXV2
>>794,795
オーバーロードを追加。もちろん+が項の交換可能なときだけ
inline Hoge operator+(Hoge lhs, Hoge const & rhs) { return lhs += rhs; } // >>791
inline Hoge operator+(Hoge const & lhs, Hoge && rhs) { return rhs += lhs; }
804デフォルトの名無しさん:2015/02/01(日) 13:13:21.84 ID:fuhak8XW
char a[1] ;
strcpy(a,"A");

a[0] a[1]
ってすると、A \0 って領域が取られると思ってたので、
a[1] に '\0' を直接入れても変わらないと思ってたのですが違うんですかね。
 
805デフォルトの名無しさん:2015/02/01(日) 13:22:00.98 ID:F9WepZKr
char a[1]は要素数が1しかないから
a[1]にはアクセスしてはいけません
806803:2015/02/01(日) 13:26:13.54 ID:DsQLSXV2
おっと2つ目はmoveがいるか rhs += lhs; return move(rhs);
807デフォルトの名無しさん:2015/02/01(日) 13:34:48.58 ID:fuhak8XW
char a[2] ; strcpy(a,"A");

だったら A \0 ってなるが、

char a[1] ; strcpy(a,"A");

だと A しか格納されないって事ですかね。この場合終端文字が無いって事ですかね。


 
808デフォルトの名無しさん:2015/02/01(日) 14:07:18.27 ID:mNLzuGxf
器の大きさに見合わないことをやっているので、
その後何がおきてもしかたない状態
809デフォルトの名無しさん:2015/02/01(日) 14:08:25.74 ID:ofkZJOEV
>>807
どっちも 'A'と'\0'の2バイトをコピーするよ、
ただしstrcpyはコピー先の確保メモリ数なんて考慮しないから、
下の方は確保領域外であるa[0]の次に'\0'を書き込んじゃうのでよろしくない
810デフォルトの名無しさん:2015/02/01(日) 14:28:19.84 ID:sjXjc1T+
クルマが道路をはみ出して走った場合に
直ちに重火器で破壊停止される場合と
人をひいても気付かずにそのまま走り続ける場合がある

>>807 の例は後者
811デフォルトの名無しさん:2015/02/01(日) 14:34:13.41 ID:fuhak8XW
char a[1] ; 
strcpy(a,"A");で

a[0] にA その次に \0 が入る。 a[1] = '\0' でも同じ事。

文字列としてaを扱った場合 aの隣の領域に変更が無ければ A\0の文字列として扱える。

ただし a[0] の隣に \0 を入れた時点で、
その領域を使ってた変数などが先頭が\0になって壊れると言う事ですね。




 
812デフォルトの名無しさん:2015/02/01(日) 14:41:54.37 ID:ofkZJOEV
>>811
いや、違う
配列外が'\0'になってるのはOSがよろしくやってくれてるだけで、
環境が違えばメモリ確保領域外にゴミデータが入ってる事なんてよくある、
メモリ確保領域外がすべて0クリアされてる前提でコードを組むのは環境依存になるし、お作法的にもやっちゃダメ

> その領域を使ってた変数などが先頭が\0になって壊れると言う事ですね。
こっちも、変数のフラグメンテーションによって配列外アクセスが常に別の変数の先頭領域になるなんて保障がないよ
813デフォルトの名無しさん:2015/02/01(日) 14:48:51.05 ID:ofkZJOEV
あ、ちなみに、配列内なら初期値以降が0クリアされるって言語仕様で決められてるよ

例えば
int a[3] = {0};
だと、a[0] == 0、a[1] == 0、a[2] == 0

int a[3] = {5, 2};
だと、a[0] == 5、a[1] == 2、a[2] == 0

char a[3] = "A";
だと、a[0] == 'A'、a[1] == '\0'、a[2] == 0('\0')
814デフォルトの名無しさん:2015/02/01(日) 17:52:07.52 ID:5WStzBZM
strcpy_sじゃあかんのか
815デフォルトの名無しさん:2015/02/01(日) 19:19:45.80 ID:WJjCYs3Y
double型で桁数の多い計算をしたら、1.6493361431022000e-006という数字になりました。
これはdouble型の桁数を超えたんでしょうか?
この数字が出るとその後、この数字に乗算しても正しい結果にならないんですが
816デフォルトの名無しさん:2015/02/01(日) 19:22:02.20 ID:l+3aqkIQ
大人C++でstd::string使っとけ
817デフォルトの名無しさん:2015/02/01(日) 19:27:49.82 ID:l+3aqkIQ
>>815
それ
0.00000164933…
って数
計算してるところが解らないから何ともいえないけど計算間違ってるだけじゃない?
818デフォルトの名無しさん:2015/02/01(日) 19:44:20.18 ID:ckgWNtQ3
もしかしてただ誤差が出てるのを正しい結果になってない!おかしい!って思ってるだけかも
819デフォルトの名無しさん:2015/02/01(日) 19:58:22.82 ID:6YUTF7Wm
>>815
>double型の桁数を超えたんでしょうか?

いいえ、違います。
計算上は何ら問題は起きていません。
820デフォルトの名無しさん:2015/02/01(日) 22:03:42.02 ID:sjXjc1T+
計算結果の正確さの保証を求めるなら浮動小数点型を使ってはならない
桁あふれじゃなくてもとんでもない結果が出たりする
821デフォルトの名無しさん:2015/02/01(日) 22:10:54.40 ID:lvVqp80y
数式上問題ないなら
不動小数点数の取り扱いが悪いとしか言いようがないような

後は実際のコード見なきゃなんとも言えない
822デフォルトの名無しさん:2015/02/01(日) 23:59:44.94 ID:zNKk2ZpT
>815
MINGWのG++ならば、doubleでなくて
long doubleを指定して4倍長計算をしてみたら
どうなりますか。
823デフォルトの名無しさん:2015/02/02(月) 03:12:19.44 ID:E0RD/vzJ
昔知り合いの会計士が
うちはPC二台でエクセルでそれぞれ同じ計算して
答え合わせしてるので完璧ですっ(キリっ)
って逝ってたの思い出した
824デフォルトの名無しさん:2015/02/02(月) 09:42:30.91 ID:nUUGZ8+L
>>823
検算してるだけだろ?
825デフォルトの名無しさん:2015/02/02(月) 11:20:39.19 ID:EZQev4rj
浮動小数点数の扱いを知らんで誤差出て可笑しいって言う人って
826デフォルトの名無しさん:2015/02/02(月) 15:05:44.82 ID:3eUmmy+n
>>823-824
同じデータと同じマクロを使ってペンティアムバグの対策するんだよな
当然だよな
827デフォルトの名無しさん:2015/02/02(月) 15:31:51.32 ID:WjiHP3OZ
片手にエクセル、片手に電卓 これでいく
828デフォルトの名無しさん:2015/02/02(月) 15:37:56.82 ID:nBismiQT
マクロのバグってのはありえるかもな
829デフォルトの名無しさん:2015/02/02(月) 15:47:58.62 ID:RH7feET7
>>827
唇に火の酒
背中に人生
830デフォルトの名無しさん:2015/02/02(月) 17:49:11.18 ID:DUpXUgxT
>>815
ども^^; 
知らなかったす0.00000164933だったなんて
831デフォルトの名無しさん:2015/02/02(月) 18:29:45.09 ID:nUUGZ8+L
>>828
喪黒のハグなら怖い。
832デフォルトの名無しさん:2015/02/02(月) 18:41:31.04 ID:2aaoC/Ew
>>829
じゅりー!ああジュリー、素敵!
833デフォルトの名無しさん:2015/02/02(月) 20:06:28.87 ID:9S8Foh71
喪黒ならハグよりドーンの方が怖い
834デフォルトの名無しさん:2015/02/03(火) 00:47:17.81 ID:Ol5Pkl9D
>>830
そもそもおまえ浮動小数点型使う必要ないんじゃね
桁数多いからってならlong long使えよ
835デフォルトの名無しさん:2015/02/03(火) 07:05:07.74 ID:2QvjDp7A
今の大学って実用数学とか計算機数学習わないの?
836デフォルトの名無しさん:2015/02/03(火) 08:07:41.01 ID:Ak6uoSi3
>>835
そんなうさんくさい講義は受けたことないわ
837デフォルトの名無しさん:2015/02/03(火) 08:10:35.59 ID:00JNNVea
customer
satisfaction
838デフォルトの名無しさん:2015/02/03(火) 10:23:01.06 ID:cHPe/D1w
VS2013で
for (int i = 0; i<1000; i++)
{
  auto nowS = std::chrono::system_clock::now();
  // 10秒前後掛かる重い処理 
  auto nowE = std::chrono::system_clock::now();
  auto millisec = duration_cast_milliseconds(nowE - nowS).count();
}
みたいな感じで
重い処理に掛かる時間を計測しているのですが、1000回繰り返して正常に終わる場合もあれば、
1000回繰り返すと、時々1,2回くらい計測時間がマイナスになるんですが、そんなこと有りますか?
839デフォルトの名無しさん:2015/02/03(火) 10:39:02.57 ID:N+AEw8su
steady_clockを使え
840デフォルトの名無しさん:2015/02/03(火) 13:24:52.25 ID:cHPe/D1w
>>839
ありがとうございました。steady_clockを試してみます。
841デフォルトの名無しさん:2015/02/03(火) 17:32:32.52 ID:cHPe/D1w
その後、steady_clockを使って試したのですが、以下のコードをWin7-64のVS2013でWinXP向けにビルドして
WinXP32SP3のマシンで実行するとやはり、マイナスの値が計測されました。このコードで何かおかしな部分ありますか?
だいたいいつもi=2000前後で発生します。でも、その後は、また正常に計測されます。再現実験に2,3時間かかるので
困っています。
#include <Windows.h>
#include <string>
#include <chrono>
#include <iostream>
using namespace std;
void main(){
for (int i = 0; i < 1000000; i++){
auto nowS = std::chrono::steady_clock::now();
Sleep(5 * 1000); // 5 sec
auto nowE = std::chrono::steady_clock::now();
auto millisec = std::chrono::duration_cast<std::chrono::milliseconds>(nowE - nowS).count();
cout << "i=" << i << endl;
cout << millisec << endl;
if (millisec < 0){
wstring msg = L"millisec=" + to_wstring(millisec);
MessageBox(NULL, msg.c_str(), L"マイナス", MB_OK);
}
}
}
842デフォルトの名無しさん:2015/02/03(火) 17:41:47.29 ID:Ii7aDZgi
>>841
初レスだが。ダメだったら確実なAPIを使えばいい。
マルチプラットフォームはchronoとwinAPIを切り替える部分を自作したらいい。
843デフォルトの名無しさん:2015/02/03(火) 18:20:52.61 ID:cHPe/D1w
>>842
レスありがとうございました。
WinAPIで確実なのはGetLocalTime()でしょうかね?
なお841をXP向けにReleaseビルドしたときはランタイムライブラリはマルチスレッド(/MT)
です。それ以外の設定はデフォルトだと思います。
844デフォルトの名無しさん:2015/02/03(火) 18:38:06.35 ID:q60KfZim
QueryPerformanceCounter と QueryPerformanceFrequency
845デフォルトの名無しさん:2015/02/03(火) 18:48:48.60 ID:nWWy4Uvl
>>841
1秒に一回現在時刻を取得して出力するプログラムを動かし続けたらどうなる?
コンピューターの時刻が戻っているのかプログラムがおかしいのかの切り分けはすべき
846デフォルトの名無しさん:2015/02/03(火) 20:33:54.88 ID:Sv24YYpg
コールバック処理をしたいのですが
C#でいうところのActionやdelegateは無いみたいなので困ってます
たすけてください
847デフォルトの名無しさん:2015/02/03(火) 20:41:14.57 ID:E7BKCiQp
>>841
GetSystemTimeAsFileTime()を使えばいいんじゃないかな?
848デフォルトの名無しさん:2015/02/03(火) 21:06:56.27 ID:N+AEw8su
>>846
std::function
849デフォルトの名無しさん:2015/02/04(水) 01:13:32.90 ID:VCpWnwFT
クラスAのprivateメンバにアクセスできるクラスBを内部的に使いたいんですが、
内部クラスを使うにせよフレンドクラスにするにせよ、クラスAのヘッダにクラスBの宣言は露出せざるを得ないもんでしょうか?
クラスAのサイズやらには影響しないので宣言を公開する必要まったくないのですが…。
850デフォルトの名無しさん:2015/02/04(水) 01:25:35.27 ID:WTx4SMA5
共有メモリを使ってプロセス間通信をしつつ、共有メモリ書き換え時に通知を出してイベント駆動したいんですが可能ですか?
851デフォルトの名無しさん:2015/02/04(水) 04:17:43.82 ID:kkq1LSla
>>849
外部からアクセスさせないためにprivateメンバにしてるんだろ。クラス定義の時点でfriendにもしてない内部クラスでもないクラスがアクセスできたら困るわ
ソースファイルに隠蔽したいなら、privateメンバの参照渡すなり何なりやりようはある
>>850
・共有メモリを監視して変更があったらイベントを実行する
・共有メモリとは別に名前付きパイプを使ってメッセージを送信し、受信したらイベントを実行する
どっちでもお好きなのを。どちらにせよイベント駆動する側のスレッドで何らかの監視はせにゃあかんよ
852デフォルトの名無しさん:2015/02/04(水) 11:34:39.12 ID:It97W8hu
>>841
VS2013のsteady_clockにはバグがあってシステム時刻に連動してるから使えないよ
時刻同期された時点でアウト
VS2015(プレビュー版)では修正したって記述があるけど、MSのことだから
VS2013は直さず放置かも
853デフォルトの名無しさん:2015/02/04(水) 12:06:06.38 ID:TJY7yLxX
>>852
そうみたいですね。
何日も連続で使っても正しく時刻を計測できる方法は無いのでしょうか?
どの方法でも、たとえバグが無くても、必ず上限がありますよね?
854デフォルトの名無しさん:2015/02/04(水) 12:32:09.25 ID:zDVY2b+V
>>844が挙げてるQueryPerformanceCounter と QueryPerformanceFrequencyは
カウンタの型が64ビット整数だから、精度が1ナノ秒と仮定しても200年以上持つ
初期化時点の日付を保持しておいて、現在日時が必要になったタイミングで
カウンタ値から経過時間を計算して日付に反映すればいい気がする

と思ったがXPだと時間計測にこいつらは使えないらしい
残念
http://d.hatena.ne.jp/shiku_otomiya/20100218/p1
855デフォルトの名無しさん:2015/02/04(水) 13:10:00.31 ID:It97W8hu
>>853
処理時間を計測するだけなら↓(のサンプルコードを参照)でいいと思う
https://msdn.microsoft.com/ja-jp/library/cc429827.aspx

1msの狂いもイヤとか49.7日以上掛かる処理時間を計測したいとかなら駄目だけど
856デフォルトの名無しさん:2015/02/04(水) 14:01:38.05 ID:bcJPu6wA
アホみたいな初心者レベルの質問なんだろうと理解しているけども
助けてほしい。
mbedでEthernetInterfaceライブラリを使ってUDP通信をするプログラムなんけども

char out_buffer[] = "Hello\n";
sock.sendTo(echo_server, out_buffer, sizeof(out_buffer));

これで文字列以外を送信する場合ってどうすれば良いの?
mbedにRJ-45のコネクタつなげて、実際にやってるんだけど
文字列は送れてもそれ以外の、例えばADコンバータで変換した電圧の数値とかを送る方法が分からない。
戻り値がintだったりする場合は、それを一度キャストしてやらないとダメなんですか?
ちな
http://developer.mbed.org/handbook/Socket
ここのUDP Echo Clientがソース全文です。
あとmbedでのプログラムの話なので
板違いだったらすいません
857デフォルトの名無しさん:2015/02/04(水) 14:23:36.96 ID:e5R1ECjv
int hoge = 846;
sock.sendTo(echo_server, (char *)&hoge, sizeof(hoge));
858デフォルトの名無しさん:2015/02/04(水) 14:42:54.62 ID:HaKHxANL
>>856
キャストすればいいんじゃない。sprintfで文字列として送ってもいいし。
859デフォルトの名無しさん:2015/02/04(水) 15:04:20.41 ID:bcJPu6wA
>>857-858
ありがとうございます
キャストで行けました。

これでLANオーディオもどき作成に戻れます
860デフォルトの名無しさん:2015/02/04(水) 16:18:54.28 ID:X9M7ENi6
教えてください。
親ウィンドウのあるボタンを押すと
子ウィンドウが出て(この間、親ウインドウの操作不可)
子ウィンドウを閉じると親ウィンドウに操作が移る。
こういうプログラムを作りたいのですが、いまいち分かりません。
ウィンドウを一時的に操作不可にする命令などあるのでしょうか?
861デフォルトの名無しさん:2015/02/04(水) 16:22:07.49 ID:+U2BPPPk
>>860
DialogBox
862デフォルトの名無しさん:2015/02/04(水) 16:23:22.40 ID:HaKHxANL
ただしそういうことはできるだけ控えろと言う。
863デフォルトの名無しさん:2015/02/04(水) 16:24:32.67 ID:YTblBMcd
>>860
「モーダルダイアログ」でググればおk
864デフォルトの名無しさん:2015/02/04(水) 16:36:13.74 ID:X9M7ENi6
>>861
>>863
調べてみます。ありがとう。
865デフォルトの名無しさん:2015/02/04(水) 18:32:06.27 ID:xIWm3ZJG
ソース見てて、
a->exit();
みたいなのは、ああ、A* a=new A();という感じで宣言したんだなと分かるのですが、
a()→exit();
という形になるのがよくわからないです。どういう時にこうなるんでしょうか?
866デフォルトの名無しさん:2015/02/04(水) 18:35:15.77 ID:tLaUN7Vd
関数aの返り値がポインタ
(aがクラスでoperator ()が定義されてる場合なども含め)

A* a(){
static A s;
return &s;
}
867デフォルトの名無しさん:2015/02/04(水) 18:49:49.64 ID:wQefkSeY
そういう場合は参照にしろよって話だな。
ポインタの場合nullが返るかどうかわからないからそんな呼び方出来ない
868デフォルトの名無しさん:2015/02/04(水) 19:27:59.73 ID:yFnBLuNb
> ポインタの場合nullが返るかどうかわからないからそんな呼び方出来ない

はぁぁぁ???
a->exit(); のaがnullかどうかの話と何が違うんだ
869デフォルトの名無しさん:2015/02/04(水) 19:33:14.64 ID:PGYlb/p8
>>867
this が null でも問題なくメンバ関数を呼ぶことができる、C++ ならば
870デフォルトの名無しさん:2015/02/04(水) 19:41:32.62 ID:wQefkSeY
>>868
aがnullかどうかは自分でポインタ取るんだから解るだろ
他からポインタ受け取るときnullが許されないなら参照にしろって話

>>869
thisがnullでも呼んで大丈夫な関数を普通のメンバー関数にすんなstaticにしろ
871デフォルトの名無しさん:2015/02/04(水) 19:44:23.01 ID:S0wmMYUB
>>870
> 自分でポインタ取るんだから解るだろ

void foo(A *a) {a->exit();}
872デフォルトの名無しさん:2015/02/04(水) 19:45:39.09 ID:wQefkSeY
>>871
2行目も読めないの?
873デフォルトの名無しさん:2015/02/04(水) 19:46:51.26 ID:PGYlb/p8
>>870
>thisがnullでも呼んで大丈夫な関数を普通のメンバー関数にすんなstaticにしろ
それは Java, C# に毒されているとしか、C/C++ の世界ならば当たり前の仕様
874デフォルトの名無しさん:2015/02/04(水) 19:46:57.57 ID:S0wmMYUB
>>872
すまんw
875デフォルトの名無しさん:2015/02/04(水) 19:49:41.18 ID:wQefkSeY
>>873
> それは Java, C# に毒されているとしか、C/C++ の世界ならば当たり前の仕様
C++はともかくCでnullのメンバー呼んで(?メンバー変数へのアクセス?)大丈夫ってどんな場合だよ
876デフォルトの名無しさん:2015/02/04(水) 19:50:58.46 ID:HaKHxANL
ぬるぽチェックをしない人が集まるスレはここですか?
877デフォルトの名無しさん:2015/02/04(水) 19:53:13.09 ID:tLaUN7Vd
C++なんだろうけど
やっぱstaticにしてほしいよなあ
878デフォルトの名無しさん:2015/02/04(水) 20:16:45.46 ID:PGYlb/p8
>>875
OO でない C が記述にあるというだけで揚げ足とりに走る必死さw
879デフォルトの名無しさん:2015/02/04(水) 20:32:44.63 ID:FmLt4Q/z
>>869
> this が null でも問題なくメンバ関数を呼ぶことができる、C++ ならば

そうなんだっけ?
仮想メンバ関数だったらどうなるんだ?
880デフォルトの名無しさん:2015/02/04(水) 20:35:38.26 ID:wQefkSeY
>>878
は?OOとか関係無いんだけど
881デフォルトの名無しさん:2015/02/04(水) 20:38:37.81 ID:wQefkSeY
>>879
死ぬ
882デフォルトの名無しさん:2015/02/04(水) 20:47:18.03 ID:FmLt4Q/z
>>875
メソッド自体は存在するから仮想じゃなければ大抵大丈夫

>>881
だよね、そもそも仮想じゃないケースだとして
> this が null でも問題なくメンバ関数を呼ぶことができる、C++ ならば
これって保証されてるんだっけ?
883デフォルトの名無しさん:2015/02/04(水) 20:55:26.36 ID:PGYlb/p8
>>879
これはやられたね‥
884デフォルトの名無しさん:2015/02/04(水) 21:42:07.02 ID:Azmp6pfC
>>867
>ポインタの場合nullが返るかどうかわからないからそんな呼び方出来ない

いやそれはおかしい。
参照の場合nullptrを返すことが不可能だが
ポインターの場合でもnullptrの可能性が有るかどうかは仕様書読めばわかる。
不安なら
a()->exit(); // a() never returns null
と書いときゃいいだけ
885デフォルトの名無しさん:2015/02/04(水) 22:23:28.12 ID:wQefkSeY
>>884
そりゃそうだけど参照にしとけばドキュメントに書く必要すらないし
886デフォルトの名無しさん:2015/02/04(水) 23:49:32.47 ID:MGLmZlif
>>882
保証されてないはず。
struct X
887デフォルトの名無しさん:2015/02/04(水) 23:54:04.83 ID:MGLmZlif
途中で書き込んじまった
struct X
{
void f() {}
};

int main() {
X* x = nullptr;
x->f();
}

このx->f();は(*x).f();のシンタックスシュガーだから、nullポインタのxをデリファレンスしてる時点で未定義動作
だから例えばfが呼ばれる前にabortする処理系があってもおかしくないはず
888デフォルトの名無しさん:2015/02/05(木) 00:01:35.89 ID:OFR6zSUU
昔C++はCに変換してコンパイルされてたとか聞く
すると
X::f()は
f(X*)に変換されたのかもしれない
889デフォルトの名無しさん:2015/02/05(木) 00:07:54.97 ID:3Yv7qBda
今もそんなに変わらんだろう
eaxレジスタにthis入れて関数呼んでるだけだ
890デフォルトの名無しさん:2015/02/05(木) 00:14:12.11 ID:SXN3g1Ol
もう時代は64ビットだし、raxレジスタって言うべきじゃないかな
891デフォルトの名無しさん:2015/02/05(木) 00:28:38.37 ID:Iop/4SxL
>>886-887
だよね、メンバー変数触らなきゃ大抵問題ないと思うけど...
892デフォルトの名無しさん:2015/02/05(木) 00:49:08.62 ID:l8QaN41D
>>888
昔、というか今もリンク時にはC言語形式の f(X*)になっている
893デフォルトの名無しさん:2015/02/05(木) 01:00:21.83 ID:Tp9Oo/Vo
>>892
C言語形式の関数のシンボル名は引数自体ないんだけど
894デフォルトの名無しさん:2015/02/05(木) 01:02:07.56 ID:SXN3g1Ol
C関数の引数はスタックに積んで、thisポインタはraxに積む処理系だってある
マングリングした名前で静的ライブラリから関数ポインタと取得して、そのままC関数としてcallできる保証なんざどこにもない
C言語形式のってのは不適切じゃないかね
895デフォルトの名無しさん:2015/02/05(木) 01:03:17.81 ID:SXN3g1Ol
静的ライブラリじゃねえや、動的ライブラリだ
896デフォルトの名無しさん
例外が何のために導入されたのか良く判った