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

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

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2014/11/28(金) 21:54:52.02ID:QcGoPiaz
エスケープシーケンスや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/
0002デフォルトの名無しさん2014/11/28(金) 21:55:19.03ID:QcGoPiaz
テンプレここまで
0003デフォルトの名無しさん2014/11/28(金) 23:10:20.05ID:/kbuZX05
いまのところ、統計的に一番需要が大きいのはどのOSですか?
0004デフォルトの名無しさん2014/11/29(土) 03:30:55.83ID:SoXvwZNw
               ノ      ゚.ノヽ  , /}      ...
            ,,イ`"     、-'   `;_' '    ..::::::::::::::...
   ,-、  _.._   (        (,(~ヽ'~     ..:::::::::::::::::::::::
 )'~  レー'  〉   ヽ       i`'}       .:::::::::::::::::::::::
 ~つ     '-ー、  i       | i'     ...:::::::::::::::::::::::
 /       <  /     。/   !  ......:::::::::::::::::::::::::    これは>>1乙じゃなくて
/         ~^´     /},-'' ,●::::::::::::::::::::::::::::::::::::
i、        ,i' _,,...,-‐-、/    i  ::::::::  .:::::::::::::
..ゝ        <,,-==、   ,,-,/      .:::::::::::            放射能がうんたら
 )       {~''~>`v-''`ー゙`'~       ..:::::::::                          ........::.
 {        レ_ノ            ..::::::::.                         ......:::::::::
ノ         ''           ..:::::::                        ...::.:...:::::::::
                     .:::::::::                     ...:......:::::::::::: .
                    .:::::::::::.        .....      ..  ..::::::::::::::::::::::::   :::.
                    ::::::::::::::::.::::::....:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::.. ::  ::..
                    .:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::    ::.
                    ::::::::::::::::: :::::::::::::::::::::::::::::: :::::
                          .::    ::.  :::
0005デフォルトの名無しさん2014/11/30(日) 06:07:00.87ID:KU6YIKgX
>>3
windodws7 32bit
0006デフォルトの名無しさん2014/11/30(日) 06:08:23.21ID:b4nmdqGs
スレだぶってるよ
0007デフォルトの名無しさん2014/11/30(日) 15:37:07.41ID:2hiiWexa
今時32ビット使ってるのは労害エロゲーマーかNEC社員ぐらいだろ
0008デフォルトの名無しさん2014/11/30(日) 20:06:36.53ID:HpzzSpTs
保守上げ
0009デフォルトの名無しさん2014/11/30(日) 23:20:16.87ID:dPZ+5hvT
初心者死ねよ
0010デフォルトの名無しさん2014/12/01(月) 04:11:40.74ID: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;
}

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

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

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

で大丈夫なの?
0033デフォルトの名無しさん2014/12/03(水) 03:29:04.25ID:DGNVFO0Q
aの寿命にさえ気を付ければ
0034デフォルトの名無しさん2014/12/03(水) 18:17:41.63ID:WxiYAD3t
クラスのコピーを禁止したい
クラスの生成を関数の返り値に制限したい
これって両立不可?
0035片山博文MZ次期CEO ◆T6xkBnTXz7B0 2014/12/03(水) 18:19:43.77ID:ZVIn2no0
friend関数
0036デフォルトの名無しさん2014/12/03(水) 18:25:14.76ID:ZoY3w5R8
コンストラクタとコピーコンストラクタをprivateに
生成はファクトリーパターンで
0037デフォルトの名無しさん2014/12/03(水) 18:42:13.82ID:WxiYAD3t
http://codepad.org/Wbn8rOh1
どうするんでしたっけ・・・
0038デフォルトの名無しさん2014/12/03(水) 18:42:54.40ID:o987ZOaf
c++ではクラスはコピーできないし、生成もできない。
出来るのは宣言と定義。
0039デフォルトの名無しさん2014/12/03(水) 19:00:43.60ID:6lRqEEU9
gen()をAのメンバーにする
A()もprivate
0040デフォルトの名無しさん2014/12/03(水) 19:06:41.38ID:WxiYAD3t
http://codepad.org/jKSVjg1L
ダメみたいですが・・・?
0041デフォルトの名無しさん2014/12/03(水) 19:15:09.69ID:GXUScfW3
ttp://ideone.com/T8BCmX
いけたで
0042デフォルトの名無しさん2014/12/03(水) 19:18:51.17ID:EEGJ9Grg
c++でクラスを毎回newして使うのと、パブリックなサブルーチンの関数を呼び出して使うのでは、
後者の方が早いんでしょうか。
0043デフォルトの名無しさん2014/12/03(水) 19:19:50.19ID:ZoY3w5R8
その程度なら最適化で消えそうだが
0044デフォルトの名無しさん2014/12/03(水) 19:35:04.81ID:WxiYAD3t
>>41
やっぱコピーコンストラクタを開放するしかないっすかね
0045デフォルトの名無しさん2014/12/03(水) 19:47:07.20ID:6lRqEEU9
ポインタで返すのは駄目なのか?
0046デフォルトの名無しさん2014/12/03(水) 19:47:35.07ID:GXUScfW3
>>44
コピーコンストラクタはprivateだけど
0047デフォルトの名無しさん2014/12/03(水) 19:49:41.30ID:+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 );
}
0048デフォルトの名無しさん2014/12/03(水) 19:53:27.23ID:+PNtgzjY
Bar &aが嫌なら
class Bar_ {
// 中は同じ.
};
typedef Bar_ &Bar;
でBar_::generate();とか。

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

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

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


boostはあくまで外部ライブラリだから!言語として考えるものじゃないから!
0059デフォルトの名無しさん2014/12/04(木) 07:43:08.18ID:4D2VbvpK
ただ、現実には自分の好みが許されることなど決してなく
どこかの誰かの意味不明な好みを押し付けられる!
0060デフォルトの名無しさん2014/12/04(木) 07:48:13.59ID:UwyMS5sV
2014年11月30日 日本家電の崩壊の原因
http://takedanet.com/archives/1014633741.html
https://www.youtube.com/watch?v=xBTfDX--vVs
0061デフォルトの名無しさん2014/12/04(木) 09:19:18.83ID:ILmf5FI6
c++で a って言うフォームが有って、これがインスタンス化されているかを調べる時は、

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

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

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

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

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

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

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

・・・

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

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

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

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

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

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

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

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

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

最初にASCIIやSJISで認識して、そのあと実はUTF-8に更新されると化ける
まあUTF実装の不具合じゃないけど、直面するとバグだー不具合だー実装者無能と騒がれる
0107デフォルトの名無しさん2014/12/11(木) 08:30:52.22ID:g7NuR/qo
開発に鬼の首を取ったように煽りにいくバカが蔓延しているからエディタ名は言わないからな
もとの質問と違うしね
0108デフォルトの名無しさん2014/12/11(木) 08:31:27.93ID:Efs37Jrl
UTF-8 に BOM が?
0109デフォルトの名無しさん2014/12/11(木) 08:42:55.64ID:RrJEy+mk
え!!おなじUTF-8でBOMを!?
0110デフォルトの名無しさん2014/12/11(木) 09:22:23.87ID:pDWjQEFu
if(a && (!b)) は
if(a && !b) と書いても同じですよね?
0111デフォルトの名無しさん2014/12/11(木) 09:32:51.12ID:vPIcYGSk
>>110
https://ja.wikipedia.org/wiki/%E6%BC%94%E7%AE%97%E5%AD%90%E3%81%AE%E5%84%AA%E5%85%88%E9%A0%86%E4%BD%8D#.E3.83.97.E3.83.AD.E3.82.B0.E3.83.A9.E3.83.9F.E3.83.B3.E3.82.B0.E8.A8.80.E8.AA.9E
0112デフォルトの名無しさん2014/12/11(木) 09:54:27.64ID:pDWjQEFu
>>111
ありがとうございました。
良く迷うので、あえて
if(a && (!b))
のように書くことにします。
0113デフォルトの名無しさん2014/12/11(木) 10:30:00.39ID:HAPX7Bnj
>>112
それが正解
0114デフォルトの名無しさん2014/12/11(木) 15:03:37.93ID:lvwk8IPr
可読性だな
0115デフォルトの名無しさん2014/12/11(木) 15:16:39.75ID:+X5/HCeV
>>106
> まあUTF実装の不具合じゃないけど、

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

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

このスレもう嫌だ
0120デフォルトの名無しさん2014/12/11(木) 18:32:15.94ID:g7NuR/qo
この子鳥羽通り
そう思うんだったら、そうなんだろうな
と。
0121デフォルトの名無しさん2014/12/11(木) 20:23:43.57ID:A1vk36Nn
Unicode 7.0ではUTF-16のBOMに相当するUTF-8のシグネチャーは
「<EF BB BF>と言うシーケンス」という表現になっていて
BOMという用語は避けているようだ。
3.10章D95, 23.8章
0122デフォルトの名無しさん2014/12/11(木) 20:32:47.37ID:Knr7owVD
ボマーつかまえた
0123デフォルトの名無しさん2014/12/11(木) 20:46:37.82ID:3e12kUSR
VSでUTF-8が文字化け
↓
まだ普及途中の文字符号化方式だから不具合も希にある
↓
じゃあその不具合の一例を出してみろ
↓
つい最近そのバグ見つけて報告したらパッチ出たよ
↓
具体的に
↓
(世の中の)エディタが文字化けを起こしやすい。
俺のプログラムに非が無いのにバグと言われた経験ある。

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

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

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

private:
   ここ
}

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

の時、privateの所に、

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

オブジェクト指向を知らないなら、
スッキリわかる Java入門 第2版、2014を読んでみ
0169デフォルトの名無しさん2014/12/13(土) 08:26:59.44ID:HH3VwBsv
using でばら撒ける利点と欠点があるのが namespace
0170名無しさん@そうだ選挙に行こう2014/12/13(土) 12:15:56.11ID:hd+JAN++
すたちっく・めそっど?
0171名無しさん@そうだ選挙に行こう2014/12/13(土) 13:32:49.82ID:uSXcAy/+
忘れるのがやな人はnamespace を使わないんだって
0172名無しさん@そうだ選挙に行こう2014/12/13(土) 16:09:08.14ID:uXNkXewX
staticおじさんかな?
0173名無しさん@そうだ選挙に行こう2014/12/13(土) 23:59:15.84ID:br/4A+04
しっくりこない
0174名無しさん@そうだ選挙に行こう2014/12/14(日) 04:39:03.82ID: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が表示されるので
演習問題でもいけるか?とも思ったのですが・・・
0175名無しさん@そうだ選挙に行こう2014/12/14(日) 04:40:39.05ID:GV6oAgHg
ちなみにポインタはまだ習っていないとの前提で解く問題です。
0176名無しさん@そうだ選挙に行こう2014/12/14(日) 04:43:13.68ID:GV6oAgHg
ちなみにこの本の筆者は関数にはポータビリティを持たすべきだと各所で主張しているので
int型を指定したのはその関連なのかなとも思うのですがどうなのでしょう
0177名無しさん@そうだ選挙に行こう2014/12/14(日) 04:52:47.80ID:ATeR7lG0
本がクソ
0178名無しさん@そうだ選挙に行こう2014/12/14(日) 04:58:12.55ID:GV6oAgHg
>>177
それが答えなら納得できるんですけどね。
この演習問題の次の問題でも同様に検索する文字をint型で引き受けるように
仮引数が指示されてるんで、何か意味があるのかと思ってしまうんです
0179名無しさん@そうだ選挙に行こう2014/12/14(日) 04:58:57.42ID:7UFBlXTF
getcharの戻り値がintだからとか?
0180名無しさん@そうだ選挙に行こう2014/12/14(日) 05:07:34.06ID:GV6oAgHg
>>179
この解答ではgetchar関数は使っていません
0181名無しさん@そうだ選挙に行こう2014/12/14(日) 05:14:39.78ID:7UFBlXTF
だからもしsscanfをgetcharに変えたりするときに変更しなくてもいいように
01821742014/12/14(日) 05:27:25.96ID:l0UGMelp
連投規制に引っかかったのでIP変えました
>>181
気づきませんでした
ごめんなさい
なるほどです

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

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

