ヘムレンさんポジションのザコが暴れるスレ。
見地と良識を備えたムーミンパパは居ない
ちなみにヘムレンは種族の呼称
↑荒らしは無視してね
STLつかうと一気に実行ファイルサイズが10倍に?!
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
----テンプレここまで-----
みなさん、hoge++スレへようこそ。楽しくhoge++ね
↑荒らしは無視してね
>>4 正直もうBorlandとか誰も使ってないし
VC++でさえ使う人減ってるだろ
>>9 MSが色々提供しているからね。
いまさら化石MFCではじめるWINはないよって感じあるからな
>>10 普通に間違えて覚えてた。C++14には入らないのか・・・
GUIはC#で、C++でDLLしてP/Invokeというのがいいな
しかしSTLとDLLの相性の悪さは泣ける
中だけで使うのなら問題ないけど
GUIはC#でWPF、ピンボケするのはWindowsAPIだけ、自前のネイティヴコードはC++.NetでラッピングしたDLLにする。だろ?
未だにSTLみたいな前世紀の化石ライブラリを使うようなプログラムは
C#などと組み合わせるべきでない
コンテナすら使わないプログラムならわざわざC++で実装する必要ないもんな
「ヘッダはコンパイラが提供するものなのであなたが作らないでください」
「STLは前世紀の化石ライブラリ」
----テンプレここまで-----
「ヘッダーという用語は規格上は処理系が提供するものを指すので、.hファイルの意で使用すると荒れる恐れがあります」
→インクルードファイルと言うと回避できます
「昔存在したSTLが規格に吸収され、規格には当該部分にSTLという識別がなくまた当時のSTLとは完全に同一でないことから、現規格のstd::vector等をSTLと呼ぶと荒れる恐れがあります」
→標準ライブラリのvectorと言うと回避できます
----テンプレここまで-----
>STLとDLLの相性の悪さ
クラステンプレートはクラスのテンプレート
であってクラスじゃないからねぇ。
そもそもライブラリ境界を跨いで
クラスオブジェクトを渡すなよ。
>>21 でもさ、C#というGUIのガワを被せて、肝心の中身はC++の利点であるコンテナを
使いたいって事は多いだろ?
今のC++の仕様ではどうしても一度DLL内で計算した結果をXMLなどにシリアライズ出力
して受け渡しするという不格好な方法しか取れない
そう言うと「C++はC++、C#はC#で別々に使えよ、同時に使おうとするのが間違い」って
なっちゃうけどな
その通りだけど
C#は基本的にMarshalなアンマネージドオブジェクトは異質の物と見てるもんな
COMでおk
COMはやめろよ
もう古すぎる
>>22 >今のC++の仕様ではどうしても一度DLL内で計算した結果をXML
えっ、C++側で.NETのラッパーに
変換するんじゃないの?
C++使っててCOMが古いとかハッハワロス
COMを使わなくて済むのが.NETの強みなんだが・・・・
COMの開発は管理者権限が必須なのが前時代的だな。
ま、確かにP/Invokeはお世辞にも使いやすいとは言えないな
「あんまし使うなよ」って事か
.NET Framework が native 化できることで、
このあたりのもどかしさはなくなるんだろうな
もう C++/CLI 書きたくないお(;ω;)
>>30 C++/CLIなんて罰ゲームみたいなもんだな
C++の部分だけ分離して呼び出し側でマーシャリングとか出来なかったのか
COMはRTで使われてるし全然現役
それは「実行バイナリがマシン語で書かれているから
マシン語のプログラムは現役」
並のミスリードだな
34 :
デフォルトの名無しさん:2014/04/06(日) 22:53:39.67 ID:XLm+xFbR
普通にC++語るスレになっててなにより
いつぞの荒らしも飽きたかどっか行っちゃったみたいね
荒らしが多すぎてもう
どの荒らしのことなのかわからない
普通DCOMだよね〜
にゃんぱす!
>>33 マシン語並みに空気みたいな存在になったと言うことだな
41 :
デフォルトの名無しさん:2014/04/08(火) 02:53:30.05 ID:xaBD9l1I
C++ は MS がすべてじゃないし
どこぞの糞仕様のための言語じゃないし
マジでおまいらのワールドしょぼすぎ
>>42 なかなかいい文句だ
それを出だしに使って140字以内でキレのあるあおり文にまとめてくれ
しつもんです。
可搬性のある、C++のソースファイル名に使用可能な文字の制限ってどなたかわかりますか?
>>44 そうだな
#や@といった機種依存文字を含まず
アルファベットの大文字小文字混在無しで
ベース名8 文字以下なら安心だろう
MS-DOSとか糞環境乙としか言えない
std::wregexで
括弧やドットを正規表現で使いたいのですがうまくエスケープできません。
¥x28と書いてもデバックでエスケープされてないようです。
このような場合はどうしたらいいのでしょうか
L"\\. \\("
これでエスケープされるだろ?
元が \( なら 文字列で書くと "\\(" だろ
C言語板で聞けよ
C言語板なんかあったっけ?
正規表現に普通の文字列とか
なに馬鹿なことやってんの
LR"unko(.\(うひょ\))unko"
>>56 ありがとうございます
結局uniform_int_distributionとかかませたのがまずかったみたいですね
>>54 覚えたてで嬉しいのはわかったからそこらじゅうに貼るなよ
>>58 何年も前に出来た規格に対して
覚え立てとか何を言ってるの
>>59 > 何年も前に出来た規格
だからいちいち貼る必要なんかないだろ
バカなの? (w
>>60 >R"aaa[xxx]aaa" と書くこともできるのか?
できません。
>亜種がいろいろとあるのか?
ありません。
『"(』と『)"』が基本形のペアで『"』と『(』、『)』と『"』の間に同じ文字列を入れてもペアになる
すいません、イテレータをちゃんと理解できてない初心者なのですが
for( itr = tmpList.begin(); itr != tmpList.end(); itr++ ){
# 処理1
}
for( itr = tmpList.begin(); itr != tmpList.end(); itr++ ){
# 処理2
}
こんな風に書いたら2回ループしてくれるのかなと思ったら、1回目しか実行されていないようなのですが
2回やるのはどうしたらよいのでしょうか
66 :
デフォルトの名無しさん:2014/04/10(木) 18:34:41.66 ID:M6lNLtoT
ちょっと表現するのが難しいところなんですが
multimapのイテレータなんですが
人が書いたソースを改造していて、
全部ソース張れよ
どうせ処理1の中で余計なことをしているんだろう
こういう質問者ってなんでwandboxとかに全ソース貼らないんですかね
貼ればわかるさ
あ、ごめんなさい。
そもそもこのmapに値がうまく入ってないっぽいです。
勘違いです。お許しを
詫びは金券で
>>68 C++はゆとりが使う言語
ゆとりにそんな高度のこと要求するってアホじゃない
ゆとり駆動開発
intに32bitもいらないけどint8_tにしたら速くなる?
>>73 単発でのアクセスなら速くはならない。変わらないか逆に遅くなることもありえる
多くの値に短期間でアクセスするなら総合的に速くなることはありえる
i80386 搭載パソコンよりも昔のものでないと早くはならないな
大昔にタイムスリップでもしてみればいいよ
おまえら勝手に前提条件を絞るなよ
毎秒2億個のデータのメモリI/Oを行う処理だったら速くなるだろ
stlコンテナが返すsize_tに64bitもいらねぇと思うのは俺だけ?俺だけ
SSEとか使えば早くなるんじゃないかな
>>76 メモリと言うのが最近のpcに普通に搭載されているRAMの事なら、恐らく遅くなると思う
メモリマップされたハードウェアへのアクセスの事を言ってるなら、速くなるならない以前の問題かなと思う
>>73 つまり環境ややりたい事次第としか言えない
基本は実測あるのみ
>>80 まずは論理的な思考ができるようになってから出直した方がいいよ
おまゆう (w
論理的な思考はゆとり言語使いには不可能だよね
うむ、AVIVAで勉強して出直してこい
ドモルガンの法則
関数にするか俗にいう関数オブジェクトにするかの
決定基準を教えてください。
関数オブジェクトにする。
ありがとうございます。
関数を作らないのがC++の流儀なのですね。
89 :
デフォルトの名無しさん:2014/04/12(土) 15:25:15.43 ID:+b8z6TLB
んなことない
90 :
LILIN:2014/04/12(土) 17:53:04.29 ID:3XpcVmBg
92 :
LILIN:2014/04/12(土) 18:34:00.11 ID:3XpcVmBg
よくわからないんだけど、wostream, wistream, istream, ostream, char wchar_t
これらはあくまでプログラム内部で1バイトや2バイト固定長で、ストリームのバイト幅は1バイトしかないでおk?
複数バイトをディクス・ファイルに特定の符号化でエンコーディングした文字コードを文字として出力するときも1バイト単位を処理する必要あり?
もちろん出力先はコンソール・インタープリタではなく。
>>86 ・関数が状態を持つとき
・関数を引数として渡した先でのインライン展開を期待するとき
・ラムダ式を使いたいとき
は関数オブジェクトにする(になる)
>>92 1バイト単位を処理の主語はなんだ?
誰が1バイト単位を処理するんだ?
95 :
デフォルトの名無しさん:2014/04/12(土) 20:16:07.56 ID:kaC5V1Cc
大抵の機械のシステムコールあるいはAPIにおいて、入出力はバイト単位で行われます。
従って、それらを利用する大抵のライブラリも、バイト単位の入出力を利用しています。
大抵の環境において、C++標準ライブラリはバイト単位の入出力を利用していますが、
codecvtというクラスによって、文字符号化の変換やwchar_tへの変換などを行っています。
C++のストリームは、このcodecvtを利用しています。
LILIN様は、まず、codecvtについて調べてみてはどうでしょうか?
あるいは、ロケールというキーワードも参考になるかもしれません。
「そのくらい知ってる!」という場合は、申し訳ありません、早とちりでした。
97 :
デフォルトの名無しさん:2014/04/12(土) 20:18:36.80 ID:kaC5V1Cc
じゃあ僕は、トリコで説明してほしいです。
98 :
LILIN:2014/04/12(土) 21:11:39.73 ID:3XpcVmBg
クラス変数で、
static const int a=1;
がなんで宣言であり定義とどこがちがうんですか?
クラス変数で
const int a;
と定義してコンストラクターで初期化するのと
上の方法の違いってなくないですか?
constでメモリが参照されなければ最適化で変数は値に置き換えられるじゃないですか。
staticをつける意味はなくないですか?
インスタンス2つ以上作ってから言え
>クラス変数で
>const int a;
>と定義してコンストラクターで初期化するのと
初期化とは言えない。
constだからコンストラクターでは代入できない。
constじゃなくする場合、クラス変数なのにインスタンス作るたびに値が変化しうるけど、それで目的にあってる?
えっ,コンストラクターの横についてる:の後ろのやつならできるでしょ
>>105 実態の数は両方とも0だと思いますけど
あと、一番初めの質問も教えてください。
static const int a=1;が宣言であり
定義ではないということです。
メンバ変数での
static const int は特別でコンパイル時定数になります
>>106 定義でないという根拠は?
9.4.2段落2から読んだのならそこは
「チョーンジン=犯罪者ではない」と同じで
チョーンジンに犯罪者がいないと言ってるわけではないと思う。
段落3を読む限りstatic constは定義では
>>109 effective C++に定義ではなく宣言ですと書いてある。
sizeof(test2)をやるとaのアドレスを参照するから
メモリーが確保されるってことですか?
>>111 で、
君が
>>107で言ってる「メンバ変数でのstatic const int」ってのはどれのことだ?
>>114 クラス変数のことをメンバ変数とか呼ぶから混乱するんだろ
>>115 混乱してるのはお前だろ…
javaじゃないんだから用語はメンバ変数で正しい
>>116 おおもとの
>>99がクラス変数って言ってるんだからそれに沿えばいいだろ?
そもそもstaticのあるなしが問題になってるんだから呼び分けろ。
混乱とか言ってるのID:g6kjuewa だけなんだが
なんで突っかかってきたんだ?
1.クラス変数という言葉はc++で言うstaticメンバ変数の意味で使われる
2.もとの
>>99もその意味で使ってるようだが、ちょっと間違ってる
3.
>>100でその点を指摘した
という流れだが?
>>119 もともとの
>>99を読んだら
グローバル変数や自動変数でなくメンバー変数の意と
して使っているとわかりそうなものだが。
>1.クラス変数という言葉はc++で言うstaticメンバ変数の意味で使われる
お前の脳内ではな
>>120 >>1.クラス変数という言葉はc++で言うstaticメンバ変数の意味で使われる
>お前の脳内ではな
「クラス変数」とか「インスタンス変数」言語を特定しないは一般的な用語であり、
C++においてはそれぞれ「staticメンバ変数」と「メンバ変数」と解される。
・・・と理解していたが、それは俺の脳内だけなのか?
もし違ってたら謝ります。
読み返してみた。
>>99が「クラス変数」と「インスタンス変数」を使い分けて質問してるもんだ、と頭から思い込んでいた。
すまんかった。
>>121 うむ、Javaの知識と感覚でC++の質問に答えたお前が悪い
メンバイニシャライザも知らんかったみたいだし
参考までにJava言語仕様8.1.6には
クラス変数などという用語は出てこない
ちなみにstatic Fields(8.3.1.1)がJavaの用語。
対する用語は「インスタンス変数」なんだよな。
『A field that is not declared static (sometimes called a non-static field) is called an instance variable』
重要な事を忘れていた
ただのconstのメンバ変数でも、実体が必要になる
コンパイル時定数となりうる物は、
この実体がなくても良い、という部分が決定的に異なる
>>126 >この場合、定義無しだとコンパイル時定数となるが、実体は無い
それは規格のどこから読みとりましたか?
9.4.2 p3
> If a non-volatile const static data member is of integral or enumeration
> type, its declaration in the class definition can specify a
> brace-or-equal-initializer ...
> ... The member shall still be defined in a namespace scope if it is
> odr-used (3.2) in the program and the namespace scope definition shall
> not contain an initializer.
すまん、レス見えてなかった
規格が改訂されたばかりというわけでもないのに
バージョンを示せとはこれ如何に
クラス変数とかインスタンス変数とかって
java用語じゃなくてUML用語ではなかった?
>>126 俺、constな静的メンバって使ったことはないと思うけど特殊なんだな
定義無しだと#defineと同じようになるのか。メモメモ
>>135 それは少々珍しいと思う。
テンプレートパラメータにint Nがあって
static const int value = N;
とやって公開するのは結構ある。
>>134 入門 UMLしか読んでないにわかですが
UMLだと、クラスと対になるのはオブジェクトで、
インスタンスという用語は、ある抽象概念に対する具象概念を指すものだったはず
例: クラスのインスタンスはオブジェクト、関連のインスタンスはリンク
>>134 クラス変数もインスタンスも変数も一般的に
使われる用語だしwikipedia等にも出てるけど、
UMLではより一般的にクラス属性`/インスタンス属性
って呼んでると思う。
まとめると次のようなことですか?
constなインスタンス変数はアドレスを参照しない限り最適化でコンパイル時に定数に置き換えられる。
クラス変数はアドレスを参照しない限りコンパイル時に定数に置き換えられる。(アドレスを参照できないようにするにはenumをつかう)
これは関数のconstかつstaticな変数とconst な変数でもおなじことですか?
constがついているからといってコンパイル時定数に置き換えられるとは限りません
コンパイル時定数に置き換えられるのは基本的にメンバ変数のstatic const intだけです
なにいってんの?
ヘッダにconstで定義しておけば定数に展開される
変数と違ってコンフリクトせずにリンクされるだろ
最適化畳み込みと定数を一緒にすんな
なにその最適化論馬鹿なの?
ヘッダに const 書く場合とソースに const 書くのとは
まったく別なんだけどさ
なぜヘッダならソースならの話になるんだ
必ずコンパイル時定数になるのと
もしかしたら最適化で定数にしてくれるかもしれない
は全く別の話だろう
ヘッダーは処理系が提供するもので
プログラマーが書くファイルはヘッダーとは言わないんだけど
そこんとこOK?
>>146 いや,自前でヘッダを書くことは普通のことかと
分割コンパイルしたことありますか?
>>148 >>19 >ヘッダーという用語は規格上は処理系が提供するものを指す
規格とやらののどこにかかれているか引用してくれ
ISO/IEC 14882:2011の16.2段落1〜7あたり?
微妙な記述だな
>>146 あなた上のJava知識で答えてる人ですよね
初心者でも言いませんよそんな事
>>142 ただのメンバ変数を実際に初期化するのは、コンストラクタですので
定義の場所は関係無いです
その上コンストラクタのインライン化で、constメンバが最適化で定数になろうが、
ソース上では定数式として扱えることとは別次元の話です
データメンバに構造体配列があんだけど{{,,,},{,,,}…みたいなやつで初期化できない
案として関数で同じ型tempに入れた後memcpyするって考えたんだけど、
{{,,,},{,,,}…みたいなやつ以外で配列に楽に数値入れられる方法ない?
157 :
デフォルトの名無しさん:2014/04/15(火) 23:43:50.57 ID:irAkhtzu
取り替え 新しい
>>152 part109から出てる話(のコピペ)だが、実は規格的にはその通りらしい。
ドヤ顔がうざいので
>>18-19あたりでテンプレ化が提案された。
403 デフォルトの名無しさん sage 2014/01/04(土) 03:26:18.89
>
>>400 >ヘッダーというのはコンパイラが提供するものなので
>アナタは書かないで下さい
429 デフォルトの名無しさん sage 2014/01/04(土) 13:36:43.48
>おそらくど初心者の寝言
432 デフォルトの名無しさん sage 2014/01/04(土) 13:52:11.33
>iostreamのようなものがヘッダーで
>プログラマーが書いたmy.hはヘッダーじゃないってことだろ。
>「インスタンスと言ったらテンプレートの話」レベルでは厳密には正しい。
>規格上は
>#include "my.h"
>はヘッダーでなくソースファイルのインクルード。
「インスタンス」のテンプレ化も誰か考えてくれ
>>151 16.2 Source file inclusion
[cpp.include]
1 A #includedirective shall identify a header or source file that can be processed by the implementation.
この or は「すなわち」と読んでしまいそうだ
私も
>>162の意図は理解できかねますが、
規格には確かに明示的には書かずとも、使い分けているようです
初心者でも言わない、と言った事を謝ります
> A preprocessing directive of the form
> # include < h-char-sequence> new-line
> searches a sequence of implementation-defined places for a header identified ....
> 3 A preprocessing directive of the form
> # include " q-char-sequence" new-line
> causes the replacement of that directive by the entire contents of the source file identified...
> [Note: (略) in general programmers should use
> the < > form for headers provided with the implementation,
> and the " " form for sources outside the control of the implementation.
どっちが初心者だってことか。C++の世界は奥が深いな。
一つ言えるのは、
この知識が役に立つことは今後無い
>>156 vs2012に張り付けてみたらtest::innerのところ波線引かれてるんだけど
>>167 それって規格準拠度が(ry
実は俺も::innerは初めて見た……ググっても内部クラスのことしか出てこねぇw
vs2010でデフォルトエンコードをUTF8にする方法ってないですよね・・・?
ヘッダがマシーンによってプロデュースされるなんて話は初めて聞いた
>>168 2013だと波線でなかった。新しめの方法なんですね
>>164 使い分けてることと、提供するかどうかは別だと思うが
#include "〜" はソースもインクルードできるからヘッダーって言ってないだけじゃね?
173 :
デフォルトの名無しさん:2014/04/16(水) 14:57:05.92 ID:cUKcFdx2
だな
>>164を読んで#include ""するソース(ヘッダ含む)はヘッダと呼んじゃいけない
と判断するやつはどこかおかしい
つか".h"".hpp"なんだから素直にヘッダって呼んでやれよ
なにか?じゃあこのhは別の意味のhか?
>>169 neareal.net/index.php?Programming%2FEnvironment%2FVisualStudio%2FChangeTheCharacterCode
>どうやらVisualStudio2012以前のVisualStudioには
>デフォルトのエンコードを設定する方法はないようです。
第一段落で
A #include directive shall identify a header or source file
と言う説明があるからheaderとsource fileは別物
むしろ
>>164を読んでhがheaderと思う方が変
ヘッダーファイルって文字通り先頭で読み込むファイルのことでしょ。
その拡張子はCでは慣習的に.hにしてた。
ってことじゃないの?
規格から読みとれるのは以下
・#include<>は処理系定義のheaderをインクルードする
・#include""はソースファイルをインクルードする
・#include""はソースファイルが見つからなかったら
#include<>として再解釈する
・headerとソースファイルは別物らしい(16.2p1)
そのためheader fileなどという用語はない
・stdio.hは処理系提供のheader
・unistd.hも処理系提供のheader
・myprog.hはソースファイル
・規格にはファイルの拡張子(.hと.cpp)についての言及無し
さあmy.hはヘッダーか否か?
179 :
デフォルトの名無しさん:2014/04/16(水) 17:23:29.68 ID:cUKcFdx2
ヘッダー/ソースっていうんじゃなくて
ヘッダー/実装っていう2分だよな
規格中の言葉遣いが完全じゃないところに拘るのはちょっと。。。
ソースファイル納入を条件の仕事で下請けがヘッダファイルを除外して納入してきたらどう思う?
180 :
KAC:2014/04/16(水) 17:35:03.48 ID:JwWRkONO
ソースファイルってのは、ソースコードがかかれたファイルの事。
なので、ヘッダファイルと呼ばれているものもソースファイルの一種。
ヘッダファイルというのは、
ソースファイルのうち先頭で読み込まれることを前提としたもの。
#include "my.h"
void main(){
#include "my.c"
};
なら、"my.h"はヘッダで、 "my.c"はヘッダじゃない。
処理系がヘッダ以外のものを提供することは前提としていないから
処理系が提供するヘッダという記載になっただけじゃ?
ソースAにグローバル変数で以下のように宣言されていて
static double gdatanum=0.0;
これをGetSetする関数があるのですが
ソースBでSetしてソースCでGetすると値が0.0でした
なぜでしょうか
Setでgdatanumに代入ができてないのだろう
>>180 >ヘッダファイルというのは、
>ソースファイルのうち先頭で読み込まれることを前提としたもの
自分の脳内定義を居丈高に主張されても
>・headerとソースファイルは別物らしい(16.2p1)
>・myprog.hはソースファイル
この状況でmy.hがヘッダーと言う人は論理的な思考が出来ない人
184 :
KAC:2014/04/16(水) 17:54:52.47 ID:JwWRkONO
>>181 GetSetする関数とそれを使う所のソース貼ってみたら?
185 :
KAC:2014/04/16(水) 17:55:35.03 ID:JwWRkONO
>>183 おまえ、"ヘッダ"の意味辞書で引いてみ?
includeするユーザーのファイルはheader fileに限定できないから
source fileと書いているだけなんじゃ。
でも、その表現だと、処理系が独自にヘッダーじゃない
includeするファイルを提供することが出来ないような。
>>187 規格はmyprog.hがソースファイルだと言っているのけれど
header file以外のsource fileって何?
>>185 C++の話をする文脈で断りもなく
規格の用語を異なる意味で使ったらおかしいでしょ
>>125 Java言語でもクラス変数で意味は通じると思うよ
× Java言語でもクラス変数で意味は通じる
○ Javaドカタとの会話でもクラス変数で意味は通じる
>>190 Java言語仕様でも「クラス変数」って使われてるよ
すごく細かいことだけど
JAVA()ではstatic fieldとclass variableは
両方とも用語が定義されていて意味が違う
4.12.3
A class variable is a field declared using the keyword static within a class
declaration (§8.3.1.1), or with or without the keyword static within an
interface declaration
>>124みたいな嘘がどこから出てくるのか不思議
>>188 C++の規格では、headerもsource fileも明確に定義されているわけではない。
#includeの定義に定義されていない(がおそらく自明な)用語として用いられているだけ。
そもそも16.2のタイトルがSource file inclusion
その中で<>は指定されたheaderの内容を取り込み、
""は指定されたsource fileの内容を取り込む
とあるからタイトルからして、source fileという表現はheaderという表現を内包している。
6 A #include preprocessing directive may appear in a source file that has been read because of a #include
directive in another file, up to an implementation-defined nesting limit.
さらにこんなことも書いてあるが、ここでいうsource fileって<>で指定したheaderも含んでいるだろ。
headerという用語をユーザー側のファイルで使ってはいけないなんて
ルールはどこにも書いていない。
>>193 都合の悪いところを読み飛ばすなよ
>>178で書いたとおり
「ソースファイルを取り込むものだけど
失敗したらheaderの取り囲み」だからタイトルが
Source file inclusionなんだよ
>ここでいうsource fileって<>で指定したheaderも含んでいるだろ
どこからそんな妄想が?
もう一度書いてやる。
>・headerとソースファイルは別物らしい(16.2p1)
>・myprog.hはソースファイル
この状況でmy.hがヘッダーと言う人は論理的な思考が出来ない人
小保方みたいなこといってんじゃねーよ
>The method by which a sequence
>of preprocessing tokens between a < and a > preprocessing token pair or a pair of " characters is combined
>into a single header name preprocessing token is implementation-defined.
ここに関しても良く分からんというか、single souce file nameの時は
実装定義とも未定義とも書いていないが。
明確に定義されないで使われている用語に関して
その使われ方から類推して一般的に用いられているのと
違う意味として定義されているように解釈するのは
それこそ、論理的思考ではないだろ。
>>176 お前、そんなところでちょん切るから 「A or B において A≠B」 という誤解が生じるんだ、ちゃんと全文を書け
1 A #includedirective shall identify a header or source file that can be processed by the implementation.
この場合、. 「A or B において A≒B」の可能性を否定できない
「A いいかえると B」「A すなわち B」「A つまり B」と解釈する余地がある。
高等学校リーダーの初歩だからしっかり復習したまえ
>>197 論理の世界じゃ「AもしくはB」は排他的論理和だからな……
「AまたはB」だと両方真でもOKだから。これはプログラムでも同じこと
そのあとに
>>164の使い分けが続くのに
どうしてそんな曲解ができるだぜw
>>197 高等学校リーダーの初歩が分かっているなら
能書きは良いから、その文を和訳しろよ
「1行の#includeディレクティブは唯1つの、処理系が処理できるヘッダーもしくはソースファイルを識別する(様に記述する)べきである」
そりゃそうね。ここではheaderとかsourceとか主題からはどうでもいい
>>192 英語苦手だから間違ってるかもしれないけど
Java言語では、「static フィールド = クラス変数」だと思うよ
> 8.3.1.1. static Fields
> ...
> A static field, sometimes called a class variable, is incarnated when the class is initialized (§12.4).
スレ違いごめんなさい。
>>197 このような堅い文章で、カンマなしのorを、すなわちなんて訳さないと思いますが
>>203 その一文だと、正式名称はスタティックフィールドという意図になると思います
>>202 なんで、
ヘッダーいいかえるとソースファイル
ヘッダーすなわちソースファイル
ヘッダーつまりソースファイル
ってしないんだ?
でもこの話の発端となった
>>99では「クラス変数」という表現でインスタンス変数のことも指してたし、
あんまり一般的じゃないのか?とも思った。
209 :
デフォルトの名無しさん:2014/04/16(水) 22:51:59.76 ID:cUKcFdx2
何の役にも立たない、どーでもいい重箱の隅のトンチクイズみたいなのばかり盛り上がるね
>>207 Java言語仕様では
>>192に示した「class variable」は
斜体つまり特別なterm。
その定義(4.12.3)が「class宣言内のstaticなフィールドおよび
インターフェース宣言内のフィールド」なの。
そして何故かclass内のstaticなフィールドのみをstatic fieldと呼んで(8.3)
インターフェース内のstaticなフィールドを
static fieldと呼ぶ記述は見あたらない(9.3)。
ちなみに先月のJava言語仕様改訂までは
static field=class variableでいいと思う
インクルードパスが通ってるところがヘッダーでそれ以外がソースファイルってことか
一般的に使われている用語の話と規格の定義を一緒にする人がいるから
規格の解釈を語ろうとする人との会話が噛み合っていない
盛り上がってるとこ悪いけどコンパイル時定数にしたいならconstexpr使えよ
>>213 爺がが多いこのスレ住人はC++11は使わない
C++11は完全にゆとり用だし
>>204 たしかに
>>197 の解釈をしたいのなら同格のコンマ、がほしいところではありますね
それにしても「ヘッダ」と「インクルードファイル」を分けた思想がよくわかりませんね、内容に差はないのに
失礼、非限定用法のコンマ、としたほうがいいかな
爺はC++すら使いませんが…。
何度注意してもmemsetでクラスを初期化しようとするし
むしろ使わせてはいけない。
baad f00d とかdead beef じゃ無いだけまし
>>215 ヘッダはコンパイラから見て内容がほぼ固定であり、ファイルとして処理するよりも効率的な、
(たとえば規定どおりの宣言を有効にするコンパイラ内部のフラグを立てるだけ、とかいう)
実装があるかもしれない・・・ってことだと理解している。そういう実装を見たことは無いんだけど。
ヘッダはファイルじゃなくてもいいんじゃなかった?
ヘッダーはファイルである必要はないよ
メジャーなコンパイラの実現方式がファイルであって
プログラマがヘッダーをコンパイラに追加させる仕組みが
インクルードディレクトリ
ディレクティブ
>>210 「 class variable 」の説明部分見ました。ありがとうございます。
interface のフィールドは、実質的に public static final がついた状態になるので、
あえて static フィールドとは言わないのだと私は思います。
スレ違いごめんなさい。
スパゲッティつくってくる
食いもんの方か、プログラムの方かわからんから突っ込みづらいわ
>>225 コードの方なら普通全力で止めに入るもんだろ……
そういや実装が見事にスパゲッティなMonacoinが近日高騰するそうですよ
そんな二番煎じの通貨では小麦も買えぬわ
昭和の労害:スパゲッティ
普通の人:パスタ
>>226 自分に関係するなら止めるけど、関係しないなら割りとどうでもいい。
本人趣味でやってるかも知れんし。
>>229 スパゲッティ以外のパスタを知らない田舎者。
これどういうことですかね…
/* g++ 4.7.2 */
#include <iostream>
#include <chrono>
#include <unistd.h>
int main()
{
std::chrono::system_clock::time_point tp1;
std::chrono::system_clock::time_point tp2;
tp1 = std::chrono::system_clock::now();
sleep( 3 );
tp2 = std::chrono::system_clock::now();
std::chrono::milliseconds m1 = std::chrono::duration_cast<std::chrono::milliseconds>( tp2 - tp1 );
std::cout << m1.count () << " msec." << std::endl;
std::time_t tt1, tt2;
tt1 = std::chrono::system_clock::to_time_t( tp1 );
tt2 = std::chrono::system_clock::to_time_t( tp2 );
std::cout << std::ctime( &tt1 )
<< std::ctime( &tt2 )
<< std::endl;
return 0;
}
// 3000 msec.
// Fri Apr 18 00:05:57 2014
// Fri Apr 18 00:05:57 2014
どうって、その情報からは
お前がコミュ障ってことしかわからん
sleep(3000)ってしようとしたのかな
now()で3秒空けて2回時刻取得したのに
to_time_t()で文字列に変換したら差が無かったって事でしょ
sleepは秒指定なのか?
と
>>234が言ってるぞ。
>>232の
std::cout << std::ctime( &tt1 )
<< std::ctime( &tt2 );
を、
std::cout << std::ctime( &tt1 );
std::cout << std::ctime( &tt2 );
に変更したら上手く行きました…
そりゃぁねぇ。ctime()は結果を同じ場所に置くから。
strtok()は知ってたんですが、ctime()もそうだとは!
お騒がせしました
>>240 スレッドが関わるとどうなるんだこういうの?thread_local?
20.11.8/2
The contents are the same as the Standard C library header <time.h>.230 The functions asctime, ctime, gmtime, and localtime are not required to avoid data races (17.6.5.9).
なる。もう使うな状態なんだな…
>.... are not required to avoid data races
変更したくても影響大で出来ないのか?
C++11時点で最新のC言語規格にスレッドは無かったし
C++の規格書の中で別の規格であるC言語についてはあーだこーだ言いたくないんじゃない?
歴史を見ればCfrontやMinGWみたいにC++処理系とCランタイムが別々の開発元とかになると手の出しようが無いし
ちなみにISO/IEC9899:2011でもctimeはマルチスレッド非対応
そもそも内部で確保したC文字列を返す関数を使う奴は低能
領域解放の必要のない構造体返して来る関数全般はマルチスレッド対応してないよ。
そもそもctimeが返して来る領域は一時的なものであるのでつかいまわす場合は、
std::cout << std::string(std::ctime(&tt1)) << std::string(std::ctime(&tt2)) ;
と記述すべきところ。
>>250 激しく同意。
struct tm st = *localtime(&t);
とかも良くやる。
_r 系があればそっち使うけどね。
>>248 スレッドがない環境で作られた仕様にダメ出しして悦に入るって...
>>250 >std::string(std::ctime(&tt1)) << std::string(std::ctime(&tt2))
頭が悪いにも程がある
>>252 一つ二つ前のレスくらい呼んだらどうなの?
>>253 > 一つ二つ前のレスくらい呼んだらどうなの?
意味わからん。
ひょっとして、バカなの?
そうだよ
お前の頭が馬鹿なの
C++11からマルチスレッド対応したのに色々使えない関数があるって
増築言語らしいよな。
マルチスレッド非対応の関数を新しい関数を作って
対応させる話なんてないのか?
ctime_s
>>260 Cのctime_sならスレッドセーフだとでも?
スレッドセーフじゃないの?
>>262 保証は無い
でも規格で定められている項目を守ったうえでctime_sをアンセーフに書く奴は頭が悪い
つまりスレッドセーフじゃないんだよね
頭悪いな。
「スレッドセーフであることは保証されていない」の否定は「スレッドセーフじゃない」ではない。
それは
*(int*)0 = 0;
がundefinedなので、落ちるかもしれないけど落ちないかもしれないので
『「安全でない」は誤り』と言うようなもの
ぬるぽ!
ヌルヌルってなんかいやらしぃ
270 :
デフォルトの名無しさん:2014/04/20(日) 13:21:32.24 ID:WoZ5UmxT
別にスレッドセーフじゃないのをラップしたスレッドセーフな関数/クラスを作るなんて簡単なことだから
そんなものはそれぞれの事情に合わせて各人が実装すれば良い事で
互換性が至上な規格側で対応する必要なんてない
それが嫌な人間はC/C++なんてやるべきではない
それ以前にC++に限らず
全ての関数がマルチスレッド対応した
言語なんて存在しない
VCでライブラリがマルチスレッド対応になってる理由はどうしてなん?
>>272 std::mallocなど主要な関数をスレッドセーフにしたものを
「スレッドセーフ版」と呼んでいるだけだが
274 :
デフォルトの名無しさん:2014/04/20(日) 16:50:51.43 ID:Cj94JKP5
WindowsAPIはマルチスレッド用しかないだろ?
それを利用するコンパイラも、素直に実装したらマルチスレッド用だろ。
>>274の論法だとReadFile,WriteFileがスレッドセーフだと
DBMS製品開発者は何もしなくても
データベースがスレッドセーフになってしまう
276 :
デフォルトの名無しさん:2014/04/20(日) 17:08:13.77 ID:Cj94JKP5
APIが再入可能でも、ソフトウェア製作者がそれを破ればそこで終わる。
リエントラント - Wikipedia
リエントラント(reentrant、再入可能)とは、プログラムやサブルーチンが、実行の途中で割り込まれ、その実行が完了する前に再び呼び出され実行されても安全だという性質を指す。
リエントラント性の原則
リエントラントなコードは、静的変数やグローバル変数を保持しない。
リエントラントなコードは自分のコードを書き換えない。
リエントラントなコードは、リエントラントでないプログラムやサブルーチンを呼び出さない。
あれ?
VC++はマルチスッドレ用ライブラリとシングルスッドレ用ライブラリのどっちをリンクするか選べるようになってなかったっけ
最新のは違うのかな…・_・:
staticかdllかを選べるだけ
280 :
デフォルトの名無しさん:2014/04/20(日) 21:20:00.67 ID:Cj94JKP5
互換性に影響する変更点 (CRT)
Visual Studio 2005
シングル スレッド CRT ライブラリの libc.lib と libcd.lib は削除されました。
マルチスレッド CRT ライブラリを使用してください。
/ML コンパイラ フラグはサポートされなくなりました。
いくつかの関数について、マルチスレッド コードとシングル スレッド コード間の
パフォーマンスの違いが重要な問題になる状況に備えて、ロックのないバージョンが追加されました。
http://msdn.microsoft.com/ja-jp/library/ms235497(VS.80).aspx
マルチスレッド対応していない関数に CRITICAL_SECTION で囲えばどれもこれも一発で済む問題だけどねん
>>281 >囲えばどれもこれも一発で済む
本気で言っているのか?
283 :
デフォルトの名無しさん:2014/04/21(月) 00:07:24.73 ID:8o/8KwGl
再入される時点で、停止させて待つだけだろ。それだとマルチスレッド風プログラムが出来るシングルスレッドだがな。
ああ、プログラムから呼び出している全ての関数を
一つのCRITICAL_SECTIONでガードすると言う話か。
そんか糞な発想は無かったわ
その関数が状態をもたないなら囲えば済む話だけど
大抵、陰に陽に状態をもつ事情があるから非対応なわけで
288 :
デフォルトの名無しさん:2014/04/21(月) 03:17:20.97 ID:cBJEGQuq
ipaが矢口以上に問題外なのは分かりきってること
289 :
デフォルトの名無しさん:2014/04/21(月) 06:06:10.48 ID:ZAPzIyVf
a は、RangeOverFlow で b は、AccessViolation というのは大体分かるけど C++ というより C だよなw
290 :
デフォルトの名無しさん:2014/04/21(月) 06:37:37.90 ID:ZAPzIyVf
a の条件というのが、 (画像の列数*3+255-(画像の列数*3)%255) *画像の行数 の値が kMaxIntegerよりでかいときだな
291 :
デフォルトの名無しさん:2014/04/21(月) 06:43:33.92 ID:ZAPzIyVf
おおっと、 もう一個+255 が抜けていた 糞面倒くさい問題だなw
(画像の列数*3+255-(画像の列数*3+255)%255) *画像の行数 の値が kMaxIntegerよりでかいとき
292 :
デフォルトの名無しさん:2014/04/21(月) 06:47:25.74 ID:ZAPzIyVf
c は、 kMaxInteger/bytesOfRow で d が fhBuf.rows だなっ カンタン!カンタン!
>>274 「UIパーツは UIスレッドからしかアクセスしてはいけない」という MSDN にもない掟が流布されている理由は?
UIパーツって何
>>287 引数がポインタだとかstructとかfseekとかで草生えるw
>>293 Win32 APIは知らんが
.NETとかJavaではフレームワークがそういう仕様になっているから
そう思いこんだんだろ
京都府警は当初、地元の暴力団による犯行説を含め少なくとも3〜5つの見立てに沿って捜査を進めていたようですが、
目撃情報や遺留品がほとんどないことから早々に捜査は行き詰まりました。
ある捜査関係者は事件発生から1週間も経たないうちに『事件がまったく読み解けない』と白旗を上げていました」
そう話すのは犯罪に詳しい編集者の久田将義氏だ。
久田氏は近年の警察の対応力の低下を指摘する。
「これは京都府警だけの問題ではなく、警察全体から『捜査のスキーム』が失われつつあるという実態を示すものだと思います。
最近の警察は『事件の裏に潜む真実』よりも、『解決したという実績』を欲しがる。
だから、『解決すべき事件』より『解決方法の分かっている事件』に力を入れる傾向が強まっています。
捜査に対する意識の低下も著しい。
以前、繁華街を所轄する警察署の刑事に街頭監視カメラの死角を指摘したら、『それならカメラを増やせばいい』と言われました。
本来は警らの強化等で対応すべきなのに、監視カメラに頼ろうとする。
これでは警察官の経験を積むことも、捜査の勘を養うこともできません。警察は捜査の原点に立ち返るべきです」
http://ai.2ch.net/test/read.cgi/newsplus/1398042639/
MFCだとUIスレッドでハンドルから一時オブジェクトの構築・破棄とかしてたはず
long double とdoubleを切り替えて2つの同じアプリケーションを作るにはどうやりますか?
>>299 #if defined(MY_DOUBLE_IS_DOUBLE)
typedef double MyDouble;
#else
typedef long double MyDouble;
#endif
>>296 win32 API でも,別スレッドから
GetDlgItem()
SetWindowText()
とすると,バグるよ,
今は UI スレッドにユーザー定義のウィンドウメッセージをPostMessage() して,UI スレッドに拾ってもらってるよ
というか、どのスレッドからでもUIをいじっていいと思った理由が知りたいわ。
>>293 お前が知らないだけだろ
http://msdn.microsoft.com/en-us/library/windows/desktop/ms632597.aspx#multithread_apps
>>303 そのページのどこにそんなことが書いてあるんだ?
>>304 えーと、UIスレッド以外のスレッドからも、直接UIスレッドを操作してもいいという主張をしたいの?
訂正:
直接UIスレッドを操作してもいい
↓
直接Uを操作してもいい
>>305 するとバグるからしないのだが,そんなに大事なことが実は MSDN には明記されていないのではないか?と主張したい
>>307 そういうことね。
めんどくさいから調べないけど、MSDNにもちゃんと書かれてると思うよ。
>>303の先に書いてあるように見えるのだが
やっぱりQは文盲なの?
>>309 うん,たぶんね,でも各種コントロールのところでいちいち書いてほしかった‥‥
>>310 英文盲です
Qはキチガイだからお触り禁止
>>300 ありがとうございます。
コンパイラーでintを64bitに
doubleを128bitにする方法ありますか?
>>312 こんなところで糞な質問をするのではなく
コンパイラーのマニュアルを読んで下さい
clang++とg++の変更の仕方教えてください。
調べてもわかりませんでした。
classってソースファイルとヘッダーファイルでどんな風に分けるんですか?
>>315 他のファイルにみせる必用のあるものとそうでないもの
という基準で分けます
(お、PImpl戦争かな?)
ただしp_implはコンパイル時間が問題となったり
ここぞと言うときだけにした方がよいでしょう
pimplでなんでコンパイル時間が問題になるんだ?
逆に減らすために使うものだろ
ニホンゴムズカシイデス
味方同士の撃ち合いワロタ
>>315 まずは宣言と定義(実装)で分けると良いよ
話についていけない
ファイルの日付変更したいんだが
2014/01/20 16:57:39の場合 0x01CF15B549E45B80となってる物を指定したいのだが
何使えばいい?
まず「常識」と「人とのコミュニケーション能力」を
身につけて駆使することが必用
perlでのunixtimeへの変換
$unixtime = ($unknowntime)/10000000-11644473600;
なんてやる変な日時
>>327 ゲームとかのアーカイブファイルに格納されてる時間
今まではperlでやってたんだけどbignum使うと処理速度が遅くなるんでCで書く事になった
pimplで.cppに書いたやつってインライン展開されるの?
されない
pimplどころかデータメンバ一切持ってないのにsetterとgetter持ってて動くクラス作ったことある。
pimplとデータメンバーは関係ないが
データメンバーが無いのにsetterとは
とんだ糞プログラムだな
バレーボールのシミュレーターだったんだよ
>>328 あんたは>325か?
だとしたら、自分で答えを書いているようなもんじゃないか。
>>334 よっぽど自分でスクリプト書きたくないとしか……
336 :
デフォルトの名無しさん:2014/04/26(土) 00:06:17.38 ID:fIjhv7f7
64ビット整数(long longか__int64かint64_t)を使え
128bit 時代になったら long long long になるんだろうか…
きっとlong long long longだよ
じゃあそのときはlong long longは何になるんだ?
96ビット整数か?
template<int n> LONGN{
typedef long typename LONGN<n - 1>::type type;
};
template<> LONGN<1>{
typedef long type;
};
LONGN<4>::type a; //long long long long a;
64bit OSでもLP64というモデルがあってですね…
ここは超超超絶技巧でみたいな・・・
very long signed integer っていう言葉がすでにあってですね VLSI などと呼ばれています、
その次は、ultra であることも決まってます ULSI ですね
>>343 longとtypename LONGN<n - 1>::typeはそれぞれtrailing-type-specifierなので
複数回出現は不可と思われ
346 :
デフォルトの名無しさん:2014/04/26(土) 22:39:38.79 ID:fIjhv7f7
Visual C++でDICのプログラム作らなきゃあかんのだけど、なんか参考になる本とかサイトあったら教えて
fcloseする前にfflushするべき?
fcloseはまずfflushするからせんでもいい。
>>345 long long int はNGなの?
>>350 戻り値のエラーチェックを忘れずになー
ファイルクローズの失敗って致命的なはずなのにエラーチェックしないひと多い。
read、writeでエラー出てなかった時は、close全然気にしてなかったw
>>352 エラーチェックするのは良いとして、どう対処するの?
ユーザーへの通知くらいしか出来ないでOK?
closeに失敗するようなパソコンを持ってる方が悪い
>>356 エラーにもよるけど、fcloseは失敗しても実質何もできない部類のエラーなんだけど、そこの意識は俺と合ってる?
>>358 メッセージ出すとか、リトライするとか、違うデバイスに保存し直せるようにダイアログ出すとか...
ちゃんと書けてないのにそ知らぬ顔してるアプリの作者はマジプログラマー辞めろと言いたい。
>fcloseは失敗しても実質何もできない
そうやって問題が発生した事実を
利用者に隠すんですねわかります
>>358 他のエラーと同じく通知も分岐もできるだろ。
繰り返しになるけど、何を以って他のエラーと違う「部類」になると思ってるの?
fcloseの仕様も読まずにリトライしろという馬鹿
>>359 結局、エラー通知しか出来ないって事でOK?
リトライするならfopenからやり直しになるけど、そこは認識合ってるかな?
まあユーザへの通知ぐらいはしといた方がいいわな
ハンドル系は閉じる関数違えるミスが結構あるのでその予防にも
>>361 分岐って、、、そりゃ出来るけど、分岐してどうするかが知りたいんだけど。。。
>>363,365
分岐したうえで perror("Closing file"); return EXIT_FAILURE; .だとか、fopen()からやりなおしだとか、
プログラムや対象のファイルに応じていくらでも考えられるだろ。
他のエラーと同じだと言ってる。
いい加減に何が違うと思ってるのか言ってくれ。
367 :
KAC:2014/04/29(火) 14:10:09.18 ID:3cTlepGQ
普通に考えたらわかりそうなもんだけど。
データをファイルに保存する→エラーになった。
破棄する訳にはいかないからもう一度保存を試みる。
ってプログラムを作るのは別に変な話じゃない。
>>361 fcloseが他のエラーと違うのは、そのファイルポインタが一切使用できなくなるとこかな。
つまり、最初からやり直すしか手がない。
出来るなら有限でfopenからリトライするけど、そもそもローカルストレージ相手の場合、この手のリトライはあまり有効じゃないよね。
>>367 別に変じゃないけど、多くの場合あまり意味が無いよ。
ネットワークストレージじゃない限り、リトライで救えるケースてあまりないと思うんだけど、どう?
>>366 多くの場合でリトライが意味をなさない所。
つまり、エラー通知くらいしか対処法が無いって事でいいんだよね?
ネットワークストレージ以外で、リトライで救えるケースを教えてくれないか?
1.USBストレージでユーザが早まって抜いちゃいました
2.「書き込みに失敗しました、リトライしますか?」
3.ユーザUSBを挿し直す(最近はLinuxなんかでも自動で同じマウントポイントにマウントされる)
4.fopenからやり直し→幸せ
372 :
KAC:2014/04/29(火) 14:29:21.87 ID:3cTlepGQ
>>369 リトライといっても色々考えられるから。
別のストレージに緊急退避するってのもあるし、
異常の起きたものを待機系に切り替えてリトライってのもあるし、
パソコンとかならユーザーに保存先入力させるのもあるし。
関数レベルでリトライできないけどエラーを返す仕様になっているのはそういうこと。
>>368-370 エラー通知しかできないことも多いだろうが、既に挙がっているリトライの例のように、それ以外の対処をすることだってあり得る。
通知以外の対処が有効かどうかってのはプログラムや操作対象に応じて変わるだろうとしか言えない。他のエラーと同じ。
「エラー通知くらいしか対処法が無い」を強弁して何がうれしいのかわからないので、エラー処理サボる口実が欲しいのかな?と思ってる。
>>373 >エラー処理サボる口実が欲しいのかな?と思ってる。
って言うか、これが全てだよね?
最初から喧嘩腰だった点で、ああ、俺のレスが気に入らなかったんだな、とは感じたよ。
誰もサボりたいなんて言ってはいないし、それは君の思い込みだった点は認めて欲しい。
単純にエラー処理すべ事例が思い浮かばなかったから、聞いてみただけだよ。
>>372 なるほど、確かにそう言う事例はありそうだね。
ありがとう、勉強になったよ。
>>371 活線挿抜(だっけ?)系のストレージか、確かに確かに。
SDカードの接触不良とかもありそうだなあ。
ID:cLunpA27
が一番偉そうにしてるわりに一番無益な情報しか書いてない件
>>374 サボりたいと思ってるわけじゃなかったのなら、確かにそこは思い込みだったよ。ごめん。
「エラー通知くらいしか対処法が無い」なんてことは無いのを理解してもらって、あとは
具体的に有効な対処をコーディング時点で知ってるかどうかに関わらずエラーチェックを
入れてくれてるなら文句は無いんだ。
ケースバイケースだろ。
プログラムの処理目的によっては、fcloseに失敗しようがどうでもいい場合もあるんだから、そういう場合にあえて書かなくたっていいでしょ。
まあ、癖としてエラー処理を書くようにするというのは悪いことではないと思うけど。何が何でも絶対にエラー処理を書かないといけない、みたいな原理主義はよくないでしょ。
いや、これについては原理主義ぐらいがちょうどいいね
研究で書く捨てコードでさえ例外ぐらいは投げとくべき
年度末の追い込みの時期にバグ探しで泣くことになる
多分、直前のread、writeまでは正常に実行できて、closeしようとしたらエラーになった
疑わしいのはハードウェア障害。だからこのまま使い続けると致命的な問題が起こるかも知れない。
直前の処理結果が失敗してないか、ハードウエアの修理交換をする必要があるか、調べたりする。
警告を出すことは意味がありそう。
可能性は考えたらきりがない
すべてのエラーの可能性を汲み取ったからといって
後々の動作がすべてうまく動く保障などどこにもない
コンシューマと違ってトンでも環境でプログラムを動かそうとする
典型的なキチガイユーザーは除外するに限る
割り込み禁止にしてしまえばいいんじゃね
>>381みたいなのは経験上メモリ破壊とかただのバグの可能性が一番高い
//as-util.h
namespace as {
int open_or_die(const string& filename, int flags, int mode = 0) {
int fd = open(filename.c_str(), flags, mode);
if (fd == -1) {
fprintf(stderr, "Could not open %s (%s)\n", filename.c_str(), strerror(errno));
exit(-1);
}
return fd;
}
int write_file(const string& filename, const void* buff, unsigned int len)
{
int out_fd;
out_fd = open_or_die(filename, 33537, 384);
write(out_fd, buff, len);
return close(out_fd);
}
}
しかしなぜファイルディスクリプタ使うようなC言語的コーディングしてるんだろう
C++のfstreamをつかわないのか
389 :
KAC:2014/04/29(火) 19:04:33.24 ID:3cTlepGQ
>>387 えーと、そのソースで何を主張したいのかよく解らんけど
もしかしてツッコミ待ち?
というか大多数の人はネット上にあふれるbetterCのコードパクって書いてる
だけなんじゃないかと・・・C++を書けよ、と煽ってみる
例外投げろってこと?
RAII
>>388 fstreamはアレが気持ち悪いからいやだ
fprintfっぽいラッパ書けばいけるのだろうか・・・
sprintfで整形すれば解決 :-)
食わず嫌いって奴だな
「生理的に受け付けない」から使わないってたぐい
std::cout << "フィーリング、大事" << "とても大事" << endl;
そもそも書き込み後のfclose()の失敗は、しばしばバッファのフラッシュによる書き込みの失敗なのは分かっているんだろうか。
読み込み後のfclose()でフォローが必要な失敗はほぼあり得ないのとはわけが違う。
printf("%s、とても大事","マユゲ");
printfの戻り値もちゃんと見ないと危ないよな。
printfがユーザへの進捗提示ならわざわざ見ない
標準出力に結果を出すタイプのプログラムなら当然見る
そして標準出力にエラー表示ですね、わかります
そこは標準エラーに繋いでくれよ
出力先ではなく、目的でエラー処理をするかどうかを分けたい。
今どきそんな糞プログラム書いてる奴おるんやなw
>>405 とりあえず上の書き込みには一人もいないようだが、職場にでもいるのか?
>>398 そう、根本的なのはこういうことだよね。
読み取り専用なら最後になんかエラーでたなで無視しても大きな問題にはならないけど、書き込み時のclose失敗は書き込みエラーの可能性が高いから、出力したファイルは壊れてると思うべき。
やるべきエラー処置はその時々かなー
世間ではマイクロソフトのInternet Explorerの
セキュリティ脆弱性が問題となっているけど
この会社は10年経っても学習しないんかね?
バッファオーバーラン対策なんて特別難しいわけでもないし、
いわゆる「バグの無いソフトウェアを開発することは困難」な類の問題でなくて
適切な開発プロセスを経ずに作られていることが問題だと思うんだ。
何を今更
他のブラウザにも脆弱性あるだろうし、問題となっているのではなく、問題にしているだけだけど
ニムダの失敗でget_sみたいな糞関数を広めて
Cの規格にまで入れさせた企業が
オーバーフローするとは嘆かわしい
xxx_s セーフ関数郡は良い布教だと思うがね
ie は大昔から制作しているからその思想で創られていなかったと思われ
>ie は大昔から制作しているから
つまりWindowsオペレーティングシクテム自体が欠陥だらけ
いや、ANSIの規格が欠陥だらけなんだよ
>>414 なにいってんだ?
包丁で怪我したら包丁が欠陥なのか?
包丁で怪我したら人間のほうに欠陥あるわな
つまり413が無能
プロは間違った道具を使わない
無能な鷹は爪がない
>>415 何を言ってるんだお前は。
使い方の問題じゃなくて使い方ではどうにもならない
getsみたいなKUSO関数が存在するってことだろ。
包丁は正しく使えばよいけど糞関数は正しく使うことが出来ないとKUSOなんだよ
いくら規格にあるからといっても, scanf()群とか,使った時点で「私は馬鹿です」といっているようなもの
自 分 の 頭 で 考 え よ う ね
getsは擁護しようがないけど、scanfはまだいいじゃない……
(バイト数制限・バッファクリア等、意外に細かい処理まで行えるため)
いやまあ現実的にはcinなどのストリーム機構使った方がいいんだが
データを取りそこなったときの扱いが見えないんです、*scanf() は。
ああ、馬鹿なのは私です‥‥
426 :
KAC:2014/05/02(金) 22:27:22.69 ID:I4CxCkey
俺はfgetsで一行読んでからsscanfだな
>>426 問題はその後
ストリームには何が残っている?
>>427 それが一番わかりやすいね‥‥ま、なんだかんだいって sscanf() はよく使うね、fscanf() とか scanf() はよくわからないので避けるけれども
ごめんね矛盾したことをいっているね
>>429 いやもう scanf() 族のそんなややこしい書式指定を考えるくらいなら、自由長な fgets() を作って、あとで好きに parse する方を選びます
その url の記事はは結局 scanf() 族を使う限りオーバーフロー/アンダーフローを検出し得ないという問題は認めていますよね
結論:scanf() は使うな‥‥
431 :
デフォルトの名無しさん:2014/05/03(土) 00:31:10.73 ID:NUTNzwaZ
能ある鷹は見えないとこにピック隠すんです
なんかの歌詞だったような気がするが思い出せない・・・
>>433 ひょっとして:Don't say "lazy"
アプリが自分で書いた中間ファイルのように
内容に関して保証ができているケースでなら、
fscanf()も使わないではないけどねぇ。
まぁ、大抵は設定ファイル用のクラスがあるから
それを使っちゃうけど。
宣言と定義の違いがわかりません。
Hに宣言、CPPに定義を書くのが普通らしいですが、
class a{};
なんてのたくさん見かけるのですが・・・
宣言は、概要
定義は、実体
と捉えると良いよ
本で例えるなら、
ヘッダの宣言が索引
ソースの定義が中身
本気で理解したければgccのプリプロセッサ走らせて出力された結果を見た方が早い
それ見て理解できなければ触らないほうがいい
class a{} がソースに書いてあってなんでかと疑問に思っているのなら、その class a といやつは、そのソース上でしか使わないこと前提としてコーダーが記述したとおもわれるよ。
別に宣言だからといってすべてをヘッダに記述しなくてもいいし、他のソースでも class a 参照したければ、ヘッダにかけばいいし、その場合はテンプレートでもなければ、定義と宣言にわけて書いたほうがオーバーヘッドも少なくて済むよ。
444 :
441:2014/05/06(火) 19:29:27.72 ID:Fm+h5E30
>>442 元の>437の聞きたいことが曖昧な中で、ヘッダファイルにクラスの定義となるclass a{};なんてのが
書かれてるのをたくさん見かけるのを不思議に思ってるのかと思ったんだけど、違ったのか?
>437の聞きたいことがわかってるんなら書いてくれよ。そのまま回答してくれてもいいだろうし。
宣言と定義は441の通り。
HとCPPは他のCPPに見せる必用があるもののみをHに書いてそれ以外はCPP。
この二つの話は関係がない。
>>443 ステートフルパターンの時、こんな感じになるね。
ヘッダにはベースとなる基底クラスだけ宣言して、サブクラスは実体含めて全部.cppの中。
テンプレートの定義部をcpp
ファイルに書きたいな
別ファイルに定義書くことならできるだろ
それをヘッダでincludeすればいい
できないことはないよ。
ただ、テンプレートを利用できるようにするために、
ソースにテンプレートの実体を記述する必要があるよ。
たとえば、template<typename T> class matrix {} というクラスを宣言した場合、
メソッドを定義するには、
template<typename T> matrix<T> matrix<T>::inverse() {}
template<> float matrix<float>::det(float *pa, int r) {} //特化
のように記述できるし、
実体を定義するには、
template class matrix<float> ;
template class matrix<double> ;
のようにして T のバリエーションに応じて記述する必要があるから、T のすべての可能性には必然的に対応できなくなるよ。
Comeau使え
C++でメソッドって呼ぶのは違和感あるからやめてぇええw
違和感でなく間違い。
オブジェクト指向に於けるメソッドをC++で実現
するための手段としてメンバー関数を使用するのが
一般的ではあるけれど、
C++の言語仕様の質問をしている文脈では「メンバー関数」が適切
単に言葉の問題なのでは?
仕様書にそう書いてある、とかならその論議はもういい‥‥
Java のメソッドと C++ のメンバ関数で何がちがうというのか?
>仕様書にそう書いてある、とかならその論議はもういい
言語仕様などどうでもよく自分の妄想がすべてというのはいかがなものか
それ関数じゃねーよ、サブルーチンだろ?
なんてうるさいこと言う人を黙らせるための総称くらいに思ってた
メンバ関数はfinalがデフォだが
メソッドはそうではないという大きな違いがある
>>457 デフォルトがどっちに振っているか、という議論が本質をあらわすのか?
final をつけないと継承禁止にできない
virtual をつけないと継承できない
単にそれだけの違いでしかないと思うが‥‥まあ、vtable は重荷だから後者の C++ 流が好み
ポインターを2つ定義するときの書き方は
int * a,b;
int * a,* b;
のどちらが正解ですか?
int* a;
int* b;
が正解です
typedefを使ったほうがいいです。
typedef int* integer_pointer;
integer_pointer a, b;
462 :
デフォルトの名無しさん:2014/05/10(土) 10:33:23.23 ID:4sLYkLKE
int * a,b;
のときはbがポインタにならない
>>459 int *a, *b; これだけが正解。
int *a, **b, c, d[], e, *f, *g[]; ね?
めんどくさいから何でもいい。
だが正解は
>>460かな。
他人の突っ込んだバグに苦しめられたことのない者だけが
>>460 に石を投げよ
石を投げる資格のあるものは、石を投げる必然性を感じない罠。
>>465 正しい書き方のうちより良いものはどれかって議論なんだから、間違ってる
>>462なんか考慮外だよ。
C言語はわからん、特にクラスとか全然・・・
なんていう先輩がいるんですが、どう対処していいものやらw
>>469 会社なのか学校なのか知らんが教えてやれよw
>>469 アセンブラから始めて絶望の淵に叩き込んでやれよ
>>472 そりゃtemplateの型が違うもん通らないでしょ
intとsize_tどちらかに合わせなきゃ
#include <iostream>
using namespace std;
template <size_t N>
class int_to_type {
static const int _N = N;
};
struct hoge {
template <size_t N>
int operator ()(int_to_type<N>)
{
cout << N << endl;
return 0;
}
};
int main()
{
// your code goes here
hoge Hoge;
Hoge(int_to_type<2>());
return 0;
}
ああああなるほど、そういうことだったのか・・・・・
ありがとうございます、助かりました
こういう手もあるな
#include <iostream>
template<class U, size_t N>
class int_to_type {
static const U _N = N;
};
struct hoge {
template <class U, size_t N>
int operator ()(int_to_type<U, N>)
{
std::cout << N << std::endl;
return 0;
}
};
int main()
{
// your code goes here
hoge Hoge;
Hoge(int_to_type<size_t, 2ull>());
Hoge(int_to_type<int, 2>());
}
std::integral_constant があるみたいなので、それを使うことにしました
477 :
474:2014/05/11(日) 18:16:16.21 ID:Fsl8qTT6
476は自分じゃないですが、
>>475>>476 勉強になりました
C++11ではLoki::Int2Typeや自前の同等のコードよりもintegral_constant使った方がよさそうですね
integral_constant使ったらこんな感じか
確かに短くすっきりする
#include <iostream>
#include <type_traits>
struct hoge2 {
template <typename T, T v>
int operator ()(std::integral_constant<T, v>)
{
std::cout << v << std::endl;
return 0;
}
};
int main()
{
hoge2 Hoge2;
Hoge2(std::integral_constant<size_t, 2ull>());
}
>>479はすでに見えないんだが、こういうんじゃダメなのか?
#include <iostream>
#include <functional>
struct hoge2 {
template <template <int> class T, int N>
int operator ()(const T<N>& v)
{
return N;
}
};
int main() {
using namespace std::placeholders;
hoge2 Hoge2;
std::cout << Hoge2(_1); << std::endl;
return 0;
}
間違えた
見えないのは
>>472のideoneだった
>>480 すみません全然別のコードコピペしちゃってたので非公開にしてました
placeholdersってbindに使うやつでしょうか?
元々の目的が「ループを強制アンロールして、forの場合に与えるint i(またはsize_t i)を
テンプレートパラメータとして与えたい」ということだったんです
template <int N>
void operator ()()
{
cout << N << endl;
}
だと呼び出せない(VCだと呼べた気がするけど)んで、
Loki::Int2Type<N>みたいなのを受け取ってたわけです
すみません嘘書いてました、呼び出せないと思ったら
Hoge.operator ()<1>();
で呼べますねorz
江添さんチーッス!
ホゲホゲ
486 :
重要:2014/05/12(月) 16:43:30.75 ID:kwTxhBP1
hogeは
>>1で禁止されています。使用しないでください。
万が一hogeが書き込まれても、スルーしてください。
相手にするとあなたも荒らしと同じ扱いになります。
>>483 変態に見えるんだけど、これは正当なコードとして認められてるの?
t.template operator ()<1>();
とか、ぶっちゃけ初めて見たんだけど?
operator()が<1>というテンプレート引数を取ってさらにそれを呼び出すために()を
後に付けた形だから正しい
でも最初見た時何かのAAだと思ったぜ
>>489 仕事でこんなコード書いた人は、
尊敬されるだろうか?
それとも友達を失うだろうか?
あ、それとt.template とするのは、 t.operator()<1>(); と書くと、operator()が従属名であり
テンプレートに属しているかどうか判断できないので < を比較演算子として解釈してしまい
コンパイルエラーになるからだったな
operator()でなくtest()だったとしたら、t.template test<1>();
ってなるわけで、こうなるとそれほど奇異でもないのかな?
って気がするようなしないような?
てか、実はt.test<1>();って書けないことを初めて知った。
>ぶっちゃけ初めて見た
言語仕様を朝から晩まで読む様な廃人生活してなきゃ
知らない文法があって当然。
>t.template test<1>();
これが当たり前だと思う人はかなり危篤
.template
::template
->template
いずれもテンプレートパラメータに依存する「依存名」であるときに必要なキーワードという点で一致
ネストしたクラステンプレートを記述したりすると必要になる・_・) そうしないと「<」が小なりと解釈されてしまう
t.template operator ()<1>();
t.template test<1>();
はtemplate無しだとエラーなのか。
templateメンバー関数ってそれなりに使っているだろうから頻繁に.template 使っているのか?
自分では1回しか書いたことないな。
そんときもコンパイラに促されて初めて気づいた。
テンプレートではパラメータによって構文上の意味が変わることは許されない、
という仕様の約束を理解してれば珍しくても特殊なルールではなく
typedef typename ... の形の場合の typename と同質のものでしかない
>>497 いまいち分からん。逆にパラメータによって構文上の意味が変わるってどんなさま?
tupleの実験してた時にtemplate付けないと上手く呼び出せなくて驚いた記憶が
今回のは試してないけど、VC++だと間違った構文でも結構普通にコンパイル通るから困る
>>499 そのルールがない場合例えば
template<class T>
void f(T t) {
t.x<1>(100);
}
に
struct hoge {
template<int N> void x(int n) { return n * N; }
};
を渡すと t.x<1>(100); はメンバ関数テンプレートをインスタンス化しての呼び出しになるけど
struct piyo {
int x;
};
を渡すと t.x<1>(100); は ( piyo.x < 1 ) > 100; という計算になるというさま
テンプレートにおいては<や>というトークンの構文上の解釈がテンプレートパラメータによって
テンプレートパラメータの囲みになったり演算子になったりするのは許さないという仕様
typedef typenameのtypenameが必要になる場合も
T::x * y;
みたいなときに*が演算子になったり変数宣言のポインタ指定子になったりするのは許さないということで
同じ仕様が関係してる
あたしハンガリアン書いてる男ダメだわ
古臭くて
クラス設計について皆さんどうやって設計してるか教えてください
クラス設計について例えばExcelを使うような処理はOpen〜書き込み・保存〜Closeまでを一つのクラスにまとめる
データベースに更新する場合(複数のテーブルに更新をかけるが、処理自体は別の機能)も一つのクラスにまとめているのですが、
みなさんクラスを作る際はどのような基準で設計していますか?
また、MFCを使う場合はキャメル形式をなるべく使うようにして、そのほかはスネーク形式
メンバ変数は'm_'を頭に付けているのですが、みなさんはどのような記述をしていますか?
>>504 >処理はOpen〜書き込み・保存〜Closeまでを一つのクラスに
まずこの時点でなにか勘違いをしている
>>505 例えばExcelの原紙をもとに一つのレポートを作成する際に、
レポートを作成するクラスを作成して、開くメソッド、閉じるメソッド、保存するメソッドといった感じで構成しているような感じなんですが、
具体的にどういった方法がいいのでしょうか?
>>506 とりあえずお前の言うところの「開く」「閉じる」ってどういう意味なんだ?
「開く」が「ファイルをifstream等で開いて読み込む」という処理だとすると、
排他処理する理由が無ければそのままclose等すればいいだろうし、
(注:ifstreamだとデストラクタが自動でcloseしてくれる)
排他処理する場合でも「閉じる」以外でファイルをcloseせざるを得ない場合が
あるからそっちの処理も書く必要がある(つまり例外安全)
変数名は……俺は基本的にはキャメル形式オンリーかな
>>501 むう、そんなことは考えた事がなかった。
>>501-502 割とガチで勉強になった。
てか、C++って使えるようになってきたかな〜って思ってると、何これ?読みこなせない!
ってことが起きて、やっぱ俺はまだまだ全然だめだめだーってなるの繰り返しだわ。
なんつ〜か、ゴールが見えない。なんなんだよこの言語('A`)
くめりゃいいんだよ
うごけばいいんだよ
そそ 動いてさえいれば defunct だって気にしない
上記のことも含め大抵のことはオライリーのC++言語リファレンス本に書いてあったけどね
書いてあったからと言っても細かな仕様を頭の中に入れるのはなかなか難しいが
Javaだと重箱の隅をつつくような言語仕様の試験があるんだけど、C++にはあるのかな?
>>506 >レポートを作成するクラスを作成
KUSO過ぎる
そんなものは構造化プログラミングの関数でいい
レポート作成機能を持つクラスに違和感は別にないが、
エクセルファイルの操作はそれと関係ないから役割としては切り離さなきゃな。
アンチhogeはただ基地なだけど、hoge使いは優秀なんだな
>>502の説明でなるほどと思った
優秀や基地の評価は主観的だが
ホゲ使いがスレのルールを守れない迷惑な奴であることは客観的事実
>>516 アンチhogeはこんなことしか書けない
class fooTest: public CppUnit::TestFixture {
foo *f;
public:
void setUp () {f = new foo ();}
void tearDown () {delete f;}
void test_add ();
CPPUNIT_TEST_SUITE ( fooTest );
CPPUNIT_TEST ( test_add );
CPPUNIT_TEST_SUITE_END ();
};
CPPUNITで、上のクラスを継承したクラスの
setUpのなかでfを初期化してテストしたいんですけどどうやればできますか?
普通にやったらエラーがでます。
エラーメッセージは?
出るだけじゃわからないだろハゲ
エラーメッセージは忘れました。
CPPUNIT_TEST_SUITE ( fooTest );
CPPUNIT_TEST ( test_add );
CPPUNIT_TEST_SUITE_END ();
上の3つのマクロは消して、継承したクラスに書いてもエラーがでました。
なぜ継承するかというと、fを基底クラスに持つクラスに対して
同じテストをさせるためです。
エラーメッセージは忘れました。
思い出すのはあなたたちの仕事です。
さあ教えてください。
ハゲは関係ないだろ!
むしろすげえなw
これはあくまで予想なんですけど、test_add()が継承したクラスにないから
マクロがtest_addを見つけられないんじゃないですか?
それを防ぐにはどうしたらいいですか?
おおい!忘れたぁ?だと!
おまえどうやってコンパイルしているんだお!?
ごちゃごちゃしたマクロの中のエラーなんで
見ても意味ないと思います。
それよりCPPUNITを使って実際に試してみてくださった方が
早いと思います。
ID:+DAA7cFt みたいに親身になって怒ってくれる人がいるのを幸せに思えよw
class fooTest: public CppUnit::TestFixture {
protected:
foo *f;
public:
void tearDown () {delete f;}
void test_add ();
};
class foo2Test: public fooTest {
public:
void setUp () {f = new foo2 ();}
CPPUNIT_TEST_SUITE ( foo2Test );
CPPUNIT_TEST ( test_add );
CPPUNIT_TEST_SUITE_END ();
};
実例を挙げるとこんな感じでやってエラーになりますl
foo とか foo2 の実体はどこにあるんだよ?
まさか実体ないとか言うなよ!?
実体はありますよ。
fooを継承したものがfoo2なのですが
ここでは簡単のため省略してあります。
書いてほしいのなら書きます。
ちなみにtest_add()の実体もあります。
setUp でエラーが出るなら foo の実体に問題がある以外には考えられないだろハゲ
それか setUp のオーバーライドの仕方が間違っているかだな
それはこのコード自体は正しい。
そして実際に正しいことに確信を持てる。
という理解でよろしいでしょうか?
foo のコンストラクタは引数なし()の定義はしてあるのか?
もちのろんです。
とりあえずfooの実体を晒せ
解決しないようなので。
また次回もう少し具体的な情報を集めてから
質問します。
ありがとうございました。
どいつもこいつもクズばっかりで、まるで役に立たねぇってよ
ところでなんで仮想デストラクタがないfooTestを継承してんのさ
ベースから絶対にdeleteしない覚悟があるんだろう。
デリート用のメソッド()があるからcomオブジェクトみたいに
必ずユーザーがそれを呼び出してから終了する規則なんじゃろ
メンバ変数追加されてないみたいだしいいんじゃね(適当)
デリート用のメソッド()ってどれ?
デストラクタ呼び出しは実際の型に従う
よって fooTest *f; が foo2Test を指していても fooTest のデストラクタが呼び出される
ここでデストラクタが仮想でないと foo2Test のデストラクタは呼び出されない
ここでfoo2Testには自前でデリートしなくちゃいけないデータメンバや破壊時の特殊処理がないのでデストラクタはいらない
(自動変数はデストラクタの有無にかかわりなく必ず破壊される)
一方 fooTest には foo* を削除する義務があるのでデストラクタが必要だが
public な void tearDown () でユーザーに明示的に foo* をデリートする機会を与えている
恐らくこれはcomオブジェクトのように自明な破壊を行う前に
ユーザーによる明示的デリートコマンドの呼び出しを想定している・_・
…いやわかんね^q^;テキトー
>>544 > 自 前 で デリートしなくちゃいけないデータメンバや破壊時の特殊処理がないのでデストラクタはいらない
これはダウトだ。
struct base {
base() { }
~base() { }
};
struct derived : base {
std::string s;
derived(){ }
~derived(){ }
};
int main()
{
derived* pD= new derived;
pD->s = "xyz";
base* pB = pD;
delete pB;
return 0
}
これでメモリリークするよ。
>>544 ほんとテキトーだな
tearDown()はユーザーが呼び出すメンバー関数じゃない
CppUnit使ったことないのかYo
おまいら今日は随分優しいな
普段なら大荒れのトリガ掛かってるのに
>>545 それ前にもこの板で議論になってなかったっけ?
Effective C++には基底クラスのデストラクタが virtual でない場合その動作は不定
と書かれているけど規格票にはそんな記述は見つからないってオチだったと思うんだよね
実際そのコード、VCやGCCではメモリリークしなかったはず^q^)<記憶があいまーい
>>546 ないのごめんね^q^;
今調べたらテストケースの後始末用メソッドなのね^^;
勉強になるます
>>548 そんなことはないと思うのだけれど。
5.3.5p3
『the static type shall be a base class of the dynamic type of the object to be deleted and the
static type shall have a virtual destructor or the behavior is undefined』
CppUnit::TestFixtureが仮想デストラクタ持ってた場合、
派生クラスのfooTest,foo2Testに暗黙の仮想デストラクタつかない?
>>550 unkoさんいつもありがとうございます^q^
また勉強になりますた
実際にVC++でリークしてるぞ
unkoは邪魔にならない糞コテ
>>548 derived が持ってる std::string s のデストラクタは誰が呼ぶかわかるか?
生ポだめ
int* a = new int;
shared<int> b = a;
shared<int> c = a;
>>557 VCは15文字以下ならば直接メンバに置かれるからリークしないだろうね
もちろんこんな実装依存の振る舞いに頼っちゃいけない
リークしないからといってvirtualを付けないヤツは馬鹿
リーク以前に親と子のアドレスは異なることがあるわけだし
その場合 mallocの結果と違うアドレスをfreeして
無事なわけないだろう
親と子のアドレスが異なることってありえなくね?
子から親へstatic_castできないじゃん
親と子っていい方する?
あと2重継承の場合はアドレス違うよね
まあ2重の場合はちゃうわな
その場合は基本クラスのリストの最初のものと一致する保証があったようななかったような
仮想関数テーブルが入ってくるからしないようなするような
実際のコンパイラーの動作としてアドレスが異なるのは
多重継承の時と仮想継承の時
>>562 >子から親へstatic_castできない
why?
何でこの議論がまだ続いてんだ?
これってどう解釈すればいいの?
アドレス 値
0x00000100 40000
0x00000101 0
0x00000102 0
0x00000103 0
...
「
>>572はコミュニケーション障害」
と理解した
>>572 よく分からんが、1バイト領域に「40000」が入るのっておかしくね
コードが池沼
そのような結果を出力するコードを書いたからだろ
>>574 だからどう解釈すればいいのかたずねてんじゃん
>572はバカ
どんなコードを書いたか晒せば一発で回答が来る
ベンダーが提供していたツールからコードなんてねーんだよ
怒ってんの?しゃぶってよ(´・ω・`)
いいお
少なくとももっと大量のアドレスに対する値が得られないとリバースエンジニアリングはできんわな・_・
ここはC++スレだろ?
C++のソースが無いならここで訊くな
>>585のどこにC++のソースがあるのかしらん?
DSPならあり得るけどね
>>587 1アドレスに最低16bit入らないと……ん、あり得なくはないのか
多重継承の場合、最も基底のクラスが仮想デストラクターを
持っていればいいのではないのですか?
上の場合 CppUnit::TestFixtureに仮想デストラクターがあればいいんですよね。
しかもClangのコンパイラーの場合、仮想デストラクターが無ければ無いという
警告を出すし、それが出ないことからCppUnit::TestFixtureは仮想デストラクターを
持つことが推測されますよね。
エラーメッセージも晒さないで記憶喪失装っているクソヤロウのことなんかどうでもいいじゃん
>>588 いぁSHARCだとdmのデータ幅は40bitだ。
>>591 流石DSP、PCでの常識が通用しないな……
まあID:jkvScUHAが出てきてくれんとどうにもならんか
>>592 まぁドラッグマシーンみたいなものだしな
民家の屋根に設置してあるテレビアンテナって、四方を針金で引っ張って固定してるタイプ多いよね。
あれ見て宇宙人が地球との交流を見合わせたって話をどこかで聞いた。
すみません。完全に誤爆しました。
どんな誤爆やねん
そしてどうしてそれで宇宙人がドン引きしたのか理由がわからん^^
伊能忠敬の日本地図に驚いて欧米諸国がドン引きしたのは事実
>>597 宇宙人は高度な文明を持った仲間との交流を求めて旅している。
針金でアンテナを固定しているさまを見て、「ダメだこりゃ」と判断した。
600 :
デフォルトの名無しさん:2014/05/18(日) 11:56:29.18 ID:0kvX68pZ
>>598 欧米は驚愕した! 日本人の、技術力ではなく奴隷としての性能に!
そしてこの優秀な労働力を是が非でも手に入れたいと考えた!!
>>597 各家庭がレーザー発射装置で武装していると勘違いしたんだよ
池田菊苗が旨味を発見した時も欧米人ドン引き
>>603 旨味の文化がない朝鮮がどのツラ下げて言ってるんだ
Class * a=new Class();
aが定義されています。
しばらくプログラムの処理が続き時間が経過しました。
ポインターaの指し示すClassの実体の
データが更新されたかもしれません。
それを知るにはどうしたらいいですか?
aが定義された直後にaのポインターaの指し示すClassの実体を別の場所にコピーしておいて
更新されたか調べるときにそれと比べることはコピーに時間がかかるのでできません。
メッセージ飛ばすなりイベント登録させるなりご自由に
過去の状態を完全に忘れるとして、更新を知る手段はあるだろうか?
内部データのハッシュを出力するメンバを作っといてそれを比較するって手はある
>>606 例えば、
・そのクラスのメンバ変数に「中身を変更したフラグ」を作成
・メンバ変数の中身を変更するメンバ関数にフラグを立てる処理を入れておく
・チェックする際はそのフラグを調べるメンバ関数を呼び出せばOK
っていうのはダメ?
オブザーバーパータンとか
ちなみにaに絶対被らないIDを持たせてそのIDだけをコピーしておくというのは
考えたんですけど、aが同じ状態になると同じIDを持つようにするのは
難しいのであきらめました。
>>610 それは利用する側が単一であるなら成り立つけど、あんまりいいスジじゃねぇな
>>612 ハッシュについてちょっと勉強したほうがええ
別の所にコピーしておくのすら時間がかかって駄目ってことは、ハッシュの計算も駄目じゃね?
>>615 なにも毎回チェックするごとに再計算する必要はない
内部状態を変更するメンバの中でハッシュを再計算するように実装すればいいんだから
変更にたいして利用頻度が圧倒的に多い問題はよくある
>>617 2つ以上のコンテキストから呼ばれる場合に破綻する
そういう状況じゃないなら別にいいけど、リーダから馬鹿にされそうな設計だとは思う
すいませんクラスをどうやってハッシュに変換できるんですか?
そりゃメンバ変数からごにょごにょするんだよ
>>619 変更ごとに一意であればよいのならハッシュする必要すらないよ
非constなメンバを呼ぶ毎に値を増分してその値をIDとして返せばいい
そうでないならメンバ変数をガサっとsha1にでもかけろ。たいていライブラリやAPIがある
>>610とID:HfTaDQysの言ってることってほとんど同じなような気がするんだが
Class * a=new Class2();
Class * b=new Class3();
この状態でaとbを*a==*bで比べたいんですよ。
ここでClass2とClass3の==の定義は
void operator==(Class a,Class b);
になるとおもうんですけど、
基底のClassの部分しか見えないから比べようがないですよね。
dynamic_cast
Classの仮想メンバ関数にvirtual bool equals(Class const& other) const;でも定義して子クラスのequalsでdynamic_castすればいい
後はフリー関数にClass const&を二つとるような比較関数でも作ってラップしたらいい
>>618 > 2つ以上のコンテキストから呼ばれる場合に破綻する
どういう意味?
>>622 だね、フラグかカウンタかの違いしかないと思う。
あと、変更するメソッド呼ばれたけど、値自体は変更しなかった (今の値と同じ値を書き込んだ) 場合は変更と見なすの? それとも、無変更? ⇒
>>606
>>627 >>612とあるので内部状態が同じなら無変更とみなすのだろうし、それならequals()のようなメンバ関数を作ればいい
>>627 変更を内部フラグで知るなら必ずその「フラグをクリアするメソッド」が存在するわけ
一方の利用者が変更をチェックしてそのフラグをクリアするともう片方の利用者は変更を知ることができない
だからそのクラスの利用者が一人であればフラグでいいけど、アルゴリズムとしては全然違う
630 :
デフォルトの名無しさん:2014/05/19(月) 19:17:47.65 ID:WTOS6QfZ
いいから黙ってメッセージかコールバックによるイベントパターン使えよ
悩むようなところじゃない
>>623 operator==(Class a,Class b) を定義するなら基底のClassだけで比較できなきゃおかしいじゃんよ
> aが定義された直後にaのポインターaの指し示すClassの実体を別の場所にコピーしておいて
> 更新されたか調べるときにそれと比べることはコピーに時間がかかるのでできません。
こう書いてあるから==やequalsは相応しくないよね。
>>612,
>>623とあるから等値比較が出来れば足りるんじゃないかと思ったんだけどそうでもないのかなあ
>>633 つか ID:qBdg6XNI は自分のやりたいことがわからなくなってるか釣りだと思えてきた
>>634 ホントだw
比べたいとか言ってるの見逃してたw
>>635 そもそも、今回の話どこが一番臭いかっていうと、
「コピーに時間がかかるのでできません」って部分だなw
リアルタイム性というわけでもなさそうだから、
どんだけクソデカイクラスになってんだよって予感。
静的なポインタってある?
なんかイメージ出来ない
>>35 このスマポという奴を使う場合
ud[n][2]の2のほうも変数にする方法は有りますか?
投稿先639間違えました
641 :
デフォルトの名無しさん:2014/05/19(月) 23:05:31.75 ID:0GDAGnvz
>>637 static int a[10000];
int *p = a;
>>628 >
>>612とあるので内部状態が同じなら無変更とみなす
なるほど、純然に内部状態で判断するのか
> それならequals()のようなメンバ関数を作ればいい
データがでかいとかで比較が大変なんだろ。
高速化の手法は色々あるだろうけど、データ構造見ないとなんとも言えないな。
>>637 const char* p = "static";
>>629 ハッシュ計算するのはいいけど、なにと比較するんだ?
そして、その比較対象の値をいつ設定して、いつ更新すべきかを考えてごらん。
自分がどんだけアホなこと言ってるかわかるから。
>>641 a→b→c→b→a
って推移して現在の状態が「a」のとき、比較対象は最初のaかもしれないけど2番目のbであることもあるんだよね?
std::shared_ptr::operator==とかでよくね?
Class * a=new Class1();
Class2 x;
x.function(a);
//aの指すアドレスが変わるか、aの指し示すアドレスの実体が変わるか、変わらない。
x.funcition(a)
------------------------------------------
void function(Class *a){
}
//aの指すアドレスが変わるか、aの指し示すアドレスの実体が変わるか、変わらない。
//ここでaが変わらないかを調べる。
651 :
606:2014/05/20(火) 08:57:04.43 ID:q/EjpcBc
Class * a=new Class1();
Class2 x(a);
x.function();
//aの指すアドレスが変わるか、aの指し示すアドレスの実体が変わるか、変わらない。
x.funcition()
------------------------------------------
class2{
Class * a;
public:
Class2(Class *a):a(a){}
void function(){
//ここで1回目と比べてaが変わらないかを調べる。
}
};
こんな感じです。途中でおくっちゃいました。
おしえてください。
また間違えました
Class * a=new Class1();
Class2 x(&*a);
x.function();
//aの指すアドレスが変わるか、aの指し示すアドレスの実体が変わるか、変わらない。
x.funcition()
------------------------------------------
class Class2{
Class ** a;
public:
Class2(Class **a):a(a){}
void function(){
//ここで1回目と比べてaが変わらないかを調べる。
}
};
また間違えました。
Class *bを作ってコピーしておいて
呼ばれた時に比較すれば良いじゃん
ポインターの指し示すアドレスが同じでも内部状態が違う場合もあります。
Classが変更されたかなんてClass自身が変更を感知するようにするか、
Classのインスタンス丸ごとコピーするしか無い
class Class2{
Class ** a, *b, c;
public:
Class2(Class **a):a(a), b(*a), c(**a){}
void function(){
//ここで1回目と比べてaが変わらないかを調べる。
*a==b && *b == c
}
};
委譲を使いクラスを生成した場合
委譲をした元クラスを解放すれば
委譲されたクラスは自動で解放される?
委譲されたクラスのデストラクタはちゃんと呼ばれる?
プログラムのソースを見てると
後藤、後藤という名前が沢山かいてあるのですが。
後藤さんとはどなたのことでしょうか?
後藤がでてくるソースはうんこなので捨てなさい
>>656 委譲するクラスや委譲されるクラスをどのように確保するかによってかわってくる
wikipedia の例ならそもそもデストラクタでどうこうする必要はない
new を使うのなら、委譲だろうがなんだろうがデストラクタ内に delete が絶対に必要
いい練習問題だからやってみたまえ
委譲ってなんでポインタで生成する必要があるの?
普通に生成するとどんな問題があるの?
>>660 >ふつうに生成する
?
委譲と派生の区別はついているか?
オリビア発生
値同一性がないとポリモーフィックに呼び出せなくなるからじゃろ
よって委譲先オブジェクトはポインタか参照で保持しないといけないんじゃないかなってかなかなかなかなかなかなかなかな
>>662 ザナドゥ?
www.youtube.com/watch?v=2GaCdGVasMc
>>659 デストラクタ内にdelete?
スマートポインタ使うでしょ。
std::mt19937 re1,re2;のとき
re1()==re2()になる確率はは
re1()==re1()となるときの確率と同じですか?
re1()が同じ数になるのはプログラムを起動するごとに
re1()の値が同じということですか?
デフォルト値が同じだから
re1()==re2()は100%だろ
re1()==re1()は2回連続で同じ値が出ないといけないので
限りなく0に近いんじゃないか
669 :
660:2014/05/21(水) 12:16:25.57 ID:b5pc/rPA
>>662 元のクラスと値を共有したい場合はポインタで生成して
委譲したクラスのみで完結する場合、通常に委譲
ってことで良い?
671 :
656:2014/05/21(水) 21:15:17.04 ID:Rtlj0b94
>なんで委譲はポインタで生成しないといけないの?
どこからそんな妄想が
委譲自体派生
どこからそんな妄想が
純情愛情に委譲
値互換性というローカル用語がまずかったか
確かC++ Coding Standardsあたりに出てきた単語だったように記憶しているんだけどまあ一般的に言うと代入互換性
>>671のサイトに有るように「一種の実装遅延、プラグイン機構」であって
委譲先オブジェクトが委譲元オブジェクトに組み込まれるための共通したインタフェースが必要になる
それには継承によって代入互換性が必要になる
静的にしかポリモーフしないならテンプレートでもいい
んじゃないかな⊂(^ω^)⊃ブーン
バカほど長文&イミフな駄文
>>677 過剰が抜けてる
根本的には静的な言語なので、動的と言っても本当は違う
>動的と言っても本当は違う
バカほど聞きかじったことを吹聴する。
duck-typingが動的に評価される言語以外は本当の動的ではないとか
頭イカれすぎ
>>680 > duck-typingが動的に評価される言語以外は本当の動的ではないとか
それで他人の考えを読んだつもりか?
妄想もたいがいにしろ
>>671 >
http://ja.wikipedia.org/wiki/%E5%A7%94%E8%AD%B2 > このwikipediaの委譲は
> SomethingDelegator が解放されたら
> 委譲元の Something も解放される?
解放されない
ここでいっている委譲はC++の言語機能ではなくただの設計であって
委譲だからといって特別な動作はなにもない
> あと、なんで委譲はポインタで生成しないといけないの?
いけなくない
委譲するクラスの機能と委譲先のクラスとの関係をどう設計するか次第で自由
そもそも委譲と所有は無関係で委譲するクラスが委譲先のクラスを所有しているとは限らない
上記のwikipediaの例では委譲するクラスSomethingDelegatorは
委譲先のクラスSomethingを所有しておらずポインタで参照しているだけ
Hoge* hoge = new Hoge;
...
hoge->~Hoge();
hoge = new(hoge) Hoge;
...
これってアリ?
こういうの自分で書いてみれば分かるだろ
再帰的に委譲してみた
int n = 10;
class Sub {
Sub* sp;
int j;
public:
Sub(int i) : j(i) {
if (i < n) {
sp = new Sub(i + 1);
sp->print();
} else
sp = nullptr;
}
void print() const {
std::cout << "Sub(" << j << ")" << std::endl;
}
~Sub() {
std::cout << "~Sub(" << j << ")" << std::endl;
delete sp;
}
};
int main()
{
Sub s(0);
}
いや、placement newでもといた場所に同じインスタンスを作り直すのってありなのかなって質問だったんですが
考えてみてもナシな理由がないから大丈夫ですね
>>683 配置newに失敗したときにデストラクターがもう一度呼ばれないように注意していれば仕組み的にはOK
ただコードが変態的なのでオススメしない。
>>685 Coding Standardに出来るけどやるなと書いてあったな
何故かは知らない
「本に書いてあったから」
「理由は知らない」
そんなクソな本は捨てるべし
>>686 なるほど
現状同じインスタンスを何度もnew/deleteする可能性があって、サイズがそこそこ大きい場合は
同じ場所でインスタンス作りなおすことでパフォーマンス向上するかな、って考えなんですが
まあパフォーマンスの話は実測ですね、ありがとうございます
>>689 パフォーマンスが問題なら、そもそもnewしないで使えないのか?
>>689 大きいってたとえばどれくらいのもんよ?
692 :
660:2014/05/22(木) 13:39:45.18 ID:448z5NbE
>>662 元のクラスと値を共有したい場合はポインタで生成して
委譲したクラスのみで完結する場合、通常に委譲
ってことで良い?
693 :
デフォルトの名無しさん:2014/05/22(木) 15:00:03.41 ID:tA+Z3AxB
>>689 大きさとアロケーションコストに大した相関関係はないだろ
ちょっとずつサイズを増やしながらコピーとか再確保とかしていくと楽しい
>>683 一定以上大きい領域はいきなりシステムコールでメモリ取りに行く(デカい領域は解放を遅らせるとマズいから)
ある程度普遍的な法則とは思うけど、少なくともLinux(glibc?)の実装はそうなってるよ
安価みしゅった
>>689の
>同じ場所でインスタンス作りなおすことでパフォーマンス向上するかな
同じ場所が空いている保証あるの?
パフォーマンス向上ならこんな無理矢理なコード書かないな。
メモリ確保してそのポインタに対してコンストラクタとデストラクタ呼ばせるだろ。
そしてなぜか今回はHogeクラスしか利用していないのだから、
あらためてplacement newする必要はなく単にデストラクタを手動で
呼び出したあとにコンストラクタをまたまた手動で呼び出せば済む話。
>メモリ確保してそのポインタに対してコンストラクタとデストラクタ呼ばせるだろ
それをやってるのが689ではないのか
placement newを使わずコンストラクタを手動で呼び出すというアホ
コンストラクターはデストラクターと違って手動で呼び出せないと思うのだが
std::allocator::constructだって中身はplacement_newだろ?
手動で呼べないとvectorとかどうすんだよ
やっぱり内部でplacement newしてる予感
やけにスルーされると思ったら
あっちでレスしてもこっちの人には見えてなかったわけか
あっちって何処だよ
ごめんログが消えただけだった勘違い
707から716まで消えているみたいだ
なんかレスが消えてるようだけど
>std::make_unique
そんなものは存在しない
アスペが多いね
書き方からして「現行規格票にはない」とかというレスだろう
それに対して次期のURL貼るとか
とアスペは言う
アスペーvsエスパー
関数のtemplate初心者です。
あまり良い例ではないかもしれませんが、以下のような関数を作った場合、
templateを使って引数では、string,char か wstring,wchar_t のどちらにも対応できますが、
関数の中で
string,char対応の関数(sprintf)を使う場合と
wstring,wchar_t対応の関数(wsprintf)を使う場合と
どうやって切り替えたらよいのでしょうか?
template<typename stringT, typename charU> stringT join_string_and_char(const stringT &str, const charU c){
charU stringJoined[100];
// sprintf(stringJoined, "%s and %c", str.c_str(), c);
wsprintf(stringJoined, L"%s and %c", str.c_str(), c);
return stringJoined;
}
void main(){
// string result1 = join_string_and_char<string, char>("string", 'C');
// cout << result1 << endl;
wstring result2 = join_string_and_char<wstring, wchar_t>(L"wstring", 'C');
wcout << result2 << endl;
}
Type Traitsとかいうテクニックが使えたような
>>717 二つ書けばいい
template<typename stringT, typename charU> stringT join_string_and_char(const stringT &str, const charU c){
charU stringJoined[100];
wsprintf(stringJoined, L"%s and %c", str.c_str(), c);
return stringJoined;
}
template<>
string join_string_and_char(const string &str, const char c){
char stringJoined[100];
sprintf(stringJoined, "%s and %c", str.c_str(), c);
return stringJoined;
}
>>717 wsprintfAとwsprintfWをそれぞれwsprintf<char>とwsprintf<wchar_t>のメソッドにする。あとはわかるな
あとsprintfとwsprintfは出自の違う関数だから
最大文字数の制限もちがうのでまぜちゃだめ
>>717 その例じゃ、
return stringT(str + c);
としろとしか言えん。
つまり引数自身が持ってるメソッドを使う。
どうしてこんなにアスペ&文盲が多いのか。
>>720 >>722は社会の中でちゃんと生活できてるか?
CentOS6.5
gcc4.4.7
日本語の正規表現をC++で扱いたいのでネットで調べたのですが、わからない事があるので教えてください。
(1)「マルチバイト文字列」と「ワイド文字列」とはwindows環境で使われるShiftJISとUTF16のことでLinux(UTF-8)環境では関係ない。
(2)Linux(UTF-8)環境での日本語の正規表現は、std::basic_regexでもboost::regexでも正しく動作する。
ということでいいでしょうか?
>>723 エスパーにでもなったつもりかw
先回りして「こういうことが聞きたいんだろうか・・・」なんて考えてもムダなことが多いんだよ。
>>725 「例が悪いけど〜どうやって切り替えたら」
と聞いてるんだから
>>718の回答が妥当。
例の揚げ足をとる回答しかできないのはコミュ障
value_type で場合分けするんでもイケそうだけど
個人的にはテンプレート特化を使う
>>719の案の方がtemplateらしくて好き
コードは膨らむけど動作は軽いだろうし・_・)
>>724 >Linux(UTF-8)環境では関係ない
んなこたーない。
>std::basic_regexでもboost::regexでも正しく動作する
GCCのregexは未完成かつバグだらけで
英語でも使い物にならないんじゃなかったっけか
>>726 引数自身が持ってるメソッドを使えってのがまともじゃないってのかよ?
文盲が多いな
どうしたらこの例でコードを共通化できるかを問う質問ではなく
切り替えるには一般にどうしたらよいかという質問だろ
template < typename T, template < typename U, typename = std::char_traits< U >, typename = std::allocator< U > > class C >
C< T > jsac( C< T > const &str, T const c ) {
return str + c;
}
じゃあこんなんでDOUDAI?(´・ω・`)
うちの会社にいる。
途中で送ってしまった。
>>731 うちの会社にいる。ただしわざと。
不備のある質問には不備のある回答をする、
意図に不明確な点があれば、やっぱり不明確な回答をする、
というポリシーらしい。
的を射た質問には喜んで答えるんだけどね。
>>729 学生がちゃんとしたの作ってなかったっけ
736 :
717:2014/05/27(火) 06:33:46.82 ID:eE9gvczq
みなさんコメントありがとうございました。
>>731 >>どうしたらこの例でコードを共通化できるかを問う質問ではなく
>>切り替えるには一般にどうしたらよいかという質問だろ
その通りです。私の説明が悪かったようですみません。
718さんの
>>Type Traitsとかいうテクニックが使えたような
少し調べましたが良く分りませんでした。もう少し調べてみます。
やはり719さんのように二つ書くのが簡単なのでしょうか。でもそうするとコードが長くなりますね。
720さんの説明、よくわかりませんでした。
732さんの説明、C++初心者の私には全く理解できませんでした。
最近のC++はstatic変数を無名namespaceにする流れじゃん
じゃあ↓こういう場合はs[]を無名namespaceで囲うべき?
//test.h
namespace Test {
extern const char* ps;
}
//test.cpp
namespace Test {
const char s[] = "Hello."; //これは公開したくない
const char* ps = s;
}
>>737 個人的にはどうでもいいが
基地外の攻撃を避けるためにはしておいた方がいいだろう
だがこの例ではsは内部リンケージなので囲う必用がない
739 :
デフォルトの名無しさん:2014/05/27(火) 21:38:08.18 ID:5raxgz7B
>>738 サンクス
内部リンケージとするために形式的に無名名前空間にしなきゃいけないわけじゃないのね
>>739 そのプログラムを書いた奴に聞けよ(´・ω・`)
>>739 マルチしてんじゃねーよ(・∀・)カエレ!!
委譲も派生の一部なの?
委譲と派生、継承は別カテゴリと考えてたけどどうなの?
>>743 委譲は実行時にコストが発生するけれども、派生/継承はコンパイルの時点で「出来上がっている」からねえ
>>743 コストが発生する、というのは確保の仕方でどうにでもなったね‥
adapter パターンでやってみると
派生:
http://codepad.org/xFVOCdis 委譲:
http://codepad.org/kAwpEdFl この例ではやっていることは同じだね
上の例では既存の Actual クラスがすでに存在する前提で、最初に本来あるべき内容の Spec クラスを先に書いた
でも Actual クラスを使って Spec クラスの内容を実装したいために Adapter クラスを仲介として追加した
最後に Spec クラスでも Adapter クラス経由の Actual クラスでも同等に動くことを確認した
委譲の場合、仲介クラスであからさまに既存クラスのインスタンスを持つように書くが、
継承は、同じことなんだけれども、仲介クラスで既存クラスを抱合するように書くようだ、この場合は多重継承を使ってしまったが、ああ、純粋仮想関数にしないと Java では無理だね
>>745 ごめんね
デバッガで追ってて気付いたんだけど、
初回の例外が発生しました: 0x000006BA: RPC サーバーを利用できません。
ってなんだ?
これ以上ないってくらい単純↓のやつでも出るぞ
答えは合ってて動作には支障ないけど、回避策ってあるのかね?
#include <stdio.h>
#include <winsock2.h>
int main(int argc, char *argv[]) {
WSADATA wsaData;
LPHOSTENT host;
WSAStartup(2, &wsaData);
host = gethostbyname("localhost");
return 0;
}
dll内の例外だろう
749 :
デフォルトの名無しさん:2014/05/29(木) 11:18:01.56 ID:zblOCN9G
委譲と派生は別物って解釈で良い?
おk
>>747 "初回"例外はほぼ無条件で無視していい
本来デバッガが内部で使うもの
デバッガのどこかに無視する設定があるんじゃないの
>>747 レノボ(Thinkpad)のバスワードマネージャを使ってた時に発生した記憶がある。
他人のプロセスに寄生するうんこなアプリをインストールしてないか?
nProtect GameGuard 入ってるとか
>>751 > "初回"例外はほぼ無条件で無視していい
> 本来デバッガが内部で使うもの
どや顔でバカさらしてどうすんのよ (w
間違ってないだろ
委譲ってサンプルソースを見るとポインタで生成していることが多く
ポインタで生成するのがデフォルトみたいになってるけど
なんで?
>>751 > "初回"例外はほぼ無条件で無視していい
> 本来デバッガが内部で使うもの
見たこと無いんだが
リファレンスに書いてあったか
マイクロソフトに問い合わせた結果の回答なんだよね?
>>756 そんなのサンプル書いた人に聞けよ
動的に確報仕様がしまいがクラスの設計によるだろう
「ポインタで生成」
なにこの独自用語。
「new でインスタンスを生成してそのポインタを持つ」って普通に脳内変換していいものか...
その程度のコストなんてループで数百万回ぐらい回さないと
わからない程度の差じゃね。
>>761 せめてポインタで所持とか言ってほしいよなw
newのコストが数百万回ループさせないとわからないなんて
相当なにぶちんさんですね
>>758 もしかして、first chance exception を "初回"例外 だと思ってどや顔してるとか言う美味しいネタじゃないよな
ちょっと詳しく説明して
766 :
746:2014/05/30(金) 03:44:57.58 ID:iU8Ve7Yv
>>749 表現が違うだけで一緒じゃないの‥
委譲でかけて派生でかけないことってあるのかな?
767 :
デフォルトの名無しさん:2014/05/30(金) 06:55:21.16 ID:+RdCclji
>>765 知らない自慢するなよ。w
first chance exceptionを知っていれば、「"初回"例外」が脳内で自動的に
first chance exceptionの事だなと変換される。
実際にMSが日本語表記として「"初回"例外」を使ってるのか憶えてないが、
ヒントは与えてやったんだから、MSがfirst chance exceptionを日本語でど
のように表示してるかくらい自分で調べろ。
いくらボンクラなお前でもそのくらい調べられるだろ。www
ん?ハンターチャンス?
柳生博出てきそうな
catchしたらきっと賞金もらえるんね
>>765 ん?MSDNは First-chance Exception を初回例外と訳しているぞ。
それとも「"初回"例外」は別物なのかな。
773 :
デフォルトの名無しさん:2014/05/30(金) 07:59:58.22 ID:+RdCclji
>>771 アホもここに極まれりという感があるな。wwwww
そのページはmathworks(もちろんMSとは何の関係もないサードパーティ)の
サポートがfirst-chance exceptionをファーストチャンス例外と訳しただけだろ。wwwww
>>773 訳じゃなく説明されてる動作見ろよ。
ひょっとして、 Visual Studio 使ったことないのか?
>>773 MATLAB 以外に機械翻訳もやっていたのか?
その訳によると
例外スローの時点で無条件にデバッガが止まるのがファーストチャンスなのかな。
>>757とは内容が違うようだけど、
>>757はSEHの文脈での説明で
>>771はプログラミング言語機能の例外と言う理解でok?
778 :
デフォルトの名無しさん:2014/05/30(金) 08:13:30.87 ID:+RdCclji
>>775 必死に話題そらそうとしてるが、アホすぎ wwwww
ID:cMzaBeH6は訳を問題にしている
>>765 > もしかして、first chance exception を "初回"例外 だと思ってどや顔してるとか言う美味しいネタじゃないよな
動作に関して話したいなら、まず、ごめんなさいしろよ。wwwww
>>774 MSDNは翻訳できるから自分で見てみなよ。
初回例外かFirst-chance exceptionで検索して出てきたページどれでもいいから。
あと、ID:VP4sRqxGが考える「正解」も書いてみ。
>771はプログラミング言語機能の例外と言う理解でok?
どこをどう読んだらそういう解釈になるんだ
こういう例外(゚∀゚)的なMSDN記事は大抵機械翻訳で当該ページの公式機械翻訳版では「初回例外」になってるね(゚∀゚)
両者の煽り合いの内容はまったくわからんけど笑
>>777 first / second chance exception は、デバッガが例外に介入する機会 (=chance) のこと
Visual Studio の例外設定にある、スローされるときとユーザーにハンドルされていないときに対応する
ちなみに
>>747 が書いてる "初回の例外" は、例えば CException をそれなりに使ってる状況で Access violation を見落とさないように、各例外毎に一回目だけデバッガが表示してるやつだよ
>>781 どこの url 見てる?
機械翻訳では、最初と2番目てなってるよ
http://support.microsoft.com/kb/105675/ja >>778 お前はアホか、ID:cMzaBeH6 も
>>775 も俺だよ
783 :
デフォルトの名無しさん:2014/05/30(金) 09:20:17.89 ID:3csx3F2N
そりゃ「first」という単語が機械翻訳で「最初」になってるだけ。
同じページで「first-chance exception」はちゃんと「初回例外」になってる。
host = gethostbyname("localhost"); <- ここで "初回の例外が発生しました: 0x000006BA"
試しにやってみたら同じ結果だな @VS2010
これでは回避のしようがない
ライブラリ仕様、もしくは バグだろな。
>>783 初回でページ内検索してもヒットしないけど?
まあ、そもそも翻訳でどうのこうの言ってる訳じゃないから、どうでもいいけど。
787 :
デフォルトの名無しさん:2014/05/30(金) 12:46:50.42 ID:nt5qjQEB
c_str()を実行するのに渡す文字リテラルが壊れている可能性がある時、
それを回避する方法はあるのでしょうか
どうも壊れているデータでxstringのアクセス違反というエラーが起こっているようなのですが
回避する方法がわかりません
そもそも壊さない
789 :
デフォルトの名無しさん:2014/05/30(金) 13:03:58.91 ID:+RdCclji
>>786 > まあ、そもそも翻訳でどうのこうの言ってる訳じゃないから、どうでもいいけど。
認知症がだいぶ進行しているようだな。
>>765 > もしかして、first chance exception を "初回"例外 だと思ってどや顔してるとか言う美味しいネタじゃないよな
双方が別の第三者の発言を相手が自分に言ったものと誤解してこじれてるように見える
続けるならもっと相手の言い分も聞いて論点を明確にしたら
791 :
デフォルトの名無しさん:2014/05/30(金) 13:35:35.19 ID:nt5qjQEB
>>788 具体的にいうとEPGのデータなんですが
EPGの取得に失敗するとゴミデータが入るようなのです
792 :
デフォルトの名無しさん:2014/05/30(金) 13:40:36.62 ID:nt5qjQEB
もしかしてtryかな
こういう他人とやりとりのする気がない奴の質問は
ノイズでしかないのでチラシの裏にでも書いてもらえると皆幸せになれる
最初から論点は「"初回"例外」が「first chance exception」であるか否かだ
そしてオレの主張は「"初回"例外」は「first chance exception」の事であり
それを知らないID:cMzaBeH6はボンクラ
以上
>>765 > もしかして、first chance exception を "初回"例外 だと思ってどや顔してるとか言う美味しいネタじゃないよな
795 :
787:2014/05/30(金) 14:34:22.85 ID:nt5qjQEB
さーせん。ヌルポインタでした。
>>794 お前の最初の主張は
>>751 > "初回"例外はほぼ無条件で無視していい
> 本来デバッガが内部で使うもの
だろ。
ごまかしてないで、はよソース持ってこいよ (w
>>796 >>751の主張の根拠は
>>758のこれだろう
t is not desirable to fail an entire operation just because〜
However, if the application is being debugged, the debugger sees all exceptions
あ、それに対しての反論が
>>782なのか。
ようやく理解した
委譲ってサンプルソースを見ると
new でインスタンスを生成してそのポインタを持つことが多く
それが生成するのがデフォルトみたいになってるけど
なんで?
>>800 ポンタじゃなかったら具象クラスが固定になるからつまらん
うんこ
803 :
デフォルトの名無しさん:2014/05/30(金) 17:53:51.01 ID:+RdCclji
>>796 >>751はオレじゃないもん。w
IDも違うでしょ。 w
オレが参戦したのは
>>752(ID:ZPfW7Hu7)から
一方お前がfirst-chance exceptionを知らなかったのは明白
> もしかして、first chance exception を "初回"例外 だと思ってどや顔してるとか言う美味しいネタじゃないよな
> もしかして、first chance exception を "初回"例外 だと思ってどや顔してるとか言う美味しいネタじゃないよな
> もしかして、first chance exception を "初回"例外 だと思ってどや顔してるとか言う美味しいネタじゃないよな
first chance exceptionをぐぐった奴は多いはず。俺だってそうさ
ファーストチャンス例外はファーストチャンス例外であって
ちゃんとした訳し方なんてないんじゃね?
>>803 途中から参戦して意味のない url 貼って、揚げ足とりで必死とか、不憫すぎる (w
ID:VP4sRqxG みっともないぞ
>>807 ID:+RdCclji にそんな気も能力もないでしょ
みっともないとかわざわざ参戦してるやつも似たり寄ったりだろうし w
>>807 楽勝で論破できるぞ。w
ID:VP4sRqxGが"初回"例外を知らずに知ったかぶりした事をごめんなさいしたら、教えてやるよ。
> もしかして、first chance exception を "初回"例外 だと思ってどや顔してるとか言う美味しいネタじゃないよな
トラベルチャンス来る?
他人のやり取りも勉強になるからぜひ論破してほしい
>>809 知ったかぶりしてごめんなさい
first chance=最初の例外=スローされたとき≠初回例外だとおもっとりました
ID:VP4sRqxG, ID:cMzaBeH6は逃げたか?
>>809 "初回"例外を知らずに知ったかぶりした事をごめんなさい
wktkな展開
C++ではないが、Objective-CではナントカDeligateって名前のクラスが多数用意されているが、多重継承の一つとして使うように推奨されてる、てゆか多くのサンプルコードがそうなってる
>>809 "初回"例外を知らずに知ったかぶりした事をごめんなさい
よろしい。説明してやろう。
> first / second chance exception は、デバッガが例外に介入する機会 (=chance) のこと
違うよ。知ったかぶりのバカ。
http://support.microsoft.com/kb/105675/en-us | This is the distinction between the first and second chance exception:
| the debugger gets the first chance to see the exception (hence the name).
(hence the name) それがこの名前の由来です
(hence the name) それがこの名前の由来です
(hence the name) それがこの名前の由来です
「デバッガが例外に介入する機会」の事なんかじゃない。
>>747が書いている"初回の例外"は
http://support.microsoft.com/kb/105675/en-usの first chance exceptionに他ならない。
デバッグ中のプログラムで例外が発生したときに、ハンドラの検索前にデ
バッガに通知される例外を、MSはfirst chance exceptionと呼んでいる。
http://msdn.microsoft.com/en-us/library/dd997368(v=vs.110).aspx
では知ったかぶりが屁理屈捏ねないように
How to: Receive First-Chance Exception Notifications
と"-"で接続している。
おまけ
> 各例外毎に一回目だけデバッガが表示してるやつだよ
これも意味不明 各例外毎に一回目だけ?
int (*p)() = reinterpret_cast<int (*)()>(::VirtualAlloc(0, 4096, MEM_RESERVE, PAGE_NOACCESS));
for (int i = 0; i < 5; i++) {
try{
p();
} catch(...) {
std::cerr << i << " oops!" << std::endl;
}
}
p()の呼び出しで二回目以降も表示されるが。 どんな言い訳するんだ? www
でれげーとじゃなくて?
>>805 意味のない url .... 英語読めないのか バカ不憫すぎ www
ああ、Delegateね
で、delegateクラスと称してpure virtualなメソッドを宣言してるやつとかは、そのままインスタンス作れないし多重継承にするしかないわけで。
勿論派生させて実装解決すればインスタンス作れるからその上で所有関係築くことはできるけど、それじゃ二度手間だし。
アクセッサーってgetメンバー変数名 setメンバー変数名のペアーじゃないですか?
メソッドが参照を返す場合はsetがいらないのでget〜という名前は紛らわしくて使えないので
どんな名前にしますか?
あとクラスの変数以外の何かを得たり与えたりするときはsetとgetを使わないでどんな名前にしたらいいですか?
>>807 ID:VP4sRqxG, ID:cMzaBeH6は逃亡したようだけど、ボンクラに騙されてたキミは納得できたかな w
>>754 > どや顔でバカさらしてどうすんのよ (w
近年まれにみる見事なブーメラン www
829 :
807:2014/05/31(土) 09:52:35.09 ID:8HHVfD5H
>>828 勘違いしていたらすまないが
ID:VP4sRqxG, ID:cMzaBeH6の言い分は
first-chance exception
=最初の例外
スロー時にデバッガが反応するやつ
(英語不明)
=初回例外=初回の例外、
何度も出るのを抑制するやつ
という内容だと思うのだが
>>819は前者の内容を繰り返してるだけでそ回答になってないよね?
>>826 非const参照を返す場合でも、参照を取得していると考えればgetでもいい気がするけどねぇ。
メンバーかどうかとget/setをつけるかも直接関係ないと思う。
つまり、getStatus()と言うメンバー関数だからと言ってstatusというメンバーを持っていなければならない法はない。
非constでメンバの参照を返すケースってどんな場合よ
例えばvectorを持っているクラスがvectorの非const参照を返すとか?
>>826 メンバへのアクセスというのならペアというのは勘違い。それじゃあ隠蔽してないのと変わらない。
個人的には、setter/getterなんてのはjavaの悪習慣とかフレームワークの都合上しかたなく存在するものだと思ってる。
cなら値を設定した結果なにが変わるのか、何の値を取り出せるのか、そこがわかるように関数作るの方がいいと思う。
一つのメンバー変数に値(例えば状態)の設定する関数を、変更後の状態別につくるとかね。
まあアクセサだらけのムカデみたいなクラスつくることは滅多にないな
>>833 >隠蔽してないのと変わらない。
すくなくとも、そのメンバをアクセスするトリガーを捕まえることができるのは割合に好感が
>>835 いや、そんなんは分かった上でないと
>>833のレスはできないと思う。
俺もアクセッサっていう単語からして憎いほどだから。
C#のプロパティに至ってはOOPへの挑発だと思う。
アクセッサを「書くのがわずらわしい」言語のほうがまだ良心的。
アクセッサなんて設計できないバカの為の方便だからな。
GUIコンポーネントとその内容でクラスを分けたらアクセッサ使うんじゃ
後はリファクタリングの過程で一時的にとか
>>828 まだ、醜態を晒すのか? ID:VP4sRqxG
>>834 Yes
設計がおかしいか、隠蔽する必要がそもそもないかのどちらかだと思う。
あるクラス内のメソッドfunc1(), func2(), func3()内で、例えば
func1()には
if (param) { printf("(1) info %s\n", str); }
func2()には
if (param) { printf("(1) info %s\n", str); }
if (param) { printf("(2) info %s detail info \n", str); }
func3()には
if (param) { printf("(1) info %s\n", str); }
if (param) { printf("(2) info %s detail info \n", str); }
if (param) { printf("(3) info %s (hogehoge) \n", str); }
というように、ここ以外は全く同じコードを持つメソッド作成したいです。
このfuncメソッドのコード量をなるべく少なくしたいのですが
今は、func1,2,3を全てベタ書きしているのでコピペして増やしている状態です。
これをtemplateとか使って1種類のfuncにまとめられないでしょうか?
>>841 それinlineすれば余裕で片付くんじゃね?
それ以前にコピペする必要がないような設計にしろよと
そう、そこ以外の全く同じコードがひとつの関数になるべきでは?
そ、そうか…確かに
差分の部分を切り出して別メソッドにして
funcを一つの関数にして、内部の差分の部分をtemplate化する
みたいな方向で考えてみます
>>837 設計できないバカのためにどうかご教授を
837じゃないけど「パターン指向リファクタリング入門」なんていいんじゃね?
バカはテンプレート禁止でお願いします
なんだと
>>826 むしろメンバ変数以外の何かを得たり設定するのにget〜とset〜を使うべき。
その「何か」ってのはクラス利用者からみて意味のある性質であるべき。
クラス内部でその性質を表現するために複数の属性を管理しているかもしれないが、
それらを直接利用者にゆだねる必要はたいてい無いので、アクセッサのないクラスができる。
850 :
片山博文MZ悪魔崇拝 ◆T6xkBnTXz7B0 :2014/06/01(日) 18:03:20.15 ID:18AEnQgX
>>850 どこをどう見ればいいのか・・・?
...と思います。
>>854 いやそうじゃなくてもっと即物的な問題
どのファイルのどの部分を見ればいいの?
上流設計に自信がないので、全体的な設計に間違いがないか確認して欲しかっただけです。
で、その上流設計の結果はどこに書いてあるんだ?
ああ、自信のない上流設計は晒さずに
それを元に作ったソースコードだけ晒してるんだな。
やっぱお前はコミュ障
このクラスはどういう時に使えばいいの?
目的も使い方も書いてないものは
単なる「コンパイルが通るだけのデータ」
情報としては何の価値もないゴミクズ
http://cpplover.blogspot.jp/2010/03/variadic-template-parameter.html ここにある
template <typename ... ReturnTypes, typename ... ParameterTypes >
void f( ReturnTypes (* ... t)( ParameterTypes... ) ) { }
の (* ... t) ...って、テンプレート引数の 「typename ... ReturnTypes」 に対応するものなの?
返り値をintに固定する場合はどうしたらいいの?
template <typename ... ParameterTypes >
void f( int (* ... t)( ParameterTypes... ) ) { }
とやるとコンパイルエラー出るし。
>>861 取りあえずそれらしいコードをでっち上げてみた。
http://ideone.com/RUUX5n (ParameterTypes...)はあくまで一つの関数ポインタが任意個の引数を取るという表現。
だからint(*...t)(Parametertypes...)において、tはパラメータパックにならない。
(この場合パラメータパックになっているのは関数ポインタが取る引数のほう)
863 :
861:2014/06/03(火) 00:39:52.50 ID:f1zdN6e9
おまえら 本当にオナニーがすきだな
variadic templatesのズリネタはもう飽きた
飽きるほどオナヌーしてるのはお前だっていう
クラス継承に関して質問があります。
Aという親クラスがあり、それをBという子クラスが継承していて
Cという孫クラスがBを継承している場合、Cのデストラクタが呼び出されると
継承しているクラスのデストラクタは呼び出されますか?
クラスが多重継承されていると親クラスのデストラクタが仮想デストラクタでないと
デストラクタが呼び出されないと言う事なんですが、GCCでコンパイルするときに
親クラスのデストラクタにvirtualをつけているとエラーが出ます。
呼び出されるけど、多重継承じゃないよねそれ
メンバ変数増設するときはvirtualつけるのが普通なのでエラーが出るのかおかしい
急に歌うよー
なんのエラーだよ
ソース貼れよ
>クラスが多重継承されていると親クラスのデストラクタが仮想デストラクタでないと
言語仕様を読まずに言うけど
あり得る気がする。
ただクロスキャストが必用な時だけの気もする
ソースはこちら。
Avisynth.h-2.5.8.h
http://codepad.org/aDQ3KWVZ test_filter.cpp
http://codepad.org/0mheycdK コンパイラ
mingw-w64 32bit GCC 4.8.3
$ g++ -fsyntax-only test_filter.cpp
In file included from test_filter.cpp:2:0:
Avisynth.h-2.5.8.h:584:7: error: conflicting type attributes specified for 'virtual GenericVideoFilter::~GenericVideoFil
ter()'
class GenericVideoFilter : public IClip {
^
Avisynth.h-2.5.8.h:436:19: error: overriding 'virtual IClip::~IClip()'
virtual __stdcall ~IClip() {}
^
>>873 In file included from test_filter.cpp:2:0:
すみません、これは間違いです。
1行目に#include <windows.h>があったんですが、不要だと気付いたので削除してます。
ちょ、検証用の最小限ソースじゃねーのかよwww
てかその__stdcall外せば?
>>875 AviSynthのPluginサンプルのソースを参考に作ったやつです。
>>876 エラー出なくなった!!!
基底がvirtualじゃないからそもそもアップキャストして使わない(new/deleteしない)クラスなんじゃね
んなこたーない
継承するなら基底クラスのデストラクタをpublic+virtualかprotected+非virtualにするべし
アップキャストするなら前者、しないなら後者
というのが881の持論であった
前者は呼び出しコストがうんたら
アップキャストだけ禁止に出来るprotected継承とか無いのか
class D : private B { public: using B::...; ... } でがんばれ。
クラスのツリーみたいなので
AのコンストラクターがA(B * b ,C * c)のような宣言で
BのコンストラクターもCのコンストラクターもAと同じような宣言といたします。
このようなデザインはポインターの管理が大変で困るのでデザインを変えたいです。
このようなデザインにした理由はインタープリターで使えるという理由なんですけど、
インタープリターにできてデザインを変える方法教えてください。
>理由はインタープリターで使える
コミュ障の
>>886は無理
>>886 コンストラクタの宣言だけで「このようなデザイン」と言われても何もわからないよ。
受け取ったものをどうしてるかによる。
あと「ポインターの管理」って何さ?
deleteすること?寿命管理?
>>886にはこちらの説明を受け入れる基礎知識も、
理解力も無いからああいう文章が書けるんであって、
これ以上関わっても人生の浪費。
890 :
デフォルトの名無しさん:2014/06/05(木) 00:18:07.90 ID:UssweygK
右辺値参照があるからといっても
std::vectorやstd::listを関数の返り値にするのは良くないですよね?
なぜ?
デバッガで追ってみたら色々ごちゃごちゃやってるので遅そうだなーと思ってたのですが
実測してみたら参照渡しより値返しの方が倍ぐらい早かったです。意外だなァ。
ちょっと前までは参照で受け取ったvectorをresizeして返すなんてやってたけど、
今じゃどんどんprvalueで返してるよ。
>>892,893のコードはきっとこうに違いない
vector<kuso> f() {
vector<kuso> p;
return move(p);
}
vector<kuso> && f() {
vector<kuso> p;
return static_cast<vector<kuso>&&>(p);
}
NRVO(C++03)=NRVO(C++11)
> NRVO失敗(C++11) ≒参照渡し
>>> NRVO失敗(C++03)
>>894みたいなことしなければ値返しの方が速くて当然
キャッシュ乗りの違いかな?
897 :
デフォルトの名無しさん:2014/06/05(木) 08:03:46.71 ID:LLYXa5KT
Aというダイアログで作ったスレッドとBというダイアログで停止させたり、再度開始させたりしたいのですが
そのようなことはできますか
具体的に言うとタイマーのスレッドがあって、オプション画面でそのタイマーの時間を変更して、
メインの画面で立てたスレッドにオプション画面を閉じた時に反映させたいのですが
>>898 とりあえずC++のプログラム内でWINAPIでスレッドを立てていますが
ダイアログごとソースが分かれていますので
何処で何をしないといけないのかがわかりません
よろしくお願いします。
>>899 ユーザーメッセージのハンドラーをAに登録
Bからそのメッセージを投げる
で当面動くかな
>タイマーのスレッドがあって
まずその残念な発想をやめるべき
>>902 そもそもタイマーを作ったことがないのですが、
スレッドを使わないやり方が普通でしょうか
タイマーっていうことばがまぎらわしいぞ。時計のこと?
タイマーは、たいていもうある。タイマーを設定したら、設定時間が経過したらハンドラが実行される。
そのハンドラの中で、タイマーを無効にしたり、また設定したりする
タイマーは、OSに用意されていて、同時にタイマーを何個つかえるかという問題があったりする
906 :
デフォルトの名無しさん:2014/06/05(木) 12:15:51.18 ID:LLYXa5KT
このようなスレッドですがだめでしょうか
UINT WINAPI timerThread(LPVOID param)
{
HANDLE hTimer = CreateWaitableTimer (NULL, TRUE, NULL);
while (1) {
LARGE_INTEGER li;
li.QuadPart = -10000000*60;
SetWaitableTimer (hTimer, &li, 0, NULL, NULL, FALSE);
WaitForSingleObject(hTimer, INFINITE); // 指定時間までここで待機
func();
Sleep(1000);
}
return TRUE;
}
うわぁ……
まぁ、それはさておきWinAPIスレかMFCスレか環境依存スレに行けよ。
特にWINAPIにこだわっているわけじゃなく、これしか見つけれなかったんですよね・・・orz
その程度の精度でいいなら
画面のSetTimerではだめなの?
>>909 実際のソースでは何時何分の情報から待機秒を計算して使っています。
SetTimerではそのようなことには使わないほうがよいというページを見ました。
Web上のページは原則的に英語版MSDN以外は信用しちゃだめ
サンプルコードが載せてあって、実際に確認が取れるページはOK
時刻を指定させるような厳密なタイマーならともかく
自分で待機時間を計算してるなら意味なくね?
913 :
デフォルトの名無しさん:2014/06/05(木) 18:03:42.54 ID:uhGE5mRq
スレッドに無限ループでひたすら指定時間が来たかどうかのチェックのほうがいいのでしょうか
スレッドはsettimerでもいいのかもしれませんが
>>913 >スレッドに無限ループでひたすら指定時間が来たかどうかのチェックのほうがいいのでしょうか
こういう事した人間のクズを三人頃したことがある
後悔はしていない
>>913 タイマー用待機オブジェクトとキャンセル用のManualResetEventを作って
WaitForMultipleObjectする。
>>915 ついでにWindowメッセージの到着を確認出来る
MsgWait の方を使えば完璧だな
:-p
917 :
片山博文MZ悪魔崇拝 ◆T6xkBnTXz7B0 :2014/06/05(木) 20:52:27.26 ID:q7fsT5OK
>>894 prvalueとxvalueを間違えてるような
C++のIteratorはhasNext()メソッドが無いじゃないっすか。
==演算子で何かと比べてhasNext()の代わりをいたすんですが、
比べるものが無いときはダミーの終端記号を用意するのですか?
その時はクラス変数で用意するのかend()メソッドで用意するのかどちらですか?
pos+1==end()
pos==end()-1 // bidirectional only
比べるものが無いときってどういうときっすか?
iteratorが1 2 3 4 5 6 と順番に数字をある番号まで出す。
この時iteratorが1を出すときはiterator内部で2という情報を持ちnを出すときはn+1を持つ
そしてiteratorはnを持つとき内部でnという情報を持つときに出力を終了する。
hasNext なんてメソッドあっても for ループで使えないし
break の用途位でしかつかえないしイラネーヨ
iteratorが1 2 3 4 5 6 と順番に数字をある番号まで出す。
この時iteratorが1を出すときはiterator内部で2という情報を持ちnを出すときはn+1を持つ
そしてiteratorはnを出すとき内部でnという情報を持つときに出力を終了する。
calss it{
int a
int b
...
operator*(){
if(a==b)
b=a
return ++a;
}
};
iteratorが1 2 3 4 5 6 と順番に数字をある番号まで出す。
この時iteratorが1を出すときはiterator内部で2という情報を持ちnを出すときはn+1を持つ
そしてiteratorはnを出すとき内部でnという情報を持つときに出力を終了する。
calss it{
int a
int b
...
operator*(){
if(a==b)return a;
if(条件)
b=a;
else
b=a+1;
return ++a;
}
};
なるほどわからん
なにが一体どうなんだ
iteratorが1 2 3 4 5 6 と順番に数字をある番号まで出す。
この時iteratorが1を出すときはiterator内部で2という情報を持ちnを出すときはn+1を持つ
そしてiteratorはnを出すとき内部でnという情報を持つときに出力を終了する。
calss it{
int a
int b
...
int operator*(){
if(a==b)
return エラー;//これが実行されたら駄目
if(ある条件)
b=a;
else
b=a+1;
return ++a;
}
};
iteratorが1 2 3 4 5 6 と順番に数字をある番号まで出す。
この時iteratorが1を出すときはiterator内部で2という情報を持ちnを出すときはn+1を持つ
そしてiteratorはnを出すとき内部でnという情報を持つときに出力を終了する。
calss it{
int a
int b
...
int operator*(){
if(a==b)
return エラー;//これが実行されたら駄目
if(ある条件)
b=a;
else
b=a+1;
return a;
}
operator ++(略){++a;}
};
わけがわからないw
iteratorが1 2 3 4 5 6 と順番に数字をある番号まで出す。
この時iteratorが1を出すときはiterator内部で2という情報を持ちnを出すときはn+1を持つ
そしてiteratorはnを出すとき内部でnという情報を持つときに出力を終了する。
calss it{
int a;
int b;
public:
it():a(1),b(2){}
bool hasNext(){if(a==b)return false;else return true;}//実装しない
int operator*(){
if(a==b)
return エラー;//これが実行されたら駄目
if(ある条件)
b=a;
else
b=a+1;
return a;
}
void operator++(){++a;}
};
iteratorが1 2 3 4 5 6 と順番に数字をある番号まで出す。
この時iteratorが1を出すときはiterator内部で2という情報を持ちnを出すときはn+1を持つ
そしてiteratorはnを出すとき内部でnという情報を持つときに出力を終了する。
calss it{
int a;
int b;
public:
it():a(1),b(2){}
bool hasNext(){if(a==b)return false;else return true;}//実装しない
bool operator==(it& i){if(a==b)return false;else return true;}//実装するがiに入れるのが無駄
int operator*(){
if(a==b)
return エラー;//これが実行されたら駄目
if(ある条件)
b=a;
else
b=a+1;
return a;
}
void operator++(){++a;}
};
iteratorが1 2 3 4 5 6 と順番に数字をある番号まで出す。
この時iteratorが1を出すときはiterator内部で2という情報を持ちnを出すときはn+1を持つ
そしてiteratorはnを出すとき内部でnという情報を持つときに出力を終了する。
calss it{
int a;
int b;
public:
it():a(1),b(2){}
bool hasNext(){if(a==b)return false;else return true;}//実装しない
bool operator==(it& i){if(a==b)return false;else return true;}//実装するがiに入れるのが無駄
int operator*(){
if(a==b)
return エラー;//これが実行されたら駄目
if(ある条件)
b+=a;
else
b=a+2;
return a;
}
void operator++(){++a;}
};
iteratorが1 2 3 4 5 6 と順番に数字をある番号まで出す。
この時iteratorが1を出すときはiterator内部で2という情報を持ちnを出すときはn+1を持つ
そしてiteratorはnを出すとき内部でnという情報を持つときに出力を終了する。
calss it{
int a;
int b;
public:
it():a(1),b(2){}
bool hasNext(){if(a==b)return false;else return true;}//実装しない
bool operator==(it& i){if(a==b)return false;else return true;}//実装するがiに入れるのが無駄
int operator*(){
if(a==b)
return エラー;//これが実行されたら駄目
return a;
}
void operator++(){ある条件?++b:b;++a;}
};