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

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

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

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

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

2デフォルトの名無しさん:2011/03/04(金) 16:55:06.86
>>1おつなんて言ってあげないんだからね!
3990:2011/03/04(金) 18:28:09.46
前スレ>>990です。
演算子のオーバーロードで解決しました。
>>991,>>993ありがとうございます。
4デフォルトの名無しさん:2011/03/04(金) 18:30:23.82
              ,  -‐介‐- 、
           /         `\
          //  _,. . -―-. . _ ヽ\
          / /イ´: : : : : : : : : : : `:.、 \
       ∠_ / : : ,イ:人: : : : :人 : : : : \ \
         ∠: : : :/斗ト-\/ 弋ト、: : : : ;ゝ-´
            V: /!  __    __   ト、: :./  ここは烏賊娘の部屋でゲソ〜
          |V_:ハ、'⌒゙  ,  ⌒ヽ ,ハ、Y
          |: {〈〈}   、  ,    {リ〉リ:{
           /: ∧ \    ̄   / ∧:ヘ
.         /: / : \  )ー--‐ '(  ,.イ:ハハ
        /: ∧: :(´⌒ Y《ー ‐》Y ⌒゙): : } ハ
.       /: / :∧:/` チ ゙《 》 乂 ´\:∧: :.|
.     //l :// ./     V    ヽ  \V: \
.    /: /  .|/´   /!______.∧  `ヽ: : \
  ̄ ̄ ̄ ̄ {   /: し)    (⌒ヽソ人   } ̄ ̄ ̄ ̄
         `ー' `ー'        `ー'   `ー '
5デフォルトの名無しさん:2011/03/04(金) 22:42:00.01
前スレの続きで、こういうことだな。
http://en.w3support.net/index.php?db=so&id=335369
6デフォルトの名無しさん:2011/03/05(土) 02:12:29.28
最初に2つのスレッドが同時にこの関数を呼ぶと・・・ってことか
7デフォルトの名無しさん:2011/03/05(土) 05:52:54.54
最初だけとは限らないところが問題なんだ。
8デフォルトの名無しさん:2011/03/05(土) 05:56:19.13
これはヘッダーだけのコンポーネントを構成する時に起こる一般的な問題だぞ。
静的なテーブルを使うようなものはいくらでもある。
各種構文解析機、文字コードを扱うもの等。
9デフォルトの名無しさん:2011/03/05(土) 09:06:25.77
何かとおもったらレース状態の話か
言語の問題というよりマルチタスク寄りの問題だろう
その手の本を読んだ方が良い
10デフォルトの名無しさん:2011/03/05(土) 09:09:47.47
Googleでは「競合状態」の方がよくヒットするな
読めば理解できる
11デフォルトの名無しさん:2011/03/05(土) 10:18:48.68
そういう話ではないんだがな。
12デフォルトの名無しさん:2011/03/05(土) 12:51:00.27
mainで初期化すればいいじゃん
13デフォルトの名無しさん:2011/03/05(土) 13:24:14.79
ヘッダに性的ミューテックス定義してそれで同期しちゃいかんの?

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で同期する。
14デフォルトの名無しさん:2011/03/05(土) 14:01:24.55
そんなに引きずるようなネタ?
cppに
Singleton
_declspec(selectany)
前スレで答えで出てるじゃん
15デフォルトの名無しさん:2011/03/05(土) 14:04:32.13
いろいろあーだこーだ言うのが楽しいだけさ
16デフォルトの名無しさん:2011/03/05(土) 14:18:46.37
17デフォルトの名無しさん:2011/03/05(土) 14:28:05.69
>>7
どういうこと?初期化さえされてしまえば大丈夫な気がするけど
18デフォルトの名無しさん:2011/03/05(土) 15:19:10.41
cppはDLL間の多重化を防げない。
Singletonはそれだけじゃマルチスレッドの初期化ができない。

ファイルスコープに定義することでmain前にシングルスレッドで初期化し、
selectanyでDLL間/DLL内の多重定義を抑制する。
19デフォルトの名無しさん:2011/03/05(土) 15:39:14.34
システム資源と言語内変数の一意性をごっちゃにしてる。
20デフォルトの名無しさん:2011/03/05(土) 19:58:51.12
とりあえず Boost.Thead に 1 回だけ初期化ルーチン走らせるための仕組みがあるようだが。
http://www.boost.org/doc/libs/1_46_0/doc/html/thread/synchronization.html#thread.synchronization.once
21デフォルトの名無しさん:2011/03/06(日) 04:55:23.06
>>20
それに必要なonce_flagがDLLとアプリで両方定義されたら元の>>976は解決
できないんじゃ?

>>19
CPPとSingletonと>>13のtemplateは言語内の話だよね。>>976はモジュール間
の話だから、言語内にもDLL間にも働くdeclspecでいい気がするが
22デフォルトの名無しさん:2011/03/06(日) 14:30:00.31
マクロで環境別にプリプロセスが正解
23デフォルトの名無しさん:2011/03/07(月) 12:04:49.32
質問です。
ポインタ関係なのですが、int*やdouble*やvoid*型はサイズなのに、どこにその型の情報を保存しているのですか?
それとも、コンパイル時にエラーを出すだけで、プログラム実行時には区別されていないんでしょうか?
2423:2011/03/07(月) 12:10:07.71
すみません、
サイズは一緒なのに、どこにその型の〜
です
25デフォルトの名無しさん:2011/03/07(月) 12:24:20.44
dynamic_castでも使わないと型情報なんて保存しないよ
26デフォルトの名無しさん:2011/03/07(月) 12:38:24.57
型情報とかはコンパイラやデバッガのために要るだけでプログラムが実行するためには要りませんので
27デフォルトの名無しさん:2011/03/07(月) 12:57:48.75
その辺は動的言語や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;
}
2823:2011/03/07(月) 12:58:33.41
ありがとうございます
すっきりしました
29デフォルトの名無しさん:2011/03/07(月) 13:02:15.08
>>23
サイズが一緒なのは、ポインタの実体は32ビット(64ビットOSなら64ビット)の
メモリ領域でしかないから。
そこに実データが存在するメモリアドレスが格納されてるわけだ。

で、コンパイル時は型がわかるから、言語仕様として出来ない暗黙キャストは怒られる。

試しに値を代入したfloat型変数のポインタを、無理矢理int型ポインタにreinterpret_castして
int型として値を取り出すと、floatとして代入された値の32ビット浮動小数点フォーマットのビット表現を、32ビット整数として得ることができる。
30デフォルトの名無しさん:2011/03/08(火) 00:57:38.01
・・・ことがある。
31デフォルトの名無しさん:2011/03/08(火) 03:02:40.28
NTLという演算ライブラリを使っています。ZZ型という巨大整数を扱う型が
あるのですが、計算結果をファイルに書き込みたいのですが、char型の配列
に変換できずに困っています。I[i]=salt%256;salt=(salt>>8);とやっても
出来ませんでした。ZZ型をそのまま書きこむ方法があればいいのですが、
内部でどのような処理をしているのかが解りません。どなたか解る人が
いたら教えてください。よろしくお願いします。
32デフォルトの名無しさん:2011/03/08(火) 03:30:14.77
ヘッダーファイルを見る限りだと、バイト列にしたいんならBytesFromZZ、
文字列にしたいならstd::ostreamにぶち込めばいいでないの
33デフォルトの名無しさん:2011/03/08(火) 06:55:49.22
寝取られライブラリ。ハァハァ
34デフォルトの名無しさん:2011/03/10(木) 22:54:38.27
デバッグ、ログ用に
debugout( .... ); とかして
 ....部はprintfの()の中の書式
ソース名(debugoutソース行番号) xxxx
 xxxは書式展開部
ってなふうに出力するC/C++両方で使えるコード作ってください
35デフォルトの名無しさん:2011/03/10(木) 23:06:55.65
いくら出す?
36デフォルトの名無しさん:2011/03/10(木) 23:30:04.39
C++ならゲームエンジンアーキテクチャのパクリ
http://codepad.org/f0Czgp8j
3734: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];
};
3834: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__)
3934: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バージョン作って
40デフォルトの名無しさん:2011/03/11(金) 01:49:38.66
>>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
4134: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
42デフォルトの名無しさん:2011/03/11(金) 02:20:14.77
>>41
静的変数として buf を用意すれば楽にいけるんじゃね?
4334:2011/03/11(金) 02:55:00.89
>>42
ありがとう。頭良いな
寝る
44デフォルトの名無しさん:2011/03/11(金) 08:03:58.11
>>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__ )
45デフォルトの名無しさん:2011/03/11(金) 17:18:08.18
何かのライブラリで、例えば

inline int hoge(){
#ifdef HOGE
return 0;
#else
return 1;
#endif
}

こんな感じになっている場合、これをインクルードして
class fuga{
public:
int fuga1(); //このメソッド内で呼ぶhoge()から0を返してもらって
int fuga2(); //このメソッド内で呼ぶhoge()から1を返してもらう
}
という事は出来るでしょうか?
46デフォルトの名無しさん:2011/03/11(金) 19:00:48.34
>>45
fuga::fuga1()とfuga::fuga2()の定義を別のコンパイル単位にして
HOGEのdefineを変えてincludeすればいい
47デフォルトの名無しさん:2011/03/11(金) 19:30:44.35
>>45
template<int RET> inline int hoge(){
return RET;
}
hoge<0>();
hoge<1>();
とかでいいんじゃない?
4834: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
4945: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();}
50デフォルトの名無しさん:2011/03/11(金) 22:31:57.70
>>49
template<int RET> inline int hoge_wrap(){
hoge();
return RET;
}
hoge_wrap<0>();
hoge_wrap<1>();
51デフォルトの名無しさん:2011/03/12(土) 00:54:24.56
地震のおかげでいつもより早く帰れるーって喜んでる人がいて日本に不安を感じた
52デフォルトの名無しさん:2011/03/12(土) 11:40:59.64
>>45
単純にやると ODR 違反で未定義動作だと思われます。
53デフォルトの名無しさん:2011/03/16(水) 00:51:16.72
http://ideone.com/Xyggg
このコードでstrに格納される文字列データってリークしますか?
54 ◆QZaw55cn4c :2011/03/16(水) 01:04:12.83
>>53
リークしません。プログラム内にかかれた文字列はコンパイル時に実行ファイル内に組み込まれるからです。
55デフォルトの名無しさん:2011/03/16(水) 01:11:41.77
>>54
嘘付いちゃいけないね
56デフォルトの名無しさん:2011/03/16(水) 01:24:27.11
リークってメモリリーク?
57 ◆QZaw55cn4c :2011/03/16(水) 01:24:45.71
>>55
ほう、どこが嘘なんですか?
文字リテラルは静的に確保されると思いますがね。
58デフォルトの名無しさん:2011/03/16(水) 01:27:54.97
>>57
質問内容を読んでないでしょ
59 ◆QZaw55cn4c :2011/03/16(水) 01:47:48.15
>>58
リークしないか、という質問ですから、リークしない、と答えたまでですが、その過程のどこで「質問を読んでいない」と判断したのですか?
60デフォルトの名無しさん:2011/03/16(水) 01:58:32.19
>>59
strに格納される文字列データ≠プログラム内にかかれた文字列
61 ◆QZaw55cn4c :2011/03/16(水) 02:40:42.20
>>60
いや、この場合、
str が指すポイント先のasciiz文字列=静的領域に確保された asciiz 文字列
でしょう。
62デフォルトの名無しさん:2011/03/16(水) 02:46:51.16
>>61
何で質問内容を自分に都合の良いように書き換えちゃうの?
63 ◆QZaw55cn4c :2011/03/16(水) 03:12:52.75
>>62
え?リークするかしないかでしょう?
じゃあ、リークしないんじゃないですか?
「リークする」という言葉の定義があなたと私で違うのかもしれませんが。
64デフォルトの名無しさん:2011/03/16(水) 03:14:19.61
>>63
何で質問内容を自分に都合の良いように書き換えちゃうの?
65デフォルトの名無しさん:2011/03/16(水) 03:14:44.97
62は話し相手を求めているだけw
66デフォルトの名無しさん:2011/03/16(水) 03:16:02.49

>自分のミスを指摘されても覚えてませんっていうアホが何言ってんだw

どっかで言われてますね
67デフォルトの名無しさん:2011/03/16(水) 03:17:07.81

>まともな反論とやらが今までにありましたか?例を示してください。

これは誰の発言?
68デフォルトの名無しさん:2011/03/16(水) 03:23:03.88
天の声
69デフォルトの名無しさん:2011/03/16(水) 04:28:23.53
>>53
リークしません。プログラム内にかかれた文字列はコンパイル時に実行ファイル内に組み込まれるからです。



リークしません。strに文字列が格納されるのではなく、strは文字列リテラルをポイントするだけだからです。
勿論、文字列リテラルはリークしません。
70 [―{}@{}@{}-] デフォルトの名無しさん:2011/03/16(水) 07:05:12.03
リークするのはお前の脳みそだけにしておけ
71 ◆QZaw55cn4c :2011/03/16(水) 07:19:09.72
>>69
「そして、文字列リテラルは、実行ファイル内に組み込まれる存在です。」を追加してください。
72デフォルトの名無しさん:2011/03/16(水) 07:46:53.60
それだけ説明すると、文字列リテラル以外の全てが実行ファイルに組み込まれるかどうかの疑問が生じてしまう。
従って、態々説明することではない。尤も、変数の初期値が実行ファイルに組み込まれることを知らない人もいるようだがw
73デフォルトの名無しさん:2011/03/16(水) 09:39:45.05
>>71
>「そして、文字列リテラルは、実行ファイル内に組み込まれる存在です。」を追加してください。

こんな当たり前のこと、追加する必要ないだろう
74 ◆QZaw55cn4c :2011/03/16(水) 12:37:45.10
初期値を持つ静的変数でも、その初期値が 0 ならば実行ファイルに組み込まれない環境もありました。
75デフォルトの名無しさん:2011/03/16(水) 13:24:13.30
71 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
74 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
76VBプログラマ: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
:
}
77デフォルトの名無しさん:2011/03/16(水) 18:48:25.63
ハンドル破棄してないのが気になるけど通信自体はそれでできるんじゃね。
78デフォルトの名無しさん:2011/03/16(水) 18:50:10.22
でも、非同期に通信するスレッド作るのはいいけどそのスレッドは一通信毎に終了するのか?
そうであれば結構重い気がするし、そうでないならメイン側とのI/Fを設計するのが厄介だと思う。
79デフォルトの名無しさん:2011/03/16(水) 19:03:09.75
>>76
何をしようとしているのかさっぱり分らんが大丈夫だ
8076:2011/03/16(水) 19:06:28.59
早速のレス御礼申し上げます。

>>77
>ハンドル破棄してないのが気になるけど通信自体はそれでできるんじゃね。
すみません。ハンドル破棄のCloseHandleを忘れました。

>>78
>でも、非同期に通信するスレッド作るのはいいけどそのスレッドは一通信毎に終了するのか?
>そうであれば結構重い気がするし、そうでないならメイン側とのI/Fを設計するのが厄介だと思う。
一通信毎に終了するのか、各スレッド内でループで回して、アプリケーション終了時に一斉クローズするのか悩んでます。
81デフォルトの名無しさん:2011/03/16(水) 19:11:22.07
>55>58>60>62>64

以前にもいい加減なこと言う奴いたよな
82デフォルトの名無しさん:2011/03/16(水) 19:32:26.02
>>81
奴は、いい加減な上に、売名だから
83デフォルトの名無しさん:2011/03/16(水) 19:46:27.27
>>82
お前がコテハン付けとけ
84デフォルトの名無しさん:2011/03/16(水) 20:11:40.64
>>83
そういうときは自分からつけろ
85デフォルトの名無しさん:2011/03/16(水) 21:16:08.49
そして、そーとこのスレを閉じる

86デフォルトの名無しさん:2011/03/16(水) 22:58:53.88
某所で
void(^block)(int i)=^(int i){printf("%d\n",i);};
というソースをみたんだが,どういう書式?呼称とかある?
87デフォルトの名無しさん:2011/03/16(水) 23:29:11.08
staticな関数内で宣言されたauto変数ってスタックに積まれる?
88 ◆QZaw55cn4c :2011/03/16(水) 23:40:04.93
>>87
積まれます。C で static な関数というのは、単に関数名をリンカに公開するかしないかだけの違いです。
89デフォルトの名無しさん:2011/03/16(水) 23:47:13.35
>>88
出てくるなカス
90デフォルトの名無しさん:2011/03/16(水) 23:49:57.82
>>88

必ず 「積まれます」 か?嘘つき
91デフォルトの名無しさん:2011/03/16(水) 23:58:18.84
コテハンに突っかかってる奴はコテハンに恨みでもあるのか
92デフォルトの名無しさん:2011/03/16(水) 23:59:27.89
>>91
荒らしだから、嫌われてる
93 ◆QZaw55cn4c :2011/03/17(木) 00:03:21.54
>>90
そだった、そだった、賢いコンパイラのことを忘れていた。たとえば lsi-c なんかは積まれるとは限りませんね。
94 ◆QZaw55cn4c :2011/03/17(木) 00:04:17.62
>>91
http://hibari.2ch.net/test/read.cgi/tech/1295273862/
ふつー自分で紹介するか‥‥。
95デフォルトの名無しさん:2011/03/17(木) 00:07:58.12
スレ一覧とか見ないから
そんなスレあったの知らんかったわw
96デフォルトの名無しさん:2011/03/17(木) 00:09:38.02
>>92
自分自身で荒らしと決め付けた相手をスルーできないなんて
自分は狂ってますと自己紹介してるようなもんだなw
97デフォルトの名無しさん:2011/03/17(木) 00:23:07.62
こうしてキチガイの ◆QZaw55cn4c はますます嫌われ者になって行くのであった
98デフォルトの名無しさん:2011/03/17(木) 01:05:35.57
つっかかってる奴はもっと勉強して欲しい
なんかウザコテがマシに見えて逆効果
99デフォルトの名無しさん:2011/03/17(木) 01:12:25.03
>>98
自演乙
100デフォルトの名無しさん:2011/03/17(木) 01:38:19.72
>>86
Objective C の Blocks では?
10176:2011/03/17(木) 03:05:27.45
79さん、ありがとうございます。
102デフォルトの名無しさん:2011/03/17(木) 19:13:47.67
>>98
それをしたいためだけに>>53からのくだらないやり取りを自演してたのかと思って
>>98を書いてるのを見つけたときにはどうしようかと思った。
簡単に言うと>>99
103デフォルトの名無しさん:2011/03/18(金) 14:18:36.12
仮想関数リストや、特定のメソッドのインスタンスへのポインタを参照して、
メソッドがオーバーライドされているかを比較するにはどうすればいいですか?
例えば以下のようなコードで
http://ideone.com/qpNgh
104デフォルトの名無しさん:2011/03/18(金) 20:00:35.31
>>103
if( typeid(*this) == typeid(A) )
105デフォルトの名無しさん:2011/03/18(金) 20:34:12.23
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)" は未解決です。
のようなエラーが出て躓きました
何がおかしいのでしょうか
106デフォルトの名無しさん:2011/03/18(金) 20:35:11.56
>>103
それを知ってどうしようというのかね。何か歪んだことをしてそうな気がする。
107デフォルトの名無しさん:2011/03/18(金) 20:49:19.17
108デフォルトの名無しさん:2011/03/18(金) 21:25:30.33
>>103
そうしたくなる時点で設計としてなにか問題があると思うけど
それはともかく、標準の範囲では無理じゃねーの

移植性とかそういうの全部捨ててコンパイラの内部実装ベッタリの
アセンブラで書けば、書けるだろう
109デフォルトの名無しさん:2011/03/20(日) 00:50:24.26
>>107
ありがとうございます
とりあえずできました
110デフォルトの名無しさん:2011/03/22(火) 21:54:06.04
これってなんでだめなんでしょうか?

template<typename T> T::a_type aaaaaa(T t){return t.a(); }

111デフォルトの名無しさん:2011/03/22(火) 22:02:48.09
誤: T::a_type
正: typename T::a_type
112デフォルトの名無しさん:2011/03/22(火) 23:02:30.78
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;
}

いけるけど?
113111:2011/03/23(水) 06:40:02.47
>>112
すまん。おれは>>110とは別人だ。
>>110はtypenameが足りなかったんだよ。
114デフォルトの名無しさん:2011/03/24(木) 01:40:24.08
msvcrt.dllって64bit版もあったんだな
当時そんなもんあったわけないし、msvcr71.dllは32bit版だけだったと思うけど……
64bit版のJavaのbinディレクトリにあるし、よくみたらSxSの下にあったわ

もしかしてすでにVC6ランタイムの皮かぶってるだけの別物?
64bit版のmsvcrt.dllにリンクするプログラムってどうやって作ってるんだろう
115デフォルトの名無しさん:2011/03/24(木) 02:21:20.73
WOWならx86_64としてビルドすればよいのではないの?
116デフォルトの名無しさん:2011/03/24(木) 02:52:38.79
>>115
ごめんちょっと意味が分からない……

VC6には64bitターゲットのコンパイラは無かったし
最近のVCではMSVCRT.DLLとは別のCランタイムとリンクするので
どうやっているのだろう?という素朴な疑問です
VC6のヘッダも多分x86ベッタリでそのまま使えないだろうし
117デフォルトの名無しさん:2011/03/24(木) 08:40:20.62
64ビットプロセスは起動すると勝手に64ビットのライブラリと
リンクする。

Windows SDK 7.1についてるヘッダをインクルードしてSDK 7.1の
64ビット版インポートヘッダ(.lib)でビルドしておけばよいだけ。
118デフォルトの名無しさん:2011/03/24(木) 09:51:57.71
VS2005のころってmsvcrt.dllつかってなかった?
119デフォルトの名無しさん:2011/03/24(木) 10:07:22.80
>>117
あーWindowsSDKにはついてるのか、サンクス

>>118
VS2003はmsvcr71.dll
VS2005はmsvcr8.dll
VC6の頃とはABI互換性が無いので名前も変わってる
120デフォルトの名無しさん:2011/03/24(木) 12:15:43.25
User CPU、 System CPU、 Idle CPUの各値を取得する方法を教えてください 
環境はUbuntu10.10、gcc4.4.5です。
121デフォルトの名無しさん:2011/03/24(木) 12:47:25.75
つ[man 1 time]
122117:2011/03/24(木) 19:28:30.70
>>119
Visual Studio 2010 Proならプラットフォームに「x64」を指定する。
ExpressならWindows SDK 7.1を入れて、プロジェクトのプロパティー
の「プラットフォームツールセット」にSDKを指定する必要あり。
コマンドラインからビルドしない限り.libを指定する必要は無い。
123デフォルトの名無しさん:2011/03/24(木) 20:05:23.14
>>122
いやVS2010で普通にx64でビルドすると、AMD64版のmsvcr100.dllにリンクされない?
124117:2011/03/24(木) 23:11:37.40
>>123
細かいことを言うな。Platform SDKのmsvcrt.lib(64ビット版)とリンクすんだよ。
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5
 dumpbin /imports msvcrt.lib
 cl.exe /MD test.cpp msvcrt.lib
125デフォルトの名無しさん:2011/03/25(金) 19:12:09.18
秘密鍵に32バイトの認証ハッシュ値をつけて、アクセス時にパスワードで
認証する機能をつけたいのですがうまくいきません。秘密鍵の計算方法が
正しいかどうかもわからないので公開します。lkbを呼び出すとループの
値が0にリセットされて無限ループになります。機能は動いたはずなのに
今朝動かしたら動かなくなっていました。下にソースのアドレスを書きます。
わかる人がいたらよろしくお願いします。

http://codepad.org/55oSSY2H

126デフォルトの名無しさん:2011/03/25(金) 21:47:06.37
この質問はほかのすれで対応中です。
127デフォルトの名無しさん:2011/03/25(金) 21:49:10.47
>>125
まず秘密鍵、といいますが、暗号はなにか方式教えてください。
ハッシュ、といいますが、ハッシュの方式を教えてください。
話はそれからだと思います。
128デフォルトの名無しさん:2011/03/25(金) 22:22:34.08
for が入れ子のとき、

bool sex = false;
for (〜;〜;〜) {
  for (〜;〜;〜) {
    sex = true;
  }
  if ( sex ) break;
}

とするべきか、

for (〜;〜;〜) {
  for (〜;〜;〜) {
    goto SEX;
  }
}
SEX:

とするべきか。
手続き型言語にgotoは不要だが、この場合はgotoを使った方が良い希ガスる。
別に可読性がそこまで下がっているようにも見えないし。
129 ◆QZaw55cn4c :2011/03/25(金) 22:25:22.08
>>128
私ならば可読性を重視して後者をとります。
130デフォルトの名無しさん:2011/03/25(金) 22:29:21.26
>>129
thx
131デフォルトの名無しさん:2011/03/25(金) 22:38:00.02
>>128
おれなら
C++ではthrow
Cなら関数
だな
132デフォルトの名無しさん:2011/03/25(金) 22:45:31.72
>>127
オリジナルのストリーム暗号です。
オリジナルのハッシュ関数です。
133デフォルトの名無しさん:2011/03/25(金) 22:48:10.67
>>128
入れ子の片方のforがbreakしてないから等価じゃないな
134デフォルトの名無しさん:2011/03/25(金) 22:53:25.20
>>128はgotoを使っていい数少ないケースとしてしばしば話題になる。
同時に、例外を使ってはいけないとされるケースだ。
135デフォルトの名無しさん:2011/03/25(金) 23:08:30.72
関数案を支持します
136デフォルトの名無しさん:2011/03/25(金) 23:54:04.13
何度も何度も論争になるいいネタだよね。

俺は当然 多重ループからの脱出は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;
}
138デフォルトの名無しさん:2011/03/26(土) 09:21:19.36
139デフォルトの名無しさん:2011/03/26(土) 09:31:38.69
>>138
ありがとうございます。
140 [―{}@{}@{}-] デフォルトの名無しさん:2011/03/26(土) 14:59:54.90
分かったら分かったことをここに書いて情報を共有しろ
141デフォルトの名無しさん:2011/03/26(土) 17:36:45.59
>>128
今更だが、俺はエンドフラグ(主にintと型数値にしている)派だ。
どんな理由で終了したかデバッグ時に一目で分かるのと。
終了する意味が2通り以上ある場合がありので。
エンドコードで統一している。
いっとくが、goto先2ヶ所は、邪道だ!
142デフォルトの名無しさん:2011/03/26(土) 17:57:30.83
>>141
ループごとにメソッドにしてやればgoto使わなくてすむんじゃないのかな?
143デフォルトの名無しさん:2011/03/26(土) 17:57:50.76
http://hibari.2ch.net/test/read.cgi/tech/1295800051/ で誘導されてきました。宜しくお願いします。

UI含めたマルチスレッドプログラミングを始めてやって、
考え方に躓いています。
(Win32bit VS2010 C++ SDK ATL/WTL 使いです。)

作ってるのは、メインウィンドウで特定のオペレーションがあった場合、
キャンセル可能な処理中ウィンドウを表示するという一般的なものですが、
どのように考えるのが一般的ですか??

とりあえず現在、
<メインウィンドウ>
 ・処理中ダイアログを生成
 ・スレッド生成
 ・時間のかかる処理
 ・ダイアログクローズメソッド呼び出し(その後スレッドが自動的に終了)
 ・ダイアログを破棄

<スレッド>
 ・ダイアログをモーダルで表示
 ・WM_TIMER で処理中アニメーションしながらキャンセル待ち
 ・メインウィンドウから進捗メソッドが呼ばれたらプログレスバーを更新

みたいにやっているのですが、オブジェクト指向的にどうもスッキリせず、またインスタンスをスレッドに
渡していることがOS上タブーなようで。。。また、親ウィンドウの HWND も正しく取れません。(スレッドが違うから?)

皆さんは普段どのように設計していますか?
・・・メインウィンドウでダイアログを生成/モードレス表示して、
スレッドで時間のかかる処理をして、そのスレッドの完了をメインウィンドウで待つのかな・・・
そうすると、ダイアログのメッセージループは誰が処理するの・・・??もう1つスレッドが要る??

教えてエロい人!!!
144デフォルトの名無しさん:2011/03/26(土) 18:16:15.48
>>143
ここもスレ違い。

http://msdn.microsoft.com/ja-jp/library/cc410690.aspx
http://msdn.microsoft.com/ja-jp/library/cc364825.aspx
http://support.microsoft.com/kb/71450/ja

これ読んでも分からないようなら
Win32スレに行ったほうがいい
145デフォルトの名無しさん:2011/03/26(土) 18:29:18.89
>>143
・メイン画面とダイアログはメインスレッドにする
 処理のみサブスレッド化
・ダイアログでタイマー回して処理サブスレッドの状況を表示
・とりあえずメイン画面はサブスレッドに直接アクセスしないよう
 作ってみる

画面がいくつあろうとできる限りUIスレッドは一つにした方がよい。
ただエクスプローラーの様に一つの画面が処理待ちで固まると
他の画面も固まるため、どうしてもという場合だけUIスレッドを複数にする
146143: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
148デフォルトの名無しさん:2011/03/26(土) 23:36:09.62
>147
上の方でも書いてた人だろうけど悪い事言わないから独自ハッシュと暗号なんて窓から投げ捨てるべきだと思う。
それはそれとして詳細追っかける気はないけど挙動からするとグローバル変数とか何らかの初期化ミスっぽいからその辺調べてみたら?
149デフォルトの名無しさん:2011/03/27(日) 01:40:11.69
>>148
独自の暗号は思うほど強くないから危険だって
私もなんかの本で読んだ。
150デフォルトの名無しさん:2011/03/27(日) 03:09:35.11
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はサイズに限界でもあるのでしょうか
ストリームを使ったことがあまりないのでもっと他に間違いがあるのでしょうか
151デフォルトの名無しさん:2011/03/27(日) 10:25:33.39
>150
oStream.flush() してみればどうかな。
152デフォルトの名無しさん:2011/03/27(日) 11:34:31.87
理論的に安全性が証明できるハッシュ関数なんです。
しかしそれも実装次第。うまくいけばお慰みです。
153デフォルトの名無しさん:2011/03/27(日) 13:06:11.90
>>151
ありがとうございました
すべて出るようになりました
154デフォルトの名無しさん:2011/03/27(日) 15:34:29.59
>>152
おまえおめでたい奴だな
自分のコードのバグも解析できないくせに何が安全だ
お前が数学者ならプロの技術者に依頼しろよ
お前が技術者ならさっさと辞めてそのたいそうな理論を外注しろ
そうすればみんな幸せ
車輪のオナニー再発明なら頑張ってデバッグしな坊や
155デフォルトの名無しさん:2011/03/27(日) 15:49:48.50
>>154
核心を突きすぎ
だいたいこんなところで聞いてる奴の言っていることだからな
156デフォルトの名無しさん:2011/03/27(日) 15:51:32.15
車輪のオナニーは、まだ発明されてないかも
157デフォルトの名無しさん:2011/03/27(日) 17:04:51.06
すごく初歩的な質問なのですが、以下のコードが正しく動作するのはなぜなのでしょうか

const std::string &s = "foo";

158デフォルトの名無しさん:2011/03/27(日) 17:19:52.18
>>157
const参照はなんか特殊だってばっちゃが言ってた
159デフォルトの名無しさん:2011/03/27(日) 20:29:07.01
お勧め"しない"本/著者ってなんかある?
"こういう内容のは怪しいと思え"とかがあれば、本を選ぶ時の参考にしたい
160デフォルトの名無しさん:2011/03/27(日) 20:36:06.46
void main()と書いてある解説書は怪しい
161デフォルトの名無しさん:2011/03/27(日) 20:36:39.80
おまじない
162デフォルトの名無しさん:2011/03/28(月) 03:03:42.58
>>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万というのはけっこうな大金なので、買おうか迷っています。
良いメリットがあるなら、教えてください。
164デフォルトの名無しさん:2011/03/28(月) 17:18:50.73
Express Editionならタダだが、どうしても買いたいの?
まずはVS2010Express入れてみたら
165デフォルトの名無しさん:2011/03/28(月) 17:26:50.62
>>164
Express Editionはもう入れているんですが、
Standard Editionで、良い機能とかあるなら買いたいです。

あと、Express Editionには、MFCがないので・・
166デフォルトの名無しさん:2011/03/28(月) 17:55:16.35
有料版だったらアドオンが使えるとか
俺もEEだから実際に使ったことはないけど紹介見る限り結構開発に便利そうなのもあった
167デフォルトの名無しさん:2011/03/28(月) 18:04:37.76
今のEEにはリソースエディタは付いているのかな?
.rc をテキストエディタで作成/編集するのは泣ける
168デフォルトの名無しさん:2011/03/28(月) 18:10:13.89
>>165
あーそういうことか
.NETに関してはVS2005(.NET2.0)じゃお話にならないけど
VC++ならそれほどでもないかな
どうしてもC++0x系の機能が欲しいんなら駄目だけど

ただVS2005, VS2008はCランタイムがサイドバイサイド(SxS)化されてて
扱いがちょっと面倒くさい
VS2010でCランタイムに関してSxSが廃止されて元に戻った
(manifestも要らなくなった)んで、VS2010のが楽
この二世代は、この点で、ある意味黒歴史って感じだ
169デフォルトの名無しさん:2011/03/28(月) 18:11:35.44
>>167
リソースエディタはフリーでもあるでしょう
勿論UI要素をクリックしてMFCのイベントハンドラを記述するみたいな
連携は望むべくもないけど
170デフォルトの名無しさん:2011/03/28(月) 18:15:42.33
2005のスレあるじゃん
171デフォルトの名無しさん:2011/03/28(月) 18:16:01.68
>>169
そういう連携は期待していないんで…
フリーであるのか。 探してみよう
172デフォルトの名無しさん:2011/03/28(月) 18:33:13.12
MFCを欲しがる人がまさか本当に実際にいたことを確認できて何か嬉しい。
173デフォルトの名無しさん:2011/03/28(月) 18:39:38.02
個人的にはATL/WTLしか使ってない
ただ、MFCは2010のSP1ではDirect2Dサポートが加わったりしてるようだし
一応進化し続けてると言えるのでは
WTLはもうとまっちゃったからなー
174デフォルトの名無しさん:2011/03/28(月) 19:31:57.42
>>170
あるのはVSのスレだろ
VC(MFC)しか必要ないからVSは目に入らなかったんじゃないか?
175デフォルトの名無しさん:2011/03/28(月) 20:29:47.48
ATL使いたいんだけどやっぱり有料版買うしかないのかな?
176デフォルトの名無しさん:2011/03/28(月) 20:32:13.45
>>163
MFCメインみたいだけど、VC6からVS2005だとあまり変わらないかもね
VS2008SP1でのリボンUIサポート、VS2010SP1でのD2Dサポート位しか大きい変化って記憶にないな
177デフォルトの名無しさん:2011/03/28(月) 21:41:47.21
メリットといえば、IDE自体が使いやすくなっているというメリットがありはする。
あと安定性という点で、可能なら2008以降の方がいいと思う。
178デフォルトの名無しさん:2011/03/29(火) 17:26:55.77
LinuxでCPU使用率が100%でないかどうかを調べる方法を教えてください
179デフォルトの名無しさん:2011/03/29(火) 17:32:33.87
すみません。C++に直接関係なく数学寄りな質問で申し訳ないのですが、
1200個のものを、70個の箱(配列)に分けつつ、
・1箱目が一番多く、徐々に減って、70個目は1個しかない 
・1箱目が一番多く、徐々に減って、70個目は1箱目の半分しかない
等という事を実現したいのですが、こうしたプログラムの解説サイトをどなたかご存知でないでしょうか?
180デフォルトの名無しさん:2011/03/29(火) 18:04:26.24
>>179
台形の面積を求めるのと買わんない>>179
(上底+下底)×高さ÷2
これが分かればいけるでしょ

面積は1200平方、高さは70、上底は1、下底は1より大きい
面積は1200平方、高さは70、上底はx、下底は2x
181179:2011/03/29(火) 18:39:59.90
>>180
ありがとうございます。最初解りませんでしたが
理想に近い結果を得る方法がわかりました。スレ違い失礼しました&ありがとうございました。
182デフォルトの名無しさん:2011/03/29(火) 22:48:02.82
>>178
ロードアベレージが1超えてなければ100%じゃないんじゃないのかな
183デフォルトの名無しさん:2011/03/29(火) 23:45:35.31
>>178
vmstatコマンドで、idleの値を見るのは?
184デフォルトの名無しさん:2011/03/30(水) 04:12:55.31
STLのlistでinvalidなiteratorをeraseするとexceptionがthrowされず
プログラムが落ちるのですが、これを回避するすべはないでしょうか?
走査するくらいしか思いつきません
185デフォルトの名無しさん:2011/03/30(水) 04:34:14.88
itr = l.erase(itr);
186デフォルトの名無しさん:2011/03/30(水) 04:44:19.26
>>184
iterator を持ってる間は erase() しない。
erase() した iterator はすぐ捨てる。
187デフォルトの名無しさん:2011/03/30(水) 05:32:12.44
>>185,186
ありがとうございます
無効なイテレータを持ち続けないようにします
188デフォルトの名無しさん:2011/03/30(水) 07:03:21.25
wininetのHttpQueryInfoで最終更新日時のタイムスタンプがほしいのですがどうしたらいいでしょうか
189188:2011/03/30(水) 07:56:32.96
よく調べたらIf-Modified-Sinceというヘッダを送ればステータスコードで更新されたかどうかわかるようなのですが
送るための日付をHttpQueryInfoから文字列で取り出す方法が分かりません
またこのヘッダを送るというのは"If-Modified-Since:日付"をInternetOpenUrlの引数で渡せばいいのでしょうか
質問が変わりましたがよろしくお願いします
190デフォルトの名無しさん:2011/04/02(土) 22:26:44.47
質問です。

Cをそこそこやっています。C++は少しかじった程度です。
VC++を使っています。

今までコンソールベースのプログラムしか書いてこなかったのですが、
ボタンやテキストボックス等があるグラフィカルなものを作りたいと思っています。

「win32アプリケーション」というのを勉強するのが良いのでしょうか?
それとも、Javaが良いでしょうか?
それと、もし良い本があれば教えてください。
191デフォルトの名無しさん:2011/04/02(土) 22:27:37.38
今なら、C#が良いんじゃね
192デフォルトの名無しさん:2011/04/02(土) 22:28:38.99
>>190
マルチしてんじゃねえ、このグズやろう。
193デフォルトの名無しさん:2011/04/02(土) 22:31:59.67
ちょろっとラムダ式とbind(0xの方)で遊んでたんだけど
bind系じゃないと実装できねぇよ、的な事って何かある?
194デフォルトの名無しさん:2011/04/02(土) 22:43:51.02
ない
195 ◆LLLLLLLLL. :2011/04/03(日) 09:37:20.42
| ̄:/ : : /: : : : : : : :i: : : i: :\ : :\    \
|: / : : : / : : : : :.i: : : : |: : : :|: : : |: : : i     '
: :|: : : : |: : i: : : :|: : : /i|: : :|:| : : :|: : : |     |
: :|: : : : |: :.|:斗 十‐/ i|: :∧-‐ト|: : : |     |
: :|: : : : |イ|: :|:/ |:/   |:/ |ハ: : |: : : |  \_,ノ
: :|: : : : | レヤ示ト     rテv|:./|: : : :|
ヽ|: : : : |/{:::::::i }     トイ レ: :|/|/   関東地方 
( |: : : : 代c::ノソ     レリ |: : : : |       東北地方 北海道地方
.〈.|: : : : |x`¨       、¨x.|: : : i:|    にいる
\|i: : : :|        ,   /|: : : i:|      すべての 愛すべき 国民へ 告ぐ
∨リ\: :iト 、      `´ ィ  |: : /|リ      
‐┴―\|- 〈 >rァ 爪|V  |/
:::::::::::::::::::::::ヽ \ リ
::::::::::::::::::::::::__\
:::::::::::::::/ ::r――‐へ      rっr‐-、_
:::::::::/ :://      ∧. | ̄ ̄ ̄| | | | | ̄ ̄ ̄ ̄ ̄ ̄ ̄|..
:::/ ::/ /          ヽ|.    L|_|_ト'           |
/ ::::/  /         \   ただちに 逃げろ    |
. :::/ |/           |                 |.
196デフォルトの名無しさん:2011/04/03(日) 10:09:09.66
忍法帖まとめ

忍法帖は名前欄に
!ninja
とすれば出てくる。
って最近知った。どれどれ

●だか買うと最終書き込みから5分経過すればレベルが一つ上がるらしい。
そうじゃない人は24時間経過すればレベルが一つ上がるらしい。
あと、cookieの設定がうまくいってないとレベルが上がらないらしいから、
何日たってもレベル0,1の場合はHap cookieの設定をチェックだ。

レベル10以上になると
Lv=NN,xxxP『T』
ってなってスレ立てできるようになるらしい。
197 忍法帖【Lv=4,xxxP】 :2011/04/03(日) 12:52:33.13
!ninja
198 忍法帖【Lv=1,xxxP】 :2011/04/03(日) 12:55:51.27
!ninja
199 忍法帖【Lv=5,xxxP】 :2011/04/03(日) 13:26:39.51
本文は適当で良かったはず
200 【東電 81.0 %】 忍法帖【Lv=4,xxxP】 :2011/04/03(日) 13:30:00.80
!denki !ninja
201 [―{}@{}@{}-] 忍法帖【Lv=1,xxxP】 :2011/04/03(日) 14:03:13.26
!ninja
ほうほう
203 忍法帖【Lv=7,xxxP】 :2011/04/03(日) 16:00:08.50
このスレでやるなぼけ共
204デフォルトの名無しさん:2011/04/03(日) 18:28:18.74
205 【東電 83.6 %】 忍法帖【Lv=3,xxxP】 :2011/04/03(日) 19:15:45.74
!denki !ninja
206デフォルトの名無しさん:2011/04/05(火) 15:37:41.75
複数の状態の組み合わせとして、ビットフラグを使って
|や&で演算する方法をよく見ますが、32個とかしか表現できませんよね?

極端な例で128個の組み合わせを管理しようとすると、
どのような方法になるのでしょうか?
207デフォルトの名無しさん:2011/04/05(火) 15:51:56.06
32*4
208デフォルトの名無しさん:2011/04/05(火) 18:57:22.40
bool128個の配列で持てばいいだろ。
何でそんなにビットフラグが好きなんだ
209デフォルトの名無しさん:2011/04/05(火) 19:01:13.71
std::bitset
210デフォルトの名無しさん:2011/04/05(火) 19:50:43.88
西日本も福島原発の放射能に曝される。

4/7 予測 http://up3.viploader.net/ippan/src/vlippan198234.jpg
発表はドイツ気象庁 http://www.dwd.de/
211デフォルトの名無しさん:2011/04/05(火) 21:15:49.69
vector<char>::iteratorにオフセットを加算したときout of rangeとならないようにする方法は
++しつつ!= iterator.end()をチェックする方法以外にありますでしょうか?
よろしくお願いします。
212デフォルトの名無しさん:2011/04/05(火) 21:42:09.53
>>211
std::vector なら size() で先に分かるじゃないか
213デフォルトの名無しさん:2011/04/05(火) 23:26:40.96
>>212
vector<char>::iteratorの位置が不定なので、size()の情報を元に算出する方法がわからないのですorz
214デフォルトの名無しさん:2011/04/05(火) 23:27:54.50
誰か訳してくれ
215デフォルトの名無しさん:2011/04/06(水) 00:18:26.18
ビットフラグは加算していくだけで全ビットの状態の組み合わせが表せるけど
std::bitsetも簡単にそういうことできるんだっけ
216デフォルトの名無しさん:2011/04/06(水) 00:34:49.45
>>213
不定なら、どこ指しているのか分らんのだから、!= iterator.end()したらだめだろ
不定ならiteratorなんて使えない

217デフォルトの名無しさん:2011/04/06(水) 01:06:49.14
>>214,216
std::searchとかで戻ってきたiteratorなのでどこかは指してます
218デフォルトの名無しさん:2011/04/06(水) 01:20:42.14
if(std::distance(it, end()) < offset)
219デフォルトの名無しさん:2011/04/06(水) 01:22:22.16
>>213
int( it - vect.begin() )
で何番目を指してるか分かるんじゃねーの?
220デフォルトの名無しさん:2011/04/06(水) 02:08:00.03
>>215 bits = bits.to_ulong() + 1
221デフォルトの名無しさん:2011/04/06(水) 02:21:17.25
>>220
でもいったんキャストするとなると結局long longの64bitで最大64個の組み合わせまでしかインクリメントで全表示できない?
まあそんなに多くの状態数が計算に必要だとしたら、そもそも計算時間的に問題有りなのかもしれないけど
222デフォルトの名無しさん:2011/04/06(水) 02:30:14.57
>>221
組み合わせひとつごとの処理が仮に1ナノ秒で済んだとしても、
65ビット目がインクリメントされるまでに500年以上かかるぞ。
223デフォルトの名無しさん:2011/04/06(水) 05:40:30.86
>>218-219
std::distanceで解決しました。ありがとうございました
224デフォルトの名無しさん:2011/04/06(水) 13:43:18.64
end-offset < it
よりdistanceのほうがよさげだった
225デフォルトの名無しさん:2011/04/06(水) 21:47:28.54
>>222
だよな
まあ実際に計算するわけじゃなくて、なんとなく気になったから聞いてみた
226デフォルトの名無しさん:2011/04/07(木) 16:32:25.15
>>224
どっち使っても一緒。ランダムアクセクイテレータに対しては-演算子を使うように特殊化されてるから。
227デフォルトの名無しさん:2011/04/07(木) 16:37:38.37
排他制御について教えてください。 Linux環境でファイルを読み書き
する共有ライブ ラリを作成していて、
その共有ライブラリが複数プロセスから
ファイ ル名を指定されて呼ばれます。
共有ライブラリ内でファイルアクセス毎に
semget()して排他制御をしているんですが、
プロセスからこき使われると、
セマフォ集合を削除する 暇がなくて、
semop()時に指定しているSEM_ UNDOの
累積がSEMVMXに達してしまいどうしようか考えています。
そもそも、ライブラリ内で排他をかけてるのが 間違ってるのでしょうか?
228デフォルトの名無しさん:2011/04/07(木) 17:52:44.92
暇がなかろうがする必要があることはしなきゃだめ
(暇があってもする必要がないことはしない方がいい)

SEM_UNDO必要あるの?
229デフォルトの名無しさん:2011/04/07(木) 18:31:40.92
共有ライブラリで、セマフォ作っているので、アンドゥしていない場合

ロックをした状態の時に、プロセスが
強制終了されると、手動でセマフォを
削除するか、システムを再起動しないと
動かなくなってしまいませんかね?
230デフォルトの名無しさん:2011/04/07(木) 18:59:56.68
単位はあくまでもプロセス
231デフォルトの名無しさん:2011/04/07(木) 19:13:40.88
親プロセスが、セマフォの責任もてる設計にしないと、
問題があった場合に対象できない
ということですか?
232デフォルトの名無しさん:2011/04/07(木) 21:20:59.49
共有ライブラリじゃなくて、ファイル管理プロセスにする訳にはいかなかったんだろうか。
233227:2011/04/08(金) 16:36:57.82
ありがとうございます。
プロセスでセマフォを制御してもらえる
様に調整してみますね。
234 忍法帖【Lv=3,xxxP】 :2011/04/08(金) 18:13:06.66
Cのソースファイルがあるのですが、Linux上でWindows向けの実行ファイルを作成することはできるのでしょうか?
235デフォルトの名無しさん:2011/04/08(金) 18:34:42.23
使ってるディストリがmingw32パッケージ用意してたらそれ入れろ
236デフォルトの名無しさん:2011/04/09(土) 04:40:12.31
クロスコンパイルでggr
237デフォルトの名無しさん:2011/04/10(日) 04:43:10.93
すみません。
2重のfor文の処理中に、その2重のfor文全域を抜けてしまいたい場合、continueでは思い通りに行かない為
gotoとラベルで抜けているのですが、他にもっとマトモなやり方が有ったりするのでしょうか?
238デフォルトの名無しさん:2011/04/10(日) 05:50:45.01
関数に切り出してreturnが定石
239デフォルトの名無しさん:2011/04/10(日) 05:58:25.29
break代わりならreturnでもいいけど
continue代わりならgotoでもいいんじゃないかな
240デフォルトの名無しさん:2011/04/10(日) 08:58:00.69
>>237
continueでは思い通りでなくgotoで抜けているコードの実例を頼む。
抜けているのはループじゃなくて頭じゃないかって気がするんだ。
241 [―{}@{}@{}-] デフォルトの名無しさん:2011/04/10(日) 09:00:26.03
breakがreturn代わりになるのか
242デフォルトの名無しさん:2011/04/10(日) 12:57:04.24
http://ideone.com/DhfKI
速度がどうなるかはシラネ
243デフォルトの名無しさん:2011/04/10(日) 14:01:59.95
C言語で無名関数(?)ってなんかきもいな
244デフォルトの名無しさん:2011/04/10(日) 21:50:07.74
何を言っているんだお前は
245237:2011/04/10(日) 23:38:17.04
>>238-241
頭が抜けておりますた。 continueじゃなくてbreak2回ですね。
gotoは使うべきではないとあちこちに書いてたから
その外に抜け出そうと使って良い物かと考えていましたが、なんとか大丈夫そうですね。
ありがとうございました、そして勘違いすみませんでした;
246 忍法帖【Lv=12,xxxPT】 :2011/04/11(月) 14:07:46.89
break2回を許容したということだろうか
247デフォルトの名無しさん:2011/04/11(月) 15:33:07.38
速度を気にするなら内側のループをインライン関数にしてreturnの値から
外側のループを抜けるかどうか判断するのが妥当なきがするけどな。

まあステータス変数をもってあげても良いと思うよ。

まあ何はともあれループ内にだらだら処理を書かないなら適当にさばいときゃ良いと思う。
248 忍法帖【Lv=5,xxxP】 :2011/04/11(月) 17:09:03.04
SSDに書き込みをする際に、注意する点を教えてください。
一キャラクタずつ書き込むのは、SSDにはよくないのでしょうか?
249デフォルトの名無しさん:2011/04/11(月) 17:18:08.34
>>248
ブロックデバイスってのはセクタ単位で読み書きするものだ
プログラムから、ディスクなどのブロックデバイスに対して
セクタの整数倍になってない適当なサイズでのwriteが可能に見えるのは
背後でランタイムやOSがバッファリングしてまとめ書きするから
250デフォルトの名無しさん:2011/04/11(月) 18:13:37.28
でもバッファリングしない設定になってたりするよね。
ドメコンのシステムドライブとか
251デフォルトの名無しさん:2011/04/11(月) 19:27:32.39
物理的にセクタ単位でしか読み書きできないわけだから
セクタサイズにアラインさせるための最低のバッファリングは常にされるよ

もっともWindowsの話で言うと、FILE_FLAG_NO_BUFFERINGでファイル開いた場合は
OSレベルのバッファリングが切れるが、その場合、WriteFile()に渡すバッファを
セクタ長にアラインさせ、きっかりセクタサイズの倍数で書き込むのがユーザの
責任になる(つまり、いずれにせよ1バイト単位では書き込めない)



252デフォルトの名無しさん:2011/04/11(月) 19:55:13.49
>>237
try (...) {...} catch (...) {...}
253デフォルトの名無しさん:2011/04/11(月) 20:13:07.80
2重ループ脱出を主目的に例外を使いたくないな。
254デフォルトの名無しさん:2011/04/11(月) 21:28:35.74
NO_BUFFERINGにしないと遅くなる致命的バグがあったが。
最新版では直っている。
細かいファイルの書き出しは速くはならないから、
バッファつきでまとめて書き出すと良い。
255デフォルトの名無しさん:2011/04/11(月) 21:29:49.43
そういうケースでは、そこを関数化してreturnしてしまえ。
256 [―{}@{}@{}-] デフォルトの名無しさん:2011/04/11(月) 22:32:16.55
フラグを別途用意してフラグが立っていたらループを抜けるなんていうやり方をする男の人は軽蔑されるべき
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台のクライアントのうちどのクライアントから
受信したかどうかわかるんでしょうか?

258デフォルトの名無しさん:2011/04/11(月) 22:54:42.31
>>257
ドキュメントに書いてあるだろ
ttp://www.jp.freebsd.org/cgi/mroff.cgi?sect=3&subdir=man&lc=1&cmd=&dir=jpman-7.2.2/man&man=FD_ISSET

>FD_ISSET(fd, &fdset) は fd が fdset のメンバである場合は非 0 の値
>を、そうでない場合は 0 を返します。

N個のクライアントと通信してるのなら、listenソケット以外に、
N個のソケットを使ってて、それらをfdsetに入れてselect()で監視してるはずだ
その一つ一つについて、(普通はループを回して)FD_ISSETでトリガかかかったか
チェックするんだよ

効率がわるいと思うか?
その通り、だから今はselect()より移植性においては劣るが、改善された関数が
いくつか作られている
259デフォルトの名無しさん:2011/04/11(月) 23:05:22.09
それ以前に>>257はTCPを理解していない。
260デフォルトの名無しさん:2011/04/11(月) 23:17:25.19
>>251
勉強になったありがとう
261デフォルトの名無しさん:2011/04/11(月) 23:20:58.15
>>258
ありがとうございます。

fd_issetは一つのfdしかチェックできないということは、
クライアントの台数分だけfd_issetでチェックしなければならないってことですよね?
今回のように接続してくる台数が変わるときは、どのようにfd_issetでチェックするのが効率がいいんでしょうか?

ttp://x68000.q-e-d.net/~68user/net/c-echo-2.html
この例だと1024個のfdをselectの中のfor文で全部チェックしてますが、あまり効率がいいとは思えません。。。

262デフォルトの名無しさん:2011/04/11(月) 23:24:55.98
>>261
いやだから、select()を使う以上はそうしなければならないのであって
本質的に効率が悪いんだよ

もっと効率がいい云々と書いたのは、FD_ISSETマクロの話じゃなくて
select()自体の話
Unix系ならepoll(), kqueue()
WinsockならIOCPについて調べるといい
263デフォルトの名無しさん:2011/04/11(月) 23:28:23.95
>>261
1024個を同時にselectするのはアホだと思うが、
FD_ISSETの1000回ループごとき、測定限界以下の時間しか
かからんだろ。
264デフォルトの名無しさん:2011/04/11(月) 23:28:28.78
>>262
案の定というか。わかってくれなかったな。。
265デフォルトの名無しさん:2011/04/11(月) 23:29:30.28
>>262
なるほど。。。
ありがとうございました。

selectを使うのが条件なので、接続してきた台数をカウントして
その分だけチェックするのが一番効率いいですかね。
266デフォルトの名無しさん:2011/04/11(月) 23:33:41.86
>>265
ダメ
「台数」とかアバウトな話じゃなくて、ちゃんと使ってるfd管理しろ

たとえば
std::vector<int> clients
のようなベクタにクライアントのfd入ってるとしたら、
fdsetにセットするのも
FD_ISSETでテストするのも、単にベクタの要素をループするだけだろ?
267デフォルトの名無しさん:2011/04/11(月) 23:35:56.16
>>261
std::list<SOCKET>
268デフォルトの名無しさん:2011/04/11(月) 23:39:20.15
>>266
大事なのは台数じゃなくてfdの最大値でしたね。
失礼しました。。。
269デフォルトの名無しさん:2011/04/11(月) 23:43:57.21
今時C/C++で手でネットワークプログラミングしようとするのは
殊勝な心がけだが、やるんならStevensのUnix Network Programmingが
必読書だから読んどけ

ちゃんと読んだらこのレベルの質問をする必要はなくなる
270デフォルトの名無しさん:2011/04/12(火) 00:00:23.57
はいはい。俺が読んだ本は最低限の必読書
今時ソケットプログラミングにC/C++を持ち出すのは
時代錯誤としか言いようがない
271デフォルトの名無しさん:2011/04/12(火) 00:06:53.72
なんだどうした
272デフォルトの名無しさん:2011/04/12(火) 00:10:07.40
ソケットプログラムなど万人が必要で無い。
273デフォルトの名無しさん:2011/04/12(火) 00:15:57.15
それ「ソケット」抜いても一緒……
っていうか何でム板のC/C++スレとかにいるの君達
274デフォルトの名無しさん:2011/04/12(火) 01:16:53.18
Javaの場合、メモリの断片化が発生すると、ガベージコレクトして
くれるのですが、C++の場合も同じですか?
例えば、オブジェクトの生成や破棄をランダムに繰り返した場合など。
275デフォルトの名無しさん:2011/04/12(火) 01:20:39.38
>>274
ガベージコレクタは標準ではありません。
対象環境を限定したライブラリとしてならガベージコレクタを組み込むこともできますが。→ BoehmGC
276デフォルトの名無しさん:2011/04/12(火) 01:22:35.15
ガベージコレクタなんてなくて、すぐさまOSに返却する。
コンパクションが無いのはJavaもC++も同じ
277デフォルトの名無しさん:2011/04/12(火) 01:29:03.52
>>276
× コンパクションが無いのは
○ コンパクションされるかどうか決まってないのは
だよね?
278デフォルトの名無しさん:2011/04/12(火) 01:33:55.13
言語として提供されてないということだけで書いてしまった。
実装依存なのかな。にわか知識でスマソ。
279デフォルトの名無しさん:2011/04/12(火) 01:54:18.69
>>276-278
ありがとうございます
280デフォルトの名無しさん:2011/04/12(火) 01:55:03.10
>>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){}
}
こんな感じに書けないものかと考えています。
方法はありますでしょうか?
よろしくお願いいたします。

282デフォルトの名無しさん:2011/04/15(金) 14:21:48.18
C++ が 言語仕様上 多重継承を許しているのでどうしようもないのではないだろうか?
同一単語で区別する術が無いよね
283デフォルトの名無しさん:2011/04/15(金) 14:30:37.44
>>282
はい。C++の標準化委員会(というのでしょうか?)の方々も同一見解で、superの予約語化は見送ったらしいです。
一応「多重継承で、呼び出し先が曖昧な時はエラーにする」というのが最初の案だったそうですが。

VSは独自に__superを作ってくれていたので、こちらを使いました(がコンストラクタには使えませんでした)
284 [―{}@{}@{}-] デフォルトの名無しさん:2011/04/15(金) 18:47:10.11
多重インクルード防止の仕組みを入れて何回でもincludeしてやる
285デフォルトの名無しさん:2011/04/15(金) 20:12:33.13
>>281
予約語じゃなくてもよければtypedefを使ったらどう?
各クラスの中で書く必要があるけど。
(質問の趣旨を誤解してたらスルーしてくれ)

class Child : public Parent
{
typedef Child thisClass;
typedef Parent baseClass;
thisClass(const Hoge &hoge):baseClass(hoge){}
}

このthisClassやbaseClassというのはATL/WTLで使われてる表記方法
286デフォルトの名無しさん:2011/04/15(金) 20:48:43.75
>>285
横からだが、ナイスだと思ったw
むしろなぜ今までこれを思いつけなかったか、
ちょっと自分を責めたい。
287デフォルトの名無しさん:2011/04/15(金) 23:25:01.55
cout の代わりにファイルに多倍長整数を書き込む関数があったら教えて
ください。標準入力のリダイレクトのような感じです。
よろしくお願いします。
288デフォルトの名無しさん:2011/04/15(金) 23:28:51.88
ファイルストリームに書けばいいだけじゃん。
289デフォルトの名無しさん:2011/04/18(月) 10:25:38.95
>>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の基本クラスでもメンバでもありません」
というエラーになりました。

十二分に今件の要件を満たせます。
ありがとうございました。
290デフォルトの名無しさん:2011/04/20(水) 22:58:15.90
std::maにおいて
キーにstd::string
値をchar型の配列の先頭ポインタ

としたいのですが、可能でしょうか?
291デフォルトの名無しさん:2011/04/20(水) 23:02:21.72
mapです。すいません
292デフォルトの名無しさん:2011/04/20(水) 23:02:51.23
例えばc_str()の値をそうやって別に保存させて使うのってよくないんじゃなかったっけ?
strdup(c_str())とかして確保しなおしてたらまぁそれは平気か。
293デフォルトの名無しさん:2011/04/21(木) 00:37:33.05
>>290
stringはoperator<が定義されているから出来るよ
294デフォルトの名無しさん:2011/04/21(木) 01:18:38.42
>>290
可能であるのが明らかなので何を疑問に思っているのかわからない。
295デフォルトの名無しさん:2011/04/21(木) 16:27:02.78
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のヘルプ見たんですがよくわからないのでここで解決できればと思い書きました。
宜しくお願いします。
296デフォルトの名無しさん:2011/04/21(木) 16:35:31.85
297デフォルトの名無しさん:2011/04/21(木) 17:36:02.61
>>295
char *nengoのサイズがわからないから、
strcpy_s()を使うのをやめるか、

int wtoj(int wyear,char *nengo, int nengoSize, int *jyear)
{
if (wyear >= 1868 && wyear <= 1911) {
strcpy_s(nengo, nengoSize, "明治");

みたいに引数を増やしてサイズを渡すとか。
298デフォルトの名無しさん:2011/04/21(木) 20:11:36.44
なぜヘルプ見てもわからないのか。馬鹿なの?
299デフォルトの名無しさん:2011/04/21(木) 23:07:16.05
どうでもいいけど、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
http://live.nicovideo.jp/watch/lv46627143
よろしくお願いします
302デフォルトの名無しさん:2011/04/21(木) 23:58:32.12
>>300
std::vector<std::vector<int> > hoge(n, std::vector<int>(num));

あとでresizeすればいかようにも変更可能
303デフォルトの名無しさん:2011/04/21(木) 23:59:43.60
nはどこで定義するのでしょうか?

ちなみにpush_backして要素を入れていくつもりです
304デフォルトの名無しさん:2011/04/22(金) 00:03:37.72
305デフォルトの名無しさん:2011/04/22(金) 00:13:22.43
>>303
だって二次元配列でしょ?
取りあえず0を入れておいてresize()すればいいし

>ちなみにpush_backして要素を入れていくつもりです

もちろんOK
306デフォルトの名無しさん:2011/04/22(金) 00:28:36.18
こんな感じ
気を付けるべき点は、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;
}
307デフォルトの名無しさん:2011/04/22(金) 00:56:37.03
>>304
>>300 の要件で boost つかっていいなら std::vector<boost::array<...> > だろう。

multi_array は std::vector みたいに効率的で例外を投げない swap() を持ってないとか、
いろいろ問題が放置されたままになってる。
https://svn.boost.org/trac/boost/query?status=!closed&component=multi_array
308デフォルトの名無しさん:2011/04/22(金) 01:23:04.84
すまん雑用で席を外していた
こうすれば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のたびに仲間が増えるよ、ぽぽぽぽ〜ん!
310デフォルトの名無しさん:2011/04/22(金) 10:29:00.53
ブーストのムルティアレイは使いにくいよな
311デフォルトの名無しさん:2011/04/22(金) 15:38:13.89
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

上記を実現するには同プログラム書けばいいんでしょうか?
普通の九九はできました。
312デフォルトの名無しさん:2011/04/22(金) 15:53:00.39
>>311
そのできたプログラムを貼ってご覧。
313デフォルトの名無しさん:2011/04/22(金) 16:10:18.06
数字を表示するところに if 文を入れて三角形の上か下か判断して数字を表示するかしないかすればいいと思います
314デフォルトの名無しさん:2011/04/22(金) 16:18:27.42
プログラム、1文字も出来てないです
315デフォルトの名無しさん:2011/04/22(金) 16:20:08.09
>>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;
}
これです。
316デフォルトの名無しさん:2011/04/22(金) 16:28:06.75
>>315
--
printf("%3d",x*y); /* 九九の表示 */
--
これを
--
printf(x < y ? " " : "%3d", x * y); // 空白は3個
--
にすればOK。もう一方は、不等号を逆にすればいい。
317デフォルトの名無しさん:2011/04/22(金) 16:29:42.17
規則性を探すのが一番手間だな
上三角形 i行目は i*1 〜 i*i の羅列
下三角形 i行目は i*i 〜 i*9 の羅列

出力形が >>311 通りにあわせようとすると、フォーマットの仕方が厄介か?
(下三角形の 1 の行だけ先頭空白無し: 例外的に出し方を変える?)
318317:2011/04/22(金) 16:33:05.68
ごめん。 アンカー経由で見たら出力がぜんぜん違うやんorz
319デフォルトの名無しさん:2011/04/22(金) 16:33:45.55
320319:2011/04/22(金) 16:35:12.84
すまんリロードしてなかtったC言語か
321デフォルトの名無しさん:2011/04/22(金) 16:43:13.99
>>316
>>319

ありがとうございました。

思っていた物が出来ました。

色々勉強不足な点もありますが、これから頑張ってやります。
322デフォルトの名無しさん:2011/04/22(金) 20:13:12.72
template<class T>
class Hoge
{
typedef Hoge<T> Fuga;
};
この時Fugaの変わりにどんな名前をつけるのが一般的ですか?
323デフォルトの名無しさん:2011/04/22(金) 21:06:15.21
>>322
this_type とか多そう。
324デフォルトの名無しさん:2011/04/22(金) 21:17:25.99
>>323
なるほど
ありがとうございます
325デフォルトの名無しさん:2011/04/22(金) 22:21:46.32
なんかそれには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;
}
327デフォルトの名無しさん:2011/04/23(土) 00:08:21.43
>>326
当たり前過ぎて何が判らないのか判らない。
親クラスのコンストラクタなら、子クラスの初期化リストで明示的に呼び出しているじゃないか。
328デフォルトの名無しさん:2011/04/23(土) 00:10:18.42
>>326
よく分からんが順番のこと?
http://codepad.org/Uvndpy7r
329328 :2011/04/23(土) 00:11:28.66
330デフォルトの名無しさん:2011/04/23(土) 00:25:33.15
>>327
>>328
どうもありがとうございます。
確かに呼び出してますねw
それでは以下の場合は、
子クラスの初期化リストに明示的に書かなくても
自動でデフォルトの親クラスコンストラクタを呼んでるってことですか。
ttp://codepad.org/aYLzcqXg
331デフォルトの名無しさん:2011/04/23(土) 00:28:34.47
>>326
>どうも納得いきません
に納得いきません
332デフォルトの名無しさん:2011/04/23(土) 00:31:34.91
>>330
そう、もちろん引数なしコンストラクタの場合だけど
親のコンストラクタに引数を入れないとダメなら明示的に呼び出す必要がある
333デフォルトの名無しさん:2011/04/23(土) 00:36:17.56
>>332
よくわかりました。
ありがとうございます。
なんでこんなのことで悩んでたんだろう。
334デフォルトの名無しさん:2011/04/23(土) 00:51:07.67
vectorをメンバーに含む構造体の配列をnewで確保しても問題ありませんか?
335デフォルトの名無しさん:2011/04/23(土) 00:51:43.74
ありません
336デフォルトの名無しさん:2011/04/23(土) 01:02:04.08
>>334
すでに vector 使うんなら配列 new なんかせずに vector 使っとけばいいのに、と思う。
337デフォルトの名無しさん:2011/04/23(土) 06:40:53.91
よく""で括ったりするけど、"が複数ある場合どれが括るものでどれが実際の文字としての"か
ってどういう風に見てるの?
338デフォルトの名無しさん:2011/04/23(土) 06:45:38.77
>>337
エディタやIDEが色付けしてくれる
339デフォルトの名無しさん:2011/04/23(土) 08:05:04.23
>>337
>よく""で括ったりするけど、"が複数ある場合どれが括るものでどれが実際の文字としての"か
>ってどういう風に見てるの?

ダブルクォーツ自体を文字列リテラルに入れたいなら、バックスラッシュでエスケープ。
言語によっては違うが、それはスレ違いなので割愛。
340デフォルトの名無しさん:2011/04/23(土) 08:41:17.46
ごめん日本語変だった。アルゴリズム的にどうやって判断してるかってことです。
例えばスペースやドット、コンマで各文字列を区切ってるテキストファイルで""で括ってる
部分は区切り文字があっても、文字列の一部ですよって判断したいんだけど、後ろの方まで
見に行く効率の悪い方法しか思い浮かばない
341デフォルトの名無しさん:2011/04/23(土) 08:51:20.99
C言語のコンパイラの話か。
C言語の文字列は"を扱えて区切り文字では無いが。
エスケープシーケンスつかえ。
342デフォルトの名無しさん:2011/04/23(土) 11:11:56.75
エクセルの吐くCSVとかの読み取り方法を聞きたいんじゃないの
最後まで見ないとどっちかわからんしょそれ
343デフォルトの名無しさん:2011/04/23(土) 12:29:13.26
>>340
モードを切り替えるようにして詰んでるのかも。
rubyのヒアドキュメントの実装はそういうふうになってたような希ガス。
344デフォルトの名無しさん:2011/04/23(土) 16:40:00.07
" があったら次に " が出てくるまで全て通常文字とみなす、では駄目なの?
345デフォルトの名無しさん:2011/04/23(土) 16:44:56.38
>>340
普通はその効率の悪い方法でパースする。
346デフォルトの名無しさん:2011/04/23(土) 16:59:16.91
>>344
まぁ、\"の出現をケアしたほうがいいだろうね。
347デフォルトの名無しさん:2011/04/23(土) 21:55:59.08
VS2005、Releaseモードでコンパイルしたファイルは
開発環境と異なるOSでも動くと聞いたのですが、
Win7で作ったexeをVistaで動かそうとすると「ヒープが壊れている」
といわれて強制終了されてしまいます。(稀に強制終了しないこともあり)
(Win7だと強制終了しません)

デバッグできないので何が原因なのかわかりません。
こういった場合、どのように原因を特定したらよいのでしょうか?
csvファイルのデータを変数に格納しているところがあやしいような気がします。
348デフォルトの名無しさん:2011/04/23(土) 22:07:59.72
>>347
動的確保のメモリ確保、解放まわりのバグが無いか
(多重解放、アクセス違反等)
しっかりチェックしてみては?
開発PCではバグが顕在化しなかっただけかもしれない
またVC++2005 再頒布可能パッケージ関連とは違うのかな?
349347:2011/04/23(土) 22:14:23.25
>>348

>動的確保のメモリ確保、解放まわりのバグが無いか
>(多重解放、アクセス違反等)
>しっかりチェックしてみては?

コードを見直してみます。アクセス違反とはNULLポインタのことですか?

>またVC++2005 再頒布可能パッケージ関連とは違うのかな?

違うと思います。そもそも無知で何のことかわかりません・・・。
350デフォルトの名無しさん:2011/04/23(土) 22:23:51.86
debugモードとreleaseモードではメモリ配置が違うから
このモードの違いでエラーが出たり解消したりする場合、メモリ確保開放や
アクセス違反辺りのバグの可能性が高いとどこかで聞いたことがある
351デフォルトの名無しさん:2011/04/23(土) 22:26:15.17
>>347
まずメインが開始される前に落ちているのかどうかを
ログやメッセージボックスで確認。
少しでも自分の書いたプログラムが実行されているなら
どこで落ちているかをログで確認できるはず。
352デフォルトの名無しさん:2011/04/23(土) 22:50:52.76
>>347
7だとFault Tolerant Heapのおかげで動いてるだけだろ
ページヒープとかCRTデバッグヒープとか活用してデバッグしようず
353デフォルトの名無しさん:2011/04/23(土) 23:09:34.75
>>352
そんな機能あったのかw
ttp://msdn.microsoft.com/ja-jp/library/dd744764(v=vs.85).aspx
これで無効にして7でも落ちるか?
354デフォルトの名無しさん:2011/04/23(土) 23:13:11.97
なんか面度そうな機能だな
355347:2011/04/23(土) 23:22:20.64
皆さん回答ありがとうございます。

>>351
VistaPCは手元にないので、月曜日までに特定できなかったら試してみます。

>>352
CRTデバッグヒープってのをやってみたいんですが、ググってもよくわかりません。
コードにどのように記述したらいいかヒントを教えていただけませんか?

>>353
ページ内の、システムでフォールト トレラント ヒープを完全に無効にするには、
REG_DWORD 値 HKLM\Software\Microsoft\FTH\Enabled を 0 に設定します。

これのやり方がよくわかりません・・・
356347:2011/04/23(土) 23:38:08.83
連投すみません。

>>353
HKLM\Software\Microsoft\FTH\Enabled がレジストリエディタに見つかりません。

という意味です。
357デフォルトの名無しさん:2011/04/23(土) 23:39:13.35
358デフォルトの名無しさん:2011/04/23(土) 23:40:35.51
switch文でstd::stringがそのままでは使えないんですが、

どうするのが一般的ですか?if文をたくさん書く?
359デフォルトの名無しさん:2011/04/23(土) 23:49:38.73
>>358
用途が判らんからなんとも言えんが、テーブルを作る。
360347:2011/04/23(土) 23:50:56.04
>>353
>>357

無効にしてみましたが、Vistaの現象は起きませんでした。
361デフォルトの名無しさん:2011/04/23(土) 23:51:16.21
>>358
あんましいい方法見当たらないな
ttp://www.codeguru.com/cpp/cpp/cpp_mfc/article.php/c4067
ここに妥協案レベルのものがあったが正直微妙じゃないか
362デフォルトの名無しさん:2011/04/23(土) 23:57:22.15
>>359
テーブルを元にfor文まわすみたいな感じですかね?
363デフォルトの名無しさん:2011/04/23(土) 23:58:23.98
>>360
そうかぁ
でもまあメモリの多重解放あたりがやはり可能性高いんじゃないだろうか
怪しいと思うコード晒してみては?
364デフォルトの名無しさん:2011/04/24(日) 00:11:54.57
>>342-346
ありがとうやっぱ後ろまで見て決めるしかないのね
365 [―{}@{}@{}-] デフォルトの名無しさん:2011/04/24(日) 00:20:01.05
ポインタにNULLを入れておけば何回でもdeleteできる
366デフォルトの名無しさん:2011/04/24(日) 01:57:08.45
丸括弧内で宣言した変数のスコープを教えてください
367デフォルトの名無しさん:2011/04/24(日) 02:21:37.59
関数定義の丸括弧内に書く引数のことなら、関数内のみ
368デフォルトの名無しさん:2011/04/24(日) 02:24:19.06
>>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の方がよいと誰かに教わったのですが、理由を忘れてしまいました。
何故でしたでしょうか・・?

ご教示いただけますと幸いです。
370デフォルトの名無しさん:2011/04/24(日) 19:41:45.38
>>369
stringをvectorにコピーしてreverse()とか。

インクリメントが前置の方がいい理由は、自前のクラスのインクリメント関数を作ってみれば判る。
要は、後置インクリメントはコストが嵩むこともあるだろうから普段から前置にしておいた方が無難ということ。
371デフォルトの名無しさん:2011/04/24(日) 19:49:02.30
同一バッファ内で逆順にするやり方。

#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;
}
372デフォルトの名無しさん:2011/04/24(日) 19:50:29.39
>>370
vectorにコピーしなくてもつかえるんじゃね?

std::string s = "12345";
std::reverse(s.begin(), s.end());
373369:2011/04/24(日) 19:59:16.17
>>370
>>371
>>372
ありがとうございます。勉強になります。

>>369のやり方でも、間違いではない、のでしょうか。
>>371 のやり方ですと、コードは増えますが、効率はよくなる、のでしょうか。
ループの回数が少なくて済むように見えますが、トータルではどのやり方がいちばんよいのでしょう。
場合にもよるとは思うのですが・・。
374デフォルトの名無しさん:2011/04/24(日) 21:21:08.51
>>369
逆反復子を使えばどうだい?
rbegin(), rend(), reverse_iterator
コンテナの中身はそのままでアルゴリズムに掛ける事が出来る
375デフォルトの名無しさん:2011/04/24(日) 21:43:22.84
>>372
これ面白いな
376デフォルトの名無しさん:2011/04/24(日) 22:37:50.39
>369
とりあえず誰も指摘してないみたいなので。
new_str の領域が確保されてないからメモリ破壊してる。
push_back するか、string new_str(str.size(), ' '); とか。

全体としては、rbegin(), rend() で済むならそれで。駄目なら std::reverse でいいんじゃね。
377デフォルトの名無しさん:2011/04/25(月) 03:18:39.96
>>315
なんか見たことあるコードですね
378デフォルトの名無しさん:2011/04/25(月) 21:03:34.89
shared_ptrを引数にするとき参照と値渡しどっちが効率いいですか?
379デフォルトの名無しさん:2011/04/25(月) 21:10:16.77
>>378
sizeof()やってみて決めればいいじゃない
380デフォルトの名無しさん:2011/04/25(月) 21:14:28.89
>>379
ありがとうございました 少ないほうを選べばいいんですね
381デフォルトの名無しさん:2011/04/25(月) 21:31:03.73
>>378
参照って
void Func(shared_ptr<hoge>& p)
って意味?
当然参照の方が早いがこのオーバーヘッド気にするならスマポ使うなという
考えになるが
382347:2011/04/25(月) 21:41:05.36
Win7のリリースモードでビルドしたプログラムが
Vistaで落ちてしまうという相談をした者です。

今日Vistaのリリースモードでデバッグしてみたのですが、
途中の変数をウォッチすると見れなかったり値がおかしかったりするのですが、
これはリリースモードだと普通なのでしょうか?
383デフォルトの名無しさん:2011/04/25(月) 21:50:03.39
>>380
素朴な疑問なんだけど、スマポを値渡しするとその関数がスマポを返してくる
場合を除いて、関数の終了時に保持しているリソースを解放してしまうよね
危なくね?
384デフォルトの名無しさん:2011/04/25(月) 21:52:31.00
>>383
なんでだよ
コピーされたら参照カウント増えるだろうが
385デフォルトの名無しさん:2011/04/25(月) 21:55:00.93
あう
ごめん
auto_ptrと勘違いしてた
386デフォルトの名無しさん:2011/04/25(月) 21:56:53.47
>>385
ああそっちか確かにauto_ptrを渡すのは危険だな
387デフォルトの名無しさん:2011/04/25(月) 22:06:52.73
>>382
はい
より速く実行できるように命令の順番を入れ替えたり使い終わった変数は早々に消去してしまったり
もっと後の方まで計算を遅らせたり計算方法を組み替えたり不要な計算を省略したり
色んな最適化でソース通りのコードの流れではなくなってるので
ソース通りの変数の値がその場に存在しなくなっていることはあります
もちろんそういう最適化は最終的に得られる結果が変わらないように行なわれるわけですが
それはプログラムが完全に正しくてC++の規格に反したことは一切行っていないという前提でですね
C++の規格に沿った動作を保証できる範囲内で、可能な限り速く動くように、コードを改良するわけです
C++の規格で動作が保証されてないようなプログラムは、もちろん、動作が保証されません
388デフォルトの名無しさん:2011/04/26(火) 21:36:13.26
◆QZaw55cn4cって糞だよなぁ
389デフォルトの名無しさん:2011/04/26(火) 21:48:49.97
vector<bool> の特殊化を無効にする方法ないですか?
390デフォルトの名無しさん:2011/04/26(火) 22:02:50.50
bitsetを使いましょう
391デフォルトの名無しさん:2011/04/26(火) 22:10:08.72
なぜboolに拘るのか
392デフォルトの名無しさん:2011/04/27(水) 15:39:46.96
cを始めてやるんですが、まず基本を勉強するにあたりよいサイトとか教えてください。
cの基本が終わったら、c++をやろうと思います。
こちらもよいサイトとか教えてください。
393デフォルトの名無しさん:2011/04/27(水) 15:57:44.69
>>392
Cの基本はともかく、中級以上になったらこれお勧め。

C/C++の宿題片付けます 147代目
http://hibari.2ch.net/test/read.cgi/tech/1301553333/l50

ここで、宿題を回答しているうちに力がつく。
394デフォルトの名無しさん:2011/04/27(水) 17:17:50.95
>>390
boost::dynamic_bitsetの方が便利じゃね?
395デフォルトの名無しさん:2011/04/27(水) 18:35:35.14
>>392
ここがいいと思う
ttp://www7b.biglobe.ne.jp/robe/cpphtml/index.html
さらっと見て、
何か作りながら必要になったら詳しく見ていく、
というやり方だと長続きしやすいと俺は思う
396デフォルトの名無しさん:2011/04/27(水) 18:40:04.05
>>393
>>395
ありがとうございます。

参考にやってみます。
あと、宿題も>>395さんの所で勉強しつつわかればやってみますねー

感謝です。
397デフォルトの名無しさん:2011/04/29(金) 09:32:07.60
ぶっちゃけ基本覚えちゃったらWin32APIなりに取り掛かってGUIで作り始めた方が
楽しく上達できると思うよ。
こんな機能を作りたい→どうすれば出来るんだろう→試行錯誤とアルゴリズムの勉強
って感じで、こっちの方が意欲的に取り掛かれると思う。少なくともおれはそうだった
正直CUIだと作っても相当凄いの作れないと実用的じゃないしつまらないよね
398デフォルトの名無しさん:2011/04/29(金) 16:06:39.89
あんまし早いうちにウィンアプリ作ると変な癖付きそう
399デフォルトの名無しさん:2011/04/29(金) 16:09:51.48
>>398
例えばどんなのが変な癖だと思いますか?
400デフォルトの名無しさん:2011/04/29(金) 16:13:33.30
宗教論争的ではあるがハンガリアン記法
401デフォルトの名無しさん:2011/04/29(金) 16:55:02.25
記法なんて必要に応じて使い分ければいいだけだから
気にすることはないんじゃないかな
Xlibよりは情報は多いし学びやすいんじゃないかな
402デフォルトの名無しさん:2011/04/29(金) 17:36:00.02
入門編にイベントドリブンは敷居高いんじゃねーの
403デフォルトの名無しさん:2011/04/29(金) 17:38:46.18
確かにイベントドリブンでうまく作用させるために
提供側が示している作法に従わないといけないという制限が付くからなぁ…
404369:2011/04/29(金) 17:50:02.64
レスいただいた方々、ありがとうございましたm(_ _)m
色々やり方がありますね・・
とても勉強になりました。
405デフォルトの名無しさん:2011/04/29(金) 19:41:48.26
>>400
よくそういうクセが付くっていうけど、別にクセじゃないよね。
ハンガリアンが有効でないって思ったらその瞬間に辞められるし。
406 忍法帖【Lv=22,xxxPT】 :2011/04/29(金) 20:41:37.38
そうでもない。変な癖は抜ける人と全く抜けない人がいる。
407デフォルトの名無しさん:2011/04/29(金) 21:18:29.68
たとえば最初にハンガリアンの環境でプログラムを覚えたもんだから、
それ以降ハンガリアンで書くべきだって信じて考えを改められない
レベルの人は、最初たまたまいい環境で覚えられたとしても、それ以降
変な知識(クセ)にそまってしまったらどのみちダメになるでしょ。

スポーツのフォームじゃないんだから、クセが抜けないってのは
ただの勉強不足。
408デフォルトの名無しさん:2011/04/29(金) 21:31:43.19
>>407
文章は適度な長さに分けないと誰にも理解されないよ。
プログラミングもまたしかり。
気をつけなよ。
409デフォルトの名無しさん:2011/04/29(金) 21:34:06.16
三行と四行が理解できる、できないの境界なのか。
410デフォルトの名無しさん:2011/04/29(金) 21:35:14.05
別にクセじゃないと思う。
使うと開発効率が極端に悪くなるなんて事があるのかな?
411デフォルトの名無しさん:2011/04/29(金) 21:38:27.33
コーディングをスポーツのアナロジーで捕らえて「クセがつく」って
おかしな話だよな。

たしかに「おまえ10年前に入門書読んでそれで知識が止まってるだろ」みたいな
ヤツがいるけど、それはクセが抜けないんじゃなくてヘボいだけだ。
412デフォルトの名無しさん:2011/04/29(金) 21:48:17.56
>>409
>>407は1文が4行続いてる
どう考えても長すぎ。改行の位置も悪いし。
413デフォルトの名無しさん:2011/04/29(金) 21:52:32.99
>>412
たしかに「改められないレベルの人は」の途中で切ると読みにくいな。
でも手で改行するから位置とか考えるの面倒。
414デフォルトの名無しさん:2011/04/29(金) 21:57:43.36
>>407
リファクタリングしてやんよ。

最初覚えた知識だけを信じ込んでしまう人は、
ハンガリアンに関わらずどのみちダメでしょ。
クセというよりただの勉強不足が問題。
415デフォルトの名無しさん:2011/04/29(金) 21:57:58.65
自分の記述スタイルについては適当なんだ?
416デフォルトの名無しさん:2011/04/29(金) 22:11:26.85
また反論できなると、日本語がおかしいとか用語がおかしいとか
言い出す連中か。
417デフォルトの名無しさん:2011/04/29(金) 22:15:43.60
自分の勝手な想定を、勝手にたたき出すマッチポンパー。
418デフォルトの名無しさん:2011/04/29(金) 22:35:22.36
反論を前提にしてるバカがいる時点で終わってる
419デフォルトの名無しさん:2011/04/30(土) 06:12:50.87
でもその人って、最初にいい環境で学ぶと、悪いクセはつかないんじゃないの?
方針をかたくなに変えないんでしょ。
420デフォルトの名無しさん:2011/04/30(土) 10:30:21.77
>>419
CからJavaにやってきて、あいかわらずCライクなコードを書いてる
ベテランとか、そんな感じになるな。

まあ、そういうのは基本勉強不足だからCでもヘタクソだけど。
421デフォルトの名無しさん:2011/05/01(日) 00:15:27.83
ttp://codepad.org/zIRgls2c

こういうことって仕様的におkなの?
定数(右辺値?)のアドレスとっていいのかな
422デフォルトの名無しさん:2011/05/01(日) 00:20:55.83
おkですよ
一時オブジェクトが作られてそのアドレスが取られる
423デフォルトの名無しさん:2011/05/01(日) 11:52:14.31
const参照を調べると少し面白い
424デフォルトの名無しさん:2011/05/01(日) 13:25:51.28
定数だから、一時オブジェクトを生成しなくてもいいよ。

やってることは
const char* str="hoge";
と同じだと気付けば何の疑問も無いだろ?


425デフォルトの名無しさん:2011/05/01(日) 14:33:55.09
違うだろ
一時オブジェクトもアドレスが取れるのか試してみたかったんだろ
426デフォルトの名無しさん:2011/05/04(水) 17:26:58.93
パフォーマンスを図るために
コンストラクタで関数名と時間を記録
デストラクタでまた時間を記録
データを保存
関数の最初にマクロでカウンターオブジェクトを宣言
みたいな感じでやってるんだけど
これだと再帰関数のデータが重複して計算されてしまう
なるべく少ないてまで再帰関数をうまくルート呼び出しだけ調べる方法はある?
427デフォルトの名無しさん:2011/05/04(水) 18:20:49.39
再帰関数を呼ぶだけの関数を用意するくらいしかないんじゃね?
428デフォルトの名無しさん:2011/05/04(水) 20:26:40.16
>>426
邪道といわれるかもしれないが、
グローバル変数使えばいいんじゃないの
関数名をキーにして
タイマが動いているかのフラグを立てる
429デフォルトの名無しさん:2011/05/04(水) 22:23:32.74
>>426
再帰関数外で計測しないと計測クラスの生成廃棄コストで誤差だらけにならないか?
430デフォルトの名無しさん:2011/05/04(水) 22:28:31.67
デストラクタでCな関数を呼び出して記録するとか
431デフォルトの名無しさん:2011/05/05(木) 10:59:59.06
開始
 再起1
  再起2
   ・・・
  再起2終わり
 再起1終わり
終了

となるから開始時刻と終了時刻が入れ子になってる分をデータから無視すればいい
432デフォルトの名無しさん:2011/05/08(日) 00:37:16.21
「何かの左上の座標」を意味する変数名が思いつきません。
教えてくださいTopLeft以外でお願いします
433デフォルトの名無しさん:2011/05/08(日) 00:50:26.46
UpperLeft
434デフォルトの名無しさん:2011/05/08(日) 01:07:52.00
double 左上X, 左上Y;
これで問題ないと思うが。
435デフォルトの名無しさん:2011/05/08(日) 01:19:18.36

Flashの共有オブジェクトを読み書きできる
C++のライブラリはありませんか
OSはWindows環境を想定しています。

(マイクロソフトの他の言語のライブラリでもよいです。)

よろしくお願いします。
436デフォルトの名無しさん:2011/05/08(日) 01:31:47.71
Flashの共有オブジェクトはFlash専用なんだからFlashで読め。
C++で読もうとするシステム設計を見直した方がいい
437デフォルトの名無しさん:2011/05/08(日) 01:38:19.87
>>433
ありがとうございます
438デフォルトの名無しさん:2011/05/08(日) 01:38:49.96
仮想関数を持つクラスをmemcpyするのは問題ですか?
439デフォルトの名無しさん:2011/05/08(日) 01:48:18.30
あたりまえだろ。
440デフォルトの名無しさん:2011/05/08(日) 01:49:28.81
クラスのコピーは仮想関数なくても問題出る場合がある。
コピー関数か代入演算子を実装して使ったほうがいい。
441デフォルトの名無しさん:2011/05/08(日) 01:59:10.88
memcpyが保証できるのはPODのみ
442438:2011/05/08(日) 02:10:33.76
ありがとうございました。
443デフォルトの名無しさん:2011/05/08(日) 12:04:44.41
カスタムアロケーターって代入やコピー直後に、その二つのオブジェクトがかならず==で真を返すって暗黙に要求されてますか?
stlやboostのソースを見てみるとどうもa1=a2;直後にa1!=a2が真になる可能性を全く考慮していないみたいなんですが・・・どうなんでしょう?
444デフォルトの名無しさん:2011/05/08(日) 12:44:51.30
>>443
直後ってマルチスレッド環境の話か?
445デフォルトの名無しさん:2011/05/08(日) 23:03:27.66
>>443
C++標準では
コンテナ作成者は全てのアロケータは交換可能かつ等しいと仮定してよい
ただし等しくないインスタンスもサポートすることが推奨される
446デフォルトの名無しさん:2011/05/08(日) 23:22:25.05
>>445
知りたいことをズバリ言ってくれました。どうもです
447デフォルトの名無しさん:2011/05/09(月) 00:19:17.68
>>443
20.1.5 の Allocator requirements にコピー代入は載ってないね。
でも rebind された型を含めたコピーコンストラクト相当の操作が載ってて、
その事後条件として == (が真になること)が要求されてる。
448デフォルトの名無しさん:2011/05/09(月) 00:51:35.88
ようするに
A a1
A a2(a1);
assert(a1 == a2); // 要求通りならアサートは絶対出ない
A a3;
a3 = a1; assert(a1 == a3); // 要求通りでもアサートがでるかも・・・
ってことかな?混乱してきた
449デフォルトの名無しさん:2011/05/09(月) 01:59:39.39
>>448
要求に載ってないコピー代入の意味づけは厳密には(常識は別にして)
ユーザー定義なので、結果はなんとも言えないだろうね。

ってことはコンパイル通らない可能性だってあるみたいなんだけど、
ほんとにアロケータのコピー代入なんてしてるライブラリ実装あるの?
バグとして報告しといたほうがいいかもよ。
450デフォルトの名無しさん:2011/05/09(月) 02:06:04.50
>>448
assert は「出る」とか「出ない」とか言わない。
「失敗する」「成功する」が正しい。
「assert 失敗が出る」なら許せる。
451デフォルトの名無しさん:2011/05/09(月) 02:23:31.99
アロケータをコピーする必要があるケースって
寿命管理権を譲渡する場合だけだよな
allocate_shared以外にはちょっと思いつかん
stlに存在するのか・・・?
452デフォルトの名無しさん:2011/05/10(火) 19:15:08.28
VS2010で作成したプログラムを他のPCで実行する時に
ノートン先生に削除されたんですが、
これはどんなことが原因として考えられますか?

実行環境はwinXP
ビルド環境はwin7 VS2010
アプリケーションは Win32アプリケーションで、
OpenGL,ファイル出力(ログファイル),などの類です。
簡単にいうとゲームです。
453デフォルトの名無しさん:2011/05/10(火) 19:25:32.85
>>452
諦めるしかないね

俺もNorton先生に引っかかったことがあるよ
そのときは MinGW gcc でコンパイルした文章整形ツールだったけどな
454デフォルトの名無しさん:2011/05/10(火) 21:15:11.05
>>453
そうですかーありがとうございます。
あきらめます。
455デフォルトの名無しさん:2011/05/10(火) 21:22:06.98
チェストから戻せばいいだけなんじゃないの?
ノートンっていきなり削除すんのか?
456デフォルトの名無しさん:2011/05/10(火) 22:12:50.75
>452

当たり前に考えて実際にウィルスに感染してるんじゃないの。
他に感染されていないかPC総チェックした方がいいよ。

もっともウィルスに感染したPC上のアンチウィルスソフトを信用していいか、
っていうのが問題だが、、、。

ソースレベルで、バックドアでも仕込まれてたりするのかな。
457デフォルトの名無しさん:2011/05/10(火) 22:54:51.97
>452

「ゲーム」っていうのが引っかかるので、念のためですが、、、。

もしオンラインゲームのチートパッチの類なら、かなり悪質である可能性があります。
おそらく悪さする前に、ノートンに削除されているはずですが、万が一の場合の
ダメージがでかすぎるので用心しましょう。

自分ならWindowsをクリーンインストールしなおさないと、怖くてPC触れないですが。
458デフォルトの名無しさん:2011/05/11(水) 01:59:27.26
どう見ても自作ゲームだろ
459デフォルトの名無しさん:2011/05/11(水) 05:28:13.85
c++で
aiueo(const char* const filename)
こんな感じで型と引数名の両方にconstが付いてるソースを初めて見たんですが
これは特別な意味があるんでしょうか?
460デフォルトの名無しさん:2011/05/11(水) 05:31:33.16
const char * const filename
char const * const filename
この二つは同義

値とポインタの先をconstにするという意味がある
461デフォルトの名無しさん:2011/05/11(水) 05:45:56.96
知らなかったです、ありがとうございますm(_ _)m
自分で書く時は
aiueo(const std::string& filenameref)
としてますが自信なくなってきました。
462デフォルトの名無しさん:2011/05/11(水) 07:54:46.44
>>461
参照は付け替えができないから事実上const修飾されているも同義。
しかも、定義の場合は意味があるが宣言の場合は意味がない。
つまり、void aiueo(const char * filename);と宣言して、void aiueo(const char * const filename) {}と定義できる。
要は、関数内でfilenameを変更しないと言う戒めとして働くが、利用者には縁のない話。
試しに、
void aiueo(const char * const filename) {
++filename;
* filename = 0;
}
としてconstを付けたり外したりして、どこの行でどんなエラーが出るか較べるといい。
463デフォルトの名無しさん:2011/05/11(水) 09:20:22.64
参照が張り替え可能ならもっと良い言語になってた
464デフォルトの名無しさん:2011/05/11(水) 09:33:24.80
>>463
それ参照じゃねーから
465デフォルトの名無しさん:2011/05/11(水) 12:21:40.49
ラップポインタでいいじゃん
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;
};
これでドット演算が再定義できたら見た目もセクシーになるんだけど何故かできない
ハゲは反省するべき
466デフォルトの名無しさん:2011/05/11(水) 19:29:37.42
>>465
ドット演算子がオーバーロード出来ない理由はD&Eを読めハゲ
467デフォルトの名無しさん:2011/05/11(水) 20:07:00.79
メンバにfooメソッドがあればそれをコール
無ければドット演算の返り値の型からfooメソッドを探す
あるならその型のfooを返り値に対して呼び出す
見つからなければ再帰する
これでいいじゃん
問題が起こるなんて考えられない
468デフォルトの名無しさん:2011/05/11(水) 20:11:23.81
その仕様だと
class T;
class U { T operator . ( void ); };
class T { U operator . ( void ); };
コンパイラが永久ループ しますね
469デフォルトの名無しさん:2011/05/11(水) 21:13:34.14
operator deleteについてなんですが、
ttp://codepad.org/HhzRgDlu
このように継承関係がある場合、operator delete(void* p)
に渡されるポインタは、
仮に基底クラスにキャストした時のアドレスと
派生クラスにキャストした時のアドレスが異なる場合、
どちらのアドレスが渡されますか?
それぞれアドレスを出力してみたのですが、
上記のアドレスが異なる状況がどうも作れなかったので質問です。
470デフォルトの名無しさん:2011/05/11(水) 22:20:53.37
471469 :2011/05/11(水) 22:43:59.19
>>470
ありがとうございます!!
ということは継承関係があっても
newで渡したアドレスがちゃんとdeleteで帰ってくるんですね!
まじで感謝です!
472デフォルトの名無しさん:2011/05/11(水) 22:58:19.98
>>471
…ちゃんと読んだ?

ttp://ideone.com/qEkMz
こっちの方があからさまかな
473469 :2011/05/11(水) 23:22:28.33
>>472
ありがとうございます。
「基底のデストラクタがちゃんと仮想になっていれば」
ちゃんと帰ってくるということですか?
474デフォルトの名無しさん:2011/05/11(水) 23:31:53.74
> 仮に基底クラスにキャストした時のアドレスと
> 派生クラスにキャストした時のアドレスが異なる場合、
> どちらのアドレスが渡されますか?

この話の解決になってるの?
475469 :2011/05/11(水) 23:54:37.84
>>474
473の解釈が正しければ疑問点は晴れます。
476デフォルトの名無しさん:2011/05/12(木) 00:18:49.85
>>473
規格を精査するのはめんどくさいので適宜自分でテストコードでも書いて調べて
477469 :2011/05/12(木) 00:21:49.88
>>476

>>472さんが伝えたかったことが
473であるかどうかが気になります。
478デフォルトの名無しさん:2011/05/12(木) 01:08:23.79
newdeleteがきちんと対応してないと背筋が凍る
479デフォルトの名無しさん:2011/05/14(土) 19:20:15.09


クラスのメンバ変数に巨大な配列をnew(malloc)をせずに確保したいのですが
segmentation faultが出てしまいます。

class Hoge
{
private:
double array[1000][1000];
};

解決方法はどういったものがありますか?

環境は gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4) です。
480デフォルトの名無しさん:2011/05/14(土) 19:56:13.51
ulimitコマンドかなにかでスタックサイズを増やす
481479:2011/05/14(土) 20:06:14.62
>>480
ありがとうございます。
482デフォルトの名無しさん:2011/05/14(土) 23:42:50.65
スタックに10GBほどの配列を確保したいのですが、
「Stack Overflow」が出てしまいます。どうすればよいでしょうか
Visual c++ 2010でビルド構成をx64にしています。
483 [―{}@{}@{}-] デフォルトの名無しさん:2011/05/14(土) 23:46:08.82
なんでスタックじゃないとだめなん
484482:2011/05/15(日) 00:05:36.77
えーと、開発をとりまとめている元請けのシステムインテグレーターとやらの指示です。
ワークステーションで物理メモリが110GBほど乗ってます。
人工衛星の画像解析とかします。
485デフォルトの名無しさん:2011/05/15(日) 00:08:06.60
その人工衛星が落ちないか、心配になった
486482:2011/05/15(日) 00:14:13.79
画像解析はミッション系なんで撮像要求だすだけ。落ちないようにする
Hause Keeping運用は管制受信系メーカーが別にいるので大丈夫なんです(^^)
487デフォルトの名無しさん:2011/05/15(日) 00:16:03.57
488デフォルトの名無しさん:2011/05/15(日) 00:22:14.34
>>487
参考情報ありがとうございます。でも今度はこんなエラーが出てしまいました。
>error C2148: total size of array must not exceed 0x7fffffff bytes
ヘルプを見ても解決策が見つからずです・・・
489デフォルトの名無しさん:2011/05/15(日) 00:29:53.51
>total size of array must not exceed 0x7fffffff bytes
>An array exceeds the limit. Reduce the size of the array.

http://msdn.microsoft.com/en-us/library/s0z0bbfe%28v=vs.80%29.aspx

・スタックの型を最適化してサイズ圧縮
・スタックを分割
490デフォルトの名無しさん:2011/05/15(日) 00:32:44.44
ならデバッグのためにそのワークステーションを寄越せと
491デフォルトの名無しさん:2011/05/15(日) 01:31:22.33
これはひどい
492デフォルトの名無しさん:2011/05/15(日) 09:15:28.53
>>478
ツール使ってリークが検出されたら背筋を凍らせながらコードをみる
493デフォルトの名無しさん:2011/05/15(日) 09:20:33.24
>>482
他にも悩みが出てくるだろうからインシデント使うかコンサル雇うのが楽だと思うけど。
494デフォルトの名無しさん:2011/05/15(日) 14:25:10.49
>>488
boost使えんの?
vectorにshared_ptrかunique_ptr突っ込んでnewしながらヒープも使えよ
それかboost::ptr_vectorなら普通のポインタでもいい

どちらもメモリリークしない(ptrが削除されようとするとデストラクタが自動的に
呼び出されてnewした領域もdeleteされる)
495482: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);
これってスタックに確保されているんじゃないんでしょうか?
エラー無く通過します。一瞬で動作するので本当に動いているか不安ですけど
496デフォルトの名無しさん:2011/05/15(日) 15:25:32.06
普通のプログラミングならありえないサイズだなあ…
スタックに多次元配列の画像でも置いてるのだろうか

>>495
vectorはヒープだと思うよ
ふつうスタックには巨大なデータは置かない置けない
497デフォルトの名無しさん:2011/05/15(日) 15:32:29.89
>>484
で、なんでスタックじゃないとだめなん?
聞き方を変えると、スタックに対してヒープの何の違いが問題なの?
498デフォルトの名無しさん:2011/05/15(日) 15:41:30.40
スタックじゃなくてスタティックに確保とかそんなオチは?
499デフォルトの名無しさん:2011/05/15(日) 15:48:44.28
物理メモリの容量を見ると、その可能性も高いな。
500デフォルトの名無しさん:2011/05/15(日) 16:38:22.24
スタックアロケータという手もあるだろう
実装簡単だし、速度速いし。先頭覚えておくこと、アラインメントを考慮すること、
くらい分かっていれば簡単だし
501デフォルトの名無しさん:2011/05/15(日) 17:01:53.08
でもVS2010で開発してるって事はWindows7 64なんでしょ?
俺もVSはスタックに0x7fffffffという制限があるのを始めて知ったけど
まあ要するに巨大なデータはヒープに置けって事なんだろうな
502デフォルトの名無しさん:2011/05/15(日) 17:24:50.97
ふと思ったんだがvectorに多次元配列をpushするにはどうすればいいんだ?
scoped_arrayか?
コピー不能だからsort出来ないし
shared_arrayならいいのか

ptr_vectorを使ってもdeleteしてくれるのは1レベルだけだから、ポインタのポインタ
などを入れると一番先のポインタが指している部分がdeleteされないという問題がある
だから生のポインタのポインタなどをptr_vectorに入れるのは危険だ

shared_ptrならカスタムデリータを指定出来るから、ポインタのポインタをクラスで
包んでカスタムデリータにそのクラスのデストラクタを指定すればいいな
503デフォルトの名無しさん:2011/05/15(日) 17:56:20.67
>>502 vector<vector<...> > だろjk
504デフォルトの名無しさん:2011/05/15(日) 18:16:34.40
>>503
まあな
その方が列ごとあるいは行もresize()出来るし何かと便利だ
505デフォルトの名無しさん:2011/05/15(日) 18:18:42.78
今Eclipse CDTを立ち上げて確かめようとしたらどうもSR2にアップデートする時に
何かバグったらしくてエラー出まくるので入れ直す

MinGWにはこれが一番相性いいしな
506デフォルトの名無しさん:2011/05/15(日) 18:27:26.31
>>495
もしかしてこの人
new T[0x7fffffff以上になる"定数"]
ってやってたのかなあ
64ビットクロスコンパイラに配列じゃなくてもC2148が発生する仕様があるんだよね
507デフォルトの名無しさん:2011/05/15(日) 20:20:20.94
スタックとヒープで確保解放以外に速度で差がつくのだろうか
508デフォルトの名無しさん:2011/05/15(日) 23:35:53.20
>>507
スタックは、スタックポインタを上げ下げするだけ。
ヒープ/malloc() はそれに比べるとコストがかかると思う。
ああ、static ならコスト 0 かな。
509デフォルトの名無しさん:2011/05/15(日) 23:39:35.72
じゃあ確保開放以外では差はないのね
510デフォルトの名無しさん:2011/05/16(月) 13:52:25.45
確保する領域が大きい場合だけど。

<スタック>
  確保時に物理メモリを割り当てる=確保は遅いが、その後の処理はフルスピードで実行可能。最適化も崩れない。

<ヒープ>
  確保時は仮想メモリアドレスを予約=確保は一瞬だが、その後の処理が最適化されていても、OSが割り込みを使って物理メモリを
  適宜割り当てる為、意味無し。前処理としてページ単位に一回ずつアクセス(0以外を書き込み?)しておくのが吉。

かと思ってた。
511デフォルトの名無しさん:2011/05/16(月) 14:00:00.91
>>510
>、OSが割り込みを使って物理メモリを適宜割り当てる為

割り込みなんて使う必要があるか?周辺機器じゃないぞ
512デフォルトの名無しさん:2011/05/16(月) 14:02:55.58
スタックもヒープも物理的には違いなく、windowsだったらwinapiで確保するのに違いなし。
あらかじめ確保しておいて使い回すのがスタック。
自動変数などはC言語が確保しているスタック内で動作する。
ヒープは管理外のメモリを毎回OSの命令を呼び出して確保。その分オーバーヘッドあり。
513デフォルトの名無しさん:2011/05/16(月) 14:04:01.71
まとめるとこれ。

確保されている領域の使い回し=スタック。
毎回確保しにいく=ヒープ。
514デフォルトの名無しさん:2011/05/16(月) 14:05:33.76
>>512
>ヒープは管理外のメモリを毎回OSの命令を呼び出して確保。

毎回じゃないだろ
OSのメモリ要求APIはかなり重いのが慣例で、そのためにいつも余分に確保し、
ヒープ領域はその中かから切り出して使う
malloc()やnewする度にOS呼び出してたら遅くて使い物にならないぞ
515デフォルトの名無しさん:2011/05/16(月) 14:18:49.94
>>514
Windowsに関して言えば、APIは必ずしもシステムコールではないので
API呼んだら常にコンテキストスイッチが発生してカーネルモードの
コードが走るとは限らない
いちいちカーネルモードに遷移しないAPIの典型例は
CriticalSectionやInterlocked系のAPI

現に今のMSVCのmalloc()はHeapAlloc()を使うような実装になっていたと思うよ
HeapAlloc()は内部的にVirtualAlloc()呼ぶときだけカーネルに頼ってる
んじゃないのかな、たぶん
516デフォルトの名無しさん:2011/05/16(月) 14:24:58.05
Windowsの実装の話になるなら
ヒープ⇒毎回確保しにいく
っつーのも間違いだな
517デフォルトの名無しさん:2011/05/16(月) 14:28:17.93
少なくともlinuxの場合、ヒープは本当に確保されてるかどうか使ってみないとわからないんじゃなかったか
518デフォルトの名無しさん:2011/05/16(月) 14:30:13.75
>>515
話を逸らすなよ
今メモリ要求の話してるんだろ
519デフォルトの名無しさん:2011/05/16(月) 14:31:33.82
>>518
逸らすなといわれても、俺は上でレスをしていた人間じゃないので……
そういう意図は無いとしかいいようがない
520デフォルトの名無しさん:2011/05/16(月) 14:32:31.79
>>517
sbrk()はメモリが確保出来なくても成功するからな
実行してみて「やっぱり足りませんでした」となってようやくコア

http://archive.linux.or.jp/JM/html/LDP_man-pages/man2/sbrk.2.html
521デフォルトの名無しさん:2011/05/16(月) 14:40:57.09
sbrkの問題じゃなくてmallocの問題でしょ。
内部で使ってるんだからsbrkの問題、とかいわないでくれるといいんだけど。
522デフォルトの名無しさん:2011/05/16(月) 18:15:51.38
ようするに使い回せば速さに差はないってことですか?
523デフォルトの名無しさん:2011/05/16(月) 18:18:06.23
使い回せばヒープ
524デフォルトの名無しさん:2011/05/16(月) 18:28:00.38
stringでこういうのできる?

int value = 999;
std::string str;
str = "value = " + value;
525デフォルトの名無しさん:2011/05/16(月) 18:33:23.34
>>524
std::ostringstream str;
str << "value" << 999;

で str.str() を参照

Cのsprintf()に相当する
526デフォルトの名無しさん:2011/05/16(月) 19:05:27.71
文字列はCのが使いやすい
527デフォルトの名無しさん:2011/05/16(月) 19:06:57.01
はぁ?
528デフォルトの名無しさん:2011/05/16(月) 19:17:35.80
>>525
ありがとう。

なんか不細工だけど自分でStringクラス作るのはやめとくよ。
529デフォルトの名無しさん:2011/05/16(月) 19:21:31.66
stringに数字を取るコンストラクタがあったらよかったんだけどね
itoa()は非標準だし
530デフォルトの名無しさん:2011/05/16(月) 19:24:49.66
>>527
え?
531デフォルトの名無しさん:2011/05/16(月) 19:41:00.31
C/C++で書かれたアルゴリズム辞典でオススメ有りますか?
532デフォルトの名無しさん:2011/05/16(月) 20:34:32.51
>>529
0x の to_string に御期待下さい。
533デフォルトの名無しさん:2011/05/20(金) 15:23:51.33
wwwwwwwwwwwwwwwwwww
534533:2011/05/20(金) 15:25:01.94
誤爆 つられたクマー
535デフォルトの名無しさん:2011/05/22(日) 11:01:11.08
COMってなんなんですか?C++のテクニックなんですか?
536デフォルトの名無しさん:2011/05/22(日) 11:40:14.54
>>535
たぶんウィンドウズで使用されているコンパイル済みのライブラリを
利用するための技術。

ttp://e-words.jp/w/COM.html

何言語かは関係ない。
537デフォルトの名無しさん:2011/05/24(火) 22:26:07.22
C言語の入門書1冊やり終わったんで、次はC++も触ってみたいんですけど
おすすめの本ありませんか?
538デフォルトの名無しさん:2011/05/24(火) 23:45:41.94
 Windows で CRT セキュリティ強化の修正をしているのですが、
旧スタイルも残しておきたいとき、
#if _MSC_VER >=1400
で分けようと思っていますけど、これで大丈夫でしょうか?
ほかにも何か判定しなければいけないでしょうか。
よろしくお願いします。
539デフォルトの名無しさん:2011/05/26(木) 00:33:48.70
>>538
判定とは違うけど、_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMESで
済む箇所はできる限りそれで済ませて分岐を減らすくらいかな。
540デフォルトの名無しさん:2011/05/27(金) 19:33:27.08
fopenで開いたテキストファイルを1文字ずつ文字として読みたいんですが、
半角全角で1:2バイトのようにサイズが違ってしまい、面倒です。(現在:SJIS)
どういった文字コードを使えば固定長=1文字のような形式になりますか?
例:a:1byte あ:2byte => a:3byte あ:3byte にしたい
541デフォルトの名無しさん:2011/05/27(金) 19:35:53.03
UTF-16
542デフォルトの名無しさん:2011/05/27(金) 19:52:06.03
面倒の一言で済ませちゃうのか
無知ってすごいな
543デフォルトの名無しさん:2011/05/27(金) 19:53:15.80
面倒と言い切るのは、ハッカーの素質がある。
544デフォルトの名無しさん:2011/05/27(金) 22:39:53.54
UTF-32をつかっとけば未来永劫まず大丈夫
545デフォルトの名無しさん:2011/05/28(土) 02:19:50.71
>>540
無理。固定長の文字コードなんてない。
まずはバイナリと文字との変換ライブラリを作る
546デフォルトの名無しさん:2011/05/28(土) 02:29:44.57
ICUでいいだろうに
547デフォルトの名無しさん:2011/05/28(土) 02:44:36.74
CJK統合なんかユニコードの無知無意味無駄の極みだよな
どうせ可変長になるんだから
ハングル大暴走するし
548デフォルトの名無しさん:2011/05/28(土) 03:28:33.31
ハングルって何に対抗してるのかよくわからんけどすげえ増えてってるんだっけ
中国の漢字も増えてた気がするけど、増やさずにはいられないのかな
549538:2011/05/28(土) 09:47:24.65
>>539
レスありがとうございます。
この定義は知りませんでした。おかげで作業がはかどりました。
550デフォルトの名無しさん:2011/05/28(土) 10:44:47.63
はやく英語だけの世界になればいいのに
551デフォルトの名無しさん:2011/05/29(日) 00:41:37.07
>>548
考えられる全部の組み合わせを出したんだって
そのうち今使われているハングルは全体の1/3程度
しかしこれから使うようになるかもしれないから全部出しておけば
大丈夫だと思ったんだろう

Batang.ttfのサイズの大きさを見ても分かるようにハングルの文字数は
世界最大

原因はそれだけじゃないがWikipediaを見てもらうと分かるけど大移動
が起きて結局サロゲートペアを使わざるを得なくなったしそんな複雑な
状況ならUTF-32に統一してしまえばいいと思う
552デフォルトの名無しさん:2011/05/29(日) 23:14:48.07
ITProの矢沢さんて人のコラム読んでるけどわかりやすくていいな
553デフォルトの名無しさん:2011/05/30(月) 01:52:05.88
矢沢久雄なら俺のブラックリストに載ってるよ
554デフォルトの名無しさん:2011/05/30(月) 19:03:54.69
マジすか
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フロッピーのような現代から見て比較的小容量な記憶媒体が使われていた時代はどの様に小容量化していたのでしょう?
557デフォルトの名無しさん:2011/05/31(火) 01:24:06.79
DIET.EXEとかあったよ
あまり使われてなかったけど
558デフォルトの名無しさん:2011/05/31(火) 02:14:35.52
機械語直書きで
559デフォルトの名無しさん:2011/05/31(火) 10:12:08.27
とりあえずC++じゃなくてCで書いてから測ろうぜ
560デフォルトの名無しさん:2011/05/31(火) 10:14:42.62
staticリンクのdebugビルドなだけじゃねーの
561デフォルトの名無しさん:2011/06/01(水) 00:16:16.60
環境:VC++ 2010

cout.fill("*");

VC++ 2010にて引数が一致しないと表示されるのですが、原因が全くわかりません。
同様に、

char c = "c";

もエラーです。
文字に対する誤解があるようなら、そこも指摘していただけるとありがたいです。
562デフォルトの名無しさん:2011/06/01(水) 00:22:59.23
下は簡単
char c = 'c';
もしくは
char *c = "c";
シングルクォートとダブルクォートで囲んだときに
どう扱われるかの違いだね
563デフォルトの名無しさん:2011/06/01(水) 00:32:35.52
シングルクォートの存在を知りませんでした…
独学はこういう所が怖いです
564デフォルトの名無しさん:2011/06/01(水) 02:25:07.95
誰にも習っていないから、ということを盾にしてるように取れるけど、それは勉強の仕方が悪いだけだよ。
言語の本を買うのが手っ取り早いよ。C++なら、せめて「プログラミング言語C++」を。
565デフォルトの名無しさん:2011/06/01(水) 03:07:22.67
本でもサイトでもそこを説明しないところなんてあんのかね?
566デフォルトの名無しさん:2011/06/01(水) 03:14:33.72
むしろ一度読み飛ばすとすごいはまることじゃないのか?怖いっていうの
習得した後から考えるとスゲーあほなことで長時間はまる的な
567 忍法帖【Lv=1,xxxP】 :2011/06/01(水) 03:43:37.94
独学なんてそんなもんじゃね
568デフォルトの名無しさん:2011/06/01(水) 04:18:48.04
だからロベールにしとけって言ったのに
569デフォルトの名無しさん:2011/06/01(水) 09:45:52.86
解放に失敗するリソースのRAIIに関して
エラーハンドラをセットして、それがNULLならexit(EXIT_FAILURE)してるんだけど
exitで終了するのはC++的には安全なの?
570デフォルトの名無しさん:2011/06/01(水) 11:12:30.03
>>569
ローカルオブジェクトのデストラクタは呼ばれないけど、
プログラムが終了するという動作はちゃんと定義されている。
それが安全と言えるかどうかはアプリケーションによるところ。
571デフォルトの名無しさん:2011/06/01(水) 23:20:16.35
CとかC++とか関係なく、exit自体が使ってはいけない関数
572 忍法帖【Lv=3,xxxP】 :2011/06/01(水) 23:34:27.20
別にCならいいんでない?
濫用しなければ。
573 忍法帖【Lv=1,xxxP】 :2011/06/01(水) 23:37:58.51
環境はVC++2010、win32APIを使用しています
WriteFileを使って3ケタの整数(値は変動します)をファイルに書き込みたいのですがどのようにすればいいのでしょうか?

またjpgの縦と横の解像度を取得するにはどうすればいいでしょうか?
574デフォルトの名無しさん:2011/06/01(水) 23:45:33.10
>>572
呼び出し元がリソース解放しない状態でプログラム終了していいわけないだろ。

>>573
atoi。
EXIFならともかくJPEGに解像度なんて無いだろ
575デフォルトの名無しさん:2011/06/01(水) 23:48:36.20
>>573
前者。一旦sprintf()かなにかで文字列にしてから書けばいいのでは?
後者。それをサポートしているライブラリを探すのが手っ取り早いかと。
576デフォルトの名無しさん:2011/06/01(水) 23:50:54.34
>>574
解放すべきリソースがないか、atexit()で解放関数が登録済みならexit()してもいいじゃん。
それが乱用しないってことだろ。
577デフォルトの名無しさん:2011/06/01(水) 23:52:14.24
>>574
>>572>>571だけにレスしてて>>569は関係ないんじゃない?
578デフォルトの名無しさん:2011/06/01(水) 23:54:57.70
>>573
lpBufferに突っ込むだけだろ
jfifということならSOIのunits
579デフォルトの名無しさん:2011/06/02(木) 00:03:13.96
>>576
ただの一関数が「解放すべきリソースが無い」かどうかの
判断なんて無理でしょ。
使い捨てプログラムならexitしても構わないけど
580デフォルトの名無しさん:2011/06/02(木) 01:30:07.86
>>574,>>575,>>578
ありがとうございます。
前者についてはatoiを使用し解決しました。
後者についてはIndependent JPEG Groupなどを使ってみようと思います
581デフォルトの名無しさん:2011/06/02(木) 02:48:47.93
>>580
んな馬鹿な(´Д` )
582デフォルトの名無しさん:2011/06/02(木) 08:00:14.44
>>579
なんでそう思ったの?君がアホだから?
583デフォルトの名無しさん:2011/06/02(木) 09:20:44.21
>>579はもっとCを書くべき
584デフォルトの名無しさん:2011/06/02(木) 10:59:29.84
じゃあデストラクタでエラーがでたらどうするの?
585デフォルトの名無しさん:2011/06/02(木) 11:44:44.76
でてくるのか?
586デフォルトの名無しさん:2011/06/02(木) 12:30:45.60
dtorで例外だしちゃらめぇぇ
587デフォルトの名無しさん:2011/06/02(木) 13:05:21.18
API使うと普通に失敗するなぁ
デストラクタの中だとこれは困る
588デフォルトの名無しさん:2011/06/02(木) 13:09:26.05
デストラクタの中から例外投げないっていうのと
リソース解放でエラーが出ないってのは別の次元の話
デストラクタでエラーが出たら握りつぶすしか無いだけ
589デフォルトの名無しさん:2011/06/02(木) 15:12:54.41
BCBを使ってソルバーDLLを開発しようとしています。
データが多く、配列・変数が混在したパラメータがあり、
どうDllに渡すか迷っています。