printf("%d\n", sizeof('a'));     // C言語では4(intが4byteの場合)になる。
                     //なおC++だと1になる
0190名無しさん@そうだ選挙に行こう2014/12/14(日) 08:04:38.76ID:/W5tLUsz
単にC言語の‘a’がint型だから。
それ以上でも以下でもない
0191名無しさん@そうだ選挙に行こう2014/12/14(日) 08:25:23.41ID: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]に合わせたものですが、
あまり使われる表現ではありません。
まあ間違いではないと思います。
0192名無しさん@そうだ選挙に行こう2014/12/14(日) 08:42:25.21ID:qWIyAP97
まあ、若いうちはintやcharやそういうのが気になるんだな。
いつか、そんなのは気にならなくなるよ。動けばいいんだよ。
0193名無しさん@そうだ選挙に行こう2014/12/14(日) 08:46:12.06ID:4Q3P90q+
>C言語では関数引数のcharはintに昇格されるから
以前もこういうこという人いたよな
ソース出せといわれて出せなかったけど
ISO/IEC 9899:2011の6.5.2.2読んでから出直した方がいい
01941742014/12/14(日) 08:48:21.05ID: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
0195名無しさん@そうだ選挙に行こう2014/12/14(日) 09:41:14.99ID:hOKj1DJv
charは1バイトの整数なんだから、文字型って読んでるだけで文字でも何でもねえんだよ
0196 ◆QZaw55cn4c 2014/12/14(日) 12:16:29.02ID: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
どこ読んでんだ?
0197名無しさん@そうだ選挙に行こう2014/12/14(日) 13:18:20.07ID:/W5tLUsz
それってプロトタイプに型が宣言されてないprintfみたいな関数は整数は格上げされるしfloatはdoubleにされるって話じゃねーの?

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

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

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

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

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

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

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

_DEBUG_ONLY(printf("デバッグ i=%d\n", i));
0239デフォルトの名無しさん2014/12/16(火) 10:51:27.17ID:cBSRYRo6
>>238 予約識別子使うな
0240デフォルトの名無しさん2014/12/16(火) 10:54:10.77ID:WAE7fsVo
>>238
ありがとうございます。片山先生に教えていただけるとは光栄です。
早速使わせていただきます。
_DEBUG_ONLY(x)は長いのでD(x)にしました。
0241デフォルトの名無しさん2014/12/16(火) 12:01:54.23ID:8Ehx8+/f
>>238
よい
0242デフォルトの名無しさん2014/12/16(火) 12:22:24.48ID:sfpQIcv2
fprintf(stderr, __VA_ARGS__)
じゃないの
0243デフォルトの名無しさん2014/12/17(水) 06:08:32.12ID: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で出力の ":" の位置を揃えたいので上のようなのを試したのですが、文字列の中に全角文字があると
ずれてしまいます。どうすれば良いでしょうか?
0244デフォルトの名無しさん2014/12/17(水) 06:49:06.64ID:hbZ0TZdX
なんで%-10sを使わないんだ?
それはさて、どの途プロポーショナルフォントなら揃わないだろ。
0245デフォルトの名無しさん2014/12/17(水) 07:45:20.75ID:JT1Z8OMa
>>244
>なんで%-10sを使わないんだ?
そうですね、それでも良いのですが、兎に角、位置を揃える方法ありますか?
どんなに変な方法でも構いません。
0246デフォルトの名無しさん2014/12/17(水) 07:54:26.07ID:OmIW45Ki
>>245
グラフィックとして文字を表示、かな。
0247デフォルトの名無しさん2014/12/17(水) 07:54:36.84ID:SKijSNg0
想定している端末上での全ての文字について
表示幅を配列にでも格納しておき、それを使って計算する。
0248デフォルトの名無しさん2014/12/17(水) 07:57:48.19ID:JT1Z8OMa
表示はVSのコンソールウインドウです。
あるいはファイルに出力する場合もあります。
使うフォントはMSゴシックです。
この前提で、何か良い方法ありますか?
0249デフォルトの名無しさん2014/12/17(水) 09:46:07.25ID:ljfuwyTd
.size() の所だけマルチバイトに変換して呼び出すくらいかな〜
0250デフォルトの名無しさん2014/12/17(水) 10:10:45.50ID: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
*/
0251デフォルトの名無しさん2014/12/17(水) 11:00:20.78ID:JT1Z8OMa
>>249>>250
レスありがとうございました。
wstringでやりたいのですが、無理そうですね。
0252デフォルトの名無しさん2014/12/17(水) 12:14:17.97ID:ev+qw7pl
そもそも一文字が同じ幅って原則がないのに無理だろ。
0253デフォルトの名無しさん2014/12/17(水) 12:39:49.74ID:1UMPa1MZ
>>251
前提から、全角文字の表示幅が半角文字の環境なんだから
表示したい文字列の一つ一つの文字種を調べて、全角なら半角2文字文として表示幅を計算すればいい

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

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

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

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

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

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

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

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

Koo koo;
koo.del();

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


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

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

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

あのさあ…

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

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

C で malloc()/free() をラップするように、C++ では延々と new をオーバーロードするのが、回り道のようにみえて手っ取り早い
0322デフォルトの名無しさん2014/12/21(日) 13:47:29.36ID:XqMqoIPN
訂正します
と>>310で述べているものを
>>303の主張がおかしいと称して
話を混乱させる>>321であった
0323デフォルトの名無しさん2014/12/21(日) 15:49:15.34ID:OSCBEJaL
>>314
世界の
0324デフォルトの名無しさん2014/12/22(月) 07:46:30.88ID:rVdLl1iU
Wikipediaには
「配置new (プレースメントnew, placement new)は、new演算子からnew演算子関数へ引数を与えられる機能である。
 当初、インスタンスを特定のメモリアドレスに「配置」するための機能ということで配置newと命名された。
 後に配置に限らず様々な使い道に応用できることが明らかとなったものの、今でも慣習的に配置newと呼ばれる。」
とか書いてあるが、初めて聞いたぞこんなの。
0325デフォルトの名無しさん2014/12/22(月) 08:22:09.63ID:kdPOQGvB
>>318
ところで、配置newではないnewのオーバーロードってどういうものを言うんだろう?
0326デフォルトの名無しさん2014/12/22(月) 08:47:45.78ID: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」と呼ばれることがあるらしい。
個人的にはあんまり納得できないけど。
03273182014/12/22(月) 09:34:43.95ID:UkKFD8pd
>>325
メモリリーク検出とあったので
struct STest0 {
 void * operation new (std::size_t s) {
  …//ログhere
  return ::operator new (s);
 }
};
のシリーズのつもりで書いた
これをオーバーロードと呼ぶかどうかは確認せずに掻いた
0328デフォルトの名無しさん2014/12/22(月) 20:48:10.59ID:PJrTpgsR
まぁ「無能は黙ってろ」とか言うやつは叩かれても仕方が無いな
人のふり見て我がふり直せだな
0329デフォルトの名無しさん2014/12/22(月) 22:00:28.03ID:3C7mXd7r
>>327
::operator new 自体をラップして delete と対にしたいところだ
0330デフォルトの名無しさん2014/12/22(月) 22:57:33.43ID:kdPOQGvB
>>329
>>327は省略してるだけで、当然、対応する operator delete も定義するんだと思うが。
このうえさらにグローバルな ::operator new をラップするのって何か役立つのかね?
というかそれ以前に、どこでラップするんだろう。
0331デフォルトの名無しさん2014/12/22(月) 23:30:14.04ID:3C7mXd7r
>>330
デバッグ時限定で、delete 忘れがないか、あるいは二重に delete していないか、チェックしたいところだが
そういうときに ::operator new や ::operator delete あるいは ::operator new[], ::operator delete[] をオーバーライドして、これらのチェックをコードで確かめておくのはよくあることだと思うけれども
0332デフォルトの名無しさん2014/12/22(月) 23:48:51.17ID:5zcMGUms
>>331
delete直前でassert p != NULL
delete直後にp = NULLじゃあかんの?
0333デフォルトの名無しさん2014/12/23(火) 00:02:45.08ID:BjZtfoSn
アドレスをダンプしておいてどこで確保されさものか分けるようにするとかの発想は無いのか
0334デフォルトの名無しさん2014/12/23(火) 00:11:00.59ID:ghEK2YZT
>>330-333
そんなごちゃごちゃしなくてもスマートポインタ・標準コンテナ使えば大方解決する問題じゃないの?
0335デフォルトの名無しさん2014/12/23(火) 00:18:43.98ID:dkZcT41A
>>331
それは>>327でもできるんじゃないの?というかそのための>>327でしょ。
そのかわりに ::operator new でやるというのはあるだろうけど、それぞれ得失はあるよね。
::operator new を置き換えたら元の ::operator new は使えないから、メモリ管理全部自前で
実装しなきゃならないんじゃなかったかな?
0336デフォルトの名無しさん2014/12/23(火) 00:40:32.00ID:4lbeIKul
>>334
流れ無視?
0337デフォルトの名無しさん2014/12/23(火) 01:10:04.67ID:wokCfcTD
<まとめ>
生ポでメモリリーク検出したい
 ↓
配置newでおk
 ↓
配置newは関係ないだろ
 ↓
オーバーロードの間違いでした。例えば>327
 ↓
グローバルnew使うのがフツー
 ↓
クラスメンバーのnewでいいだろ
 ↓
