【初心者歓迎】C/C++室 Ver.75【環境依存OK】
3 :
990:2011/03/04(金) 18:28:09.46
, -‐介‐- 、
/ `\
// _,. . -―-. . _ ヽ\
/ /イ´: : : : : : : : : : : `:.、 \
∠_ / : : ,イ:人: : : : :人 : : : : \ \
∠: : : :/斗ト-\/ 弋ト、: : : : ;ゝ-´
V: /! __ __ ト、: :./ ここは烏賊娘の部屋でゲソ〜
|V_:ハ、'⌒゙ , ⌒ヽ ,ハ、Y
|: {〈〈} 、 , {リ〉リ:{
/: ∧ \  ̄ / ∧:ヘ
. /: / : \ )ー--‐ '( ,.イ:ハハ
/: ∧: :(´⌒ Y《ー ‐》Y ⌒゙): : } ハ
. /: / :∧:/` チ ゙《 》 乂 ´\:∧: :.|
. //l :// ./ V ヽ \V: \
. /: / .|/´ /!______.∧ `ヽ: : \
 ̄ ̄ ̄ ̄ { /: し) (⌒ヽソ人 } ̄ ̄ ̄ ̄
`ー' `ー' `ー' `ー '
5 :
デフォルトの名無しさん:2011/03/04(金) 22:42:00.01
最初に2つのスレッドが同時にこの関数を呼ぶと・・・ってことか
7 :
デフォルトの名無しさん:2011/03/05(土) 05:52:54.54
最初だけとは限らないところが問題なんだ。
8 :
デフォルトの名無しさん:2011/03/05(土) 05:56:19.13
これはヘッダーだけのコンポーネントを構成する時に起こる一般的な問題だぞ。
静的なテーブルを使うようなものはいくらでもある。
各種構文解析機、文字コードを扱うもの等。
何かとおもったらレース状態の話か
言語の問題というよりマルチタスク寄りの問題だろう
その手の本を読んだ方が良い
Googleでは「競合状態」の方がよくヒットするな
読めば理解できる
11 :
デフォルトの名無しさん:2011/03/05(土) 10:18:48.68
そういう話ではないんだがな。
mainで初期化すればいいじゃん
ヘッダに性的ミューテックス定義してそれで同期しちゃいかんの?
template<typename T> struct static_mutex { static mutex unko_lock; };
template<typename T> mutex static_mutex<T>::unko_lock;
template struct static_mutex<void>;
→static_mutex<void>::unko_lockで同期する。
そんなに引きずるようなネタ?
cppに
Singleton
_declspec(selectany)
前スレで答えで出てるじゃん
いろいろあーだこーだ言うのが楽しいだけさ
>>7 どういうこと?初期化さえされてしまえば大丈夫な気がするけど
cppはDLL間の多重化を防げない。
Singletonはそれだけじゃマルチスレッドの初期化ができない。
ファイルスコープに定義することでmain前にシングルスレッドで初期化し、
selectanyでDLL間/DLL内の多重定義を抑制する。
システム資源と言語内変数の一意性をごっちゃにしてる。
>>20 それに必要なonce_flagがDLLとアプリで両方定義されたら元の
>>976は解決
できないんじゃ?
>>19 CPPとSingletonと
>>13のtemplateは言語内の話だよね。
>>976はモジュール間
の話だから、言語内にもDLL間にも働くdeclspecでいい気がするが
マクロで環境別にプリプロセスが正解
質問です。
ポインタ関係なのですが、int*やdouble*やvoid*型はサイズなのに、どこにその型の情報を保存しているのですか?
それとも、コンパイル時にエラーを出すだけで、プログラム実行時には区別されていないんでしょうか?
24 :
23:2011/03/07(月) 12:10:07.71
すみません、
サイズは一緒なのに、どこにその型の〜
です
dynamic_castでも使わないと型情報なんて保存しないよ
型情報とかはコンパイラやデバッガのために要るだけでプログラムが実行するためには要りませんので
その辺は動的言語やJava/.NETなどとは別物で、実行時タイプチェックは
無いものと思ったほうがいいですが
C++でRTTIを有効にすると、ある程度の実行時型情報は利用できます
ただし、以下のようなコードで取れる型名は完全に実装依存です
VC++では char *, int *, struct _iobuf *... のようになりますが
g++では Pc, Pi, P9_sFILE64... のようになります
#include <cstdio>
#include <iostream>
#include <typeinfo>
using namespace std;
int main()
{
char *s = "hi";
int *n = 0;
cout << typeid(s).name() << endl;
cout << typeid(n).name() << endl;
cout << typeid(stdin).name() << endl;
cout << typeid(fopen).name() << endl;
}
28 :
23:2011/03/07(月) 12:58:33.41
ありがとうございます
すっきりしました
>>23 サイズが一緒なのは、ポインタの実体は32ビット(64ビットOSなら64ビット)の
メモリ領域でしかないから。
そこに実データが存在するメモリアドレスが格納されてるわけだ。
で、コンパイル時は型がわかるから、言語仕様として出来ない暗黙キャストは怒られる。
試しに値を代入したfloat型変数のポインタを、無理矢理int型ポインタにreinterpret_castして
int型として値を取り出すと、floatとして代入された値の32ビット浮動小数点フォーマットのビット表現を、32ビット整数として得ることができる。
・・・ことがある。
31 :
デフォルトの名無しさん:2011/03/08(火) 03:02:40.28
NTLという演算ライブラリを使っています。ZZ型という巨大整数を扱う型が
あるのですが、計算結果をファイルに書き込みたいのですが、char型の配列
に変換できずに困っています。I[i]=salt%256;salt=(salt
>>8);とやっても
出来ませんでした。ZZ型をそのまま書きこむ方法があればいいのですが、
内部でどのような処理をしているのかが解りません。どなたか解る人が
いたら教えてください。よろしくお願いします。
ヘッダーファイルを見る限りだと、バイト列にしたいんならBytesFromZZ、
文字列にしたいならstd::ostreamにぶち込めばいいでないの
寝取られライブラリ。ハァハァ
デバッグ、ログ用に
debugout( .... ); とかして
....部はprintfの()の中の書式
ソース名(debugoutソース行番号) xxxx
xxxは書式展開部
ってなふうに出力するC/C++両方で使えるコード作ってください
いくら出す?
37 :
34:2011/03/11(金) 00:03:35.81
今のコード例、これと同じことをCでもしたい
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <tchar.h>
#include <stdarg.h>
#undef OutputDebugString
#define OutputDebugString printf
struct Debugout
{
Debugout(const _TCHAR* filename, int line);
void operator()(const _TCHAR* fmt, ...);
_TCHAR buf[512];
};
38 :
34:2011/03/11(金) 00:04:24.19
Debugout::Debugout( const _TCHAR * filename, int line )
{
_sntprintf( buf, 255, TEXT("%s(%d): "), filename, line);
}
void Debugout::operator()( const _TCHAR * fmt, ... )
{
_TCHAR msg[256];
va_list ap;
va_start( ap, fmt);
_vsntprintf( msg, 255, fmt, ap);
va_end(ap);
_tcscat( buf, msg );
OutputDebugString(buf);
}
#define debugout Debugout(__FILE__, __LINE__)
39 :
34:2011/03/11(金) 00:05:45.99
int main()
{
TCHAR* neko = TEXT("nyan");
int i = 10;
debugout( TEXT("neko %s, %d\n"), neko, i );
return 0;
}
だれかCバージョン作って
>>34 void Debugout( const _TCHAR * fmt, ... )
{
_TCHAR msg[256];
va_list ap;
va_start( ap, fmt);
_vsntprintf( msg, 255, fmt, ap);
va_end(ap);
OutputDebugString(msg);
}
#define debugout Debugout( TEXT("%s(%d): "), __FILE__, __LINE__), Debugout
41 :
34:2011/03/11(金) 02:14:05.28
>>40 どうも。でも、それ最初考えたんです
それOutputDebugStringが二回になるから
表示が
PID/xxx.exe FILE(LINE):
PID/xxx.exe msg
や
PID/xxx.exe FILE(LINE) PID/xxx.exe msg
とかの表示になるんです. 見にくい
こう表示して欲しい
PID/xxx.exe FILE(LINE) msg
>>41 静的変数として buf を用意すれば楽にいけるんじゃね?
43 :
34:2011/03/11(金) 02:55:00.89
>>34 つ C99
void Debugout( const _TCHAR* filename, const int line, const _TCHAR * fmt, ... )
{
_TCHAR msg[256];
_TCHAR buf[512];
va_list ap;
va_start( ap, fmt);
_vsntprintf( msg, 255, fmt, ap);
va_end(ap);
_sntprintf( buf, 255, TEXT("%s(%d): "), filename, line);
_tcscat( buf, msg );
OutputDebugString(buf);
}
#define debugout( ... ) Debugout( __FILE__, __LINE__, __VA_ARGS__ )
何かのライブラリで、例えば
inline int hoge(){
#ifdef HOGE
return 0;
#else
return 1;
#endif
}
こんな感じになっている場合、これをインクルードして
class fuga{
public:
int fuga1(); //このメソッド内で呼ぶhoge()から0を返してもらって
int fuga2(); //このメソッド内で呼ぶhoge()から1を返してもらう
}
という事は出来るでしょうか?
>>45 fuga::fuga1()とfuga::fuga2()の定義を別のコンパイル単位にして
HOGEのdefineを変えてincludeすればいい
>>45 template<int RET> inline int hoge(){
return RET;
}
hoge<0>();
hoge<1>();
とかでいいんじゃない?
48 :
34:2011/03/11(金) 19:53:32.08
地震エライことになったな
>>42をもとに作ったC用
void Debugout( const _TCHAR * fmt, ... )
{
static _TCHAR msg[512];
size_t len;
va_list ap;
len = _tcslen(msg);
va_start( ap, fmt);
_vsntprintf( msg + len, sizeof(msg)/sizeof(msg[0]) - len -1, fmt, ap);
va_end(ap);
if( len ){
OutputDebugString(msg);
msg[0] = TEXT('\0');
}
}
#define debugout Debugout( TEXT("%s(%d): "), TEXT(__FILE__), __LINE__), Debugout
49 :
45:2011/03/11(金) 22:06:39.04
レスありがとうございます。
>>47 すみません、ライブラリには手を加えられないという前提が抜けていました。
説明不足になってしまい、申し訳ないです。
>>46 下記のような感じでやってみたんですが、私が何か思い違いをしているようで、上手くいきませんでした。
すみませんが、もう少し詳細をお聞かせいただけないでしょうか。
===Fuga.h===
#ifndef FUGA_H_INCLUDE_
#define FUGA_H_INCLUDE_
#include "Hoge.h"
class fuga
{
public:
Int fuga1();
Int fuga2();
};
#endif
===Fuga1.cpp===
#define HOGE
#include "Fuga.h"
int fuga::fuga1() {return hoge();}
===Fuga2.cpp===
#include "Fuga.h"
int fuga::fuga2() {return hoge();}
>>49 template<int RET> inline int hoge_wrap(){
hoge();
return RET;
}
hoge_wrap<0>();
hoge_wrap<1>();
地震のおかげでいつもより早く帰れるーって喜んでる人がいて日本に不安を感じた
>>45 単純にやると ODR 違反で未定義動作だと思われます。
>>53 リークしません。プログラム内にかかれた文字列はコンパイル時に実行ファイル内に組み込まれるからです。
リークってメモリリーク?
>>55 ほう、どこが嘘なんですか?
文字リテラルは静的に確保されると思いますがね。
>>58 リークしないか、という質問ですから、リークしない、と答えたまでですが、その過程のどこで「質問を読んでいない」と判断したのですか?
>>59 strに格納される文字列データ≠プログラム内にかかれた文字列
>>60 いや、この場合、
str が指すポイント先のasciiz文字列=静的領域に確保された asciiz 文字列
でしょう。
>>61 何で質問内容を自分に都合の良いように書き換えちゃうの?
>>62 え?リークするかしないかでしょう?
じゃあ、リークしないんじゃないですか?
「リークする」という言葉の定義があなたと私で違うのかもしれませんが。
>>63 何で質問内容を自分に都合の良いように書き換えちゃうの?
62は話し相手を求めているだけw
>自分のミスを指摘されても覚えてませんっていうアホが何言ってんだw
どっかで言われてますね
>まともな反論とやらが今までにありましたか?例を示してください。
これは誰の発言?
天の声
>>53 リークしません。プログラム内にかかれた文字列はコンパイル時に実行ファイル内に組み込まれるからです。
↓
リークしません。strに文字列が格納されるのではなく、strは文字列リテラルをポイントするだけだからです。
勿論、文字列リテラルはリークしません。
リークするのはお前の脳みそだけにしておけ
>>69 「そして、文字列リテラルは、実行ファイル内に組み込まれる存在です。」を追加してください。
それだけ説明すると、文字列リテラル以外の全てが実行ファイルに組み込まれるかどうかの疑問が生じてしまう。
従って、態々説明することではない。尤も、変数の初期値が実行ファイルに組み込まれることを知らない人もいるようだがw
>>71 >「そして、文字列リテラルは、実行ファイル内に組み込まれる存在です。」を追加してください。
こんな当たり前のこと、追加する必要ないだろう
初期値を持つ静的変数でも、その初期値が 0 ならば実行ファイルに組み込まれない環境もありました。
71 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
74 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
76 :
VBプログラマ:2011/03/16(水) 18:24:06.02
すみません、C言語初心者スレに書いたのですが、スレ違いだったようでこちらに書かさせてもらいます。
RS232Cでマルチタスクで各ポートにアクセスするプログラムで、スレッド1はRS232CのCOM1、スレッド2はCOM2、スレッド3はCOM3のみをアクセスし、1つのポートに複数のスレッドからはアクセスしない。
Thread1Func,Thread2Func,Thread3Funcを同時にスレッドで実行させて、うまく通信できるものでしょうか?
誰かやったことある方いましたら教えていただけますよう、お願いします。 自分で試したいのですが、RS232Cが会社のPCにはありません。
---
Thread1Func()
{
CreateFile("COM1"..
SetCommState
WriteFile
ReadFile
:
}
---
Thread2Func()
{
CreateFile("COM2"..
SetCommState
WriteFile
ReadFile
:
}
---
Thread3Func()
{
CreateFile("COM3"..
SetCommState
WriteFile
ReadFile
:
}
ハンドル破棄してないのが気になるけど通信自体はそれでできるんじゃね。
でも、非同期に通信するスレッド作るのはいいけどそのスレッドは一通信毎に終了するのか?
そうであれば結構重い気がするし、そうでないならメイン側とのI/Fを設計するのが厄介だと思う。
>>76 何をしようとしているのかさっぱり分らんが大丈夫だ
80 :
76:2011/03/16(水) 19:06:28.59
早速のレス御礼申し上げます。
>>77 >ハンドル破棄してないのが気になるけど通信自体はそれでできるんじゃね。
すみません。ハンドル破棄のCloseHandleを忘れました。
>>78 >でも、非同期に通信するスレッド作るのはいいけどそのスレッドは一通信毎に終了するのか?
>そうであれば結構重い気がするし、そうでないならメイン側とのI/Fを設計するのが厄介だと思う。
一通信毎に終了するのか、各スレッド内でループで回して、アプリケーション終了時に一斉クローズするのか悩んでます。
>55>58>60>62>64
以前にもいい加減なこと言う奴いたよな
そして、そーとこのスレを閉じる
終
某所で
void(^block)(int i)=^(int i){printf("%d\n",i);};
というソースをみたんだが,どういう書式?呼称とかある?
staticな関数内で宣言されたauto変数ってスタックに積まれる?
>>87 積まれます。C で static な関数というのは、単に関数名をリンカに公開するかしないかだけの違いです。
コテハンに突っかかってる奴はコテハンに恨みでもあるのか
>>90 そだった、そだった、賢いコンパイラのことを忘れていた。たとえば lsi-c なんかは積まれるとは限りませんね。
スレ一覧とか見ないから
そんなスレあったの知らんかったわw
>>92 自分自身で荒らしと決め付けた相手をスルーできないなんて
自分は狂ってますと自己紹介してるようなもんだなw
こうしてキチガイの ◆QZaw55cn4c はますます嫌われ者になって行くのであった
つっかかってる奴はもっと勉強して欲しい
なんかウザコテがマシに見えて逆効果
>>86 Objective C の Blocks では?
101 :
76:2011/03/17(木) 03:05:27.45
79さん、ありがとうございます。
>>98 それをしたいためだけに
>>53からのくだらないやり取りを自演してたのかと思って
>>98を書いてるのを見つけたときにはどうしようかと思った。
簡単に言うと
>>99
>>103 if( typeid(*this) == typeid(A) )
fooba2000 SDKを利用してコンポネートをVC++2010で作るため
http://kitahei.cocolog-nifty.com/youyou/2007/08/foobar2000_9e74.html をみながら*.vcprojを*.vcxprojに置き換えてやってみました
しかし
1>main.obj : error LNK2019: 未解決の外部シンボル "void __cdecl pfc::myassert(wchar_t const *,wchar_t const *,unsigned int)" (?myassert@pfc@@YAXPB_W0I@Z) が
関数 "protected: __thiscall service_factory_base::~service_factory_base(void)" (??1service_factory_base@@IAE@XZ) で参照されました。
1>main.obj : error LNK2019: 未解決の外部シンボル "bool __cdecl core_api::are_services_available(void)" (?are_services_available@core_api@@YA_NXZ) が
関数 "protected: __thiscall service_factory_base::~service_factory_base(void)" (??1service_factory_base@@IAE@XZ) で参照されました。
1>main.obj : error LNK2001: 外部シンボル ""public: static struct _GUID const componentversion::class_guid" (?class_guid@componentversion@@2U_GUID@@B)" は未解決です。
1>main.obj : error LNK2019: 未解決の外部シンボル "char const * __cdecl core_api::get_my_file_name(void)" (?get_my_file_name@core_api@@YAPBDXZ) が
関数 "public: virtual void __thiscall `anonymous namespace'::componentversion_myimpl::get_file_name(class pfc::string_base &)" (?get_file_name@componentversion_myimpl@?A0xbaa797a4@@UAEXAAVstring_base@pfc@@@Z) で参照されました。
1>main.obj : error LNK2001: 外部シンボル ""public: static class service_factory_base * service_factory_base::__internal__list" (?__internal__list@service_factory_base@@2PAV1@A)" は未解決です。
のようなエラーが出て躓きました
何がおかしいのでしょうか
>>103 それを知ってどうしようというのかね。何か歪んだことをしてそうな気がする。
>>103 そうしたくなる時点で設計としてなにか問題があると思うけど
それはともかく、標準の範囲では無理じゃねーの
移植性とかそういうの全部捨ててコンパイラの内部実装ベッタリの
アセンブラで書けば、書けるだろう
>>107 ありがとうございます
とりあえずできました
これってなんでだめなんでしょうか?
template<typename T> T::a_type aaaaaa(T t){return t.a(); }
誤: T::a_type
正: typename T::a_type
struct Hoge {
int a_;
typedef int a_type;
int a(){return a_;}
};
>>110 struct Hoge {
int a_;
typedef int a_type;
int a(){return a_;}
};
template<typename T> typename T::a_type aaaaaa(T t){return t.a(); }
int main(){
Hoge h;
h.a_ = 100;
cout << aaaaaa<Hoge>(h) << endl;
return 0;
}
いけるけど?
113 :
111:2011/03/23(水) 06:40:02.47
msvcrt.dllって64bit版もあったんだな
当時そんなもんあったわけないし、msvcr71.dllは32bit版だけだったと思うけど……
64bit版のJavaのbinディレクトリにあるし、よくみたらSxSの下にあったわ
もしかしてすでにVC6ランタイムの皮かぶってるだけの別物?
64bit版のmsvcrt.dllにリンクするプログラムってどうやって作ってるんだろう
WOWならx86_64としてビルドすればよいのではないの?
>>115 ごめんちょっと意味が分からない……
VC6には64bitターゲットのコンパイラは無かったし
最近のVCではMSVCRT.DLLとは別のCランタイムとリンクするので
どうやっているのだろう?という素朴な疑問です
VC6のヘッダも多分x86ベッタリでそのまま使えないだろうし
64ビットプロセスは起動すると勝手に64ビットのライブラリと
リンクする。
Windows SDK 7.1についてるヘッダをインクルードしてSDK 7.1の
64ビット版インポートヘッダ(.lib)でビルドしておけばよいだけ。
VS2005のころってmsvcrt.dllつかってなかった?
>>117 あーWindowsSDKにはついてるのか、サンクス
>>118 VS2003はmsvcr71.dll
VS2005はmsvcr8.dll
VC6の頃とはABI互換性が無いので名前も変わってる
User CPU、 System CPU、 Idle CPUの各値を取得する方法を教えてください
環境はUbuntu10.10、gcc4.4.5です。
つ[man 1 time]
122 :
117:2011/03/24(木) 19:28:30.70
>>119 Visual Studio 2010 Proならプラットフォームに「x64」を指定する。
ExpressならWindows SDK 7.1を入れて、プロジェクトのプロパティー
の「プラットフォームツールセット」にSDKを指定する必要あり。
コマンドラインからビルドしない限り.libを指定する必要は無い。
>>122 いやVS2010で普通にx64でビルドすると、AMD64版のmsvcr100.dllにリンクされない?
124 :
117:2011/03/24(木) 23:11:37.40
125 :
デフォルトの名無しさん:2011/03/25(金) 19:12:09.18
秘密鍵に32バイトの認証ハッシュ値をつけて、アクセス時にパスワードで
認証する機能をつけたいのですがうまくいきません。秘密鍵の計算方法が
正しいかどうかもわからないので公開します。lkbを呼び出すとループの
値が0にリセットされて無限ループになります。機能は動いたはずなのに
今朝動かしたら動かなくなっていました。下にソースのアドレスを書きます。
わかる人がいたらよろしくお願いします。
http://codepad.org/55oSSY2H
126 :
デフォルトの名無しさん:2011/03/25(金) 21:47:06.37
この質問はほかのすれで対応中です。
>>125 まず秘密鍵、といいますが、暗号はなにか方式教えてください。
ハッシュ、といいますが、ハッシュの方式を教えてください。
話はそれからだと思います。
for が入れ子のとき、
bool sex = false;
for (〜;〜;〜) {
for (〜;〜;〜) {
sex = true;
}
if ( sex ) break;
}
とするべきか、
for (〜;〜;〜) {
for (〜;〜;〜) {
goto SEX;
}
}
SEX:
とするべきか。
手続き型言語にgotoは不要だが、この場合はgotoを使った方が良い希ガスる。
別に可読性がそこまで下がっているようにも見えないし。
>>128 私ならば可読性を重視して後者をとります。
>>128 おれなら
C++ではthrow
Cなら関数
だな
132 :
デフォルトの名無しさん:2011/03/25(金) 22:45:31.72
>>127 オリジナルのストリーム暗号です。
オリジナルのハッシュ関数です。
>>128 入れ子の片方のforがbreakしてないから等価じゃないな
>>128はgotoを使っていい数少ないケースとしてしばしば話題になる。
同時に、例外を使ってはいけないとされるケースだ。
関数案を支持します
何度も何度も論争になるいいネタだよね。
俺は当然 多重ループからの脱出はgotoを使う。
多重ループがまずいってのは耳タコです。
137 :
デフォルトの名無しさん:2011/03/26(土) 08:19:59.51
例外セーフって何ですか?
スレッドセーフについて調べていると目についたのですが、ググってもなかなかでてきません。
わずかな情報から察するに、例外によって本来される処理が行われない=例外セーフでない、でしょうか?
例外セーフでないコード:
int func() {
int *p = new int(1);
try {
throw exception();
} catch(exception &e) {
return -1;
}
delete p;
return 0;
}
分かったら分かったことをここに書いて情報を共有しろ
141 :
デフォルトの名無しさん:2011/03/26(土) 17:36:45.59
>>128 今更だが、俺はエンドフラグ(主にintと型数値にしている)派だ。
どんな理由で終了したかデバッグ時に一目で分かるのと。
終了する意味が2通り以上ある場合がありので。
エンドコードで統一している。
いっとくが、goto先2ヶ所は、邪道だ!
142 :
デフォルトの名無しさん:2011/03/26(土) 17:57:30.83
>>141 ループごとにメソッドにしてやればgoto使わなくてすむんじゃないのかな?
http://hibari.2ch.net/test/read.cgi/tech/1295800051/ で誘導されてきました。宜しくお願いします。
UI含めたマルチスレッドプログラミングを始めてやって、
考え方に躓いています。
(Win32bit VS2010 C++ SDK ATL/WTL 使いです。)
作ってるのは、メインウィンドウで特定のオペレーションがあった場合、
キャンセル可能な処理中ウィンドウを表示するという一般的なものですが、
どのように考えるのが一般的ですか??
とりあえず現在、
<メインウィンドウ>
・処理中ダイアログを生成
・スレッド生成
・時間のかかる処理
・ダイアログクローズメソッド呼び出し(その後スレッドが自動的に終了)
・ダイアログを破棄
<スレッド>
・ダイアログをモーダルで表示
・WM_TIMER で処理中アニメーションしながらキャンセル待ち
・メインウィンドウから進捗メソッドが呼ばれたらプログレスバーを更新
みたいにやっているのですが、オブジェクト指向的にどうもスッキリせず、またインスタンスをスレッドに
渡していることがOS上タブーなようで。。。また、親ウィンドウの HWND も正しく取れません。(スレッドが違うから?)
皆さんは普段どのように設計していますか?
・・・メインウィンドウでダイアログを生成/モードレス表示して、
スレッドで時間のかかる処理をして、そのスレッドの完了をメインウィンドウで待つのかな・・・
そうすると、ダイアログのメッセージループは誰が処理するの・・・??もう1つスレッドが要る??
教えてエロい人!!!
>>143 ・メイン画面とダイアログはメインスレッドにする
処理のみサブスレッド化
・ダイアログでタイマー回して処理サブスレッドの状況を表示
・とりあえずメイン画面はサブスレッドに直接アクセスしないよう
作ってみる
画面がいくつあろうとできる限りUIスレッドは一つにした方がよい。
ただエクスプローラーの様に一つの画面が処理待ちで固まると
他の画面も固まるため、どうしてもという場合だけUIスレッドを複数にする
146 :
143:2011/03/26(土) 19:04:46.11
>>144 すれ違いスマソ。
モードレスダイアログとウィンドウ関連の操作はできるんだけど、どこでやるべきとか、
そういう過去の経験からのノウハウを教えて頂けると嬉しいです。
一応
>>143 のでも動くは動くんですが、やってはいけない設計方法らしいので・・・。
>>145 成程、基本的にUIスレッドは1つにするものなんですね。
確かに、SendMessage() 関連のデッドロック話は聞いたことがあります。
基本処理をスレッド(ワーカースレッド)として、そのスレッドとの
やりとりを WM_TIMER 起因でやればよさそうですね。
とりあえずその設計でもう一度組みなおしてみます。
147 :
デフォルトの名無しさん:2011/03/26(土) 21:30:10.76
鍵ファイルにパスワードをつけてアクセス管理をしたいのですが、現在
わかっている2つのバグが解決できません。
1.同じ値をハッシュにかけているのに繰り返すたびに値が変わる
2.呼び出しを1回限定にすると無限ループになる
何が悪いのか原因がわかりません。
ソースをアップするのでよろしくお願いします。
http://codepad.org/15hfT9HS
>147
上の方でも書いてた人だろうけど悪い事言わないから独自ハッシュと暗号なんて窓から投げ捨てるべきだと思う。
それはそれとして詳細追っかける気はないけど挙動からするとグローバル変数とか何らかの初期化ミスっぽいからその辺調べてみたら?
>>148 独自の暗号は思うほど強くないから危険だって
私もなんかの本で読んだ。
boostを使ってgzip圧縮されたデータを複合化して加工するためstring型で得たいのですが
vector<char> data;//データは入っています
std::ostringstream oStrStream;
boost::iostreams::filtering_streambuf<boost::iostreams::output> filter;
filter.push( boost::iostreams::gzip_decompressor() );
filter.push( oStrStream );//☆
std::ostream oStream( &filter );
oStream.write( &data[0], data.size() );
std::cout << oStrStream.str();
とすると複合化はされるのですが最後のほうが切れてしまいます
しかし☆マークの行をfilter.push( std::cout );のようにして直接出力するとすべて表示されます
ostringstreamはサイズに限界でもあるのでしょうか
ストリームを使ったことがあまりないのでもっと他に間違いがあるのでしょうか
>150
oStream.flush() してみればどうかな。
152 :
デフォルトの名無しさん:2011/03/27(日) 11:34:31.87
理論的に安全性が証明できるハッシュ関数なんです。
しかしそれも実装次第。うまくいけばお慰みです。
>>151 ありがとうございました
すべて出るようになりました
>>152 おまえおめでたい奴だな
自分のコードのバグも解析できないくせに何が安全だ
お前が数学者ならプロの技術者に依頼しろよ
お前が技術者ならさっさと辞めてそのたいそうな理論を外注しろ
そうすればみんな幸せ
車輪のオナニー再発明なら頑張ってデバッグしな坊や
>>154 核心を突きすぎ
だいたいこんなところで聞いてる奴の言っていることだからな
車輪のオナニーは、まだ発明されてないかも
157 :
デフォルトの名無しさん:2011/03/27(日) 17:04:51.06
すごく初歩的な質問なのですが、以下のコードが正しく動作するのはなぜなのでしょうか
const std::string &s = "foo";
>>157 const参照はなんか特殊だってばっちゃが言ってた
お勧め"しない"本/著者ってなんかある?
"こういう内容のは怪しいと思え"とかがあれば、本を選ぶ時の参考にしたい
void main()と書いてある解説書は怪しい
おまじない
>>156 いや、確か以前それをした外人がいるはずだ。
しかし再発明出来たとしても同じ結末を迎えるのならやめたほうがいいものだったはずだ
163 :
デフォルトの名無しさん:2011/03/28(月) 16:52:18.00
すみません。環境依存OKとのことなので、ここで聞きます。VC2005についてなのですが、VC++2005のスレが見当たらないので・・
VSが欲しいなあとおもっていたんですが、StandardEditionは2010からなくなったとの事でProfessionalEditionを買うしかないのですが、
そこまで高いものは買いたくないんです。で、VSStandardEditionはというと、オークションなどでも高値で売られています。
でも、近くのPCショップでVS2005を売ってるところを発見したのです。
今はVC6.0を使っているのですが、VS2005を買うと大きなメリットとかありますか?
使用目的は、Win32APIとMFCです。
自分にとっては、2万というのはけっこうな大金なので、買おうか迷っています。
良いメリットがあるなら、教えてください。
Express Editionならタダだが、どうしても買いたいの?
まずはVS2010Express入れてみたら
165 :
デフォルトの名無しさん:2011/03/28(月) 17:26:50.62
>>164 Express Editionはもう入れているんですが、
Standard Editionで、良い機能とかあるなら買いたいです。
あと、Express Editionには、MFCがないので・・
有料版だったらアドオンが使えるとか
俺もEEだから実際に使ったことはないけど紹介見る限り結構開発に便利そうなのもあった
今のEEにはリソースエディタは付いているのかな?
.rc をテキストエディタで作成/編集するのは泣ける
>>165 あーそういうことか
.NETに関してはVS2005(.NET2.0)じゃお話にならないけど
VC++ならそれほどでもないかな
どうしてもC++0x系の機能が欲しいんなら駄目だけど
ただVS2005, VS2008はCランタイムがサイドバイサイド(SxS)化されてて
扱いがちょっと面倒くさい
VS2010でCランタイムに関してSxSが廃止されて元に戻った
(manifestも要らなくなった)んで、VS2010のが楽
この二世代は、この点で、ある意味黒歴史って感じだ
>>167 リソースエディタはフリーでもあるでしょう
勿論UI要素をクリックしてMFCのイベントハンドラを記述するみたいな
連携は望むべくもないけど
2005のスレあるじゃん
>>169 そういう連携は期待していないんで…
フリーであるのか。 探してみよう
MFCを欲しがる人がまさか本当に実際にいたことを確認できて何か嬉しい。
個人的にはATL/WTLしか使ってない
ただ、MFCは2010のSP1ではDirect2Dサポートが加わったりしてるようだし
一応進化し続けてると言えるのでは
WTLはもうとまっちゃったからなー
>>170 あるのはVSのスレだろ
VC(MFC)しか必要ないからVSは目に入らなかったんじゃないか?
ATL使いたいんだけどやっぱり有料版買うしかないのかな?
>>163 MFCメインみたいだけど、VC6からVS2005だとあまり変わらないかもね
VS2008SP1でのリボンUIサポート、VS2010SP1でのD2Dサポート位しか大きい変化って記憶にないな
メリットといえば、IDE自体が使いやすくなっているというメリットがありはする。
あと安定性という点で、可能なら2008以降の方がいいと思う。
178 :
デフォルトの名無しさん:2011/03/29(火) 17:26:55.77
LinuxでCPU使用率が100%でないかどうかを調べる方法を教えてください
すみません。C++に直接関係なく数学寄りな質問で申し訳ないのですが、
1200個のものを、70個の箱(配列)に分けつつ、
・1箱目が一番多く、徐々に減って、70個目は1個しかない
・1箱目が一番多く、徐々に減って、70個目は1箱目の半分しかない
等という事を実現したいのですが、こうしたプログラムの解説サイトをどなたかご存知でないでしょうか?
>>179 台形の面積を求めるのと買わんない
>>179 (上底+下底)×高さ÷2
これが分かればいけるでしょ
面積は1200平方、高さは70、上底は1、下底は1より大きい
面積は1200平方、高さは70、上底はx、下底は2x
181 :
179:2011/03/29(火) 18:39:59.90
>>180 ありがとうございます。最初解りませんでしたが
理想に近い結果を得る方法がわかりました。スレ違い失礼しました&ありがとうございました。
>>178 ロードアベレージが1超えてなければ100%じゃないんじゃないのかな
>>178 vmstatコマンドで、idleの値を見るのは?
STLのlistでinvalidなiteratorをeraseするとexceptionがthrowされず
プログラムが落ちるのですが、これを回避するすべはないでしょうか?
走査するくらいしか思いつきません
itr = l.erase(itr);
>>184 iterator を持ってる間は erase() しない。
erase() した iterator はすぐ捨てる。
>>185,186
ありがとうございます
無効なイテレータを持ち続けないようにします
wininetのHttpQueryInfoで最終更新日時のタイムスタンプがほしいのですがどうしたらいいでしょうか
189 :
188:2011/03/30(水) 07:56:32.96
よく調べたらIf-Modified-Sinceというヘッダを送ればステータスコードで更新されたかどうかわかるようなのですが
送るための日付をHttpQueryInfoから文字列で取り出す方法が分かりません
またこのヘッダを送るというのは"If-Modified-Since:日付"をInternetOpenUrlの引数で渡せばいいのでしょうか
質問が変わりましたがよろしくお願いします
質問です。
Cをそこそこやっています。C++は少しかじった程度です。
VC++を使っています。
今までコンソールベースのプログラムしか書いてこなかったのですが、
ボタンやテキストボックス等があるグラフィカルなものを作りたいと思っています。
「win32アプリケーション」というのを勉強するのが良いのでしょうか?
それとも、Javaが良いでしょうか?
それと、もし良い本があれば教えてください。
191 :
デフォルトの名無しさん:2011/04/02(土) 22:27:37.38
今なら、C#が良いんじゃね
192 :
デフォルトの名無しさん:2011/04/02(土) 22:28:38.99
>>190 マルチしてんじゃねえ、このグズやろう。
ちょろっとラムダ式とbind(0xの方)で遊んでたんだけど
bind系じゃないと実装できねぇよ、的な事って何かある?
ない
| ̄:/ : : /: : : : : : : :i: : : i: :\ : :\ \
|: / : : : / : : : : :.i: : : : |: : : :|: : : |: : : i '
: :|: : : : |: : i: : : :|: : : /i|: : :|:| : : :|: : : | |
: :|: : : : |: :.|:斗 十‐/ i|: :∧-‐ト|: : : | |
: :|: : : : |イ|: :|:/ |:/ |:/ |ハ: : |: : : | \_,ノ
: :|: : : : | レヤ示ト rテv|:./|: : : :|
ヽ|: : : : |/{:::::::i } トイ レ: :|/|/ 関東地方
( |: : : : 代c::ノソ レリ |: : : : | 東北地方 北海道地方
.〈.|: : : : |x`¨ 、¨x.|: : : i:| にいる
\|i: : : :| , /|: : : i:| すべての 愛すべき 国民へ 告ぐ
∨リ\: :iト 、 `´ ィ |: : /|リ
‐┴―\|- 〈 >rァ 爪|V |/
:::::::::::::::::::::::ヽ \ リ
::::::::::::::::::::::::__\
:::::::::::::::/ ::r――‐へ rっr‐-、_
:::::::::/ ::// ∧. | ̄ ̄ ̄| | | | | ̄ ̄ ̄ ̄ ̄ ̄ ̄|..
:::/ ::/ / ヽ|. L|_|_ト' |
/ ::::/ / \ ただちに 逃げろ |
. :::/ |/ | |.
忍法帖まとめ
忍法帖は名前欄に
!ninja
とすれば出てくる。
って最近知った。どれどれ
●だか買うと最終書き込みから5分経過すればレベルが一つ上がるらしい。
そうじゃない人は24時間経過すればレベルが一つ上がるらしい。
あと、cookieの設定がうまくいってないとレベルが上がらないらしいから、
何日たってもレベル0,1の場合はHap cookieの設定をチェックだ。
レベル10以上になると
Lv=NN,xxxP『T』
ってなってスレ立てできるようになるらしい。
!ninja
!ninja
本文は適当で良かったはず
!denki !ninja
!ninja
ほうほう
このスレでやるなぼけ共
!denki !ninja
複数の状態の組み合わせとして、ビットフラグを使って
|や&で演算する方法をよく見ますが、32個とかしか表現できませんよね?
極端な例で128個の組み合わせを管理しようとすると、
どのような方法になるのでしょうか?
32*4
bool128個の配列で持てばいいだろ。
何でそんなにビットフラグが好きなんだ
std::bitset
vector<char>::iteratorにオフセットを加算したときout of rangeとならないようにする方法は
++しつつ!= iterator.end()をチェックする方法以外にありますでしょうか?
よろしくお願いします。
>>211 std::vector なら size() で先に分かるじゃないか
>>212 vector<char>::iteratorの位置が不定なので、size()の情報を元に算出する方法がわからないのですorz
誰か訳してくれ
215 :
デフォルトの名無しさん:2011/04/06(水) 00:18:26.18
ビットフラグは加算していくだけで全ビットの状態の組み合わせが表せるけど
std::bitsetも簡単にそういうことできるんだっけ
>>213 不定なら、どこ指しているのか分らんのだから、!= iterator.end()したらだめだろ
不定ならiteratorなんて使えない
>>214,216
std::searchとかで戻ってきたiteratorなのでどこかは指してます
if(std::distance(it, end()) < offset)
>>213 int( it - vect.begin() )
で何番目を指してるか分かるんじゃねーの?
>>215 bits = bits.to_ulong() + 1
221 :
デフォルトの名無しさん:2011/04/06(水) 02:21:17.25
>>220 でもいったんキャストするとなると結局long longの64bitで最大64個の組み合わせまでしかインクリメントで全表示できない?
まあそんなに多くの状態数が計算に必要だとしたら、そもそも計算時間的に問題有りなのかもしれないけど
>>221 組み合わせひとつごとの処理が仮に1ナノ秒で済んだとしても、
65ビット目がインクリメントされるまでに500年以上かかるぞ。
end-offset < it
よりdistanceのほうがよさげだった
225 :
デフォルトの名無しさん:2011/04/06(水) 21:47:28.54
>>222 だよな
まあ実際に計算するわけじゃなくて、なんとなく気になったから聞いてみた
>>224 どっち使っても一緒。ランダムアクセクイテレータに対しては-演算子を使うように特殊化されてるから。
227 :
デフォルトの名無しさん:2011/04/07(木) 16:37:38.37
排他制御について教えてください。 Linux環境でファイルを読み書き
する共有ライブ ラリを作成していて、
その共有ライブラリが複数プロセスから
ファイ ル名を指定されて呼ばれます。
共有ライブラリ内でファイルアクセス毎に
semget()して排他制御をしているんですが、
プロセスからこき使われると、
セマフォ集合を削除する 暇がなくて、
semop()時に指定しているSEM_ UNDOの
累積がSEMVMXに達してしまいどうしようか考えています。
そもそも、ライブラリ内で排他をかけてるのが 間違ってるのでしょうか?
暇がなかろうがする必要があることはしなきゃだめ
(暇があってもする必要がないことはしない方がいい)
SEM_UNDO必要あるの?
229 :
デフォルトの名無しさん:2011/04/07(木) 18:31:40.92
共有ライブラリで、セマフォ作っているので、アンドゥしていない場合
ロックをした状態の時に、プロセスが
強制終了されると、手動でセマフォを
削除するか、システムを再起動しないと
動かなくなってしまいませんかね?
単位はあくまでもプロセス
231 :
デフォルトの名無しさん:2011/04/07(木) 19:13:40.88
親プロセスが、セマフォの責任もてる設計にしないと、
問題があった場合に対象できない
ということですか?
共有ライブラリじゃなくて、ファイル管理プロセスにする訳にはいかなかったんだろうか。
233 :
227:2011/04/08(金) 16:36:57.82
ありがとうございます。
プロセスでセマフォを制御してもらえる
様に調整してみますね。
Cのソースファイルがあるのですが、Linux上でWindows向けの実行ファイルを作成することはできるのでしょうか?
使ってるディストリがmingw32パッケージ用意してたらそれ入れろ
クロスコンパイルでggr
すみません。
2重のfor文の処理中に、その2重のfor文全域を抜けてしまいたい場合、continueでは思い通りに行かない為
gotoとラベルで抜けているのですが、他にもっとマトモなやり方が有ったりするのでしょうか?
関数に切り出してreturnが定石
break代わりならreturnでもいいけど
continue代わりならgotoでもいいんじゃないかな
>>237 continueでは思い通りでなくgotoで抜けているコードの実例を頼む。
抜けているのはループじゃなくて頭じゃないかって気がするんだ。
breakがreturn代わりになるのか
C言語で無名関数(?)ってなんかきもいな
何を言っているんだお前は
245 :
237:2011/04/10(日) 23:38:17.04
>>238-241 頭が抜けておりますた。 continueじゃなくてbreak2回ですね。
gotoは使うべきではないとあちこちに書いてたから
その外に抜け出そうと使って良い物かと考えていましたが、なんとか大丈夫そうですね。
ありがとうございました、そして勘違いすみませんでした;
break2回を許容したということだろうか
247 :
デフォルトの名無しさん:2011/04/11(月) 15:33:07.38
速度を気にするなら内側のループをインライン関数にしてreturnの値から
外側のループを抜けるかどうか判断するのが妥当なきがするけどな。
まあステータス変数をもってあげても良いと思うよ。
まあ何はともあれループ内にだらだら処理を書かないなら適当にさばいときゃ良いと思う。
SSDに書き込みをする際に、注意する点を教えてください。
一キャラクタずつ書き込むのは、SSDにはよくないのでしょうか?
>>248 ブロックデバイスってのはセクタ単位で読み書きするものだ
プログラムから、ディスクなどのブロックデバイスに対して
セクタの整数倍になってない適当なサイズでのwriteが可能に見えるのは
背後でランタイムやOSがバッファリングしてまとめ書きするから
でもバッファリングしない設定になってたりするよね。
ドメコンのシステムドライブとか
物理的にセクタ単位でしか読み書きできないわけだから
セクタサイズにアラインさせるための最低のバッファリングは常にされるよ
もっともWindowsの話で言うと、FILE_FLAG_NO_BUFFERINGでファイル開いた場合は
OSレベルのバッファリングが切れるが、その場合、WriteFile()に渡すバッファを
セクタ長にアラインさせ、きっかりセクタサイズの倍数で書き込むのがユーザの
責任になる(つまり、いずれにせよ1バイト単位では書き込めない)
>>237 try (...) {...} catch (...) {...}
2重ループ脱出を主目的に例外を使いたくないな。
NO_BUFFERINGにしないと遅くなる致命的バグがあったが。
最新版では直っている。
細かいファイルの書き出しは速くはならないから、
バッファつきでまとめて書き出すと良い。
そういうケースでは、そこを関数化してreturnしてしまえ。
フラグを別途用意してフラグが立っていたらループを抜けるなんていうやり方をする男の人は軽蔑されるべき
257 :
デフォルトの名無しさん:2011/04/11(月) 22:48:34.70
selectでソケットプログラミングの勉強中で、以下のようなTCPサーバをつくっています。
サーバ1台、クライアント5台以上
Serv:selectでcliからの受信待ち
Cli:TCPパケットをservに送信、パケットのやり取りを複数回
Ser:"end"という文字を含むパケットを受信したら通信終了
fd = socket();
FD_SET(fd, &fds);
上の処理を、接続してきたクライアント毎(例えば10回)に行いselectで待つと思いますが、
FD_ISSET(fd, &fds);←このように書いた場合、10台のクライアントのうちどのクライアントから
受信したかどうかわかるんでしょうか?
261 :
デフォルトの名無しさん:2011/04/11(月) 23:20:58.15
>>261 いやだから、select()を使う以上はそうしなければならないのであって
本質的に効率が悪いんだよ
もっと効率がいい云々と書いたのは、FD_ISSETマクロの話じゃなくて
select()自体の話
Unix系ならepoll(), kqueue()
WinsockならIOCPについて調べるといい
>>261 1024個を同時にselectするのはアホだと思うが、
FD_ISSETの1000回ループごとき、測定限界以下の時間しか
かからんだろ。
>>262 案の定というか。わかってくれなかったな。。
>>262 なるほど。。。
ありがとうございました。
selectを使うのが条件なので、接続してきた台数をカウントして
その分だけチェックするのが一番効率いいですかね。
>>265 ダメ
「台数」とかアバウトな話じゃなくて、ちゃんと使ってるfd管理しろ
たとえば
std::vector<int> clients
のようなベクタにクライアントのfd入ってるとしたら、
fdsetにセットするのも
FD_ISSETでテストするのも、単にベクタの要素をループするだけだろ?
>>266 大事なのは台数じゃなくてfdの最大値でしたね。
失礼しました。。。
今時C/C++で手でネットワークプログラミングしようとするのは
殊勝な心がけだが、やるんならStevensのUnix Network Programmingが
必読書だから読んどけ
ちゃんと読んだらこのレベルの質問をする必要はなくなる
はいはい。俺が読んだ本は最低限の必読書
今時ソケットプログラミングにC/C++を持ち出すのは
時代錯誤としか言いようがない
なんだどうした
ソケットプログラムなど万人が必要で無い。
それ「ソケット」抜いても一緒……
っていうか何でム板のC/C++スレとかにいるの君達
Javaの場合、メモリの断片化が発生すると、ガベージコレクトして
くれるのですが、C++の場合も同じですか?
例えば、オブジェクトの生成や破棄をランダムに繰り返した場合など。
>>274 ガベージコレクタは標準ではありません。
対象環境を限定したライブラリとしてならガベージコレクタを組み込むこともできますが。→ BoehmGC
ガベージコレクタなんてなくて、すぐさまOSに返却する。
コンパクションが無いのはJavaもC++も同じ
>>276 × コンパクションが無いのは
○ コンパクションされるかどうか決まってないのは
だよね?
言語として提供されてないということだけで書いてしまった。
実装依存なのかな。にわか知識でスマソ。
>>275 アンカー抜けてました、ありがとうございます><;
281 :
デフォルトの名無しさん:2011/04/15(金) 14:15:56.11
質問です。
C++のクラスにおいて「自分自身の名前」「親クラスの名前」を扱う予約語はないでしょうか?
class Child : public Parent
{
Child(const Hoge &hoge):Parent(hoge){}
}
このようにコンストラクタを作るのですが
・自身の名前を変更した時
・親クラスを変えた時
に書き換え忘れが怖いのです(この手のクラスを大量に作っていると思ってください)
環境はVisualStudio2008です。
__superという予約語は発見できたのですが、これは親クラスのメソッドを呼び出す場合
Parent::draw(); を __super::draw()のようにすることしかできず、コンストラクタを呼ぶことはできませんでした。
理想としては
class Child : public Parent
{
__constructor(const Hoge &hoge):__super(hoge){}
}
こんな感じに書けないものかと考えています。
方法はありますでしょうか?
よろしくお願いいたします。
C++ が 言語仕様上 多重継承を許しているのでどうしようもないのではないだろうか?
同一単語で区別する術が無いよね
>>282 はい。C++の標準化委員会(というのでしょうか?)の方々も同一見解で、superの予約語化は見送ったらしいです。
一応「多重継承で、呼び出し先が曖昧な時はエラーにする」というのが最初の案だったそうですが。
VSは独自に__superを作ってくれていたので、こちらを使いました(がコンストラクタには使えませんでした)
多重インクルード防止の仕組みを入れて何回でもincludeしてやる
>>281 予約語じゃなくてもよければtypedefを使ったらどう?
各クラスの中で書く必要があるけど。
(質問の趣旨を誤解してたらスルーしてくれ)
class Child : public Parent
{
typedef Child thisClass;
typedef Parent baseClass;
thisClass(const Hoge &hoge):baseClass(hoge){}
}
このthisClassやbaseClassというのはATL/WTLで使われてる表記方法
>>285 横からだが、ナイスだと思ったw
むしろなぜ今までこれを思いつけなかったか、
ちょっと自分を責めたい。
287 :
デフォルトの名無しさん:2011/04/15(金) 23:25:01.55
cout の代わりにファイルに多倍長整数を書き込む関数があったら教えて
ください。標準入力のリダイレクトのような感じです。
よろしくお願いします。
ファイルストリームに書けばいいだけじゃん。
>>285 アドバイスありがとうございます。
最初その手法ですと、typedefの書き換え忘れが怖いなと思いました。
しかし実際にやってみますと
(NewParentはParentをpublic継承している)
class Child : public NewParent
{
typedef Child thisClass;
typedef Parent baseClass; //NewParentにするのを忘れている!
thisClass(const Hoge &hoge):baseClass(hoge){}
};
これは「NewParentのデフォルトコンストラクタを呼び出そうとしてるけど、そんなの無いよ」というコンパイルエラーになりました。
たしかに、NewParentへのコンストラクタ指定が無い状態になるので、
「指定が無ければデフォルトコンストラクタを呼ぶという法則」に従うはずですね。
また、間違えてNewParentにデフォルトコンストラクタを書いてしまった場合でも
「Parent(hoge)を呼び出してるけど、ParentはChildの基本クラスでもメンバでもありません」
というエラーになりました。
十二分に今件の要件を満たせます。
ありがとうございました。
std::maにおいて
キーにstd::string
値をchar型の配列の先頭ポインタ
としたいのですが、可能でしょうか?
291 :
デフォルトの名無しさん:2011/04/20(水) 23:02:21.72
mapです。すいません
例えばc_str()の値をそうやって別に保存させて使うのってよくないんじゃなかったっけ?
strdup(c_str())とかして確保しなおしてたらまぁそれは平気か。
>>290 stringはoperator<が定義されているから出来るよ
>>290 可能であるのが明らかなので何を疑問に思っているのかわからない。
int wtoj(int wyear,char *nengo, int *jyear)
{
if (wyear >= 1868 && wyear <= 1911) {
strcpy_s(nengo, "明治");
*jyear=wyear-1868+1;
return 0;
} else if (wyear >= 1912 && wyear <= 1925) {
strcpy_s(nengo, "大正");
*jyear=wyear-1912+1;
return 0;
} else if (wyear >= 1926 && wyear <= 1988) {
strcpy_s(nengo, "昭和");
*jyear=wyear-1926+1;
return 0;
} else if (wyear >= 1989 && wyear <= 2050) {
strcpy_s(nengo, "平成");
*jyear=wyear-1989+1;
return 0;
}
return 1;
}
上記をコンパイルするとerror C2660: 'strcpy_s' : 関数に 2 個の引数を指定できません。がでます。
MSDNのヘルプ見たんですがよくわからないのでここで解決できればと思い書きました。
宜しくお願いします。
>>295 char *nengoのサイズがわからないから、
strcpy_s()を使うのをやめるか、
int wtoj(int wyear,char *nengo, int nengoSize, int *jyear)
{
if (wyear >= 1868 && wyear <= 1911) {
strcpy_s(nengo, nengoSize, "明治");
みたいに引数を増やしてサイズを渡すとか。
なぜヘルプ見てもわからないのか。馬鹿なの?
どうでもいいけど、1926年は殆ど大正だな。
300 :
デフォルトの名無しさん:2011/04/21(木) 23:47:08.65
std::vectorで動的な2次元配列を作りたいのですが、2次元目は固定長でいい場合はどうしたらいいでしょうか?
int num = GetNum();
std::vector<??????> hoge;
hoge[0][0]
hoge[0][1]
・
・
hoge[0][num]
hoge[1][0]
・
・
みたいなデータ構造にしたいです。
301 :
デフォルトの名無しさん:2011/04/21(木) 23:53:41.06
>>300 std::vector<std::vector<int> > hoge(n, std::vector<int>(num));
あとでresizeすればいかようにも変更可能
nはどこで定義するのでしょうか?
ちなみにpush_backして要素を入れていくつもりです
>>303 だって二次元配列でしょ?
取りあえず0を入れておいてresize()すればいいし
>ちなみにpush_backして要素を入れていくつもりです
もちろんOK
こんな感じ
気を付けるべき点は、resize()は第二パラメータに何も指定しないと要素がゼロになるので
必ず行方向のvectorを指定する
もしくはforで回してhoge[i]をnumでresize()してもよい
int main()
{
int num, raw;
std::cout << "num : ";
std::cin >> num;
std::vector<std::vector<int> > hoge(0, std::vector<int>(num));
std::cout << "行の数 : ";
std::cin >> raw;
hoge.resize(raw, std::vector<int>(num));
hoge[0][1] = 123;
hoge[1][0] = 456;
std::cout << hoge[0][1] << ' ' << hoge[1][0] << std::endl;
}
すまん雑用で席を外していた
こうすればpush_backを使うし、またnumを指定する必要もない
int main()
{
std::vector<std::vector<int> > hoge(0, std::vector<int>());
std::vector<int> tmp;
int i = 0, j = 0, k;
while (true) {
std::cout << i << " 行目 " << j << "列目 = (マイナスの数を入れると次の行に移り、9999で終わります) ";
std::cin >> k;
if (k < 0) {
i++;
hoge.push_back(tmp);
std::vector<int>().swap(tmp); // tmpを空にする
j = 0;
} else if (k == 9999) {
if (tmp.size())
hoge.push_back(tmp);
break;
} else {
tmp.push_back(k);
j++;
}
}
for (i = 0; i < hoge.size(); i++) {
for (j = 0; j < hoge[i].size(); j++)
std::cout << hoge[i][j] << ' ';
std::cout << std::endl;
}
}
309 :
デフォルトの名無しさん:2011/04/22(金) 09:42:00.40
>>303push_backのたびに仲間が増えるよ、ぽぽぽぽ〜ん!
ブーストのムルティアレイは使いにくいよな
1 2 3 4 5 6 7 8 9
--+--------------------------
1 |1
2 |2 4
3 |3 6 9
4 |4 8 12 16
5 |5 10 15 20 25
6 |6 12 18 24 30 36
7 |7 14 21 28 35 42 49
8 |8 16 24 32 40 48 56 64
9 |9 18 27 36 45 54 63 72 81
1 2 3 4 5 6 7 8 9
--+--------------------------
1 |1 2 3 4 5 6 7 8 9
2 | 4 6 8 10 12 14 16 18
3 | 9 12 15 18 21 24 27
4 | 16 20 24 28 32 36
5 | 25 30 35 40 45
6 | 36 42 48 54
7 | 49 56 63
8 | 64 72
9 | 81
上記を実現するには同プログラム書けばいいんでしょうか?
普通の九九はできました。
数字を表示するところに if 文を入れて三角形の上か下か判断して数字を表示するかしないかすればいいと思います
プログラム、1文字も出来てないです
>>312 int i, x, y;
printf(" |");
for (i=1; i<=9; i++) { /* 上部の数字表示 */
printf("%3d",i);
}
printf("\n---+----------------------------\n");
for (x=1; x<=9; x++) {
printf("%d |",x); /* 左の数字表示 */
for (y=1; y<=9; y++) {
printf("%3d",x*y); /* 九九の表示 */
}
printf("\n");
}
return 0;
}
これです。
>>315 --
printf("%3d",x*y); /* 九九の表示 */
--
これを
--
printf(x < y ? " " : "%3d", x * y); // 空白は3個
--
にすればOK。もう一方は、不等号を逆にすればいい。
規則性を探すのが一番手間だな
上三角形 i行目は i*1 〜 i*i の羅列
下三角形 i行目は i*i 〜 i*9 の羅列
出力形が
>>311 通りにあわせようとすると、フォーマットの仕方が厄介か?
(下三角形の 1 の行だけ先頭空白無し: 例外的に出し方を変える?)
318 :
317:2011/04/22(金) 16:33:05.68
ごめん。 アンカー経由で見たら出力がぜんぜん違うやんorz
320 :
319:2011/04/22(金) 16:35:12.84
すまんリロードしてなかtったC言語か
>>316 >>319 ありがとうございました。
思っていた物が出来ました。
色々勉強不足な点もありますが、これから頑張ってやります。
template<class T>
class Hoge
{
typedef Hoge<T> Fuga;
};
この時Fugaの変わりにどんな名前をつけるのが一般的ですか?
なんかそれにはtypedefしたくないな。俺ならしない。
326 :
デフォルトの名無しさん:2011/04/22(金) 23:52:52.56
C++初心者です。以下のプログラムを実行すると
a = 1
b = 1
が出力されますが、どうも納得いきません。
親クラスのコンストラクタが先に呼ばれているのに、
親クラスのコンストラクタ引数に値を渡しているのが子クラスのコンストラクタなんですか?
class Parent{
public:
unsigned int a;
Parent(unsigned int i){
a = i;
cout << "a = " << a << endl;
}
~Parent(){};
};
class Child : public Parent{
public:
unsigned int b;
Child(unsigned int i): Parent(i){
b = i;
cout << "b = " << b << endl;
}
~Child(){};
};
int main(){
unsigned int i = 1;
Child c(i);
return 0;
}
>>326 当たり前過ぎて何が判らないのか判らない。
親クラスのコンストラクタなら、子クラスの初期化リストで明示的に呼び出しているじゃないか。
329 :
328 :2011/04/23(土) 00:11:28.66
330 :
デフォルトの名無しさん:2011/04/23(土) 00:25:33.15
>>326 >どうも納得いきません
に納得いきません
>>330 そう、もちろん引数なしコンストラクタの場合だけど
親のコンストラクタに引数を入れないとダメなら明示的に呼び出す必要がある
>>332 よくわかりました。
ありがとうございます。
なんでこんなのことで悩んでたんだろう。
vectorをメンバーに含む構造体の配列をnewで確保しても問題ありませんか?
ありません
>>334 すでに vector 使うんなら配列 new なんかせずに vector 使っとけばいいのに、と思う。
よく""で括ったりするけど、"が複数ある場合どれが括るものでどれが実際の文字としての"か
ってどういう風に見てるの?
>>337 >よく""で括ったりするけど、"が複数ある場合どれが括るものでどれが実際の文字としての"か
>ってどういう風に見てるの?
ダブルクォーツ自体を文字列リテラルに入れたいなら、バックスラッシュでエスケープ。
言語によっては違うが、それはスレ違いなので割愛。
ごめん日本語変だった。アルゴリズム的にどうやって判断してるかってことです。
例えばスペースやドット、コンマで各文字列を区切ってるテキストファイルで""で括ってる
部分は区切り文字があっても、文字列の一部ですよって判断したいんだけど、後ろの方まで
見に行く効率の悪い方法しか思い浮かばない
C言語のコンパイラの話か。
C言語の文字列は"を扱えて区切り文字では無いが。
エスケープシーケンスつかえ。
342 :
デフォルトの名無しさん:2011/04/23(土) 11:11:56.75
エクセルの吐くCSVとかの読み取り方法を聞きたいんじゃないの
最後まで見ないとどっちかわからんしょそれ
>>340 モードを切り替えるようにして詰んでるのかも。
rubyのヒアドキュメントの実装はそういうふうになってたような希ガス。
" があったら次に " が出てくるまで全て通常文字とみなす、では駄目なの?
>>340 普通はその効率の悪い方法でパースする。
>>344 まぁ、\"の出現をケアしたほうがいいだろうね。
VS2005、Releaseモードでコンパイルしたファイルは
開発環境と異なるOSでも動くと聞いたのですが、
Win7で作ったexeをVistaで動かそうとすると「ヒープが壊れている」
といわれて強制終了されてしまいます。(稀に強制終了しないこともあり)
(Win7だと強制終了しません)
デバッグできないので何が原因なのかわかりません。
こういった場合、どのように原因を特定したらよいのでしょうか?
csvファイルのデータを変数に格納しているところがあやしいような気がします。
>>347 動的確保のメモリ確保、解放まわりのバグが無いか
(多重解放、アクセス違反等)
しっかりチェックしてみては?
開発PCではバグが顕在化しなかっただけかもしれない
またVC++2005 再頒布可能パッケージ関連とは違うのかな?
349 :
347:2011/04/23(土) 22:14:23.25
>>348 >動的確保のメモリ確保、解放まわりのバグが無いか
>(多重解放、アクセス違反等)
>しっかりチェックしてみては?
コードを見直してみます。アクセス違反とはNULLポインタのことですか?
>またVC++2005 再頒布可能パッケージ関連とは違うのかな?
違うと思います。そもそも無知で何のことかわかりません・・・。
debugモードとreleaseモードではメモリ配置が違うから
このモードの違いでエラーが出たり解消したりする場合、メモリ確保開放や
アクセス違反辺りのバグの可能性が高いとどこかで聞いたことがある
>>347 まずメインが開始される前に落ちているのかどうかを
ログやメッセージボックスで確認。
少しでも自分の書いたプログラムが実行されているなら
どこで落ちているかをログで確認できるはず。
>>347 7だとFault Tolerant Heapのおかげで動いてるだけだろ
ページヒープとかCRTデバッグヒープとか活用してデバッグしようず
なんか面度そうな機能だな
355 :
347:2011/04/23(土) 23:22:20.64
皆さん回答ありがとうございます。
>>351 VistaPCは手元にないので、月曜日までに特定できなかったら試してみます。
>>352 CRTデバッグヒープってのをやってみたいんですが、ググってもよくわかりません。
コードにどのように記述したらいいかヒントを教えていただけませんか?
>>353 ページ内の、システムでフォールト トレラント ヒープを完全に無効にするには、
REG_DWORD 値 HKLM\Software\Microsoft\FTH\Enabled を 0 に設定します。
これのやり方がよくわかりません・・・
356 :
347:2011/04/23(土) 23:38:08.83
連投すみません。
>>353 HKLM\Software\Microsoft\FTH\Enabled がレジストリエディタに見つかりません。
という意味です。
358 :
デフォルトの名無しさん:2011/04/23(土) 23:40:35.51
switch文でstd::stringがそのままでは使えないんですが、
どうするのが一般的ですか?if文をたくさん書く?
>>358 用途が判らんからなんとも言えんが、テーブルを作る。
360 :
347:2011/04/23(土) 23:50:56.04
>>359 テーブルを元にfor文まわすみたいな感じですかね?
>>360 そうかぁ
でもまあメモリの多重解放あたりがやはり可能性高いんじゃないだろうか
怪しいと思うコード晒してみては?
ポインタにNULLを入れておけば何回でもdeleteできる
丸括弧内で宣言した変数のスコープを教えてください
関数定義の丸括弧内に書く引数のことなら、関数内のみ
>>367 ありがとうございます
ifなどの条件文です、さっき試したら中カッコでした
しつれいしました
369 :
デフォルトの名無しさん:2011/04/24(日) 19:28:26.15
誘導されてきました。
文字列を逆順にするプログラムを書こうとした場合、自分で考えると以下のようになりました。
---------------------------
#include <string>
string str = "abcde"
string new_str;
int i;
int length = str.size();
for (i=0; i<length; ++i) {
new_str[i] = str[length-i-1];
}
---------------------------
なにかかカッコ悪い感じがするのですが、
一番スマートな書き方はどのような感じになりますでしょうか?
PHPのarray_popみたいのがあったらwhileで回して綺麗にかけると思うのですが、
C++のstringライブラリにありましたでしょうか?
あと、C++では i++は++iの方がよいと誰かに教わったのですが、理由を忘れてしまいました。
何故でしたでしょうか・・?
ご教示いただけますと幸いです。
>>369 stringをvectorにコピーしてreverse()とか。
インクリメントが前置の方がいい理由は、自前のクラスのインクリメント関数を作ってみれば判る。
要は、後置インクリメントはコストが嵩むこともあるだろうから普段から前置にしておいた方が無難ということ。
同一バッファ内で逆順にするやり方。
#include <string>
#include <iostream>
int main(void)
{
std::string str = "abcde";
char tmp;
int i, j;
std::cout << "before: " << str << std::endl;
for (i = 0, j = str.size() - 1; i < j; ++i, --j) {
tmp = str[i];
str[i] = str[j];
str[j] = tmp;
}
std::cout << "after: " << str << std::endl;
return 0;
}
>>370 vectorにコピーしなくてもつかえるんじゃね?
std::string s = "12345";
std::reverse(s.begin(), s.end());
373 :
369:2011/04/24(日) 19:59:16.17
>>370 >>371 >>372 ありがとうございます。勉強になります。
>>369のやり方でも、間違いではない、のでしょうか。
>>371 のやり方ですと、コードは増えますが、効率はよくなる、のでしょうか。
ループの回数が少なくて済むように見えますが、トータルではどのやり方がいちばんよいのでしょう。
場合にもよるとは思うのですが・・。
>>369 逆反復子を使えばどうだい?
rbegin(), rend(), reverse_iterator
コンテナの中身はそのままでアルゴリズムに掛ける事が出来る
>369
とりあえず誰も指摘してないみたいなので。
new_str の領域が確保されてないからメモリ破壊してる。
push_back するか、string new_str(str.size(), ' '); とか。
全体としては、rbegin(), rend() で済むならそれで。駄目なら std::reverse でいいんじゃね。
shared_ptrを引数にするとき参照と値渡しどっちが効率いいですか?
>>378 sizeof()やってみて決めればいいじゃない
>>379 ありがとうございました 少ないほうを選べばいいんですね
>>378 参照って
void Func(shared_ptr<hoge>& p)
って意味?
当然参照の方が早いがこのオーバーヘッド気にするならスマポ使うなという
考えになるが
382 :
347:2011/04/25(月) 21:41:05.36
Win7のリリースモードでビルドしたプログラムが
Vistaで落ちてしまうという相談をした者です。
今日Vistaのリリースモードでデバッグしてみたのですが、
途中の変数をウォッチすると見れなかったり値がおかしかったりするのですが、
これはリリースモードだと普通なのでしょうか?
>>380 素朴な疑問なんだけど、スマポを値渡しするとその関数がスマポを返してくる
場合を除いて、関数の終了時に保持しているリソースを解放してしまうよね
危なくね?
>>383 なんでだよ
コピーされたら参照カウント増えるだろうが
あう
ごめん
auto_ptrと勘違いしてた
>>385 ああそっちか確かにauto_ptrを渡すのは危険だな
>>382 はい
より速く実行できるように命令の順番を入れ替えたり使い終わった変数は早々に消去してしまったり
もっと後の方まで計算を遅らせたり計算方法を組み替えたり不要な計算を省略したり
色んな最適化でソース通りのコードの流れではなくなってるので
ソース通りの変数の値がその場に存在しなくなっていることはあります
もちろんそういう最適化は最終的に得られる結果が変わらないように行なわれるわけですが
それはプログラムが完全に正しくてC++の規格に反したことは一切行っていないという前提でですね
C++の規格に沿った動作を保証できる範囲内で、可能な限り速く動くように、コードを改良するわけです
C++の規格で動作が保証されてないようなプログラムは、もちろん、動作が保証されません
◆QZaw55cn4cって糞だよなぁ
vector<bool> の特殊化を無効にする方法ないですか?
bitsetを使いましょう
なぜboolに拘るのか
cを始めてやるんですが、まず基本を勉強するにあたりよいサイトとか教えてください。
cの基本が終わったら、c++をやろうと思います。
こちらもよいサイトとか教えてください。
>>390 boost::dynamic_bitsetの方が便利じゃね?
ぶっちゃけ基本覚えちゃったらWin32APIなりに取り掛かってGUIで作り始めた方が
楽しく上達できると思うよ。
こんな機能を作りたい→どうすれば出来るんだろう→試行錯誤とアルゴリズムの勉強
って感じで、こっちの方が意欲的に取り掛かれると思う。少なくともおれはそうだった
正直CUIだと作っても相当凄いの作れないと実用的じゃないしつまらないよね
あんまし早いうちにウィンアプリ作ると変な癖付きそう
>>398 例えばどんなのが変な癖だと思いますか?
宗教論争的ではあるがハンガリアン記法
記法なんて必要に応じて使い分ければいいだけだから
気にすることはないんじゃないかな
Xlibよりは情報は多いし学びやすいんじゃないかな
入門編にイベントドリブンは敷居高いんじゃねーの
確かにイベントドリブンでうまく作用させるために
提供側が示している作法に従わないといけないという制限が付くからなぁ…
404 :
369:2011/04/29(金) 17:50:02.64
レスいただいた方々、ありがとうございましたm(_ _)m
色々やり方がありますね・・
とても勉強になりました。
>>400 よくそういうクセが付くっていうけど、別にクセじゃないよね。
ハンガリアンが有効でないって思ったらその瞬間に辞められるし。
そうでもない。変な癖は抜ける人と全く抜けない人がいる。
たとえば最初にハンガリアンの環境でプログラムを覚えたもんだから、
それ以降ハンガリアンで書くべきだって信じて考えを改められない
レベルの人は、最初たまたまいい環境で覚えられたとしても、それ以降
変な知識(クセ)にそまってしまったらどのみちダメになるでしょ。
スポーツのフォームじゃないんだから、クセが抜けないってのは
ただの勉強不足。
>>407 文章は適度な長さに分けないと誰にも理解されないよ。
プログラミングもまたしかり。
気をつけなよ。
三行と四行が理解できる、できないの境界なのか。
別にクセじゃないと思う。
使うと開発効率が極端に悪くなるなんて事があるのかな?
コーディングをスポーツのアナロジーで捕らえて「クセがつく」って
おかしな話だよな。
たしかに「おまえ10年前に入門書読んでそれで知識が止まってるだろ」みたいな
ヤツがいるけど、それはクセが抜けないんじゃなくてヘボいだけだ。
>>412 たしかに「改められないレベルの人は」の途中で切ると読みにくいな。
でも手で改行するから位置とか考えるの面倒。
>>407 リファクタリングしてやんよ。
最初覚えた知識だけを信じ込んでしまう人は、
ハンガリアンに関わらずどのみちダメでしょ。
クセというよりただの勉強不足が問題。
自分の記述スタイルについては適当なんだ?
また反論できなると、日本語がおかしいとか用語がおかしいとか
言い出す連中か。
自分の勝手な想定を、勝手にたたき出すマッチポンパー。
反論を前提にしてるバカがいる時点で終わってる
でもその人って、最初にいい環境で学ぶと、悪いクセはつかないんじゃないの?
方針をかたくなに変えないんでしょ。
>>419 CからJavaにやってきて、あいかわらずCライクなコードを書いてる
ベテランとか、そんな感じになるな。
まあ、そういうのは基本勉強不足だからCでもヘタクソだけど。
おkですよ
一時オブジェクトが作られてそのアドレスが取られる
const参照を調べると少し面白い
定数だから、一時オブジェクトを生成しなくてもいいよ。
やってることは
const char* str="hoge";
と同じだと気付けば何の疑問も無いだろ?
違うだろ
一時オブジェクトもアドレスが取れるのか試してみたかったんだろ
パフォーマンスを図るために
コンストラクタで関数名と時間を記録
デストラクタでまた時間を記録
データを保存
関数の最初にマクロでカウンターオブジェクトを宣言
みたいな感じでやってるんだけど
これだと再帰関数のデータが重複して計算されてしまう
なるべく少ないてまで再帰関数をうまくルート呼び出しだけ調べる方法はある?
再帰関数を呼ぶだけの関数を用意するくらいしかないんじゃね?
>>426 邪道といわれるかもしれないが、
グローバル変数使えばいいんじゃないの
関数名をキーにして
タイマが動いているかのフラグを立てる
>>426 再帰関数外で計測しないと計測クラスの生成廃棄コストで誤差だらけにならないか?
デストラクタでCな関数を呼び出して記録するとか
開始
再起1
再起2
・・・
再起2終わり
再起1終わり
終了
となるから開始時刻と終了時刻が入れ子になってる分をデータから無視すればいい
「何かの左上の座標」を意味する変数名が思いつきません。
教えてくださいTopLeft以外でお願いします
UpperLeft
double 左上X, 左上Y;
これで問題ないと思うが。
Flashの共有オブジェクトを読み書きできる
C++のライブラリはありませんか
OSはWindows環境を想定しています。
(マイクロソフトの他の言語のライブラリでもよいです。)
よろしくお願いします。
Flashの共有オブジェクトはFlash専用なんだからFlashで読め。
C++で読もうとするシステム設計を見直した方がいい
仮想関数を持つクラスをmemcpyするのは問題ですか?
あたりまえだろ。
クラスのコピーは仮想関数なくても問題出る場合がある。
コピー関数か代入演算子を実装して使ったほうがいい。
memcpyが保証できるのはPODのみ
442 :
438:2011/05/08(日) 02:10:33.76
ありがとうございました。
カスタムアロケーターって代入やコピー直後に、その二つのオブジェクトがかならず==で真を返すって暗黙に要求されてますか?
stlやboostのソースを見てみるとどうもa1=a2;直後にa1!=a2が真になる可能性を全く考慮していないみたいなんですが・・・どうなんでしょう?
>>443 C++標準では
コンテナ作成者は全てのアロケータは交換可能かつ等しいと仮定してよい
ただし等しくないインスタンスもサポートすることが推奨される
>>445 知りたいことをズバリ言ってくれました。どうもです
>>443 20.1.5 の Allocator requirements にコピー代入は載ってないね。
でも rebind された型を含めたコピーコンストラクト相当の操作が載ってて、
その事後条件として == (が真になること)が要求されてる。
ようするに
A a1
A a2(a1);
assert(a1 == a2); // 要求通りならアサートは絶対出ない
A a3;
a3 = a1; assert(a1 == a3); // 要求通りでもアサートがでるかも・・・
ってことかな?混乱してきた
>>448 要求に載ってないコピー代入の意味づけは厳密には(常識は別にして)
ユーザー定義なので、結果はなんとも言えないだろうね。
ってことはコンパイル通らない可能性だってあるみたいなんだけど、
ほんとにアロケータのコピー代入なんてしてるライブラリ実装あるの?
バグとして報告しといたほうがいいかもよ。
>>448 assert は「出る」とか「出ない」とか言わない。
「失敗する」「成功する」が正しい。
「assert 失敗が出る」なら許せる。
アロケータをコピーする必要があるケースって
寿命管理権を譲渡する場合だけだよな
allocate_shared以外にはちょっと思いつかん
stlに存在するのか・・・?
VS2010で作成したプログラムを他のPCで実行する時に
ノートン先生に削除されたんですが、
これはどんなことが原因として考えられますか?
実行環境はwinXP
ビルド環境はwin7 VS2010
アプリケーションは Win32アプリケーションで、
OpenGL,ファイル出力(ログファイル),などの類です。
簡単にいうとゲームです。
>>452 諦めるしかないね
俺もNorton先生に引っかかったことがあるよ
そのときは MinGW gcc でコンパイルした文章整形ツールだったけどな
>>453 そうですかーありがとうございます。
あきらめます。
チェストから戻せばいいだけなんじゃないの?
ノートンっていきなり削除すんのか?
>452
当たり前に考えて実際にウィルスに感染してるんじゃないの。
他に感染されていないかPC総チェックした方がいいよ。
もっともウィルスに感染したPC上のアンチウィルスソフトを信用していいか、
っていうのが問題だが、、、。
ソースレベルで、バックドアでも仕込まれてたりするのかな。
>452
「ゲーム」っていうのが引っかかるので、念のためですが、、、。
もしオンラインゲームのチートパッチの類なら、かなり悪質である可能性があります。
おそらく悪さする前に、ノートンに削除されているはずですが、万が一の場合の
ダメージがでかすぎるので用心しましょう。
自分ならWindowsをクリーンインストールしなおさないと、怖くてPC触れないですが。
どう見ても自作ゲームだろ
c++で
aiueo(const char* const filename)
こんな感じで型と引数名の両方にconstが付いてるソースを初めて見たんですが
これは特別な意味があるんでしょうか?
const char * const filename
char const * const filename
この二つは同義
値とポインタの先をconstにするという意味がある
知らなかったです、ありがとうございますm(_ _)m
自分で書く時は
aiueo(const std::string& filenameref)
としてますが自信なくなってきました。
>>461 参照は付け替えができないから事実上const修飾されているも同義。
しかも、定義の場合は意味があるが宣言の場合は意味がない。
つまり、void aiueo(const char * filename);と宣言して、void aiueo(const char * const filename) {}と定義できる。
要は、関数内でfilenameを変更しないと言う戒めとして働くが、利用者には縁のない話。
試しに、
void aiueo(const char * const filename) {
++filename;
* filename = 0;
}
としてconstを付けたり外したりして、どこの行でどんなエラーが出るか較べるといい。
参照が張り替え可能ならもっと良い言語になってた
ラップポインタでいいじゃん
template <class X>class RefLikePtr
{
public:
RefLikePtr(X & men) : japan(&men) { }
operator X& (void)const {return *japan;}
X*operator ->(void)const {return japan;}
private:
X * japan;
};
これでドット演算が再定義できたら見た目もセクシーになるんだけど何故かできない
ハゲは反省するべき
>>465 ドット演算子がオーバーロード出来ない理由はD&Eを読めハゲ
メンバにfooメソッドがあればそれをコール
無ければドット演算の返り値の型からfooメソッドを探す
あるならその型のfooを返り値に対して呼び出す
見つからなければ再帰する
これでいいじゃん
問題が起こるなんて考えられない
その仕様だと
class T;
class U { T operator . ( void ); };
class T { U operator . ( void ); };
コンパイラが永久ループ しますね
operator deleteについてなんですが、
ttp://codepad.org/HhzRgDlu このように継承関係がある場合、operator delete(void* p)
に渡されるポインタは、
仮に基底クラスにキャストした時のアドレスと
派生クラスにキャストした時のアドレスが異なる場合、
どちらのアドレスが渡されますか?
それぞれアドレスを出力してみたのですが、
上記のアドレスが異なる状況がどうも作れなかったので質問です。
471 :
469 :2011/05/11(水) 22:43:59.19
>>470 ありがとうございます!!
ということは継承関係があっても
newで渡したアドレスがちゃんとdeleteで帰ってくるんですね!
まじで感謝です!
473 :
469 :2011/05/11(水) 23:22:28.33
>>472 ありがとうございます。
「基底のデストラクタがちゃんと仮想になっていれば」
ちゃんと帰ってくるということですか?
> 仮に基底クラスにキャストした時のアドレスと
> 派生クラスにキャストした時のアドレスが異なる場合、
> どちらのアドレスが渡されますか?
この話の解決になってるの?
475 :
469 :2011/05/11(水) 23:54:37.84
>>474 473の解釈が正しければ疑問点は晴れます。
>>473 規格を精査するのはめんどくさいので適宜自分でテストコードでも書いて調べて
477 :
469 :2011/05/12(木) 00:21:49.88
newdeleteがきちんと対応してないと背筋が凍る
クラスのメンバ変数に巨大な配列をnew(malloc)をせずに確保したいのですが
segmentation faultが出てしまいます。
class Hoge
{
private:
double array[1000][1000];
};
解決方法はどういったものがありますか?
環境は gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4) です。
ulimitコマンドかなにかでスタックサイズを増やす
481 :
479:2011/05/14(土) 20:06:14.62
スタックに10GBほどの配列を確保したいのですが、
「Stack Overflow」が出てしまいます。どうすればよいでしょうか
Visual c++ 2010でビルド構成をx64にしています。
なんでスタックじゃないとだめなん
484 :
482:2011/05/15(日) 00:05:36.77
えーと、開発をとりまとめている元請けのシステムインテグレーターとやらの指示です。
ワークステーションで物理メモリが110GBほど乗ってます。
人工衛星の画像解析とかします。
その人工衛星が落ちないか、心配になった
486 :
482:2011/05/15(日) 00:14:13.79
画像解析はミッション系なんで撮像要求だすだけ。落ちないようにする
Hause Keeping運用は管制受信系メーカーが別にいるので大丈夫なんです(^^)
>>487 参考情報ありがとうございます。でも今度はこんなエラーが出てしまいました。
>error C2148: total size of array must not exceed 0x7fffffff bytes
ヘルプを見ても解決策が見つからずです・・・
ならデバッグのためにそのワークステーションを寄越せと
これはひどい
>>478 ツール使ってリークが検出されたら背筋を凍らせながらコードをみる
>>482 他にも悩みが出てくるだろうからインシデント使うかコンサル雇うのが楽だと思うけど。
>>488 boost使えんの?
vectorにshared_ptrかunique_ptr突っ込んでnewしながらヒープも使えよ
それかboost::ptr_vectorなら普通のポインタでもいい
どちらもメモリリークしない(ptrが削除されようとするとデストラクタが自動的に
呼び出されてnewした領域もdeleteされる)
495 :
482:2011/05/15(日) 14:46:30.35
みなさんご指摘ありがとうございます(_*_)。
>>489 連続した領域が必要みたいで、ちょっと駄目です。
>>494 boostはたぶん許されると思います。確かにスマポ無しだと危険ですね。
ところでふと思ったのですが、
std::vector<unsigned char> l0_s5_720nm_org(std::size_t(1024) * 1024 * 1024 * 10);
これってスタックに確保されているんじゃないんでしょうか?
エラー無く通過します。一瞬で動作するので本当に動いているか不安ですけど
普通のプログラミングならありえないサイズだなあ…
スタックに多次元配列の画像でも置いてるのだろうか
>>495 vectorはヒープだと思うよ
ふつうスタックには巨大なデータは置かない置けない
>>484 で、なんでスタックじゃないとだめなん?
聞き方を変えると、スタックに対してヒープの何の違いが問題なの?
スタックじゃなくてスタティックに確保とかそんなオチは?
物理メモリの容量を見ると、その可能性も高いな。
スタックアロケータという手もあるだろう
実装簡単だし、速度速いし。先頭覚えておくこと、アラインメントを考慮すること、
くらい分かっていれば簡単だし
でもVS2010で開発してるって事はWindows7 64なんでしょ?
俺もVSはスタックに0x7fffffffという制限があるのを始めて知ったけど
まあ要するに巨大なデータはヒープに置けって事なんだろうな
ふと思ったんだがvectorに多次元配列をpushするにはどうすればいいんだ?
scoped_arrayか?
コピー不能だからsort出来ないし
shared_arrayならいいのか
ptr_vectorを使ってもdeleteしてくれるのは1レベルだけだから、ポインタのポインタ
などを入れると一番先のポインタが指している部分がdeleteされないという問題がある
だから生のポインタのポインタなどをptr_vectorに入れるのは危険だ
shared_ptrならカスタムデリータを指定出来るから、ポインタのポインタをクラスで
包んでカスタムデリータにそのクラスのデストラクタを指定すればいいな
>>502 vector<vector<...> > だろjk
>>503 まあな
その方が列ごとあるいは行もresize()出来るし何かと便利だ
今Eclipse CDTを立ち上げて確かめようとしたらどうもSR2にアップデートする時に
何かバグったらしくてエラー出まくるので入れ直す
MinGWにはこれが一番相性いいしな
>>495 もしかしてこの人
new T[0x7fffffff以上になる"定数"]
ってやってたのかなあ
64ビットクロスコンパイラに配列じゃなくてもC2148が発生する仕様があるんだよね
スタックとヒープで確保解放以外に速度で差がつくのだろうか
>>507 スタックは、スタックポインタを上げ下げするだけ。
ヒープ/malloc() はそれに比べるとコストがかかると思う。
ああ、static ならコスト 0 かな。
じゃあ確保開放以外では差はないのね
確保する領域が大きい場合だけど。
<スタック>
確保時に物理メモリを割り当てる=確保は遅いが、その後の処理はフルスピードで実行可能。最適化も崩れない。
<ヒープ>
確保時は仮想メモリアドレスを予約=確保は一瞬だが、その後の処理が最適化されていても、OSが割り込みを使って物理メモリを
適宜割り当てる為、意味無し。前処理としてページ単位に一回ずつアクセス(0以外を書き込み?)しておくのが吉。
かと思ってた。
>>510 >、OSが割り込みを使って物理メモリを適宜割り当てる為
割り込みなんて使う必要があるか?周辺機器じゃないぞ
スタックもヒープも物理的には違いなく、windowsだったらwinapiで確保するのに違いなし。
あらかじめ確保しておいて使い回すのがスタック。
自動変数などはC言語が確保しているスタック内で動作する。
ヒープは管理外のメモリを毎回OSの命令を呼び出して確保。その分オーバーヘッドあり。
まとめるとこれ。
確保されている領域の使い回し=スタック。
毎回確保しにいく=ヒープ。
>>512 >ヒープは管理外のメモリを毎回OSの命令を呼び出して確保。
毎回じゃないだろ
OSのメモリ要求APIはかなり重いのが慣例で、そのためにいつも余分に確保し、
ヒープ領域はその中かから切り出して使う
malloc()やnewする度にOS呼び出してたら遅くて使い物にならないぞ
>>514 Windowsに関して言えば、APIは必ずしもシステムコールではないので
API呼んだら常にコンテキストスイッチが発生してカーネルモードの
コードが走るとは限らない
いちいちカーネルモードに遷移しないAPIの典型例は
CriticalSectionやInterlocked系のAPI
現に今のMSVCのmalloc()はHeapAlloc()を使うような実装になっていたと思うよ
HeapAlloc()は内部的にVirtualAlloc()呼ぶときだけカーネルに頼ってる
んじゃないのかな、たぶん
Windowsの実装の話になるなら
ヒープ⇒毎回確保しにいく
っつーのも間違いだな
少なくともlinuxの場合、ヒープは本当に確保されてるかどうか使ってみないとわからないんじゃなかったか
>>515 話を逸らすなよ
今メモリ要求の話してるんだろ
>>518 逸らすなといわれても、俺は上でレスをしていた人間じゃないので……
そういう意図は無いとしかいいようがない
sbrkの問題じゃなくてmallocの問題でしょ。
内部で使ってるんだからsbrkの問題、とかいわないでくれるといいんだけど。
ようするに使い回せば速さに差はないってことですか?
使い回せばヒープ
stringでこういうのできる?
int value = 999;
std::string str;
str = "value = " + value;
>>524 std::ostringstream str;
str << "value" << 999;
で str.str() を参照
Cのsprintf()に相当する
文字列はCのが使いやすい
はぁ?
>>525 ありがとう。
なんか不細工だけど自分でStringクラス作るのはやめとくよ。
stringに数字を取るコンストラクタがあったらよかったんだけどね
itoa()は非標準だし
C/C++で書かれたアルゴリズム辞典でオススメ有りますか?
>>529 0x の to_string に御期待下さい。
wwwwwwwwwwwwwwwwwww
534 :
533:2011/05/20(金) 15:25:01.94
誤爆 つられたクマー
COMってなんなんですか?C++のテクニックなんですか?
C言語の入門書1冊やり終わったんで、次はC++も触ってみたいんですけど
おすすめの本ありませんか?
Windows で CRT セキュリティ強化の修正をしているのですが、
旧スタイルも残しておきたいとき、
#if _MSC_VER >=1400
で分けようと思っていますけど、これで大丈夫でしょうか?
ほかにも何か判定しなければいけないでしょうか。
よろしくお願いします。
>>538 判定とは違うけど、_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMESで
済む箇所はできる限りそれで済ませて分岐を減らすくらいかな。
fopenで開いたテキストファイルを1文字ずつ文字として読みたいんですが、
半角全角で1:2バイトのようにサイズが違ってしまい、面倒です。(現在:SJIS)
どういった文字コードを使えば固定長=1文字のような形式になりますか?
例:a:1byte あ:2byte => a:3byte あ:3byte にしたい
UTF-16
面倒の一言で済ませちゃうのか
無知ってすごいな
面倒と言い切るのは、ハッカーの素質がある。
UTF-32をつかっとけば未来永劫まず大丈夫
>>540 無理。固定長の文字コードなんてない。
まずはバイナリと文字との変換ライブラリを作る
ICUでいいだろうに
CJK統合なんかユニコードの無知無意味無駄の極みだよな
どうせ可変長になるんだから
ハングル大暴走するし
ハングルって何に対抗してるのかよくわからんけどすげえ増えてってるんだっけ
中国の漢字も増えてた気がするけど、増やさずにはいられないのかな
549 :
538:2011/05/28(土) 09:47:24.65
>>539 レスありがとうございます。
この定義は知りませんでした。おかげで作業がはかどりました。
はやく英語だけの世界になればいいのに
>>548 考えられる全部の組み合わせを出したんだって
そのうち今使われているハングルは全体の1/3程度
しかしこれから使うようになるかもしれないから全部出しておけば
大丈夫だと思ったんだろう
Batang.ttfのサイズの大きさを見ても分かるようにハングルの文字数は
世界最大
原因はそれだけじゃないがWikipediaを見てもらうと分かるけど大移動
が起きて結局サロゲートペアを使わざるを得なくなったしそんな複雑な
状況ならUTF-32に統一してしまえばいいと思う
ITProの矢沢さんて人のコラム読んでるけどわかりやすくていいな
矢沢久雄なら俺のブラックリストに載ってるよ
マジすか
555 :
デフォルトの名無しさん:2011/05/30(月) 23:37:13.53
Box2Dを使ったちょっとしたゲームを作ってみたいので、
Box2D 2.1.2を落としてサンプルをコンパイルしていじってみたいと思っているのですが、
Testbedのコンパイルの手順を教えてくれませんか。
ちなみにEclipseを使用しています
556 :
デフォルトの名無しさん:2011/05/31(火) 01:21:04.39
ハローワールドを実行するコードをvs2010でコンパイルして実行ファイルの容量を見たところ約500kb でした。
そこで疑問に思ったのですが2DDフロッピーのような現代から見て比較的小容量な記憶媒体が使われていた時代はどの様に小容量化していたのでしょう?
DIET.EXEとかあったよ
あまり使われてなかったけど
機械語直書きで
とりあえずC++じゃなくてCで書いてから測ろうぜ
staticリンクのdebugビルドなだけじゃねーの
環境:VC++ 2010
cout.fill("*");
VC++ 2010にて引数が一致しないと表示されるのですが、原因が全くわかりません。
同様に、
char c = "c";
もエラーです。
文字に対する誤解があるようなら、そこも指摘していただけるとありがたいです。
下は簡単
char c = 'c';
もしくは
char *c = "c";
シングルクォートとダブルクォートで囲んだときに
どう扱われるかの違いだね
シングルクォートの存在を知りませんでした…
独学はこういう所が怖いです
誰にも習っていないから、ということを盾にしてるように取れるけど、それは勉強の仕方が悪いだけだよ。
言語の本を買うのが手っ取り早いよ。C++なら、せめて「プログラミング言語C++」を。
本でもサイトでもそこを説明しないところなんてあんのかね?
むしろ一度読み飛ばすとすごいはまることじゃないのか?怖いっていうの
習得した後から考えるとスゲーあほなことで長時間はまる的な
独学なんてそんなもんじゃね
だからロベールにしとけって言ったのに
解放に失敗するリソースのRAIIに関して
エラーハンドラをセットして、それがNULLならexit(EXIT_FAILURE)してるんだけど
exitで終了するのはC++的には安全なの?
>>569 ローカルオブジェクトのデストラクタは呼ばれないけど、
プログラムが終了するという動作はちゃんと定義されている。
それが安全と言えるかどうかはアプリケーションによるところ。
CとかC++とか関係なく、exit自体が使ってはいけない関数
別にCならいいんでない?
濫用しなければ。
環境はVC++2010、win32APIを使用しています
WriteFileを使って3ケタの整数(値は変動します)をファイルに書き込みたいのですがどのようにすればいいのでしょうか?
またjpgの縦と横の解像度を取得するにはどうすればいいでしょうか?
>>572 呼び出し元がリソース解放しない状態でプログラム終了していいわけないだろ。
>>573 atoi。
EXIFならともかくJPEGに解像度なんて無いだろ
>>573 前者。一旦sprintf()かなにかで文字列にしてから書けばいいのでは?
後者。それをサポートしているライブラリを探すのが手っ取り早いかと。
>>574 解放すべきリソースがないか、atexit()で解放関数が登録済みならexit()してもいいじゃん。
それが乱用しないってことだろ。
>>573 lpBufferに突っ込むだけだろ
jfifということならSOIのunits
>>576 ただの一関数が「解放すべきリソースが無い」かどうかの
判断なんて無理でしょ。
使い捨てプログラムならexitしても構わないけど
>>574,
>>575,
>>578 ありがとうございます。
前者についてはatoiを使用し解決しました。
後者についてはIndependent JPEG Groupなどを使ってみようと思います
じゃあデストラクタでエラーがでたらどうするの?
でてくるのか?
dtorで例外だしちゃらめぇぇ
API使うと普通に失敗するなぁ
デストラクタの中だとこれは困る
デストラクタの中から例外投げないっていうのと
リソース解放でエラーが出ないってのは別の次元の話
デストラクタでエラーが出たら握りつぶすしか無いだけ
BCBを使ってソルバーDLLを開発しようとしています。
データが多く、配列・変数が混在したパラメータがあり、
どうDllに渡すか迷っています。
良い手ありますか?
引数を大量にもつ。構造体を使う。データファイルへ埋め込みパス渡し。
a,b,c,d,e,f[][],g[]とか、いっぱい。
返値もいっぱい。
よく使う手があれば、教えてください。
ども。
BYTE sizebuffer[4] :
buffer[0]=0x00;
buffer[1]=0x00;
buffer[2]=0x00;
buffer[3]=0x14;
20byte読み込みたい
DWORD dwSize = (DWORD)&buffer;
dwSizeが0x14000000になってしまう
0x00000014にはならないのですか?
エンディアン、嘘つかない
バイトオーダーの二つ名を持つ
理解しました!
検索したら変換方法見つけたのでそれ使ったら期待通りになりました
ども
ヒント程度の回答なのによく辿りついたな…
ポインターをDWORDにキャストする時点で糞コード。
仮にDWORD dwSize = *(DWORD *)buffer; の間違いだとしても
x86以外で即バスエラー起こす糞コード。
x86以外全部なのか
64bit?環境だと
>>599 すくなくともビッグエンディアンは全部アウチだろう
奇数番地のワードアクセスとかでバスエラーってのあるよ(知らんぷりするのも)
それ今回と関係ないな
IntelliSense: 識別子 "PCONTEXT" が定義されていません c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winnt.h 6361 5
というエラーが大量に出ますどういう意味ですか?初級者ではなく完全な初心者です。
XInputをC#から使いたくてC++/CLIにDirectXC++のサンプルをコピーしてみてるんですが手がつけられないほどエラーが出るので
試しにC++のプロジェクトにコピーしてるんですが、
#pragma comment(lib,"xinput.lib ")
#include <XInput.h>
#include <windows.h>
を空のプロジェクトに追加して、
#define MAX_CONTROLLERS 4
struct CONTROLER_STATE
{
XINPUT_STATE lastState;
XINPUT_STATE state;
DWORD dwResult;
bool bLockVibration;
XINPUT_VIBRATION vibration;
};
HRESULT UpdateControllerState();
CONTROLER_STATE g_Controllers[MAX_CONTROLLERS];
これを書いたらエラーがでました。他に何をすればいいんですか?
いきなりC++/CLIにDirectXとか欲張りすぎなんだよ
>>605 > #include <XInput.h>
> #include <windows.h>
#include <windows.h>
#include <XInput.h>
なるほど。出来ましたありがとうございました
もう大丈夫ですC++CLIに突撃します
それを初心者とは言わない。
assert、例外よりも高度なデバッグってどうやるんですか?
例外=バグではないけどな
ログ出力とか
クラッシュレポートとか?
あとはboost/static_assertくらいじゃね?高度って意味とは違うけど
612 :
573:2011/06/05(日) 16:29:50.21
http://ideone.com/wuZer 上のプログラムをVC++2010でビルドすると
1>c:\program files\microsoft visual studio 10.0\vc\include\jpeglib.h(954): error C2061: 構文エラー : 識別子 'FILE'
1>c:\program files\microsoft visual studio 10.0\vc\include\jpeglib.h(955): error C2061: 構文エラー : 識別子 'FILE'
main.cpp(30): error C2660: 'jpeg_stdio_src' : 関数に 2 個の引数を指定できません。
とエラーが出るのですがどう対処すればいいのでしょうか?
またmemory.hは必要でしょうか?
>>612 jpeglibをインクルードの最後に移動してみたら?
614 :
612:2011/06/05(日) 16:40:32.04
>>613 #include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#define XMD_H
#undef FAR
extern "C" {
#include <jpeglib.h>
}
こうした場合は下のようにlibjpegの関数がすべてエラーとなります。
1>main.obj : error LNK2019: 未解決の外部シンボル _jpeg_destroy_decompress が関数 _main で参照されました。
単にライブラリをリンクしてないだけじゃ
617 :
612:2011/06/05(日) 19:55:49.94
a.jpgが存在してないからだろ
項目名と値を関連づけてコンテナに格納するとき
項目名を直接に識別子にして
void SetVal(string,int)
int GetVal(string)
とするのと
項目名に列挙子等を利用するのはどちらが望ましいのでしょうか?
string使ってるってことはC++だろ
std::mapとかじゃダメなの?
そんなに車輪の再発明したいの?
pg_fetch_arrayとpg_fetch_objectのどっちがいい?みたいな話かと思ったけどなぁ。
>>620-621 pg_fetch_arrayとpg_fetch_objectというのが具体的にどういう物かはしっかり理解できていませんが
クラスのインターフェイスをどういう風にして
メンバのコンテナを
std::map<int,int>とするのがいいのかstd::map<string,int>としたほうがいいのか?
どちらが一般的でしょうか?といういみで尋ねました。
intで済むならそっちでいいんじゃね
理由は調べてね
ただこれを自分で判断できんのはどうかと思う
パフォーマンスが問題にならないなら、直感的に理解し易くてメンテの手間の増えない方法を採用すべきじゃね?
つーことで、連想配列お勧め。
組み込み型の中で最大のアラインメントをNとして
Nよりも大きなアラインメントを持った型を作る方法ってありますか?
256byte、4096byteなど大きな境界を持った領域がほしいのですが
今は多めにとって余分なところを捨ててるので、もったいないので何とかしたいです
>>625 コンパイラによっては拡張機能として持っているものがある。
動的確保するつもりなら、これも標準じゃないけど環境によっては
memalign() とか使えるかもしれない。
>今は多めにとって余分なところを捨ててるので、もったいないので何とかしたいです
処理系がその機能を提供してくれても、中でやることは同じだと思うなぁ
>>626 どうも。memalignでググッたらそれっぽいページが見つかりました
残念ながら拡張機能か切り捨てしかないみたいでした・・・
移植性とか幻想だから
>>624 この選択で、メンテの手間が少ないのがどっちかを知るのは難しいと思うよ
すみません。Windowsプログラミングでキー入力が正しく取得できず困っております。
メッセージループは以下の様に書いています。
while(GetMessage(&msg , NULL , 0 , 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
〜処理全般(キー入力もプロシージャ上ではなくWPARAMやmessageを取ってここでやっています;)〜
}
しかしこれでは、
マウスカーソルの移動後1回目のキー入力のみ or マウスカーソルの移動中 or デバッグモードで止まった後
しかキー入力が正しく取得されず、1回キー操作をするごとに操作できなくなってしまいます。
どう書き換えれば常にキー入力を取得できるようになるでしょうか?
また、もし目的別のメッセージループの書き方のサンプル/説明サイトが有れば教えて頂けますと幸いです;
毎回GetKeyboardStateしとけ
633 :
631:2011/06/08(水) 19:04:58.92
>>632 少し別のやり方ですが解決できました。そういう関数も有るんですね。
ありがとうございました。
解決したなら、何が問題でどういう対処が必要だったかも書こうな
635 :
631:2011/06/09(木) 01:45:03.88
>>634 えっと、
>>633の時点で、PeekMessageを使ってキーを常に取得できるとわかりそうしていたのですが、
それでは内部に作った子窓にマウスでフォーカスが行かないとわかり、
結局今は元のメッセージループを使い、大人しくプロシージャの中でキー入力を取得しております;
すみません。新たにWindowsプログラミングについて質問なのですが、
CreateWindow関数でWS_CHILDして作ったコンボ・ラジオ・テキスト等の「入力中」に
「特定のキー操作」で「親窓、または次の入力用の子窓にフォーカスを移動(SetFocus)する」というのはどうすれば実現できるでしょうか?
一度子窓にフォーカスが入ってしまうと、もう親窓で設定したキー操作が通用しなくなり困っています;
メッセージフックとか
639 :
636:2011/06/09(木) 13:35:43.52
>>637 そういう物がちゃんと有るのですね。少し勉強が必要そうで結果は先送りですが、ご助言ありがとうございましたっ
640 :
636:2011/06/09(木) 21:40:56.13
>>638 名前だけは聞いていましたが、サブクラス化、かなり強力な機能なんですね。
メッセージフックより楽に開発できる・・のかもしれません。ご助言ありがとうございました。
マクロの定義っていつまで有効なんですか?
#undefするまで
ソースの文字コード
コンパイラの文字コード
コードのコードページ(ロケール?)
実行環境の文字コード
実行環境のコードページ
が一致してないともじばけするってことでいいの?
ソースの文字コードと実行環境のロケール(コードページ)だけじゃね
コンパイラはバイト列としてしか認識してないでしょ
C++0xだとまた話変わるだろうけど
よくない
647 :
^Z:2011/06/11(土) 12:59:03.66
newとdeleteの配列版のオーバーロードって
要求されたサイズのどこまでがオーバーヘッドのサイズがわからないから
アラインメントを合わせることが実質不可能だからやるだけ無駄?
文字数確保するときにパスならMAX_PATHとかあるんですが
URLはpathの最大文字数とかって決まりはあるのですか?
INTERNET_MAX_URL_LENGTH
>>649 MAX_PATHも実際は当てにならないけどね。
>>650 ヘ⌒ヽフ
( ・ω・) dd
/ ~つと)
>>651 MAX_PATHはパス長の最低保証だからな
すみません。Windowsプログラミングで作った入力窓達をサブクラス化しています。
そこでSetWindowLong関数ですり替えるウィンドウプロシージャを全部共有したいのですが、色々試しても上手く行きません;
良い解説サイト、ググるべきキーワードなど有れば教えて頂けませんでしょうか。よろしくお願いします。
657 :
656:2011/06/12(日) 22:31:21.95
すみません、GetWindowLongで解決できるサンプルを発見できました。 自己解決しました、失礼しました;
SetWindowLongPtr
SetWindowSubclass
659 :
656:2011/06/13(月) 00:50:03.59
>>658 そうした新しい機能も存在するんですね。ひとつ勉強になりました。
ご助言ありがとうございます。
例外のスコープについて質問です
char* msgのバッファは呼び出し元関数のcatchスコープまで残るでしょうか
できればスタックを投げたいです
try
{
,,,,char* msg = "Hello World";
,,,,throw msg;
}
catch (char* msg)
{
,,,,// 関数の呼び出し元へthrow
,,,,throw msg;
}
無理
newして飛ばせ
ああ。。。やっぱり new & delete 必要なんですか。
ありがとうございます
>>660 例示されたコードは文字列リテラルのアドレスだから問題はない
スタックにある文字列は無理だが
具体的にはchar s[] = "Hello World"; に変えたら無理だな
例外でnew/deleteなんてしちゃ駄目だろ
誰もdeleteしてくれなかったらどうするんだ
素直にテンポラリオブジェクトを投げなさい
throw string("Hello World");
でいいよ
多分
例外って再送するたびにコピーされんのかな?
catch( exception &e )
とかいう意味じゃなくて?
668 :
660:2011/06/14(火) 01:23:54.14
gotoだから関数で引数渡すのとは違うみたいだよ
だから参照渡しであってもスタックを渡せない
スマートポインタ(テンポラリオブジェクト)は
良いアプローチだと思うけど、一般的には使われていなそう
669 :
デフォルトの名無しさん:2011/06/14(火) 20:52:22.64
4桁の整数を1つずつ要素4の配列に代入したいです
int a = 1234 int ary[4]とあったら
ary[0] = 1, ary[1] = 2, ary[2] = 3, ary[3] = 4となるように
sprintf( buff, "%d", a)
ary[0] = buff[0] - (char)'0'
この2行で出来てはいるのですが
もっとスマートな方法はないですか?
>>669 それ int ary[4]じゃなくて char ary[4] だろ
671 :
デフォルトの名無しさん:2011/06/14(火) 20:57:17.01
いや、intです
char a = '0'
a = 48をa = 0にしたいのです
文字コードがASCIIなのをチェックして48引くだけじゃね?
673 :
デフォルトの名無しさん:2011/06/14(火) 21:02:43.55
やっぱりその方法しかないのでしょうか
ary[0] = buff[0] - 48 みたいなのは抵抗が・・・
EBCDICだったらどうするんだよ
横着せずにatoi()使え
675 :
デフォルトの名無しさん:2011/06/14(火) 21:09:07.95
atoi()ってことは↓な感じでしょうか
int a = 1234;
int ary[4];
char buff[4]
sprintf( &buff[0], "%d", a)
for ( i =0; i<4 i++ ) {
ary[i] = atoi( buff[i] )
}
for(i = 3; i >= 0; i--, a /= 10) ary[i] = a % 10;
>>673 計算して出すとすれば、
for (i = 0, n = 1000; i < 4; i++){
ary[i] = a / n;
a -= ary[i] * n;
n /= 10;
}
めんどくさいね・・
>>676 >>678 1234 % 10 → 4
123.4 % 10 → 3
12.34 % 10 → 2
1.234 % 10 → 1
これは素晴らしい
目からウロコとはこの事です
ありがとうございました
白熱してるとこ悪いがCでは数字の文字コードは連続していることが保障されているから
-'0'でよくね?
>>680 >>674へのツッコミをするためだけのレスならそれでいいけれど、
元の質問から行けば、そもそも文字列にしなくていいんだよ。
# data.txt
# int FuncID, string FuncName
1, Hoge::Foo
2, Hoge::Bar
3, Fuga::Foo
4, Fuga::Baz
このような形式のファイルを読み込んで、配列に整数から関数へのマッピングを作りたいんですが(関数の型はすべて同じです)、可能でしょうか?
えぴすてーめーは天才なんですか?
可能ではあるが…
.NETみたいにリフレクションが言語機能に組み込まれてないから
クラスに自前で用意する必要があるっていいたいの?ねぇ!?
windowsならdll指定でLoadLibraryする形にできればいいんじゃね
Linuxとかでも出来そうだけど知識ないから教えて偉い人
>>682 関数ポインタとかboost::function使えば簡単では
単に名前からクラスと関数を検索できるように作っておいて
関数ポインタでも使えばいいんじゃね?
初めて仮想関数(WindowsのCOMです)なるものを使う場面が出てきて悩んでます
class Base{
public:
virtual void Paint() = 0 ;
};
class Derived : public Base{
public:
int n ;
void Paint(){
cout << "Call Derived Paint\n";
}
};
int _tmain(){
Base* c = new Derived() ;
c->Paint() ;
return 0 ;
}
この形でDerivedだけが持つ変数nなどをmainから書き換える事は出来るのでしょうか?
実際はDerivedにHWND等を渡したいのですがstaticなりでグローバルに宣言しておかないとダメですか?
キャストすれば?
コンストラクタを変更してnewするときに渡せばいいんじゃない?
Derivedだけが持つ変数を書き換えたい時点で、
Base*として受け取ることがおかしいのでは。
695 :
694 :2011/06/16(木) 13:39:04.52
STL::vectorって例えば以下の場合で
deleteしてくれるスマートポインタになってる?
struct Orz { char* name };
Orz p = new Orz;
vector<Orz*> buffer;
buffer += p;
>>697 std::vector<boost::shared_ptr<Orz>> hoge;
ならスマポになる
auto_ptrなんて入れるなよ!絶対だぞ!
そんなあなたにboost::ptr_vector
701 :
697:2011/06/16(木) 21:43:25.95
ならないのか。
スマポのコンテナ(内部で T* ptrBuffer[?]をもってるようなやつ)
がありそうでないのですな。
>>701 こういうこと?
boost::shared_array<int> Array(new int[10]);
どういう事なの…
カスタムデリータを指定してデストラクタに入れときゃいいやん
クラス内部でnewするようにする
>>704 そんな面倒な事をする位ならvector<vector<T> >にして
後からresize()するわ
706 :
697:2011/06/17(金) 00:43:38.94
演算子オーバーライドしてないけどこんな感じで
typedef vector< auto_ptr<int> > VECTOR_PINT
VECTOR_PINT varray;
varray += new int(7);
varray += new int(5656);
varray += new int(999);
>>706 それはCOAP(Container of auto_ptr)だ
コンパイルが通らないコンパイラもある
708 :
697:2011/06/17(金) 02:21:13.01
>>702 が近いと思いますが
ウィークポインタのコンテナがほしくなってきました
shared_ptrでいいじゃん
typedef shared_ptr<int> int_ptr;
typedef vector<int_ptr> int_ptr_vector;
using namespace boost::assign;
int_ptr_vector v;
v += int_ptr(new int(7));
v += int_ptr(new int(5656));
v += int_ptr(new int(999));
弱参照で格納なのに自動でdeleteして欲しいって訳がわからないような
コスト考えてptr_vecter
初歩的な質問ですみません。
「不適切な Ptr」の状態のポインタ変数を、ifで検出したいのですが、==NULLや ==0では検出できず困っています。
構造的にそうならないよう作るしか手は無いのでしょうか? それとも検出方法は有るのでしょうか?
>>712 初期化してないことが問題。
hoge* p = 0;
明示的に初期化すれば0で判定ができる
あとは使い終わったなら0を入れておく
delete p;
p = 0;
あとは普通に
if(p)
{
}
とか
boost::optional
とか書いて混乱させてみる
715 :
712:2011/06/17(金) 11:05:24.38
>>713 なるほど。そうすれば検出できるのですね。 ありがとうございます。
>>714 その様な機能が有るのですね。まだ詳しく理解できず私には早いみたいですが勉強になります。
ありがとうございました。
そのコードは完全に誤解を招くな
実装見てこい
>>716 717 じゃないけど、それだと T が常に初期化されてることになりそう。
optionalは簡単に見えて実は結構難しいよね
圧縮されたDLLをロードするには一回どこかに展開しないと無理?
メモリからロードとかできないのかな
最初からUPX使っとけばいいのでは?
すみません。
CreateControlWindowで作ったリストボックス(単一項目選択型)の選択項目の値
(SendMessageで作った項目の第三引数のWPARAMに設定した値)
を取得したいのですが、やり方が解らず困っております。
色々検索してみてもC++で書いている情報を見つけられず、
CB_SETCURSELやBM_SETCHECKで試してみるも何も成果が得られず困っております;
何かヒントだけでも頂けますと幸いです;
724 :
723:2011/06/18(土) 20:19:28.77
度々すみません; LB_GETCURSELで選択を取れるとわかりました、
値の方も自己解決できると思います。 失礼しました;
謝りまくってるけど
何か悪い事でもしたの?
726 :
デフォルトの名無しさん:2011/06/19(日) 08:47:48.42
NTLで拡大体GF(2^4)上の多項式を作ろうとしています。
しかし、5次の多項式の係数を、SetCoeff(a,5,4)とやっても[[1][1][][1]]
という出力になって正しくできません。
使い方のサンプルがないので困っています。どなたかNTLライブラリの使い方に
詳しい方がいらっしゃいましたら教えてください。よろしくお願いします。
http://ideone.com/wph99
releaseビルドして作成したexeファイルが動かない場合、PCの何が影響していると考えられますか。
いろいろあると思いますが、例を教えてください。
プログラムはVS2005 VC++, MFCを用いて作成しました。
windowsXP SP3とDirectX9.0cの2つはビルドPCと実行PCで共通しています。
runtime
>>728 ありがとうございます。
自分なりに調べてみたのですが、
Dependency Walkerという無料ソフトでexeファイルをみてみたところ、
GPSVC.DLL
IESHIMS.DLL
の2つにError opening fileと表示されました。
こういった場合、どのように対処したらよいのでしょうか。
730 :
729:2011/06/20(月) 23:20:03.09
追記で申し訳ありませんが、実行PCの方は
他のexeファイルをなるべく実行したくありません。
vcredist_x86.exeなど?
732 :
デフォルトの名無しさん:2011/06/21(火) 02:24:07.91
お願いします。
Javaはある程度できるようになってます。
Cもネットでですが一通り目を通しました。
こういうものか、ってイメージはわいてます。
C++にいくのに独習C++を考えてます。
ただ、Visual C++っていうのが気になってます。
これって、いったい何なんですか?
独習C++はやめとけ。Cを完全に理解してナイトいかん。
それより、同じ著者の標準講座c++の方がいい。
あと、VC++ってのは、C++言語でWindowsのアプリケーションを組むんだよ。
今君が使ってるInternetExplorerとかEXCELとか。
VC++はMicrosoftのC++コンパイラの製品名
Cの既習者向け
いきなりC++やる人向け
すでにC++できる人向け
VC++の本
736 :
デフォルトの名無しさん:2011/06/21(火) 11:18:55.58
>>732です。
ご丁寧にありがとうございます。
「独習」シリーズを3冊(Java、Javaサーバサイド、
JavaScript)もっているので、C++も「独習」で
いいかと安易に考えていました。
737 :
デフォルトの名無しさん:2011/06/21(火) 11:21:25.55
>>732です。
で、もうひとつだけ教えてください。
VC入門っていう本もたくさんあるんですけど、
C++を何も知らず、いきなりVC入門の書籍って
いうのはどんなものなんでしょうか?
C++についての基礎なんかは習得済みの
人を対象としているものなんでしょうか?
それとも特定のIDEやコンパイラに特化
していることを強調しているだけで、
C++入門としても使えるものなんでしょうか?
VisualC++って書いてあるのはVCコンパイラじゃなく、
統合開発環境VisualC++の使い方、みたいな内容だろたぶん
素直にやさしいC++でも読みな あるいはロベールとか
>>737 少し前にこのスレだか関連スレだかで話題になったけど
VC++を謳う書籍・サイトはC++/CLIと言うC++とは似て非なる言語を
C++と称している
>>740 マジでC++/CLIなんて変態言語載せてるの?
あれは熟練者が仕方なく苦渋の選択をして選ぶものだろうに
何もかも中途半端だった
MSももう捨ててるよねあれ
俺に聞けスレで聞いたら、守備範囲外って言われたので、こっちで質問
RHEL5.6で、SIGCHLDにSIG_IGN付けてsystemをコールすると必ず関数が-1で失敗するんだが、
何が公式の情報ってないのかな?
業務用ディストリなんだからサポートに連絡しろ
なんのために契約料払ってるんだ?
>>732 VC++の入門者向けの本なら、Javaを知ってる人なら、全然OKだよ。
Yahooオクとかで今もたくさん売ってるから「Visual C++」とかで
検索かけて買うのもいいよ。
基本的にC++の文法書はこちこちの文法書が多いから、VC++とかで
実際にプログラム組みながら文法を調べる方が実感がわかるよ。文法はネットでググッてもいいし。
俺は、独学ニートだけど、実際にプログラムを作る本で文法を学んだ方が楽しいし、よくわかった。
ああ、MFCは無料版じゃつかえないか・・
>>732さん。MFC(C++/CLIというものでないもの)を使う場合は
有料版じゃないとだめなので、Yahooオクで本を買っても駄目でした。
というか、ふるいVC++の本はMFCというのがほとんどなので。
748 :
デフォルトの名無しさん:2011/06/21(火) 23:35:46.96
64ビットのUbuntu 10.4で、以下のコードを実行すると???と表示されてしまいます。
catコマンドだと「あああ」も正しく表示されているので端末は正しく設定されていると
思ってるのですが、、
#include <locale>
#include <string>
#include <iostream>
int main(int ac, char **av) {
std::wcout.imbue(std::locale("ja_JP.utf8"));
std::wstring wstr = L"あああ";
std::wcout << wstr << std::endl;
return 0;
}
$ g++ utf.cpp -Wall
$ ./a.out
???
$
「あああ」と表示させるにはどうすればいいでしょうか?
よろしくお願いします。
749 :
729:2011/06/22(水) 00:05:15.43
>>731 ありがとうございます。
セットアッププロジェクトを作ってみようと思います。
URLのリンク先が英語のサイトなのですが、
もし日本語のサイトで参考になるサイトがあれば教えて頂きたいです。
751 :
デフォルトの名無しさん:2011/06/22(水) 00:26:43.01
$ locale -a
C
en_AG
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_NG
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZW.utf8
ja_JP.utf8
ko_KR.utf8
POSIX
$
753 :
デフォルトの名無しさん:2011/06/22(水) 02:40:54.95
>>752 ありがとうございます。
std::ios_base::sync_with_stdio(false);
を追加したら動きました!
$ g++ utf.cpp -Wall
$ ./a.out
あああ
$
>>749 リンク先は件のdllで問題が発生してることについてなので、それを翻訳しても実りはあまり無いかも。
んで、セットアッププロジェクトに関する日本語サイトはその辺にあると思うよ。もちろんMSDNでもいいし。
とりあえずは必須コンポーネントを含めちゃえばそれですむんじゃないかな。
鼻くそ☆がうまい
756 :
デフォルトの名無しさん:2011/06/23(木) 19:37:22.67
林春比古さんのC++の本はやりやすいですか?
厚みもあるし、殺れるかもね。
758 :
デフォルトの名無しさん:2011/06/23(木) 23:45:56.42
林(笑)
柴田(笑)
main()でやってることをまるごと、
別のテスト用関数に移してやってみなされ。
main() {
test();
cout << "一時停止 その2" << endl;
}
メッセージが表示されていないだけでデストラクタは実行されてる
すみません。Windowsプログラミングで
メッセージプロシージャのswitch〜case文の外で
「グローバル変数をifで確認し、一度きりの処理を行い、そのグローバル変数の値は別の値に変える」 というコードを書いているのですが、
次にメッセージプロシージャに戻ってくると値が元に戻ってしまっており、1度どころか100回以上処理している
という事が起きてしまっていて困惑しています。
入力系の子窓をサブクラス化している事が問題なのだろうか とも思うのですが・・色々試したり調べてもよくわからず。
何か思い当たる事、確認すべき事が有ったら教えて下さると幸いです。
・グローバル変数のつもりだったけど実はローカル変数だった
・別の値に変えたつもりだったけど実は同じ値だった
・if文で確認しているつもりだったけど実は条件式が間違っていた
・値が元に戻って100回以上処理しているように見えたけど実は値は元に戻っていなくて1回しか処理していなかった
・メッセージプロシージャの先頭で変数を初期化していたので毎回元に戻っていた
・全然関係ない別のところでそのグローバル変数を元の値に戻していた
・バッファオーバーラン的なメモリの不正アクセス
デバッガに変数の値が変化したらブレークするって機能あるよ
まともなデバッガなら
マルチスレッドだったとか。
if(g == 1) のところを if(g = 1)とかじゃね?
グローバル変数ならデバッガで追って、いつの時点で戻るのか
確認しろ
>>765-767 ご助言ありがとうございます。
>>763 ありがとうございます。全て自分なりに確認してみても理由がわからず、
原因の絞込みにCreateWindowを全部カットしたら正常に動く事がわかり、
CreateWindow前に変数をセットさせたら1度しか動かない事になりました。
・・・何かCreateWindowまわりでやってはいけない事でもやってる余寒がして怖いですが・・
今回の件は解決できました。テンパっていたので問題の絞込みができて助かりました。ありがとうございます。
769 :
762:2011/06/25(土) 19:21:20.99
(↑名前のNo入れ忘れてました。)
>>764 >デバッガに変数の値が変化したらブレークするって機能あるよ
>まともなデバッガなら
そうなのですか!? Visual C++ 2008 ExpressEditionにも有るでしょうか;
そんな機能が有れば良いなと思いつつも見つけきれず、
いつも一々ステップイン ステップオーバーしながら何十分と変数の変化タイミングを探して画面睨んでました;
ググるワードだけで構いませんので教えて頂けますと幸いです;
データブレークポイント
メモリ壊してそうだな
ちゃんと管理出来てるか?
772 :
762:2011/06/26(日) 10:40:24.01
>>770 早速解説を見てやり方が解りました。今後のデバッグが幾分楽になりそうです。ありがとうございます
>>771 無効なデータ(未使用等)を示すのに-1をいつも使っているんですが・・どこかの配列で-1のまま使ってしまってるんじゃないか という恐怖があります;
現状変数が狂う事態は起きていないですが、
もっと安全なやり方を身に着けないと、大きなプログラムはとても組めなさそうですね;
773 :
729:2011/06/26(日) 23:56:10.46
自作ソフトが他のPCで動かないため、セットアッププロジェクトを
作ったらどうかとアドバイスを頂いた者です。
http://www.geocities.jp/i_love_balard/myhome/dnet/makesetup.html 上記のサイトを参考にセットアッププロジェクトを作ってみたのですが、
>後は、右の「ソリューションエクスプローラ」の下のアイコンを
>クリック選択することで、今までのインストーラと同じように
>レジストリや、セットアップフォルダ等を選択設定した後、
>ビルドすればMSIファイルができる。
の部分がいまいち何をすればよいかわかりません。
また出来上がったmsiファイルでソフトをインストールしてみたのですが、
インストール先のフォルダにはexeファイルが保存されただけでした。
このexeファイルはコピー貼り付けでexeファイルを入れるのと何か違うのでしょうか?
それとも何か手順が足りないのでしょうか?
最早言語の質問じゃなくて、ソフトウェアの使い方の質問だな。
もう夏か
ある文字列を用意して、それに書式付きで文字列を追加したいです。
何回も追加を行うためできるだけ早い方法が良いと考えています。
候補として考えているのが、sprintf関数とostringstreamクラスですが、どちらが良いでしょうか?
ネットで調べるとsprintfのほうが早いとありましたが、自分で簡単にテストした結果ostringstreamのほうが早くなりました。
コードの書き方がおかしいのでしょうか?
詳しい方がいらっしゃったらご教授お願いします。
↓にテストコードを載せます。
#include <sstream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
using namespace std;
int main(){
const int LOOP = 100000;
clock_t start,end;
ostringstream str;
char *chr = (char*)malloc(LOOP*3+100);
char buf[255];
start = clock();
for(int i=0;i<LOOP;i++)
str<<"a"<<"a"<<"a";
end = clock();
printf("%d\n", end-start);
start = clock();
for(int i=0;i<LOOP;i++){
sprintf(buf, "%s%s%s", "a", "a", "a");
strcat(chr, buf);
}
end = clock();
printf("%d\n", end-start);
}
sprintf(chr, "%s%s%s", "a", "a", "a");
chr += 3;
こいう感じになるとおもう
Cで書いているのかC++なのか…
sprintf(buf, "%s%s%s", "a", "a", "a");
sprintf(chr, "%s", buf);
chr += 3;
元に近づけるとこうか
strcat は死ぬほど遅いという特徴がある
>>778 そちらで試してみたらostringstreamよりかなり早くなりました。
ありがとうございます。
>>779 習いたてのC++です。
>>780 そのようですね。
できるだけ関数を使わないように意識していたつもりでしたが・・・。
strcatを使わない発想が出てこなかったですorz
sprintf関数は結局下のようなコードになりました。
int num;
char *tmp = chr;
for(int i=0;i<LOOP;i++){
num = sprintf(tmp, "%s%s%s", "a", "a", "a");
tmp+=num;
}
それで結果が、LOOP=1000000で
ostringstream : 779
sprintf : 305
です。
1レスに収まるなら別にいいだろ
見に行くの面倒だったりするしな
でもスレに貼ったら貼ったでインデント崩れて見にくいし
まあ好きにしたらいいんでないかと思う
strcat()の名誉のために弁護しておくと、終端を検出するのがstrcat()のメリット。
つまり、ループに入れてしまうと毎回終端を検出することになるから遅くて当然。
strcat()は一発勝負のときにこそ使うべし。
# って、やっぱ使えねぇw
mallocをしたもの初期化せずにstrcatしてるからすごく無駄な'\0'探しをさせてる。というかアウトだ
だからchar *chr = (char*)calloc(LOOP*3+100, 1);にすると大分早くなる
といってもすでに出されてるsscanfを使った方法とは比較にならんぐらい遅いけどね
でもstrcatの後にchr += 3;入れてやれば殆ど変わらくなるからstrcatが殊更遅いというわけでもなく
やっぱり終端の検索をループごとにしてたのが問題だね
長文になっちゃったけど既出情報ばっかだな・・・・・・
オブジェクトに一時的にメンバ変数を追加したい、という要求を満たすにはどうする?
グラフ構造で要素をもつノードと持たないノードがあって勿体無いから外部からくっつけたりとったりしたいとか
あるクラスをスクリプトに公開する事になったが仮想マシンはvoid*でしか認識出来ないので型情報を追加したいとか
struct Foo { 〜 };
Foo foo;
attach_attribute<int>(foo, "x");
int *p = get_attribute<int>(foo, "x");
if(p) *p = 100;
cout << *get_attribute<int>(foo, "x") << endl; // 100
detach_attribute<int>(foo, "x");
意図が分からん
MATLABの動的プロパティみたいな感じで
dynamic_property_map
すいませんがVisualStudioでプロジェクトの構成プロパティのリンカで
既存のlibをリンクさせる設定ってどうやるんでしたっけ。
どなたかすいませんが教えてください。
スレチ
>>792 例えばVS2010なら
ソリューションエクスプローラで
プロジェクトを右クリックプロパティ、
構成プロパティ->リンカー->全般->追加のライブラリディレクトリ-> libのパス -@
構成プロパティ->リンカー->入力->追加の依存ファイル->〜.lib -A
@はプロジェクトのあるフォルダに.libファイルがあれば省略可
Aはソースコードに
#pragma comment(lib,"〜.lib")
でもおk
すみません。WindowsXPでtxtを読取り加工し出力すると 0D0D0A というコード(改行コード?)が出力されます。(特にBYTEやchar配列の後に。)
文字列中に 0D0D0A が有るかを、strstrで確かめたいのですが、"\r\n"では検出されてくれず、"\r"では検出されます。
0D0D0A を見つけるにはどんな文字で確かめるのが正しいのでしょうか?
テキストモードなら\n
バイナリモードなら\r\n
VC#の入力補完とかリファクタリングはすごいな
C++でもやってくれればいいのに
798 :
795:2011/07/06(水) 23:08:01.87
>>796 モードによるんですね。私のやり方に何かミスが有ったのでしょうか・・"\r"だけしかヒットしないのは。
何にしても問題の絞込みが出来ました。ありがとうございます。
799 :
792:2011/07/07(木) 09:05:19.79
>>797 Microsoftいわく
(統合環境の)新技術は、C#とVBにまず導入され、続いて、
可能ならばC++で、となるため、必ずC++が一歩遅くなります。
だそうだ。
そもそもあんな糞エディタ使わないし。
C++勉強中です。
Visual C++の以下の結果が納得いかないのですが、一行目の結果は正しいのでしょうか?
typedef void tf();
void f1( tf );
void f2( tf* );
void f3( tf** );
std::printf("%s\n", typeid(f1).name());
std::printf("%s\n", typeid(f2).name());
std::printf("%s\n", typeid(f3).name());
<結果>
void __cdecl(void (__cdecl*)(void))
void __cdecl(void (__cdecl*)(void))
void __cdecl(void (__cdecl** __ptr64)(void))
どういう型になると思ったんだ?
どう納得がいかないかも添えてくれないと
どうみてもそれで正しいだろカスとしか言えん
「tfはvoid(void)なのにf1引数がvoid(*)(void)になるのが納得いかない」
という話だろう。f1のコンパイルエラーを期待したんだろう。
そんなことわかってるのに、わからないとごねる
>>804がチンカス
↑カス
落ち着こうや
>>773 アプリケーションの追加と削除に現れるあたりが違う
依存関係にあるDLLをインストーラに組み込めば?
もしくは、よく見てないけどそのDLLが含まれている再頒布可能パッケージを組み込む
>>803 正しい。
void f(int a[100]); が void f(int *a); と解釈されるのと同様に、
void f(void g()); は void f(void (*g)()); と解釈される。
この狂った仕様はCにもC++にもある。
C言語を勉強しているのですが出力が白黒ばっかで面白くありません
もっとなんかこう派手で面白いことをやるにはどうすればいいですか
C#でGUIやればいいよ
>>811 Qt Creator入れてC++をやるんだ
>>811 >>812の言うとおり、Cでアプリケーションプログラムを作ろうというのが
間違い。別の言語を選ぶんだな。
すみません。Windowsプログラミングで、
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_RIGHT, を指定して作ったエディットボックスの入力文字を全選択状態したくて
キー押下時に以下のコードを実行させているのですが、
HWND temphWnd = GetFocus();
SetFocus(temphWnd);
int nowhWnd_ID = GetWindowLong(temphWnd, GWL_ID);
SendMessage(GetDlgItem(temphWnd, nowhWnd_ID), EM_SETSEL, (WPARAM)0, (LPARAM)-1);
フォーカスはそのままで、文字が選択状態にはなってくれません。
何かお気づきの点や確認すべき点が思い当たるならば、教えて頂けますと幸いです。よろしくお願いします;
>>811 サウンドプログラミングは?
まずはMMLのプレーヤーとかを作ってみると面白いかも
>>816 そんな遠回りせずに
普通にEditボックスのウィンドウハンドルに対してEM_SETSELおくれよ
>>811 openglで絵を描けばおもろいよ
2Dなら結構簡単だしウィンドウならGLUTがあるし
820 :
816:2011/07/11(月) 23:25:43.80
>>818 すみませんでした; 仰られるように直接やったら動作しました、失礼しました;
すみません。Windowsプログラミングで、
SetFocusで子窓を移動させているんですが、ビープ音(警告ダイアログと同じ音)がしてしまいます。
サブクラスのメッセージプロシージャ内でSetFocusするのがマズいのでしょうか?
int main(void)
{
main();
return 0;
}
これ実行すると途中で勝手に終了するんだけどなんでなん
なるほど
途中でもうやってられんわ!なって投げ出したのな
ありがとさん
>>822 CならいいがC++ならそもそも文法エラーだしな
そうなん
ideoneでやったら普通にコンパイル通ったけど
| The function main shall not be used (3.2) within a program.
C++では明確に禁止されてるな。
C++はなぜ禁止にしたの?
そうすると何のエラーも出さないコンパイラの方がおかしいんかな
>>822 これなら落ちないんじゃないか?
int main(void)
{
return main();
}
バカなんだろ
>>831 つ 末尾再帰 gcc4 では末尾再帰を検出してくれるらしい。
>>832 お互い様ですねえ。
ループに変換されるから落ちないとか
激しくどうでもいいな
元からどうでもいい話題だから仕方ない
プログラムの中から main() を呼ぶという
意味がわかりません。
fork()的な事を考えたのかな。
すみません。エースターという経路探査を勉強したいのですが、
見つける解説サイトが、いきなり難しい数式サイトなどで行き詰っております;
比較的説明のやさしい入門サイト をどなたかご存知ではないでしょうか?
(できればC++のサンプルコードが有ると、いじりながら構造を学習できてよいのですが;)
よろしくお願いします;
838 :
837:2011/07/24(日) 16:48:42.30
何とか自力で理解できる解説サイトを見つけられ解決できました、失礼致しました;
839 :
デフォルトの名無しさん:2011/07/27(水) 03:57:01.66
Linuxで大規模計算をするコマンドラインプログラムを作っています。
計算終了時に、twitterに終了した旨のメッセージを書き込みたいのですが、どのような方法がよいでしょうか?
>>839 sendmail で自分の携帯電話にメールを送って自分で twitter に書き込む
>>839 movatwiかなにか、メール送信で投稿してくれるサービスを使う。
842 :
デフォルトの名無しさん:2011/07/28(木) 12:50:59.54
本の虫がC++のlocaleはクズっだって言ってた。
is〜がクソってのと遅いってのは解るけど他にクソな所ある?
あとstd::messageのメッセージカタログの仕様ってどこにあるの?
843 :
デフォルトの名無しさん:2011/07/28(木) 21:09:17.59
>>814 Qt馬鹿にするなよ。俺がいまんとこプログラム歴12年の中で初心者に一番とっつきやすいし
ためになるフレームワークだぞ。
本がほとんどないからいけないけど、ドキュメントはかなりいい。ドキュメントのサンプルたくさんやると
馬鹿にしてんのか?
すみません。VC++ 2008 EEでDebugビルドだと問題なくプログラムが起動するのですが、
Releaseビルドにするとワイド文字を要求され、それに合わせると今度はDebugビルドで文字の型が違うと言われます。
どこの設定を変えればこの問題を解決できるのでしょうか?
また、全てワイド文字に合わせて組むべきだと思われますか・・?
プロジェクトのプロパティ -> 全般 -> 文字セット
848 :
846:2011/07/29(金) 10:38:08.88
>>847 解決できました、ありがとうございます。
849 :
デフォルトの名無しさん:2011/07/29(金) 14:01:48.48
void createWindow(bool checked=false);
と
void createWebWindow();
で、宣言している二つの関数があります。
他の関数から
createWindow();
と書いて呼び出すと、コンパイルエラーになります。理由は2つの関数のどちらを呼び出せばいいか
わからなくなるからみたいです。
どうやって、呼び出し・定義したら、このエラーはなくせますか?
850 :
849]:2011/07/29(金) 14:02:41.80
まちがえた・・
createWebWindow(); と書いて呼び出すと
です。Webが抜けていました。
void createWindow(bool checked=false);
は
void createWebWindow(bool checked=false);
?
852 :
849:2011/07/29(金) 14:10:36.90
void createWebWindow(bool checked=false);
void createWebWindow();
と2つ宣言し(オーバーロード)
createWebWindow();として呼び出すと、
どちらとも意味がとれるみたいです。
すみません。記述ミスばかりで。
=falseを消す
854 :
849:2011/07/29(金) 14:18:03.53
>>853 なるほど。やはり、それしか手はないですか。
そうすると確かにコンパイルエラーはとれるんですが、
デフォルト引数がつかえなくなってしまいます。
まあ、やはりしょうがなさそうです。
どうもありがとうございました。助かりました。
むしろなんでそんなことする必要があるのかわからん
>>854 ではおまいさんは、他人がcreateWebWindow()と書いたときにどっちの積もりなのか分かるのかい?
すみません。
数値を扱う一次元の配列の検索で、STLのmapを使うのは無駄なのでしょうか?
普通にfor〜ifで総ざらいにして見つけたらbreakした方が良いでしょうか?
無駄じゃないですよ
>>857 値と一対一に対応するキーがなくて、配列でループで調べてるんなら
それをmapにしても意味ないね。
860 :
857:2011/07/29(金) 18:02:36.43
>>858 無駄ではないのですね。ありがとうございます。
>>859 発見した位置(要素No)が値がわりなのですが・・もっと良い方法も有ったりしそうな気がしなくもないですね・・
ご助言ありがとうございました。
>>859 仮に「値=キー」でも検索速度は向上するわけだから意味はあるでしょ。
>>861 そう言われたらそうだね。
キーのほうに値を入れておけばいいか。
863 :
842:2011/07/30(土) 00:13:00.80
C++のlocale関連は誰も答えられんか・・・。
なんでstd::setを誰も薦めないんだろう
要素Noが必要だからじゃね
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
map<char, double> freq;
vector<double> vec;
freq['m'] = 0.124167;
freq['o'] = 0.0820011;
freq['e'] = 0.0969225;
vec.push_back(0.0021);
vec.push_back(0.0031);
vec.push_back(0.0041);
{
お願い:freq のsecond にvec の値を代入する方法を教えて下さい
}
return 0;
}
for やwhile文を用いないtemplate やファンクタによる、かっこいい実装を希望します。
867 :
866:2011/07/30(土) 20:27:18.34
>>866 #include <boost/range/adaptor/map.hpp>
std::copy(vec.begin(), vec.end(), boost::adaptors::values(freq).begin());
869 :
デフォルトの名無しさん:2011/07/30(土) 22:42:07.43
クラスの継承でサブクラス側で関数をオーバーライドする際、
void SubClass::hogehoge : スーパークラスの関数
と書く場合もありますし、
:スーパークラスの関数を書かない場合もあります。
どういう使い分けするのですか?
void SubClass::hogehoge : スーパークラスの関数
こんな書き方初めて見たんだけど
なんていう言語なの?
871 :
870:2011/07/30(土) 22:55:05.42
え?QtのQt入門っていう本に載ってますから、C++じゃないんですか?
その本のままかくと、
FindDialog::FindDialog(QWidget *parent) : QDialog(parent)
{
// 関数本体
}
とあります。FindDialogが子クラスでQDialogが親クラスです。上の関数は
FindDialog(子クラス)のコンストラクタです。
>>871 それはコンストラクタの初期化子リスト
関数をオーバーライドしてるわけじゃない
>>871は継承したQDialogのコンストラクタを呼んでる
>>871 親クラスの引数ありのコンストラクタを
明示的に、子が呼んでる。それだけ
void SubClass::hogehoge : スーパークラスの関数
てか↑これは激しく違うじゃないかwww
俺が知らない、親クラスに応じてオーバーライドした実装を変えられる素敵機能が
隠されてたのかとちょっと期待しちまったじゃねぇか。
875 :
870:2011/07/31(日) 10:36:09.59
みんな、ありがとうですお(´;ω;`)
アノ後、猛烈に眠くなって眠くなってしまいましたですお
明示的にその引数のコンストラクタを呼んでいると聞いてよ〜くわかりましたお
たくさん、回答くれてありが党ですお。
助かりましたお(´ω`)
876 :
デフォルトの名無しさん:2011/07/31(日) 22:01:32.80
#include <map>
using namespace std;
class hoge{
public:
hoge(void);
virtual ~hoge(void);
private:
static map<HWND, hoge*> mapThis;
HWND hSelf;
};
//静的メンバ初期化
map<HWND, hoge*> hoge::mapThis;
//コンストラクタ
hoge::hoge(void){
this->hSelf = 0;
}
//デストラクタ
hoge::~hoge(void){
(this->mapThis).erace(this->hSelf);
}
877 :
876:2011/07/31(日) 22:02:22.59
静的メンバに map コンテナがあります。
デストラクタ内で map コンテナ要素を erace すると、
"読み込み中にアクセス違反が発生しました。"
とエラーが出ます。
別のメンバ関数内ではできますが、
コンストラクタとデストラクタ内ではエラーが生じます。
環境は WinXP_sp3、Vc++2005 です。
どなたか教えていただけないでしょうか?
Google 先生にも見捨てられました。
再現しないソースを手入力とな
問題はあんたの書いてないところにある
880 :
876:2011/07/31(日) 22:29:34.85
そうみたいですね、失礼しました。
しかし、あんまり長大なソースをここに書く訳にもいかないし、
どの部分を抽出すれば良いのかも不明だし、
もう少し自力で頑張ってみる事にします。
ありがとうございました。
コンストラクタとデストラクタに(void)がついていたり
static なのに this でアクセスしたり
何だか不安な気分にさせるソースだな…
882 :
876:2011/07/31(日) 22:55:32.32
すみません、初心者なもんで。
this->mapThis
はマズかったですか?
一般的にはどうアクセスするのでしょう?
複数作るオブジェクトの、どれのthisポインタからもアクセスできるはずと
思っていたのですが。
>>882 static メンバへのアクセスに this ポインタは要らないんだよ。
>>882 C++なら(void)は()と書けるし
thisもPythonなどと違い省略可能だから(メンバより内側のスコープで名前が被らなければね)
わざわざ書く人が少ないってだけで
好きに書けばいいよ
static云々のくだりは意味不明なので
>>881さんや
>>883さんに説明してもらうしかない
885 :
876:2011/08/01(月) 08:41:07.16
なるほど、でも自分は指差し確認みたいに明示して書く。
間違いが少なくなるし。
シロウト臭はするでしょうね、実際そうだし。
>(this->mapThis).erace(this->hSelf);
this->mapThis.erase(this->hSelf);
じゃないのはなんで?
すみません。VC++ 2008 EEを使っているのですが、
デバッグで
if ((i==1005)&&(j==1002)) { 〜〜〜 }
などの中のブレークポイントで止めて、i と j にオンマウスして値を確認すると
i=0 j=1092616192 などとおかしな数値になっています。
CreateWindowのハンドルも 正常に作られているのに不正な〜〜と出ていたりします。
時折思った位置のブレークポイントを入れようとしても
いざデバッグを始めるとブレークポイントがふっとんで
思い通りの位置でデバッグできなかったり。
何でこういった事が起こってしまうのでしょうか・・?
リリース版をデバッグしているからじゃね?
リリース版でなくても最適化してたら同じことだけど。
pdbファイルが壊れてるんだろう
リビルトすれば大抵治る
890 :
887:2011/08/01(月) 17:54:20.57
>>888 今回はリリースにしたままになっていました; デバッグに戻したら正常に。ありがとうございました〜
>>889 デバッグの中にそういうファイルが有りました。
これが壊れても似た事が起こるのですね。 記憶しておきます。 ご助言ありがとうございました〜
891 :
876:2011/08/01(月) 20:12:18.60
>>886 自分の頭の中で、
(this->mapThis) という部品(コンテナ)に、
.erace(this->hSelf); という命令を出している感覚だから。
観念上の切り分けで整理する為にカッコ付けしました。
本職が機械設計なんで、機材に動作命令を入力する概念なら理解しやすいのです。
ソフトウェアをハードウェア的に解釈する方が好みなのです。
892 :
876:2011/08/01(月) 20:32:02.56
実はMDIウィンドウのクラス化、カプセル化に挑戦中で苦しんでます。
書籍のMDIソースを元に、気長に改造しつつあります。
参考になりそうなサイトを知っている方がいたら、教えていただけないでしょうか。
近代的なQUIライブラリの代表選手のQtとかか?
894 :
876:2011/08/02(火) 23:05:53.41
thx 見てみます。
正直、
>>876は、もっと修行してから、クラス化・カプセル化に挑むべき。
<再> static メンバへのアクセスに this ポインタは要らないんだよ。
っつーか、逆に hoge::mapThis ってやらないと
コンパイラが文句言ってうるさいんですけどw 無視してんの?
どのコンパイラがそれだしてくれるんだろ。
> <再> static メンバへのアクセスに this ポインタは要らないんだよ。
なんでstaticメンバ限定なの
>>886の真意はそこじゃなくて erase じゃないかと思うんだが、ひねくれてんのかな俺
括弧の有無については慎重な人なんだなと思うが、まさか機械設計がどうとかいうとは思わなかった。
本職のポリシーみたいなのを持ってこないほうがいいよ。
物理学者がマリオのジャンプに難癖つけてるみたいでかっこ悪いよ。
たとえにワロタ
確かに括弧悪い。
すんげー初歩的なようで気が引けるんだけど教えてください。
グローバル変数の初期化って、初期化子が関数でもいいの?いいみたいなんだけど。
たとえばこんな感じで:
int func(){return 100;};
int a=func();
実際動くしダメな理由も思いつかないけど、こんなことしたことないし、ググっても例が見当たらなかった。
>>900 即エラーにはならないけど、 func() の中で a や他のまだ初期化されていない
グローバル変数を触って未定義動作になったり結果が定まらなかったりする
可能性があるから危ない。気をつけて使う必要がある。
うん
int a;
a=func();
とどこが違うのでしょう。
aはグローバル変数なの?
905 :
900:2011/08/04(木) 13:53:47.99
ありがとございます。
>>901 func()が他にまずい依存をしてないって前提で、ってことですね。
ちなみに、組込み機器のロータリスイッチの値を取ってくるのに使ってました。
ドライバをioctl()で叩いてるだけだから大丈夫でしょう。
>>903 プロトタイプ宣言省略したかったんで。
>>905 プロトタイプ宣言うんぬんは間違いですね。よく読まなかった。
この事案、人が書いてるコード上での問題でして、訊かれてハテナ?となったもんで質問した次第です。
他にもグローバルなクラスオブジェクトがあって、それのコンストラクタが上記'a'にあたる変数に依存してるんで、mainが走る前にaに値を入れようとこんなことしでかしたわけです。
だもんで、とmain関数後にa=func();と書かなかったわけです。
>>906 そのグローバルなオブジェクトのコンストラクタと a の初期化と、
どっちが先に走るか確定させられるの?
>>907 同じファイルに書いてあるなら、先に書いてあるほうが先に初期化される、はず、らしいです。
ということで、二つを同じファイルで定義して、やってみて動いたらOK、と言っておきました。
909 :
876:2011/08/04(木) 15:20:18.05
>>896 はて、私の環境ではコンパイラは文句を言いません。
>>897 自分に理解しやすい方法でコードを書いているだけです。
他人に自分のやり方を押し付けるつもりはありません。
どうしてなんだ?と聞かれたから素直に答えただけですよ。
910 :
876:2011/08/04(木) 15:37:10.61
>>876 自己レスです。
原因わかりました...
map コンテナの静的メンバ初期化より前に、hoge クラスのオブジェクトを生成していました。
hoge hogehoge; //
map<HWND, hoge*> hoge::mapThis; //初期化
コンパイラは通ってしまい、実行時にエラーがでるので気がつきにくかったようです。
以上、お騒がせしました。
クズの臭いがプンプンしやがる
912 :
876:2011/08/04(木) 16:13:45.86
>>886 >>897 erace >> erase
ですね、2ch に書き写す時に慌ててミスったみたいです。
ちゃんとオリジナルの私のソースは erase になってます。
>>909 > 自分に理解しやすい方法でコードを書いているだけです。
> 他人に自分のやり方を押し付けるつもりはありません。
でも、ここに書いたことで他人に読ませるコードになったよね。
いやなら見るな!いやなら見るな!押し付けるつもりはない!ですかね
914 :
876:2011/08/04(木) 23:38:12.75
>>913 ええ、そうです。
不特定多数が書き込むのですから。
見てもらいたくて書いたくせに「いやなら見るな」かよ
916 :
876:2011/08/05(金) 10:06:32.36
>>915 ええ、相談に乗っていただける方に見てもらえば充分です。
プログラミングスタイルは各々の工夫による物であり、違っていて当然です。
他者のスタイルは参考にはなっても、同じにしなければならない義務はありません。
不特定多数が出入りする場所には、気に入らないスタイルの相手はいる事でしょう。
だから何です?、あなたには見てもらわなくて結構ですよ。
そうは思っても、敢えて書く必要もなかろうに。
元気があってよろしい。
元気があればなんでも出来る。
ただし放射能汚染は防げない
見てもらいたくない人に見てもらわないこともできない
>>876 見てくれる人だけに見て欲しいというのは構わんが、
> this->mapThis
thisポインタ経由でないものを「文法エラーでないから」といって
こんな糞コード書かれると、真似する奴がいて迷惑なんだよ。
せめて他人に迷惑は掛けないようにしろ。
923 :
876:2011/08/05(金) 20:05:19.25
>>922 静的メンバにも同様のやり方でアクセスできるのだから、操作感の統一は大事です。
これが私のスタイルです、あなたに合わせる義理はありません。
924 :
876:2011/08/05(金) 20:44:23.52
>>922 もし私の真似をする人がいるなら、その人もあなたとはスタイルが違うというだけです。
それが何か?
ここにバグがあるとか、こうすればミスを減らせるという話ならありがたく聞きますが、
俺とスタイルが違うと文句いわれてもねぇ。
876のフリをするスレになってきたな
char と cont char は使い分けたほうがいいの?
うん、使い分けないとコンパイルエラーになるよ
>>876 他クラスから呼ぶときはx::mapThis、非staticメンバ関数から呼ぶときはthis->mapThis、
staticメンバ関数から呼ぶときはx::mapThis、では統一性に欠けると思います。
「staticはx::mapThis」で統一するのがミスを減らせるのではないでしょうか
windows の WndProc系ラッパくさいから
staticメンバ関数から staticメンバ変数である mapThis を参照する可能性が高い
staticメンバ関数は(そもそも this 持てないから)
>>876 スタイルでどー記述するだ?
って話になるな (ほぼ
>>928 の意図かと思われる)
930 :
876:2011/08/05(金) 22:30:02.58
>>928 説明が足りなくて申し訳ありません。
私の理解は、静的メンバはクラス内グローバルという物です。
mapThis が public だったとして、
他クラスから呼ぶときは、オブジェクトを生成して hogehoge.mapThis、
あるいは、ポインタから phogehoge->mapThis
クラス内においては、
非staticメンバ関数から呼ぶときは、this->mapThis、
staticメンバ関数には、必ず引数に 関数名(void* vp) と void型のポインタを用意して this を渡し、
先頭で hoge* This = (hoge*)vp; として、This->mapThis とアクセスしてます。
メリットは、無数にあるどのオブジェクトから静的メンバから呼ばれたのか判断できる事です。
あなたのやり方でも良いとは思いますが、答えは1通りじゃ無い訳です。
931 :
876:2011/08/05(金) 22:34:26.79
御免なさい、訂正です。
メリットは、無数にあるどのオブジェクトから静的メンバから呼ばれたのか判断できる事です。
↓↓↓
メリットは、無数にあるどのオブジェクトから静的メンバが呼ばれたのか判断できる事です。
でっていう
なんでそんなもん分かる必要あるんだ
夏なんだからスルーしろよ
勉強もかねてC++で簡単なWindowsアプリを作りたいのですがVisualC++とか
ないと作成は無理なのでしょうか?
例えば、C++の参考書に付いているCDのコンパイラなどでも作成は
可能なのでしょうか?
できるけど、なれないうちはVC++が一番簡単だよ
今から学ぶならC#をお勧めする
BCCはやめろ
>>935 CDコンパイラは止めろ。
今のC++でのWindowsアプリは
Qt
で行うのが普通
Win用QtにはGCCもついているが、やっぱりVC++2010だな
qt vc2010に対応したのか
941 :
876:2011/08/05(金) 23:22:20.92
>>933 静的メンバ内で this ポインタを使えるし、
どのオブジェクトから呼び出されたかによって静的メンバ関数内で処理を分岐させたりできますが?
発想しだいで便利な利用方法はあるはずです。
思い当たる人だけ分かってもらえば良いですよ。
>>941 静的メンバ関数内ではthisは使えないけど
なんの話してるんだ?
メンバ関数使えカスwww
945 :
876:2011/08/05(金) 23:30:05.51
>>942 工夫すれば、静的メンバに this を渡せますよ。
先ほど説明しました。
国語的に分かりにくくて申し訳ないですが。。。
946 :
876:2011/08/05(金) 23:33:32.10
>>943 なぜ?、静的メンバを使いたい場面もあるでしょう?
>>944 理由も説明せずにバカ呼ばわりは酷いですね。
どうやら頭がおかしいようだね
948 :
876:2011/08/05(金) 23:48:22.83
>>947 ほう、説明してくれ。
どうおかしい?
もはやプログラミングの話ではなくなってしまうな、スレ違いだし。
個人攻撃はやめて欲しいのだが。
攻撃しているんじゃなく、率直な気持ちを言っているだけじゃね
どうっていうか何もかもだろw
>>945 >> 静的メンバ関数内ではthisは使えないけど
>> なんの話してるんだ?
> 工夫すれば、静的メンバに this を渡せますよ。
日本語通じないの?
>メリットは、無数にあるどのオブジェクトから静的メンバから呼ばれたのか判断できる事です。
静的メンバ関数はオブジェクトから呼ばれるものではないし。
>>876のやりたいのは↓だろ。それにしてもおかしすぎる
struct b {
virtual void f() = 0;
static void __stdcall Callback(void *param) {
static_cast<b *>(param)->f();
}
};
953 :
876:2011/08/06(土) 00:02:27.62
>>949 おかしいというからには、気持ちではなく論理で説明してください。
>>950 何もかもじゃ、説明になってません。
ごまかしと受け取れます。
>>951 私はできるだけの説明はしました。
国語力が足らないのは申し訳ありません。
理解いただけなかったようで。
class hoge {
virtual LRESULT wproc(HWND,UINT,WPARAM,LPARM) = 0;
static map<HWND, c*> thisMap;
static LRESULT CALLBACK window_proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
どう書けばよいの? hWnd をキーに thisMap から オブジェクト探して
そのオブジェクトの wproc 呼びたいんだけど
window_proc の引数は(APIの仕様上)変更できません><
}
}
× static map<HWND,c*> thisMap;
○ static map<HWND,hoge*> thisMap;
>おかしいというからには、気持ちではなく論理で説明してください。
おかしいのは一点だけ。
| this->static_member;
static_memberへのアクセスにthisポインターは参照されないのにthisを書くのはおかしい。
>>954 素直に hoge::thisMap[hWnd]->wproc() でよろしい。
>>953 インスタンス1個もないときはどうすんの?NULLでも渡すの?
958 :
876:2011/08/06(土) 00:16:05.23
>>956 ありがとうございます。
非staticメンバへのアクセスと操作感を統一できるならそうしたいので、あえてそうしてます。
参照されないのは知ってます。
ウィンドウのクラス化でウィンドウハンドルとオブジェの関連付けは普通SetProp/GetPropを使う
960 :
956:2011/08/06(土) 00:17:02.49
>>957 static_cast<hoge *>(nullptr)->static_fun();
これでおk
>>959 ただの自前クラスを記憶するのにSetPropは変じゃないか?
Windowsサービスと自作サービスクラスの場合とか考えたらmapの方が自然。
>>958 非staticとstaticは全く別物だよ
違うものを同じ見た目で統一するのは混乱を呼ぶだけでしょ
同じコードで書ける仕様ってのはテンプレートとかで活用するために用意されてんの
コーダーが書いたときに「きっちり揃ってて気持ちい!」みたいな自己満足を得るための機能じゃない
客観的な視野を持って後から保守するかもしれない人の立場になって考える力があるなら見た目ですぐに区別できる方を選ぶのが常識
ま、あんたは趣味グラマのようだからそういうことは気にしなくていい立場なのかもだから言っても意味ないだろうけど
963 :
876:2011/08/06(土) 00:33:45.01
>>957 その場合はNULLを渡して、「インスタンスを生成してないのにアクセスした」
静的メンバ内で例外処理してます。
>>959 ありがとうございます。
SetWindowLong/GetWindowsLong、SetProp/GetProp
も試しましたが、私のやりたい事ではエラーがでてしまい、他の方法で解決しました。
CreateWindow を呼ぶと WM_CREATE 以前にもいくつかメッセージが飛ぶらしく、
WM_CREATEにたどり着くまでウィンドウハンドルが返りません。
SetProp にはハンドルが必要なので、WM_CREATE 以前の処理には使えないのです。
>>963 map<HWND, hoge *>にもHWNDは必要だけど、こっちはCREATEメッセージより前の処理どうしてるの? それと同じようにすればいいのでは?
965 :
876:2011/08/06(土) 01:18:18.43
>>954 >>964 悩みましたよ、無茶な方法かもしれませんが解決しました。
プロシージャ内からアクセスするためにグローバルで hoge hogetool; を用意し、
静的メンバに hoge* pCreater; を準備し、
CreateWindow 直前に this を代入してフラグとして使い。
プロシージャの先頭で hogetool.pCreater にアクセスすれば、どのオブジェクトから create されたかわかります。
thisMap に create するたびに登録すれば、2度目からは hWnd から検索できます。
登録し終わったら pCreater をクリアする事と、デストラクタでは thisMap から erase する事を忘れずに。
966 :
876:2011/08/06(土) 01:22:07.57
>>962 ええ、今の所は趣味グラマです。
おまけに経験もないので、まず理解しやすい方法でやるのがやっとです。
保守性まで気が回るのは先の話でしょうね。
アドバイスありがとうございます。
>>965 >>956 のような実例が欲しいのですがね…
>>954 の window_proc 中の thisMap へのアクセスの記述を
具体的に this(またはそれに類するもの) を使って書いて欲しいという一点に集約されてるのですけど
968 :
876:2011/08/06(土) 01:40:20.56
>>967 ご免、クラス名が違ったりしますが生ソースを部分的に張ります。
>>962 シロウト臭い、見苦しいソースでしょうが許してください。
私の今の限界です。
969 :
876:2011/08/06(土) 01:41:52.79
//"mapthis"に要素追加
MdiWindow* MdiWindow::setThis(HWND hwnd){
if(this->pCreator){ /ウィンドウ生成を試みている"this"が存在するなら
//"map_this"に登録
(this->mapThis).insert(pair<HWND, MdiWindow*>(hwnd, this->pCreator));
this->pCreator = 0; //フラグをクリア
return this->pCreator; //発見した"this"ポインタを返す
}else{
return 0; //存在しないなら"0"を返す
}
}
970 :
876:2011/08/06(土) 01:43:12.01
//"mapthis"で要素検索
MdiWindow* MdiWindow::getThis(HWND hwnd){
map<HWND, MdiWindow*>::iterator itr; //map型イタレーター
itr = (this->mapThis).find(hwnd); //検索
if(!(itr == (this->mapThis).end())){ //要素を発見したら、"itr->first"がキーで"itr->second"が値
return itr->second; //発見した"this"ポインタを返す
}else{
return 0; //発見できないので"0"を返す
}
}
>>967 ↓ こういうことだろ。俺はこんなコードはメンテしたくない
hoge::g_hoge = new hoge();
HWND h = CreateWindow();
// ここでウインドウプロシージャが呼ばれる↓
static LRESULT CALLBACK window_proc(HWND h) {
if (g_hoget != nullptr) {
hoge::thisMap[h] = g_hoge;
g_hoge = nullptr;
hoge::thisMap[h]->my_proc();
}
else hoge::thismap[h]->my_proc();
}
ほら 自分ルールを曲げてるじゃん
hoge::thiaMap[h] でアクセスしてる
貴方のルールでは オブジェクトからの呼び出し になるような記述をしなくてはならないハズだが?
973 :
876:2011/08/06(土) 01:47:41.69
//MDIFRAMEウィンドウのMSG処理関数
LRESULT CALLBACK MdiWindow::frame_proc(
HWND hwnd,
UINT wmsg,
WPARAM wp,
LPARAM lp
){
//"MdiWindow"クラスの"this"ポインタを取得
MdiWindow* This = 0;
if(!(This = mditool.setThis(hwnd))){
if(!(This = mditool.getThis(hwnd))) THROW(-1, "未登録ウィンドウのメッセージを検出");
}
//MSGで場合分け
switch(wmsg){
case WM_CREATE:
//MDICLIENT生成
mdiclient.create("MDICLIENT", "", 0, hwnd);
return 0;
default:
MdiWindow::base_proc(hwnd, wmsg, wp, lp);
return (DefFrameProc(hwnd, mdiclient.ret_hwnd(), wmsg, wp, lp));
}
return 0;
}
>>965 これだとウィンドウ生成過程で別のウィンドウ生成したら爆死しますよね
976 :
876:2011/08/06(土) 01:51:52.90
>>971 心配しないでくれ、こんな趣味グラマが作ったコードのメンテをあなたには頼まないから。
>>972 それ、俺じゃ無い。
それにもちろん、どうしてもそうしないとエラーが出るならそうアクセスします。
>>972、
>>971は俺が書いたので
>>876じゃない。たぶん
>>876は↓がやりたい
struct hoge { static hoge *g_hoge; virtual void my_proc(); map<> thisMap; };
auto ph = new hoge();
ph->g_hoge = ph;
auto h = CreateWindow(); // この時点ですでにWndProcが呼ばれる。
ph->set(h);
----- WndProcここから
static void WndProc(HWND h) {
auto ph = static_cast<hoge *>(nullptr)->get(h); // ph == nullでもおk
ph->thisMap[h]->my_proc();
}
978 :
876:2011/08/06(土) 01:58:49.05
>>974 初心者の私には、「MFC、Win32++を超える」なんて自信は無いもので。
よちよち歩きの理解だし、初心者板が似合いだと思います。
>>975 ええ、複数スレッドから使ったりするとやばいかも。
だから無茶な方法だと自覚してます。
回避する方法を考えなきゃ...
979 :
972:2011/08/06(土) 02:01:49.73
はやとちりしてしまった ごめんなさい。
>>977 むむむー
文法で解決できる事柄なのに、スタイル維持にはちょっと特殊な構造にしないといけないのか…
980 :
876:2011/08/06(土) 02:06:05.94
>>975 ロックすれば良いのかな?
ロックフラグ用意して、ロックされてる間は生成の順番待ちしてもらうかな。
できるだろうか。
>>980 hoge* pCreaterも排他付きmapにして、lpParamに識別渡すんだよ。
そのためのlParam。
983 :
876:2011/08/06(土) 02:26:24.34
>>981 なるほど、ありがとうございます。
>>980 どう不完全でしょう。
すみません、教えていただけないでしょうか?
面倒くさいとは思いますが。
>>876のコードがどんどんすごいことになっている件
ウインドウ生成は基本的にマルチスレッドでするものではないし、一応完全だと思うが。
ウインドウ生成過程でウインドウ生成ってなんだ?
hogeウインドウ生成中にhogeウインドウは生成されないだろ
985 :
876:2011/08/06(土) 02:31:37.05
眠い、そろそろマブタが重いです。
おやすみなさい、また明日。
アドバイスくださった方ありがとうございました。
986 :
876:2011/08/06(土) 02:37:04.31
>>984 ええ、普通マルチスレッドではしませんよね。
でも指摘された事に対する可能性はそれなのかな...と。
完全ならうれしいのですが。
他の人は完全では無いというので混乱してきました。
>>966 俺も趣味グラマだけど
趣味グラマだと守破離の守の先生もとて教育されていないから超俺俺になり、
守の先生もとで修行を積んだ職業PGからみれば><になるってことは覚えておいたほうが良い
まっ、趣味グラマなら動けばOK、自己満足満たせばOKだけどね
>>983 例えば再帰的にサブウィンドウが作られる場合とかが危険
(g_pHoge = new Hoge; CreateWindow(...)) 〜 (WM_CREATEをハンドリング; マッピング)
この間(〜の部分)でもう一度Hogeクラスのウィンドウを作ろうとしたらg_hogeが書き換わってしまいマッピングに失敗する
マッピングの後にサブウィンドウを作るなら問題ないし普通はそうするだろうけどね
989 :
876:2011/08/06(土) 03:00:36.22
>>988 プロシージャのWM_CREATEにおける処理が終わるまで、次のウィンドウを作ってはならないという理解でよいでしょうか?
だとすると、終わった所で外れるロックフラグを用意すれば大丈夫でしょうか。
thisMapに登録するまでの間、g_pHogeが再帰で上書きされるのが問題って話だろ
g_pHogeがフラグそのものになるじゃないか。
if (g_pHoge != 0)残念;
g_pHoge = new Hoge(); h = CreateWindow();
g_thisMap[h] = g_pHoge; g_pHoge = 0;
>>939 035です。ちょっと金銭的な問題で高いソフトを買う金が無いんですよね。
フリーでそういったWinアプリを作成できるようなものはないんでしょうか?
Qtでいいだろ
VC++2010Expressは無料だぞ
994 :
876:2011/08/06(土) 08:40:46.99
>>989 おはようございます。
OK、理解できました。
thisMapに登録するまでの間、内側から create しないようにします。
助言ありがとうございます。
>>991 レスにあることすら自分では全く調べませんよってことか
なら、Winアプリを作成も自分でしないで誰かにやらせたら
>フリーで
そんな奴だと平気で後だし条件を付けて
おまえら調べろってするよな
どこで聞けばいいかわからなかったので、ここで失礼します。
Windows フォトビューアーで複数の画像を同時に開く処理
(エクスプローラで複数の画像ファイルを選択し、Enterを押すのと同じ処理)
をCで書きたいのですが、
ShellExecute(NULL,"OPEN","Rundll32.exe","\"C:\\Program Files\\Windows Photo Viewer\\PhotoViewer.dll\",ImageView_Fullscreen 画像のパス", NULL, SW_NORMAL);
で一つの画像ファイルを開くことには成功したのですが、複数画像を開く方法がわかりません。
半角スペースで画像パスを並べたり、ダブルクオーテーションで括ったりしましたが起動しませんでした。
どなたか解決法をご存知の方はいませんか。
>>996 ファイルの個数だけ ShellExecute を呼べばいいんじゃね
998 :
デフォルトの名無しさん:2011/08/06(土) 15:04:27.78
>>991 >>995 ネットで情報収集する能力すら弱い初心者なのかも、自分と同じ基準で評価するのは良くないでしょう。
VC++2010Express はマシンスペックによってはマトモに動かないかも、新しい分だけ重いし。
グレードダウンして VC++2008Express も考慮に入れるべき。
VC++2005Express は Platform SDK が別に必要で設定もややこしいので勧めません。
本当の初心者がいきなり Qt のような高級ライブラリに手を出すのはツライでしょうか。
開発環境を手に入れたら、WinAPIの入門サイトでも見ながら勉強しては?
999 :
876:2011/08/06(土) 17:36:44.41
>>979 それぞれ、以下のように解釈できると思います。
hoge::honyaraga();
シンボルで示される情報空間上アドレスの命令を実行。
phoge->honyaraga(); this->honyaraga();
オブジェクトで示される現実上のロボット(PC)が命令を実行。
私にとっては可能な限り下の手法で統一する方が、即物的で理解しやすいです。
手段の正当性を多少無視してもメリットがあります。
手段と目的を間違ったら意味がありません。
便利な方法で使う事が目的です、厳密に言語仕様を守りすぎて不便じゃ困ります。
もちろん上の方が便利という人も多いでしょう。
私も以前は上の手法で書いていましたよ。
常識を破りすぎだと言われるとは予想しませんでしたが、後から変えたのです。
次スレ
http://hibari.2ch.net/test/read.cgi/tech/1299218426/ ,. -──- 、 ミ r‐、
/ _ -v-- 、 \ ノ) }
/ / rv、 、`ヾヽ /ハ l ! / ))
l/ // | l l lヾヘマヽ / \/
/ /ー '^′`ー:: ┼l_」ヘ/| / /
H'´ ≡/////≡ | / | j / /
l{ ::::: ┌─ ┐ :::::: 冂ヽ lく / /
八 | | l´レj / /
/ /\ | | | |/ / また次スレでね〜!
〈_/ rく ` ー--‐ 7´:! {:{ /
/\ / l/Ll:|:. .:/|
/ / ー-/ :|: l:l:/ l
/ / i :|: //:. ヽ
/ヽ ヽ、 __::人 __:ノ:/'´|:. l: __ノ
\ \_ { ,,,):::::l(,,.;;} .:|:.__冫´
/ `ー/ー┤:::l .:|
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。