良い手ありますか?
引数を大量にもつ。構造体を使う。データファイルへ埋め込みパス渡し。

a,b,c,d,e,f[][],g[]とか、いっぱい。
返値もいっぱい。

よく使う手があれば、教えてください。
590デフォルトの名無しさん:2011/06/02(木) 15:22:19.85
>>589
メモリマップドファイル
591デフォルトの名無しさん:2011/06/02(木) 17:57:12.36
ども。
592デフォルトの名無しさん:2011/06/02(木) 20:55:02.49
BYTE sizebuffer[4] :
buffer[0]=0x00;
buffer[1]=0x00;
buffer[2]=0x00;
buffer[3]=0x14;
20byte読み込みたい
DWORD dwSize = (DWORD)&buffer;
dwSizeが0x14000000になってしまう
0x00000014にはならないのですか?
593デフォルトの名無しさん:2011/06/02(木) 20:57:31.02
エンディアン、嘘つかない
594デフォルトの名無しさん:2011/06/02(木) 21:03:18.39
バイトオーダーの二つ名を持つ
595デフォルトの名無しさん:2011/06/02(木) 21:20:21.05
理解しました!
検索したら変換方法見つけたのでそれ使ったら期待通りになりました
ども
596デフォルトの名無しさん:2011/06/02(木) 21:35:22.83
ヒント程度の回答なのによく辿りついたな…
597デフォルトの名無しさん:2011/06/02(木) 23:27:18.77
>>593
だれうま
598デフォルトの名無しさん:2011/06/03(金) 01:24:30.26
ポインターをDWORDにキャストする時点で糞コード。
仮にDWORD dwSize = *(DWORD *)buffer; の間違いだとしても
x86以外で即バスエラー起こす糞コード。
599デフォルトの名無しさん:2011/06/03(金) 02:06:52.85
x86以外全部なのか
600デフォルトの名無しさん:2011/06/03(金) 02:12:48.11
64bit?環境だと
601デフォルトの名無しさん:2011/06/03(金) 07:19:08.52
>>599
すくなくともビッグエンディアンは全部アウチだろう
602デフォルトの名無しさん:2011/06/03(金) 12:40:17.37
>>601
バスエラーは出ないだろう
603デフォルトの名無しさん:2011/06/03(金) 15:49:32.22
奇数番地のワードアクセスとかでバスエラーってのあるよ(知らんぷりするのも)
604デフォルトの名無しさん:2011/06/03(金) 17:13:24.66
それ今回と関係ないな
605デフォルトの名無しさん:2011/06/03(金) 17:44:22.79
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];