スマポ使えば? ←アスペ
0338デフォルトの名無しさん2014/12/23(火) 04:39:12.70ID:n6FqVsoT
プレースメントnew結構つかうな
普段はnewするだけのクラスで、そのオブジェクトを管理するオブジェクトの削除時に一気に全削除するようなとき
VirtualAllocで十分なメモリ空間リザーブして必要に応じてコミット拡張、実際の解放はdeleteでやらずVirtualFreeで全領域リリースとか
0339デフォルトの名無しさん2014/12/23(火) 08:09:35.89ID:ATuB6kuL
>>335
>メモリ管理全部自前で実装しなきゃならないんじゃなかったかな?
まあ、そういうことだが、そんなに大変じゃない‥
0340デフォルトの名無しさん2014/12/23(火) 09:31:59.72ID:wii8BwF3
>>338
そのような用途のために
std::vector<T, ★>
コイツがあるんじゃないの
0341デフォルトの名無しさん2014/12/23(火) 13:01:39.97ID:Hv7cUDq/
>>337
生ポでメモリリーク検出したい に スマポ使えば?
これ、日本のマなら普通だろう。
コミュ能力なくて他の仕事に就けない奴でもマには普通になれるし
0342デフォルトの名無しさん2014/12/23(火) 13:30:13.09ID:1GUI4T67
要件は「メモリリークを検出したい」であって「メモリリークを防ぎたい」じゃないでしょ
0343デフォルトの名無しさん2014/12/23(火) 13:34:41.39ID:zn+tl5Qa
visualstudio使えば簡単に検出してくれる
だがや
0344デフォルトの名無しさん2014/12/23(火) 14:05:30.06ID:BwyGxBnA
>>341
コミュ能力 ないの?
生ポのメモリリークから始まって、new演算子オーバーロードによる
フック的な使い方の実現方法の話になっていた矢先に
>>334がスマポとか言い出したから
>>336が「流れ無視?」と言ったんだよ。
0345デフォルトの名無しさん2014/12/23(火) 14:24:35.93ID:7c77wjGC
>>341に無いのはコミュ能力じゃなくて、
初歩的なところの理解力だと思うがw
0346デフォルトの名無しさん2014/12/23(火) 16:20:07.71ID:gTJoh1O6
ライブラリを探していますが,ここで聞いても良いですか?
0347デフォルトの名無しさん2014/12/23(火) 16:24:39.67ID:zkNCry36
釣りはいりません
スマホとPCでIPと文体変えて
自作自演するんだろ?
0348デフォルトの名無しさん2014/12/24(水) 00:16:43.51ID: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でオーバーライドできない、
なんてことがあった時代がありますか?(←質問)
おぼろげながら、十数年前はそういう理解だったのですが、
それは当時も俺が勝手に勘違いしてただけでしょうか。
0349デフォルトの名無しさん2014/12/24(水) 00:18:40.64ID:89gWHyFb
いいえ
0350デフォルトの名無しさん2014/12/24(水) 00:18:58.95ID:ndV3e2Ga
>なんてことがあった時代がありますか?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ゲームルールの方で対処してはいかが?
0427デフォルトの名無しさん2014/12/31(水) 14:19:33.15ID:oAGy3gWf
サーバーなしで接続判定するのは難しいのでは。対等でなく長くつないだ実績のあるところに判定させるとかは。
0428デフォルトの名無しさん2014/12/31(水) 14:34:28.85ID:oy55ZnpW
bitcoin式に幾人かの監視者第三者を用意すればいい。
報酬は対局中の発声権(チャットの文字数)とか本筋に作用していいなら消費型の運パラとか
0429デフォルトの名無しさん2014/12/31(水) 14:45:55.07ID:oAGy3gWf
bitcoin式でも送受信のバグをつかれてマウントゴックスは潰れたが。
上手いこと運営側で対処したら出来たようだが。
当初から知られてたセキュリティ・ホールだったようだが。
0430デフォルトの名無しさん2014/12/31(水) 15:00:49.66ID:oAGy3gWf
ビットコインの送金に失敗したか成功したかわからなくさせる攻撃だったはずだが名称忘れた。
ビットコイン本体で改善されたか調べようとしたがわからん。
マウントゴックスは、顧客から送信に失敗したので再送して下さいという
シグナルが出ると自動で再送して、何度も送金してたのに放置してたらしい。
0431デフォルトの名無しさん2014/12/31(水) 15:00:55.10ID:oy55ZnpW
が。
が。
が。
0432デフォルトの名無しさん2014/12/31(水) 15:41:44.30ID: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
0433デフォルトの名無しさん2014/12/31(水) 17:17:57.18ID:sgzK7Ywh
ぬるぽ
0434デフォルトの名無しさん2014/12/31(水) 17:23:12.74ID:dkqWrKiB
だがだがだが
0435デフォルトの名無しさん2014/12/31(水) 22:37:12.37ID:1CgnRKKQ
ポインタへの参照を返却するには?
int*& foo()
{
 static int bar;
 return &bar;
}
ではなぜダメなの?
0436デフォルトの名無しさん2014/12/31(水) 23:04:04.46ID:oy55ZnpW
アドレスを格納した参照先がないからだよ
0437デフォルトの名無しさん2014/12/31(水) 23:08:37.04ID: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;
}
じゃないのか?
0438デフォルトの名無しさん2014/12/31(水) 23:54:35.55ID:1CgnRKKQ
>>437
ご丁寧に解説して頂いて、ありがとうございます。
0439デフォルトの名無しさん2015/01/01(木) 09:52:57.50ID:kIsn05xG
wstring 文字列を
unsigned char配列に変換したいのですが、ググッても良く分りません。
お勧めの変換方法を教えて下さい。
0440デフォルトの名無しさん2015/01/01(木) 10:48:31.69ID:uA7/S4Xl
>>439
L"あいう"
これをunsigned char[] にしたときに
どのような結果を期待しているのか述べたまへ
0441デフォルトの名無しさん2015/01/01(木) 10:51:32.08ID:kIsn05xG
>>440
"あいう"
だと全部で6バイトだと思うので、その6バイトの値を
unsigned char[] 配列に入れたいのですが。
0442 【小吉】 【1286円】 2015/01/01(木) 11:48:00.85ID:g7S+XSL4
リトルエンディアンとかビッグエンディアンとか

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 return 0;
}

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

どちらも呼ばれていないようなんです。
0519デフォルトの名無しさん2015/01/04(日) 20:57:08.99ID:AMdUkF9B
そういう釣りは要りません
0520デフォルトの名無しさん2015/01/04(日) 20:57:29.24ID:nrY/dO4R
RVOでコピーコンストラクタが呼ばれてないだけ
0521デフォルトの名無しさん2015/01/04(日) 21:21:20.32ID:j/60c7YT
>>519
釣りだと思うなら、書き込まなければよくね?
そうじゃないかもしれないじゃん
0522デフォルトの名無しさん2015/01/04(日) 21:32:17.55ID:oRJJvZ0W
>>518
・operator=ではありません
・Fooにムーブコンストラクターが有る場合はムーブコンストラクターで初期化されます
・Fooにムーブコンストラクターが無い場合はコピーコンストラクタで初期化されます
・でもコンパイラーの気分次第でどちらも呼ばれないことがあります
0523デフォルトの名無しさん2015/01/04(日) 23:54:27.39ID: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の位置に構築
}
0524デフォルトの名無しさん2015/01/05(月) 00:42:51.59ID:Z4kH2usD
おー凄いですね、
ありがとうございます。

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

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

>>547
三項演算子は Lisp 由来とはいいにくい、とはC/C++関連スレではよく言われるところ
0549デフォルトの名無しさん2015/01/06(火) 09:51:10.70ID:2O/Tv4gz
stringのsizeとlengthは同じだと思うのですが、
適当に両方を使うので、ソースの中にsizeやlengthが混じっています。
上級者の人は、どちらか一方しか使わないと決めていますか?
0550デフォルトの名無しさん2015/01/06(火) 10:20:23.02ID: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.
0551デフォルトの名無しさん2015/01/06(火) 11:07:07.91ID:VMQ4U3C+
>>548
Short-circuit evaluationがMcCarthy evaluationという別名を持ってる事を知らないアホウ。
0552デフォルトの名無しさん2015/01/06(火) 12:00:09.24ID:hvbSszuS
>>550
お前の脳内定義を長々と書かれても…
0553デフォルトの名無しさん2015/01/06(火) 14:00:54.62ID: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 };

ではダメ、という認識で合っていますか?
0554デフォルトの名無しさん2015/01/06(火) 14:37:50.31ID:IOY8OATq
その認識でおk
ちなみに用途としては、メンバメソッド内部で自身のshared_ptr要求してる時に型解決するって単純なのから、
非同期処理時にshared_ptrを取得して、処理終了までインスタンスが残るのを保証したりとか
if (auto p = t->shared_from_this()) {
&nbsp;&nbsp;p->asyncHoge();
}
0555デフォルトの名無しさん2015/01/06(火) 16:22:19.21ID:MIXF2/W4
回答ありがとうございます
不安点が解消されたので、ようやく手を出せそうです・・・
0556デフォルトの名無しさん2015/01/06(火) 21:02:36.00ID: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
>カッコだらけですごくわかりにくい言語があることは知っているが、 最強とか主張する信者がいるらしいのでなるべく関わらないようにしている。
0557デフォルトの名無しさん2015/01/06(火) 21:40:01.21ID:VQBi/vCZ
Lispとか言ってるのはキチガイなので触れないでください
0558デフォルトの名無しさん2015/01/07(水) 07:16:08.23ID:whm40mKL
C/C++を使ってデスクトップ上で使えるアプリを作りたい。
猫でもわかるWindowsプログラミング以外にいい書籍ないですかね?
0559デフォルトの名無しさん2015/01/07(水) 08:07:54.41ID: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なしで、意図した通りに動くとでも?
0560デフォルトの名無しさん2015/01/07(水) 08:38:54.85ID: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
0561デフォルトの名無しさん2015/01/07(水) 11:12:37.12ID:R14m8Fcb
相談
#define VERSION_XXX
...
#ifdef VERSION_XXX
...
#endif
みたいな方法でコード区切って、VERSION_XXXがdefineされててもされてなくても
コンパイルされるコードを書いているのですが
間違って
#ifdef VRESION_XXX // RとEが逆!
みたいな区切りをしてしまってもコンパイルが通ってしまいます
なんらか誤字を検知するいい方法ってありませんか?
0562デフォルトの名無しさん2015/01/07(水) 11:13:34.05ID:J9Js0gVS
手打ちじゃなくてコピペするようにする
0563デフォルトの名無しさん2015/01/07(水) 11:18:37.62ID:R14m8Fcb
基本すね
インテリセンスが聞くとコピペより楽だから手打ちがクセになっちゃってますけど
心がけて参ります
0564デフォルトの名無しさん2015/01/07(水) 11:59:36.15ID:R65SynMt
ヘッダなら#pragma onceとか
0565デフォルトの名無しさん2015/01/07(水) 12:51:46.31ID:qRf9hh7I
専用のテストツール作るとか
そうでなければコンパイル後の実行テストで発見するしかないかな
そこだけ丸々抜けてるんだから実行時には必ず見つけられないと可笑しい
0566デフォルトの名無しさん2015/01/07(水) 20:46:20.47ID:ArlGb+1Q
#ifdef VRESION_XXX
//
#else
#error "VERSION_XXX is Not defined."
#endif
とでもしとけばいいんでないの?
0567デフォルトの名無しさん2015/01/07(水) 21:42:15.24ID:MxHTewdX
#if VER==1
#elif VER==2
#else
# error
#endif
0568デフォルトの名無しさん2015/01/07(水) 21:46:13.11ID:DXg8c96r
定義を必須にするならそもそも論で定義自体が要らなくなっちゃうな
0569デフォルトの名無しさん2015/01/07(水) 22:29:52.94ID:nd/axr2U
>>566
なんのために #ifdef 使ってるんだよ w
0570デフォルトの名無しさん2015/01/07(水) 22:47:59.80ID: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に分類される。
0571デフォルトの名無しさん2015/01/07(水) 23:47:54.51ID:BnVzqaG6
「特別に教えてやる」ワロタ
その話はもう終わりましたよ
0572デフォルトの名無しさん2015/01/08(木) 02:04:51.23ID:dZQr24t7
>>570
独自研究?
要出展。
0573デフォルトの名無しさん2015/01/08(木) 02:59:34.28ID: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 (三項演算子)の話は(全然ないわけではないが)関係ないね。
分類?興味はないから勝手に分類すればぁ?

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

