【初心者歓迎】C/C++室 Ver.74【環境依存OK】

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2011/02/24(木) 00:35:18.64
C++なのに、後で使うローカル変数をあえて関数の最初で宣言するのは
VSのデバッグ機能などに寄与するとかあるんでしょうか?
自分はC++覚えたてのときから変数は必要になってから宣言即初期化してたんですが…
953デフォルトの名無しさん:2011/02/24(木) 00:48:34.18
>>952
ないよ。ただの悪習でしかないから、宣言即初期化(そして const )を貫くがいい。
954デフォルトの名無しさん:2011/02/24(木) 01:21:00.51
>>953
ありがとうございます。貫きます。
955デフォルトの名無しさん:2011/02/24(木) 02:01:16.62
>>951
insertとかeraseは使えないのだろうか。
956デフォルトの名無しさん:2011/02/24(木) 02:06:11.69
>>955 なんで使えないと思ったの?
957デフォルトの名無しさん:2011/02/24(木) 02:10:18.88
メンバ関数にないって書いてるから。
958デフォルトの名無しさん:2011/02/24(木) 02:19:05.21
>>957
日本語不自由なやつだな。
「削除→挿入によってキーへの代入と同等のことをする操作は巨大なmapで何回もやると
 ものすごい時間が掛かるから、メンバ関数には入れなかったのだろう」
ということ。
959デフォルトの名無しさん:2011/02/24(木) 02:27:31.89
なんでキーを変更するようなメンバ関数の有無の話になってんだ?
誰かほしがってたのかな。
960デフォルトの名無しさん:2011/02/24(木) 02:35:06.91
>>944がそういうoperator=()を望んでる
961デフォルトの名無しさん:2011/02/24(木) 02:37:59.82
そうは見えないが、日本語不自由だから本当はそれをほしがってることに気づけてないのか
962デフォルトの名無しさん:2011/02/24(木) 04:54:04.78
頭も不自由のようだな
963デフォルトの名無しさん:2011/02/24(木) 07:13:23.63
pair<string, int>を使えとかそういう話じゃないの?
964デフォルトの名無しさん:2011/02/24(木) 07:31:00.16
>>960
かっこいいな。
965デフォルトの名無しさん:2011/02/24(木) 13:29:26.83
だからoperator=の事とちゃうんか?
operator[]と組み合わせて使うとまた別の意味になるけど

hogeMap["abc"] = 1; とか

次のようにするとキーはそのままで値のみが置き換わるのがわかる
std::multimapはまた別の動作をする
(しかしラムダ式使いてーなー)
template <class U, class V>
void print(std::pair<U, V> p)
{
std::cout << '[' << p.first << "] = " << p.second << std::endl;
}

int main()
{
std::map<std::string, int> hogeMap;
hogeMap["abc"] = 1;
std::for_each(hogeMap.begin(), hogeMap.end(), print<std::string, int>);
hogeMap["abc"] = 2;
std::for_each(hogeMap.begin(), hogeMap.end(), print<std::string, int>);
}
966デフォルトの名無しさん:2011/02/24(木) 16:33:31.65
for_eachの練習ならよそでやってくれ
967デフォルトの名無しさん:2011/02/27(日) 08:17:44.82
うめ
968デフォルトの名無しさん:2011/03/01(火) 02:00:25.02
Eclipse CDTでやってるんだけど
Shared Libraryとして作ったプロジェクトのソースにmain()って書けないの?
デバッグはどうやれば?

つまり
-shared
オプションがつけられた場合に
リンカはmain()が含められたオブジェクトファイルをリンクしてくれるのかどうか
ということかな
969デフォルトの名無しさん:2011/03/02(水) 06:56:53.41
Javaみたいにパッケージ内で1つの名前空間を使う方法ってありますか?
いちいちnamespace{}で囲わないといけないんでしょうか
970デフォルトの名無しさん:2011/03/02(水) 13:02:38.51
using namespace
971デフォルトの名無しさん:2011/03/03(木) 20:21:15.68
アドレスってどの型に入れればよいですか?
windowsならLONG_PTR?
972デフォルトの名無しさん:2011/03/03(木) 20:23:40.74
void*
973デフォルトの名無しさん:2011/03/03(木) 20:24:58.33
>>972
値が欲しいんです
974デフォルトの名無しさん:2011/03/03(木) 20:50:10.53
ポインタ型
975デフォルトの名無しさん:2011/03/03(木) 21:42:31.72
>>971
情弱乙
976デフォルトの名無しさん:2011/03/03(木) 23:17:58.81
ヘッダーファイルだけで構成されたライブラリが流行っていますよね。
こういうライブラリで静的な変数をうまく初期化する方法はあるでしょうか?

すぐに考え付く方法として、関数のスコープで静的な局所変数を宣言し関数の戻り値として利用する方法です。
int const * getData()
{
  static int const data[] = { 1, 2, 3, 4, 5 };
  return data;
}
この方法は、現行のC++ではスレッドを利用した時に破綻します。(C++0xでは保障されるようです。)