これを書いたらエラーがでました。他に何をすればいいんですか?
606デフォルトの名無しさん:2011/06/03(金) 18:20:49.60
いきなりC++/CLIにDirectXとか欲張りすぎなんだよ
607デフォルトの名無しさん:2011/06/03(金) 19:04:36.05
>>605
> #include <XInput.h>
> #include <windows.h>

#include <windows.h>
#include <XInput.h>
608デフォルトの名無しさん:2011/06/03(金) 19:23:30.80
なるほど。出来ましたありがとうございました
もう大丈夫ですC++CLIに突撃します
609デフォルトの名無しさん:2011/06/03(金) 19:30:37.18
それを初心者とは言わない。
610デフォルトの名無しさん:2011/06/03(金) 22:44:06.50
assert、例外よりも高度なデバッグってどうやるんですか?
611デフォルトの名無しさん:2011/06/03(金) 22:49:02.15
例外=バグではないけどな
ログ出力とか
クラッシュレポートとか?
あとはboost/static_assertくらいじゃね?高度って意味とは違うけど
612573: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は必要でしょうか?
613デフォルトの名無しさん:2011/06/05(日) 16:32:36.50
>>612
jpeglibをインクルードの最後に移動してみたら?
614612: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 で参照されました。
615デフォルトの名無しさん:2011/06/05(日) 16:49:48.56
>>614
>>612はコンパイルエラー
>>614はリンクエラー
何か指定しないといけないライブラリーがあるんじゃない?
616デフォルトの名無しさん:2011/06/05(日) 16:50:03.70
単にライブラリをリンクしてないだけじゃ
617612:2011/06/05(日) 19:55:49.94
>>645,>>616
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#define XMD_H
#undef FAR
extern "C"{
#include <jpeglib.h>
}
#pragma comment(lib, "jpeg.lib")