中学生でも「FPの真似事してみました」くらいの事はできるぞ。
0577デフォルトの名無しさん2015/01/08(木) 09:50:43.80ID:Kii/PXQd
それぞれの意味を理解することあきらめたのならそんでいいんじゃない
としか言いようがない
0578デフォルトの名無しさん2015/01/08(木) 10:09:22.36ID:dZQr24t7
>>574
本質的に同じものと明記しているURLが欲しい。
0579デフォルトの名無しさん2015/01/08(木) 19:04:10.00ID:AQCXdgrR
>>575
クロスキャストが正しい結果にならなかったような
ついでにそれだとdynamic_castのチェック機構が働かない
0580デフォルトの名無しさん2015/01/08(木) 20:31:44.57ID: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 は狙って書いたからね、お気に召されたようでなによりだ
0581デフォルトの名無しさん2015/01/08(木) 22:24:36.91ID:xIJvBvn3
>>580
お前、スレを荒らすときはちゃんとクソコテ付けろよ
NGしにくいだろ
0582デフォルトの名無しさん2015/01/08(木) 22:58:17.62ID:97n2OZ0x
>>587
Lazyな言語で検索すれば沢山あるだろ。例えば
https://books.google.co.jp/books?id=nh0okI1a1sQC&;pg=PA34
0583デフォルトの名無しさん2015/01/08(木) 23:41:30.06ID:97n2OZ0x
>>578
Lazyな言語で検索すれば沢山あるだろ。例えば
https://books.google.co.jp/books?id=nh0okI1a1sQC&;pg=PA34
0584デフォルトの名無しさん2015/01/09(金) 01:31:08.80ID:S/l7jDeL
ち、負けたよ‥Cの三項演算子
if C then A else B / C : A ? B
に生来の自然な lazy 性があるというのだろう、その主張は認めよう
0585デフォルトの名無しさん2015/01/09(金) 09:32:23.87ID:UAUytMwx
やっぱり理解していないアホウ。そんな事はお前以外は全員知っていた。
conditional operatorをshort-circuit evaluationと呼んで良いかが争点だった。

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

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

C++でおなじように変数の子要素もまとめて出力するような機能はありますか
0598デフォルトの名無しさん2015/01/11(日) 13:39:05.86ID:qXCt624L
いいえ
0599デフォルトの名無しさん2015/01/11(日) 13:39:34.12ID:GCkLh1u2
>>597
言語仕様にはありません
適当なライブラリを探してください
0600デフォルトの名無しさん2015/01/11(日) 15:40:03.53ID:gcpaqSvI
アホ呼ばわりではない、アホウだと言っている。
0601デフォルトの名無しさん2015/01/11(日) 15:43:45.43ID:2uQnlC2S
アホウにはアホウと言ってもいいと思っている
モヒカン的な思想ですね
もう少し社会に適応した方がいいですよ
0602デフォルトの名無しさん2015/01/11(日) 16:08:35.26ID: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;
}
0603デフォルトの名無しさん2015/01/11(日) 18:54:32.65ID:lYBxwBIS
>>602
そうだな
まずiostreamという糞ライブラリを使うのを止めることをオススメする
0604デフォルトの名無しさん2015/01/11(日) 18:54:33.69ID:FnSQDCUV
そのファイル(workfile.bin)は、はじめから存在しているファイルなのか?
0605デフォルトの名無しさん2015/01/11(日) 18:57:04.53ID:3ahz/Tk9
>>600
で、具体的なことはなにも書けないと w
06066022015/01/11(日) 19:17:36.28ID:4/5dMjSN
>604
はい、別途作成済のファイルです。

>603
iostreamは糞なんですか。もっといいのがあれば教えてくださいませ。
0607デフォルトの名無しさん2015/01/11(日) 19:35:50.86ID:/SWGABMQ
フラグの意味ぐらい調べてから使えよ
0608デフォルトの名無しさん2015/01/11(日) 19:39:44.19ID:wJL8ZTbg
俺のフラグが立つのはいつですか
0609デフォルトの名無しさん2015/01/11(日) 19:51:26.95ID:FnSQDCUV
>>606
コードよく見てなかったが>>607の通りだな。ios::outは既存のファイルがある場合は
それを削除して開くことになる。代わりのフラグを設定しる(ios::appか?)
06106022015/01/11(日) 21:24:36.19ID:4/5dMjSN
ありがとうございます。これで指定した位置の書き換えができるようになりました。
fout.open(outfile,ios::in|ios::out|ios::binary ) ;
0611デフォルトの名無しさん2015/01/14(水) 16:53:09.61ID:qg2WOmMy
class Callback
{
virtual void onNannka(Manager *pMngr) = 0;
}
みたいなコールバックの中でのみpMngrにアクセスを許したいんですがどうすればいいんですか?
0612デフォルトの名無しさん2015/01/14(水) 17:11:20.90ID:bm2MApp4
friend
0613デフォルトの名無しさん2015/01/15(木) 20:42:13.86ID: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です。
0614デフォルトの名無しさん2015/01/15(木) 20:58:51.27ID: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使うとバイト境界超えちゃったりするかもね
0615デフォルトの名無しさん2015/01/15(木) 21:09:47.58ID:lMW8kkLc
>>614
レスありがとうございます。同じですか。
では質問を変えて、上級者の皆さんはintを使いますか?
size_tを使いますか?
0616デフォルトの名無しさん2015/01/15(木) 21:17:13.33ID:YwRI9yA0
intは処理系の一番得意な整数型になるのが望ましいって決まってるから理由が無いならintの方がいいよ
0617デフォルトの名無しさん2015/01/15(木) 21:20:28.85ID:cnFFIXA8
>size_tはlongだけど

どうしてこう、息を吸って吐くように嘘が言えるのか
0618デフォルトの名無しさん2015/01/15(木) 21:39:13.36ID: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を使うようにして来ました。
なので世の中はどっちを使うのか主流なのかなと思いまして。。
0619デフォルトの名無しさん2015/01/15(木) 23:00:29.34ID:QsGAtWbU
>>617
すまん、処理系によるな、ヘッダ覗いて書きこんでた
0620デフォルトの名無しさん2015/01/16(金) 01:03:17.27ID:Uo0Zlj+1
signed(符号あり)は負にもなる整数
unsigned(符号なし)は負にならない整数(0以上)

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

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

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

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

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

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

それは可笑しい

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

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

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

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

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

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


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

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

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

自分でもこれから色々探して、最悪自作することも視野に入れていますが
もし既に良い実装をご存じの方がいたら、教えて欲しいです。
0699デフォルトの名無しさん2015/01/23(金) 11:38:27.61ID: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]);
いちおう目的は達成できたのですが、こういうやり方はどうでしょうか?
0700デフォルトの名無しさん2015/01/23(金) 16:08:31.27ID:R2ihxFB7
Cで、sizeofは内部でどういう計算がされていますか
0701デフォルトの名無しさん2015/01/23(金) 16:12:50.60ID:mBK4/sG6
足し算で計算されていると思います
0702デフォルトの名無しさん2015/01/23(金) 16:21:10.45ID:Iw65TJKV
>>699
後端の"が見つからなかった場合のエラー処理ができてない。
0703デフォルトの名無しさん2015/01/23(金) 16:53:41.82ID:9tnFJzS/
>>702
文字列には必ずペアでダブルクオーテーションがあることが前提なのですが、
そういう場合でも、エラーチェック処理をするべきでしょうか?
0704デフォルトの名無しさん2015/01/23(金) 17:01:51.59ID:m9gdTXpE
前提を崩した入力があった時に
・エラーで文句言う
・落ちる
・鼻から悪魔
0705デフォルトの名無しさん2015/01/23(金) 17:06:34.53ID:Iw65TJKV
>>703
その文字列がプログラム埋め込みでもない限りするべきだと思うけど
0706デフォルトの名無しさん2015/01/24(土) 00:00:03.81ID:qgW96dGE
>>704
・HDDを消去する
0707デフォルトの名無しさん2015/01/24(土) 01:35:33.39ID:OAbMDKxg
・PCを再起動する
0708デフォルトの名無しさん2015/01/24(土) 01:42:37.17ID:MUCQBpQd
・ハングアップさせる 逆にむずいか
・自爆させる 捕まるか
・入力者の個人情報をツイでさらす これいいかも

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

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

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

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