しかし、ヘッダー内で普通に大域変数として初期化すると、DLLとDLLを利用するプログラムの両方に
実体が出来るため、リンクに失敗します。

こういう場合、一体どうすればいいのでしょう?
977デフォルトの名無しさん:2011/03/03(木) 23:25:16.45
普通にconst int ARRAY[] = {1,2,3,4,5};ではだめなん?
978デフォルトの名無しさん:2011/03/03(木) 23:25:52.83
VC限定だが__declspec(selectany)
979デフォルトの名無しさん:2011/03/03(木) 23:31:03.54
プロセス内に唯一つの大きなテーブルが欲しい。
これは読みだすだけで初期化以外に書き込みは発生しません。
具体的には、構文解析用のAction、Goto、SemanticActionの各テーブルです。
パーサーのインスタンスごとにメモリーを確保、初期化しても最近のコンピューターであれば問題
ないかもしれませんが、できれば無駄をなくしたいと思った次第。
よろしくお願いします。
980デフォルトの名無しさん:2011/03/03(木) 23:45:34.43
new deleteかmalloc free で確保すればいいと思うが、何が疑問なんだ?
981デフォルトの名無しさん:2011/03/03(木) 23:48:45.68
モリマップドファイルとかDB使うとか?
982デフォルトの名無しさん:2011/03/03(木) 23:48:47.83
>>980

>>978の汎用的な方法という意味。
983デフォルトの名無しさん:2011/03/03(木) 23:49:12.56
メモリマップドファイル^^
984デフォルトの名無しさん:2011/03/03(木) 23:56:35.19
>>976
Singleton使ったらうまく行かない?
985デフォルトの名無しさん:2011/03/03(木) 23:58:48.19
>>984
うまくいくけど、クリティカルセクションが必要になってスマートじゃない予感がする。
986デフォルトの名無しさん:2011/03/04(金) 00:30:39.63
文字列化
const char *table = "\x00\x01\x02........";
987デフォルトの名無しさん:2011/03/04(金) 00:40:52.35
ごくありふれた問題ですぐに回答がつくかと思ったらそうでもないのか。
C++0x待つか。
初期化タイミングが保障されるらしいし。
988デフォルトの名無しさん:2011/03/04(金) 01:00:07.29
組み込み型定数なら初期化タイミングなんて気にしなくてよくね?そういう話じゃないの?
989デフォルトの名無しさん:2011/03/04(金) 02:08:05.45
>>985
スマートである必要はないだろ
動けば今はいいんだろ?
規格で保証されてない動作をあれこれ考えるより余程いい
990デフォルトの名無しさん:2011/03/04(金) 03:06:41.08
MinGWで開発中の者です。
struct Info{
int num1;
int num2;
std::string str1;
};
int Delete(struct Info *pinfo,std::list<struct Info>& list){
for(std::list<struct Info>::iterator itr=list.begin();itr!=list.end();itr++){
if(pInfo==(*itr)){//ここで「no match for 'operator==' in 'pinfo == itr'」
//削除処理
}
}
}
int main(){
std::list<struct Info> list1;
struct Info info;
//要素追加処理。
struct Info del;
del={2,3,"foo"};
Delete(&del,list1);
return 0;
}
となってしまいます。
どのようにすれば良いのでしょうか。
991デフォルトの名無しさん:2011/03/04(金) 03:15:55.96
>>990
型が合ってないのが悪いんだから、
if(pInfo==&(*itr))
でいいんじゃね?
992デフォルトの名無しさん:2011/03/04(金) 03:29:53.87

次スレお願いします
993デフォルトの名無しさん:2011/03/04(金) 08:42:53.57
>>990
struct Info の operator == を自前定義したうえで *pInfo == *itr
994デフォルトの名無しさん:2011/03/04(金) 15:02:30.56

次スレ案内

【初心者歓迎】C/C++室 Ver.75【環境依存OK】
http://hibari.2ch.net/test/read.cgi/tech/1299218426/

うめ
995デフォルトの名無しさん:2011/03/04(金) 16:45:51.27
char *abc[][3] = {
{"xyz", "uvw", "rst"},
{"opq", "lmn", "ijk"},
{"fgh", "cde", "@ab"},
{"aho", "baka", "shine"}
};
で初期化出来ますが、
*abc[][3] の配列(というか *abc[][3] を指すポインタ)は、
char **xyz[][3] = {abc, def, ...};
じゃ代入出来ないんですけど、
どう書いたら良いでしょうか?
996デフォルトの名無しさん:2011/03/04(金) 16:50:14.64
char *(*xyz[])[3] = {abc, def, ...};
997デフォルトの名無しさん:2011/03/04(金) 16:53:54.98
ややこしく書かずに
typedef const char* type[4][3];
type* p = &abc;
とでも書いたらどうだろう
998デフォルトの名無しさん:2011/03/04(金) 16:56:10.84
>>996
出来ました!!
ありがとうございました!!!
999デフォルトの名無しさん:2011/03/04(金) 17:02:16.96
質問いいですか?
1000デフォルトの名無しさん:2011/03/04(金) 17:02:58.99
>>1000ならおk
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。