jpeg.libをリンクした場合ビルドが成功しコマンドラインが表示されるのですが、下のような警告出て終了します。
http://www1.axfc.net/uploader/Img/so/117523
618デフォルトの名無しさん:2011/06/05(日) 20:20:55.13
a.jpgが存在してないからだろ
619デフォルトの名無しさん:2011/06/07(火) 12:03:13.34
項目名と値を関連づけてコンテナに格納するとき

項目名を直接に識別子にして
void SetVal(string,int)
int GetVal(string)
とするのと

項目名に列挙子等を利用するのはどちらが望ましいのでしょうか?
620デフォルトの名無しさん:2011/06/07(火) 12:51:17.75
string使ってるってことはC++だろ
std::mapとかじゃダメなの?
そんなに車輪の再発明したいの?
621デフォルトの名無しさん:2011/06/07(火) 13:25:45.08
pg_fetch_arrayとpg_fetch_objectのどっちがいい?みたいな話かと思ったけどなぁ。
622デフォルトの名無しさん:2011/06/07(火) 16:34:52.26
>>620-621
pg_fetch_arrayとpg_fetch_objectというのが具体的にどういう物かはしっかり理解できていませんが

クラスのインターフェイスをどういう風にして
メンバのコンテナを
std::map<int,int>とするのがいいのかstd::map<string,int>としたほうがいいのか?
どちらが一般的でしょうか?といういみで尋ねました。
623デフォルトの名無しさん:2011/06/07(火) 18:02:08.03
intで済むならそっちでいいんじゃね
理由は調べてね
ただこれを自分で判断できんのはどうかと思う
624デフォルトの名無しさん:2011/06/07(火) 18:46:19.37
パフォーマンスが問題にならないなら、直感的に理解し易くてメンテの手間の増えない方法を採用すべきじゃね?
つーことで、連想配列お勧め。
625デフォルトの名無しさん:2011/06/08(水) 10:12:09.01
組み込み型の中で最大のアラインメントをNとして
Nよりも大きなアラインメントを持った型を作る方法ってありますか?
256byte、4096byteなど大きな境界を持った領域がほしいのですが
今は多めにとって余分なところを捨ててるので、もったいないので何とかしたいです
626デフォルトの名無しさん:2011/06/08(水) 10:34:51.48
>>625
コンパイラによっては拡張機能として持っているものがある。
動的確保するつもりなら、これも標準じゃないけど環境によっては
memalign() とか使えるかもしれない。
627デフォルトの名無しさん:2011/06/08(水) 11:09:42.96
>今は多めにとって余分なところを捨ててるので、もったいないので何とかしたいです
処理系がその機能を提供してくれても、中でやることは同じだと思うなぁ
628デフォルトの名無しさん:2011/06/08(水) 11:10:29.13
>>626
どうも。memalignでググッたらそれっぽいページが見つかりました
残念ながら拡張機能か切り捨てしかないみたいでした・・・
629デフォルトの名無しさん:2011/06/08(水) 11:17:04.36
移植性とか幻想だから
630デフォルトの名無しさん:2011/06/08(水) 14:51:00.57
>>624
この選択で、メンテの手間が少ないのがどっちかを知るのは難しいと思うよ
631デフォルトの名無しさん:2011/06/08(水) 15:51:28.19
すみません。Windowsプログラミングでキー入力が正しく取得できず困っております。
メッセージループは以下の様に書いています。
while(GetMessage(&msg , NULL , 0 , 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
〜処理全般(キー入力もプロシージャ上ではなくWPARAMやmessageを取ってここでやっています;)〜
}
しかしこれでは、
マウスカーソルの移動後1回目のキー入力のみ or マウスカーソルの移動中 or デバッグモードで止まった後
しかキー入力が正しく取得されず、1回キー操作をするごとに操作できなくなってしまいます。
どう書き換えれば常にキー入力を取得できるようになるでしょうか?
また、もし目的別のメッセージループの書き方のサンプル/説明サイトが有れば教えて頂けますと幸いです;
632デフォルトの名無しさん:2011/06/08(水) 16:10:02.39
毎回GetKeyboardStateしとけ
633631:2011/06/08(水) 19:04:58.92
>>632
少し別のやり方ですが解決できました。そういう関数も有るんですね。
ありがとうございました。
634デフォルトの名無しさん:2011/06/08(水) 19:54:09.71
解決したなら、何が問題でどういう対処が必要だったかも書こうな
635631:2011/06/09(木) 01:45:03.88
>>634
えっと、>>633の時点で、PeekMessageを使ってキーを常に取得できるとわかりそうしていたのですが、
それでは内部に作った子窓にマウスでフォーカスが行かないとわかり、
結局今は元のメッセージループを使い、大人しくプロシージャの中でキー入力を取得しております;
636デフォルトの名無しさん:2011/06/09(木) 02:14:36.33
すみません。新たにWindowsプログラミングについて質問なのですが、
CreateWindow関数でWS_CHILDして作ったコンボ・ラジオ・テキスト等の「入力中」に
「特定のキー操作」で「親窓、または次の入力用の子窓にフォーカスを移動(SetFocus)する」というのはどうすれば実現できるでしょうか?
一度子窓にフォーカスが入ってしまうと、もう親窓で設定したキー操作が通用しなくなり困っています;
637 忍法帖【Lv=7,xxxP】 :2011/06/09(木) 02:17:58.80
メッセージフックとか
638デフォルトの名無しさん:2011/06/09(木) 13:35:19.48
>>636
コントロールを拡張する
サブクラス化
639636:2011/06/09(木) 13:35:43.52
>>637
そういう物がちゃんと有るのですね。少し勉強が必要そうで結果は先送りですが、ご助言ありがとうございましたっ
640636:2011/06/09(木) 21:40:56.13
>>638
名前だけは聞いていましたが、サブクラス化、かなり強力な機能なんですね。
メッセージフックより楽に開発できる・・のかもしれません。ご助言ありがとうございました。
641デフォルトの名無しさん:2011/06/10(金) 14:55:49.19
マクロの定義っていつまで有効なんですか?
642デフォルトの名無しさん:2011/06/10(金) 15:06:57.68
>>641
定義されてからコンパイル単位終了まで
643デフォルトの名無しさん:2011/06/10(金) 15:10:41.48
#undefするまで
644デフォルトの名無しさん:2011/06/10(金) 16:52:53.58
ソースの文字コード
コンパイラの文字コード
コードのコードページ(ロケール?)
実行環境の文字コード
実行環境のコードページ
が一致してないともじばけするってことでいいの?
645デフォルトの名無しさん:2011/06/10(金) 17:25:17.57
ソースの文字コードと実行環境のロケール(コードページ)だけじゃね
コンパイラはバイト列としてしか認識してないでしょ
C++0xだとまた話変わるだろうけど
646デフォルトの名無しさん:2011/06/10(金) 17:30:41.50
よくない
647^Z:2011/06/11(土) 12:59:03.66
http://hibari.2ch.net/test/read.cgi/tech/1307166756/442
Borland 罠
if(bcc32)
else if(gcc)
else if(cl)

main(){int a;
printf("%d\n", scanf("%d",&a));}
648デフォルトの名無しさん:2011/06/11(土) 13:50:15.41
newとdeleteの配列版のオーバーロードって
要求されたサイズのどこまでがオーバーヘッドのサイズがわからないから
アラインメントを合わせることが実質不可能だからやるだけ無駄?
649デフォルトの名無しさん:2011/06/11(土) 14:19:08.99
文字数確保するときにパスならMAX_PATHとかあるんですが
URLはpathの最大文字数とかって決まりはあるのですか?
650 忍法帖【Lv=9,xxxP】 :2011/06/11(土) 14:23:34.33
INTERNET_MAX_URL_LENGTH
651デフォルトの名無しさん:2011/06/11(土) 14:38:09.50
>>649
MAX_PATHも実際は当てにならないけどね。
652デフォルトの名無しさん:2011/06/11(土) 14:53:23.90
>>650
   ヘ⌒ヽフ
  ( ・ω・) dd
  / ~つと)