配列変数aを{2,1,7,3,6,4,8,5,9}で初期化し、バブルソートで大きな順に並び替えて表示するプログラムを作成せよ
配列要素の参照にはポインタ変数を用いること
0725デフォルトの名無しさん2015/01/24(土) 23:00:57.11ID:OmHyRM5u
宿題スレいけ
C/C++の宿題片付けます 168代目
http://peace.2ch.net/test/read.cgi/tech/1408962564/
0726デフォルトの名無しさん2015/01/25(日) 00:00:18.23ID:l2NWKfU1
>>723
それでも直らなかったのですがMSゴシックを標準のフォントに戻すと直りました
他のPCではMSゴシックでも動いてたので結局根本的な原因は不明です
0727デフォルトの名無しさん2015/01/25(日) 00:22:01.40ID:PYkp2Zoh
>>715>>716>>717
解説ありがとうございました。class無しでやる事にしました。
構造体で
int ver : 4;
の :4 は何を表しているのでしょうか?
ググりたいのですがキーワードを教えて下さい。
0728デフォルトの名無しさん2015/01/25(日) 00:25:59.54ID:6pmbh6NX
ビットフィールド
0729デフォルトの名無しさん2015/01/25(日) 04:15:53.25ID:P8ARGA9y
709です
Cのstatとsystemを使って出来るみたいですね。
しかしもう少し抽象化されたものはないんでしょうか。
0730デフォルトの名無しさん2015/01/25(日) 04:27:46.19ID:q//XhoOI
boost::filesystemを使う
0731デフォルトの名無しさん2015/01/25(日) 04:50:16.61ID:HQ3aG4X8
NSFileManager をC++でラップする
0732デフォルトの名無しさん2015/01/25(日) 20:17:59.89ID:jnERKKsI
boostなんて、仕事じゃ使えねーよ
遅すぎるし
0733デフォルトの名無しさん2015/01/25(日) 20:38:16.56ID:Wnz0wilq
ヘッダによる、
fwdヘッダ用意してなかったりasio、format、regexだったりは遅くなるけど、
それ以外はプリコンパイルヘッダに含めればそこまで足引っ張らない
0734デフォルトの名無しさん2015/01/25(日) 20:39:50.56ID:jnERKKsI
動作が遅いっていってんだけど
0735デフォルトの名無しさん2015/01/25(日) 20:43:43.36ID:pVReJ80Y
お前のやってる仕事ではそうなのかもな。
0736デフォルトの名無しさん2015/01/25(日) 20:44:30.35ID:Wnz0wilq
(ヾノ・∀・`)ナイナイ
0737デフォルトの名無しさん2015/01/25(日) 21:40:14.60ID:q//XhoOI
boostつったって色々あるしなぁ
0738デフォルトの名無しさん2015/01/26(月) 00:30:57.11ID:UM6C6XDi
どれだけ遅いのですか。
データはありますか。
0739デフォルトの名無しさん2015/01/26(月) 00:47:39.69ID:CYa04E4M
ブーストなのに遅いとか
0740デフォルトの名無しさん2015/01/26(月) 01:02:32.94ID:5Hop7PEH
仕事には使えないな。そういう用途のものでないな。
実装実験のためのものだし、バージョン依存も激ししい。
0741デフォルトの名無しさん2015/01/26(月) 01:03:38.74ID:XNIaxWEk
書くのが早いというだけで‥
0742デフォルトの名無しさん2015/01/26(月) 01:07:34.43ID:aJ+RSSru
>>740
仕事用でasioの代用だと何使ってる?
0743デフォルトの名無しさん2015/01/26(月) 05:51:49.64ID:wwEyx5FJ
ID:jnERKKsIがアレなのを別にしても
boost.poolテメーはダメだ。
0744デフォルトの名無しさん2015/01/26(月) 06:18:40.46ID:fhQPsb6z
format regex 使ったけど遅すぎて止めた
0745デフォルトの名無しさん2015/01/26(月) 06:21:42.54ID:bg9QqCyi
そこはxpressive使うべきだろ
0746デフォルトの名無しさん2015/01/26(月) 23:15:44.30ID: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++本来の継承の意味合いからしてそういう使い方をしてよいのか気になっています
0747デフォルトの名無しさん2015/01/26(月) 23:22:01.37ID:3+xNlERk
>>746
良い
0748デフォルトの名無しさん2015/01/26(月) 23:37:21.36ID:a9uK3KSB
>class bar : public foo
これはC#のインターフェース相当かな。
Javaのインターフェースに相当するC++の記述は
class Bar : public virtual foo
0749デフォルトの名無しさん2015/01/26(月) 23:41:53.42ID:3ZfUr7hf
fooはインターフェースじゃなくて普通の基底クラスじゃなかろうか
0750デフォルトの名無しさん2015/01/26(月) 23:50:56.82ID:ZzAwnl5E
>>748
違うから。
嘘教えんなよ
0751デフォルトの名無しさん2015/01/27(火) 00:00:11.04ID:6+4RVPqa
>>747
ありがとうございます
では、とりあえずその方向で移植しながら勉強してみます
0752デフォルトの名無しさん2015/01/27(火) 00:07:34.76ID:RrImLxtB
>>751
そのinterface用のクラスで
virtual void a()=0;
って感じで後ろに=0;を付けて定義するとinterface用クラスを派生した側でvoid a()を実装しなければ実体化出来なくなるからJavaとかのinterfaceに近くなる。
詳しくは 純粋仮想関数 でググれ
0753デフォルトの名無しさん2015/01/27(火) 01:47:04.24ID:e342vVi2
C++はインターフェースが無いから、>>752のやり方でインターフェースとして振る舞うクラスを定義するのが普通だね、
そして共通メソッドもBaseクラスじゃなくこのインターフェース用クラスのメソッドとして実装しちゃうので、ここでJavaとの実装方法に違いが出てた、

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

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

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

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

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

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

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

func2(A& pa)
{
pa.member
}
0763デフォルトの名無しさん2015/01/28(水) 22:47:19.01ID:anpOJbJr
クラスのメンバに参照使うこともできるぞ
メンバに参照があるとoperator=がデフォルトで定義されなくなるし大抵の場合不便だからポインタにすることが多いけど
0764デフォルトの名無しさん2015/01/28(水) 22:50:41.67ID:P3TzAr8+
ポリモーフィズムでBaseクラス型のポインタが必要になった時にアロー使ったり、
一応templateでポリシークラス渡す方法だとアロー消せるけどこっちはダックタイピングだから主旨ずれちゃうけど
0765デフォルトの名無しさん2015/01/28(水) 23:07:35.37ID:anpOJbJr
そんなことができそうな提案がいくらか出されてるから(operator .とかinline valiablesとかexpression aliasとか)将来のC++ではできるかもしれない
0766デフォルトの名無しさん2015/01/29(木) 01:14:59.53ID:Du6RynO1
>>759
とりあえず、見た目にこだわっての話なら、そのこだわりは早めに矯正したほうがいい
それらの使い分けは、構文的なこだわりとは全く別の視点で行われるべき
例えば大量のデータに対する順次処理はインライン関数内でスタック処理したが早い
ただし再帰でやったら死ぬから、自分が何をしようとしているかがわからない内は無理して使い分けはしないほうがいい
尚、ポインタであっても参照にとればアロー使わずメンバにアクセスできるけど、これに特に意味はない
0767デフォルトの名無しさん2015/01/29(木) 02:26:57.54ID:q7BZe7Bx
>>766
その変数がnullでない事を保証するぐらいの意味はあるだろ
0768デフォルトの名無しさん2015/01/29(木) 10:16:32.39ID: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
0769デフォルトの名無しさん2015/01/29(木) 12:34:49.33ID:+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)"
0770デフォルトの名無しさん2015/01/30(金) 15:15:38.64ID:TnZuFfmI
仮想PC(vmware)内でVirtualQueryExを行うと戻り値が0になって
情報が得られません。
ホストPCではきちんと取得できるのですが・・・。
原因が分かる方、どうかアドバイスをお願いします。

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

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

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

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

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

ってやると、 A \0 \0 って3文字分メモリを取って、隣接する配列とかがおかしくなるんですが何でですか。
0799デフォルトの名無しさん2015/02/01(日) 12:45:24.79ID:+XxUWgAM
範囲外に値書き込んだら
何が起こってもおかしくない。
0800デフォルトの名無しさん2015/02/01(日) 12:49:21.99ID:ofkZJOEV
一次元配列のメモリ領域の一部分を借りて変数の配列にしてるんだから、
配列外にアクセスしたら別の変数にアクセスしてしまう場合もあるわな
0801デフォルトの名無しさん2015/02/01(日) 12:50:56.27ID:viDnpXeU
>>799-800は会話のできないアスペ
0802デフォルトの名無しさん2015/02/01(日) 13:02:28.61ID:ofkZJOEV
> ってやると、 A \0 \0 って3文字分メモリを取って
解読してくれよエスパー
0803デフォルトの名無しさん2015/02/01(日) 13:12:25.51ID: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; }
0804デフォルトの名無しさん2015/02/01(日) 13:13:21.84ID:fuhak8XW
char a[1] ;
strcpy(a,"A");

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

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

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

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


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

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

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

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

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




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

> その領域を使ってた変数などが先頭が\0になって壊れると言う事ですね。
こっちも、変数のフラグメンテーションによって配列外アクセスが常に別の変数の先頭領域になるなんて保障がないよ
0813デフォルトの名無しさん2015/02/01(日) 14:48:51.05ID: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')
0814デフォルトの名無しさん2015/02/01(日) 17:52:07.52ID:5WStzBZM
strcpy_sじゃあかんのか
0815デフォルトの名無しさん2015/02/01(日) 19:19:45.80ID:WJjCYs3Y
double型で桁数の多い計算をしたら、1.6493361431022000e-006という数字になりました。
これはdouble型の桁数を超えたんでしょうか?
この数字が出るとその後、この数字に乗算しても正しい結果にならないんですが
0816デフォルトの名無しさん2015/02/01(日) 19:22:02.20ID:l+3aqkIQ
大人C++でstd::string使っとけ
0817デフォルトの名無しさん2015/02/01(日) 19:27:49.82ID:l+3aqkIQ
>>815
それ
0.00000164933…
って数
計算してるところが解らないから何ともいえないけど計算間違ってるだけじゃない?
0818デフォルトの名無しさん2015/02/01(日) 19:44:20.18ID:ckgWNtQ3
もしかしてただ誤差が出てるのを正しい結果になってない!おかしい!って思ってるだけかも
0819デフォルトの名無しさん2015/02/01(日) 19:58:22.82ID:6YUTF7Wm
>>815
>double型の桁数を超えたんでしょうか?

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

後は実際のコード見なきゃなんとも言えない
0822デフォルトの名無しさん2015/02/01(日) 23:59:44.94ID:zNKk2ZpT
>815
MINGWのG++ならば、doubleでなくて
long doubleを指定して4倍長計算をしてみたら
どうなりますか。
0823デフォルトの名無しさん2015/02/02(月) 03:12:19.44ID:E0RD/vzJ
昔知り合いの会計士が
うちはPC二台でエクセルでそれぞれ同じ計算して
答え合わせしてるので完璧ですっ(キリっ)
って逝ってたの思い出した
0824デフォルトの名無しさん2015/02/02(月) 09:42:30.91ID:nUUGZ8+L
>>823
検算してるだけだろ?
0825デフォルトの名無しさん2015/02/02(月) 11:20:39.19ID:EZQev4rj
浮動小数点数の扱いを知らんで誤差出て可笑しいって言う人って
0826デフォルトの名無しさん2015/02/02(月) 15:05:44.82ID:3eUmmy+n
>>823-824
同じデータと同じマクロを使ってペンティアムバグの対策するんだよな
当然だよな
0827デフォルトの名無しさん2015/02/02(月) 15:31:51.32ID:WjiHP3OZ
片手にエクセル、片手に電卓 これでいく
0828デフォルトの名無しさん2015/02/02(月) 15:37:56.82ID:nBismiQT
マクロのバグってのはありえるかもな
0829デフォルトの名無しさん2015/02/02(月) 15:47:58.62ID:RH7feET7
>>827
唇に火の酒
背中に人生
0830デフォルトの名無しさん2015/02/02(月) 17:49:11.18ID:DUpXUgxT
>>815
ども^^; 
知らなかったす0.00000164933だったなんて
0831デフォルトの名無しさん2015/02/02(月) 18:29:45.09ID:nUUGZ8+L
>>828
喪黒のハグなら怖い。
0832デフォルトの名無しさん2015/02/02(月) 18:41:31.04ID:2aaoC/Ew
>>829
じゅりー!ああジュリー、素敵!
0833デフォルトの名無しさん2015/02/02(月) 20:06:28.87ID:9S8Foh71
喪黒ならハグよりドーンの方が怖い
0834デフォルトの名無しさん2015/02/03(火) 00:47:17.81ID:Ol5Pkl9D
>>830
そもそもおまえ浮動小数点型使う必要ないんじゃね
桁数多いからってならlong long使えよ
0835デフォルトの名無しさん2015/02/03(火) 07:05:07.74ID:2QvjDp7A
今の大学って実用数学とか計算機数学習わないの?
0836デフォルトの名無しさん2015/02/03(火) 08:07:41.01ID:Ak6uoSi3
>>835
そんなうさんくさい講義は受けたことないわ
0837デフォルトの名無しさん2015/02/03(火) 08:10:35.59ID:00JNNVea
customer
satisfaction
0838デフォルトの名無しさん2015/02/03(火) 10:23:01.06ID: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回くらい計測時間がマイナスになるんですが、そんなこと有りますか?
0839デフォルトの名無しさん2015/02/03(火) 10:39:02.57ID:N+AEw8su
steady_clockを使え
0840デフォルトの名無しさん2015/02/03(火) 13:24:52.25ID:cHPe/D1w
>>839
ありがとうございました。steady_clockを試してみます。
0841デフォルトの名無しさん2015/02/03(火) 17:32:32.52ID: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);
}
}
}
0842デフォルトの名無しさん2015/02/03(火) 17:41:47.29ID:Ii7aDZgi
>>841
初レスだが。ダメだったら確実なAPIを使えばいい。
マルチプラットフォームはchronoとwinAPIを切り替える部分を自作したらいい。
0843デフォルトの名無しさん2015/02/03(火) 18:20:52.61ID:cHPe/D1w
>>842
レスありがとうございました。
WinAPIで確実なのはGetLocalTime()でしょうかね?
なお841をXP向けにReleaseビルドしたときはランタイムライブラリはマルチスレッド(/MT)
です。それ以外の設定はデフォルトだと思います。
0844デフォルトの名無しさん2015/02/03(火) 18:38:06.35ID:q60KfZim
QueryPerformanceCounter と QueryPerformanceFrequency
0845デフォルトの名無しさん2015/02/03(火) 18:48:48.60ID:nWWy4Uvl
>>841
1秒に一回現在時刻を取得して出力するプログラムを動かし続けたらどうなる?
コンピューターの時刻が戻っているのかプログラムがおかしいのかの切り分けはすべき
0846デフォルトの名無しさん2015/02/03(火) 20:33:54.88ID:Sv24YYpg
コールバック処理をしたいのですが
C#でいうところのActionやdelegateは無いみたいなので困ってます
たすけてください
0847デフォルトの名無しさん2015/02/03(火) 20:41:14.57ID:E7BKCiQp
>>841
GetSystemTimeAsFileTime()を使えばいいんじゃないかな?
0848デフォルトの名無しさん2015/02/03(火) 21:06:56.27ID:N+AEw8su
>>846
std::function
0849デフォルトの名無しさん2015/02/04(水) 01:13:32.90ID:VCpWnwFT
クラスAのprivateメンバにアクセスできるクラスBを内部的に使いたいんですが、
内部クラスを使うにせよフレンドクラスにするにせよ、クラスAのヘッダにクラスBの宣言は露出せざるを得ないもんでしょうか?
クラスAのサイズやらには影響しないので宣言を公開する必要まったくないのですが…。
0850デフォルトの名無しさん2015/02/04(水) 01:25:35.27ID:WTx4SMA5
共有メモリを使ってプロセス間通信をしつつ、共有メモリ書き換え時に通知を出してイベント駆動したいんですが可能ですか?
0851デフォルトの名無しさん2015/02/04(水) 04:17:43.82ID:kkq1LSla
>>849
外部からアクセスさせないためにprivateメンバにしてるんだろ。クラス定義の時点でfriendにもしてない内部クラスでもないクラスがアクセスできたら困るわ
ソースファイルに隠蔽したいなら、privateメンバの参照渡すなり何なりやりようはある
>>850
・共有メモリを監視して変更があったらイベントを実行する
・共有メモリとは別に名前付きパイプを使ってメッセージを送信し、受信したらイベントを実行する
どっちでもお好きなのを。どちらにせよイベント駆動する側のスレッドで何らかの監視はせにゃあかんよ
0852デフォルトの名無しさん2015/02/04(水) 11:34:39.12ID:It97W8hu
>>841
VS2013のsteady_clockにはバグがあってシステム時刻に連動してるから使えないよ
時刻同期された時点でアウト
VS2015(プレビュー版)では修正したって記述があるけど、MSのことだから
VS2013は直さず放置かも
0853デフォルトの名無しさん2015/02/04(水) 12:06:06.38ID:TJY7yLxX
>>852
そうみたいですね。
何日も連続で使っても正しく時刻を計測できる方法は無いのでしょうか?
どの方法でも、たとえバグが無くても、必ず上限がありますよね?
0854デフォルトの名無しさん2015/02/04(水) 12:32:09.25ID:zDVY2b+V
>>844が挙げてるQueryPerformanceCounter と QueryPerformanceFrequencyは
カウンタの型が64ビット整数だから、精度が1ナノ秒と仮定しても200年以上持つ
初期化時点の日付を保持しておいて、現在日時が必要になったタイミングで
カウンタ値から経過時間を計算して日付に反映すればいい気がする

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

1msの狂いもイヤとか49.7日以上掛かる処理時間を計測したいとかなら駄目だけど
0856デフォルトの名無しさん2015/02/04(水) 14:01:38.05ID: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でのプログラムの話なので
板違いだったらすいません
0857デフォルトの名無しさん2015/02/04(水) 14:23:36.96ID:e5R1ECjv
int hoge = 846;
sock.sendTo(echo_server, (char *)&hoge, sizeof(hoge));
0858デフォルトの名無しさん2015/02/04(水) 14:42:54.62ID:HaKHxANL
>>856
キャストすればいいんじゃない。sprintfで文字列として送ってもいいし。
0859デフォルトの名無しさん2015/02/04(水) 15:04:20.41ID:bcJPu6wA
>>857-858
ありがとうございます
キャストで行けました。

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

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

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

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

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

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

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

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

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

このx->f();は(*x).f();のシンタックスシュガーだから、nullポインタのxをデリファレンスしてる時点で未定義動作
だから例えばfが呼ばれる前にabortする処理系があってもおかしくないはず
0888デフォルトの名無しさん2015/02/05(木) 00:01:35.89ID:OFR6zSUU
昔C++はCに変換してコンパイルされてたとか聞く
すると
X::f()は
f(X*)に変換されたのかもしれない
0889デフォルトの名無しさん2015/02/05(木) 00:07:54.97ID:3Yv7qBda
今もそんなに変わらんだろう
eaxレジスタにthis入れて関数呼んでるだけだ
0890デフォルトの名無しさん2015/02/05(木) 00:14:12.11ID:SXN3g1Ol
もう時代は64ビットだし、raxレジスタって言うべきじゃないかな
0891デフォルトの名無しさん2015/02/05(木) 00:28:38.37ID:Iop/4SxL
>>886-887
だよね、メンバー変数触らなきゃ大抵問題ないと思うけど...
0892デフォルトの名無しさん2015/02/05(木) 00:49:08.62ID:l8QaN41D
>>888
昔、というか今もリンク時にはC言語形式の f(X*)になっている
0893デフォルトの名無しさん2015/02/05(木) 01:00:21.83ID:Tp9Oo/Vo
>>892
C言語形式の関数のシンボル名は引数自体ないんだけど
0894デフォルトの名無しさん2015/02/05(木) 01:02:07.56ID:SXN3g1Ol
C関数の引数はスタックに積んで、thisポインタはraxに積む処理系だってある
マングリングした名前で静的ライブラリから関数ポインタと取得して、そのままC関数としてcallできる保証なんざどこにもない
C言語形式のってのは不適切じゃないかね
0895デフォルトの名無しさん2015/02/05(木) 01:03:17.81ID:SXN3g1Ol
静的ライブラリじゃねえや、動的ライブラリだ
0896デフォルトの名無しさん2015/02/05(木) 10:37:39.60ID:n7T33kxd
例外が何のために導入されたのか良く判った
0897デフォルトの名無しさん2015/02/05(木) 21:00:31.64ID:0qNqDnpO
Cの絵本という本を見ながら勉強してます。
ポインタがなんとなくは理解できたと思ったんですが、
更に参照というのが出てくるとまたわからなくなりました。
ポインタと参照って何か違うんですか?
私の理解では、変数int aとポインタ変数int *bがあってb = &amp;aとした時、
bはaの参照を持んですよね?つまりポインタは参照ってことでいいのではないでしょうか?
でもポインタと参照は別物みたいに書かれていたりして、わけがわかりません。
同じものですか?違うものですか?
0898デフォルトの名無しさん2015/02/05(木) 21:14:42.21ID:EvPbZUKs
>>897
まずはポインタに慣れポインタを理解したほうがいい
あるいは pascal 等の参照呼出しを持った簡単な言語を習得する、など。

参照変数はポインタ変数と縁が深いとはいえ、その記述方法が違う
0899デフォルトの名無しさん2015/02/05(木) 21:17:38.58ID:thcJVwvH
>>897
参照は概念
ポインターは参照を実現するためによく使われる手段
int a = 100;
int * pa = &a;
f(pa);

fの中でポインターを使って値を変えると呼び出し元のaの値も変わる。
これを「aを関数fに参照で渡ししている」と言う
0900デフォルトの名無しさん2015/02/05(木) 21:17:47.10ID:/dPq9GRz
参照とポインタは違う
どのくらい違うかというと
「住所」
と
「その住所を知ってる人」
くらい違う
0901デフォルトの名無しさん2015/02/05(木) 21:22:49.56ID:osIltw0C
俺は普段滅多にポインタは使わないなあ。
参照は関数の引数で文字列や構造体を
渡す場合だけしか使わないなあ。
0902デフォルトの名無しさん2015/02/05(木) 21:24:42.35ID:ccAWLvf9
質問者のレスもよく読まずに
単語レベルで猿のように反応するお前ら
0903デフォルトの名無しさん2015/02/05(木) 21:25:17.59ID:/dPq9GRz
>>897
そうだな参照が概念だな
ポインタに限らず全ての変数はそれを持っているんだ
&変数で参照に、*でポインタが参照している実体にアクセスできるって事は理解してるんだな
なら
a=10ならaは10という実体そのものを持ってる
b=&aの後の*bも10で、bにはアドレス(お前さんが考えてるところの参照)が入ってるな
んだら、&b←これは何をあらわしてる?
参照ってのは、特別なものじゃない
ポインタとごっちゃにするものでもない
0904デフォルトの名無しさん2015/02/05(木) 21:26:04.15ID:eDwpcQmy
Cでいう参照って ポインタが指してる先を覗いたり書き換えたりすることっしょ
0905デフォルトの名無しさん2015/02/05(木) 21:27:56.44ID:EvPbZUKs
アドレスと参照変数は違うと思うよ‥
0906デフォルトの名無しさん2015/02/05(木) 21:28:34.98ID:EvPbZUKs
>>904
それはふつうの単項 * 演算子だねえ
0907デフォルトの名無しさん2015/02/05(木) 21:32:45.21ID:YCqdOdIu
>>906
そうだよ
単項演算子*で別の変数の値にアクセスするのが参照
知らないならすっこんでていいよ
0908デフォルトの名無しさん2015/02/05(木) 21:35:56.43ID:0qNqDnpO
違うんですね。ありがとうございます。
違いについては、教えて頂いた事をヒントに、もう少し本を読み込んで理解していこうと思います。
ちなみに、参照とは参照変数の略なんですか?
0909デフォルトの名無しさん2015/02/05(木) 21:42:01.55ID:TOlaBAsT
>>908
参照という日本語と参照変数というC++用語とがあるからなあ
上でも言われてるけど、一旦参照忘れてポインタに集中したほうがいいと思うよ
0910デフォルトの名無しさん2015/02/05(木) 21:42:46.23ID:YCqdOdIu
参照変数っていうのはCとC++の区別がついていない低脳のたわごとなので
忘れていい
0911デフォルトの名無しさん2015/02/05(木) 21:44:01.91ID:U3iZE77s
参照って名前がダメだな
別名ならよかったのに
0912デフォルトの名無しさん2015/02/05(木) 21:53:50.73ID:4UAQD4bT
ISO/IEC 9899:2011 6.2.5 Types
A pointer type may be derived from a function type or an object type, called the referenced type.
A pointer type describes an object whose value provides a reference to an entity of the referenced type.
A pointer type derived from the referenced type T is sometimes called ''pointer to T''.
0913デフォルトの名無しさん2015/02/05(木) 21:59:05.74ID:z+T6/OHe
ポインタで同じものを覗いてるのもaliasだしそれはそれで混乱の元。
0914デフォルトの名無しさん2015/02/06(金) 00:39:16.20ID:/qyQiT60
別名って考えならポインタも参照も変数の別名に変わりはない
そこにあるのは単なる記述と制約の違いでしかない

int a, b[] = { 0, 0, 0 };
*&a = 1;
*b = 2;
*( &*b + 1 ) = 3;
*( &b[1] + 1 ) = 4;
printf( "a=%d, [0]=%d, [1]=%d, [2]=%d", a, b[0], b[1], b[2] );
0915デフォルトの名無しさん2015/02/06(金) 00:41:31.52ID:MSC8hdEj
別名を作成するのにもう一回型指定が必要ならやはりダメじゃ
0916デフォルトの名無しさん2015/02/06(金) 00:46:05.03ID:jSEDnOld
今風に言えば、リンクとかショートカットかな
0917デフォルトの名無しさん2015/02/06(金) 01:10:52.25ID:/UY9BmXl
グローバル関数のWndProcを、ウィンドウを管理するクラスのヘッダに置いたら既に●●で定義されています
というエラーが出るんですが、pragma onceもあります
なんででしょうか?
わざわざexturnしないとだめですか?
0918デフォルトの名無しさん2015/02/06(金) 01:38:43.32ID:821S5hNP
ソース見なきゃ分からんが
ヘッダに定義を書くなよ
0919デフォルトの名無しさん2015/02/06(金) 01:43:04.72ID:b3gwE4qm
>>917
ヘッダには関数のプロトタイプは置いても中身まで書かない
0920デフォルトの名無しさん2015/02/06(金) 01:48:28.34ID:E8JTKxsc
>>917
pragma onceは「ひとつのcppファイル」に複数回定義が現れないようにするだけで
そもそも「複数のcppファイル」に定義が出現したら二重定義エラーになる
0921デフォルトの名無しさん2015/02/06(金) 02:04:34.13ID:XofOsMKd
>>917
そのヘッダをincludeしたソースの数だけその関数が出来る
0922デフォルトの名無しさん2015/02/06(金) 10:17:49.10ID:MSC8hdEj
ポイントを押さえたまれに見るほどの的確な説明だが
逆にわかった上での釣り質問じゃないかと疑ってしまうw
0923デフォルトの名無しさん2015/02/06(金) 11:23:11.97ID:BQfzz9oE
CreateWindowのサンプルをネットで見ていると
たまに↓みたいな表記が出てきます。

((LPCREATESTRUCT)lp)->hInstance

これって結局、インスタンスハンドルなんですよね?
-> って演算子を使ったことがなくて意味がよく分からないのですが。
0924デフォルトの名無しさん2015/02/06(金) 11:30:48.92ID:+HsTLx7S
参照は +1 出来ないやろ
0925デフォルトの名無しさん2015/02/06(金) 11:32:23.37ID:E8JTKxsc
>>923
Cの基本から勉強しなおしてください
0926デフォルトの名無しさん2015/02/06(金) 11:38:14.92ID:BQfzz9oE
メンバへのアクセスなんですね
わかりました
0927デフォルトの名無しさん2015/02/06(金) 14:37:47.85ID:jlh1DjPp
>>917
つinline
0928デフォルトの名無しさん2015/02/06(金) 16:20:48.87ID:9d0A7+MO
int d1[8] = {10, 20, 30, 40,-1,6,70,80};
int d2[8] = {0,0,0,0,0,0,0};
int i;

i = 0;
do{
++i;
d2[i] = d1[i];
}while(d2[i] != -1);
for(i = 0; i <8; i++)
cout << d2[i] << " ";
cout << '\n';
return 0;
C++ですけど、これ何処が間違い?
10, 20, 30, 40,-1 ここまでで止まるようにしたいんだけど・・・
0929デフォルトの名無しさん2015/02/06(金) 16:27:39.27ID:eDHY2J9J
d2[i] = d1[i];
++i;
こうじゃないのか
0930デフォルトの名無しさん2015/02/06(金) 17:03:17.96ID:+ZpFuaAf
>>927
WndProc の名から察するに callback 関数で
関数のポインタをとるんだけど、inline ついてても帳尻あうように
どこかでのみコード生成してくれるのかな?
0931デフォルトの名無しさん2015/02/06(金) 17:18:52.19ID:ftnjAwrx
>>928
d2[0]の処理が無いん
0932デフォルトの名無しさん2015/02/06(金) 20:37:15.26ID:2p4GT6H2
>>930
アドレス取られてたら、実体生成するんじゃなかったっけ?
0933デフォルトの名無しさん2015/02/07(土) 08:10:03.53ID:B6nPxnuz
>>930
いえ違います
inline付いてたら定義が複数見つかっても一つにまとめてくれる仕様があります

>>932
その理屈だと複数のcppでアドレス取ったらアウチだね
0934デフォルトの名無しさん2015/02/07(土) 08:48:39.38ID:S7NDooB6
>>928
i = 0;
do {
 d2[i] = d1[i];
} while ( d2[i++] != -1 ) ;
0935デフォルトの名無しさん2015/02/07(土) 10:05:05.31ID:L56gFTsW
>>933
> その理屈だと複数のcppでアドレス取ったらアウチだね

なんの問題もないけど?
0936デフォルトの名無しさん2015/02/07(土) 10:39:44.00ID:7MTAmsCU
テンプレートだって複数の翻訳単位で実体作ってリンク時に一つにまとめるわけだが
0937デフォルトの名無しさん2015/02/07(土) 12:51:12.26ID:scHB89CY
>>854
遅レスですまんが、XP(SP3)でだって今どきのマシンであればQueryPerformanceCounterで問題ないよ
リンク先の記事はいろんな条件を確かめることなしに勝手なことを書いてるだけ
0938デフォルトの名無しさん2015/02/07(土) 13:07:12.11ID:scHB89CY
QueryPerformanceCounterについて古い(or不正確な)情報を読んで誤解してる人は↓を見てね
http://stackoverflow.com/questions/7287663/queryperformancecounter-status
0939デフォルトの名無しさん2015/02/07(土) 20:12:50.08ID:E6r0/ti/
配列は断片化しない事が保障されていますか?
0940デフォルトの名無しさん2015/02/07(土) 20:16:21.70ID:TwsBHqmP
はい
0941デフォルトの名無しさん2015/02/07(土) 20:23:27.82ID:E6r0/ti/
ありがとうございます
0942デフォルトの名無しさん2015/02/07(土) 20:29:53.49ID:E6r0/ti/
C++はallocの使用を推奨していませんか?
0943デフォルトの名無しさん2015/02/07(土) 20:30:55.63ID:TwsBHqmP
はい
newの使用を推奨します
0944デフォルトの名無しさん2015/02/07(土) 20:33:12.80ID:E6r0/ti/
ありがとうございます
0945デフォルトの名無しさん2015/02/07(土) 20:52:27.19ID:wGf/Hav9
>>938
情報ありがとうございます。
ググっていたら
http://stackoverflow.com/questions/5296990/queryperformancecounter-and-overflows
見付けたのですが、こっちだとQueryPerformanceCounterは長時間の計測には
向いていないのでGetTickCount or GetSystemTimeが良いと書いてあるようなの
ですが、結局、どっちが正しいのでしょうか?
0946デフォルトの名無しさん2015/02/07(土) 21:42:57.06ID:Hof4fFat
そっち
0947デフォルトの名無しさん2015/02/07(土) 22:10:10.94ID:scHB89CY
>>945
オーバーフローになるくらいの長時間ケースは論外として
確度の話だったらハード依存するとしか言えないと思う
普通のPCのプロセッサやバスクロックに使ってる発振器なんてせいぜい周波数確度50ppmとかだし
50ppmなら1秒で50マイクロ秒のズレを覚悟しなきゃいけないことになる
長時間をなるべく正確に図りたいならマルチメディア系のタイマーがいいんじゃないかな(たぶん)
マルチメディアのハードウエアは比較的確度の良い発振器使っている事が多そうだから
0948デフォルトの名無しさん2015/02/08(日) 06:52:02.33ID:LUl61OMZ
>>852
> 時刻同期された時点でアウト

W32Time
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\W32Time\Parameters
の "Type"(REG_SZ)に "NoSync"(時刻の同期を行わない) を設定して
時刻同期を止めて処理を実行し、終わったら"Type"の値を元に戻す・・・のはダメ?w
0949デフォルトの名無しさん2015/02/08(日) 09:17:19.00ID:p5pYedXE
関数テンプレートの質問です。こういう関数テンプレートがあって、

template <typename T> T func( T arg );

Tは組込み整数型(short,int,long...)だけ有効としたいのでそれらの型のみ特殊化しようと
していますが、これを一括で記述することはできませんか?
今は仕方なく、型ごとに記述しています。

template <> int func( int arg ) {
// 記述同じ
}
template <> long func( long arg ) {
// 記述同じ
}
0950デフォルトの名無しさん2015/02/08(日) 10:08:38.46ID:FDmThcdJ
>>949
http://ideone.com/IWAnvz
0951デフォルトの名無しさん2015/02/08(日) 10:15:09.32ID:WLLuhFHT
std::is_arithmetic使えよ

http://melpon.org/wandbox/permlink/gkJI4gRGRsltA79N
0952デフォルトの名無しさん2015/02/08(日) 10:16:42.82ID:WLLuhFHT
あ、整数型だけだったか
ならstd::is_integralだ
0953デフォルトの名無しさん2015/02/08(日) 10:55:25.50ID:p5pYedXE
>>950>>951
ありがとうございました。std::enable_ifをこう使えばいいんですね。試してみます。
09549492015/02/08(日) 14:00:58.82ID:p5pYedXE
おかげさまで>>949の件はうまくいきました。
ついでに教えて欲しいんですが、このような特定複数の型にマッチするテンプレートを書いて
その実装をソース側に隠して明示的インスタンス化しようとした場合、同様に簡潔に記述する
方法はあるんでしょうか?
それともこの場合は、具体的な型ごとにインスタンス化しないとならないでしょうか。
0955デフォルトの名無しさん2015/02/08(日) 18:49:29.57ID:IFsGlgey
次スレは新しく立てるんだよな?
荒らしの立てたスレはゴミ溜めと化してるし
0956デフォルトの名無しさん2015/02/09(月) 14:11:35.22ID:3ys1NOC1
setprecision
scientific
これなんて、読んでる?
0957デフォルトの名無しさん2015/02/09(月) 14:30:48.43ID:ETm8i+dC
セットプレシジョン
サイエンティフィック

以外の読み方があるんか?
0958デフォルトの名無しさん2015/02/09(月) 15:34:06.79ID:3ys1NOC1
ありがとうございます
0959デフォルトの名無しさん2015/02/09(月) 19:29:19.16ID:dbrw/Pr1
VS2013のC++で文字列の比較で質問なのですが、
const char* p = "テスト";
(1)  if (string(p) == "テスト")
(2)  if (strcmp(p, "テスト") == 0)
(3)  if (p == "テスト")      // warning C4130: '==' : 文字列定数のアドレスで論理演算が行われました。
どの方法でも比較結果は等しくなったのですが、
(3)は警告が出るにもかかわらず等しいと判定できますが、何故でしょうか?
警告が出ると言う事は、(3)のような比較はしてはいけないのでしょうか?
0960デフォルトの名無しさん2015/02/09(月) 19:35:52.65ID:ZjLVYYsd
3番目はアドレス同士の比較なので使ってはいけません
そこの比較でtrueが帰ったのはたまたま文字列リテラルの先頭アドレスが同じだっただけです
0961デフォルトの名無しさん2015/02/09(月) 19:57:21.96ID:sBN76GX2
同意します
0962デフォルトの名無しさん2015/02/09(月) 19:59:10.78ID:BDPeZr7+
文字列リテラルの "テスト" が コード中に2回登場してるけども
1回目の "テスト" と 2回目の "テスト" が同じものを指すかどうかは保障がない

(別の場所に テスト テスト ってそれぞれ記憶しているかもしれない

コンパイラによっては、それを1個にまとめてくれることもあるけど
それを前提としたコードを書くべきではない
(3) の右辺の "テスト" が記憶されているアドレスを比較するのはナンセンスだよ と警告してくれている
0963デフォルトの名無しさん2015/02/09(月) 19:59:43.11ID:dbrw/Pr1
>>960
レスありがとうございました。理解できました。
0964デフォルトの名無しさん2015/02/11(水) 09:56:02.05ID:kE4UGdJh
じゃあ片方をテストからテヌトに変えたらもう片方も変わるのか? 別々の変数なのに?
コンパイラの最適化がなくなるの?
0965デフォルトの名無しさん2015/02/11(水) 10:41:42.40ID:fznki0OC
>>964
変数ではない
文字列リテラルだ
0966デフォルトの名無しさん2015/02/11(水) 11:45:40.86ID:zO3T1ON+
>>964
そもそもリテラルそのものを変更してはならない
配列をリテラルで初期化するなり、確保したメモリにリテラルの内容を転写するなり
そうしてから変更せんと
0967デフォルトの名無しさん2015/02/11(水) 12:53:36.80ID:aYb/ZX4Z
>>964
ソースコード中に複数出てくる同じ文字列はコンパイラが
単一の実体にまとめちゃっても良いことになってる。
大抵はコンパイル時のオプションで抑制もできる。
0968デフォルトの名無しさん2015/02/11(水) 15:45:46.19ID:ZyeSSwOB
>>967
なるほど。
テスト
http://ideone.com/dIyERC
0969デフォルトの名無しさん2015/02/13(金) 21:01:55.21ID:Ds6cciQs
ポインタがどのようにメモリに作られるかがよくわからないです。

A* p=new A();
と宣言すると、Aのサイズ分メモリに領域が確保されると思うのですが、それならポインタ使わないで
A p;
と宣言した場合と、使われるメモリ領域は同じではないですか?
むしろ、ポインタを格納する領域も作った分ちょっとポインタ使った方が容量増える気がします。

考え方間違ってますでしょうか?
0970デフォルトの名無しさん2015/02/13(金) 21:33:40.26ID:Qz0zAdy2
>>969
合ってる、
ポインタも所詮アドレス用の変数なんで、インスタンスの他にポインタ分もメモリ食う
0971デフォルトの名無しさん2015/02/13(金) 21:35:37.71ID:lpJSL/lf
その分任意で解放できるくらいだな
プロセスが生きてる間存在するなら後者の方がいい
0972デフォルトの名無しさん2015/02/13(金) 21:40:34.81ID:2hoeGKOs
>>969
関数の内部でA p;と宣言したpを呼出元に返す場合、どうすればいいでしょう。
Aはとても大きく、コピーすると計算資源の無駄になる場合はどうすれば効率いいでしょうか。
0973デフォルトの名無しさん2015/02/13(金) 21:47:52.96ID:wdSxf+0q
A&& で受け取ろう(名案)
0974デフォルトの名無しさん2015/02/13(金) 22:11:02.08ID:F5dloNJQ
真面目に、NRVOかmoveでいいと思う
0975デフォルトの名無しさん2015/02/13(金) 22:42:13.84ID:G7jPEu4l
>>969
微妙に違う
A a;
としたらスタックに置かれる。
A* p =new A();
としたらsizeof(A)の分ヒープに置かれてsizeof(A*)の分スタックに置かれる。
スタックとヒープの違いはググれ
0976デフォルトの名無しさん2015/02/14(土) 02:49:22.62ID:+bNdvInf
>>972
呼び出しもとから p のアドレスをもらって呼び出し先で new して p に入れる
http://codepad.org/orXVBdNn
0977デフォルトの名無しさん2015/02/14(土) 02:55:58.71ID:c5GE7VHu
>>976
ネタだよな?
0978デフォルトの名無しさん2015/02/14(土) 03:01:53.48ID:+bNdvInf
コンパイル・実行できる何をネタと思ったか詳しく
0979デフォルトの名無しさん2015/02/14(土) 03:04:18.75ID:C4CV/7ib
気持ち悪いコードだなぁ
0980デフォルトの名無しさん2015/02/14(土) 03:04:32.31ID:c5GE7VHu
Segmentation fault起こしてる何をネタじゃないと思えるのか詳しく
0981デフォルトの名無しさん2015/02/14(土) 03:07:35.91ID:a6xGr1RH
実行できてねえワロタ
0982デフォルトの名無しさん2015/02/14(土) 03:10:14.30ID:+bNdvInf
>>977
たしかにシクっった
http://ideone.com/oJGfP8

>>972
訂正します
0983デフォルトの名無しさん2015/02/14(土) 03:14:02.72ID:c5GE7VHu
すげえなideone、これで落ちないのか。
hogeはいったいどこのポインタなんだ。一体どこのメモリを書き換えて何をdeleteしてるんだ、恐ろしい
0984デフォルトの名無しさん2015/02/14(土) 03:14:32.96ID:c5GE7VHu
あ、すまんageた
0985デフォルトの名無しさん2015/02/14(土) 03:19:32.22ID:a6xGr1RH
>>982
ネタじゃないなら人に教えようと思わないでくれ
0986デフォルトの名無しさん2015/02/14(土) 03:52:23.04ID:vF+NOi+H
あ
0987デフォルトの名無しさん2015/02/14(土) 04:05:25.87ID:GOyPmnEB
>>982
おめーのようなド底辺が参入してきているのか、この業界も落ちるところまで落ちたな。
0988デフォルトの名無しさん2015/02/14(土) 04:18:18.63ID:5K1xCRmV
>>976は荒らしです
以前はホゲコピペでスレを荒らしました
よく素人のふりをして質問して
後から回答者を煽ったりします
韓国にこだわりがある模様
0989デフォルトの名無しさん2015/02/14(土) 07:29:28.76ID:TmPsoaDY
1つ質問がある度に喧嘩するのやめーやw
0990デフォルトの名無しさん2015/02/14(土) 09:40:05.17ID:5BqTjtvr
>>934
> } while ( d2[i++] != -1 ) ;

よく考えたら、よくある
while ( *dst++ = *src++ );
ってundefined behaviorだよね
0991デフォルトの名無しさん2015/02/14(土) 09:52:50.69ID:fXUsxwGx
>>983
むしろ落ちてくれると思っている方がお花畑
そう言う人はCに剥いてない
0992デフォルトの名無しさん2015/02/14(土) 09:56:06.96ID:0HcNv3Vt
>>990
何故に?
0993デフォルトの名無しさん2015/02/14(土) 10:04:45.63ID:5BqTjtvr
>>992
式の結果は使われなくても範囲外になったら
いけないんじゃなかったっけ
int a[10];
a-1; // NG
a+9; // ok
a+10; // 一つ後ろはok
a+11; // NG
0994デフォルトの名無しさん2015/02/14(土) 10:15:24.94ID:C4CV/7ib
in* a = 100;ってするのもダメなのか?
そんなわけないだろ
0995デフォルトの名無しさん2015/02/14(土) 10:18:34.88ID:+bNdvInf
>>993
最後のひとつのその次は OK だったはず
0996デフォルトの名無しさん2015/02/14(土) 10:28:21.35ID:Be2NMpD8
>>993
最近では、そんなできて当然なことがエラーになるの?(´・ω・`)
Cでも?C++だけ?今までつかったコンパイラではワーニングすら
出るのはなかったけど?(´・ω・`)
0997デフォルトの名無しさん2015/02/14(土) 10:39:31.30ID:c5GE7VHu
単なるポインタではなくイテレータとしてとらえるなら、end()の次が保証されてないコンテナは多いから、最後の一つの次の次を指すようになるコードは書かない癖を付けたほうがいい
ただし、
while ( *dst++ = *src++ );
の場合は、デリファレンスと代入を行っている以上、*srcが0になる箇所までは範囲内だろうから、最終的なポインタの位置は最後の一つの次になる
0998デフォルトの名無しさん2015/02/14(土) 10:40:10.80ID:5BqTjtvr
最後の'\0'までは配列の範囲か
勘違いしたすまぬ
0999デフォルトの名無しさん2015/02/14(土) 10:49:11.74ID:wzIej5FK
だがoffsetofマクロの実装はアウチだ
1000デフォルトの名無しさん2015/02/14(土) 10:49:49.31ID:OXl2Mf25
>>994
それコンパイルエラーにならないの?
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。