653デフォルトの名無しさん:2011/06/11(土) 15:46:18.90
>>651
MAX_PATHはパス長の最低保証だからな
654デフォルトの名無しさん:2011/06/11(土) 17:19:31.12
>>648
特殊なアライメントまで考慮してポータブルなものを作るということなら、不可能だろうね。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#476

使ってるコンパイラで動くものなら作れるだろうから、無駄かどうかは知らない。
655デフォルトの名無しさん:2011/06/11(土) 17:20:17.98
>>653 んなこたーない
656デフォルトの名無しさん:2011/06/12(日) 22:18:29.81
すみません。Windowsプログラミングで作った入力窓達をサブクラス化しています。
そこでSetWindowLong関数ですり替えるウィンドウプロシージャを全部共有したいのですが、色々試しても上手く行きません;
良い解説サイト、ググるべきキーワードなど有れば教えて頂けませんでしょうか。よろしくお願いします。
657656:2011/06/12(日) 22:31:21.95
すみません、GetWindowLongで解決できるサンプルを発見できました。 自己解決しました、失礼しました;
658デフォルトの名無しさん:2011/06/12(日) 22:38:21.26
SetWindowLongPtr
SetWindowSubclass
659656:2011/06/13(月) 00:50:03.59
>>658
そうした新しい機能も存在するんですね。ひとつ勉強になりました。
ご助言ありがとうございます。
660デフォルトの名無しさん:2011/06/13(月) 03:26:18.42
例外のスコープについて質問です
char* msgのバッファは呼び出し元関数のcatchスコープまで残るでしょうか
できればスタックを投げたいです

try
{
,,,,char* msg = "Hello World";
,,,,throw msg;
}
catch (char* msg)
{
,,,,// 関数の呼び出し元へthrow
,,,,throw msg;
}
661デフォルトの名無しさん:2011/06/13(月) 03:35:31.36
無理
newして飛ばせ
662デフォルトの名無しさん:2011/06/13(月) 03:41:09.43
ああ。。。やっぱり new & delete 必要なんですか。
ありがとうございます
663デフォルトの名無しさん:2011/06/13(月) 06:24:36.92
>>660
例示されたコードは文字列リテラルのアドレスだから問題はない
スタックにある文字列は無理だが
具体的にはchar s[] = "Hello World"; に変えたら無理だな
664デフォルトの名無しさん:2011/06/13(月) 18:26:04.81
例外でnew/deleteなんてしちゃ駄目だろ
誰もdeleteしてくれなかったらどうするんだ
素直にテンポラリオブジェクトを投げなさい
665デフォルトの名無しさん:2011/06/13(月) 18:55:27.24
throw string("Hello World");
でいいよ
多分
666デフォルトの名無しさん:2011/06/13(月) 18:57:04.14
例外って再送するたびにコピーされんのかな?
667デフォルトの名無しさん:2011/06/13(月) 22:36:20.03
catch( exception &e )

とかいう意味じゃなくて?
668660: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行で出来てはいるのですが
もっとスマートな方法はないですか?
670デフォルトの名無しさん:2011/06/14(火) 20:54:03.91
>>669
それ int ary[4]じゃなくて char ary[4] だろ
671デフォルトの名無しさん:2011/06/14(火) 20:57:17.01
いや、intです

char a = '0'
a = 48をa = 0にしたいのです
672デフォルトの名無しさん:2011/06/14(火) 21:00:19.76
文字コードがASCIIなのをチェックして48引くだけじゃね?
673デフォルトの名無しさん:2011/06/14(火) 21:02:43.55
やっぱりその方法しかないのでしょうか
ary[0] = buff[0] - 48 みたいなのは抵抗が・・・
674デフォルトの名無しさん:2011/06/14(火) 21:05:33.38
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] )
}
676デフォルトの名無しさん:2011/06/14(火) 21:09:49.96
for(i = 3; i >= 0; i--, a /= 10) ary[i] = a % 10;
677デフォルトの名無しさん:2011/06/14(火) 21:11:32.25
>>675
ヌルターミネータ'\0'がないぞ
678デフォルトの名無しさん:2011/06/14(火) 21:12:19.01
>>673
計算して出すとすれば、
for (i = 0, n = 1000; i < 4; i++){
ary[i] = a / n;
a -= ary[i] * n;
n /= 10;
}
めんどくさいね・・
679デフォルトの名無しさん:2011/06/14(火) 21:21:31.09
>>676 >>678
1234 % 10 → 4
123.4 % 10 → 3
12.34 % 10 → 2
1.234 % 10 → 1

これは素晴らしい
目からウロコとはこの事です
ありがとうございました
680デフォルトの名無しさん:2011/06/14(火) 22:53:27.56
白熱してるとこ悪いがCでは数字の文字コードは連続していることが保障されているから
-'0'でよくね?
681デフォルトの名無しさん:2011/06/14(火) 23:17:33.08
>>680
>>674へのツッコミをするためだけのレスならそれでいいけれど、
元の質問から行けば、そもそも文字列にしなくていいんだよ。
682デフォルトの名無しさん:2011/06/15(水) 08:59:15.39
# data.txt
# int FuncID, string FuncName
1, Hoge::Foo
2, Hoge::Bar
3, Fuga::Foo
4, Fuga::Baz

このような形式のファイルを読み込んで、配列に整数から関数へのマッピングを作りたいんですが(関数の型はすべて同じです)、可能でしょうか?
683デフォルトの名無しさん:2011/06/15(水) 09:52:44.37
えぴすてーめーは天才なんですか?
684デフォルトの名無しさん:2011/06/15(水) 10:56:57.40
>>682
可能だよ。
685デフォルトの名無しさん:2011/06/15(水) 12:30:17.56
可能ではあるが…
686デフォルトの名無しさん:2011/06/15(水) 12:37:24.85
.NETみたいにリフレクションが言語機能に組み込まれてないから
クラスに自前で用意する必要があるっていいたいの?ねぇ!?
687デフォルトの名無しさん:2011/06/15(水) 15:14:19.71
windowsならdll指定でLoadLibraryする形にできればいいんじゃね
Linuxとかでも出来そうだけど知識ないから教えて偉い人
688デフォルトの名無しさん:2011/06/15(水) 17:11:18.82
>>682
関数ポインタとかboost::function使えば簡単では
689デフォルトの名無しさん:2011/06/15(水) 17:13:40.59
単に名前からクラスと関数を検索できるように作っておいて
関数ポインタでも使えばいいんじゃね?
690デフォルトの名無しさん:2011/06/16(木) 08:15:48.08
初めて仮想関数(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なりでグローバルに宣言しておかないとダメですか?
691デフォルトの名無しさん:2011/06/16(木) 08:28:03.68
キャストすれば?
692デフォルトの名無しさん:2011/06/16(木) 09:32:49.84
コンストラクタを変更してnewするときに渡せばいいんじゃない?
693デフォルトの名無しさん:2011/06/16(木) 10:30:56.39
Derivedだけが持つ変数を書き換えたい時点で、
Base*として受け取ることがおかしいのでは。
694デフォルトの名無しさん:2011/06/16(木) 13:37:22.70
>>690
こういうことがしたいこと?
ttp://ideone.com/pt4AJ
695694 :2011/06/16(木) 13:39:04.52
スマン上抜けてた
ttp://ideone.com/Sjunr
696デフォルトの名無しさん:2011/06/16(木) 17:06:15.27
>>691-695
レスありがとうござます!
今から試してみます
697デフォルトの名無しさん:2011/06/16(木) 19:01:45.55
STL::vectorって例えば以下の場合で
deleteしてくれるスマートポインタになってる?

struct Orz { char* name };

Orz p = new Orz;
vector<Orz*> buffer;
buffer += p;
698デフォルトの名無しさん:2011/06/16(木) 19:21:48.87
>>697
なるわけねーだろカス
699デフォルトの名無しさん:2011/06/16(木) 19:38:55.71
>>697
std::vector<boost::shared_ptr<Orz>> hoge;
ならスマポになる
auto_ptrなんて入れるなよ!絶対だぞ!
700デフォルトの名無しさん:2011/06/16(木) 19:55:22.21
そんなあなたにboost::ptr_vector
701697:2011/06/16(木) 21:43:25.95
ならないのか。
スマポのコンテナ(内部で T* ptrBuffer[?]をもってるようなやつ)
がありそうでないのですな。
702デフォルトの名無しさん:2011/06/16(木) 22:05:51.73
>>701
こういうこと?
boost::shared_array<int> Array(new int[10]);
703デフォルトの名無しさん:2011/06/16(木) 22:06:36.34
どういう事なの…
704デフォルトの名無しさん:2011/06/17(金) 00:02:24.94
カスタムデリータを指定してデストラクタに入れときゃいいやん
クラス内部でnewするようにする
705デフォルトの名無しさん:2011/06/17(金) 00:32:36.41
>>704
そんな面倒な事をする位ならvector<vector<T> >にして
後からresize()するわ
706697: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);
707デフォルトの名無しさん:2011/06/17(金) 00:49:54.39
>>706
それはCOAP(Container of auto_ptr)だ
コンパイルが通らないコンパイラもある
708697:2011/06/17(金) 02:21:13.01
>>702 が近いと思いますが
ウィークポインタのコンテナがほしくなってきました
709デフォルトの名無しさん:2011/06/17(金) 03:15:01.91
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));
710デフォルトの名無しさん:2011/06/17(金) 06:52:13.74
弱参照で格納なのに自動でdeleteして欲しいって訳がわからないような
711デフォルトの名無しさん:2011/06/17(金) 06:56:42.29
コスト考えてptr_vecter
712デフォルトの名無しさん:2011/06/17(金) 10:13:16.63
初歩的な質問ですみません。
「不適切な Ptr」の状態のポインタ変数を、ifで検出したいのですが、==NULLや ==0では検出できず困っています。
構造的にそうならないよう作るしか手は無いのでしょうか? それとも検出方法は有るのでしょうか?
713デフォルトの名無しさん:2011/06/17(金) 10:28:51.76
>>712
初期化してないことが問題。
hoge* p = 0;
明示的に初期化すれば0で判定ができる
あとは使い終わったなら0を入れておく
delete p;
p = 0;

あとは普通に
if(p)
{
}
とか
714デフォルトの名無しさん:2011/06/17(金) 10:38:21.43
boost::optional
とか書いて混乱させてみる
715712:2011/06/17(金) 11:05:24.38
>>713
なるほど。そうすれば検出できるのですね。 ありがとうございます。

>>714
その様な機能が有るのですね。まだ詳しく理解できず私には早いみたいですが勉強になります。
ありがとうございました。
716デフォルトの名無しさん:2011/06/17(金) 15:27:55.22
>>715
意外とoptionalは簡単だぞ 余計なお世話かもしれないが
ttp://www.kmonos.net/alang/boost/classes/optional.html
考え方的には
template<class T>
class{
 T val;
 bool IsValid;
};
こういうこと
717デフォルトの名無しさん:2011/06/17(金) 17:54:28.74
そのコードは完全に誤解を招くな
実装見てこい
718デフォルトの名無しさん:2011/06/17(金) 19:03:32.05
>>717
kwsk
719デフォルトの名無しさん:2011/06/18(土) 01:13:47.22
>>716
717 じゃないけど、それだと T が常に初期化されてることになりそう。
720デフォルトの名無しさん:2011/06/18(土) 01:42:00.16
optionalは簡単に見えて実は結構難しいよね
721デフォルトの名無しさん:2011/06/18(土) 18:18:15.40
圧縮されたDLLをロードするには一回どこかに展開しないと無理?
メモリからロードとかできないのかな
722デフォルトの名無しさん:2011/06/18(土) 18:23:43.09
最初からUPX使っとけばいいのでは?
723デフォルトの名無しさん:2011/06/18(土) 20:01:52.96
すみません。
CreateControlWindowで作ったリストボックス(単一項目選択型)の選択項目の値
(SendMessageで作った項目の第三引数のWPARAMに設定した値)
を取得したいのですが、やり方が解らず困っております。

色々検索してみてもC++で書いている情報を見つけられず、
CB_SETCURSELやBM_SETCHECKで試してみるも何も成果が得られず困っております;
何かヒントだけでも頂けますと幸いです;
724723:2011/06/18(土) 20:19:28.77
度々すみません; LB_GETCURSELで選択を取れるとわかりました、
値の方も自己解決できると思います。 失礼しました;
725デフォルトの名無しさん:2011/06/19(日) 04:57:39.18
謝りまくってるけど
何か悪い事でもしたの?
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
727デフォルトの名無しさん:2011/06/20(月) 18:16:15.67
releaseビルドして作成したexeファイルが動かない場合、PCの何が影響していると考えられますか。
いろいろあると思いますが、例を教えてください。
プログラムはVS2005 VC++, MFCを用いて作成しました。

windowsXP SP3とDirectX9.0cの2つはビルドPCと実行PCで共通しています。

728デフォルトの名無しさん:2011/06/20(月) 18:54:50.98
runtime
729デフォルトの名無しさん:2011/06/20(月) 23:06:54.78
>>728

ありがとうございます。
自分なりに調べてみたのですが、
Dependency Walkerという無料ソフトでexeファイルをみてみたところ、

GPSVC.DLL
IESHIMS.DLL

の2つにError opening fileと表示されました。
こういった場合、どのように対処したらよいのでしょうか。
730729:2011/06/20(月) 23:20:03.09
追記で申し訳ありませんが、実行PCの方は
他のexeファイルをなるべく実行したくありません。

vcredist_x86.exeなど?
731デフォルトの名無しさん:2011/06/20(月) 23:38:30.37
http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/6b06e7f2-0d4f-49c1-aaa4-26097ad0a696/
セットアッププロジェクトを作るのが楽だと思うよ。
インストーラを作成するという手間が増えることはたしかだけど、インストーラの作成自体は以前より格段に楽になってるので、めげずに。
732デフォルトの名無しさん:2011/06/21(火) 02:24:07.91
お願いします。

Javaはある程度できるようになってます。
Cもネットでですが一通り目を通しました。
こういうものか、ってイメージはわいてます。
C++にいくのに独習C++を考えてます。
ただ、Visual C++っていうのが気になってます。
これって、いったい何なんですか?
733デフォルトの名無しさん:2011/06/21(火) 03:14:43.76
独習C++はやめとけ。Cを完全に理解してナイトいかん。

それより、同じ著者の標準講座c++の方がいい。

あと、VC++ってのは、C++言語でWindowsのアプリケーションを組むんだよ。
今君が使ってるInternetExplorerとかEXCELとか。
734デフォルトの名無しさん:2011/06/21(火) 07:11:30.22
VC++はMicrosoftのC++コンパイラの製品名
735デフォルトの名無しさん:2011/06/21(火) 10:47:49.62
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++入門としても使えるものなんでしょうか?
738デフォルトの名無しさん:2011/06/21(火) 11:33:57.80
>>737
まず無理だからやめとけ
739デフォルトの名無しさん:2011/06/21(火) 11:43:46.43
VisualC++って書いてあるのはVCコンパイラじゃなく、
統合開発環境VisualC++の使い方、みたいな内容だろたぶん
素直にやさしいC++でも読みな あるいはロベールとか
740デフォルトの名無しさん:2011/06/21(火) 11:46:27.16
>>737
少し前にこのスレだか関連スレだかで話題になったけど
VC++を謳う書籍・サイトはC++/CLIと言うC++とは似て非なる言語を
C++と称している
741デフォルトの名無しさん:2011/06/21(火) 12:42:21.78
>>740
マジでC++/CLIなんて変態言語載せてるの?
あれは熟練者が仕方なく苦渋の選択をして選ぶものだろうに
742デフォルトの名無しさん:2011/06/21(火) 13:00:41.38
何もかも中途半端だった
MSももう捨ててるよねあれ
743デフォルトの名無しさん:2011/06/21(火) 13:33:34.74
俺に聞けスレで聞いたら、守備範囲外って言われたので、こっちで質問

RHEL5.6で、SIGCHLDにSIG_IGN付けてsystemをコールすると必ず関数が-1で失敗するんだが、
何が公式の情報ってないのかな?
744デフォルトの名無しさん:2011/06/21(火) 14:02:26.30
業務用ディストリなんだからサポートに連絡しろ
なんのために契約料払ってるんだ?
745デフォルトの名無しさん:2011/06/21(火) 15:07:37.84
>>732
VC++の入門者向けの本なら、Javaを知ってる人なら、全然OKだよ。

Yahooオクとかで今もたくさん売ってるから「Visual C++」とかで
検索かけて買うのもいいよ。

基本的にC++の文法書はこちこちの文法書が多いから、VC++とかで
実際にプログラム組みながら文法を調べる方が実感がわかるよ。文法はネットでググッてもいいし。

俺は、独学ニートだけど、実際にプログラムを作る本で文法を学んだ方が楽しいし、よくわかった。
746デフォルトの名無しさん:2011/06/21(火) 16:31:36.85
ああ、MFCは無料版じゃつかえないか・・
>>732さん。MFC(C++/CLIというものでないもの)を使う場合は
有料版じゃないとだめなので、Yahooオクで本を買っても駄目でした。

というか、ふるいVC++の本はMFCというのがほとんどなので。

747デフォルトの名無しさん:2011/06/21(火) 17:18:49.64
>>743
死ね
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
???
$

「あああ」と表示させるにはどうすればいいでしょうか?
よろしくお願いします。
749729:2011/06/22(水) 00:05:15.43
>>731

ありがとうございます。
セットアッププロジェクトを作ってみようと思います。
URLのリンク先が英語のサイトなのですが、
もし日本語のサイトで参考になるサイトがあれば教えて頂きたいです。
750デフォルトの名無しさん:2011/06/22(水) 00:25:33.70
>>748
localeコマンドの結果をはって
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
$
752デフォルトの名無しさん:2011/06/22(水) 01:30:34.40
>>748
自分も気になってググったら、sync_with_stdio(false);したらいいよという話を見つけた。
ttp://www.asp-edita.jp/doda/one/doda4035_366.html

mainの頭でfwide(stdout, 0);呼ぶと0(マルチバイトのモード)が返ってくるので、
この時点ですでにstdio系はワイド文字ベースの読み書きを受け付けない状態になっているようだ。
753デフォルトの名無しさん:2011/06/22(水) 02:40:54.95
>>752
ありがとうございます。
std::ios_base::sync_with_stdio(false);
を追加したら動きました!

$ g++ utf.cpp -Wall
$ ./a.out
あああ
$

754デフォルトの名無しさん:2011/06/22(水) 13:23:59.91
>>749
リンク先は件のdllで問題が発生してることについてなので、それを翻訳しても実りはあまり無いかも。

んで、セットアッププロジェクトに関する日本語サイトはその辺にあると思うよ。もちろんMSDNでもいいし。
とりあえずは必須コンポーネントを含めちゃえばそれですむんじゃないかな。
755デフォルトの名無しさん:2011/06/22(水) 20:09:21.13
鼻くそ☆がうまい
756デフォルトの名無しさん:2011/06/23(木) 19:37:22.67
林春比古さんのC++の本はやりやすいですか?
757デフォルトの名無しさん:2011/06/23(木) 21:43:40.42
厚みもあるし、殺れるかもね。
758デフォルトの名無しさん:2011/06/23(木) 23:45:56.42
林(笑)
柴田(笑)
759デフォルトの名無しさん:2011/06/24(金) 00:28:16.48
質問です。Visual C++で以下の文だとデストラクタが一度しか呼ばれなくて困ってます
デストラクタがこれしか実行されません「デストラクタが呼ばれました。要素数は 40 でした。」
intarray.cpp
http://ideone.com/FMEYe
intarray.h
http://ideone.com/ElAsN
dstruct1.cpp
http://ideone.com/lXiYR

以下のページを参考にしたのですが・・・、C++ではローカル変数以外はプログラム終了時に破棄されるんですか?
いまいちどういう挙動しているのかわからないです

http://www7b.biglobe.ne.jp/robe/cpphtml/html02/cpp02006.html
760デフォルトの名無しさん:2011/06/24(金) 00:32:31.87
main()でやってることをまるごと、
別のテスト用関数に移してやってみなされ。

main() {
test();
cout << "一時停止 その2" << endl;
}
761デフォルトの名無しさん:2011/06/24(金) 00:34:34.46
メッセージが表示されていないだけでデストラクタは実行されてる
762デフォルトの名無しさん:2011/06/25(土) 16:56:01.38
すみません。Windowsプログラミングで
メッセージプロシージャのswitch〜case文の外で
「グローバル変数をifで確認し、一度きりの処理を行い、そのグローバル変数の値は別の値に変える」 というコードを書いているのですが、
次にメッセージプロシージャに戻ってくると値が元に戻ってしまっており、1度どころか100回以上処理している
という事が起きてしまっていて困惑しています。

入力系の子窓をサブクラス化している事が問題なのだろうか とも思うのですが・・色々試したり調べてもよくわからず。
何か思い当たる事、確認すべき事が有ったら教えて下さると幸いです。
763デフォルトの名無しさん:2011/06/25(土) 17:05:54.39
・グローバル変数のつもりだったけど実はローカル変数だった
・別の値に変えたつもりだったけど実は同じ値だった
・if文で確認しているつもりだったけど実は条件式が間違っていた
・値が元に戻って100回以上処理しているように見えたけど実は値は元に戻っていなくて1回しか処理していなかった
・メッセージプロシージャの先頭で変数を初期化していたので毎回元に戻っていた
・全然関係ない別のところでそのグローバル変数を元の値に戻していた
・バッファオーバーラン的なメモリの不正アクセス
764デフォルトの名無しさん:2011/06/25(土) 17:10:24.80
デバッガに変数の値が変化したらブレークするって機能あるよ
まともなデバッガなら
765デフォルトの名無しさん:2011/06/25(土) 17:19:23.52
マルチスレッドだったとか。
766デフォルトの名無しさん:2011/06/25(土) 17:33:38.99
if(g == 1) のところを if(g = 1)とかじゃね?
767デフォルトの名無しさん:2011/06/25(土) 17:42:46.59
グローバル変数ならデバッガで追って、いつの時点で戻るのか
確認しろ
768デフォルトの名無しさん:2011/06/25(土) 19:20:00.49
>>765-767 ご助言ありがとうございます。

>>763
ありがとうございます。全て自分なりに確認してみても理由がわからず、
原因の絞込みにCreateWindowを全部カットしたら正常に動く事がわかり、
CreateWindow前に変数をセットさせたら1度しか動かない事になりました。
・・・何かCreateWindowまわりでやってはいけない事でもやってる余寒がして怖いですが・・
今回の件は解決できました。テンパっていたので問題の絞込みができて助かりました。ありがとうございます。
769762:2011/06/25(土) 19:21:20.99
(↑名前のNo入れ忘れてました。)

>>764
>デバッガに変数の値が変化したらブレークするって機能あるよ
>まともなデバッガなら
そうなのですか!? Visual C++ 2008 ExpressEditionにも有るでしょうか;
そんな機能が有れば良いなと思いつつも見つけきれず、
いつも一々ステップイン ステップオーバーしながら何十分と変数の変化タイミングを探して画面睨んでました;
ググるワードだけで構いませんので教えて頂けますと幸いです;
770デフォルトの名無しさん:2011/06/25(土) 19:25:18.59
データブレークポイント
771デフォルトの名無しさん:2011/06/26(日) 03:24:14.29
メモリ壊してそうだな
ちゃんと管理出来てるか?
772762:2011/06/26(日) 10:40:24.01
>>770
早速解説を見てやり方が解りました。今後のデバッグが幾分楽になりそうです。ありがとうございます

>>771
無効なデータ(未使用等)を示すのに-1をいつも使っているんですが・・どこかの配列で-1のまま使ってしまってるんじゃないか という恐怖があります;
現状変数が狂う事態は起きていないですが、
もっと安全なやり方を身に着けないと、大きなプログラムはとても組めなさそうですね;
773729:2011/06/26(日) 23:56:10.46
自作ソフトが他のPCで動かないため、セットアッププロジェクトを
作ったらどうかとアドバイスを頂いた者です。

http://www.geocities.jp/i_love_balard/myhome/dnet/makesetup.html

上記のサイトを参考にセットアッププロジェクトを作ってみたのですが、

>後は、右の「ソリューションエクスプローラ」の下のアイコンを
>クリック選択することで、今までのインストーラと同じように
>レジストリや、セットアップフォルダ等を選択設定した後、
>ビルドすればMSIファイルができる。

の部分がいまいち何をすればよいかわかりません。

また出来上がったmsiファイルでソフトをインストールしてみたのですが、
インストール先のフォルダにはexeファイルが保存されただけでした。
このexeファイルはコピー貼り付けでexeファイルを入れるのと何か違うのでしょうか?
それとも何か手順が足りないのでしょうか?
774デフォルトの名無しさん:2011/06/27(月) 05:33:47.74
最早言語の質問じゃなくて、ソフトウェアの使い方の質問だな。
775デフォルトの名無しさん:2011/06/30(木) 10:56:30.10
もう夏か
776デフォルトの名無しさん:2011/07/01(金) 01:22:03.42
ある文字列を用意して、それに書式付きで文字列を追加したいです。
何回も追加を行うためできるだけ早い方法が良いと考えています。
候補として考えているのが、sprintf関数とostringstreamクラスですが、どちらが良いでしょうか?
ネットで調べるとsprintfのほうが早いとありましたが、自分で簡単にテストした結果ostringstreamのほうが早くなりました。
コードの書き方がおかしいのでしょうか?
詳しい方がいらっしゃったらご教授お願いします。
↓にテストコードを載せます。
777デフォルトの名無しさん:2011/07/01(金) 01:22:35.05
#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);
}
778デフォルトの名無しさん:2011/07/01(金) 01:35:20.47
sprintf(chr, "%s%s%s", "a", "a", "a");
chr += 3;
こいう感じになるとおもう
779デフォルトの名無しさん:2011/07/01(金) 01:35:32.79
Cで書いているのかC++なのか…
780デフォルトの名無しさん:2011/07/01(金) 01:45:11.91
sprintf(buf, "%s%s%s", "a", "a", "a");
sprintf(chr, "%s", buf);
chr += 3;

元に近づけるとこうか
strcat は死ぬほど遅いという特徴がある
781デフォルトの名無しさん:2011/07/01(金) 01:47:10.19
>>778
そちらで試してみたらostringstreamよりかなり早くなりました。
ありがとうございます。

>>779
習いたてのC++です。
782デフォルトの名無しさん:2011/07/01(金) 01:54:27.29
>>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
です。
783デフォルトの名無しさん:2011/07/01(金) 09:42:59.39
コード春なら>>1にあるideoneとか使えよと
784デフォルトの名無しさん:2011/07/01(金) 10:25:10.08
1レスに収まるなら別にいいだろ
785デフォルトの名無しさん:2011/07/01(金) 10:56:55.26
見に行くの面倒だったりするしな
でもスレに貼ったら貼ったでインデント崩れて見にくいし
まあ好きにしたらいいんでないかと思う
786デフォルトの名無しさん:2011/07/01(金) 12:28:05.29
strcat()の名誉のために弁護しておくと、終端を検出するのがstrcat()のメリット。
つまり、ループに入れてしまうと毎回終端を検出することになるから遅くて当然。
strcat()は一発勝負のときにこそ使うべし。

# って、やっぱ使えねぇw
787デフォルトの名無しさん:2011/07/01(金) 12:46:40.80
mallocをしたもの初期化せずにstrcatしてるからすごく無駄な'\0'探しをさせてる。というかアウトだ
だからchar *chr = (char*)calloc(LOOP*3+100, 1);にすると大分早くなる
といってもすでに出されてるsscanfを使った方法とは比較にならんぐらい遅いけどね
でもstrcatの後にchr += 3;入れてやれば殆ど変わらくなるからstrcatが殊更遅いというわけでもなく
やっぱり終端の検索をループごとにしてたのが問題だね

長文になっちゃったけど既出情報ばっかだな・・・・・・
788デフォルトの名無しさん:2011/07/03(日) 08:33:28.96
オブジェクトに一時的にメンバ変数を追加したい、という要求を満たすにはどうする?
グラフ構造で要素をもつノードと持たないノードがあって勿体無いから外部からくっつけたりとったりしたいとか
あるクラスをスクリプトに公開する事になったが仮想マシンは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");
789デフォルトの名無しさん:2011/07/03(日) 13:26:32.30
意図が分からん
790デフォルトの名無しさん:2011/07/03(日) 13:30:41.61
MATLABの動的プロパティみたいな感じで
791デフォルトの名無しさん:2011/07/03(日) 14:22:57.68
dynamic_property_map
792デフォルトの名無しさん :2011/07/06(水) 09:21:03.04
すいませんがVisualStudioでプロジェクトの構成プロパティのリンカで
既存のlibをリンクさせる設定ってどうやるんでしたっけ。
どなたかすいませんが教えてください。
793デフォルトの名無しさん:2011/07/06(水) 09:33:50.60
スレチ
794デフォルトの名無しさん:2011/07/06(水) 15:03:02.36
>>792
例えばVS2010なら

ソリューションエクスプローラで
プロジェクトを右クリックプロパティ、
構成プロパティ->リンカー->全般->追加のライブラリディレクトリ-> libのパス -@
構成プロパティ->リンカー->入力->追加の依存ファイル->〜.lib -A

@はプロジェクトのあるフォルダに.libファイルがあれば省略可
Aはソースコードに
#pragma comment(lib,"〜.lib")
でもおk
795デフォルトの名無しさん:2011/07/06(水) 21:36:21.35
すみません。WindowsXPでtxtを読取り加工し出力すると 0D0D0A というコード(改行コード?)が出力されます。(特にBYTEやchar配列の後に。)
文字列中に 0D0D0A が有るかを、strstrで確かめたいのですが、"\r\n"では検出されてくれず、"\r"では検出されます。
0D0D0A を見つけるにはどんな文字で確かめるのが正しいのでしょうか?
796デフォルトの名無しさん:2011/07/06(水) 21:56:48.93
テキストモードなら\n
バイナリモードなら\r\n
797デフォルトの名無しさん:2011/07/06(水) 22:52:03.41
VC#の入力補完とかリファクタリングはすごいな
C++でもやってくれればいいのに
798795:2011/07/06(水) 23:08:01.87
>>796
モードによるんですね。私のやり方に何かミスが有ったのでしょうか・・"\r"だけしかヒットしないのは。
何にしても問題の絞込みが出来ました。ありがとうございます。
799792:2011/07/07(木) 09:05:19.79
>>794
ありがとうございました。
800デフォルトの名無しさん:2011/07/07(木) 09:16:06.28
>>797
一番凄いのはVB
入力が楽過ぎる
801デフォルトの名無しさん:2011/07/07(木) 23:26:33.93
>>797
Microsoftいわく
(統合環境の)新技術は、C#とVBにまず導入され、続いて、
可能ならばC++で、となるため、必ずC++が一歩遅くなります。

だそうだ。
802デフォルトの名無しさん:2011/07/08(金) 08:54:50.19
そもそもあんな糞エディタ使わないし。
803デフォルトの名無しさん:2011/07/09(土) 12:30:46.59
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))
804デフォルトの名無しさん:2011/07/09(土) 12:36:41.43
どういう型になると思ったんだ?
どう納得がいかないかも添えてくれないと
どうみてもそれで正しいだろカスとしか言えん
805デフォルトの名無しさん:2011/07/09(土) 12:54:47.43
「tfはvoid(void)なのにf1引数がvoid(*)(void)になるのが納得いかない」
という話だろう。f1のコンパイルエラーを期待したんだろう。
そんなことわかってるのに、わからないとごねる>>804がチンカス
806デフォルトの名無しさん:2011/07/09(土) 12:55:35.88
>>804
死ね
807デフォルトの名無しさん:2011/07/09(土) 13:20:52.77
↑カス
808デフォルトの名無しさん:2011/07/09(土) 20:00:51.08
落ち着こうや
809デフォルトの名無しさん:2011/07/10(日) 03:11:37.05
>>773
アプリケーションの追加と削除に現れるあたりが違う
依存関係にあるDLLをインストーラに組み込めば?
もしくは、よく見てないけどそのDLLが含まれている再頒布可能パッケージを組み込む
810デフォルトの名無しさん:2011/07/10(日) 04:36:46.91
>>803
正しい。
void f(int a[100]); が void f(int *a); と解釈されるのと同様に、
void f(void g()); は void f(void (*g)()); と解釈される。
この狂った仕様はCにもC++にもある。
811デフォルトの名無しさん:2011/07/11(月) 21:50:11.74
C言語を勉強しているのですが出力が白黒ばっかで面白くありません
もっとなんかこう派手で面白いことをやるにはどうすればいいですか
812デフォルトの名無しさん:2011/07/11(月) 21:51:46.61
C#でGUIやればいいよ
813デフォルトの名無しさん:2011/07/11(月) 21:53:05.46
>>811
プロンプト調整すれば色付きになるよ
814デフォルトの名無しさん:2011/07/11(月) 22:49:47.65
>>811
Qt Creator入れてC++をやるんだ
815デフォルトの名無しさん:2011/07/11(月) 23:05:33.46
>>811
>>812の言うとおり、Cでアプリケーションプログラムを作ろうというのが
間違い。別の言語を選ぶんだな。
816デフォルトの名無しさん:2011/07/11(月) 23:06:12.15
すみません。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);

フォーカスはそのままで、文字が選択状態にはなってくれません。
何かお気づきの点や確認すべき点が思い当たるならば、教えて頂けますと幸いです。よろしくお願いします;
817デフォルトの名無しさん:2011/07/11(月) 23:09:40.86
>>811
サウンドプログラミングは?
まずはMMLのプレーヤーとかを作ってみると面白いかも
818デフォルトの名無しさん:2011/07/11(月) 23:13:34.09
>>816
そんな遠回りせずに
普通にEditボックスのウィンドウハンドルに対してEM_SETSELおくれよ
819デフォルトの名無しさん:2011/07/11(月) 23:22:37.21
>>811
openglで絵を描けばおもろいよ
2Dなら結構簡単だしウィンドウならGLUTがあるし
820816:2011/07/11(月) 23:25:43.80
>>818
すみませんでした; 仰られるように直接やったら動作しました、失礼しました;
821デフォルトの名無しさん:2011/07/12(火) 03:44:47.98
すみません。Windowsプログラミングで、
SetFocusで子窓を移動させているんですが、ビープ音(警告ダイアログと同じ音)がしてしまいます。
サブクラスのメッセージプロシージャ内でSetFocusするのがマズいのでしょうか?
822デフォルトの名無しさん:2011/07/14(木) 22:51:57.22
int main(void)
{
main();
return 0;
}

これ実行すると途中で勝手に終了するんだけどなんでなん
823デフォルトの名無しさん:2011/07/14(木) 22:53:23.85
>>822
スタックオーバーフロー
824デフォルトの名無しさん:2011/07/14(木) 22:58:52.22
なるほど
途中でもうやってられんわ!なって投げ出したのな
ありがとさん
825デフォルトの名無しさん:2011/07/15(金) 01:38:28.44
>>822
CならいいがC++ならそもそも文法エラーだしな
826デフォルトの名無しさん:2011/07/15(金) 01:57:57.87
そうなん
ideoneでやったら普通にコンパイル通ったけど
827デフォルトの名無しさん:2011/07/15(金) 02:54:52.54
| The function main shall not be used (3.2) within a program.

C++では明確に禁止されてるな。
828デフォルトの名無しさん:2011/07/15(金) 02:59:05.82
C++はなぜ禁止にしたの?
829デフォルトの名無しさん:2011/07/15(金) 03:02:47.06
そうすると何のエラーも出さないコンパイラの方がおかしいんかな
830デフォルトの名無しさん:2011/07/15(金) 21:48:33.26
>>822
これなら落ちないんじゃないか?
int main(void)
{
return main();
}
831デフォルトの名無しさん:2011/07/15(金) 23:55:15.76
>>830
本気か?
出来の悪い冗談だよな?
832デフォルトの名無しさん:2011/07/16(土) 00:52:48.49
バカなんだろ
833 ◆QZaw55cn4c :2011/07/16(土) 01:00:54.38
>>831
つ 末尾再帰 gcc4 では末尾再帰を検出してくれるらしい。
>>832
お互い様ですねえ。
834デフォルトの名無しさん:2011/07/16(土) 01:07:14.14
ループに変換されるから落ちないとか
激しくどうでもいいな
835デフォルトの名無しさん:2011/07/16(土) 02:00:33.27
元からどうでもいい話題だから仕方ない
836デフォルトの名無しさん:2011/07/16(土) 08:36:10.06
プログラムの中から main() を呼ぶという
意味がわかりません。
fork()的な事を考えたのかな。
837デフォルトの名無しさん:2011/07/24(日) 14:06:57.99
すみません。エースターという経路探査を勉強したいのですが、
見つける解説サイトが、いきなり難しい数式サイトなどで行き詰っております;

比較的説明のやさしい入門サイト をどなたかご存知ではないでしょうか?
(できればC++のサンプルコードが有ると、いじりながら構造を学習できてよいのですが;)
よろしくお願いします;
838837:2011/07/24(日) 16:48:42.30
何とか自力で理解できる解説サイトを見つけられ解決できました、失礼致しました;
839デフォルトの名無しさん:2011/07/27(水) 03:57:01.66
Linuxで大規模計算をするコマンドラインプログラムを作っています。
計算終了時に、twitterに終了した旨のメッセージを書き込みたいのですが、どのような方法がよいでしょうか?
840デフォルトの名無しさん:2011/07/27(水) 07:15:54.83
>>839
sendmail で自分の携帯電話にメールを送って自分で twitter に書き込む
841 忍法帖【Lv=33,xxxPT】 :2011/07/27(水) 10:59:34.19
>>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年の中で初心者に一番とっつきやすいし
ためになるフレームワークだぞ。

本がほとんどないからいけないけど、ドキュメントはかなりいい。ドキュメントのサンプルたくさんやると
844デフォルトの名無しさん:2011/07/28(木) 21:12:02.42
>>811
http://www.kde.gr.jp/~ichi/qt/
↑の「始めよう」ってとこで、たくさんやるんだ。C++やっときゃ、何の言語でもわかるようになる。
845デフォルトの名無しさん:2011/07/28(木) 21:27:28.25
馬鹿にしてんのか?
846デフォルトの名無しさん:2011/07/29(金) 09:24:35.98
すみません。VC++ 2008 EEでDebugビルドだと問題なくプログラムが起動するのですが、
Releaseビルドにするとワイド文字を要求され、それに合わせると今度はDebugビルドで文字の型が違うと言われます。
どこの設定を変えればこの問題を解決できるのでしょうか?

また、全てワイド文字に合わせて組むべきだと思われますか・・?
847デフォルトの名無しさん:2011/07/29(金) 09:42:52.65
プロジェクトのプロパティ -> 全般 -> 文字セット
848846: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つの関数のどちらを呼び出せばいいか
わからなくなるからみたいです。

どうやって、呼び出し・定義したら、このエラーはなくせますか?
850849]:2011/07/29(金) 14:02:41.80
まちがえた・・

createWebWindow(); と書いて呼び出すと
です。Webが抜けていました。
851デフォルトの名無しさん:2011/07/29(金) 14:07:08.97
void createWindow(bool checked=false);

void createWebWindow(bool checked=false);
852849:2011/07/29(金) 14:10:36.90
void createWebWindow(bool checked=false);
void createWebWindow();
と2つ宣言し(オーバーロード)
createWebWindow();として呼び出すと、
どちらとも意味がとれるみたいです。

すみません。記述ミスばかりで。
853デフォルトの名無しさん:2011/07/29(金) 14:13:56.04
=falseを消す
854849:2011/07/29(金) 14:18:03.53
>>853
なるほど。やはり、それしか手はないですか。
そうすると確かにコンパイルエラーはとれるんですが、
デフォルト引数がつかえなくなってしまいます。

まあ、やはりしょうがなさそうです。

どうもありがとうございました。助かりました。
855デフォルトの名無しさん:2011/07/29(金) 15:23:39.10
むしろなんでそんなことする必要があるのかわからん
856 忍法帖【Lv=1,xxxP】 :2011/07/29(金) 15:42:25.37
>>854
ではおまいさんは、他人がcreateWebWindow()と書いたときにどっちの積もりなのか分かるのかい?
857デフォルトの名無しさん:2011/07/29(金) 17:37:13.59
すみません。
数値を扱う一次元の配列の検索で、STLのmapを使うのは無駄なのでしょうか?
普通にfor〜ifで総ざらいにして見つけたらbreakした方が良いでしょうか?
858デフォルトの名無しさん:2011/07/29(金) 17:38:09.59
無駄じゃないですよ
859デフォルトの名無しさん:2011/07/29(金) 17:43:55.84
>>857
値と一対一に対応するキーがなくて、配列でループで調べてるんなら
それをmapにしても意味ないね。
860857:2011/07/29(金) 18:02:36.43
>>858
無駄ではないのですね。ありがとうございます。
>>859
発見した位置(要素No)が値がわりなのですが・・もっと良い方法も有ったりしそうな気がしなくもないですね・・

ご助言ありがとうございました。
861デフォルトの名無しさん:2011/07/29(金) 18:04:53.74
>>859
仮に「値=キー」でも検索速度は向上するわけだから意味はあるでしょ。
862デフォルトの名無しさん:2011/07/29(金) 18:12:48.73
>>861
そう言われたらそうだね。
キーのほうに値を入れておけばいいか。
863842:2011/07/30(土) 00:13:00.80
C++のlocale関連は誰も答えられんか・・・。
864デフォルトの名無しさん:2011/07/30(土) 00:22:24.01
なんでstd::setを誰も薦めないんだろう
865デフォルトの名無しさん:2011/07/30(土) 01:36:43.00
要素Noが必要だからじゃね
866デフォルトの名無しさん:2011/07/30(土) 20:21:41.54
#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 やファンクタによる、かっこいい実装を希望します。
867866:2011/07/30(土) 20:27:18.34
質問がわかりにくかったら
ttp://ja.w3support.net/index.php?db=so&id=771453
これの逆パターンです
map pair.second → vector
これを
vector → map pair.second
できる、方法を教えてくださいませませ
868デフォルトの名無しさん:2011/07/30(土) 21:36:08.12
>>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 : スーパークラスの関数
と書く場合もありますし、
:スーパークラスの関数を書かない場合もあります。

どういう使い分けするのですか?
870デフォルトの名無しさん:2011/07/30(土) 22:51:59.43
void SubClass::hogehoge : スーパークラスの関数
こんな書き方初めて見たんだけど
なんていう言語なの?
871870:2011/07/30(土) 22:55:05.42
え?QtのQt入門っていう本に載ってますから、C++じゃないんですか?
その本のままかくと、

FindDialog::FindDialog(QWidget *parent) : QDialog(parent)
{
// 関数本体
}

とあります。FindDialogが子クラスでQDialogが親クラスです。上の関数は
FindDialog(子クラス)のコンストラクタです。
872デフォルトの名無しさん:2011/07/30(土) 22:59:15.27
>>871
それはコンストラクタの初期化子リスト
関数をオーバーライドしてるわけじゃない
>>871は継承したQDialogのコンストラクタを呼んでる
873デフォルトの名無しさん:2011/07/30(土) 23:03:24.27
>>871
親クラスの引数ありのコンストラクタを
明示的に、子が呼んでる。それだけ

void SubClass::hogehoge : スーパークラスの関数
てか↑これは激しく違うじゃないかwww
874デフォルトの名無しさん:2011/07/30(土) 23:57:30.46
俺が知らない、親クラスに応じてオーバーライドした実装を変えられる素敵機能が
隠されてたのかとちょっと期待しちまったじゃねぇか。
875870: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);
}
877876:2011/07/31(日) 22:02:22.59
静的メンバに map コンテナがあります。
デストラクタ内で map コンテナ要素を erace すると、
"読み込み中にアクセス違反が発生しました。"
とエラーが出ます。
別のメンバ関数内ではできますが、
コンストラクタとデストラクタ内ではエラーが生じます。

環境は WinXP_sp3、Vc++2005 です。
どなたか教えていただけないでしょうか?
Google 先生にも見捨てられました。
878デフォルトの名無しさん:2011/07/31(日) 22:12:35.83
再現しないソースを手入力とな
879デフォルトの名無しさん:2011/07/31(日) 22:14:12.58
問題はあんたの書いてないところにある
880876:2011/07/31(日) 22:29:34.85
そうみたいですね、失礼しました。
しかし、あんまり長大なソースをここに書く訳にもいかないし、
どの部分を抽出すれば良いのかも不明だし、
もう少し自力で頑張ってみる事にします。
ありがとうございました。
881デフォルトの名無しさん:2011/07/31(日) 22:49:06.91
コンストラクタとデストラクタに(void)がついていたり
static なのに this でアクセスしたり
何だか不安な気分にさせるソースだな…
882876:2011/07/31(日) 22:55:32.32
すみません、初心者なもんで。
this->mapThis
はマズかったですか?
一般的にはどうアクセスするのでしょう?
複数作るオブジェクトの、どれのthisポインタからもアクセスできるはずと
思っていたのですが。
883デフォルトの名無しさん:2011/08/01(月) 04:36:04.61
>>882
static メンバへのアクセスに this ポインタは要らないんだよ。
884デフォルトの名無しさん:2011/08/01(月) 05:41:57.26
>>882
C++なら(void)は()と書けるし
thisもPythonなどと違い省略可能だから(メンバより内側のスコープで名前が被らなければね)
わざわざ書く人が少ないってだけで
好きに書けばいいよ

static云々のくだりは意味不明なので
>>881さんや>>883さんに説明してもらうしかない
885876:2011/08/01(月) 08:41:07.16
なるほど、でも自分は指差し確認みたいに明示して書く。
間違いが少なくなるし。
シロウト臭はするでしょうね、実際そうだし。
886 忍法帖【Lv=2,xxxP】 :2011/08/01(月) 11:20:52.94
>(this->mapThis).erace(this->hSelf);
this->mapThis.erase(this->hSelf);
じゃないのはなんで?
887デフォルトの名無しさん:2011/08/01(月) 16:32:53.22
すみません。VC++ 2008 EEを使っているのですが、
デバッグで
if ((i==1005)&&(j==1002)) { 〜〜〜 }
などの中のブレークポイントで止めて、i と j にオンマウスして値を確認すると
i=0 j=1092616192 などとおかしな数値になっています。

CreateWindowのハンドルも 正常に作られているのに不正な〜〜と出ていたりします。

時折思った位置のブレークポイントを入れようとしても
いざデバッグを始めるとブレークポイントがふっとんで
思い通りの位置でデバッグできなかったり。

何でこういった事が起こってしまうのでしょうか・・?
888 忍法帖【Lv=2,xxxP】 :2011/08/01(月) 16:44:15.43
リリース版をデバッグしているからじゃね?
リリース版でなくても最適化してたら同じことだけど。
889デフォルトの名無しさん:2011/08/01(月) 16:44:26.58
pdbファイルが壊れてるんだろう
リビルトすれば大抵治る
890887:2011/08/01(月) 17:54:20.57
>>888
今回はリリースにしたままになっていました; デバッグに戻したら正常に。ありがとうございました〜

>>889
デバッグの中にそういうファイルが有りました。
これが壊れても似た事が起こるのですね。 記憶しておきます。 ご助言ありがとうございました〜
891876:2011/08/01(月) 20:12:18.60
>>886
自分の頭の中で、
(this->mapThis) という部品(コンテナ)に、
.erace(this->hSelf); という命令を出している感覚だから。
観念上の切り分けで整理する為にカッコ付けしました。

本職が機械設計なんで、機材に動作命令を入力する概念なら理解しやすいのです。
ソフトウェアをハードウェア的に解釈する方が好みなのです。
892876:2011/08/01(月) 20:32:02.56
実はMDIウィンドウのクラス化、カプセル化に挑戦中で苦しんでます。
書籍のMDIソースを元に、気長に改造しつつあります。
参考になりそうなサイトを知っている方がいたら、教えていただけないでしょうか。
893デフォルトの名無しさん:2011/08/02(火) 06:59:17.99
近代的なQUIライブラリの代表選手のQtとかか?
894876:2011/08/02(火) 23:05:53.41
thx 見てみます。
895デフォルトの名無しさん:2011/08/03(水) 10:48:59.74
正直、>>876は、もっと修行してから、クラス化・カプセル化に挑むべき。
896デフォルトの名無しさん:2011/08/04(木) 02:00:04.10
<再> static メンバへのアクセスに this ポインタは要らないんだよ。

っつーか、逆に hoge::mapThis ってやらないと
コンパイラが文句言ってうるさいんですけどw 無視してんの?
897デフォルトの名無しさん:2011/08/04(木) 04:48:35.23
どのコンパイラがそれだしてくれるんだろ。
> <再> static メンバへのアクセスに this ポインタは要らないんだよ。
なんでstaticメンバ限定なの

>>886の真意はそこじゃなくて erase じゃないかと思うんだが、ひねくれてんのかな俺
括弧の有無については慎重な人なんだなと思うが、まさか機械設計がどうとかいうとは思わなかった。
本職のポリシーみたいなのを持ってこないほうがいいよ。
物理学者がマリオのジャンプに難癖つけてるみたいでかっこ悪いよ。
898デフォルトの名無しさん:2011/08/04(木) 06:17:32.39
たとえにワロタ
899デフォルトの名無しさん:2011/08/04(木) 07:39:56.99
確かに括弧悪い。
900デフォルトの名無しさん:2011/08/04(木) 13:18:29.23
すんげー初歩的なようで気が引けるんだけど教えてください。
グローバル変数の初期化って、初期化子が関数でもいいの?いいみたいなんだけど。
たとえばこんな感じで:

int func(){return 100;};
int a=func();

実際動くしダメな理由も思いつかないけど、こんなことしたことないし、ググっても例が見当たらなかった。
901デフォルトの名無しさん:2011/08/04(木) 13:22:14.13
>>900
即エラーにはならないけど、 func() の中で a や他のまだ初期化されていない
グローバル変数を触って未定義動作になったり結果が定まらなかったりする
可能性があるから危ない。気をつけて使う必要がある。
902デフォルトの名無しさん:2011/08/04(木) 13:36:33.02
うん
903デフォルトの名無しさん:2011/08/04(木) 13:38:06.77
int a;
a=func();

とどこが違うのでしょう。
904デフォルトの名無しさん:2011/08/04(木) 13:50:21.33
aはグローバル変数なの?
905900:2011/08/04(木) 13:53:47.99
ありがとございます。

>>901
func()が他にまずい依存をしてないって前提で、ってことですね。
ちなみに、組込み機器のロータリスイッチの値を取ってくるのに使ってました。
ドライバをioctl()で叩いてるだけだから大丈夫でしょう。

>>903
プロトタイプ宣言省略したかったんで。
906デフォルトの名無しさん:2011/08/04(木) 14:00:02.43
>>905
プロトタイプ宣言うんぬんは間違いですね。よく読まなかった。

この事案、人が書いてるコード上での問題でして、訊かれてハテナ?となったもんで質問した次第です。
他にもグローバルなクラスオブジェクトがあって、それのコンストラクタが上記'a'にあたる変数に依存してるんで、mainが走る前にaに値を入れようとこんなことしでかしたわけです。

だもんで、とmain関数後にa=func();と書かなかったわけです。
907デフォルトの名無しさん:2011/08/04(木) 14:03:18.14
>>906
そのグローバルなオブジェクトのコンストラクタと a の初期化と、
どっちが先に走るか確定させられるの?
908デフォルトの名無しさん:2011/08/04(木) 14:22:46.34
>>907
同じファイルに書いてあるなら、先に書いてあるほうが先に初期化される、はず、らしいです。
ということで、二つを同じファイルで定義して、やってみて動いたらOK、と言っておきました。
909876:2011/08/04(木) 15:20:18.05
>>896
はて、私の環境ではコンパイラは文句を言いません。
>>897
自分に理解しやすい方法でコードを書いているだけです。
他人に自分のやり方を押し付けるつもりはありません。
どうしてなんだ?と聞かれたから素直に答えただけですよ。

910876:2011/08/04(木) 15:37:10.61
>>876
自己レスです。

原因わかりました...
map コンテナの静的メンバ初期化より前に、hoge クラスのオブジェクトを生成していました。
hoge hogehoge; //
map<HWND, hoge*> hoge::mapThis; //初期化
コンパイラは通ってしまい、実行時にエラーがでるので気がつきにくかったようです。
以上、お騒がせしました。
911デフォルトの名無しさん:2011/08/04(木) 15:40:28.07
クズの臭いがプンプンしやがる
912876:2011/08/04(木) 16:13:45.86
>>886
>>897
erace >> erase
ですね、2ch に書き写す時に慌ててミスったみたいです。
ちゃんとオリジナルの私のソースは erase になってます。
913デフォルトの名無しさん:2011/08/04(木) 22:22:43.79
>>909
> 自分に理解しやすい方法でコードを書いているだけです。
> 他人に自分のやり方を押し付けるつもりはありません。
でも、ここに書いたことで他人に読ませるコードになったよね。
いやなら見るな!いやなら見るな!押し付けるつもりはない!ですかね
914876:2011/08/04(木) 23:38:12.75
>>913
ええ、そうです。
不特定多数が書き込むのですから。
915デフォルトの名無しさん:2011/08/05(金) 08:59:43.83
見てもらいたくて書いたくせに「いやなら見るな」かよ
916876:2011/08/05(金) 10:06:32.36
>>915
ええ、相談に乗っていただける方に見てもらえば充分です。
プログラミングスタイルは各々の工夫による物であり、違っていて当然です。
他者のスタイルは参考にはなっても、同じにしなければならない義務はありません。
不特定多数が出入りする場所には、気に入らないスタイルの相手はいる事でしょう。
だから何です?、あなたには見てもらわなくて結構ですよ。
917 忍法帖【Lv=3,xxxP】 :2011/08/05(金) 11:05:25.16
そうは思っても、敢えて書く必要もなかろうに。
918デフォルトの名無しさん:2011/08/05(金) 11:16:20.28
元気があってよろしい。
919デフォルトの名無しさん:2011/08/05(金) 13:26:33.87
元気があればなんでも出来る。
920デフォルトの名無しさん:2011/08/05(金) 13:40:47.90
ただし放射能汚染は防げない
921デフォルトの名無しさん:2011/08/05(金) 14:49:51.67
見てもらいたくない人に見てもらわないこともできない
922デフォルトの名無しさん:2011/08/05(金) 19:02:56.25
>>876
見てくれる人だけに見て欲しいというのは構わんが、

> this->mapThis
thisポインタ経由でないものを「文法エラーでないから」といって
こんな糞コード書かれると、真似する奴がいて迷惑なんだよ。
せめて他人に迷惑は掛けないようにしろ。
923876:2011/08/05(金) 20:05:19.25
>>922
静的メンバにも同様のやり方でアクセスできるのだから、操作感の統一は大事です。
これが私のスタイルです、あなたに合わせる義理はありません。
924876:2011/08/05(金) 20:44:23.52
>>922
もし私の真似をする人がいるなら、その人もあなたとはスタイルが違うというだけです。
それが何か?

ここにバグがあるとか、こうすればミスを減らせるという話ならありがたく聞きますが、
俺とスタイルが違うと文句いわれてもねぇ。
925デフォルトの名無しさん:2011/08/05(金) 20:54:46.25
876のフリをするスレになってきたな
926デフォルトの名無しさん:2011/08/05(金) 21:37:40.46
char と cont char は使い分けたほうがいいの?
927デフォルトの名無しさん:2011/08/05(金) 21:39:19.89
うん、使い分けないとコンパイルエラーになるよ
928デフォルトの名無しさん:2011/08/05(金) 21:39:55.94
>>876
他クラスから呼ぶときはx::mapThis、非staticメンバ関数から呼ぶときはthis->mapThis、
staticメンバ関数から呼ぶときはx::mapThis、では統一性に欠けると思います。
「staticはx::mapThis」で統一するのがミスを減らせるのではないでしょうか
929デフォルトの名無しさん:2011/08/05(金) 21:49:37.72
windows の WndProc系ラッパくさいから
staticメンバ関数から staticメンバ変数である mapThis を参照する可能性が高い
staticメンバ関数は(そもそも this 持てないから) >>876 スタイルでどー記述するだ?
って話になるな (ほぼ >>928 の意図かと思われる)
930876: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通りじゃ無い訳です。
931876:2011/08/05(金) 22:34:26.79
御免なさい、訂正です。

メリットは、無数にあるどのオブジェクトから静的メンバから呼ばれたのか判断できる事です。
↓↓↓
メリットは、無数にあるどのオブジェクトから静的メンバが呼ばれたのか判断できる事です。
932デフォルトの名無しさん:2011/08/05(金) 22:38:46.24
でっていう
933デフォルトの名無しさん:2011/08/05(金) 22:54:45.35
なんでそんなもん分かる必要あるんだ
934デフォルトの名無しさん:2011/08/05(金) 23:00:10.15
夏なんだからスルーしろよ
935デフォルトの名無しさん:2011/08/05(金) 23:04:15.53
勉強もかねてC++で簡単なWindowsアプリを作りたいのですがVisualC++とか
ないと作成は無理なのでしょうか?
例えば、C++の参考書に付いているCDのコンパイラなどでも作成は
可能なのでしょうか?
936デフォルトの名無しさん:2011/08/05(金) 23:07:30.09
できるけど、なれないうちはVC++が一番簡単だよ
937デフォルトの名無しさん:2011/08/05(金) 23:08:36.36
今から学ぶならC#をお勧めする
938デフォルトの名無しさん:2011/08/05(金) 23:08:41.52
BCCはやめろ
939デフォルトの名無しさん:2011/08/05(金) 23:15:55.88
>>935
CDコンパイラは止めろ。
今のC++でのWindowsアプリは
Qt
で行うのが普通
Win用QtにはGCCもついているが、やっぱりVC++2010だな
940デフォルトの名無しさん:2011/08/05(金) 23:21:38.34
qt vc2010に対応したのか
941876:2011/08/05(金) 23:22:20.92
>>933
静的メンバ内で this ポインタを使えるし、
どのオブジェクトから呼び出されたかによって静的メンバ関数内で処理を分岐させたりできますが?
発想しだいで便利な利用方法はあるはずです。
思い当たる人だけ分かってもらえば良いですよ。
942デフォルトの名無しさん:2011/08/05(金) 23:27:15.93
>>941
静的メンバ関数内ではthisは使えないけど
なんの話してるんだ?
943デフォルトの名無しさん:2011/08/05(金) 23:28:17.76
メンバ関数使えカスwww
944デフォルトの名無しさん:2011/08/05(金) 23:28:45.14
>>941
まさにバカの発想
945876:2011/08/05(金) 23:30:05.51
>>942
工夫すれば、静的メンバに this を渡せますよ。
先ほど説明しました。
国語的に分かりにくくて申し訳ないですが。。。
946876:2011/08/05(金) 23:33:32.10
>>943
なぜ?、静的メンバを使いたい場面もあるでしょう?
>>944
理由も説明せずにバカ呼ばわりは酷いですね。

947デフォルトの名無しさん:2011/08/05(金) 23:34:47.35
どうやら頭がおかしいようだね
948876:2011/08/05(金) 23:48:22.83
>>947
ほう、説明してくれ。
どうおかしい?
もはやプログラミングの話ではなくなってしまうな、スレ違いだし。
個人攻撃はやめて欲しいのだが。
949デフォルトの名無しさん:2011/08/05(金) 23:51:56.00
攻撃しているんじゃなく、率直な気持ちを言っているだけじゃね
950デフォルトの名無しさん:2011/08/05(金) 23:52:32.23
どうっていうか何もかもだろw
951デフォルトの名無しさん:2011/08/05(金) 23:53:05.12
>>945
>> 静的メンバ関数内ではthisは使えないけど
>> なんの話してるんだ?
> 工夫すれば、静的メンバに this を渡せますよ。

日本語通じないの?
952デフォルトの名無しさん:2011/08/05(金) 23:56:53.17
>メリットは、無数にあるどのオブジェクトから静的メンバから呼ばれたのか判断できる事です。
静的メンバ関数はオブジェクトから呼ばれるものではないし。

>>876のやりたいのは↓だろ。それにしてもおかしすぎる
struct b {
 virtual void f() = 0;
 static void __stdcall Callback(void *param) {
  static_cast<b *>(param)->f();
 }
};
953876:2011/08/06(土) 00:02:27.62
>>949
おかしいというからには、気持ちではなく論理で説明してください。
>>950
何もかもじゃ、説明になってません。
ごまかしと受け取れます。
>>951
私はできるだけの説明はしました。
国語力が足らないのは申し訳ありません。
理解いただけなかったようで。

954デフォルトの名無しさん:2011/08/06(土) 00:07:45.51
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の仕様上)変更できません><
 }
}
955デフォルトの名無しさん:2011/08/06(土) 00:09:15.44
× static map<HWND,c*> thisMap;
○ static map<HWND,hoge*> thisMap;
956デフォルトの名無しさん:2011/08/06(土) 00:11:25.45
>おかしいというからには、気持ちではなく論理で説明してください。
おかしいのは一点だけ。
| this->static_member;
static_memberへのアクセスにthisポインターは参照されないのにthisを書くのはおかしい。

>>954
素直に hoge::thisMap[hWnd]->wproc() でよろしい。
957デフォルトの名無しさん:2011/08/06(土) 00:14:23.35
>>953
インスタンス1個もないときはどうすんの?NULLでも渡すの?
958876:2011/08/06(土) 00:16:05.23
>>956
ありがとうございます。
非staticメンバへのアクセスと操作感を統一できるならそうしたいので、あえてそうしてます。
参照されないのは知ってます。
959デフォルトの名無しさん:2011/08/06(土) 00:16:12.28
ウィンドウのクラス化でウィンドウハンドルとオブジェの関連付けは普通SetProp/GetPropを使う
960956:2011/08/06(土) 00:17:02.49
>>957
static_cast<hoge *>(nullptr)->static_fun();
これでおk
961デフォルトの名無しさん:2011/08/06(土) 00:20:52.70
>>959
ただの自前クラスを記憶するのにSetPropは変じゃないか?
Windowsサービスと自作サービスクラスの場合とか考えたらmapの方が自然。
962デフォルトの名無しさん:2011/08/06(土) 00:32:40.39
>>958
非staticとstaticは全く別物だよ
違うものを同じ見た目で統一するのは混乱を呼ぶだけでしょ
同じコードで書ける仕様ってのはテンプレートとかで活用するために用意されてんの
コーダーが書いたときに「きっちり揃ってて気持ちい!」みたいな自己満足を得るための機能じゃない
客観的な視野を持って後から保守するかもしれない人の立場になって考える力があるなら見た目ですぐに区別できる方を選ぶのが常識
ま、あんたは趣味グラマのようだからそういうことは気にしなくていい立場なのかもだから言っても意味ないだろうけど
963876:2011/08/06(土) 00:33:45.01
>>957
その場合はNULLを渡して、「インスタンスを生成してないのにアクセスした」
静的メンバ内で例外処理してます。
>>959
ありがとうございます。
SetWindowLong/GetWindowsLong、SetProp/GetProp
も試しましたが、私のやりたい事ではエラーがでてしまい、他の方法で解決しました。
CreateWindow を呼ぶと WM_CREATE 以前にもいくつかメッセージが飛ぶらしく、
WM_CREATEにたどり着くまでウィンドウハンドルが返りません。
SetProp にはハンドルが必要なので、WM_CREATE 以前の処理には使えないのです。
964デフォルトの名無しさん:2011/08/06(土) 00:45:10.66
>>963
map<HWND, hoge *>にもHWNDは必要だけど、こっちはCREATEメッセージより前の処理どうしてるの? それと同じようにすればいいのでは?
965876: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 する事を忘れずに。
966876:2011/08/06(土) 01:22:07.57
>>962
ええ、今の所は趣味グラマです。
おまけに経験もないので、まず理解しやすい方法でやるのがやっとです。
保守性まで気が回るのは先の話でしょうね。
アドバイスありがとうございます。
967デフォルトの名無しさん:2011/08/06(土) 01:25:56.17
>>965
>>956 のような実例が欲しいのですがね…

>>954 の window_proc 中の thisMap へのアクセスの記述を
具体的に this(またはそれに類するもの) を使って書いて欲しいという一点に集約されてるのですけど
968876:2011/08/06(土) 01:40:20.56
>>967
ご免、クラス名が違ったりしますが生ソースを部分的に張ります。
>>962
シロウト臭い、見苦しいソースでしょうが許してください。
私の今の限界です。
969876: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"を返す
}
}
970876: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"を返す
}
}
971デフォルトの名無しさん:2011/08/06(土) 01:43:19.56
>>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();
 }
972デフォルトの名無しさん:2011/08/06(土) 01:45:24.29
ほら 自分ルールを曲げてるじゃん
hoge::thiaMap[h] でアクセスしてる
貴方のルールでは オブジェクトからの呼び出し になるような記述をしなくてはならないハズだが?
973876: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;
}
974デフォルトの名無しさん:2011/08/06(土) 01:50:06.52
>>973
MFC、Win32++を超えるライブラリを作るスレ
http://hibari.2ch.net/test/read.cgi/tech/1286592582/

こっちに移動したら?
975デフォルトの名無しさん:2011/08/06(土) 01:51:43.53
>>965
これだとウィンドウ生成過程で別のウィンドウ生成したら爆死しますよね
976876:2011/08/06(土) 01:51:52.90
>>971
心配しないでくれ、こんな趣味グラマが作ったコードのメンテをあなたには頼まないから。
>>972
それ、俺じゃ無い。
それにもちろん、どうしてもそうしないとエラーが出るならそうアクセスします。
977デフォルトの名無しさん:2011/08/06(土) 01:57:39.15
>>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();
}
978876:2011/08/06(土) 01:58:49.05
>>974
初心者の私には、「MFC、Win32++を超える」なんて自信は無いもので。
よちよち歩きの理解だし、初心者板が似合いだと思います。
>>975
ええ、複数スレッドから使ったりするとやばいかも。
だから無茶な方法だと自覚してます。
回避する方法を考えなきゃ...
979972:2011/08/06(土) 02:01:49.73
はやとちりしてしまった ごめんなさい。

>>977
むむむー
文法で解決できる事柄なのに、スタイル維持にはちょっと特殊な構造にしないといけないのか…
980876:2011/08/06(土) 02:06:05.94
>>975
ロックすれば良いのかな?
ロックフラグ用意して、ロックされてる間は生成の順番待ちしてもらうかな。
できるだろうか。
981デフォルトの名無しさん:2011/08/06(土) 02:10:24.87
>>980
hoge* pCreaterも排他付きmapにして、lpParamに識別渡すんだよ。
そのためのlParam。
982デフォルトの名無しさん:2011/08/06(土) 02:16:26.78
>>980
単一スレッドでも不完全
983876:2011/08/06(土) 02:26:24.34
>>981
なるほど、ありがとうございます。
>>980
どう不完全でしょう。
すみません、教えていただけないでしょうか?
面倒くさいとは思いますが。
984デフォルトの名無しさん:2011/08/06(土) 02:31:26.04
>>876のコードがどんどんすごいことになっている件

ウインドウ生成は基本的にマルチスレッドでするものではないし、一応完全だと思うが。
ウインドウ生成過程でウインドウ生成ってなんだ?
hogeウインドウ生成中にhogeウインドウは生成されないだろ
985876:2011/08/06(土) 02:31:37.05
眠い、そろそろマブタが重いです。
おやすみなさい、また明日。
アドバイスくださった方ありがとうございました。
986876:2011/08/06(土) 02:37:04.31
>>984
ええ、普通マルチスレッドではしませんよね。
でも指摘された事に対する可能性はそれなのかな...と。
完全ならうれしいのですが。
他の人は完全では無いというので混乱してきました。
987デフォルトの名無しさん:2011/08/06(土) 02:37:30.12
>>966
俺も趣味グラマだけど
趣味グラマだと守破離の守の先生もとて教育されていないから超俺俺になり、
守の先生もとで修行を積んだ職業PGからみれば><になるってことは覚えておいたほうが良い
まっ、趣味グラマなら動けばOK、自己満足満たせばOKだけどね
988デフォルトの名無しさん:2011/08/06(土) 02:44:06.51
>>983
例えば再帰的にサブウィンドウが作られる場合とかが危険
(g_pHoge = new Hoge; CreateWindow(...)) 〜 (WM_CREATEをハンドリング; マッピング)
この間(〜の部分)でもう一度Hogeクラスのウィンドウを作ろうとしたらg_hogeが書き換わってしまいマッピングに失敗する
マッピングの後にサブウィンドウを作るなら問題ないし普通はそうするだろうけどね
989876:2011/08/06(土) 03:00:36.22
>>988
プロシージャのWM_CREATEにおける処理が終わるまで、次のウィンドウを作ってはならないという理解でよいでしょうか?
だとすると、終わった所で外れるロックフラグを用意すれば大丈夫でしょうか。
990デフォルトの名無しさん:2011/08/06(土) 04:00:14.23
thisMapに登録するまでの間、g_pHogeが再帰で上書きされるのが問題って話だろ
g_pHogeがフラグそのものになるじゃないか。
if (g_pHoge != 0)残念;
g_pHoge = new Hoge(); h = CreateWindow();
g_thisMap[h] = g_pHoge; g_pHoge = 0;
991デフォルトの名無しさん:2011/08/06(土) 06:00:10.48
>>939
035です。ちょっと金銭的な問題で高いソフトを買う金が無いんですよね。
フリーでそういったWinアプリを作成できるようなものはないんでしょうか?
992デフォルトの名無しさん:2011/08/06(土) 06:05:09.40
Qtでいいだろ
993デフォルトの名無しさん:2011/08/06(土) 06:05:35.41
VC++2010Expressは無料だぞ
994876:2011/08/06(土) 08:40:46.99
>>989
おはようございます。
OK、理解できました。
thisMapに登録するまでの間、内側から create しないようにします。
助言ありがとうございます。
995デフォルトの名無しさん:2011/08/06(土) 13:41:00.16
>>991
レスにあることすら自分では全く調べませんよってことか
なら、Winアプリを作成も自分でしないで誰かにやらせたら

>フリーで
そんな奴だと平気で後だし条件を付けて
おまえら調べろってするよな
996デフォルトの名無しさん:2011/08/06(土) 13:53:32.59
どこで聞けばいいかわからなかったので、ここで失礼します。

Windows フォトビューアーで複数の画像を同時に開く処理
(エクスプローラで複数の画像ファイルを選択し、Enterを押すのと同じ処理)
をCで書きたいのですが、

ShellExecute(NULL,"OPEN","Rundll32.exe","\"C:\\Program Files\\Windows Photo Viewer\\PhotoViewer.dll\",ImageView_Fullscreen 画像のパス", NULL, SW_NORMAL);

で一つの画像ファイルを開くことには成功したのですが、複数画像を開く方法がわかりません。
半角スペースで画像パスを並べたり、ダブルクオーテーションで括ったりしましたが起動しませんでした。
どなたか解決法をご存知の方はいませんか。
997デフォルトの名無しさん:2011/08/06(土) 14:40:34.84
>>996
ファイルの個数だけ ShellExecute を呼べばいいんじゃね
998デフォルトの名無しさん:2011/08/06(土) 15:04:27.78
>>991
>>995
ネットで情報収集する能力すら弱い初心者なのかも、自分と同じ基準で評価するのは良くないでしょう。
VC++2010Express はマシンスペックによってはマトモに動かないかも、新しい分だけ重いし。
グレードダウンして VC++2008Express も考慮に入れるべき。
VC++2005Express は Platform SDK が別に必要で設定もややこしいので勧めません。
本当の初心者がいきなり Qt のような高級ライブラリに手を出すのはツライでしょうか。
開発環境を手に入れたら、WinAPIの入門サイトでも見ながら勉強しては?
999876:2011/08/06(土) 17:36:44.41
>>979
それぞれ、以下のように解釈できると思います。
hoge::honyaraga();
シンボルで示される情報空間上アドレスの命令を実行。
phoge->honyaraga(); this->honyaraga();
オブジェクトで示される現実上のロボット(PC)が命令を実行。

私にとっては可能な限り下の手法で統一する方が、即物的で理解しやすいです。
手段の正当性を多少無視してもメリットがあります。
手段と目的を間違ったら意味がありません。
便利な方法で使う事が目的です、厳密に言語仕様を守りすぎて不便じゃ困ります。
もちろん上の方が便利という人も多いでしょう。
私も以前は上の手法で書いていましたよ。
常識を破りすぎだと言われるとは予想しませんでしたが、後から変えたのです。
1000ぴころ ◆lHG3Yzo0a6 :2011/08/06(土) 18:14:40.28
次スレ 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      .:|
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。