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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.33【環境依存OK】
http://pc10.2ch.net/test/read.cgi/tech/1164376287/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
2デフォルトの名無しさん:2007/01/17(水) 22:17:45
>>1
3デフォルトの名無しさん:2007/01/17(水) 22:24:22
>>1
4質問1(続き):2007/01/17(水) 23:01:47
Ver.33の989-992で質問した者です。
いろいろ回答ありがとうございました。
そうですね。まず普通は、publicにするものだと、
キャストならdynamic_castだと思っておりました。

柏原著のサンプルソースを編集したものですが、
この著者は、static_castを使用して

static_cast<mypair &>(rp).getkey());
static_cast<mypair &>(rp).getvalue());

としていたので、これがベストな方法かと思って
疑問に思っておりました。
皆様のご意見が聞けてよかったです。ありがとうございました。

柏原正三の美しいC++プログラミング見本帖(翔泳社)
http://www.seshop.com/book/download/
(元ファイル:Abstract2Bad.cpp)
5デフォルトの名無しさん:2007/01/17(水) 23:06:08
柏原・・・・悪書をつかんだものだな。同上するよ。
6デフォルトの名無しさん:2007/01/17(水) 23:39:39
質問です。
グローバルな定数を元に、特定の要素数の配列を作るにはどうしたらよいでしょ
うか?

一つのファイルで、
extern const int MAXLEN = 65535;
残りのファイルで
extern const int MAXLEN;
として、各ファイルで
int array[MAXLEN];
としようと思ったのですが、
error: ISO C++ forbids variable-size array `line'
というエラーになります。

とりあえず、共通ヘッダファイルで
#define MAXLEN 65535
としてしのいでいますが、C みたいですっきりしません。
76:2007/01/17(水) 23:43:39
書き忘れました。コンパイラは GCC3.4.3 で、-pedantic オプションをつけています。
8デフォルトの名無しさん:2007/01/18(木) 00:05:03
>>7
§3.1.3
extren const int MAXLEN = 65535; // definitions
extern const int MAXLEN; // declarations

前者は定義なのに対して後者は宣言に過ぎない。という事は、
リンク時まで値が決定しないという事であり、配列はコンパイル時
に大きさを要求する事から、使えない。

ヘッダファイルにでも入れたらどうか。
9デフォルトの名無しさん:2007/01/18(木) 00:10:06
ちなみにヘッダファイルに入れる時はexternを取らないとリンカエラーになる。
当然だが。
10デフォルトの名無しさん:2007/01/18(木) 00:12:52
ヘッダにconst int MAXLEN = 65535;と書け。
116:2007/01/18(木) 00:21:31
皆さん、ありがとうございます。
const int MAXLEN = 65535;
で行こうと思います。

ところで、C++のconst は内部リンケージだと知ったのですが、
http://seclan.dll.jp/dtdiary/2000/dt20000413.htm

通常の変数は従来どおり、staticにしないと内部リンケージにならないのです
よね?なぜconstの場合だけ、こうなったのでしょうか?
また、
static const int MAXLEN = 65535;
のように、static constの場合は、単なるconstの場合と、挙動は全く同じな
のでしょうか?
12デフォルトの名無しさん:2007/01/18(木) 00:25:38
>>11
constが内部リンケージを持つのは、#defineの代わりにコンパイル時定数として扱えるようにするため。
const自体に内部リンケージを持つ意味が含まれているので、staticはあってもなくても同じ。ただしクラス・関数内を除く。
136:2007/01/18(木) 00:29:05
>>12
ありがとうございます。よく分かりました。
私のような初心者が誤解しないよう、static をつけて宣言しようと思います。
14デフォルトの名無しさん:2007/01/18(木) 00:30:16
>>11
C++ではconstの意味が拡張されているからだろう。
§5.19 Constant Expressions
In several places, C + + requires expressions that evaluate to an integral or enumeration constant: as array
bounds (8.3.4, 5.3.4), as case expressions (6.4.2), as bit-field lengths (9.6), as enumerator initializers (7.2),
as static member initializers (9.4.2), and as integral or enumeration non-type template arguments (14.3).
constant-expression:
conditional-expression
An integral constant-expression can involve only literals (2.13), enumerators, const variables or static
data members of integral or enumeration types initialized with constant expressions (8.5), non-type template
parameters of integral or enumeration types, and sizeof expressions. Floating literals (2.13.3) can
appear only if they are cast to integral or enumeration types. Only type conversions to integral or enumeration
types can be used. In particular, except in sizeof expressions, functions, class objects, pointers, or
references shall not be used, and assignment, increment, decrement, function-call, or comma operators shall
not be used.
また、その意味から、static constでもconstでも挙動は同じだろう。
但し実際に領域を使うとすれば、多分違う場所に確保されるだろう。
156:2007/01/18(木) 00:38:36
>>14
重ね重ね、ありがとうございます。
>>ALL
瑣末な疑問かとも思いましたが、勉強になりました。思い切って質問して良かっ
たです。ありがとうございました。
16デフォルトの名無しさん:2007/01/18(木) 03:15:15
夜分遅くすいません。
独習Cを終えた程度の素人です。
練習問題としてCプログラムをなるべく多く作ってみたいのですが、
Webに問題集みたいなサイトありませんか。よろしくお願いします。
17デフォルトの名無しさん:2007/01/18(木) 05:01:06
>>16
Webには無いと思う。
C/C++の宿題片付けますのスレの問題やってみるぐらいじゃない?
でも、独習Cってどれくらいの内容の物かわからないけど
たぶん、まだ知らないことは多いと思うから、書籍購入して
サンプルみながら勉強続けるとかが良いんじゃない?
ちなみに家に、C言語500問っていう本あるけど
「ん〜・・簡単だな・・」って思ったけど知識が身に付いてる分
簡単だと思ったのかもしれない。でも、別にこの本を勧めはしない。
18デフォルトの名無しさん:2007/01/18(木) 13:46:26
ゲームでも何でもいいから、何か1つ作るっていうのはどう?
明確な目標がある分やりやすいよ。
19デフォルトの名無しさん:2007/01/18(木) 15:34:45
ゲーム作るのは明確な目標じゃないよな。
「RPG作るぞ!」も明確じゃない
「MMORPGならどうだ?いっぱい人があつまって楽しくできるゲームつくるぞ!」もだめ

何を言いたいかってーと、動機と目標を一色多にするなってことです
20デフォルトの名無しさん:2007/01/18(木) 18:58:19
vector<int> の中に適当な数字がいくつか入っているとして、
この中にもし整数nが含まれるとしたらそれが何番目に入っているかを知りたいです。
それで調べたらなにやらfindとかいうのが使えるみたいなんですが
イテレータとかいうのがワケが分からないのでどう書いたらいいか分かりません。
書き方を教えてください。
21デフォルトの名無しさん:2007/01/18(木) 19:03:27
if (vector<int>::iterator ii = find(vec.begin(), vec.end(), n))
  cout << n << " is found at " << ii - vec.begin() << endl;
else
  cout << n << " is not found" << endl;
2221:2007/01/18(木) 19:05:30
すまん
一行目は以下と置き換えてくれ

vector<int>iterator ii = find(vec.begin(), vec.end(), n);
if (ii != vec.end())
23名前は開発中のものです。:2007/01/18(木) 19:37:51
>>21
うまくいきました。サンクスコ。
24デフォルトの名無しさん:2007/01/18(木) 23:24:30
>>17 >>18 >>19
ありがとうございます。本を購入してもうすこし勉強してみます。
25デフォルトの名無しさん:2007/01/19(金) 14:44:13
string str;
int i;
cin >> str;
i = atoi(str);

こういう風にするとconstじゃないって怒られるんですが
stringをintに変換するにはどうすればいいんでしょうか?
cin >> i; ではなくて一度stringに入れてからatoi()というかJavaのInteger.parseInt()みちあな感じでやりたいんです
26デフォルトの名無しさん:2007/01/19(金) 14:47:56
i = atoi(str.c_str());
27デフォルトの名無しさん:2007/01/19(金) 14:48:20
std::istringstream s(str);
s >> i;

または

i = atoi(str.str());

または

i = boost::lexical_cast<int>(str);
28デフォルトの名無しさん:2007/01/19(金) 14:48:55
あ、ごめん
×i = atoi(str.str());
○i = atoi(str.c_str());
2925:2007/01/19(金) 14:49:22
>>26
できました
ありがとうございました
3025:2007/01/19(金) 14:50:40
>>27-28さんもありがとうございました
3125:2007/01/19(金) 15:04:24
>>31さんもありがとうございました
32デフォルトの名無しさん:2007/01/19(金) 15:13:48
strに整数と解釈できない文字列が入っている場合の挙動が
>>27の例では三者三様なので注意。
C標準関数でatoi()より高級なものとしては、strtol()なんてのもある。
3325:2007/01/19(金) 21:45:00
>>34さんもありがとうございました
34デフォルトの名無しさん:2007/01/19(金) 21:46:53
いえいえ、どういたしまして
35デフォルトの名無しさん:2007/01/19(金) 21:55:20
この2分足らずの寸劇にちょっと笑ってしまった
36デフォルトの名無しさん:2007/01/20(土) 10:34:40
16進文字列を数値配列に変換したいです。

"AABBCC"

[0]=0xAA
[1]=0xBB
[2]=0xCC

16進以外の文字が含まれないという前提のとき、
上記操作を行うような処理はどの用にすればよいでしょうか?

いくつか調べて出てきたものはistringstreamですが、
16進文字は数値に変換できなさそうです。
先頭から1文字ずつ取り出して、自前で"A"→10などと
地道に変換するしかないでしょうか?

すいませんがよろしくお願いします。
37デフォルトの名無しさん:2007/01/20(土) 10:58:49
>>36
strtol
38デフォルトの名無しさん:2007/01/20(土) 11:10:56
>>37さん
ありがとうございました!
39デフォルトの名無しさん:2007/01/20(土) 11:22:51
VC6で正規表現を使うときの関数はRegex使ったらいいのでしょうか?
例えば西暦4桁の数字をあらわす場合どのように書いたらイイデツカ?
40デフォルトの名無しさん:2007/01/20(土) 12:01:32
>>39
西暦4桁の定義をしてくれたまえ。
#もしかしたら、西暦は3000まで行かないかもしれないジャマイカ。
41デフォルトの名無しさん:2007/01/20(土) 12:53:19
winXP環境では、ファイルを最高で何個オープンできますか?
42デフォルトの名無しさん:2007/01/20(土) 12:55:27
メモリの許す限り。と言っても物理的な搭載量や仮想メモリの量ではないだろうが。
43デフォルトの名無しさん:2007/01/20(土) 13:01:06
【ネガティブ派遣根性チェック】

3つ以上、思い当たる点があればアナタの性格はひん曲がっており、ネガティブ負け組人生を歩んでいます。

□派遣先の人事権のある社員の意見はたとえ間違っていてもマンセーする
□派遣先から「いつまでもここで仕事してくださいね(安い金でw)」と言われている
□自社に仕事を持ち帰れるように言われるとムカつく
□自社で仕事なんてできるわけがない
□派遣労働の問題点の話題が出ると感情剥き出しにする
□派遣労働の問題を指摘する人は嫌いだ
□派遣先には仕事だけでなく自分のプライベートについても指示して欲しい
□自分の月額金額を知らない
□派遣先社員より自分の生涯収入が低いのは当然だ
□派遣先に尻尾を振り、いつまでも派遣を続けることが大切だ
44デフォルトの名無しさん:2007/01/20(土) 13:47:23
>>40
39ですが、とりあえず西暦9999年迄でオナガイシマシウ
[0-9].[0-9].[0-9].[0-9]
秀丸の正規表現ならこんな感じだと思うのですが、C++はわからねぇ〜
45デフォルトの名無しさん:2007/01/20(土) 14:07:17
>>44
C++言語自体にも標準ライブラリにも正規表現はないから、外部ライブラリを使う。
Boost.Regexとか
ttp://www.boost.org/libs/regex/doc/index.html
46デフォルトの名無しさん:2007/01/20(土) 14:09:38
39のせりふから考えるとたぶん「C++で正規表現」以外の方法をとるべき
Regexコンパイル要るし
47デフォルトの名無しさん:2007/01/20(土) 14:32:13
どうして日本だけバックスラッシュは\なんですか?【winで】
48デフォルトの名無しさん:2007/01/20(土) 14:40:53
>>47
日本で実際に使われているのはASCIIではなくJIS X 0201。
JIS X 0201はほぼアスキーのスーパーセットで互換性があるが、
バックスラッシュは円記号になっている。
49デフォルトの名無しさん:2007/01/20(土) 14:50:57
>>39
多少正規表現っぽいことはscanf()ファミリーにもできる。
それを明らかに越えることをしたいのなら正規表現ライブラリの出番だが....

VC++なら、COM経由でVBScriptのIRegExpなどを使うという手もある。
Cのライブラリとしては、鬼車あたりが定評があるか。

VC++6でBoostはおすすめしないねぇ。
50デフォルトの名無しさん:2007/01/20(土) 14:53:23
>>47-48
それを(互換性のためだが)だらだら引きずって、Unicodeの時代になっても
Windowsの日本語フォントはバックスラッシュのグリフにするべきところを円記号にしている。
51デフォルトの名無しさん:2007/01/20(土) 15:10:38
>5
日本ではU+5cを円記号として扱うために(典型的にはソート)、
"Japanese Unicode"とかがあるんだよな。
52デフォルトの名無しさん:2007/01/20(土) 15:55:41
>>47
ちなみに他国でも同じことやってるとこもある。もちろん、\じゃないけどな
53デフォルトの名無しさん:2007/01/20(土) 16:18:57
ファイルから1行数字を読み込んで
その数字を比較したいんですけど
どうやればいいでしょうか?

#include <fstream>
 using namespace std;
int main() {
char str[8];
ifstream file("1.txt");
file.getline(str, '\n');
if str < (str+1)  //error C2061: 構文エラー : 識別子 'str'
}
54デフォルトの名無しさん:2007/01/20(土) 16:33:50
>>53
boost::lexical_cast
もしくはstd::stringstream
5553:2007/01/20(土) 21:14:02
>>54
レスありがとうございます。
相変わらずエラーが出ます。
助けてください。

#include <fstream>
#include <boost/lexical_cast.hpp>
 using namespace std;
int main() {
char str[8];
ifstream file("1.txt");
file.getline(str, '\n');
int a = boost::lexical_cast<int>(str);
if a < (a+1);  //error C2061: 構文エラー : 識別子 'a'
}
56デフォルトの名無しさん:2007/01/20(土) 21:15:53
>>55
boostなんてレベルじゃないぞ。
if文の書き方から遣り直せ。
57デフォルトの名無しさん:2007/01/20(土) 21:16:35
>>55
うん、わかった。
キミはまず入門書を読んだ方がいい。
58デフォルトの名無しさん:2007/01/20(土) 21:43:56
ありがとうございます。
できました。
59デフォルトの名無しさん:2007/01/20(土) 22:32:52
SYSTEM関数でdosコマンドを使用する場合、
system("mkdir c:\Aaaa\Aa");
としてもC:\にAaaaaaが出来ます
c:\Aaaa\Aaを作る方法を教えて下さい
60デフォルトの名無しさん:2007/01/20(土) 22:37:27
\ → \\
61デフォルトの名無しさん:2007/01/20(土) 22:46:50
>>60
本当にありがとうございました
62デフォルトの名無しさん:2007/01/21(日) 03:29:28
Windows(XP)の各環境に合わせて下のC:\\Program Filesを、
DOSやエクスプローラでいう%programfiles%にしたいのですが、
どうやったらできますか?

ShellExecute(NULL,L"open",L"C:\\Program Files\\test.exe",NULL,NULL,SW_SHOWNORMAL);
63デフォルトの名無しさん:2007/01/21(日) 03:40:22
getenv()
64デフォルトの名無しさん:2007/01/21(日) 04:20:16
ありがとうございます。
便利な関数が用意されているんですね。
ですが代入の仕方が分かりません><
すみませんが教えて頂けないでしょうか?

char *env;
env = getenv("programfiles");
ShellExecute(NULL,L"open",L"C:\\Program Files\\test.exe",NULL,NULL,SW_SHOWNORMAL);
65デフォルトの名無しさん:2007/01/21(日) 04:26:24
>>64 これでいけるかな?
char app_name[FILENAME_MAX];
sprintf(app_name, "%s\\test.exe", getenv("programfiles"));
ShellExecute(NULL,L"open",app_name,NULL,NULL,SW_SHOWNORMAL);
6664:2007/01/21(日) 05:20:19
ありがとうございます。
Unicode文字セットだとtest.exeが起動しません。
どこを直せばよろしいでしょうか?

TCHAR app_name[FILENAME_MAX];
wsprintf(app_name,L"%s\\test.exe",getenv("programfiles"));
ShellExecute(NULL,L"open",app_name,NULL,NULL,SW_SHOWNORMAL);
67デフォルトの名無しさん:2007/01/21(日) 09:34:09
getenvがchar*を返すため。_tgetenv@<tchar.h>を使え。
また、WindowsだったらExpandEnvironmentStringsを使うのがいいかもしれない。
68デフォルトの名無しさん:2007/01/21(日) 12:37:17
>>66
TCHAR app_name[FILENAME_MAX];
_sntprintf(app_name, FILENAME_MAX,
     _T("%s\\test.exe"), _tgetenv(_T("ProgramFiles")));
ShellExecute(0, _T("open"), app_name, 0, 0, SW_SHOWNORMAL);
6966:2007/01/21(日) 13:03:41
>>67-68
上手く動きました。
本当にありがとうございました。
70デフォルトの名無しさん:2007/01/21(日) 21:14:06
どのスレに書けばいいのかわからなかったので、こちらに書きました。
Windows Vista発売に伴い、WinsockのプログラムのUnicode対応を考えています。
ホスト名からIPアドレスを取得するAPI「WSAAsyncGetHostByName()」のUnicode
対応はどのように対応すればいいの?
WSAAsyncGetHostByName()のインターフェースは以下のとおり。
HANDLE WSAAsyncGetHostByName(
HWND hWnd,
unsigned int wMsg,
const char* name,
char* buf,
int buflen
);
ホスト名を指定する変数は、「const char* name」なのでそのままでは使えないと思われます。
WSAAsyncGetHostByName()のUnicode対応用のAPIがあるのでしょうか?又は別の対応方法があるの
でしょうか?
御存知の方がいたら教えてください。

環境:VC++ Ver6.0,開発OS:WinXP SP2

71デフォルトの名無しさん:2007/01/21(日) 21:22:52
>>70
dumpbin -EXPORTS %WINDIR%\system32\ws2_32.dll
してみれば分かるが、WSAAsyncGetHostByName()にはUnicode用APIとの区別は無い。

まー実用上非ASCIIのホスト名、ドメイン名が使われることは無いから
問題ないんだろうけど。
詳しいことは知らんが、
http://developer.mozilla.org/ja/docs/Internationalized_Domain_Names_(IDN)_Support_in_Mozilla_Browsers
などを見る限りでは、非ASCIIドメイン名を7bit-ASCIIにエンコードするRFCなんかも
出来てはいるようだな。

本式で対応するなら、それを使うべきだが、実用的にはwchar_tを使っている場合も
非ASCII文字は含まれていないと仮定し、何も考えずにASCIIへの
狭化変換を行ってしまってよいんでないの?
7270:2007/01/21(日) 22:26:45
>>71
ありがとう。
「狭化変換」とはどういう処理のことでしょうか?
Unicodeの倍角文字や4倍角文字にも対応しますか?
御存知であれば教えてください。
73デフォルトの名無しさん:2007/01/21(日) 22:45:37
まだC++勉強を始めて日が浅いのであまり深いことは分かりませんが
#include <iostream.h>
char kotae;

void Qestion_1()
{
    cout << "A" << endl;
    cin >> ::kotae
        if (::kotae== 1)    //エラー
            cout << "OK!" << endl;
        else    //エラー
            cout << "No!" << endl;
}

int main()
{
    int A_A;

    switch (A_A){

    case 1:
        void Qestion_1();
        break;
一部省略しましたが↑のようなプログラムを書いています。
いろいろ変えてみたりしたのですが、どうしてもエラーとした部分でコンパイルエラーがでてしまいます・・・。
どなたかご教示願います
以下エラーの文コピー
ステートメントにセミコロン ( ; ) がない(関数 Question_1() )
else の位置が誤っている(関数 Question_1() )
74デフォルトの名無しさん:2007/01/21(日) 22:46:02
>>72
要するに
void nallow(char *dst, const wchar_t *src)
{
  while (*dst++ = (char)*src++)
    ;
}
のようなものだな。ASCII文字のコードポイントはUnicodeでも同じことを
利用して単純にコピーする。

非ASCIIのホスト名やドメイン名に真面目に対応したければ、
>>71に上げたリンクは最低読むべきだろう。
変換アルゴリズムは自分で組むんだね。勿論WideCharToMultibyte()などは
役に立たないぞ。
75デフォルトの名無しさん:2007/01/21(日) 22:47:15
>>73
エラーメッセージの通りじゃないか。
cin >> ::kotae
の後のセミコロンが抜けている。
7670:2007/01/21(日) 22:49:25
>>74
ありがとう。
ちょっと考えてみるよ。
77デフォルトの名無しさん:2007/01/21(日) 22:51:07
>>75
こんな凡ミスでスレを汚してしまい申し訳ありませんでした(´・ω・`)
ちゃんとコンパイルできました・・・。
78デフォルトの名無しさん:2007/01/22(月) 01:53:49
C言語でlog()を使ったプログラムを書いたのですが、

/tmp/cc06qAQP.o(.text+0x2d): In function `main':
: undefined reference to `log'

というエラーメッセージがでてうまく動きません。
ご教授お願いします

#include <math.h>
#include <stdio.h>

int main(void)
{
double val=1.0;
do{
  printf("%f %f\n", val,log(val));
  val++;
}while(val < 11.0);

return 0;
}
79デフォルトの名無しさん:2007/01/22(月) 02:05:57
>>78
コンパイルオプションに -lm を追加汁
80デフォルトの名無しさん:2007/01/22(月) 02:08:32
-lm
81デフォルトの名無しさん:2007/01/22(月) 02:20:07
-lmって何ですか?
8278:2007/01/22(月) 02:24:45
>>79-80
質問に答えていただいてありがとうございます!!
無事動きました!!
83デフォルトの名無しさん:2007/01/22(月) 03:41:25
           ∧ ∧
          (*‘ω‘ *)  ちんぽっぽ
           (   )
  ムズムズ     v v    
  ∧ ∧         ぼいんっ
 (*‘ω‘ *)      川
  ((∩∩))    ( (  ) )
84デフォルトの名無しさん:2007/01/22(月) 09:02:10
>>81
一般的なコンパイルオプションで、ライブラリ"m"をリンクしろという指定。
ライブラリ"m"は、一般的に数値演算系の標準関数が入っていると思えばいい。
85デフォルトの名無しさん:2007/01/22(月) 17:28:07
ファイル入出力に関して質問なのですが、今現在
ofstream fout("1.txt");
のような形で計算結果を出力しています。ただこれだと内部変数をいじったときも同じ名前になってしまい
紛らわしいので内部変数とリンクさせて動的なファイル作成をしたいのです。イメージとしては
ofstream fout(N".txt");
です。ただしこれではエラーとなってしまいます。

ofstream fout を使って動的にファイル名をつける方法を教えてください。
もし無理ならば他の手段を教えていただけるとうれしいです。

よろしくお願いいたします。
86デフォルトの名無しさん:2007/01/22(月) 17:33:56
sprintf(file_name, "%d.txt", N);
とでもすると良いのではないかな?
87デフォルトの名無しさん:2007/01/22(月) 17:49:06
C++の標準ライブラリを使ってそれらしくやりたいなら

std::stringstream str;
str << i << ".txt";
{
 ofstream fout(str.str().c_str());
 .......
}
8885:2007/01/22(月) 18:00:22
お二方ありがとう御座います。
私の理解度では少し厳しいですが、何とか両方とも勉強してみたいと思います。
ヒントありがとう御座いました。
89デフォルトの名無しさん:2007/01/22(月) 19:13:21
幾つかC言語の初心者向けの書籍を借りたり購入したりしたのですが
#include <stdio.h> の次が書籍によって
int main() や
void main() だったり
main() だけだったり、
()内に void があったり無かったりするのですが
どういった違いで記述が変わっているのでしょうか?
90デフォルトの名無しさん:2007/01/22(月) 19:18:54
>int main() や
>void main() だったり
>main() だけだったり、
>()内に void があったり無かったりするのですが

戻り値の型は明記するべき。
○int main()
×main()
main()の戻り値はintが標準的。
○int main()
×void main()
括弧内を省略すると、引き数のチェックが行なわれない。
#明示的に引き数なしと宣言したわけではない。
○int main(void)
△int main()
尚、C++では省略すると引き数なしとなる。
91デフォルトの名無しさん:2007/01/22(月) 19:22:35
int main()  :正しい。文句無し。
void main() :標準 C では main の戻り値の型は int 。環境依存で void でもコンパイル可能なことも多いし、
        組み込み系では void main を実際に使う場合もあるが、基本的に void main 使う本は糞。
main()    :一応正しいけど、int がないと警告される場合もあるので int は付けた方がいい。
        ささやかなインクや執筆時間の節約の可能性も。

main の中の void の有無は、違いはあるけど、どっちでも実害はない。
普通の関数の場合は、void を入れた方がいい。>>90 を参照
92デフォルトの名無しさん:2007/01/22(月) 19:48:08
>>90-91
詳しい説明ありがとうございます。
93デフォルトの名無しさん:2007/01/22(月) 21:26:40
ttp://www.radiumsoftware.com/0305.html
で紹介されているLeakTracerというソフトを使おうとしているのですが、
紹介通りに進めていって、
$ leak-analyze test.exe
とやった後に
(no debugging symbols found)...(gdb)
と出てきてしまって、メモリリーク先が特定できません。
-gオプションを付けていても、(no debugging symbols found)
などと出る場合はどうすればいいのでしょうか?
gccのバージョンは2.95.3
gdbのバージョンは5.2.1
よろしくお願いします。
9485:2007/01/22(月) 21:59:38
http://www9.plala.or.jp/sgwr-t/lib/sprintf.html
このページを参考に
char file_name[100];
sprintf(file_name, "%d.txt", N);

ofstream fout(file_name);

としたところ上手く行きそうです。>86氏の方法も今後探ってみます。
おかげさまで苦手意識の強かった構造体に対する理解が深まりました。
ありがとうございました。
95sage:2007/01/23(火) 00:32:58
次のプログラムを入力してg++ -cでオブジェクトファイルを作ったところ、そのシンボル情報が消えてしまう事態が発生しています。
理由が分かる方はどなたかいらっしゃらないでしょうか。
---ソース---
const int var_const = 0;
const char* str_const = "str_const is const.";
int var = 0;
char* str = "str is not const.";

static int hoge(int a);
struct Fuga {
int var;
int (*func)(int);
};
const struct Fuga fuga_const[] = { {1, hoge}, };
static int hoge(int a) { return 1; }
---実行結果---
$ g++ hoge.c -c -O3
$ nm hoge.o
00000008 D str
00000000 D str_const
00000004 D var
---
というように、constを付けたint、構造体が消えてます(const char*は残ってる)。色々調べてみると、gccだと最適化オプションに関係なく全部残っていて、g++は-O0以外は消えました。
static関数は分かるんですが、それ以外は何故なんでしょう?
別のファイルからこのconst付き変数を使おうと思っても使えず、困っています・・・。
96デフォルトの名無しさん:2007/01/23(火) 00:34:44
extern付けれ。
97デフォルトの名無しさん:2007/01/23(火) 00:40:56
constは自動的にstatic指定されたと見なされる。
9893:2007/01/23(火) 01:49:29
自己解決しました。
スレ汚しごめんなさい。
99デフォルトの名無しさん:2007/01/23(火) 03:01:52
超初歩的な質問ですが、->ってどういう意味でしょうか?
例えば↓こういうときの
p=p->next;
100デフォルトの名無しさん:2007/01/23(火) 03:02:23
ポインタを通じたメンバの参照
101デフォルトの名無しさん:2007/01/23(火) 03:09:31
(*p).nextと同じ意味。
102デフォルトの名無しさん:2007/01/23(火) 03:16:24
なるほどありがとうございます。
10395:2007/01/23(火) 07:03:16
>>96
>>97
ありがとうございます。確かにexternを付けたら解決しました。

externを付けていないconst char*だけは最適化しても残っている点がまだ疑問ですが、
C++におけるexternとconstの役割をもう一度勉強し直してきます。

ありがとうございました。あとageてしまってごめんなさい。
104デフォルトの名無しさん:2007/01/23(火) 10:41:25
>>103
const char *の変数は、constではないから。
#constなのはその(ポインタ)変数の参照先のみ。
105デフォルトの名無しさん:2007/01/23(火) 12:04:12
憂鬱本に、
多重継承が問題を起こしやすい概念って書かれていました。
実際に使う人は少ないんですか?
106デフォルトの名無しさん:2007/01/23(火) 12:17:18
質問です。
JSONファイルを利用したいと思い、jsoncppというライブラリの利用を試みたのですが、
どういうわけか上手く行きません。
http://sourceforge.net/svn/?group_id=144446
READMEの記述通りにSConsというPythonベースのビルドツールでビルドを試みたのですが失敗してしまうので、

.\jsoncpp\makefiles\vs71\jsoncpp.sln
のソリューションファイルを開いてVC++ 2005でライブラリ(json_vc71_libmt.lib)をビルドすると成功します。

ところが他のプロジェクトで利用しようとjsoncppを利用するコードを書き、ビルドしようとすると
fatal error C1083: コンパイラの生成した ファイルを開けません。'../../build/vs71/release/lib_json\json_writer.asm': No such file or directoryc:\Temp\jsoncpp\src\lib_json\json_writer.cpp
というエラーが出てプロジェクトのビルドに失敗してしまいます。
jsoncpp.slnのテストコードmain.cppの場合はビルド・実行に成功するのですが、他のプロジェクトにlibとヘッダを移して利用しようとすると上手く行かないみたいです。

何が原因か分からずに困っています。どなたかご教示お願いします。
環境はWinXP SP2, Visual Studio 2005 statdard, python2.4.3です。
107デフォルトの名無しさん:2007/01/23(火) 12:49:35
>>105
COMとかWTLでは日常茶飯事
108デフォルトの名無しさん:2007/01/23(火) 14:15:45
>>105
例えばダイアモンド継承の形を産みやすいと言われている。
  基底A
派生B  派生B'
  派生C

この場合、Cのオブジェクトには基底AがB、B'から二重に含まれてしまう。
それが問題になるかどうかはケースバイケースだが。
仮想派生を用いる(B, B'の継承をvirtualとする)ことでこれを防ぐことが
出来るが、BやB'を作成した時点では、仮想派生にすべきかどうか
判断できないことも多いわけだ。

一方全然違うクラスをmix-in的に使う分にはこういう問題がないので、
実際使われるところではバシバシ使われとるよ。
109デフォルトの名無しさん:2007/01/23(火) 15:17:09
多重継承を禁止しているような言語でも、似たような仕組みそのものは残ってるコトもあるらしいしねぇ。
まあ、多重継承に比べればセキュアなんだろうけど。
110デフォルトの名無しさん:2007/01/24(水) 08:22:46
Windows環境でプログラムの実行中はキーボードからの入力を受け付けなくしたいのですが、
どうやればいいでしょうか?WndProcメソッド辺りをオーバーライドすることでできそうなのですが、
サンプルがWindowsフォームアプリケーションしか見つからず、できればWin32アプリケーションでやりたいです。
111デフォルトの名無しさん:2007/01/24(水) 09:57:13
>>110
キーボードからの入力を受け付けなくしたいのは、自分だけか、他のアプリもか?
それと開発環境は?
112110:2007/01/24(水) 10:17:09
ありがとうございます。
WinXP(動作予定環境も),Visual C++ 2005です。
WindowsキーやAlt+Tabも無効にしたいので、他のアプリもになります。
マウスからの入力のみ受け付ける感じを考えています。
113デフォルトの名無しさん:2007/01/24(水) 12:05:43
WindowsキーやAlt+Tab等、いくつかの特定のものだけならRegisterHotKey()。
他のアプリのキー操作全てを横取りしたいならSetWindowsHookEx()(所謂グローバルフック)。
上記でもCtrl+Alt+Delはダメで、これはかなり面倒。

ぶっちゃけお勧めしない。どうしてもOSや他のアプリを抑えなければならないならしょうがないけど。
114デフォルトの名無しさん:2007/01/24(水) 12:44:45
switch文の中で特定のcaseの場合だけ一時変数を宣言して使いたいのですが、
コンパイラ(vc++.net)に怒られてしまいます。
最後のラベルの中なら宣言できるようなのですが、
これってそういう仕様なのでしょうか?
115デフォルトの名無しさん:2007/01/24(水) 13:38:02
エラーメッセージをちゃんと貼れ。
仕様と言うか言語的にそうなってる。

switch (式)
{
 ラベル1:
 ラベル2:
 ラベル3:
}

ラベルからラベルまでの間はこのままだとブロックになっていない。
だからC99より前だとswitch文で変数を宣言したかったら

switch (式)
{
 int x;
 ラベル1:
  なんちゃからんちゃら
}

のようにラベル1の前で変数を宣言しないとエラーになる。
116デフォルトの名無しさん:2007/01/24(水) 13:40:03
また、ブロックで分かれていないから、当然自動変数のスコープは各ラベル〜ラベル間で同じになる。
つまりラベル1とラベル2の間、ラベル2とラベル3の間等で同名の変数を宣言できない。
再定義されているとか言われるのはこのせい。

次に

 ラベル1:
  int a=0;

とした場合、ラベル2又はラベル3に飛んだ場合はaの初期化が行われない。これもエラーになる。
> 最後のラベルの中なら宣言できるようなのですが
というのは、それ以前のラベルからその変数を使えないから。

{}で囲むとかそういった対策は以上を踏まえて適宜考えること。
117114:2007/01/24(水) 14:34:15
>>115,116
分かりやすい説明ありがとうございます。
switch文てのは要するに整数をラベルにした特殊なgoto文なのですね。

エラーメッセージは
error C2360: 'tmp' の初期化が 'case' ラベルによって行われませんでした。
でした。
118デフォルトの名無しさん:2007/01/24(水) 16:08:23
何らかのリストを返す関数の設計で迷ってます。
手順はいくつかあり、

1.GetDeviceCount()->GetDeviceName(n)
 パフォーマンスの問題と、煩雑さが気に入らない

2.クライアント側で用意したコンテナへ返す
 コンテナのクリアはどちらでするべきか決められない。
 テンプレートはいや。かといって、コンテナを限定するのも何だかな。

3.クライアントでコンテナを用意して、返却値にする
void GetDeviceList() {
vector<string> devices;
....;
return devices;
}

vector<string> devices = GetDeviceList();

3番が一番単純で好みなのだけど、RVOの実装の問題やら
巨大なオブジェクトを返却値にすることへの抵抗やらで決めあぐねております。
何かスマートな対策は無いですか?
119デフォルトの名無しさん:2007/01/24(水) 16:10:24
4.Callback
120デフォルトの名無しさん:2007/01/24(水) 16:11:14
>>118
リファレンス使って引数渡しにしたら。
121120:2007/01/24(水) 16:13:43
あ、2.が>>120の方法を言っているのか。
コンテナへのリファレンスじゃなくて、単にSTL風に出力iterator貰えば?
122デフォルトの名無しさん:2007/01/24(水) 16:15:39
C言語の説明によって、返値と言ったり戻り値と言ったりするのですが
返値と戻り値って同じ意味なのでしょうか?
123デフォルトの名無しさん:2007/01/24(水) 18:11:21
class b : public a
というクラスについて、
a* pa;
pa = new b;
delete pa;
とやった場合、ちゃんとクラスbをdeleteすることになるんでしょうか?
というか、この書き方は合ってるでしょうか?
124デフォルトの名無しさん:2007/01/24(水) 18:13:09
return valueを君のセンスで訳すとどうなる
125デフォルトの名無しさん:2007/01/24(水) 18:17:35
>>123
class a, bのコンストラクタとデストラクタで文字列でも吐き出して自分で確認すればいい
おそらくこんな質問するくらいだし基底クラスのデストラクタをvirtualにしてないだろうから、
その辺も調べてみるといいかも
126デフォルトの名無しさん:2007/01/24(水) 18:21:24
>>123
Effective C++とかその辺の本を読むのを薦める
127デフォルトの名無しさん:2007/01/24(水) 19:21:41
#include<stdio.h>
#include<string.h>

int main(void){

char str[100];
int a,i;

scanf("%s",str);
a=strlen(str);

for(i=a;i<=0;i--){
printf("%c",str[i]);
}
return 0;
}
文字列を入力させて逆に表示させたいんですがうまくいきません
どこがおかしいのでしょうか
128デフォルトの名無しさん:2007/01/24(水) 19:26:57
>>127
>for(i=a;i<=0;i--){

a=strlen(str);ってことはstr[0]〜str[a-1]までだよ
129デフォルトの名無しさん:2007/01/24(水) 19:33:19
だれも i<=0 につっこまないのか……
130デフォルトの名無しさん:2007/01/24(水) 19:33:41
>>128
for(i=a-1;
ってことでしょうか?
131デフォルトの名無しさん:2007/01/24(水) 19:45:46
-------------------------------------------------
開発環境 VC++2005 ExpressEdition + WindowsXP
-------------------------------------------------
<AbstractFunc.h>
#define Cast(R,T,F) reinterpret_cast<R(*)T>(F)
template<typename Re>
class CAbstractFunc
{
public:
typedef Re(*vf)();
CAbstractFunc(){}
template<class fn>CAbstractFunc(fn f) :m_fp(reinterpret_cast<vf>(f)){}
Re operator () (){ return Cast(Re,(),m_fp)(); }
template<typename T1>Re operator () (T1 p1){ return
Cast(Re,(T1),m_fp)(p1); }
private:
vf m_fp;
};
typedef CAbstractFunc< void(*)() > ABSTRACT_FUNC_POINTER;
132131:2007/01/24(水) 19:47:46
<main.cpp>
#include "AbstractFunc.h"
char func1( char x ){ return x; }
class C_hoge
{
public:
static void hoge1( void ){ cout << "hoge1" << endl; }
static int hoge2( void ){ cout << "hoge2" << endl; return 1; }
}hoge;

void main( void )
{
ABSTRACT_FUNC_POINTER af = func1;
cout << reinterpret_cast<char>( af( 'a' ) ) << endl;
af = hoge.hoge1;
af();
}
上記プログラムの「C_hogeクラスのメンバ関数のstatic」を
はずしたいと考えています。
CAbstractFuncの汎用性をなるべく維持したまま行うための
ヒントなりをいただけたら・・・と考えています。

133デフォルトの名無しさん:2007/01/24(水) 19:58:25
boost::functionみたいな話なのか?
134131:2007/01/24(水) 20:42:44
>>133
おっしゃる通りです、、、。
boostは使ってはいけないので、
自作するような形になりますた。
135デフォルトの名無しさん:2007/01/24(水) 21:06:52
boostをfoostにでも置換して使った方がいいぞ
君のガラクタよりfoost::functionの方が保守が容易だ
136デフォルトの名無しさん:2007/01/24(水) 21:07:20
あと、その引数評価方法をみるに、型安全性は無視していいわけだな。
afにfunc1をバインドしたあとに、af();呼び出しをかけることもあるわけだから。
137 ◆eVzdKXNVvg :2007/01/24(水) 21:24:27
むかしとっても邪道なことを考えてた名残があるので
型安全性を無視するようにアドホックに改竄したうえで、記載しておく。

struct IFV{ virtual int f(void)=0; };
struct IFI{ virtual int f(int n)=0; };
class funb{
void *mic[4];
public:
template<class T> funb(const T &ic, size_t size=16 ){ memcpy( mic, &ic, size); }
int operator ()(int i){ return reinterpret_cast<IFI*>(&mic[0])->f(i); }
int operator ()() { return reinterpret_cast<IFV*>(&mic[0])->f(); }
};
template<class T>class IFI_impl : public IFI{
T &klass;int (T::*method)(int n);
public:
IFI_impl( T &k, int (T::*m)(int n) ):klass(k), method(m){}
virtual int f(int n){ return (klass.*method)(n); }
};
template<class T>class IFV_impl : public IFV{
T &klass;int (T::*method)(void);
public:
IFV_impl( T &k, int (T::*m)(void) ):klass(k), method(m){}
virtual int f(void){ return (klass.*method)(); }
};

template<class T> IFV_impl<T> BindMethod( T &k, int (T::*m)() )
{ return IFV_impl<T>( k, m );}
template<class T>IFI_impl<T> BindMethod( T &k, int (T::*m)(int n) )
{ return IFI_impl<T>( k, m );}
138 ◆eVzdKXNVvg :2007/01/24(水) 21:27:22
struct test{
int noarg(){return printf("void\n");}
int intarg(int n){return printf("int:%d\n", n );}
};
int main(){
test t;

funb c1( BindMethod( t, &test::noarg) );
funb c2( BindMethod( t, &test::intarg) );
c1( 412 );
c2( 4120 );
return 0;
}
139デフォルトの名無しさん:2007/01/24(水) 21:53:59
マクロ定義に関しての質問なんですが
ある関数funcを void func();と宣言して
#include <stdio.h>
int main()
{
func(),printf("test");
}
上記の書き方ではエラーなしで実行できるのですが、マクロを用いて

#include <stdio.h>
#define func() func(),printf("test")
int main(
{
func();
}
とするとエラーがでてしまいます。上記2つの違いは何なのでしょうか?
140デフォルトの名無しさん:2007/01/24(水) 22:00:17
>>139
どう置換されるのかよく考えてみれ。
141デフォルトの名無しさん:2007/01/24(水) 22:01:45
mainの)がないからじゃね?
142デフォルトの名無しさん:2007/01/24(水) 22:07:04
質問です。
C言語で、グレースケール(256段階、画質256×256)の画像の画素値を[256][256]
の配列に格納したのですが、この格納した後、ヒストグラムの均等化を行いたいの
ですがどうしたらいいか分かりません。よかったら教えてください。
143デフォルトの名無しさん:2007/01/24(水) 22:29:00
何が分からんのよ
ヒストグラムの均等化が分からんのならぐぐれ
Cが分からんのならまず日本語で手順を書いてみろ
144142:2007/01/24(水) 22:32:18
>>143
ヒストグラムを均等化するにはどういった処理をすればいいかが分からないです。
145デフォルトの名無しさん:2007/01/24(水) 22:36:25
つまりヒストグラムの均等化が分からないんだな?
プログラムとは関係ないな、ぐぐってこい
146131:2007/01/24(水) 22:52:21
>>135、137
さっそくのレスありがとうございます。

>>135
昨今のboostはコンパイラ依存などは
どのような状況なのでしょうか?
(マイナーなコンパイラを使用する予定となっております)
ご指摘の通り、自分のコードがかなり危険をはらんでいることを
理解しておりますが、技術力が足りなく上記のような稚拙な
コードとなってしまいました。

>>137
サンプルコードをありがとうございます。
これから、サンプルコードを参考に改良に励みたいと考えています。



147142:2007/01/24(水) 22:55:48
>>143
一応ヒストグラムの均等化ってのは画素値の分布を均等にするっていうことは
分かります。それをC言語で書くとどうするかってことなんですけど・・・
148デフォルトの名無しさん:2007/01/24(水) 23:00:00
>>147
まだわからんかなあ。
漠然と分からないとだけ言われても教えようがないの。
もっと具体的に質問してくれ。
149デフォルトの名無しさん:2007/01/24(水) 23:01:46
>>147
まずは自分で書け。わかんないところを相談しろ。宿題なら出て行け。
150デフォルトの名無しさん:2007/01/24(水) 23:05:12
あー、マイナーコンパイラでは137のコードは通らないかもしれないなー
VCも2005になって、テンプレート系の準拠度があがってるし
151142:2007/01/24(水) 23:05:42
>>147
すみません、純粋に均等化させるアイディアが思いつかないだけなんです。
もう少し考えてみます。
152デフォルトの名無しさん:2007/01/24(水) 23:09:26
>>151
>純粋に均等化させるアイディアが思いつかないだけなんです。
次からは、そういう情報を隠さずに真っ先に書いてね。
回答側が一番知りたいのはそこなんだから。

適当に、上下から5%目あたりを最小値/最大値にして広げてみたら?
153デフォルトの名無しさん:2007/01/24(水) 23:12:45
>>152 スレ違い。
154デフォルトの名無しさん:2007/01/24(水) 23:13:07
今現在Winでsizeof(wchar_t)==2に依存するコード書いてるんですが
これってどの程度通用するものなんでしょうか?
どうでもいい代物ではあるのでC_ASSERTだけは置くとして、参考にお聞きしたいです
155デフォルトの名無しさん:2007/01/24(水) 23:19:27
>>154
Windows 以外は 4 が主流だろう。
どちらにしても、依存せずに素直に sizeof(wchar_t) 使って書けよ。
156デフォルトの名無しさん:2007/01/24(水) 23:22:37
即答ありがとう

>Windows 以外は 4 が主流
そうだったんですか 
まずいよなぁとは思いつつ書いてたのでちょっと考え直すべきですね
157デフォルトの名無しさん:2007/01/24(水) 23:37:52
>>155
UCS2かUCS4かに依存するコードになっているならそう簡単には行くまいよ
sizeof(wchar_t) == 2ならICUのUCharと互換だが、みたいな
158110:2007/01/25(木) 08:15:08
>>113
RegisterHotKeyだとスタートメニューが開いてしまうので、
SetWindowsHookExでやりました。
ありがとうございました。
159デフォルトの名無しさん:2007/01/25(木) 16:43:28
質問です。
smart_ptrを利用しているのですが、例えばクラスのメンバー変数として

class CNantoka
{
smart_ptr<CHoge> hoge;
};
とやる場合、そのクラスの前にCHoge.hをincludeする必要があるようです。
ですがこれだと、CHoge.hが書き換えられる度に、CNantoka.hを読んでいる全てのcppがリコンパイルされてしまいます。

単純なポインタならば
class CHoge;
class CNantoka
{
 CHoge* hoge;
};
とやればいいのですが、smart_ptrで同様の手軽さを実現することはできないのでしょうか?

(目的から考えると)CNantokaを使いたい連中に、CHogeの実装を知らせる必要はありません。
メンバーには(後述する構造体への)ポインタだけもたせて、メンバー変数代わりの構造体の定義をCNantoka.cppで行なうという手は一応考えました。

160デフォルトの名無しさん:2007/01/25(木) 17:06:37
>>159
class CHoge;
class CNantoka
{
 smart_ptr<CHoge> hoge;
};
でいいのでは?そのsmart_ptrにもよるが
161デフォルトの名無しさん:2007/01/25(木) 17:17:03
>>160
できました。
というかすいませんでした…。
何故できないと思い込んでいたのかお恥ずかしい限りです。

多分以前試した時は、別の原因のエラーが出てたのを勘違いしたんでしょう。
ありがとうございました。
162デフォルトの名無しさん:2007/01/25(木) 17:43:22
161です。
思い込んだ原因がわかりました。
ヘッダファイル内に一部の関数を直書きしていたのですが、そこでsmart_ptr<CHoge>を使っていました。

そりゃあデストラクタが正しく定義できずエラーにもなりますわ…。
163デフォルトの名無しさん:2007/01/25(木) 19:22:13
質問です。C++の日本語処理って
wcout.imbueとwofstream/wifstreamのimbueがあれば
間に合うような気がするんですが
locale::globale()ってどういう場合に利用するんですか?
164デフォルトの名無しさん:2007/01/25(木) 19:23:15
コンストラクタ・デストラクタと純粋仮想関数について混乱気味なので質問
以下のImplクラスのコンストラクタ・デストラクタ呼び出し結果は未定義ってこと?

struct Abst {
virtual ~Abst() {}
virtual void MemberInit() = 0;
virtual void MemberTerm() = 0;
};

struct Impl : Abst {
Impl() { this->MemberInit(); }
~Impl() { this->MemberTerm(); }
void MemberInit() {}
void MemberTerm() {}
};
165デフォルトの名無しさん:2007/01/25(木) 19:47:12
>>164
それぞれImpl::MemberInit(), Impl::MemberTerm()が呼ばれることになってる。
166デフォルトの名無しさん:2007/01/25(木) 20:08:36
あれー? むしろまるでわかってないみたい…
日本語も満足に解釈できないのかよ俺
167デフォルトの名無しさん:2007/01/25(木) 20:22:28
STLはここで聞いても大丈夫ですか?
スレ違いだったらスンマソン。

class Cfoo
{
int func1( void ){ return 1; }
}foo;

void main( void )
{
vector<Cfoo *> f;
f.push_back( 省略 );//Cfooクラスを継承したクラスを入れる
for_each( f.begin(), f.end(), mem_fun( &Cfoo::func1 ) );
}

上記でCfooのメンバ関数func1の戻り値を取る方法なんぞあれば、教えてください。
(実際、使う場合はメンバ関数が複数個(int func1(void), char func2(void)・・・
)になります)
168デフォルトの名無しさん:2007/01/25(木) 20:28:17
>>131-138
今更だけどこれくらいやればboost::functoinと遜色なく使える。
#include <iostream>
#include <functional>
template<typename T> class MyScopedPtr { //削除子付スマートポインタ
public:
    template<typename U> MyScopedPtr(U* p) : p(p), delator(makeDelator<U>) {}
    ~MyScopedPtr() {delator(p);}
    T* Ptr() {return p;} //* ->など演算子は省略
private:
    T* p;
    void (*delator)(void*);
    template<typename U> static void makeDelator(void* p) {delete static_cast<U*>(p);}
    MyScopedPtr(const MyScopedPtr&);
    MyScopedPtr& operator =(const MyScopedPtr&);
};
template <typename Ret, typename Arg1> class FunctionHolder1 : std::unary_function<Ret, Arg1> {
public:
    template<typename FnObj> FunctionHolder1(FnObj f) : obj(new FnObj(f)), pfn(callFunc<FnObj>) {}
    Ret operator ()(Arg1 a) {return pfn(obj.Ptr(), a);}
private:
    MyScopedPtr<void> obj; //std::tr1::shared_ptrもしくはboost::shared_ptrでも可
    Ret (*pfn)(void*, Arg1);
    template<typename FnObj> static Ret callFunc(void* p, Arg1 a) {return (*static_cast<FnObj*>(p))(a);}
};
169デフォルトの名無しさん:2007/01/25(木) 20:29:05
続き
struct C_hoge {
    void hoge1() {std::cout << "hoge1" << std::endl;}
    int hoge2() {std::cout << "hoge2" << std::endl; return 1;}
};

char func1(char x) {return x;}

int main() {
    C_hoge hoge;
    FunctionHolder1<void, C_hoge> fhv(std::mem_fun_ref(&C_hoge::hoge1)); //boost::function1<void, C_hoge>
    FunctionHolder1<int, C_hoge> fhi(std::mem_fun_ref(&C_hoge::hoge2)); //boost::function1<int, C_hoge>
    FunctionHolder1<char, char> fhc(std::ptr_fun(func1)); //boost::function1<char, char>
    fhv(hoge);
    int ret = fhi(hoge);
    std::cout << "ret: " << ret << std::endl;
    std::cout << "fhc: " << fhc('A') << std::endl;
}
170デフォルトの名無しさん:2007/01/25(木) 20:30:45
>>167
std::transform() 使えばいいんじゃね?
171デフォルトの名無しさん:2007/01/25(木) 20:33:22
('A')
172167:2007/01/25(木) 21:43:52
>>170
即レスさんくす。
なんとかがんがったら、望んでいる形に近い状態で
プログラムが動きますた。

ところでfor_eachってループ回り始めたら途中で止めることって
できないですか?
for文のbreakみたいな感じで止めたいんす、、、。

173デフォルトの名無しさん:2007/01/25(木) 21:54:29
例外投げたら
174デフォルトの名無しさん:2007/01/25(木) 22:01:55
>>173
そんなことに例外使うなよ
175デフォルトの名無しさん:2007/01/25(木) 22:03:33
gets()で読み込んだファイル名で書き込みしたいのですが、
ファイル名が同じで拡張子を変えて保存したい時でも1つずつ指定しないとだめですか?
あと、保存先を別フォルダに指定できますか?
176デフォルトの名無しさん:2007/01/25(木) 22:09:09
意味分からん
177デフォルトの名無しさん:2007/01/25(木) 22:21:00
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode(TRUE);
if(DxLib_Init()==-1)return(-1);

WaitKey();
DxLib_End();
return(0);
}

ウィンドウのサイズを変更したいのですが
この文のどこに何を入れればいいのでしょうか?
178デフォルトの名無しさん:2007/01/25(木) 22:25:28
>>172
イテレータの範囲で表現できない終了条件があるなら、
それはもう標準アルゴリズムじゃないから、おとなしく
自分でループ書け。
179デフォルトの名無しさん:2007/01/25(木) 22:30:32
>>175
string filename;
string ext1 = ".dat";
string ext2 = ".lsp";

あとはご自由に
180デフォルトの名無しさん:2007/01/25(木) 22:32:07
>>172
自分で停止するバージョンのfor_each書けば?
template <class IT, class FN>
void my_for_each(IT first, IT last, FN func)
{
  for(; first != last && func(*first); ++first)
    ;
}
みたいな感じで
181デフォルトの名無しさん:2007/01/25(木) 22:42:52
>>177
リファレンス見ろよー
一応教えるとSetGraphModeね
182デフォルトの名無しさん:2007/01/25(木) 22:55:23
>>181
即答ありがとうございます
うまくいきました!
183デフォルトの名無しさん:2007/01/25(木) 23:30:57
>>180
std::find_if ?
184デフォルトの名無しさん:2007/01/25(木) 23:58:24
>>183
ああ、そういえば本来の目的とは全く違うが、find_ifでいいんだね
やってることほぼ同じだし
185デフォルトの名無しさん:2007/01/26(金) 00:20:15
質問です。
C++でプログラムを実行したところ,
-1.#IND00 という値が入っている変数がありました.
デバッグのため,値が-1.#IND00 となったらデバッグプリントを表示したいのですが、
どのようにやればよいでしょうか?
環境は.net 2003です。
ちなみに、
float fx = 0.0;
float r;
if(r == -2.0f/fx || r == 2.0f/fx || r == fx/fx || r == -fx/fx){
としてみたところダメでした。
どなたかよろしくお願いします。
186デフォルトの名無しさん:2007/01/26(金) 00:22:12
185です
rは別の計算によって求めたい値が入っているとします。
187デフォルトの名無しさん:2007/01/26(金) 00:50:21
>>185
float r = 0.0;
188デフォルトの名無しさん:2007/01/26(金) 00:57:59
187さん
レスありがとうございます
説明不足だったと思いますが、実際のプログラムでは当然
float r;
の後に計算を行い結果を格納しています。
このrの値をプリントしたところ,-1.#IND00と表示されるのです・・・
189デフォルトの名無しさん:2007/01/26(金) 01:01:53
計算の部分を詳しく
190デフォルトの名無しさん:2007/01/26(金) 01:02:06
>>188
01.#IND00となってる時

int i = reinterpret_cast<int&>(r);

とやってビットパターンをつかめばいいのでわ?
但しこれはx86の32ビットモード限定で。
191デフォルトの名無しさん:2007/01/26(金) 01:06:22
do{
if ((fp = fopen("list.txt", "r")) == NULL){
printf("ファイルのオープンができませんでした。\n");
return 0;
}

fgets(filename,255,fp);
if(filename=="\n"){return 0;}
read(filename,orig);

printf("つづける?(yes=0)=");
scanf("%d",&yes);
}while(yes==0);

ファイルを1行読んで処理を改行文字がくるまで繰り返すプログラムを作ったのですが、
実行するとファイルが開けませんと表示されて終わってしまういます。
読み込むファイル名はちゃんと確認したし、プログラムと同じフォルダに入っています。
どうしたらいいのでしょう?
192デフォルトの名無しさん:2007/01/26(金) 01:06:34
>>188
計算する数値が計算途中でオーバーフローしてると思う。
193デフォルトの名無しさん:2007/01/26(金) 01:10:34
>>191
ファイルを同時に開ける数に限りがあったはず。
fclose でファイルを閉じるか、fopen をループから出せばいいんじゃね?
194デフォルトの名無しさん:2007/01/26(金) 01:15:12
>>191
いまいち何がしたいのかわからんが、文字列の比較はstrcmp (#include<string.h>)を使うといい

if(filename=="\n"){return 0;}

if(strcmp(filename,"\n")==0){return 0;}
195デフォルトの名無しさん:2007/01/26(金) 01:16:08
185です.
計算過程は長いのでソースは載せませんが,
怪しそうなところとしては,exp計算がオーバーフロー,
途中の計算に使う変数が値を取得していない時があること等が考えられます。
-1.#IND00やINFなどはif文で分岐させることは難しいのでしょうか???

196デフォルトの名無しさん:2007/01/26(金) 01:16:55
 私はXP PROで制御している高額な精密機械を使ってる者です。
そしてそのXPは最終的にはその機械のソフトでしか立ち上がりません。起動の過程において、XPのデスクトップ画面はでるのですが・・。
その機械のサービス(嫌なタイプの修理屋)に少しPCの知識があれば、コントロールパネルを開けられると言われて開ける過程を見る
暇もなくコンパネを見せられました。
 そのソフトの起動中に、そのソフトを絶対に止めることなく、コンパネを開ける方法はどの様にしたらいいのでしょうか?ソフト画面が全画面
になっていてコンパネを見れません。
 自己責任において聞いてます。なにか、コンパネは知識がない奴には見れないなんて感じで言われたので開けれないのが悔しいのです。
そして唯コンパネをシステムを変更する事無しに見たいだけなのです。嫌いなタイプのサービスなんかに馬鹿にされたくありません。
なにとぞ、コンピューターにうとい私を2チャンネラーの知識で助けて下さい。宜しくお願いいたします。

197デフォルトの名無しさん:2007/01/26(金) 01:19:19
>>193
ループの開始をfgetsの前に変えてみましたが、変わらず「ファイルのオープンができませんでした」出ます。
実行してすぐ1週目でとまってしまいます。
198デフォルトの名無しさん:2007/01/26(金) 01:20:26
>>196
まずは落ち着いてスレタイをよく読むように。
初心者歓迎だけに脳髄反射しないように。
199196:2007/01/26(金) 01:20:46
 もし私の質問が板違いならば、マルチにならないように質問する板をご紹介お願いいたします。
200197:2007/01/26(金) 01:23:59
>>194
list.txtに処理をしたいファイルの名前が書いてあって、一つ読んではそのファイルを読み込んで処理をしたいんです。
201デフォルトの名無しさん:2007/01/26(金) 01:27:26
>>196
責任持てないけどミ田←こんなキーがCtrlとAltに挟まれてあるでしょ。
それを押してみたらどう?
もう一度言うけど責任は持てない。
202196:2007/01/26(金) 01:27:50
>>198

 悲しい事にプログラムの事は分りません、ごめんなさい。私の質問に最適な板やスレッドはあるでしょうか?
203デフォルトの名無しさん:2007/01/26(金) 01:28:52
>>200
read()という関数の中で、そのファイルをオープンして読んで処理してんだろ?
終わったらそのファイルを閉じろ。

それと、fopen()に失敗したら、
perror()使ってみな。
fopen()はエラーの際に、その理由を示す番号をerrnoにセットする。
perror()を使って、errnoに応じたメッセージを表示することができる。

多分今回のケースでは"Too many open files"のようなメッセージが出力
されるだろう。
204デフォルトの名無しさん:2007/01/26(金) 01:31:31
>>195
っ isinf()@math.h
205デフォルトの名無しさん:2007/01/26(金) 01:31:46
>>196
君の文章は日本語として滅茶苦茶だし説明能力に非常に問題がある。
現物も見ずに、2chで君のつたない文章から問題を把握し、適切な回答を
出してくれるようなエスパー能力と忍耐力を持つ人は皆無だろう。

というわけで諦めれ。
206デフォルトの名無しさん:2007/01/26(金) 01:33:16
>>197
/* do { */
....
/* } */
207196:2007/01/26(金) 01:38:40
>>201様
 コンパネを出すときに、一瞬のキー操作でだしたので、隠れリンクでしょうか?
Alt+F4をやってみましたが、ソフトの終了無しに全く反応しませんでした。
208デフォルトの名無しさん:2007/01/26(金) 01:38:43
>>196
Win + Rを押して、出てきたウィンドウに control と打ち込みEnterを押す
209デフォルトの名無しさん:2007/01/26(金) 01:41:24
>>207
ちょwwww
日本語の意味が全くわからんぞww
本当に日本人ですか?
210デフォルトの名無しさん:2007/01/26(金) 01:43:16
>>197
そのエラーメッセージは read 関数で出されているんじゃないの?
あとファイル名に改行は入れられない

fgets(filename,255,fp);

fgets(filename,255,fp);
if(filename[strlen(filename)-1]=='\n') filename[strlen(filename)-1]='\0';
211デフォルトの名無しさん:2007/01/26(金) 01:45:10
>>205

 私の文章がどの様におかしいのか説明お願いいたします。
私はおかしくないと自負して読み返しました。
212デフォルトの名無しさん:2007/01/26(金) 01:47:23
>>211
自覚が無いのが一番厄介。諦めて帰れ。
213デフォルトの名無しさん:2007/01/26(金) 01:53:59
>>208様、

本当に有り難うございます。明日やってみます。

>>209

あなたは、コンテクストって概念がない人ですね。主語なんて文章の流れで何度も出す物じゃない。


214デフォルトの名無しさん:2007/01/26(金) 02:01:38
>>213
あんたの日本語おかしいよ。どうせチャンコロかチョンだろ?
不法滞在すんなよ。
215デフォルトの名無しさん:2007/01/26(金) 02:03:22
>>208

自分のPCでもコマンドを打ち込む物が出てきました。本当に有り難う御座います。感謝してます。
本当に有り難うございました。
216デフォルトの名無しさん:2007/01/26(金) 02:07:17
>>208

私の特殊な環境でも不思議とコンパネを入れるとできました。
本当に有り難う御座います。
217デフォルトの名無しさん:2007/01/26(金) 02:08:46
出来たのは不思議なのか?
この間違った日本語面白いな。
つーか日本は26日だ。明日は27日だぞ。
218デフォルトの名無しさん:2007/01/26(金) 02:12:38
空気を読んでわざと変な日本語で書いてるんだろう。
だがそれがいい。
219デフォルトの名無しさん:2007/01/26(金) 02:17:52
204さま>
185です.
使用しているvcではなぜかmathにisinf()、isnan等が入っていませんでした・・・
しかし,教えていただいたisinfをもとに検索したところ
#define isnan(x) ((x) != (x))
という方法を見つけ、if文で検出することが出来ました。
また何かありましたらよろしくお願いします。
ありがとうございました.
>>217

 文章の問題で話合いたいなら、文章の何処がおかしいのか言ってくださいよ。
確かに最初の私の文章は、文章に脈絡がなかったですけどね。
221デフォルトの名無しさん:2007/01/26(金) 02:25:28
デフォルトの名無しさんは多重人格ですね
222デフォルトの名無しさん:2007/01/26(金) 02:32:04
>>219
素晴らしいレスです
223デフォルトの名無しさん:2007/01/26(金) 02:38:14
>>219
もう解決してしまったようだが、VC++だと、
<float.h>に_isnan()が定義されているかもしれない。
224デフォルトの名無しさん :2007/01/26(金) 03:26:12
以下のようなコードで、
継承先のクラス宣言部内(class{〜間};)
で親のpublicメソッドが呼べるのですが、
継承先のメソッド内ではAccess Violationエラーが
出て呼べない状況です。
継承の使い方が間違ってるでしょうか?

class B
{
public:
B(){}
~B(){}
virtual void SendData();
virtual void OnRecieve()=0;
};
void B::SendData(){ }

class A : public B
{
public:
A(){ SendData(); } << 正常にSendData()が実行される
~A(){}
virtual void SendData2();
void OnRecieve(){};
};

void A::SendData2(){ SendData(); }

このメソッドコールするとSendData()のところで
Access Violation C0000005
225デフォルトの名無しさん:2007/01/26(金) 07:30:47
>>224
それだけ見ると問題ないなぁ。勝手にソースを省かずに、
問題が再現する最小のコンパイルできるコードを作ってみるといい。
226デフォルトの名無しさん:2007/01/26(金) 09:11:11
>>224
いっかいフルコンパイルかけてみたら?

# ヘッダ修正したのに、プリコンパイルヘッダ使いやがって、修正前のヘッダ状態でコードはいちゃった とか?
227デフォルトの名無しさん:2007/01/26(金) 14:15:45
DLLのソースをスタティックライブラリ用に変更したいんですけど
どうやればいいでしょうか?
環境はVC2005,WindowsXPです。
228デフォルトの名無しさん:2007/01/26(金) 14:39:34
>>227
新規にスタティックライブラリのプロジェクトを作って、そこにソース&ヘッダをコピペしたほうが早いかも。

そこから、
DllMain周りの初期化/後始末処理と、シンボル名の衝突
__declspec(dllexport), __declspec(dllimport) or *.def の削除は手作業で修正。
229227:2007/01/26(金) 15:18:16
>>228
ありがとうございます。
__declspec(dllexport), __declspec(dllimport)を削除したところ
ビルドはできましたがDLLで使えてた機能が使えません。
DllMain周りの初期化/後始末処理とは何でしょうか?
230デフォルトの名無しさん:2007/01/26(金) 15:31:27
#include<conio.h>
#include<stdio.h>
void main(void) {   キー入力サンプルプログラム */
charKey;
for(;;){   Key = inp(0x60);
printf("%x\n",Key);
if (Key == 0x01){/* ESCで終わります */ break;}
}}
警告 W8065 test15wc.c 18: プロトタイプ宣言のない関数 'inp' の呼び出し(関数 main )
Error: 外部シンボル '_inp' が未解決
というエラーが出てしまいます。自分なりにやってみたのですが、うまくいきませんでした
231デフォルトの名無しさん:2007/01/26(金) 15:36:08
>>229
元々の機能ってフックかなんか? それだと DLL 以外は不可能だぞ。

実行ファイル書くときの WinMain() や main() の亜種で、
DLL用に DllMain() ってのがあって、DLLがロードされたりすると暗黙のうちに呼ばれるのがある。
(詳細はヘルプなりMSDNなりで調べてね)

元ソースを grep してみて、そいつが居るようなら特別な作業が必要ってこった。
232デフォルトの名無しさん:2007/01/26(金) 15:49:12
>>230
キー入力する部分の inp() が君の使っているコンパイラには無い。
他の1文字入力を待つ標準関数を探そう。

# 最後に押されたASCIIコードが port 60h のリードで得られるって OS&PC は何なんだろ?
233デフォルトの名無しさん:2007/01/26(金) 16:00:26
VS2005でMFCで更にダイアログでプロジェクトを新規作成するとF1キーを押すと
HELPが見つかりませんとでます。MFCでもダイアログ以外を選択するとでません。
またMFCでなくWindowsフォームアプリケーションにしても出ません。
これは仕様なのでしょうかね?HELPを作成せずにメッセージを出さなくする方法
はありますか?こちらのスレの方が適切だと後で思ったのでこちらにも書いてみ
ました。マルチポストすみません。
234デフォルトの名無しさん:2007/01/26(金) 16:01:39
私のOSはXPでPCはAT互換機です。
簡単なゲーム作成で、藤川ソフトウェア工房で
「C言語のget系の標準関数を使うのは問題外です。2つ以上のキーを同時に認識できないからです。」
 「キーボードのデータはI/Oポートのアドレス60hから取得できます。
 C言語でI/Oポートのアドレス60hを読むには、conio.hをインクルードしておいて」
ハードウェア割り込みというこでできると書いてありましたが環境が違うので、無理っぽいですが
もう少し調べてみます。有り難うございました。
235227:2007/01/26(金) 16:05:43
>>231
>元々の機能ってフックかなんか? それだと DLL 以外は不可能だぞ。
その通りフックです。そうなんですか〜、既存のアプリがランタイム要るので自分で作ろうとしたのにorz
どうもありがとうございました。
236デフォルトの名無しさん:2007/01/26(金) 16:20:41
>>234
サイト見つけた。
ttp://www14.big.or.jp/~amiami/fsk/old/stg/stg2.html
AT互換機で DOS/Win9x限定(ポート直たたきするから)
+ コンパイラはWatcomC という縛りの元で Webの内容を構成してるぞ。

環境あわすか、他のページを参考にしたほうが良いんじゃねーかな?
237デフォルトの名無しさん:2007/01/26(金) 16:33:20
>>236
そうでした。コンパイラが違うから使えない・・・
あらためて、互換性の高い壁を感じました。(>_<)
コンパイラ変更も含め検討します。
どうもでした!
238デフォルトの名無しさん:2007/01/26(金) 16:35:01
>>237
Win32API使えばいいじゃん
239デフォルトの名無しさん:2007/01/26(金) 16:52:46
>>238
まじっすか!get系を使っていて同時押しできなくて、どうしようかと悩んでいました。
(真剣にコンパイラ変更を考えていた)コマンドプロンプト用のゲーム。
色や位置設定などでコンソールAPIを使っていました!Win32APIもためしてみます!
有り難うございます。m(_ _)m
240デフォルトの名無しさん:2007/01/26(金) 17:01:49
>>239
コンパイラ変更だけじゃなくて、動作OSも変えないと意味ないぞ。 (XP じゃ port 60 のリードできない)
素直に WinAPIを使う=Windows のプログラミングするべし
241デフォルトの名無しさん:2007/01/26(金) 17:06:21
>>234
> 私のOSはXP

お前、XP で動いてるんか。
242デフォルトの名無しさん:2007/01/26(金) 17:09:15
頭は486並だけどな
243231:2007/01/26(金) 17:30:55
>>235
ランタイムを使わないDLLを作るのはどうだろう?
そこから改めてランタイムの不要なアプリを自作すると。
244227:2007/01/26(金) 18:35:36
>>243
既存のアプリが実行ファイルとランタイムの構成で、
それを1つにまとめたくて同じ機能の物はランタイム不要で作れたんですけど、
フックした方がもっと便利なものが作れると思ったら、
DLLとEXEの複数ファイルが必要だったって状態です。
245デフォルトの名無しさん:2007/01/27(土) 15:28:33
>>244
何故「一つのファイル」に拘るの?
246デフォルトの名無しさん:2007/01/27(土) 15:30:35
なんか結局dynamicにリンクするハメになるんじゃないかと
247デフォルトの名無しさん:2007/01/27(土) 16:34:36
先生からもらったプログラムに
int size = 128;
int n = size >> 1;
という記述があったんですが">>"はどういう意味なんですか?
248デフォルトの名無しさん:2007/01/27(土) 16:38:56
先生に訊けよ
249デフォルトの名無しさん:2007/01/27(土) 16:39:26
ビットシフト
250デフォルトの名無しさん:2007/01/27(土) 18:13:52
>>247
先生に
「どうして”int size = 64;”にしなかったのですか?」
って聞いたら教えてあげる
251デフォルトの名無しさん:2007/01/27(土) 18:18:34
ついでに、unsignedでない整数型に右シフトを使うのは
いかがなものでしょうか先生、
ぐらい言うと良い
252デフォルトの名無しさん:2007/01/27(土) 18:19:55
さらに「先生はプログラム向いてないんじゃないですか?」くらい言えば完璧
253デフォルトの名無しさん:2007/01/27(土) 19:09:13
おまえら血も涙もねぇなw
254デフォルトの名無しさん:2007/01/27(土) 19:10:19
ニフラムスレ思い出したwwww
255デフォルトの名無しさん:2007/01/27(土) 19:45:08
「signedでビットシフトっすかw」
256デフォルトの名無しさん:2007/01/27(土) 23:09:45
新これならわかるC++挫折しないプログラミング入門というのを見ながら

#include <iostream>

int main()

{

std::cout << "Hello!" << std::endl;

}

ていうのを書いてあるとおりにしたらエラーなんですけど何が違うのでしょうか?

ちなみにエラー文はこちらです。

エラー E2209 hello.cpp 1:インクルードファイル'iostream'をオープンできない
エラー E2290 hello.cpp 7:型限定子'std'がクラス名または名前空間ではない(関数
 main())
エラー E2379 hello.cpp 7:ステートメントにセミコロン(;)がない(関数 main())
257デフォルトの名無しさん:2007/01/27(土) 23:13:33
>>256
環境書けボケ
258デフォルトの名無しさん:2007/01/27(土) 23:15:06
>>256
BCCならbcc32.cfgとilink32.cfgの中身晒せ
それとBCC32.EXEのあるフルパスと
259デフォルトの名無しさん:2007/01/27(土) 23:31:44
環境とはなんですか?
中身の見方とは?
素人なのですいません(汗)
260デフォルトの名無しさん:2007/01/27(土) 23:37:39
プログラミングやる以前の問題だな
261デフォルトの名無しさん:2007/01/27(土) 23:37:44
>>259
OSと使っているコンパイラとコンパイラのある場所のフルパス書け
それが環境だ
262デフォルトの名無しさん:2007/01/27(土) 23:38:26
>>259
PC初心者板行け
263デフォルトの名無しさん:2007/01/27(土) 23:40:34
だめだこりゃ

┐(´ー`)┌
264デフォルトの名無しさん:2007/01/27(土) 23:41:46
動作環境
Intel Pentium CPUおよび互換性のあるCPU(推奨Pentium/166MHz以上)
Windows 2000、Windows 95,98,NT 4.0(SP3以降)
32MB以上のメモリ(推奨64MB以上)
50MB以上のハードディスク

以上です。
265デフォルトの名無しさん:2007/01/27(土) 23:43:50

間違い
266デフォルトの名無しさん:2007/01/27(土) 23:48:50
なんでbccはデフォでインクルードパスとか通すようにしなかったんだろ
この板でこれ関連の質問が何度あったことか・・・
267デフォルトの名無しさん:2007/01/27(土) 23:57:51
>>266
プログラミングする人ならそれくらい出来てあたりまえだろうと
ボーランドの中の人が思ってたんだろう。
268デフォルトの名無しさん:2007/01/28(日) 01:01:55
程よい素人フィルタになってていいんじゃないかと思う
269デフォルトの名無しさん:2007/01/28(日) 02:15:53
そういえば iostream.h って何時から絶版になったんだっけ?
270デフォルトの名無しさん:2007/01/28(日) 06:25:20
>>269
下位互換のために残っているんじゃないかな?
271デフォルトの名無しさん:2007/01/28(日) 10:03:24
>>269
VC++2003では既に無くなってる。
272デフォルトの名無しさん:2007/01/28(日) 10:23:45
>>264
それはそのソフトが要求する性能。
こっちが知りたいのは、とりあえずお前が実際に使っているOSとそのバージョン、そして使っているコンパイラ。

>>269
ANSI/ISOの規格ではC++98の当初から削除されていると思う。
273デフォルトの名無しさん:2007/01/28(日) 12:02:42
stringの関数c_str()と、data()の違いが分かりません。
↓こんなことしてみたんですけど、なにがなんだか。
#include <string>
#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
string str = "ABC";
cout << str.c_str() << "\n";
cout << str.data() << "\n";

for ( int i = 0 ; (str.c_str())[i] != '\0' ; i++ )
{
cout << (str.c_str())[i] << "\n";
}

for ( int i = 0 ; (str.data())[i] != '\0' ; i++ )
{
cout << (str.data())[i] << "\n";
}
}
274デフォルトの名無しさん:2007/01/28(日) 12:14:34
>>273
ゼロ終端が保証されてるかどうかの違い。
275デフォルトの名無しさん:2007/01/28(日) 12:15:55
c_str() は末尾に '\0' をつけてくれる
data() はつけてくれる保証がない
276デフォルトの名無しさん:2007/01/28(日) 12:21:13
>>273
環境も書くべし

c_str()の場合 A B C \0
data()の場合 A B C
277デフォルトの名無しさん:2007/01/28(日) 12:28:16
よろしくお願いします。
ttp://www11.ocn.ne.jp/~ikalu/cplus/5001.html
↑このページの
// 「string」と「vector」を使用して、実行ファイルにドラッグアンドドロップ
//  されたファイルのパスを分割する
//
//  : stringクラスに対して << をオーバーロードするバージョン(サイズ: 56.0 KB)

を使いたいんですけど、コンパイルすると
path.push_back(string(&s[start], s.end())); の所で
error C2665: 'std::basic_string<_Elem,_Traits,_Ax>::basic_string' : 13 オーバーロードのどれも、すべての引数の型を変換できませんでした
になります。どう直せばコンパイルが通るでしょうか?
環境はVC2005,WinXPです。
278デフォルトの名無しさん:2007/01/28(日) 12:30:40
>>274-276
ありがとうございます。
'\0'を入れるかどうかは、環境によるんですね。
結果のみの出力でみにくいですが、
↓のようになりました。(この環境は、dataでも'\0'が入っているということですよね?)
ABC
ABC
A
B
C
A
B
C


>環境も書くべし
はい。気をつけます。Visual Studio C++ 2005です。
279デフォルトの名無しさん:2007/01/28(日) 12:39:44
>>278
たまたま使ってない部分に\0が入っていたか、VC++がそういう実装をしてるかのどっちか。
280デフォルトの名無しさん:2007/01/28(日) 12:45:49
>>277 path.push_back(string(s.begin() + start, s.end()));
281デフォルトの名無しさん:2007/01/28(日) 13:00:35
"ABC" 自体が 'A' 'B' 'C' '\0' なんだから、
string str = "ABC" の場合だと '\0' は環境に関係なく入るんじゃないの?
282デフォルトの名無しさん:2007/01/28(日) 13:05:28
いいえ。
283277:2007/01/28(日) 13:10:48
>>280
ありがとうございます。
結果もバッチリです。
284デフォルトの名無しさん:2007/01/28(日) 13:34:42
dataとc_strについてですが、
『さて,このにstr()というメンバ関数とほとんど同じ動作をする関数で,
data()というメンバンバ関数があります.このdata()も,コールす
ると文字列へのポインタが返ってきます.そういう点ではc_str()とまっ
たく同じ動作なのです.ではどこが違うのかというと,文字列が設定されていな
いときの挙動です. c_str()は,インスタンスに文字列が設定されてい
ないときには,内部であらかじめ用意されている空文字列(つまり.先頭が冒の
文字列)へのポインタが返ります.それに対してdataOメンバ関数は,NU
LT.ポインタが返るのです.この違いがわかりますか?文穿刺が設定されてい
ないstrir咀クラスインスタンスの内存をp1血Oで出力しようとした際に
,c_str()でポインタを取得すると,空文字列へのポインタが返るので,
画面には単なる改行が出力されます.それに対して,data()でポインタを
取得しようとすると,NULLポインタが返るので,puts()で,それを出
力しようとするとランタイムエラーになります.』
らしいです。

そこで、
// string str = "ABC";
string str1;
string str2;
puts(str1.c_str());
puts(str2.data());
としました。

しかし、いずれも改行が出力されます。
この2種類のメンバ関数の違いを確認する場合どうしたらいいでしょうか?
285デフォルトの名無しさん:2007/01/28(日) 13:40:58
>>284
> data()というメンバンバ関数

ワロタ
286デフォルトの名無しさん:2007/01/28(日) 13:42:23
NULT.ポインタが返るのです.この違いがわかりますか?
287デフォルトの名無しさん:2007/01/28(日) 13:43:05
>>284
printf("%p\n", str1.c_str());
printf("%p\n", str2.data());
288デフォルトの名無しさん:2007/01/28(日) 13:44:09
規格書嫁
289デフォルトの名無しさん:2007/01/28(日) 13:51:02
>>284
その奇怪な引用はどこから来たんだ?
290デフォルトの名無しさん:2007/01/28(日) 13:56:08
data() はヌルにならないよ。規格の 21.3.6 に書いてある。
291デフォルトの名無しさん:2007/01/28(日) 14:58:26
規格上違いがあっても実装上同じにしている処理系は多いのじゃないかな。
あえて違わせておく理由が考えにくい。
292デフォルトの名無しさん:2007/01/28(日) 15:08:37
してはいけない と しなくて良い は全然違うと思うけど。
規格にどう書いているかで解決。

規格書持ってるひとよろ。
293284:2007/01/28(日) 15:36:14
>>284
憂鬱なプログラマのためのオブジェクト指向開発講座のp330?
294デフォルトの名無しさん:2007/01/28(日) 15:42:05
>>274の通りだと思ったけど違うの?
295>>284:2007/01/28(日) 15:51:18
>>284憂鬱なプログラマのためのオブジェクト指向開発講座のp330だつx
296デフォルトの名無しさん:2007/01/28(日) 15:54:07
精度の悪い「画像→テキスト」変換でもかけたような壊れ方だな。
297デフォルトの名無しさん:2007/01/28(日) 16:41:03
>>284
printf("%.*s", str.size(), str.data());
とすれば、ナル文字で終端していなくても問題が出ない。
298デフォルトの名無しさん:2007/01/28(日) 16:54:06
290の言うとおりだな。
>21.3.6 basic_string string operations
>const charT* data() const;
>3 Returns: (略) If size() is zero, the member returns a nonnull pointer
>that is copyable and can have zero added to it.
299デフォルトの名無しさん:2007/01/28(日) 17:57:11
逐次計算をCのプログラムでやれそうなので書いていたのですが、手詰まりになったので質問させてください。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3534.zip

水流と勾配から水深を逐次計算法によって出力するプログラムを作っています。
川は限界水深の地点を境に上流側が上流で動水勾配は1/1000、下流は射流で動水勾配は1/250です
流量2210 川幅200 粗度係数0.02 限界水深2.3175として、適当な値をh2以下に当てはめて計算するのですが

常流では適当な値を入れても悪くても20~30回のループで計算が終了するのですが
射流では1000回超えてもループが止まらない場合が多々あります
計算式としては常流analise.cの
hi = D1->H + D1->Z + term1(D1,D2) + term2(D1,D2,dx) - D2->Z;
ここの部分が
hi = D1->H + D1->Z + term1(D1,D2) - term2(D1,D2,dx) - D2->Z;
に変わるだけなのですが、どう修正すればいいでしょうか?
300デフォルトの名無しさん:2007/01/28(日) 18:07:53
>>299
ロジックを追ってないのでぱっと見で気付いた点のみ。
・2乗にpow()を使うのは流石に勿体無い。乗算にした方がよさそう。
・analise(なんてスペリングだ)で再帰しているが、ループで書き直すべき。
#もしかしたら再帰でスタックを消費している所為で巧く動かないのかも知れない。
・当然、ループ回数をグローバルで持つ必要はない。
#グローバル変数は諸悪の根源と知るべし。
・後の編集ミスを防止するためにも、OneLinerでないならブロック化したほうがいい。
#analise()内のelse節はその典型。
301299:2007/01/28(日) 18:09:39
すみません上流側が常流で、でした。
各analise.cも古いものだったので上げなおしました。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3534.zip

よろしくお願いします。
302デフォルトの名無しさん:2007/01/28(日) 18:11:23
>>301
リロードして確認してから書き込め。
303299:2007/01/28(日) 18:12:58
>>300
早速ありがとうございます。
>>302
すみません、一度頭冷やして修正してみます。
304300:2007/01/28(日) 18:16:06
も一つおまけ。
・tempに絶対値を入れるなら、fabs()を使え。
#>double temp;/*誤差を格納*/
#こんなコメントつけるくらいならdouble gosa;とでもした方がよっぽど理解しやすい。
305デフォルトの名無しさん:2007/01/28(日) 18:40:30
>>292
X3014の画像PDFなら誰でもタダで見れるぞ。
306デフォルトの名無しさん:2007/01/28(日) 19:04:26
>>292
英語版の最新ドラフトもタダで見れるぞ。
307299:2007/01/28(日) 20:17:08
>>304
指摘してもらった部分を修正しました。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3537.c

これで下流方向10mの値で
流量2210 川幅200 粗度係数0.02 h1の高さ 2.3175 h1の高さ 0
h2の水深 (任意の予想値) h2の高さ -0.04 距離の差 10
とするとループが止まらなくなるか限界水深より大きい値になってしまいます

hiを求める式の第三項を+にしただけの常流の場合ではちゃんと出るのですが…
308300:2007/01/28(日) 20:36:11
>>307
そう言われても式の意味も判らなければ何を求めようとしているのかも判らないから無理w
#動水勾配なんて言葉初めて見たし、限界水深ってのがどういう意味を持つのやら。
##あ、いきなり解説しないでね。どうせ理解する気も暇もないから。
309デフォルトの名無しさん:2007/01/28(日) 20:37:41
宿題スレ向きだな
310デフォルトの名無しさん:2007/01/28(日) 20:52:16
templateでやると面白い課題かもっ!
と思ったが>>308と同じ印象を受けたので2分と持たずに挫折した
311299:2007/01/28(日) 20:55:34
input.cにも最初の頃の名残で無駄な変数の定義が…
>>308-310
分かりました、そちらに移行させて頂きます。
ご協力ありがとうございました。
312デフォルトの名無しさん:2007/01/28(日) 20:57:09
すみません「ラッパー」について教えてください
良く理解してないんで確認させてください

VCとBCCはWIN APIのラッパーがあるって記述をWikiで見ました
MinGWもGCC用のラッパーであると思っていいんでしょうか?
313デフォルトの名無しさん:2007/01/28(日) 23:18:26
ラッパーというのは物体があったとしてそれを包み込むものの事。
VCにはMFCがあり、BCCにはVCLがあった。
それはWin32APIをラップして利用者にとって都合のよい方向へ持っていったということ。

MINGWはGCCのラッパーではなくてランタイムライブラリだと思う。
MINGW自体はたしかLinuxの概念をもったなんだっけ。。。
まーそんな感じだったはずなので、ラッパーというよりはエミュレータとかそっちだと思う。

Windows開発にはMinGWでもWin32Apiを使うはずだとおもうけど。
314デフォルトの名無しさん:2007/01/28(日) 23:20:34
>>308
> 気も暇も
こういうときはね、頭っていっとくのが一番かっこいいんだよw
315デフォルトの名無しさん:2007/01/28(日) 23:22:27
>>308
土木・建築は土質力学・構造力学・水理が重要な三本柱ですよ。
316デフォルトの名無しさん:2007/01/29(月) 00:23:39
恥ずかしい>>308がいるスレはここですか?
317デフォルトの名無しさん:2007/01/29(月) 00:34:44
無学で無知で学習意欲が低めですいません
318デフォルトの名無しさん:2007/01/29(月) 02:23:13
sndPlaySoundの戻り値はどのように利用するのでしょうか?
FALSEだった場合の処理を後に続けたいです。
環境:WindowsXP・VC2005
よろしくお願いします。
319318:2007/01/29(月) 03:09:28
上手く行きましたがまた新たな問題がorz
眠いので今日は寝ます、おやすみなさい。
320300:2007/01/29(月) 06:36:52
>>314
大丈夫、私の専門では存分に使ってるから。

>>315
なるほど、業界丸ごと縁がないんで知りませんでしたよ。

>>316
私には、そんな無意味なレスしかできない>316が恥ずかしい。

>>317
自己紹介乙。
321デフォルトの名無しさん:2007/01/29(月) 08:17:12
なんという無意味なレス

308といい、馬鹿だと思われたくてしょうがないようにしか見えないなw
322デフォルトの名無しさん:2007/01/29(月) 09:30:07
for(...){try{...}catch(,,,){...}}とtry{for(...){...}}catch(,,,){...}はどっちが速いのか聞こうと思ったけど
自分で確かめもせずに入に聞くのは良くないと思い以下のコードで実験してみたら
timeBeginPeriod(1);
DWORD t=timeGetTime(),r;
for(int i=0;i<100000000;++i){
try{
if(i<0)throw exception();
}catch(exception e){exit(-1);}
}
r=timeGetTime()-t;
cout<<r<<endl;
t=timeGetTime();
try{
for(int i=0;i<100000000;++i){
if(i<0)throw exception();
}
}catch(exception e){exit(-1);}
r=timeGetTime()-t;
cout<<r<<endl;
timeEndPeriod(1);
結果:
450
270
と出力された。差分180。
でもノイズとしてifの直前にi*=3;i/=3;を入れ、ループ回数を100000000から10000000にしたら
結果:
664
607
となった。差分57。
明らかに差が縮まっていますがこの違いはなんですか?
VC8 最適化なし celeron2.4GHz
323デフォルトの名無しさん:2007/01/29(月) 10:48:53
>>322
tryブロックの前処理/後処理より、乗除演算の方が高コストということ。
324デフォルトの名無しさん:2007/01/29(月) 11:05:42
arigatougozaimasu;
325デフォルトの名無しさん:2007/01/29(月) 11:06:35
>>322
対照実験として、tryなしのループの速度も測るといいと思うよ。
326デフォルトの名無しさん:2007/01/29(月) 11:22:23
timeGetTimeじゃなくて、パフォーマンスカウンタ使った方がいいかもね。
327デフォルトの名無しさん:2007/01/29(月) 11:38:50
Bの方がAよりコードとしては優れているらしいのですが、
どうしてかわかりません。
Aは何がよくないのかどなたか教えてください。

A ----------------------
if( month == FEB ){
if(year%4 == 0){
if( day > 29 )
1egal = FALSE;
} else {
if( day > 28 )
1egal=FALSE;
}
}

B ----------------------

if( month == FEB ){
int nday;

nday = 28;
if(year%4 == 0)
nday = 29;
if(day > nday)
1egal = FALSE;
}
328デフォルトの名無しさん:2007/01/29(月) 11:43:53
・Bはifが少ない。条件分岐のコストは高い。
・1egal = FALSE;の箇所がBは1つしかないから保守が容易。
329327:2007/01/29(月) 11:48:16
>>328
わかりました。
(動けばいいと思ってあまりそういうこと考えてことがなかったので)
ありがとうです。

スペルミスでした。
× 1egal
○ legal
330デフォルトの名無しさん:2007/01/29(月) 12:05:27
更にこうすると言う手もある。
・未初期化の変数が放置されない
・ローカル変数を節約できる(かも知れない)
但し、三項演算子を否定する方針があると使えない
尚、if文は(1行野郎でないなら)ブロック化したほうがよい
if (month == FEB) {
if (day > year % 4 == 0 ? 29 : 28) {
legal = FALSE:
}
}
331デフォルトの名無しさん:2007/01/29(月) 12:57:42
if((month==FEB)&&(day>((year%4)==0?29:28))){legal=FALSE;}
ま、こういう事さね。
332デフォルトの名無しさん:2007/01/29(月) 13:03:07
次はこうか?
legal=!(month==FEB && (day>(year%4)==0 ? 29 ; 28));
333デフォルトの名無しさん:2007/01/29(月) 13:04:32
>>332
やりすぎ。 legal が元々 FALSE だったときに逆転 TRUE になるかもしれない。
334デフォルトの名無しさん:2007/01/29(月) 13:09:37
>>333
右辺に legal を含んでいない論理演算を代入してるだけじゃん。 
335デフォルトの名無しさん:2007/01/29(月) 13:23:48
legal;&=(!((month==FEB)&&(day>((year%4)==0?29:28))));
こうですか?わかりません><
336デフォルトの名無しさん:2007/01/29(月) 13:26:06
>>334
だから、それがやりすぎだって言ってんの。元のコードと意味が違うだろ。
337デフォルトの名無しさん:2007/01/29(月) 13:27:55
>>336
あ。 そういうことか。
元コードの外で legal = FALSE; で初期化されている場合を想定すると FALSE を維持しなくちゃいけないんだなっ
338デフォルトの名無しさん:2007/01/29(月) 13:29:49
お前らlisperかよ きめぇ
339デフォルトの名無しさん:2007/01/29(月) 14:17:32
この程度でその比喩が出てくるのは
単なる無能
340デフォルトの名無しさん:2007/01/29(月) 14:41:24
legal ^= ( -((int)(month == FEB) & (day > (28 + (year%4 == 0)))) ) & legal;
341デフォルトの名無しさん:2007/01/29(月) 19:19:25
10 GOTO 10
と書いたんですがコンパイルできません。
342デフォルトの名無しさん:2007/01/29(月) 19:22:38
>>341 これでおk
/*
10 GOTO 10
*/
int main(void){return 0;}
343デフォルトの名無しさん:2007/01/29(月) 20:43:54
みんなさー、C++ のメンバ変数って、どんな風に修飾してる?
_var
var_
m_var
fVar
他に何かある? どれが一番メジャー?
344漏れはvar派:2007/01/29(月) 20:52:48
修飾ってなんですか?
345デフォルトの名無しさん:2007/01/29(月) 20:56:56
サフィックスやプレフィックスのことだろ。
VC++だとIDEやフレームワークなどの標準スタイルに合わせてるな。MSのVC++なら m_を使う。
346デフォルトの名無しさん:2007/01/29(月) 21:02:23
_varしちゃらめえぇっ
347デフォルトの名無しさん:2007/01/29(月) 21:35:33
fVarの「f」って何さ?
348デフォルトの名無しさん:2007/01/29(月) 21:41:23
friend?
349デフォルトの名無しさん:2007/01/29(月) 21:49:39
うちは会社の決まりで

int m_nVariable;

みたいな感じでハンガリー記法遵守。
変数名、クラス名も基本端折ってはいけない。
10数文字を目安に端折っていい事になってるけど、m_nVarはNG。
350デフォルトの名無しさん:2007/01/29(月) 21:51:02
>>343
何も付けないという手もある、か……?
351デフォルトの名無しさん:2007/01/29(月) 22:20:40
残業代をがっぽり稼げるだろうな。。。
352312:2007/01/29(月) 23:30:19
>>313
遅レスですみません
MinGWはランタイムライブラリだったんですね
ありがとうございます

実はWindowsとLinuxの両方で使えるソフトを書く時に
どうやったら良いか考えてたもんで、いろいろと調べてます
ぶっちゃけて言うと、どうやったら手抜きができるかとw

もう少し自分で調べてみることにします
ありがとうございます
もし何かヒントでも頂ければ助かります ^-^;
353デフォルトの名無しさん:2007/01/30(火) 00:10:05
>>350
>>344
>344 名前:漏れはvar派[sage] 投稿日:2007/01/29(月) 20:52:48
>修飾ってなんですか?
354デフォルトの名無しさん:2007/01/30(火) 00:29:39
>>344
NEETステータスを解除するのに必要な儀式。
355デフォルトの名無しさん:2007/01/30(火) 00:31:49
>>344
一々 this-> を書かなくてもいいようにする魔法
356デフォルトの名無しさん:2007/01/30(火) 00:36:37
俺個人では冗長でも絶対this->書くから何もしない
Class(int age) : age(age) {}
みたいになるときは気持ち悪いけどな
357デフォルトの名無しさん:2007/01/30(火) 15:17:36
初めてプログラムの勉強を始めたんだけど結構おもろいな。
黒い画面に自分の打った文字が表示されてちょっと感動w
358デフォルトの名無しさん:2007/01/30(火) 16:16:44
あるある
359デフォルトの名無しさん:2007/01/30(火) 16:45:09
そして黒い画面に自分の打ち込んだ文字でなく
エラーで埋まる画面を見て萎える
360デフォルトの名無しさん:2007/01/30(火) 16:56:36
template絡みのエラーなら背筋が凍り付く
361デフォルトの名無しさん:2007/01/30(火) 17:17:29
テンプレートをいじって、ああ、また沢山コンパイルしないといけないのか、と落胆する。
そして、export が早く実装されないかなあ、と、叶わぬ夢を見る。
362デフォルトの名無しさん:2007/01/30(火) 20:09:12
ディレクトリ内のファイルを列挙するには、
どうしたらいいの?
363デフォルトの名無しさん:2007/01/30(火) 20:22:39
>>362
いちいち指摘されないように。
>>1
>ただしその場合、質問者は必ず、環境を書きましょう。
364デフォルトの名無しさん:2007/01/30(火) 20:25:35
ごめんなさい。Windows XP, Visual C++ 2005 です。よろしくお願いします。
365デフォルトの名無しさん:2007/01/30(火) 20:32:49
system("cmd /c dir");
366デフォルトの名無しさん:2007/01/30(火) 20:35:15
そんなことでプロセス起動したくないーん
367デフォルトの名無しさん:2007/01/30(火) 20:47:48
FindFirstFile
368デフォルトの名無しさん:2007/01/30(火) 20:51:07
やっぱり Win32 API しかないのかー
なんで C/C++ の標準ライブラリにないんやろ。
369デフォルトの名無しさん:2007/01/30(火) 20:56:25
環境依存だからあと、つboost
370デフォルトの名無しさん:2007/01/30(火) 21:00:55
C/C++にはディレクトリって概念が無いんだっけ?
371デフォルトの名無しさん:2007/01/30(火) 21:11:17
俺、自前でstd::vector相当のやつ作ったんだけど
結構凄いかな?
372デフォルトの名無しさん:2007/01/30(火) 21:12:05
誰でも作れる
373デフォルトの名無しさん:2007/01/30(火) 21:14:18
>>371
勉強目的じゃないなら無駄
実際に使うときは std::vector にしておくと吉
374デフォルトの名無しさん:2007/01/30(火) 21:39:23
>>371
C++がvectorに要求している例外安全性とパフォーマンスの要求を両方満たしているのならそこそこ凄い。
どっちか満たしていないのなら非常に楽、というかまったく凄くもなんともない。
375デフォルトの名無しさん:2007/01/30(火) 21:53:40
つまり、MFCのCArrayは……
376デフォルトの名無しさん:2007/01/30(火) 22:55:43
C++触りだして2週間の初心者です。
環境はVisual C++ 2005を使っています。

質問なのですが、エディットコントロールに入力された値を、
プログラム中でDouble型で使いたいのですが、まったくわかりません。

これまでに試したことは、以下のとおりです。

@GetDlgItemInt()を使ったがInt型だった・・・orz
AGetWindowTextW();でとってきて、i○○f←(度忘れしました・・・)でキャスト。
なぜかInt型になってしまう。

@のDouble版見たいなのはないのでしょうか?
HelpやYahooで調べては見たのですが、手詰まり状態です。

ぜひ、ご教授願います。
377デフォルトの名無しさん:2007/01/30(火) 23:16:46
つ[atof()]
378デフォルトの名無しさん:2007/01/31(水) 03:29:16
a to float
a to int

aって何なのですか?
charのa?
379デフォルトの名無しさん:2007/01/31(水) 04:01:48
ascii
380デフォルトの名無しさん:2007/01/31(水) 04:04:04
yutoriのa
381デフォルトの名無しさん:2007/01/31(水) 13:23:26
実行モジュールやオブジェクトファイルから、もしくはソースファイルから
関数名の一覧を簡単に取得する方法を教えてください!
環境はUNIXです。
よろしくお願いします!
382デフォルトの名無しさん:2007/01/31(水) 14:22:41
ikatyan使え
383デフォルトの名無しさん:2007/01/31(水) 15:39:43
環境[VC++2005 ExpressEdition + boost Ver1.33.1 + WinXP Pro]
以下のコードでメモリアクセス違反(だと思う)が起きます。
原因と対策についてヒントなり、ご教授願えたらと考えています。
(やりたいこと:boost::functionの動的な配列を作りたい)

template< typename T >
class Cfoo{
public:
Cfoo( int size ){
f = new T[size];
cout << "foo コンストラクタ" << endl;
}
~Cfoo(){
delete f;
cout << "foo デストラクタ" << endl;
}
private:
T *f;

};
void main( void ){
typedef boost::function< void(void) > BoostFunc;
Cfoo< BoostFunc > foo(10);
}
384デフォルトの名無しさん:2007/01/31(水) 15:43:16
delete [] とか
385383:2007/01/31(水) 15:54:13
>>384
delete f;
→delete f[];
にするということでしょうか?
386デフォルトの名無しさん:2007/01/31(水) 15:59:28
new で確保したら detele を
new [] で確保したら detele [] を

Effective C++ 3版の16項とか参照
387383:2007/01/31(水) 16:14:40
>>386
ご教授いただきありがとうございます。
うまく動作しました。
Effective C++を急ぎ買いにいきたいと
考えています。 
388デフォルトの名無しさん:2007/01/31(水) 17:48:05
charって何て読むんですか?
チャル?チャー?
389デフォルトの名無しさん:2007/01/31(水) 17:50:36
シャア
390デフォルトの名無しさん:2007/01/31(水) 17:56:14
>>389 ありです。
391デフォルトの名無しさん:2007/01/31(水) 17:57:54
キャラ
392デフォルトの名無しさん:2007/01/31(水) 18:02:31
>>390
そんなの・・・そんなのおかしいですよ……!!
393デフォルトの名無しさん:2007/01/31(水) 18:24:44
>>388
Top > @IT会議室 > @ITクラブ Cafe 会議室 > charの読み方
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=10483&forum=3&start=0
394デフォルトの名無しさん:2007/01/31(水) 18:32:54
プリントフわろた
395デフォルトの名無しさん:2007/01/31(水) 18:42:08
口ではプリントエフというが正直脳内ではプリントフだ
396デフォルトの名無しさん:2007/01/31(水) 19:24:52
たむらけんじ乙
397デフォルトの名無しさん:2007/01/31(水) 19:33:59
同じ文字を指定数表示する関数ってありますか?
例えば●を10個続けて表示させるときは下のようにしています。

for (int i=0;i<10;i++) printf ("●");

これを一つの関数で実現できるならば教えてください。

# 10個なのは例えですので、10個の●を文字列にして表示させれば良いというのは勘弁してください。
398デフォルトの名無しさん:2007/01/31(水) 19:36:20
fwrite("●", strlen("●"), 10, stdout);
これでおk?
399デフォルトの名無しさん:2007/01/31(水) 22:49:42
チョアー
400デフォルトの名無しさん:2007/01/31(水) 22:59:51
std::fill_n(std::ostream_iterator<const char*>( std::cout, "" ),10, "●");
401デフォルトの名無しさん:2007/01/31(水) 23:29:03
>>397
自分で関数作ればいいんじゃないか?
402デフォルトの名無しさん:2007/02/01(木) 00:28:09
欧米人は「チャー」「カー」「ケア(ケイア)」と、普通に(アルファベットの読み通り)発音してるのに
日本人だけ、何故か「キャラ」と言い張る人が多いんだよな。
403デフォルトの名無しさん:2007/02/01(木) 02:03:26
>>398
それは大抵の環境で異常動作をするぞ。
#いや、鼻から悪魔が出るかも知れんが。
404デフォルトの名無しさん:2007/02/01(木) 03:09:50
{
AppProcess(THING*);//test
//Render();
}

ここで言う2行目でerror C2059: 構文エラー : ')'が出るんですけど、
何がいけないのでしょうか?
405404:2007/02/01(木) 03:10:54
環境はVS2003です。
406デフォルトの名無しさん:2007/02/01(木) 03:14:31
その*は何を意味する*だ?
407404:2007/02/01(木) 03:15:37
何度もすみません。
構文エラーが出た理由は分かりませんが、関数を定義しなおしたら通りました。
408makoto:2007/02/01(木) 12:28:52
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.cgi?mode=thr&no=3575
3575.zip
↑は、リスト構造を使ったプログラムですが、EXEファイルを実行すると
なぜか最初に登録(名前&番号)した時点で「問題が発生したため、
・・・.exeを終了します」とダイアログが出ます。なにがいけないの
でしょうか?解決策を教えてください。
409デフォルトの名無しさん:2007/02/01(木) 12:45:49
>>408
>void InputData( Nameval2 *ret )
呼び出し元には関数内で確保したポインタが返らない。
理由は自分で考えな。
410デフォルトの名無しさん:2007/02/01(木) 20:36:25
C言語でdata[128][128]の配列のdata[64][64]を原点として
半径rのデータの合計を求めたいのですが、どうしたらいいんでしょう?
411デフォルトの名無しさん:2007/02/01(木) 20:38:15
>>410
C言語でdata[128][128]の配列のdata[64][64]を原点として
半径rのデータの合計を求めるプログラムを作る。
412デフォルトの名無しさん:2007/02/01(木) 20:53:09
数学苦手なうえ、調べてすらもいないが、

  x*x + y*y = r*r

こんな感じの式じゃなかったっけ?
413デフォルトの名無しさん:2007/02/01(木) 21:32:23
三角関数使うだろ
常識的に考えて
414ガロ:2007/02/01(木) 22:04:09
C++の課題です。
分かる方おられませんか?

•自動販売機のオブジェクトを作成し実現しなさい(ジュース,たばこ,カップラーメンなど何でも良い(何の自販機は出力すること))。ただし,下記の条件を満たすこと。

<条件>
•自動販売機で購入できる「商品商品」,「お金お金」,「自動販売機自動販売機」は最低限クラス化すること。
•「カプセル化」,「継承」,「多様性」を全て利用すること。
•例外処理をすること(プログラムが頓挫した時点でNGとします)。
•入出力は,下記のとおり行うこと。

【入力】
・お金(10円〜1000円)の個数(枚数)
・購入商品選択(複数可)

【出力】
・つり銭(10円〜100円)の個数(枚数)と総購入代金
・購入商品名(複数)

•実現は,main()関数で「自動販売機」クラスのインスタンスを1つ作成し,そのクラスのbuy()メンバ関数を呼び出したら全てが動作するようにする。
415デフォルトの名無しさん:2007/02/01(木) 22:16:14
>>414
宿題スレへ
416ガロ:2007/02/01(木) 22:19:14
>>415
宿題スレでやってもらえなかったので。。
すみません。。。
417デフォルトの名無しさん:2007/02/01(木) 22:21:52
DxLib.h(31): warning C4005: 'DIRECTINPUT_VERSION' : マクロが再定義されました。
error LNK2020: 未解決のトークン (0A000006) new
error LNK2020: 未解決のトークン (0A000013) memset
fatal error LNK1120: 外部参照 2 が未解決です。

VC++2003で今日からDXライブラリを使おうと、

#include "DxLib.h"
if( DxLib_Init() == -1 )
{  return -1 ;}
WaitKey() ;
DxLib_End() ;

を既存のコードに書き加えたところ、上四行のエラーが出ました。
もし定番のエラーか何かでしたら、ご教授願います。。
418デフォルトの名無しさん:2007/02/01(木) 22:30:36
fprintfで文字を出力するときに「"」を出力する方法を教えてください。
419デフォルトの名無しさん:2007/02/01(木) 22:31:52
>>416
人にやってもらっても勉強にならん。
ちょっとは自分でやれ。
420デフォルトの名無しさん:2007/02/01(木) 22:33:33
>>418
\"
421デフォルトの名無しさん:2007/02/01(木) 23:05:47
ラベルでprivateとpublicがあるけど
privateとか実際使う人いるの?
publicにしといたほうがあとあとfriendとか使わなくてすむし
簡単に使えるしpublicマンセーなんですけど

こんな僕にprivateの良さを教えてくださいお願いします
422デフォルトの名無しさん:2007/02/01(木) 23:11:31
内部状態の隠蔽の原則が解らないという話? 
423デフォルトの名無しさん:2007/02/01(木) 23:22:28
そもそも隠蔽する意味がわからない他からいじれたほうが楽じゃないですか
整理のためとかならさらに意味がないと思います
整理なら構造体やら使って整理はできますし
全てpublicだとなにか不具合でもあるのですか?
privateの利点はなんですか?
424デフォルトの名無しさん:2007/02/01(木) 23:24:23
オブジェクト指向について勉強したくない奴だな
425デフォルトの名無しさん:2007/02/01(木) 23:24:56
ファンガードが無い扇風機
刃が剥き出しのシュレッダー
高圧部が露出したブラウン管


使い方に気を付けても、事故が起きるかもしれない。
426デフォルトの名無しさん:2007/02/01(木) 23:28:23
そもそもfriendだって滅多なことでは使わない。
ところでprivateとpublicはラベルなのか。
427デフォルトの名無しさん:2007/02/01(木) 23:34:21
label:
public:
まー、たしかに、ラベルと同じ外見をしてはいるな。
428デフォルトの名無しさん:2007/02/01(木) 23:51:15
ラベル付き構文だし
ある本でもラベルとして書いてた

あと勉強したくないわけではなくて
プライベートの意味をしっかり理解して
使いこなせるようになりたいんで質問しています

未だ事故のようなことが起きていないもので
429デフォルトの名無しさん:2007/02/02(金) 00:00:45
>>428
ハッシュテーブルの中身を自由に書き換える事が出来るとしたら…とか?
430デフォルトの名無しさん:2007/02/02(金) 00:04:24
>>423
構造体を使っても、public とか private 相当な事を実現できますよ
※ファイルスコープなので、別ファイルにすればという条件付で
431デフォルトの名無しさん:2007/02/02(金) 00:06:56
自分以外の人が、そのクラスを使うこともあるでしょう。
作った本人だとしても、半年後の自分が完璧に覚えていると言い切れますか?

余計なモノは見せない、触らせない。
インタフェースの考え方に、そういう理論もあるらしい。
432デフォルトの名無しさん:2007/02/02(金) 08:58:15
private メンバと protected メンバの住み分けが難しい。(特に変数)
何か指針あるんかな?
433デフォルトの名無しさん:2007/02/02(金) 09:12:20
>>432
基本は全てprivate。
どうしてもそうする必要があるならprotected。
434デフォルトの名無しさん:2007/02/02(金) 09:28:34
>>433
ありがと。 private ベースで組み立てたほうが良いと。
単純なアクセッサを protected に置くのは、場合よりけりな問題か…
435デフォルトの名無しさん:2007/02/02(金) 11:01:26
>>434
単純なアクセサってことは内部構造を知らないと使えないということになってしまうよね。
#まぁ、そういうケースもあるっちゃある。外部からは単純かどうか判らないのだし。
436デフォルトの名無しさん:2007/02/02(金) 11:28:07 BE:313282272-2BP(20)
CODE COMPLETE第2版まじオススメ
437デフォルトの名無しさん:2007/02/02(金) 12:02:35
>>435
>まぁ、そういうケースもあるっちゃある。外部からは単純かどうか判らないのだし。
まさにその通りで
read 側なら(使うかどうかを考えずに)気楽にホイホイ作っちゃいますね。

>>436
ぽちりますた。
438デフォルトの名無しさん:2007/02/02(金) 12:55:01
439デフォルトの名無しさん:2007/02/02(金) 20:31:29
BorlandのC++コンパイラを使ってるんですが
Includeフォルダを探しても
curses.hが見つからないんです
一応検索してみたんですがいい情報がなかったので
解決方法を教えてください
440デフォルトの名無しさん:2007/02/02(金) 22:09:12
>>439
何をしたいかによる
441デフォルトの名無しさん:2007/02/02(金) 23:19:03
try chach throw について質問です。
これらは、何時、何処で使うべきなのでしょうか。
通常のエラー処理に使っているときりがなくなってしまうと思います。

try chachの使用基準を教えて頂きたいです。
442デフォルトの名無しさん:2007/02/02(金) 23:20:01
>>441
あなたが必要なように基準を設定する。
443デフォルトの名無しさん:2007/02/03(土) 00:33:47
chachは知らない
444デフォルトの名無しさん:2007/02/03(土) 00:39:44
つれない返事にtypoいじりとはすさんだ人達ですね。
445デフォルトの名無しさん:2007/02/03(土) 00:41:12
> 達人がいっぱい
まで読んだ
446デフォルトの名無しさん:2007/02/03(土) 00:46:01
タツヒトさん
447デフォルトの名無しさん:2007/02/03(土) 01:25:09
呼んだ?
448デフォルトの名無しさん:2007/02/03(土) 01:25:14
>>441
理想的な使い方においては、あなたが思っているほど try, catch の出番は多くありません。
throw は外部にエラーを報告したいときはいつでも使っていいです。
449デフォルトの名無しさん:2007/02/03(土) 01:27:07
chach
450デフォルトの名無しさん:2007/02/03(土) 06:54:43
Linuxで
test.cc と言うファイル、
#include <stdio.h>

class C{
public:
int a(){
return 1;
}
int(*get_f())(){
return a;
}
};

int main(){
int (* f)();
C c;
f = c.get_f();
printf("%d\n", (*f)());
return 0;
}
を、
gcc test.cc
でコンパイルすると、
test.cc: In member function `int (* C::get_f())()':
test.cc:9: error: argument of type `int (C::)()' does not match `int (*)()'
のエラーが出ます。
クラス関数のポインタを取得したいのですが、
どう記述すれば良いでしょうか?
gcc は、3.3.5 です。
451デフォルトの名無しさん:2007/02/03(土) 06:57:03
メンバ関数aをstaticにする。
その他の方法についての詳細は↓
452デフォルトの名無しさん:2007/02/03(土) 07:19:41
453デフォルトの名無しさん:2007/02/03(土) 07:21:46
const n=400;
const int mx=(int)floor((double)Lx/(double)mm);
const int my=(int)floor((double)Ly/(double)mm);

int cell[mx][my][n+1];

……

とすると、

error C2057: 定数式が必要です。
error C2466: サイズが 0 の配列を割り当てまたは宣言しようとしました。

とかでてきました。。。どうすればいいのでしょうか。。。
動的多次元配列というのもよくわかりません。
454デフォルトの名無しさん:2007/02/03(土) 07:27:05
list構造についてです。
大抵の参考書を見ると、一番はいじめのheadを今挿入するnextに入れて、逆さまに格納していくのが多いのですが
それを、逆さまにせずに格納したいのです。
このような方法は可能なのでしょうか?
格納する段階で、headの位置はどうやっても変わってしまうのが困るのですが…。
455デフォルトの名無しさん:2007/02/03(土) 08:01:28
>いじめのhead
456デフォルトの名無しさん:2007/02/03(土) 08:26:02
454に便乗して質問ですが、listのbackは定数時間で要素を返してくれますか?
リンクリストで尚且つ一番初めの要素の参照しか保持していないからランダムアクセスは無理とよく聞くんですが。
457デフォルトの名無しさん:2007/02/03(土) 09:13:29
>>456
double linked listにしてheadとtailを持てばいいのでは?
458デフォルトの名無しさん:2007/02/03(土) 09:35:50
>>453
そのエラーメッセージの通り、コンパイル時にサイズが確定できないから。
newで確保しろ。
459デフォルトの名無しさん:2007/02/03(土) 10:02:58 BE:1006978695-2BP(20)
>>450
”メンバ関数 ポインタ”でぐぐったらいいんでね?
460デフォルトの名無しさん:2007/02/03(土) 14:19:47
C++Builderの初心者です。
ここのスレでいいのかわからないのですが、質問させていただきます。
フォーム上に円、四角形や線を描画するたびに、
オブジェクトとして座標とともに記憶させていきたいのですが、なかなかうまくいきません。
どなたか、教えていただけないでしょうか。
よろしくお願いします。
461デフォルトの名無しさん:2007/02/03(土) 14:29:42
462デフォルトの名無しさん:2007/02/03(土) 14:38:49
>>450
親切にも、エラーメッセージに書いてあるじゃん。
463デフォルトの名無しさん:2007/02/03(土) 14:48:50
メンバ関数のポインタってthisがないと機能しないぞ
464460:2007/02/03(土) 14:56:12
>>461
スレ違いのご指摘ありがとうございました。
C++Builder相談室にいってみます。
失礼いたしました。
465デフォルトの名無しさん:2007/02/03(土) 14:57:17
そういや、メンバ関数ポインタ宣言できても、使い方が分かんないか。
466デフォルトの名無しさん:2007/02/03(土) 17:25:29
char str[NUM][STRLEN];
こんな多次元配列があったとして
char *func(char **str,num){
return *(str+num);
}
こんな関数で、
printf("%d=>%s\n",num,func((char **)str, num));
NUMの文字列を返そうと思ったのですが
うまくいきません。
467デフォルトの名無しさん:2007/02/03(土) 17:31:36
×str + num
○str + num * STRLEN
468デフォルトの名無しさん:2007/02/03(土) 18:45:26
char* func(char str[][STRLEN], int num) { return str[num]; }
469デフォルトの名無しさん :2007/02/03(土) 19:57:09
ここのスレで自動販売機のプログラムをC++クラスを使い
ポリフォーリズム、オーバーロード等をかんがみて作り方が
分からないというレスがあって、宿題レスに行けで無視されてて
それを見て、面白そうだから作ってみようと思いクラス作って
いるんですが、まず、自動販売機には商品が入ってる
わけですけど、商品クラスと自動販売機クラスを作るに当たって
自動販売機があってこそ商品を販売出来る?
商品があってこそ自動販売機で販売できる?
とどちらをどう継承したらいいか、それと自動販売機は商品を見れないと
いけないから、商品の名前、値段、個数等をprotectedで宣言して
自動販売機からは商品を継承できるようにprotectedで継承して
あと、お金クラスを作って、これで、商品を購入で、商品の個数を
減らして・・・
と、考えてちょっと作って、まだ途中なんですが
クラスの設計って、普通、紙かなんかで全体像を書いてソースを書いていく
物なのでしょうか。なんか作っていくと、その場その場で考えてソース書くと
行き当たりばったりで、「あ〜・・ここはこうすべきだった・・」みたいな事が後から
出てきて、たぶんこのまま作り続けても、めちゃめちゃなクラス設計に
なると思うんです。
そこで、みなさんは、クラスを作る時、まず何から初めて、何をしてソースを
書き出すのか教えていただきたいです。
470デフォルトの名無しさん:2007/02/03(土) 20:00:52
>何から初めて
考える事

>何をしてソースを書き出す
手を動かして
471デフォルトの名無しさん:2007/02/03(土) 20:20:09
>>469
自分なら
1.商品と自動販売機は別クラス
2.商品の基底クラスは作っておく
3.商品の名前、価格はメソッドを使って調べる(さらに個数は商品自身の属性ではない)
472デフォルトの名無しさん:2007/02/03(土) 20:33:52
>>471
価格も商品自身の属性ではないとも考えられる
(夏場は自動販売機でのコカコーラ製品の値下げとかあるし)
473デフォルトの名無しさん:2007/02/03(土) 20:50:33
どこを縦読み?
読みにくくて読む気がおきん・・・
474デフォルトの名無しさん:2007/02/03(土) 20:57:05
じゃ読むなよ
475デフォルトの名無しさん:2007/02/03(土) 21:09:24
 ┏━━┓              ┏━━┓
 ┃機械┃              ┃商品┃
 ┗━━┛              ┗━━┛
   ↑                 ↑  ↑
┏━━━┓         ┏━━━┓┏━━━┓
┃自販機┃         ┃ホット ┃┃クール.┃
┗━━━┛         ┗━━━┛┗━━━┛
476469:2007/02/03(土) 21:14:01
>>471さん
>>472さん
レスありがとうございます。
参考にします
477デフォルトの名無しさん:2007/02/03(土) 21:20:44

C++ です。

文字列などの扱いについて質問なのですが、char * と unsigned char *では
どちらに統一するべきでしょうか。

片方に統一しようとすると、標準ライブラリが どっちつかずだったりして
迷ってしまいます。

よろしくお願いします。
478デフォルトの名無しさん:2007/02/03(土) 21:27:47
unsigned char*とる文字列系標準ライブラリがあるの?
479デフォルトの名無しさん:2007/02/03(土) 21:29:00
>>477
文字列「などの」ってのがちょっとわからんな。

文字列だけをいうなら、std::stringがbasic_string<char>のtypedefであるというのを考えても、
標準の思想としてはchar*のほうが「なじむ」のではないかと思うけれども。
480デフォルトの名無しさん:2007/02/03(土) 21:29:02
>>477
文字は char だろ。 signed char, unsigned char は小さい整数型。
標準ライブラリで文字を unsigned char としているところなんてあったっけ?
481477:2007/02/03(土) 22:07:01

ありがとうございます。

標準ライブラリに unsigned char * があったと思ったのは思い違いかもです。
char * で統一できるよう、ちょっとソースを見直してみます。

どっちでもええやん・・・って場面の方が多いのですが、いちいちキャストして
あげないといけなかったり、けっこうゲンナリしてしまっています。
482デフォルトの名無しさん:2007/02/03(土) 22:18:58
>>481
文字列じゃなくてバイナリデータとしてなら unsigned char * はよく使うけどな。
483デフォルトの名無しさん:2007/02/03(土) 22:21:06
バイナリデータならvoid*でやりとりするのが普通だと思ってた。
ソケットインターフェースがchar*とか取るのはマジ勘弁。
484デフォルトの名無しさん:2007/02/03(土) 22:42:59
ソケットだとバイナリってより文字って感じだし
485482:2007/02/03(土) 22:45:13
>>483
俺もインターフェイス部分では void * にするけど、
関数内では unsigned char * にする。
void * 型に加減算できるようなキモイコンパイラは gcc ぐらいだし、
こーするのが定石だと思ってたんだが、違うのか?
486デフォルトの名無しさん:2007/02/03(土) 22:46:02
>>483
void*でやり取りするとしても、実際中身に触れるときにvoid*では無理だろ。
487450:2007/02/03(土) 22:50:45
get_f関数の部分を、
int(C::*get_f())(){
return &C::a;
}
と変更することでコンパイル出来ました。
でもこれだとクラス内の相対的なアドレス(?)が取得出来るだけで、
戻り値単独では、使えませんでした。
return &this->a;
と書くことは出来ないんですね。
488デフォルトの名無しさん:2007/02/03(土) 22:52:46
489デフォルトの名無しさん:2007/02/03(土) 22:59:31
そこでBoostもしくはTR1のbindとfunctionですよ。
#include <cstdio>
#include <boost/function.hpp>
#include <boost/bind.hpp>

class C {
public:
  int a() {
    return 1;
  }
  boost::function<int ()> get_f() {
    return boost::bind(&C::a, this);
  }
};

int main() {
  using std::printf;

  C c;
  boost::function<int ()> f = c.get_f();
  printf("%d\n", f());

  return 0;
}
490デフォルトの名無しさん:2007/02/03(土) 23:37:07
[問題]C言語
2つの値を入力してunsigned char型の変数x,yに代入してください。
また、a = x + y,b = x * yの計算をし表示してください。
※a及びbは、オーバーフローを考慮しえプログラムを作成すること
 printf関数で出力。
↓困ってる作り途中…↓
491デフォルトの名無しさん:2007/02/03(土) 23:37:41
で今こうゆうの書いてますが、aとbにunsigned charが入れれなく困ってます。
#include <stdio.h>

struct hensu{
int a;
int b;
unsigned char x[10];
unsigned char y[10];
}test;

void data_input()
{
printf("2つの値を入力してください。\n");
scanf("%s",&test.x);
scanf("%s",&test.y);
}

void data_output()
{
printf("x = %s, y = %s, x + y = %d, x * y = %d",test.x,test.y,test.a,test.b);
}

int main(int *, unsigned char *)
{
data_input();
data_output();

return 0;
}
492デフォルトの名無しさん:2007/02/03(土) 23:48:18
>>491
進歩も反省の色もないな


138 名前:デフォルトの名無しさん[sage] 投稿日:2007/02/03(土) 22:04:34
>>136
x と y には何が入るの?
1.一般的な文字列?(氏名とか)
2.0〜9 の数字のみからなる文字列?

もし 2.なら >>136 のしたいことは下記の事かもしれない
#include<stdlib.h>
test.a = atoi(test.x) + atoi(test.y);
test.b = atoi(test.x) * atoi(test.y);

要するに、何がしたいのかよく分からないのでエスパー回答しかできないってこった
493デフォルトの名無しさん :2007/02/04(日) 00:23:10
>>491
もっとさぁ、ちゃんと、何て言うか・・・
何がしたいのかっていうかさぁ・・・
ちゃんとしようよ。初心者なのは分かるけど。本読んで勉強したり。
もっと他の・・・・・ああああああ!!!!!
もういい、何がしたいか問題文を簡潔に書け。
構造体を使いたいのは分かったから、どうしてどうしたいのか。
ソースを見る限り、簡単なことをしたいだけだろうから、答えどっかに
アップするから。問題文書け。そんだけだ。
494デフォルトの名無しさん:2007/02/04(日) 00:33:00
>>491
#include <stdio.h>
#include <stdlib.h>
struct hensu{
int a;
int b;
unsigned char x[10];
unsigned char y[10];
}test;

void data_input(void) {
printf("2つの値を入力してください。\n");
printf("X:");
scanf(" %s",test.x);
printf("Y:");
scanf(" %s",test.y);
test.a=atoi(test.x) + atoi(test.y);
test.b=atoi(test.x) * atoi(test.y);
}

void data_output(void){ printf("x = %s, y = %s, x + y = %d, x * y = %d",test.x,test.y, test.a,test.b); }

int main(void){
data_input();
data_output();
return 0;
}
495デフォルトの名無しさん:2007/02/04(日) 00:57:04
ビット演算3発で、ソートをやれっていわれました。
そんな事出来るんですか?
496デフォルトの名無しさん:2007/02/04(日) 00:58:52
できるけどなにか?
497デフォルトの名無しさん:2007/02/04(日) 01:06:01
再帰使えば出来る。

って反則ですか、そうですか。
498デフォルトの名無しさん:2007/02/04(日) 01:10:22
うんちぷー。
499デフォルトの名無しさん :2007/02/04(日) 10:49:06
c++builder5 pro で winsock2の簡単なUDP送信で送信データの前後にSTXとETXを入れるがあい
どうしたら良いか教えてください。

sendto(sock, "TEST", 4, 0, (struct sockaddr *)&addr, sizerof(addr));

な感じで"TEST"は送信出来ています、この前後にSTXとETXを入れたいのですが
500デフォルトの名無しさん:2007/02/04(日) 10:49:23
struct Value {
void MemFunc() { std::cout << "call\n"; }
};

int main() {
std::map<int, Value> m;
std::for_each(m.begin(), m.end(), std::mem_fun_ref(&Value::MemFunc));
//std::vector<Value> vv;
//std::for_each(vv.begin(), vv.end(), std::mem_fun_ref(&Value::MemFunc));
}

コメントアウトしたvectorの場合のように、mapでvalue側のメンバ関数を呼び出したいんですが
このままだと当然ペアそのものが引数になってしまうのでコンパイルできません
これを標準でこなすにはどうするんでしょか?
今はペアを受け取る関数を経由してよびだしてます
501デフォルトの名無しさん:2007/02/04(日) 11:14:52
VC6、XPの環境で
_set_new_handler(can_not_allocate);
char *p = NULL;
try {
p = new char[1024 * 1024 * 10000];
} catch (std::bad_alloc) {
printf("err\n");
}
と、明らかに不可能なサイズを指定するとbad_allocがthrowされるのですが、これが
p = new char[1024 * 1024 * 200];
くらいだとthrowされずに、アプリが止まってしまいます…
どうにかならないでしょうか?
502デフォルトの名無しさん:2007/02/04(日) 11:16:11
>>499
sprintf
503デフォルトの名無しさん:2007/02/04(日) 11:18:49
>>499
#define STX "\x02"
#define ETX "\x03"
sendto(sock, STX "TEST" ETX, 4 + 2, 0, (struct sockaddr *)&addr, sizerof(addr));

#define TEST_WITH_STX_ETX STX "test" ETX
sendto(sock, TEST_WITH_STX_ETX, sizeof(TEST_WITH_STX_ETX) - 1, 0, (struct sockaddr *)&addr, sizerof(addr));

#define MAX_SEND_SIZE 100
char buf[MAX_SEND_SIZE +3];
sprintf(buf, STX "%." MAX_SEND_SIZE "s" ETX", "TEST");
sendto(sock, buf, strlen(buf), 0, (struct sockaddr *)&addr, sizerof(addr));
504デフォルトの名無しさん:2007/02/04(日) 12:10:18
>>501
止まってるんじゃなくてスワップしまくってるだけじゃないの?
何をしたいのかわからんからこれ以上は答えようがないけど。
505デフォルトの名無しさん:2007/02/04(日) 13:44:19
>>500
標準だけではどうしようもないから、そうするしかないと思う。

もしBoostを使ってよければこんなこともできる。
#include <map>
#include <iostream>
#include <functional>
#include <algorithm>
#include <boost/bind.hpp>
#include <boost/iterator/transform_iterator.hpp>
struct Value {
    void MemFunc() { std::cout << "call\n"; }
};
int main() {
    typedef std::map<int, Value> hoge_map;
    hoge_map m;
    m.insert(hoge_map::value_type());
    std::for_each(
        boost::make_transform_iterator(m.begin(), boost::bind(&hoge_map::value_type::second, _1)),
        boost::make_transform_iterator(m.end(), boost::bind(&hoge_map::value_type::second, _1)),
        std::mem_fun_ref(&Value::MemFunc));
}
transform_iteratorは、*演算子での参照時、指定した関数オブジェクトを適用するというもの。
ここでは、bindでpairからValueの方を取り出す関数オブジェクトを指定しているので、
このtransform_iteratorは、*で参照するとValue型のオブジェクトが取り出せるようになっている。
506デフォルトの名無しさん:2007/02/04(日) 13:57:24
>>505
うおぉありがとう。
いろいろ頑張ってたんですが、STLだと転送関数書くのが普通なんですか orz

lambdaかbindか使えばスマートにできそうだなぁとは、ぼんやり考えてましたが
transform_iteratorは使ったことなかったので別の機会に参考にしたいとおもいます
507デフォルトの名無しさん:2007/02/04(日) 13:58:14
あげちゃった ごめんなさい
508デフォルトの名無しさん :2007/02/04(日) 13:59:59
>>503

有り難う御座います、出来ました。
509デフォルトの名無しさん:2007/02/04(日) 14:29:28
>>504
ありがとうございます。

そのスワップがいつまでたっても終わってくれないようです。
こうゆう場合、bad_allocを投げて欲しいのですが…
510デフォルトの名無しさん:2007/02/04(日) 14:33:25
Visual Stdio .NET2003でCを組んでいます。
ローカルにapacheを立ち上げてActivePerlでBBSを動かしています。
そのBBSへWinSockを使用してPOSTを送っているのですが、
書き込みが成功しません。

http://www.ics.kagoshima-u.ac.jp/edu/katuyoukiso/http/index.html
ここの疑似クライアントでPOSTを送ると成功します。
どうやらこのクライアントプログラムでは改行コードの自動変換するようで、
改行を"\r\n"に変えずに送っても成功しました。
そこで、同じPOST文を改行を"\r\n"に変換しCのプログラムに貼り付けて
sendで送ってやるとステータスコード200が返って来るのに書き込みが成功しません。

ここで言う「改行」とはエンターキーを押しただけの事です。
ちなみにsendの直後にrecvも書いているのですが、受信出来ずに止まってしまいます。
ステータスコードはapacheのログから読み取りました。
ちなみにCプログラム上からのGETは問題なく動作しました。
言葉足らずで申し訳無いのですが、よろしくお願いします。
511デフォルトの名無しさん:2007/02/04(日) 14:41:43
>>510
通信プロトコルを分かってるかどうかが一番怪しい

>改行を"\r\n"に変換し
の部分が二番目に怪しい

できるならソースコードすべてうp
512デフォルトの名無しさん:2007/02/04(日) 14:52:00
coutは、実はstd::ostreamクラスのインスタンスだと思ったので、
↓のようにtoutというインスタンスを生成して標準出力できるか
どうかを試してみました。
#include <iostream>
#include <conio.h>
using namespace std;
int main(void)
{
ostream tout;
tout << "coutの代わり\n";
getch();

}
これを実行すると↓のエラーがでてしまいます。
ostream型の新たなインスタンスを作って
標準出力することは不可能なのでしょうか?
error C2512: 'std::basic_ostream<_Elem,_Traits>' : クラス、構造体、共用体に既定のコンストラクタがありません。
513デフォルトの名無しさん:2007/02/04(日) 14:59:56
>>509
そりゃぁ、要求されたメモリを実直に確保しようとしているOSに失礼な発言だぞ。
514デフォルトの名無しさん:2007/02/04(日) 15:19:37
>>509 自力で上限を調べるという手もある

#include <iostream>
#include <windows.h>
int main(void)
{
MEMORYSTATUS mem_status;
mem_status.dwLength=sizeof(mem_status);
GlobalMemoryStatus(&mem_status);
std::cout << "物理メモリ : " << mem_status.dwTotalPhys << " bytes" << std::endl;
std::cout << "空き物理メモリ : " << mem_status.dwAvailPhys << " bytes" << std::endl;
return 0;
}
515510:2007/02/04(日) 15:27:04
>>511
読みづらい事この上ないと思いますがよろしくお願いします。
http://bbs.freedeai.com/src/up0452.txt
拡張子を.cppへ変えてください。

使い方は
(プログラム名).exe URL ポート番号 アクセスを繰り返す回数 書き込むフォーム名(未使用) ディレクトリ名(未使用)
です。
ちなみに卒研用に開発しているので、悪用するつもりはありません。
516デフォルトの名無しさん:2007/02/04(日) 15:37:46
>>512
coutはstd::ostreamクラスのインスタンスということに違いはないが、
std::ostreamのコンストラクタでは、出力先となる「ストリームバッファ」を渡さなければならない。

std::ostreamは出力内容を文字列化したら、実際の出力をストリームバッファへ丸投げしている。
ストリームバッファは名前のとおりバッファリングしつつ、実際に出力を行うという役割分担になっている。

だから標準出力を行いたければ、標準出力に対応するストリームバッファを用意しなければならない。
それよりもWindowsとかUnix系なら単にstd::ofstreamで"con"を開くのが楽。
517デフォルトの名無しさん:2007/02/04(日) 15:51:04
>>514
それだったら、VirtualAllocの使い方を教えたほうがいいような気がする。
518デフォルトの名無しさん:2007/02/04(日) 15:52:42
ファイルマッピングの方がいいんでないの
519デフォルトの名無しさん:2007/02/04(日) 16:20:14
構造体のタグ名なんですけど、
関数のあるヘッダにインクルードする前じゃないと未定義にされます。
includeより先に構造体っていうのは見栄え悪いと思うんですが、
この場合、一番初めに読み込むヘッダに構造体を宣言すればいいのでしょうか?
520デフォルトの名無しさん:2007/02/04(日) 16:42:40
string 型から内部バッファの char* ポインタをもらうことはできますか?
const char* じゃなくて char* ね。
521デフォルトの名無しさん :2007/02/04(日) 16:45:11
>>519
部分的にで良いからその問題部分のソース書いちゃえよ
もう、なんか、書いてることの意味がわかんないから
522デフォルトの名無しさん:2007/02/04(日) 16:46:30
>>520
あまりお勧めしないが、 &s[0] でいいかね?
終端の 0 に気をつけてな。
523デフォルトの名無しさん:2007/02/04(日) 16:48:28
>>522
なぜお勧めしないのですか?
確か vector はそれが可能だったよね。
string でも保障されているのかな。
524デフォルトの名無しさん:2007/02/04(日) 17:15:34
vector が空のとき未定義なんだったっけ?
525デフォルトの名無しさん:2007/02/04(日) 17:27:00
>>521
struct GAME{
int turn; //ターン数
}gameSc;
これを

// scene_b.h
//←ここに持ってくるか

void ClickBtScene(HWND hWnd,
int *scene,int x,int y,int *ani,
struct GAME *gameSc,bool *timOn)
{
//turnを使う
}

// game.cpp
//←ここへ持ってくるか
#include "scene_b.h"//←順番的には前

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
// turnはこっちでも使う
//:
}

ごちゃごちゃしてきたら宣言だけ纏めた別ファイルに送るのがセオリーだと
思ったのですが、順序みたいなものがあるんでしょうか?
それとヘッダファイルの使い方を誤っているかもしれません。
関数書ききれないからヘッダに記入してますが。。。
526デフォルトの名無しさん:2007/02/04(日) 17:27:24
>>523
まず c_str() が const バージョンしかないことから考えて、
string は char* を通してアクセスされていることを想定していない。
現行の C++ の規格では内部の要素が vector のように
連続していることを示す根拠は無い。このことを保証する記述は
次回の規格更新で取り込まれるかもしれない。
527デフォルトの名無しさん:2007/02/04(日) 17:33:18
あー、stringに関してはもう一つ。
現在のコンパイラは大抵(マルチスレッド対応などから)そういう実装はしていないが、
複数のインスタンスが一つの領域を利用している可能性があるので書き換えては拙い可能性もある。
528デフォルトの名無しさん:2007/02/04(日) 17:36:32
>>527
そんな実装では const 付いてないメンバ関数呼び出した時点で
共有を解除するはずだから、 &s[0] ならあんまり関係ないと思うぞ。
共有が問題になるのは const_cast<char*>(s.c_str()) だろう。
529デフォルトの名無しさん:2007/02/04(日) 17:36:38
だからSTLと絡めたいときは vector<TCHAR> v(MAX_PATH)
530501:2007/02/04(日) 19:18:25
>>514,>>517
ありがとうございました。
VirtualAllocで(実際確保する量よりも少し多めにサイズを指定して)解決できました。
531521:2007/02/04(日) 19:32:05
>>525
ごめんよけわかんなくなった
とりあえず、構造体をあっちこっちで使うなら
ヘッダファイル作ってそこに宣言しといて
cなりcppなり構造体をつかうソースファイルにインクルードしたら?
あと関数書ききれないからヘッダに記入しているっていうのは
ヘッダに関数宣言して処理内容も書いてるの?ちがうか?
あと、typedefしたら?
あんま助言にもなってねーな。

ちょっとここの板の人たち
誰か助言してあげてよ。板開いたらみんなスルーしてるからびっくりした。
ま、そういうことで頼みます。
532525:2007/02/04(日) 20:03:14
>>531
スレ汚しスマソ。助言ありがとうございます。
後は華麗にヌルーして下さい
533デフォルトの名無しさん:2007/02/04(日) 20:04:11
>>525 元のソースをできるだけ残すとこんな感じ
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3604.lzh

もっと違う方法があるんだけど、書きかえる箇所が多いと大変だろうからこのままで
534デフォルトの名無しさん:2007/02/04(日) 20:46:20
内容
void func(char *str, ...)
{
□□処理□□;
}

↑こういった宣言をしている関数の、...はいったいどういう意味があるのでしょうか?
535デフォルトの名無しさん:2007/02/04(日) 20:47:30
>>534
printf()のような可変個数の引き数をとるということ。
536521:2007/02/04(日) 20:50:45
>>533
一応見さしてもらいました
とりあえず構造体はtypedefしたほうが使いやすいですよ。
あとは、ターンを何のために使うのか、グローバルで構造体変数を
持つ必要性等は、わかりませんからスルーでーす
537デフォルトの名無しさん:2007/02/04(日) 20:58:37
>>534
「可変長引数」でグッゲ
538525:2007/02/04(日) 21:13:59
>>533
すみません。解凍できませんでした。
しかし、悪いところ諸々教えていただきました。以下スルー
539デフォルトの名無しさん:2007/02/04(日) 23:56:38
C言語にあるqsort()のような関数は、C++にありますか?
listにもsort等がありますが、qsort()みたく比較関数を指定できる機能が欲しいです。
540デフォルトの名無しさん :2007/02/05(月) 00:04:18
質問さしてください。
例えばhoge.hというヘッダーファイルを作ったとします
その中身で二重インクルードガードとして
#ifdef HOGE_H_INCLUDED
#define HOGE_H_INCLUDED
#endif /*HOGE_H_INCLUDED*/
みたいに書くとおもいきや
VC++だと例えば<string.h>では
#ifndef _INC_STRING
#define _INC_STRING
#endif /* _INC_STRING */
でboostなんか見ると
#ifndef BOOST_UTILITY_HPP
#define BOOST_UTILITY_HPP
#endif // BOOST_UTILITY_HPP
となってます。
どれでも良いんでしょうか。
コンパイラによって(プリプロセッサ)変わってくるんでしょうか。
本によっても違うし、コンパイラによっても違うので不思議です
知識不足が原因だと思いますが、どなたか教えていただけないでしょうか。
お願いします。

541デフォルトの名無しさん:2007/02/05(月) 00:05:06
>>539
std::sort
542デフォルトの名無しさん:2007/02/05(月) 00:05:38
何のためのlist::sort( Pred P)だよ。
543デフォルトの名無しさん:2007/02/05(月) 00:06:37
>>540
一意と思われるマクロ名ならなんでもいいんじゃないの
544デフォルトの名無しさん:2007/02/05(月) 00:07:06
>>540
名前が他と重複しなければなんだっていい。
ただアンダーバーから始まる名前は予約されてるから使っちゃダメ。
545デフォルトの名無しさん:2007/02/05(月) 00:07:27
>>539
そもそもqsort()の実装は決まっていません。
546デフォルトの名無しさん:2007/02/05(月) 00:08:38
>>540
それらの何がどう違うと思って質問していらっしゃいますか?
547デフォルトの名無しさん:2007/02/05(月) 00:08:46
>>540
インクルードガード自体がマクロとディレクティブの応用に過ぎないので
標準的な命名規則はない。ただ、先頭がアンダースコアで始める名前は処理系で
予約されている名前だから _INC_STRING みたいな命名は真似しちゃダメ。
548デフォルトの名無しさん:2007/02/05(月) 00:13:36
>>540
/*...*/
//....

は分かりやすいようにしてる単なるコメント
とエスパーレス
549540:2007/02/05(月) 00:33:30
ありがとうございました。
アンダースコアで始める名前を手本にしてしまうところでした。
勉強になりました。
550デフォルトの名無しさん:2007/02/05(月) 22:04:07
windows.h を include したとき、以下のエラーが出るようになりました。

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
test.c:
エラー E2293 c:\Borland\Bcc55\include\objidl.h 13848: ) が必要
エラー E2293 c:\Borland\Bcc55\include\objidl.h 13886: ) が必要
*** 2 errors in Compile ***

先ほどまでは include しても全く問題なかったのですが、突然だめにorz
どうかよろしくお願いします。
551デフォルトの名無しさん:2007/02/05(月) 22:11:44
>>550
もっと情報がないと難しいぞな。
ちょっとエスパってみると、Platform SDK でも適用したか?
552550:2007/02/05(月) 22:41:22
>>551
すみません、解決しました。原因は、includeの順序でした。

具体的には、windows.hを使用した関数があって、そのプロトタイプを宣言するヘッダファイルを
windows.hの前に読もうとしていたのがいけなかったようです。
553デフォルトの名無しさん:2007/02/06(火) 17:16:18
エスパー失敗したあとにレス付けるの禁止しないか
寂しすぎる
554デフォルトの名無しさん:2007/02/06(火) 17:50:15
知るかそんな事
555デフォルトの名無しさん:2007/02/06(火) 18:00:38
>>553
    _, ,_  ,_
ヤダァ(`Д´(`  )<オジサンが君の布団でオナラしてあげよう
| ̄ ̄ ̄ ̄ ̄ ̄ ̄.|
|  | ̄ ̄ ̄ ̄|  |
|  |  @  @|  |
|  |@  @  |  |
|  |____|  |
|__________|



(⌒ ⌒;:゙:ヽ.'       /.    ゚
从 `(´⌒;`:;ノ:人;;⌒`:" / 从 。
.(´;(´⌒(;・"⌒`);/`):';⌒`)`)。.' ゚
。((;;;) ).;:"  ’:"    _, ,  ,_
  (`Д´(`  ) ゚  /)
| ̄ ̄ ̄ ̄ ̄ ̄ ̄.|`):';⌒`)`)。.' ゚
|  | ̄ ̄ ̄ ̄|  |⌒`).(´;(´⌒(;・"⌒`);
|  |  @  ボフン!ゴワン!ブブデバビデボース!!
|  |@  @  |  |⌒`) :; 从 )
|  |____|  |(⌒)) \ ))
|__________| ヽ  
556デフォルトの名無しさん:2007/02/06(火) 23:35:52
クラスのメンバ関数で、戻り値の型が違うだけで、名前、引数は同じものを
複数書きたいのですが、既に定義されていますとコンパイルエラーになってしまいます。

これを実現するにはどうしたらよいのでしょうか。
557デフォルトの名無しさん:2007/02/06(火) 23:39:28
>>556
メンバテンプレートにする。
558デフォルトの名無しさん:2007/02/06(火) 23:43:47
C++は戻り値のみ違うオーバーロードが出来ない仕様なので、
実現できない。
559デフォルトの名無しさん:2007/02/06(火) 23:47:53 BE:402792236-2BP(20)
変数の初期化について教えてください。
int a(100); と int a = 100; は、まったく同じ意味なのでしょうか?
効率が違うなんてことはありませんか?
a(100)の方が、何故か速そうに見えるのでこっちを使っているのですが無意味ですか?
どなたか教えてください。よろしくお願いします。
560デフォルトの名無しさん:2007/02/06(火) 23:52:21
>>559
無意味です。
561デフォルトの名無しさん:2007/02/06(火) 23:58:41
>>559
コンパイル速度は違うかもしれないな
どっちが速いかは知らんが
562デフォルトの名無しさん:2007/02/07(水) 00:06:26 BE:268528526-2BP(20)
>>560>>561
すごく早い回答ありがとうございます。
a(100)にするのは無意味でしたか…。
これからはタイプが楽な = を使っていくことにします。
ありがとうございました。
563デフォルトの名無しさん :2007/02/07(水) 00:06:42
クラスのメンバの初期化子を並べて初期化されてないかを覚えて
おく必要がないように使う(effective c++ P21)意外で
そういう初期化の仕方ってしたこと無いな〜
564デフォルトの名無しさん:2007/02/07(水) 04:01:20
>>559
intじゃなくてユーザ定義のクラスなら変わるかもしれない
565デフォルトの名無しさん:2007/02/07(水) 04:22:27
あれ、無職駄目人間さんってこの前何万もするような本がマジお奨めとか言ってなかったっけ。
分かってると思うけどexplicit
566デフォルトの名無しさん :2007/02/07(水) 05:01:55
無職駄目人間さんって誰?
567デフォルトの名無しさん:2007/02/07(水) 05:14:51
無職ダメ人間\(^o^)/◆c4UQllRmv2
beポイント:20
登録日:2007-01-16
紹介文
◆c4UQllRmv2
・身長160台
・中卒
・見た目はおっさん、頭脳は小学生並
・コミュニケーション能力不足
 (不足というかまったく無し)
・もちろん無職
・引きこもり
・非常識
・根性なし
・常に下痢(この俺は間違いなく腸癌で死ぬ| ^o^ |)
・冷え性で足の色がおかしい
・パソコンばかりやってるせいで、
 漢字がほとんど書けない

人生オワタ\(^o^)/
568デフォルトの名無しさん :2007/02/07(水) 06:05:39
そんな人居るんだ。あんまスレで見かけたことないな。
ま、俺としてはどうでも良い項目として
身長160台:別に良いじゃん
中卒:家計の事情とかで高校いけない人とかもいるからさ
見た目:おっさんだろうがじいさんだろうがどうでも良い
     自分の面が曲がっているのに鏡をせめてなんとなるって感じ
頭脳:小学生並みなら逆に吸収率よさそう
ま、あとの項目も自分で書き込んでるなら別にいいや

で、どこのスレで頻繁にカキコしてるの?見てみたい。
569デフォルトの名無しさん:2007/02/07(水) 08:32:42
7,8レス戻るといるよ
570デフォルトの名無しさん:2007/02/07(水) 11:44:47
[1] 授業単元:数値計算法
[2] 問題文(含コード&リンク):以下の常微分方程式をホイン法で解くためのプログラムを作成しなさい。また
0<=t<=10におけるx(t)およびy(t)のグラフをエクセルで作成しなさい。
dx/dt=2x(t)-0.01x(t)y(t)
dy/dt=-y(t)+0.01x(t)y(t)
初期条件にx(0)=300,y(0)=150

[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
 [3.3] 言語:c言語
[4] 期限:2007年2月9日まで
#include <stdio.h>
double func(double x, double y);
void heun(double x, double y, double a,double b, int n,double (*f)(double,double));
int main(void)
{ int n;
print("分割数を入力してください--->")
scanf("%d",&n);
heun(0.0,1.0,0.0,1.0,n ,func);
return 0;}
void heun(double x, double y, double a, double b, int n, double (*f)(double,double))
{ double k1,k2,h;
int i;
h = (b-x)/n;
for (i = 0 ; i<n ; i++)
{ k1=f(x,y); k2 = f(x+h,y+h*k1);
y = y+h/2.0 * (k1 +k2);
x = x+h;
print("x=%f \t y=%f \n" , x,y);}}

これをどう変えるのでしょうか?
571解決済み:2007/02/07(水) 12:41:06
572デフォルトの名無しさん:2007/02/07(水) 12:47:46
マルチ死ね
573デフォルトの名無しさん:2007/02/07(水) 12:54:32
マルチはDVDさえあれば何度でも戻ってくるからな。
574デフォルトの名無しさん:2007/02/07(水) 12:59:14
>573
そのマルチ違う。(一瞬で元ネタが分かった自分も嫌だが)
575デフォルトの名無しさん:2007/02/07(水) 14:19:06
static ではないメンバ関数のアドレスを知りたいのですが、うまく行きません。
やりたいことは、

class A {
public:
void func(){ /* A独自の処理 */ }
void getadr(){ printf("%x\n",&func); }
};
class B : public A {
public:
void func(){ /* B独自の処理 */ }
};

main()
{
A a;
B b;
a.getadr();
b.getadr();
}

こんな感じなのですが、これは func が static ではないためコンパイルエラーになります。
getadr内部を &A::func のようにすればエラーにはなりませんが、
それでは継承クラスから使用した場合に本来の目的を達成できません。
アドバイスお願いします。
576デフォルトの名無しさん:2007/02/07(水) 14:24:12
577デフォルトの名無しさん:2007/02/07(水) 15:02:17
>>575
>それでは継承クラスから使用した場合に本来の目的を達成できません。

意味不明。
578デフォルトの名無しさん:2007/02/07(水) 16:52:28
>>577
> static ではないメンバ関数のアドレスを知りたいのですが、うまく行きません。
と書いたとおり、メンバ関数funcのアドレスを知りたいのです。

A a;
a.getadr();

だと a.func() のアドレスが表示されて、

B b;
b.getadr();

だと、b.func() のアドレスが表示させたいんです。
579デフォルトの名無しさん:2007/02/07(水) 17:01:40
char dd[10] = "#003366";
の中身をTColorの変数へ移そうと思い、
StringToColorを使ったのですけどうまくいきません。
どのようにすれば移せるのでしょうか?
580デフォルトの名無しさん :2007/02/07(水) 17:11:39
javaか?
581デフォルトの名無しさん:2007/02/07(水) 17:14:25
>>578
こうかなぁ...
#include <cstdio>
using namespace std;
class A {
public:
void func(){ /* A独自の処理 */ }
};
class B : public A {
public:
void func(){ /* B独自の処理 */ }
};
template <typename T> void getadr(const T &) { printf("%x\n", &T::func); }
int main()
{
A a;
B b;
getadr(a);
getadr(b);
}
582デフォルトの名無しさん:2007/02/07(水) 17:29:54
>>578
&A::funcとして得られるものは「メンバへのポインタ」と言い、普通のポインタとは別扱い。
整数型は勿論void*への変換もできない。
メンバへのポインタ型にsizeofをして得られる大きさとsizeof (void*)が異なっていることもある。

なお仮想関数であればAのメンバへのポインタからオーバーライドされたBのメンバ関数を呼ぶことはできる。
#include <iostream>
class A {
public:
  virtual void func() {std::cout << "A::func" << std::endl;}
};
class B : public A {
public:
  void func() {std::cout << "B::func" << std::endl;}
};

int main()
{
  void (A::*mp)() = &A::func;
  A a;
  B b;
  (a.*mp)();
  (b.*mp)();
}
583デフォルトの名無しさん:2007/02/07(水) 22:47:55
BCBだと、メンバ関数ポインタは12バイトだったな。
584デフォルトの名無しさん:2007/02/08(木) 00:26:36
>557
>558

ありがとうございます。
テンプレートはちょっと今の私には敷居が高いので、
関数名を変える方向で考えてみます。


585デフォルトの名無しさん:2007/02/08(木) 14:16:06
質問です。
多次元配列の動的確保では

char (*s)[32] = new char[10][32];

このような書き方だということを知ってはいるのですが、()が何故必要なのかが感覚的に理解できません。
どのように解釈するべきなのでしょうか?
586デフォルトの名無しさん:2007/02/08(木) 15:47:13
>>585
char* s = new char[10][32];
587586:2007/02/08(木) 15:58:05
間違えた。無視してくれ
588デフォルトの名無しさん:2007/02/08(木) 16:29:32
>>585
()が[]より優先順位が低いから。
new演算子ではchar[32]へのポインタと解釈されているから、
括弧なしでは大きさ32のchar型へのポインタ配列となってしまい、
コンパイルエラーが出る。

なお、コンパイラは更に[10]の部分もparseして、大きさが320以上の
アラインされた領域への先頭アドレスを返す(但しchar型なので多分
ぴったり320バイトだろう)ので、delete[] s でちゃんと削除できる。
589デフォルトの名無しさん:2007/02/08(木) 16:37:58
naruhodo
590デフォルトの名無しさん:2007/02/08(木) 22:50:10
標準ライブラリかWin32apiを使って あるフォルダのファイル一覧を取得するにはどうすればいいですか
591デフォルトの名無しさん:2007/02/08(木) 22:55:49
>>590
FindFirstFile でググれ。
592デフォルトの名無しさん:2007/02/08(木) 23:15:44
>>590
"準"標準ライブラリでもいいならboost::filesystem
593デフォルトの名無しさん:2007/02/09(金) 00:12:06
boost::filesystem は、日本語の処理で問題があって痛い目を見た。
594デフォルトの名無しさん:2007/02/09(金) 00:14:26
CVSで落とせ
595デフォルトの名無しさん:2007/02/09(金) 01:16:29
windows環境です

visual studio のデバッグ機能の最中
ポインタ変数が関数をさしてる場合、その関数名もを表示してくれるのですが、
これはそのポインタ変数に対するprintf系で(それ以外のWinAPIでもかまいませんが)文字列化できるものなんでしょうか?
可能でしたら教えていただきたいです
596デフォルトの名無しさん:2007/02/09(金) 02:28:20
>>595
その場合、Visual Studioがデバッグ可能な形式でコンパイルして
リンクしているからデバッガからはそういうことができる。
一般的には無理と考えてよい。
597デフォルトの名無しさん:2007/02/09(金) 02:52:20
ありがとうです 
やっぱり無理ですか 残念
VCのデバッグシンボル扱うWinAPIがあったと思ったので、やる気ならたぶんそれ使うんですね
598デフォルトの名無しさん:2007/02/09(金) 03:18:50
if() X -= 0.5;
の「-=」とは、どういう意味ですか?
599デフォルトの名無しさん:2007/02/09(金) 03:19:49
X = X - 0.5;
600デフォルトの名無しさん:2007/02/09(金) 04:35:59
ありがとうございます。
601デフォルトの名無しさん:2007/02/09(金) 04:56:58
関数の引数を参照にすると、ハード面で何か良いことはありますか?
ポインタ渡しより動作が軽いとか。
602デフォルトの名無しさん:2007/02/09(金) 06:14:06
そういうの「ハード面」っていうのか?
参照ならNULLが渡されないことを前提にしたコードが書ける、なんてのはソフト面になるか?
ソフト面って、なんか給食みたいな響きだな。
603デフォルトの名無しさん:2007/02/09(金) 06:40:29
うちの学校じゃ先生だけソフト麺じゃなくてうどんだった
604デフォルトの名無しさん:2007/02/09(金) 10:00:44
質問ですnew演算子による動的確保の意味を教えてください
ぶっちゃけ静的確保でもいいんじゃないですか?
605デフォルトの名無しさん:2007/02/09(金) 10:17:24
>>604
サイズが決まらないとメモリの確保はできないわけだが、
サイズが動的に決まることもあり、そんなときは静的確保は無理。
606デフォルトの名無しさん:2007/02/09(金) 10:53:34
余分にサイズ確保しとけばいいんじゃないですか?
607デフォルトの名無しさん:2007/02/09(金) 11:05:32
例えばペイントソフトを作ろうとしたとき、
・1pxあたり3Bytes
・キャンバスのサイズは1x1から65536x65536まで可変。

32x32のアイコン作るときも12GBもメモリ使うとか泣けてくるだろう。
だから予め余分に、なんて甘い考えは捨てろWindows世代め。
608デフォルトの名無しさん:2007/02/09(金) 11:10:17
キャンバスのサイズ固定しとけば良いんじゃないですか?
609デフォルトの名無しさん:2007/02/09(金) 11:13:50
ペイントソフト以外にほぼ活用がないということですか?
610デフォルトの名無しさん:2007/02/09(金) 11:14:13
( ゚д゚)ポカーン
611デフォルトの名無しさん:2007/02/09(金) 11:24:46
>>608は僕ではありません
つまり可変でなおかつ大きい領域をとるかもしれないという
状況の場合以外にはnewの意味はないということですか?
612デフォルトの名無しさん:2007/02/09(金) 11:27:47
変数の生存区間がブロック内で終わってしまうと困るとき
613デフォルトの名無しさん:2007/02/09(金) 11:28:56
意図的にメモリリーク発生させたいとき
614デフォルトの名無しさん:2007/02/09(金) 11:31:45
最後のほうにdeleteなんたらって書いてあるとき
615デフォルトの名無しさん:2007/02/09(金) 11:32:29
newが何らかの形でオーバーロードしてあって、その機能を使いたいとき。
616デフォルトの名無しさん:2007/02/09(金) 11:34:36
どの位余分にとかそんな話じゃなくて、本当に素でどれくらい確保すれば良いか分からないとき
仕様が決まってないとき
617デフォルトの名無しさん:2007/02/09(金) 12:25:41
C++BuilderでTObject派生クラス使う時(Delphiのクラス仕様の関係で静的確保しようとするとコンパイルエラー)
618デフォルトの名無しさん:2007/02/09(金) 12:41:40
悲しいとき
619デフォルトの名無しさん:2007/02/09(金) 13:10:44
ポリモルタンと戯れたいとき
620デフォルトの名無しさん:2007/02/09(金) 13:36:16
どこの掲示板に書いたら良いか分からないんですけど、programing langu
age C++言語はどこにエディタがあるんでしょうか あとプリコンパイルを
しないと実行できないと聞きましたが、それはどういう事でしょうか
621デフォルトの名無しさん:2007/02/09(金) 13:44:37
エスパー!エスパー!
622デフォルトの名無しさん:2007/02/09(金) 13:48:33
そういうことして楽しいと思ってるの?
623デフォルトの名無しさん:2007/02/09(金) 13:55:17
これはひどい
624デフォルトの名無しさん:2007/02/09(金) 15:42:50
>>620
昔の本か何かを読んでの質問なら、頼むから最近の本を読んでくれ。
625デフォルトの名無しさん:2007/02/09(金) 16:31:27
同意w
626デフォルトの名無しさん:2007/02/09(金) 18:01:03
>>588
585です。
遅くなりましたが、ありがとうございました。
すごい分かりやすかったです。
627デフォルトの名無しさん:2007/02/09(金) 20:53:57
このスレでいいのかな?
キャッシュに収まらないサイズのバッファ内のビットをシーケンシャルだがとびとびに
操作する。このとき
byteで読んで操作、書き込み/wordで読んで操作、書き込み
どちらが速いですか?
1. どっちかが速い
2. かわらない
3. CPUによる。
とりあえずPowerPC G4なんですが、CPUによって違うならそれも知りたいです。
628デフォルトの名無しさん:2007/02/09(金) 21:04:17
状況による。
提示された情報だけでは判断できない。
629デフォルトの名無しさん:2007/02/09(金) 21:05:20
キャッシュじゃなくてローカルメモリといえば答えてあげる
630デフォルトの名無しさん:2007/02/09(金) 21:12:21
    /\___/\
   /''''''     ''''''::\
   |(●),    、(●)、.|  >>629さん
   |   ,,ノ(、_, )ヽ、,, .:|
   |   `-=ニ=- '  .:::::|
   \  `ニニ´  ._/
   (`ー‐--‐‐―/  ).|´
    |       |  ヽ|
    ゝ ノ     ヽ  ノ
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

    /\___/\
   /''''''     ''''''::\
   |(へ),    、(へ)、.|  ふふ、ローカルメモリ♪
   |   ,,ノ(、_, )ヽ、,, .:|
   |   `-=ニ=- '  .:::::|
   \  `ニニ´  ._/
   (`ー‐--‐‐―/  ).|´
    |       |  ヽ|
    ゝ ノ     ヽ  ノ
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
631627:2007/02/09(金) 21:18:28
状況って? 最近のCPUってややこしすぎてどうすれば速くなるのかさっぱりわからない。
とりあえずエラトステネスの篩やってるだけなんです。
これで状況の要件満たしますか?
632デフォルトの名無しさん:2007/02/09(金) 21:20:07
つ[実測]
633627:2007/02/09(金) 21:29:06
やっぱ実測すか。
失礼しました。
634デフォルトの名無しさん:2007/02/09(金) 21:38:23
>>631
アルゴリズムの速さと、CPUの速さは違うから難しいなあ
確かに
635デフォルトの名無しさん:2007/02/09(金) 21:47:36
関数ポインタ配列にメモリをnewで割り当てたいけど一体newの後にどのように書けばいいかわからねえ。
誰か教えてくれ。
636デフォルトの名無しさん:2007/02/09(金) 21:52:43
typedef int HogeFuncTypePointer(...);
HogeFuncTypePointer *fv = new HogeFuncTypePointer[256];
個人的には
std::vector<HogeFuncTypePointer>の方が好きだけどね
637デフォルトの名無しさん:2007/02/09(金) 21:58:41
CASTしれ、
無名のメモリに役割与えるんだから気にするなよ
638デフォルトの名無しさん:2007/02/09(金) 22:00:49
>>636
std::vectorの方がいいか。わかった。
639デフォルトの名無しさん:2007/02/09(金) 22:10:38
Bitmapを解析するプログラムを作ってるんだが、
構造体を作って、main()内でそこに画像を読み込んで格納しておき、
それと同じ構造体をとある関数内で宣言すると、まったく使用して無いのに
main()内の構造体の中身も壊してしまう。。。

構造体にポインタを使ってるのが関係あるんだろうが、意味がわからん
640デフォルトの名無しさん:2007/02/09(金) 22:11:38
つチラシの裏
641デフォルトの名無しさん:2007/02/09(金) 22:21:49
>>639
で?
642デフォルトの名無しさん:2007/02/09(金) 22:51:52
自動拡張だろw
643デフォルトの名無しさん:2007/02/09(金) 23:12:27
>>639
ん?
644デフォルトの名無しさん:2007/02/09(金) 23:24:49
>>639
独り言はチラシの裏に存分に書いてください
645デフォルトの名無しさん:2007/02/09(金) 23:26:25
空びっとマップファイルヘッダーをダンプ巣りゃいいじゃんか
MSDNでもビットマップファイルフォーマットは定義されてる
死ね
646デフォルトの名無しさん:2007/02/09(金) 23:51:05
これは正しい?
std::string str;
char c = str[0]
647デフォルトの名無しさん:2007/02/09(金) 23:53:49
ウズウズ
648デフォルトの名無しさん:2007/02/09(金) 23:59:03
>>646
セミコロンがないな
649デフォルトの名無しさん:2007/02/10(土) 00:00:26
そこじゃなくて、インデックス 0 にアクセスしてもいいのかってこと。
650デフォルトの名無しさん:2007/02/10(土) 00:08:40
>>649
全く理解できてないから死んで良いよ^^
651デフォルトの名無しさん:2007/02/10(土) 00:11:23
>>646 アウト
652デフォルトの名無しさん:2007/02/10(土) 00:34:22
>>649
strがemptyなのに[0]にアクセスして良いわけが無い。
653デフォルトの名無しさん:2007/02/10(土) 00:38:26
>>646
結果はundefined
654デフォルトの名無しさん:2007/02/10(土) 00:41:55
便乗質問。これは?
std::string str;
const char* ptr = str.c_str();
char c = *ptr;
655デフォルトの名無しさん:2007/02/10(土) 00:45:39
ok
656デフォルトの名無しさん:2007/02/10(土) 00:51:39
>>654
何に不安感じてるのか書け。
コンパイル通るかどうかだったら自分で確認しろ。
657デフォルトの名無しさん:2007/02/10(土) 00:52:18
str.c_str() が NULL を返すんじゃないかと心配。
658デフォルトの名無しさん:2007/02/10(土) 01:01:12
>>657
その心配は無いが、c_str()の返すポインタを
変数に入れて持ち運ぶのは感心できない。
strに何かしらのアクセスがあったとき、
以前に取得したポインタの中身は保障されないはず。
659デフォルトの名無しさん:2007/02/10(土) 01:11:56
だったら
std::string str;
char c = str[0];
も ok な仕様にしてもよかったような気がするが。
660デフォルトの名無しさん:2007/02/10(土) 01:27:21
>>659
c_str()が返す文字列は\0で終わってる保障があるが
strのイテレータが\0で終わってる保障がない。
c_str()が返すのは文字列のポインタ。
[0]が返すのはイテレータの中身。
c_str()のポインタが[0]のアドレスと同じとは限らない。
661デフォルトの名無しさん:2007/02/10(土) 01:50:38
>>660
言葉の意味が微妙だなぁ。

c_str()が返す文字列は\0で終わってる保証があるが
strの内部バッファが\0で終わってる保証はない。
c_str()が返すのはヌル終端文字列の先頭を指すポインタ。
[0]が返すのは内部バッファの1文字目。
c_str()が[0]を指すポインタと同じとは限らない。
662デフォルトの名無しさん:2007/02/10(土) 02:56:22
こういうこと?

class string {
public:
explicit string() : m_str(NULL) {}
...
char &operator[](int index) {
return m_str[index];
}
const char *c_str() const {
return (m_str == NULL ? "" : m_str);
}
...
private:
char *m_str;
};
663デフォルトの名無しさん:2007/02/10(土) 04:49:23
try {
throw "error\n";
}
catch(char * str) {
cout << str;
}
よくある例外のサンプルなんだが、
strが指す文字列ってスコープから外れてるから、
無効なポインタにならん?

664デフォルトの名無しさん:2007/02/10(土) 05:01:13
>>663
その文字列(リテラル)はconst staticなのでプログラムと同じ程度だけ永らえます。
const char * foo() {return "Whee!";} が問題ないのと同じこと。
665デフォルトの名無しさん:2007/02/10(土) 06:39:35
出来上がった実行ファイルをバイナリエディタで見てみろよ
error\nがあるからよ
666デフォルトの名無しさん:2007/02/10(土) 08:09:19
Cの配列は
name=str['name'];
みたいな連想配列として使えませんか?
667デフォルトの名無しさん:2007/02/10(土) 08:24:15
>>666
Cではできません。
C++では、可能です。
668デフォルトの名無しさん:2007/02/10(土) 08:25:21
Cは何でもできるそうなので、きっとできますよ^^
669デフォルトの名無しさん:2007/02/10(土) 09:33:38
それっぽい動作をする関数なら作れるから、それで我慢するしか。
670デフォルトの名無しさん:2007/02/10(土) 10:27:04
C++の構造体とクラスの標準規格上のそういってなんなんでしょうか。
671のってぃー:2007/02/10(土) 10:57:59
テキストファイルから文字列を読み取って、数字だけ取り出したいのですが、
どうすればよいかわかりません。
文字に全角のものと半角のものが混じっている場合です。

08k: 4 → 084
00ヌルポ7 → 007
という風にしたいのですが。教えてくださいm(_ _)m
672デフォルトの名無しさん:2007/02/10(土) 11:02:42
perlだったら連想配列を使うようなケースで、Cの場合、
構造体を使ってる。
連想配列みたくまとめて受け渡しできるうえに、構造体の配列も
できるから、連想配列よりもむしろ便利だと感じる。
673デフォルトの名無しさん:2007/02/10(土) 11:36:30
>>670
> 9 Classes
> A structure is a class defined with the class-key struct; its members and base classes are public by default.
674デフォルトの名無しさん:2007/02/10(土) 11:45:06
>>671
FILE *fp;
char buf[MAXBUF];
int ch;
fp = fopen("unko.txt", "r");

char atb[10]={'0','1','2','3','4','5','6','7','8','9'};
for(int i=0; feof( fp ) == 0 ; i++ )
{

ch=fgetc(fp);

for(int w=0;w<10;w++){

/*数字であるか判断する*/
if(atb[w]!=ch){
buf[i] = (char)ch;
break;
}
}
}


動作チェックしてないから後は適当にいじってください
675デフォルトの名無しさん:2007/02/10(土) 11:46:13
>>671
isleadbyte, isdigitと全角数字のテーブル使って頑張る。
676デフォルトの名無しさん:2007/02/10(土) 11:46:38
if(atb[w]==ch)

だったか
677デフォルトの名無しさん:2007/02/10(土) 12:17:51
>>671
>>674を参考にして作ってみたサンプル

#include <stdio.h>
#include <string.h>

int main( int argc, char *argv[] )
{
int i, j;
char buf[3] = { 0 };
char watb[10][3]={ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
FILE *fp;

if( ( argc < 2 ) || ( ( fp = fopen( argv[1], "r") ) == NULL ) )
return 1;

for(i=0; feof(fp) == 0; i++)
{
buf[1] = fgetc( fp );

if( buf[1] == 10 )
printf( "\n" );
else
for(j=0; j < 10; j++)
if( ( buf[1] == '0' + j ) || ( strcmp( buf, watb[j] ) == 0 ) )
printf( "%d", j );

buf[0] = buf[1];
}

return 0;
}
678デフォルトの名無しさん:2007/02/10(土) 12:51:29
>>677自己レス
for(i=0; feof(fp) == 0; i++)

while( feof(fp) == 0 )
で十分で
i は他に使ってなかったな・・・
679デフォルトの名無しさん:2007/02/10(土) 12:55:13
Borland C++ 5.5.1 for Win32でコンパイル時に
インクルードファイル 'sys/socket.h' をオープンできない
ってエラーが出ます。
どうしたら良いですか?

単純に、どっかからsocket.hを拾ってきて、sysに入れたんじゃ解決しないですよね?
680デフォルトの名無しさん:2007/02/10(土) 13:09:34
VC6ですCtrl + Fで検索ダイアログを開いた時過去に検索した文字が出せますが
便利ですが間違えた検索単語を間違えたときの文字も残っています
一度まっさらにするにはどうしたら良いですか?
681デフォルトの名無しさん:2007/02/10(土) 13:18:09
>>680
スレ違い
682デフォルトの名無しさん:2007/02/10(土) 13:56:04
C/C++関係ありません

氏ね
683デフォルトの名無しさん:2007/02/10(土) 18:19:34
参照とポインタはどう使い分けるべきなんでしょか。
684デフォルトの名無しさん:2007/02/10(土) 18:34:43
1〜9999までの乱数を発生させたいのですが
今は↓で乱数を発生させています
srand( (unsigned)time( NULL ) );//乱数生成
int aaa=rand() % 99999 + 1;

もう少し良い方法があれば教えてください
685デフォルトの名無しさん:2007/02/10(土) 18:35:05
>>683
参照→既にある変数を指す
ポインタ→動的に割り当てられたメモリや配列を指す
 (メモリブロックである事を明示したい時のみ)

ただし実装の制約や効率上必要な時はまた別。
それ以外のCでポインタを使う場面のほとんどは、C++では
参照・イテレータ・スマートポインタのいずれかで代用できると思う。
どれに置き換えるかは迷う事はないだろう。
686デフォルトの名無しさん:2007/02/10(土) 18:35:25
>>683
NULLを扱う必要があったり、外部の関数とのI/Fで必要だったりしない限り、参照で。
#constじゃない参照を引き数にするのは嫌う人もいるので共同作業の場合は要注意。
687デフォルトの名無しさん:2007/02/10(土) 18:38:00
>>684
剰余を取ると若干偏りがでるが、それが問題にならないならその方法でいいんじゃない?
まさかとは思うが、srand()はrand()呼び出しごとに呼んでないだろうね。
#「もう少し良い」をどう解釈かで答えが変わりそうだが……
688デフォルトの名無しさん:2007/02/10(土) 18:45:47
srand( (unsigned)time( NULL ) );
はその乱数を取得する関数の先頭に配置してあるのですが

ソースファイルのはじめのほうで1回呼ぶだけのほうがいいですか?
689デフォルトの名無しさん:2007/02/10(土) 18:53:50
毎回呼ぶ意味が無い
690デフォルトの名無しさん:2007/02/10(土) 19:09:09
>>688
timeの返り血が変わらない間にもう一回呼ぶとrandで同じ血が返ることになるが。
691デフォルトの名無しさん:2007/02/10(土) 19:21:26
>>690
素朴な疑問だが、あんたは値を常に「ち」と読んでいるのか?
692デフォルトの名無しさん:2007/02/10(土) 19:27:25
だって一人称があたいだから
693デフォルトの名無しさん:2007/02/10(土) 19:38:33
帰りね(なぜか変換できない)
694デフォルトの名無しさん:2007/02/10(土) 19:57:09
戻りね
もどりね
なぜか変換できない(ATOK2007)
695デフォルトの名無しさん:2007/02/10(土) 19:59:11
ゆりね
696デフォルトの名無しさん:2007/02/10(土) 20:01:53
もどりち の検索結果のうち 日本語のページ 約 139,000 件中 1 - 10 件目 (0.26 秒)
もどりね の検索結果のうち 日本語のページ 約 419,000 件中 1 - 10 件目 (0.33 秒)
もどりあたい の検索結果のうち 日本語のページ 約 1,000 件中 1 - 10 件目 (0.36 秒)
697デフォルトの名無しさん:2007/02/10(土) 20:11:11
>>691
かえりちで良いんじゃない。
なんか、エキサイティングでエレクトリックでスペクタルな
すぺるまーって来そうな読み方じゃない?
698デフォルトの名無しさん:2007/02/10(土) 20:12:06
戻り... 

いやなんでもない
699デフォルトの名無しさん:2007/02/10(土) 20:26:36
>>679
WinSock使う
700デフォルトの名無しさん:2007/02/10(土) 21:00:02
>>686
これは非constな用途の場合で、参照でもポインタでもかまわない設計のときは
ポインタを渡す用に設計する、ってのが慣習化してる人(環境)もいるってこと?
701デフォルトの名無しさん:2007/02/10(土) 21:01:15
なんか日本語でおkな文になっちまったorz 意図は酌んでクダサイ
702デフォルトの名無しさん:2007/02/10(土) 21:11:58
メソッド引数なら、できるだけ参照使う方がいいと思う。
クラスメンバで参照にすると、初期化の強制で
困ることもあるかもしれない。
703デフォルトの名無しさん:2007/02/10(土) 21:41:18
>>700
Cの流儀をそのまま持ち込んでいる人とか、APIと合わせている人とか、
そもそも非const参照は気持ち悪いと言い張る人とか、人それぞれですから。
704デフォルトの名無しさん:2007/02/10(土) 21:51:04
>>702-703
結局、居ることは居るけど、特に一般的な慣習があるわけではないってことですね
レスサンクス
705デフォルトの名無しさん:2007/02/10(土) 22:55:55
メンバー関数のあるクラスや構造体をmemcpyすることについての
質問です。

struct hoge{
int a;
bool Test(){return true;}
};
↑このようなメンバー関数が存在するクラスや構造体(仮想関数とかは存在しない)を
hoge a,b;
b.a = 100;
と宣言して、↓みたいにmemcpyするのは大丈夫なんでしょうか。
(実験してみたけど、問題なかった)
memcpy((void*)&a, (void*)&b, sizeof(hoge));

http://forums.belution.com/ja/cpp/000/042/08s.shtml
同じ内容の質問と回答のログが、このサイトにあり、
メンバー関数があると駄目という意見がありましたが、
自分の実験では問題がなく、はっきりしないので
ここで質問させていただきます。
よろしくお願いします。
706デフォルトの名無しさん:2007/02/10(土) 23:23:59
要は構造体がPODかどうかって話でそ。
707デフォルトの名無しさん:2007/02/10(土) 23:26:04
>>705
規格上の話なら多分、ダメ。
メモリ上に実際どのようになイメージでそのクラスや構造体が展開されるのか
ちゃんと自分で理解できてる時以外はやるな。理解できてるんだったら逆に
仮想関数や動的に確保されるメンバなんかがあっても問題が起きないように
(memcpyで一発とは限らないけど)コピーすることはできる。
708デフォルトの名無しさん:2007/02/10(土) 23:31:06
だいたいの感触として、問題になるのはクラスの意味上の破綻
(典型的には、ポインタとかリソースとかの所有権のお話)だから、
そこを押さえれば、同じ型同士ならmemcpyしても問題ないはず。
709デフォルトの名無しさん:2007/02/10(土) 23:52:38
素朴な疑問なんだが、なんでhoge a = b;にしないんだ?
710デフォルトの名無しさん:2007/02/11(日) 01:21:59
>>706-708
回答ありがとうございます。
自分の開発環境では大丈夫だったけど、
やはり、開発環境によっては不具合が生じる
かもしれないので、memcpyは使わない方が無難みたいですね。

>>709
ちょっと、気になったので質問してみました。
普段は、それを使っています。
711デフォルトの名無しさん:2007/02/11(日) 08:45:28
プリプロセッサ命令で、コンパイラにトークンをスタックかキューか配列みたいなものに入れておいて、
別のプリプロセッサ命令でそのトークンを取り出して使用、見たいな事ってできませんか?
以下妄想。

//トークン プッシュ ポップなど
t_push() t_pop() t_empry()

//メンバ
#define write(BOO) push(n) int BOO; inline const int&get_##BOO(){return BOO;} inline void set_##BOO(int n){BOO=n;}
write(name)
write(weight)
write(height)
:

//コンストラクタ
ctor(){
//プリプロセッサで、メンバ name weight height に0を入れたい。
}
712デフォルトの名無しさん:2007/02/11(日) 09:28:39
分かりにくい説明だなオイ。
push(n)ってなんだよ。t_push(BOO)って書きたかったんじゃないのか?

つまり、writeマクロが使われる度、writeに渡された引数をどこかに保存して、
あとから、その値を他のマクロから使いたい…ってことだよな?
残念だが、そりゃ無料だ。
713デフォルトの名無しさん:2007/02/11(日) 09:29:55
無料ってなんだ。無理の間違い。
714デフォルトの名無しさん:2007/02/11(日) 10:09:11
>>711
Boost.Preprocessor
715デフォルトの名無しさん:2007/02/11(日) 14:57:43
親ウィンドウの外に画像を描写するにはどうすればいいですか?
理想的な形としては子ウィンドウを親ウィンドウの外に表示してそこに画像を描写したいんですが。
716デフォルトの名無しさん:2007/02/11(日) 15:11:12
>>715
WindowsのMDIアプリケーションと仮定してWS_EX_TOOLWINDOW
それ以外だとVCLみたいに不可視な親ウィンドウ作ってその子としてMDIと画像書き出すウィンドウ作る方法も
717デフォルトの名無しさん:2007/02/11(日) 15:40:32
>>716
透過でやってみようと思います。ありがとうございました。
718sage:2007/02/11(日) 16:58:01
C言語での質問です。
stdinから特定のcharを除いたストリングをを(char*)bufferに読み込みたいのですが、
...
char buffer[100];
scanf("%99[^() \n\t]", buffer);
...
というやりかたしか思いつきません。ですが、この方法だと読み込めるcharの数に上限がついてしまいます。このような上限を無しにbufferにstdinを読み込むには、どうすればいいでしょうか?
よろしくお願いします。
719sage:2007/02/11(日) 17:14:19
C言語での質問です。
stdinから特定のcharを除いたストリングをを(char*)bufferに読み込みたいのですが、
...
char buffer[100];
scanf("%99[^() \n\t]", buffer);
...
というやりかたしか思いつきません。ですが、この方法だと読み込めるcharの数に上限がついてしまいます。このような上限を無しにbufferにstdinを読み込むには、どうすればいいでしょうか?
よろしくお願いします。
720デフォルトの名無しさん:2007/02/11(日) 17:21:47
fgetcでぐるぐる回せばいいじゃん。
バッファはreallocで用意してさ。
721デフォルトの名無しさん:2007/02/11(日) 17:49:29
たびたびスレ汚しすみません。
>>720
早速レスありがとうございます。
int fgetc(FILE *stream)となってますが、intはcharにキャストしてもいいのでしょうか?
あと、reallocを使うのが少し怖いです。w
例えば、bufferをストリング、buflenをbufferの長さとした場合、
realloc(buffer, (buflen*2))
としても、メモリにスペースが足りたかどうかによって、bufferの値が変わってるかどうか分からないんですよね?
reallocを使ってのバファの用意の仕方についてもう少し詳しく説明して頂けるととてもありがたいです。
よろしくお願いします。
722デフォルトの名無しさん:2007/02/11(日) 18:58:16
>>721

char buffer, tmp;
buffer = (char *)malloc(buflen);
tmp = (char *)realloc(buffer, buflen *= 2);
if(tmp == NULL) free(buffer), abort();
buffer = tmp;
723デフォルトの名無しさん:2007/02/11(日) 18:59:02
X char buffer, tmp;
O char *buffer, *tmp;
724デフォルトの名無しさん:2007/02/11(日) 19:00:29
というか、malloc/freeは要らないだろ。
全部reallocですませることは出来る
725デフォルトの名無しさん:2007/02/11(日) 19:04:48
タイプ免土井
726721:2007/02/11(日) 21:55:59
ご回答どうもありがとうございました。
大変助かりました。
727デフォルトの名無しさん:2007/02/12(月) 00:25:24
: error C2664: ' ' : 1 番目の引数を 'char [80]' から 'LPWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。

このエラーはUNICODE型になってるのが原因でマルチバイト文字セットを使用するとコンパイルが通ることがわかったんですが
参考にした本が使用してる開発環境はVisual C++ 6.0を使用
自分の開発環境はVisual C++ 2005 Express Edition
これはUNICODEがまだ使用されていなかったときに6.0が作られてそのときのプログラムはUNICODEに未対応
現在はコンパイルを基本UNICODEで行っておりコンパイルエラーになると言う認識であってますか?
いまいち原因がよくわからなかったのでその部分教えてください
よろしくお願いします
728デフォルトの名無しさん:2007/02/12(月) 00:32:13
C++スレの住人はやさしい
これがPythonスレだったら放置どころか100レス叩きにはいるから
小丸。
729デフォルトの名無しさん:2007/02/12(月) 02:13:16
ごめんね、C++スレ住民でもありPythonスレ住民なんだ。
730デフォルトの名無しさん:2007/02/12(月) 04:04:26
>>727
これがコンパイルエラーになることが理解できれば、そのエラーも理解できるはず。
int * int_ptr ;
short * short_ptr = &int_ptr ;

LPWSTRはこんな感じ。
typedef LPWSTR wchar_t * ;

Windows NTは、文字はすべてUnicodeで処理している。
ANSI版のAPIは単なるラッパ。
731デフォルトの名無しさん:2007/02/12(月) 09:07:04
なんだよその積分記号w
732デフォルトの名無しさん:2007/02/12(月) 10:53:20
???
733デフォルトの名無しさん:2007/02/12(月) 11:43:28
エディットコントロールでエンターが押されたことを知りたいんですけど
どうしたらいいでしょうか?
734デフォルトの名無しさん:2007/02/12(月) 13:13:06
Spy++を起動して、エディットコントロールでエンターを押してみるといいと思います。
735デフォルトの名無しさん:2007/02/12(月) 13:19:36
>>731
Janeとかが&intを勝手に積分記号に変換してるだけだと思う
IEとかで見てみるといい
736デフォルトの名無しさん:2007/02/12(月) 14:11:52
Janeのバグか
737デフォルトの名無しさん:2007/02/12(月) 14:20:24
nida 使ってるんじゃねーの
styleはそんな事はないぞ
738デフォルトの名無しさん:2007/02/12(月) 14:21:01
Viewは化けてる
739デフォルトの名無しさん:2007/02/12(月) 14:33:09
OpenJaneDoeは問題なし
740デフォルトの名無しさん:2007/02/12(月) 15:41:20
JaneDoeStyle問題なし
741デフォルトの名無しさん:2007/02/12(月) 15:53:38
2ちゃんねるブラウザ「JaneView」 Part46
http://pc10.2ch.net/test/read.cgi/win/1171009388/61

61 名前:名無し~3.EXE[sage] 投稿日:2007/02/12(月) 15:41:40 ID:CGqu/Enb
>>60
「&int」が「∫」になるのは誤解釈でもなんでもないぞ。
実態参照、数値文字参照は末尾の;を省略出来るのが元からの仕様だから。

問題は&int_ptrのような表記が部分的に実態参照として解釈されてしまうこと。
問題点は正確に書きましょう。
742デフォルトの名無しさん:2007/02/12(月) 16:38:24
IEエンジンの仕様だな。
std::cout<<"foober";
743デフォルトの名無しさん:2007/02/12(月) 17:13:42
>>741
仕様的には、いちいち書き込む側が&を&amp;って書き込まにゃならんってことかよ。
744デフォルトの名無しさん:2007/02/12(月) 17:30:39
なんで省略可能な仕様にしたんだか
745デフォルトの名無しさん:2007/02/12(月) 18:51:01
>>735-740
JaneDoe View αだべ
なるほどたしかにインテグラルだし、そういうことだったか
746730:2007/02/12(月) 18:54:46
JaneDoeStyle使っているから、全然気づかなかった。
Operaでみても、アンパサンドとintで表示される。
なんだか嫌な仕様だ。
747デフォルトの名無しさん:2007/02/12(月) 18:58:34
まあ Jane "View" ってんだから、仕様としては納得できるし、
試してないけどそれくらいオプションで切れるんじゃね?
748730:2007/02/12(月) 19:12:28
あとすまん、
short * short_ptr = int_ptr ;

だった。
とりあえず積分記号の問題は解決。
749デフォルトの名無しさん:2007/02/12(月) 21:38:54
ギコナビでは書き込み時に&を&に置き換える機能があるぞ。Juneにはないのか?
750デフォルトの名無しさん:2007/02/12(月) 22:00:53
Juneは知らないな
てかその変換はむしろ鯖側スクリプトの仕事じゃね?
751デフォルトの名無しさん:2007/02/12(月) 22:09:53
>>750
そうすると、実体参照が使えなくなるだろ。
752デフォルトの名無しさん:2007/02/12(月) 22:13:19
は?
753デフォルトの名無しさん:2007/02/12(月) 22:22:52
ん?
754デフォルトの名無しさん:2007/02/12(月) 22:47:53
>>750
まずは"June"に突っ込むところなんじゃないのか?
755デフォルトの名無しさん:2007/02/12(月) 22:50:12
そのつもりでJuneは知らないって言ったんだけどな
756デフォルトの名無しさん:2007/02/12(月) 22:59:44
>>755
そいつは無粋なことしてすまんかった
757デフォルトの名無しさん:2007/02/13(火) 01:19:51
ひろゆきが<と>のエスケープしか考えていなかったからずっとそのまんま
758デフォルトの名無しさん:2007/02/13(火) 08:02:49
「フォームを受け取る側では & はエスケープせずにそのまま通すべし」
ってガイドラインがどこかにあった気がしたがどこにあったか忘れた

まあ実体参照の表記が正しいかどうかのチェックくらいはした方がいいだろうな
759デフォルトの名無しさん:2007/02/13(火) 08:06:43
&int
760デフォルトの名無しさん:2007/02/13(火) 08:09:57
int hage
int &lt(hage);
int &gt(lt);
gt = &lt;

まずhtmlが書けないと駄目らしいのか・・・ふむ。
761女の子:2007/02/13(火) 08:33:46
ちんこ揉んでたらおっきくなっちゃったんですけど
どうしたらいいですか?
762デフォルトの名無しさん:2007/02/13(火) 08:52:37
>>760
実体参照がかければhtmlは書けなくてもいいと思うのだが。
763デフォルトの名無しさん:2007/02/13(火) 16:39:07
このスレを見ている人はこんなスレも見ています。(ver 0.20)
JR東日本 社会人採用対策スレッド 2006 Part6 [転職]
764デフォルトの名無しさん:2007/02/13(火) 17:42:35
zlibを使ってZIP圧縮ファイルを生成したいのですが、
gzipファイルは検索から生成方法が分かりましたが、ZIPファイルの生成方法が分かりません。どうもzlibだけではZIPファイルは生成できないようです。
どうすればZIPファイルを生成できますか?
zlibは静的にリンクして、WinとLinuxで利用するつもりです。
765デフォルトの名無しさん:2007/02/13(火) 17:47:55
>>764
zlibのソースのcontribにminizipっつーのがあるから
それをパクれ
766デフォルトの名無しさん:2007/02/13(火) 18:03:37
>>761
急いで口で吸え
767デフォルトの名無しさん:2007/02/13(火) 19:03:38
<>
768デフォルトの名無しさん:2007/02/13(火) 19:08:27
C++ の std::cin を使用して
C言語で scanf("%[^,]", buffer); と書くのと等価にするには
どのように書けばよいのでしょうか?

書式指定の方法がわからなくて困っています
769デフォルトの名無しさん:2007/02/13(火) 19:57:47
std::cin.get(buffer, bufsize, ',');
770デフォルトの名無しさん:2007/02/13(火) 20:29:45

質問があります。

MMORPGなどで、ゲームサーバからデータを受信する際に
TCPを利用しているようなのですが、このデータをフックするには
どうしたらよいでしょうか。

抽象的な質問ですみません。
方向性や、詳しいWebサイト等を
教えていただけるとありがたいです。

ちなみに開発環境は.net 2003 VC/VC++,です
771768:2007/02/13(火) 20:52:17
>>769
ありがとうございました。


カンマ区切りのデータを一つずつ読みこみ、
すべて表示するにはこれより良い方法は無いでしょうか?
#include<iostream>

int main(void){
  char buf[100];

  std::cin.clear();
  while(!std::cin.eof()){
    std::cin.get(buf, sizeof(buf), ',');
    if(std::cin.fail()){
      std::cin.clear();
      std::cin.get();
      if(std::cin.fail())
        break;
      continue;
    }
    std::cout << buf << std::endl;
  }
  return 0;
}
772デフォルトの名無しさん:2007/02/13(火) 21:08:20
>>765
ありがとうございます。
minizip.cをコンパイルできました。
しかし、リンクでエラーが出てしまいました。_mainに_zipOpen2がないなど、シンボルが解決できないのエラーでした。
もう少し悩んでみます。
773デフォルトの名無しさん:2007/02/13(火) 21:22:03
>>771
↓これで十分じゃね?
#include <iostream>
int main(void) {
  char buf[100];
  while(std::cin.get(buf, sizeof(buf), ',')) {
    std::cin.ignore();
    std::cout << buf << std::endl;
  }
  return 0;
}
774768:2007/02/13(火) 21:32:03
>>773
ありがとうございます。
随分とコードがすっきりしました。

ところで、マニュアルを見る限り std::cin.get(buf, sizeof(buf), ',') の返り値は
std::cin の参照になるみたいですが、EOF に到達すると NULL (0) が返るのは
C++ の規格で決められているのでしょうか?
775デフォルトの名無しさん:2007/02/13(火) 21:37:05
ていうかgetlineで良くね?
  while(std::cin.getline(buf, sizeof(buf), ',')) { 
    std::cout << buf << std::endl; 
  } 
776デフォルトの名無しさん:2007/02/13(火) 21:38:30
cin(というか、i/ostream系列の)オブジェクト自体、
オペレーターオーバーライドが定義されていてif文に突っ込める
777デフォルトの名無しさん:2007/02/13(火) 21:42:47
>>774
参照でヌルが返るってのはありえない。
while の条件式に置かれているので cin への参照に対して
メンバ関数 operator void* () が呼び出される。
operator void* () は fail() が真のときヌルを返すので、
条件としては偽になる。
778768:2007/02/13(火) 21:43:43
>>775
目的にぴったりです。
最初から比べると見違えました。


皆さんありがとうございました。
779デフォルトの名無しさん:2007/02/13(火) 21:43:55
>>775
関数名の "line" がちょっとキモイけど、それが一番いいね。
780768:2007/02/13(火) 21:46:44
>>776-777
了解しました。
>>775 でばっちりですね。

ありがとうございました。
781デフォルトの名無しさん:2007/02/13(火) 21:50:26
>>776
× オペレーターオーバーライド
○ オペレーターオーバーロード

あと operator void* () は「変換関数」ね。
オペレーター関数のオーバーロードとは
呼び方が違う。
782デフォルトの名無しさん:2007/02/13(火) 21:59:40
エレベータとエスカレータがときどきごっちゃになるねん
783デフォルトの名無しさん:2007/02/14(水) 00:38:00
分かってるねん
分かってるねんで?箱状のものがエスカレーター
それがごっちゃに・・・
784デフォルトの名無しさん:2007/02/14(水) 00:42:18
つ、ついだよ! わざとだよ!
785デフォルトの名無しさん:2007/02/14(水) 00:43:35
どっちなんだよ
786デフォルトの名無しさん:2007/02/14(水) 01:24:40
>>782
オペレータは、機能を上書きするからオーバーロード。
関数は、機能を追加するからオーバーライド。
箱は持ち上がるからエレベータ。
階段はずれ上がるからエスカレータ。
787デフォルトの名無しさん:2007/02/14(水) 01:46:48
>>786
説明が間違っている件について
788デフォルトの名無しさん:2007/02/14(水) 01:47:41
>>782
わかってるねん
わかってるねんで?

箱状のものが
エスカレーター
789デフォルトの名無しさん:2007/02/14(水) 02:26:02
>>770
hogehogepoo://ruffnex.oc.to/kenji/text/fire_a/

770が犯罪起こしたら俺も捕まるの?
俺は「770は俺の提供した情報で犯罪は起こすか分からない」という認識なんだが。
790デフォルトの名無しさん:2007/02/14(水) 02:33:32
次はパケットを復号する方法教えてくださいってくるからやめとけ
791デフォルトの名無しさん:2007/02/14(水) 03:52:06
なんとかかんとか幇助
792デフォルトの名無しさん:2007/02/14(水) 03:52:44
ほうすけ
793デフォルトの名無しさん:2007/02/14(水) 09:19:32
newのオーバーライドについて質問です。

class CHoge
{
//省略.

void* operator new(size_t t);
void* operator new[](size_t t);
}

とオーバーライドした場合、CHoge「を」生成するnewについてオーバーライドできると思いますが
CHoge「のメンバー関数で使っているnew」についてオーバーライドすることはできませんでしょうか?
794デフォルトの名無しさん:2007/02/14(水) 09:47:44
グローバルoperator newをオーバーロードすれば出来るかも知れん。薦めにくいけど。

自前メモリアロケータ+placement newで代用するのがいいと思う。
SomeClass* ptr = myAlloc(sizeof(SomeClass));
new (ptr) SomeClass();
みたいな感じで。
795デフォルトの名無しさん:2007/02/14(水) 10:14:32
特定の文字で区切るspit関数勉強しました。
ある文字列があって、特定の文字列が出てきたら削除っていう
関数を教えてください。
std::string del_char(std::string&,std::string&);

参照とかあいまいなので、ちょっと、どっちがいいのかわからないですが。

std::string del_char("hoggehogge","gg"){

}
としたらhoggehoggeのggを削除して、
hoehoeを返すようにしたいです。
よろしくお願いします。
796デフォルトの名無しさん:2007/02/14(水) 10:16:22
>>794
お返事ありがとうございます。
やはりグローバルしかないですか…。

グローバルnewはオーバーライドしたくないですね。placementの利用を検討してみます。
797デフォルトの名無しさん:2007/02/14(水) 11:45:17
ソースファイルは分割したほうがいいですか?
今のとこ5000行ぐらいなんですけどクラスヘッダファイルとクラスソースファイル
一つずつにしています何行ぐらいで分割するものですか?
798デフォルトの名無しさん:2007/02/14(水) 12:28:20
そんなでかいクラスは今すぐ捨てろ
799デフォルトの名無しさん:2007/02/14(水) 12:40:12
必要に感じたら分割すればいいじゃない
800デフォルトの名無しさん:2007/02/14(水) 12:49:45
値渡しより参照渡しの方が実行速度は速いのでしょうか?
801デフォルトの名無しさん:2007/02/14(水) 12:56:09
VC++でinet_atonで識別子が見つかりませんエラーが出ます。
#include <winsock2.h>#include <ws2tcpip.h>しています。
inet_ntoa,getaddrinfoなど、他の関数は使えています。
思い当たる節があれば教えてください。

>>797
行数で分割しない!
独立(オブジェクト指向)と機能集中(アジャイル指向)だ
ってアジャコングがゆってた
802デフォルトの名無しさん:2007/02/14(水) 14:30:58
>>800
ケースバイケース
803デフォルトの名無しさん:2007/02/14(水) 14:44:30
>>801
WinSock(2) には inet_aton は無い
804デフォルトの名無しさん:2007/02/14(水) 14:57:40
Winsockはgetaddrinfo()は取り入れてるけどinet_aton()が無かったり
inet_pton()やinet_ntop()が無かったり
なかなか意味不明だな
805デフォルトの名無しさん:2007/02/14(水) 15:24:50
ttp://www.cppll.jp/cppreference/
参考にしていたサイトが消えてしまったのですが、どこかにログが残っているか知りませんか?
robots.txtのためGoogleやweb.archive.orgにはありませんでした…
806デフォルトの名無しさん:2007/02/14(水) 15:40:44
>>803-804
まさか一方はあるのに、逆にあたる関数がないとは……。
無いのがわかってすっきりしました。ありがとうございます。

>>800
一々配列全部をコピーするよりポインタ1コ使ったほうが軽くて早いよ、と
俺も2年前意味不明なポインタの使い方をしてた気がするなあ
807デフォルトの名無しさん:2007/02/14(水) 15:41:57
質問です。
newをオーバーライドして遊んでいたところ、テンプレートと重なるとおかしなことになるのに気づきました。

デストラクタが存在するクラスの配列を new[] すると、本来より4バイト多くなるのはわかります。
operator new 側でreturnしたものに+4バイト移動したポインタが実際に返るのもわかります。

この状態ならば、

CHoge* p;
p = new CHoge [5];
delete [] p;

上のp==0xXXXXXX16;とした場合、operator delete[](void *p)のpには0xXXXXXX12が代入されるのが期待できますし、普段はそうなります。
ただ、以下のようにした場合におかしくなるのです。

template <class T>
class CTest
{
public:
T* m_p;
void run()
{
m_p = new T [5];
delete [] m_p;
}
};
こうした場合にoperator delete[](void *p)のpには0xXXXXXX16が代入されてしまいます。
(TがCHogeの場合に。です)

当然new[]でmalloc. delete[]でfreeしている場合、freeでエラーが出てしまいます。
VC6.0のデバッグモードで見ても、きちんとTはCHogeになっています。
これの解決方法はありますでしょうか?
808デフォルトの名無しさん:2007/02/14(水) 15:42:27
>>806
inet_addr()で我慢汁。
255.255.255.255とエラーが区別できないという問題があるけどな。
809デフォルトの名無しさん:2007/02/14(水) 15:57:34
>>807
すいません。807はコンパイラのせいかもしれません。
Win32アプリケーションで同様のものを作ったところ、正しい動作をしました。
質問はスルーでお願いします。
810デフォルトの名無しさん:2007/02/14(水) 19:32:06
Windows + VS2005です。
fopenしたものをロック(排他処理)しようと思っています。
_locking関数を使えばよいというのは分かりましたが、ファイルディスクリプタを渡さなければならない、しかもロックするサイズも指定しなければならないそうなので、
_locking(hogefile->fd, 方式, 64);
これで良いのですか?Linux + gccの
ftrylockfile(hogefile);
と同等になる処理を行いたいです。
811デフォルトの名無しさん:2007/02/14(水) 19:38:04
hogefile->fd
ってなんだ。
_fileno(hogefile)
だろ。
812デフォルトの名無しさん:2007/02/14(水) 21:49:49
すいません、該当スレが見つからなかったのでここで・・・
主に音響処理などに使うDSPが積和演算に特化したチップだと言う事は分かったのですが、
同様のリアルタイム処理はパソコンでもできるでしょうか?
やりたいことは入力音を16bit分解能、44kHzくらいでフーリエ展開して加減乗除を4ステップほど実行して、
逆フーリエして出力って感じなんですが・・・メディアプレイヤーにもエフェクトいくつかあるしこうした処理は
PC上のプログラムでも余裕でできるものでしょうか?
813デフォルトの名無しさん:2007/02/14(水) 21:50:46
すいません、上げてしまいましたorz
814デフォルトの名無しさん:2007/02/14(水) 22:00:55
おまえら教えてください。
EUC-JPからShift-JISに変換するライブラリを探しているんですが、
IBMのICUはフリーなんでしょうか?
他にライブラリをご存知の方いられましたら教えてやって下さい。
815814:2007/02/14(水) 22:06:08
自己解決しました。
検索してたらICUはフリーの文字コード処理ライブラリとしては
文句なしに最高峰のものだそうです。
ラクガキ失礼いたしました。
816デフォルトの名無しさん:2007/02/14(水) 23:15:42
>>812
フーリエ展開をリアルタイムでやるのって、そもそも矛盾してないですか?
817デフォルトの名無しさん:2007/02/14(水) 23:24:58
短時間フーリエ変換だろ?
818デフォルトの名無しさん:2007/02/15(木) 01:13:40
>>812
画像でリアルタイム(30fps)でフーリエ変換処理を行なえるだけの能力が今のCPUにはある。
#XeonとかCore2とかね。
音でもそのくらいの処理ならリアルタイムでできるだろ。
819デフォルトの名無しさん:2007/02/15(木) 01:22:54
質問なのですが、
typename Foo::template Bar<Baz>
みたいな書き方ってどういう意味ですか?
どんな時に使えるのですか?
820デフォルトの名無しさん:2007/02/15(木) 01:47:18
>>819
テンプレート内で、テンプレート引数に依存するクラス Foo があるとき、
Foo 内のネスとされたクラステンプレート Bar を Baz を引数として実体化した
クラス型。

Foo がテンプレート引数に依存する場合、 typename や template を挟まないと
そのメンバの意味が確定しないので、こういう書き方が必要になる。
821デフォルトの名無しさん:2007/02/15(木) 10:38:33
>>818
最近のPCってDAコンバータしか音響用のチップ載ってないはず。
822デフォルトの名無しさん:2007/02/15(木) 11:00:27
全然関係ない
823デフォルトの名無しさん:2007/02/15(木) 11:16:39
CPU使用率を節約する方法を教えてください
824デフォルトの名無しさん:2007/02/15(木) 11:33:14
電源を引っこ抜く
825デフォルトの名無しさん:2007/02/15(木) 11:34:18
まじめにお願いします
1スレッドにつき50%も消費してしまうのでなんとかしたいのです
826デフォルトの名無しさん:2007/02/15(木) 11:39:33
なるべくCPUを使わないようにする。
827デフォルトの名無しさん:2007/02/15(木) 11:48:31
>>823
随所にスリープを入れる。CPU使用率が上がりそうなロジックはクリティカルセクションとして複数同時に行なわないようにする。
828デフォルトの名無しさん:2007/02/15(木) 11:55:54
>>827
ありがとうございます
下がりました
829デフォルトの名無しさん:2007/02/15(木) 12:03:06
ループをウェイト無しで走らせるとCPU100%になる。
Sleep(1)でもいいからとにかくSleep入れて、
Application.ProcessMessage()、C#ならApplication.DoEvents()を
入れれば、たいていCPU使用率がぐっと下がるべ。
830デフォルトの名無しさん:2007/02/15(木) 12:04:37
井の中の蛙乙
831デフォルトの名無しさん:2007/02/15(木) 12:06:06
アンカー付けろよ
832デフォルトの名無しさん:2007/02/15(木) 12:07:49
#defineをC++ではconstを使うんですよね?
メンバ変数としてのconstの初期化はできるのですか?
グローバル変数じゃないと無理ですか?
833832:2007/02/15(木) 12:13:22
int MAX;メンバ変数として宣言

/////////////////////
const MAX=50;//関数内で初期化


スコープを抜けると初期化はされていませんでしたが仕様ですか?
834デフォルトの名無しさん:2007/02/15(木) 12:17:14
>>832
宣言に初期化子をつけることでコンパイル時定数として使えるようになる。
835832:2007/02/15(木) 12:19:24
メンバ変数は宣言時に初期化できないのでは?
836デフォルトの名無しさん:2007/02/15(木) 12:21:52
整数に限り可能。
837デフォルトの名無しさん:2007/02/15(木) 12:22:57
>>835
そう。実は初期化しているわけじゃない。あくまで特別扱いだが >>834
838832:2007/02/15(木) 12:26:51
const static int MAX=50;
でいけました
staticをなぜつけなければならないのか疑問ですが
839デフォルトの名無しさん:2007/02/15(木) 12:28:19
>>838
staticをつけないと、定数ではなくなるから。
840832:2007/02/15(木) 12:31:41
constで定数を示しているのかと思いました
841デフォルトの名無しさん:2007/02/15(木) 12:51:44
STLportのhash_mapでキーから値を得たいんだけどどうすりゃいい?
842デフォルトの名無しさん:2007/02/15(木) 12:54:57
>>840
constだけだと「値の変更できない変数」でしかないのですよ。
#コンパイラが最適化で消す可能性はなくもないけど。
843770:2007/02/15(木) 14:09:47
>>789
ありがとうございます。

MMORPGでのキャラクターの位置データを取得したかったのです。

#本人は犯罪にならないと考えているのですが、なるのでしょうか?
844デフォルトの名無しさん:2007/02/15(木) 14:43:23
>>843
全く問題ないと思うのなら、そのゲームのコミュニティで公言してみたら?
#実際問題、大抵のMMOでは契約条項違反になると思うが。
845デフォルトの名無しさん:2007/02/15(木) 15:58:16 BE:805582894-2BP(20)
for(int i = 0; i < 10; i++)のi++は++iの方がいいと思うのですが、CやC++の本ではi++ばかりですよね。
++iにするとマズイことでもあるのですか?
それともintの場合は、i++も++iも効率は変わらないのでしょうか?
846デフォルトの名無しさん:2007/02/15(木) 16:04:28
>>845
C++では++iにすることが多い。
847デフォルトの名無しさん:2007/02/15(木) 16:07:46
俺の場合は、ソースコード見直す時に
ぱっとみで間違える事があるから for のときは i++ てしてる。
848デフォルトの名無しさん:2007/02/15(木) 16:22:50
組み込み型だけ特別扱いして後置きにする方が気持ち悪くない?
849デフォルトの名無しさん:2007/02/15(木) 16:26:52
そう思うなら ++i にしとけばいいんじゃね?
850デフォルトの名無しさん:2007/02/15(木) 17:14:46
>>849
だからそうしてるんだよ
851デフォルトの名無しさん:2007/02/15(木) 17:27:42
そういう答えが欲しかったんだよ
852デフォルトの名無しさん:2007/02/15(木) 17:28:38
ならそれでいいんじゃね?
853デフォルトの名無しさん:2007/02/15(木) 18:13:36
>>847
どんな読み間違いなのかちょっと気になるなあ。教えて欲しいなあ。
854デフォルトの名無しさん:2007/02/15(木) 18:20:20
書き方は共通させたほうが良いのではないでしょうか?
一人で組むなら自己流でいいと思いますが
855デフォルトの名無しさん:2007/02/15(木) 18:37:50
++i派は啓蒙がうざくてしょうがない
856デフォルトの名無しさん:2007/02/15(木) 18:45:09
インデントを考慮せずに
if(((foo|(ber>>8))*piyopiyo=hogehoge((foo%9)/asdf))==!qoo)
こんな風に書く人はボウヤなんですか? だとしたら若いですね
857デフォルトの名無しさん:2007/02/15(木) 18:46:45
お爺ちゃんもう呆けちゃったの?
858デフォルトの名無しさん:2007/02/15(木) 18:48:35
if(((
この時点でなんとかしたいと思う(よくあるケースだから10中9まで放置だけどな
859デフォルトの名無しさん:2007/02/15(木) 19:36:12
812です。
ありがとうございました、さっそく信号処理の勉強からはじめてみます
860デフォルトの名無しさん:2007/02/15(木) 19:52:53
>>856
七行スレではよくあること
861デフォルトの名無しさん:2007/02/15(木) 20:02:30
floatをbit単位でいじり回してエッチな事をしたいんですが、悲しい事に今は
float x=0;
*((unsigned int*)&x) = 0x80000000;
とかやって-0.0をしています。こうしないとコンパイラが勝手に切り詰めてしまうんです。
もっとスマートな方法はないでしょうか。
862デフォルトの名無しさん:2007/02/15(木) 20:07:06
>エッチな
863デフォルトの名無しさん:2007/02/15(木) 20:10:50
float と ビットフィールド持った構造体との union ?
エンディアンとか浮動小数点フォーマットとかで環境依存バリバリだろうけど
864デフォルトの名無しさん:2007/02/15(木) 20:13:21
>>863
ありがとうございます。
865デフォルトの名無しさん:2007/02/15(木) 23:16:54
直接Cには関係ないかもしれないんですが、一応Cで書いてるのでここで質問させてください。
今開発中のプログラムのソースコードが2000行くらいに達してるんですが、調べながら
書いていったためソースがぐちゃぐちゃで何とか仕様を満たす程度なんですけど、
これから機能を増やしていくにあたりソースを綺麗に書き直した方が能率はあがるでしょうか?
866デフォルトの名無しさん:2007/02/15(木) 23:18:47
>>865
・ソースファイルの分割
・C++が使用可能ならクラス化
867デフォルトの名無しさん:2007/02/15(木) 23:19:28
あとスパゲッティなコードはバグを誘発しやすい
868デフォルトの名無しさん:2007/02/15(木) 23:25:08
>>866
ソース別けれたんですね。気付きませんでした。

>>867
ぐちゃぐちゃってことですか。やはり綺麗なほうが得なんですね

ありがとうございました。おかげでやる気が出ました!
869デフォルトの名無しさん:2007/02/15(木) 23:32:01
ヘッダファイルの使い方を知らないプロってことはないよね
870デフォルトの名無しさん:2007/02/15(木) 23:46:25
main関数しかなかったら神
871デフォルトの名無しさん:2007/02/15(木) 23:51:45
学生です。
mainの他にプロシージャとスレッドがあります。
ヘッダーファイルって定義と宣言とか書く奴ですよね
872デフォルトの名無しさん:2007/02/16(金) 00:03:20
「本物のプログラマはヘッダを書かない」
873デフォルトの名無しさん:2007/02/16(金) 00:07:50
こらこら
874デフォルトの名無しさん:2007/02/16(金) 00:17:56
ヘッダに宣言、ソースに定義を書き分けるには理由があるのだが
その説明は面倒だ
なんか、Cに関数の宣言が必要な理由をどこかで読んだのを思い出した
理由は忘れたが、関数宣言しないよりもする記述のが楽なんだなと思ったのは覚えてる
875デフォルトの名無しさん:2007/02/16(金) 00:21:05
>>874
そんな分け方しない。宣言だろうが何だろうが、他のソースと
共有する必要のあるものだけをヘッダに入れる。必要なら定義も入れる。
876デフォルトの名無しさん:2007/02/16(金) 00:27:07
コンパイル時間を惜しむ為必要なものだけをヘッダに書くこと
他クラスないし関数を見たいときはヘッダはなるべくインクルードせず宣言だけを行う事
877デフォルトの名無しさん:2007/02/16(金) 02:12:03
STRING STR="32"
INT I=ATOI(STR);

をできるようにして
878デフォルトの名無しさん:2007/02/16(金) 02:53:48
VS2005で、コマンドラインからcl.exeでC言語のソースをコンパイルして静的ライブラリを生成する時、exeではなくlibを生成するオプション名は何ですか?
879デフォルトの名無しさん:2007/02/16(金) 02:59:02
>>878
cl /? でいいことがあるかも。
880877:2007/02/16(金) 03:07:46
できないのかな?
881デフォルトの名無しさん:2007/02/16(金) 03:11:04
>>880
エスパー募集か?
「できる」の意味がわからん。
882デフォルトの名無しさん:2007/02/16(金) 03:11:30
つ マクロ
883デフォルトの名無しさん:2007/02/16(金) 03:15:30
答えもわからんカスがしゃしゃり出てくんな
884デフォルトの名無しさん:2007/02/16(金) 03:21:52
>>881
同意

俺程度のエスパーでは何を言いたいのかさっぱり分からん
885デフォルトの名無しさん:2007/02/16(金) 03:33:11
>>878
例えば、こういうこと?
ttp://codezine.jp/a/article.aspx?aid=374
886865:2007/02/16(金) 03:37:10
やっとソース分割終わりました。
短くなったら読むのもとても楽で最高です。
ヘッダーファイルの使い方も勉強になりました。thx
887デフォルトの名無しさん:2007/02/16(金) 09:13:37
>>877
std::stringでchar*返すメンバ関数探せ
888デフォルトの名無しさん:2007/02/16(金) 10:11:59
>>875,876
便乗質問

a.h で定義されているクラスや定数をヘッダ内で参照する b.h があるとき
b.h 内で a.h をインクルードする? しない?
889デフォルトの名無しさん:2007/02/16(金) 10:20:17
「しなきゃならない」んじゃないか、それ?
890デフォルトの名無しさん:2007/02/16(金) 10:27:56
>>889
b.h を利用するソース側で b.h のみか
a.h b.h の順でインクルードしてねと約束させるか
だけど、限りなく強い「したほうが良い」の意?

分法 or コンパイラ的にNGな部分あるっけ?
891デフォルトの名無しさん:2007/02/16(金) 10:34:24
ん、それは「ヘッダ内で参照する」の意味に依る話になった感じだな。
892デフォルトの名無しさん:2007/02/16(金) 10:43:31
「ヘッダ内で参照する」は、b.h 内で a.h のシンボルが出てくるという位置付けで…
 a.h | class A {};
 b.h | class B : public A {};
とか
 a.h | #define NUM_HOGE (10)
 b.h | struct foo { int bar[NUM_HOGE]; };
のように
893デフォルトの名無しさん:2007/02/16(金) 11:01:33
自身が必要なヘッダは自身がincludeすべきだよ。
> a.h b.h の順でインクルードしてねと約束させる
これはめちゃくちゃ混乱すると思う。
個人作業で、ヘッダファイルの数が一桁とかのうちは平気かもしれないけど・・・。

この件に限らず、「一箇所でやっておけば他の箇所では考えずに済む」ことをやらず、
「n箇所のどこか一つでも間違ったらアウト」な状況にする選択肢は選ぶべきではないよ。
894デフォルトの名無しさん:2007/02/16(金) 14:16:00
std::stringからCSVデータを抜き出したいのですがどうするのか教えてください
895デフォルトの名無しさん:2007/02/16(金) 14:28:45
>>894
std::string::find(), std::string::substr() を使う。
または stringstream に突っ込んで >>775
896デフォルトの名無しさん:2007/02/16(金) 14:44:55
普通、「列方向」と言ったら、縦か横かどっちを指す?
897デフォルトの名無しさん:2007/02/16(金) 14:58:20
縦だろ。
898デフォルトの名無しさん:2007/02/16(金) 14:59:59
>>849
string& simple_replace(string& s, const string& from,
        const string& to)
{
    string::size_type n, nb = 0;
    while ((n = s.find(from, nb)) != string::npos) {
        s.replace(n, from.size(), to);
        nb = n + to.size();
    }
    return s;
}
vector<string> split_csv(const string& s)
{
    static boost::regex csvre("(\"(?:[^\"]|\"\")*\"|[^,]*),");
    static boost::regex dqre("^\"(.*?)\"$");

    vector<string> result;
    string ss = s + ",";
    string::const_iterator start = ss.begin(), end = ss.end();
    boost::smatch what;

    while (boost::regex_search(start, end, what, csvre)) {
        string tok = string(what[1].first, what[1].second);
        tok = boost::regex_replace(tok, dqre, "$1");
        simple_replace(tok, "\"\"", "\"");
        result.push_back(tok);
        start = what[0].second;
    }
    return result;
}
899898:2007/02/16(金) 15:04:19
安価間違えた
>>849ではなく>>894
900デフォルトの名無しさん:2007/02/16(金) 15:33:14
>>896
簡単な覚え方
行の右側の部首が 水平なので横方向
列の  〃    が 垂直なので縦方向
901898:2007/02/16(金) 16:22:09
スマソ。わざわざboost::regexとか使うまでもなかったわ。

vector<string> split_csv(const string& s)
{
  vector<char> col;
  vector<string> result;
  int i = 0;
  char c;

  while (i < s.size()) {
    c = s[i++];
    if (c == '"') {
CONTINUE:
      while (i < s.size() && (c = s[i++]) && c != '"')
        col.push_back(c);
      if (i < s.size() && s[i] == '"') {
        col.push_back(s[i++]);
        goto CONTINUE;
      }
    } else if (c == ',') {
      result.push_back(string(col.begin(), col.end()));
      col.clear();
    } else
      col.push_back(c);
  }
  if (col.size() > 0)
    result.push_back(string(col.begin(), col.end()));
  return result;
}
902デフォルトの名無しさん:2007/02/16(金) 18:43:29
質問があります。
二次元座標のクラスを作っているのですが、
point.x(), point.y()でx,y座標を取得できると同時に
point[0], point[1]でもx, y座標を取得できるようにしたいのです。

そこで、メンバ変数の持ち方なのですが
class point{
...
private:
int x_, y_;
};
とするとx(), y()は簡単になりますが、
int operator[](size_t i){
if(i == 0) x_;
else if(i == 1) y_;
else // エラー処理
}
みたいになってしまいます。ポインタ + iの形を使えれば効率的になりそうですが、
x_, y_が連続した領域に配置される保証はない(?)と思うのでできません。

両方を効率良く実装するにはどのような方法を取ればよいでしょうか?
903デフォルトの名無しさん:2007/02/16(金) 18:46:38
>>902
private:
int a[2];
904デフォルトの名無しさん:2007/02/16(金) 18:50:13
>>903
そうしたら
int x(){ return a[0]; }
int y(){ return a[1]; }
となって、今度はこちらが非効率になりませんか?
最適化を期待できるということでしょうか?
905デフォルトの名無しさん:2007/02/16(金) 18:53:34
>>904
おおかた最適化で消える。最適化有効にしてアセンブリ吐かせてみれば確認できるだろう。
906デフォルトの名無しさん:2007/02/16(金) 19:03:47
>>905
分かりました。ありがとうございます。
907デフォルトの名無しさん:2007/02/16(金) 19:08:55
mainのなかで
newで割当てられるメモリーには上限があるのでしょうか?
コンパイルオプションなどで上限を増やすことはできないのでしょうか?
908デフォルトの名無しさん:2007/02/16(金) 19:21:53
909デフォルトの名無しさん:2007/02/16(金) 19:36:54 BE:1208374496-2BP(20)
>>846-847ありがとうございます
結局どちらでも効率は変わらないのでしょうか?
910デフォルトの名無しさん:2007/02/16(金) 19:44:38
>>909
なんの効率?
コーディングの効率ってことならお前の書きやすい方でやればいい
911デフォルトの名無しさん:2007/02/16(金) 19:53:24 BE:313282272-2BP(20)
>>910ありがとうございます
i++と++iでは、++iの方が実行速度が速いと思うのですが、これは勘違いですか…?
intだと変わらなかったりするのでしょうか?
912デフォルトの名無しさん:2007/02/16(金) 20:03:22
>>911
環境が書かれてないからなんとも。
コンパイラが吐いたコード確認すれば?
913デフォルトの名無しさん:2007/02/16(金) 20:31:18
>>911
asm勉強した方が良いよ
914デフォルトの名無しさん:2007/02/16(金) 20:37:24
そんなトコの速度気にしてないで自分の人生とか気にしたほうがいいよ
915デフォルトの名無しさん:2007/02/16(金) 21:06:13 BE:537055564-2BP(20)
>>912-913ありがとうございます。
環境によって違うことなんですね。馬鹿ですみませんでした。
asmとはアセンブラのことですか?
低級言語は私には難しいと思うので、当分学ぶつもりはありません。

>>914ありがとうございます
それを気にするとストレスで禿げてしまいそうなので、
禿げていてもおかしくない年になってから考えます。

ありがとうございました。
916デフォルトの名無しさん:2007/02/16(金) 21:10:47
ってかC++やってるなら常に禿は身近にあるものと思ったほうがいい
917デフォルトの名無しさん:2007/02/17(土) 00:10:26
898
トン
918898:2007/02/17(土) 03:57:14
もう見てないかもしらんが。
>>901のコードだと、末尾が,だと最後が空のカラムと認識されないな。
後gotoとか使って色々と汚いので、↓のように手直ししといた。

vector<string> split_csv(const string& s)
{
  string col;
  vector<string> result;

  for (int i = 0; i < s.size(); ) {
    char c = s[i++];
    if (c == '"') {
      for (;;) {
        while (i < s.size() && (c = s[i++]) != '"')
          col.push_back(c);
        if (i < s.size() && s[i] == '"')
          col.push_back(s[i++]);
        else
          break;
      }
    } else if (c == ',') {
      result.push_back(col);
      col.clear();
    } else
      col.push_back(c);
  }
  result.push_back(col);
  return result;
}
919デフォルトの名無しさん:2007/02/17(土) 14:35:37
reinterpret_cast<hoge>(arg) のかわりに
static_cast<hoge>(static_cast<void*>(arg)) を使うべき的な内容をどこかで見た記憶があるのですが、
その意図が、書いてなかったのか忘れたのか、把握できてません

どういった意図でこんなまどろっこしいことを推奨してるんでしょうか
あとこういう関数を定義してでもreinterpret_castは避けるべきなんですか?
920デフォルトの名無しさん:2007/02/17(土) 14:54:54
授業でC言語をならった程度の理解力です。

ブロック崩しの自動処理をするプログラムを作りたいです。
(ボールの左右の移動に応じてマウスカーソルを移動させるだけの物)
意外に簡単にできるんじゃないかなぁ。と甘い考えなのですが2日3日で作れるでしょうか?
921デフォルトの名無しさん:2007/02/17(土) 16:03:11
>>920
授業でどこまで習ったのかわからないし
どれくらいやる気があるのかもわからんから答えようがない
とりあえず作ってみればわかるんじゃね?
922デフォルトの名無しさん:2007/02/17(土) 16:35:22
win32apiの関数を使うのはわかるんですが、どれがどれかがわからないんです…
1〜10まで指南して貰わないとダメかもしれないです…('A`)

やっぱり参考書か何かを買ってゆっくり覚えた方がいいですね…
923デフォルトの名無しさん:2007/02/17(土) 16:58:06
ひたすらMSDN嫁。
印刷して嫁。
電車の中で嫁。
寝る前にも嫁。
924デフォルトの名無しさん:2007/02/17(土) 16:58:12
win32apiでもいいけどライブラリを使うという手も
925デフォルトの名無しさん:2007/02/17(土) 17:35:15
>>920
想像だが、授業でやるのはコンソールアプリだけだろう。
君がやろうとしてるのは Windows アプリだろう。

たぶんウィンドウを作るだけで、数日から、人によっては数週間かかるよ
926デフォルトの名無しさん:2007/02/17(土) 18:11:26
>>925
そしてイベントドリブン(メッセージ)、再描画、デバイスコンテクスト
それぞれに数日なやむことになるんだよね。
927デフォルトの名無しさん:2007/02/17(土) 18:14:21
>>925
大学にもよるみたいよ

私立K大学はC#使ってウィンドウアプリ
私立O大学はCでコンソールアプリのみ

いきなりウィンドウアプリとか作らしても意味はないと思うけど・・・。
928デフォルトの名無しさん:2007/02/17(土) 18:31:28
>920のターゲットはきっとBakuretu Block Applet V7とESP。
929デフォルトの名無しさん:2007/02/17(土) 18:53:21
>>925-928
とりあえず、形から入ろうとC++.netを買いました。
確かにウィンドウアプリという物は作ったことがありません…
とりあえず暇な春休みを有効利用ということで勉強し直して頑張ってみます!
ありがとうございました。
930デフォルトの名無しさん:2007/02/17(土) 19:43:44
Javaをやってるトコだと、GUIアプリとかあるみたいね。
一度覗いてみたことあるけど、授業中にメモ帳やら簡単なゲームやら作ってた。

ソフトウェア系をメインとする学部とかは別として、
結局は授業でやる言語次第なのかも。
931デフォルトの名無しさん:2007/02/17(土) 19:53:11
>>919
C++相談室 part53 の 841- にあった。過去ログは適当に検索すれば見つかる。
932デフォルトの名無しさん:2007/02/17(土) 20:12:23
>>931
よくわからんがいつもの
どうなるか未定義とか処理系がどうのこうのとか
保障されてるされてないっていう迷惑なあれか。
C/C++なんてキャストやポインタ使いまくる言語なのに
使いずれー言語だな。
933デフォルトの名無しさん:2007/02/17(土) 20:17:52
>>931
うぉぉ ありがとうございます
すっきりしゃっきりしました

細かいことは規格書調べられるようにならないとだめですね…('A`)
934デフォルトの名無しさん:2007/02/18(日) 02:03:52
pthreadの質問なんですが、この↓関数を複数のスレッドで実行させると
文字列の出力結果が期待どうりになりません。
void* func(void *){
std::cout << "hello" << std::end ;
}

文字列の出力にprintfを使うと期待したとうりに
hello
hello
hello
と出力されるのですが、なぜstd::cout << "hello" << std::endl だとダメなんでしょうか。
935デフォルトの名無しさん:2007/02/18(日) 02:06:28
どうなるの?
936934:2007/02/18(日) 02:16:50
>>935
std::cout << "hello" << std::endl でやると
hellohellohelloになって改行が出ないです。
937デフォルトの名無しさん:2007/02/18(日) 02:32:11
printf が atomic に処理されてる(っぽい)のに対して、
std::cout << "hello" << std::endl は atomic に処理しようがないからだろうな。

ちなみに printf だと正しく出てるのは偶々そーなっているだけで
それは保証された動作じゃないぞ。( ひょっとしたらgcc独自の仕様として
atomic に出力されることが保証されているかも知れんがそこまでは知らん。 )
938デフォルトの名無しさん:2007/02/18(日) 02:40:20
printf("hello\n") と比較すべきは std::cout << "hello\n" だろう。
939934:2007/02/18(日) 02:51:00
std::cout << "hello\n" ;
で実行するとprintfの出力結果と同じようになりました。
一体何が違うんでしょうか。
940デフォルトの名無しさん:2007/02/18(日) 03:07:19
バッファリング
941デフォルトの名無しさん:2007/02/18(日) 03:16:43
endl で分けるとライブラリへの呼び出しが2回に分断される。
標準出力についての排他制御の動作が変わるんだろう。
942デフォルトの名無しさん:2007/02/18(日) 04:01:54
逆に、std::cout << "hello" << std::endl; と比較すべきはprintf("hello"); printf("\n"); fflush(stdout); だな。
943デフォルトの名無しさん:2007/02/18(日) 04:44:59
>>942
それを言うなら std::cout << "hello¥n"; std::cout.flush(); と
printf("hello¥n"); fflush(stdout); じゃないか?
944デフォルトの名無しさん:2007/02/18(日) 07:57:36
そもそもマルチスレッドで
hheello


o
みたいに表示されないのか考えるべき・・・じゃない
945デフォルトの名無しさん:2007/02/18(日) 08:41:04
>>944
実際、環境によってはそうなる。どんな環境だったか覚えてないけど、
昔マルチスレッドでログ出力やってそんなログを作らせちゃった覚えがある。
946デフォルトの名無しさん:2007/02/18(日) 09:06:21
WINXPでWIN32プログラムの質問です。
下のコードでメニュー画面からアナログ時計画面を
出した後、アナログ時計画面を閉じて再度メニュー画面から
アナログ時計画面を選択しても無反応です。
何回でも表示することができるようにしたいのですが
どなたかご教授いただけないでしょうか?


http://sa-wiki.com/upload/src/up0107.txt
947デフォルトの名無しさん:2007/02/18(日) 09:13:17
>>946
マルチ乙
948デフォルトの名無しさん:2007/02/18(日) 09:41:40
>>938>>942
Cのstdioって行単位のバッファリングがされなかったっけ?
949デフォルトの名無しさん:2007/02/18(日) 09:46:50
アトミックだったとおも
950デフォルトの名無しさん:2007/02/18(日) 10:04:49
>>948
標準出力に関しては行バッファリングであるような実装が多い。
つまり、\nをstdoutに送ると自動的にフラッシュされる。が、別にこれは
規格上保障された動作でも何でもない。
バッファリング方式はsetvbuf()で変更することが出来る。

>>945の例の場合、出力先がログ(=ファイル)なので、普通は
行バッファリングでない。つまり、出力がBUFSIZに達した時点で
内部的にフラッシュされている筈。BUFSIZは行区切りとは何の関係
もないから、一般には出力が崩れる可能性がある。

複数スレッドからstdio経由で同一ファイルに書き込んで
行単位で出力が崩れないようにするには、以下のようにすると良い。
1) 常に行単位で出力する。関数レベルでlibcが排他制御を
 行うような実装であることが前提だが。
2) 行バッファリングモードを使う(_IOLBF)。

勿論、「自前で排他制御を行う」手もあるが。

951デフォルトの名無しさん:2007/02/18(日) 10:18:26
行単位出力と排他制御は別の問題だと思うのだが。
952デフォルトの名無しさん:2007/02/18(日) 10:24:47
math.hで

int main()
{
float i,j;

printf("atan2()\n");

i=1;
j=0;

printf("atan2(1,0)(→)は%d\n",atan2(i, j));

getch();

       ・・・ry

のようなプログラムを書いて出力したのですが、

atan2()
atan2(1,0)(→)は1610612736
atan2(0,1)(↑)は0
atan2(-1,0)(←)は1610612736
atan2(0,-1)(↓)は1610612736

返ってきた値は以上で、
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vclib/html/_crt_atan.2c_.atan2.asp
にあるように、
>?π 〜 π ラジアンの範囲で返します。
返してくれないんですが、使い方が間違っているのでしょうか?
953デフォルトの名無しさん:2007/02/18(日) 10:28:30
>>951
関数レベルで排他制御を行っているような典型的な実装なら、
1) fputs()やfprintf()等を用いて、常に\nで終わる文字列をstdioに
 与えるようにする。
2) _IOLBFモードを設定しておく
ことで、出力がcritical section内で完結し、行レベルでatomicになる。
「出力を崩したくない」というのは、通常はそういう意味のはず。
954デフォルトの名無しさん:2007/02/18(日) 10:29:34
>>952
× %d
○ %f
955デフォルトの名無しさん:2007/02/18(日) 10:31:12
>>954
orz

atan2()
atan2(1,0)(→)は1.570796
atan2(0,1)(↑)は0.000000
atan2(-1,0)(←)は-1.570796
atan2(0,-1)(↓)は3.141593

ちゃんと帰ってきました。
ありがとうございました↓↓
956デフォルトの名無しさん:2007/02/18(日) 10:36:12
○%f
◎%g
957デフォルトの名無しさん:2007/02/18(日) 11:04:50
>>934
俺がマルチスレッドでログ出すときは改行までを1回の関数コールでしているな。
2回の関数コールで文字を出したりすると間に別の文字が入るから。

場合によってはミューテックスつきの自作printf風ログ関数を必ず使うようにしている。
# 俺はstd::coutを使わないprintf派。
958デフォルトの名無しさん:2007/02/18(日) 11:44:33
俺はスレッド単位でログ出力先変える派
スレッド数少ない時限定だけど。
959934:2007/02/18(日) 12:32:42
レスありがとうございました。
マルチスレッドでは単純な文字列の出力でも
同一のリソースにアクセスすることになって面倒なことになるようですね。
勉強になりました。ありがとうございます。
960デフォルトの名無しさん:2007/02/18(日) 13:09:18
お願いします。

下のプログラムは数値を入れ替えるプログラムsort.cである。以下の問いに答えよ。
1.プログラム内の@〜Eに適当な命令を入れてプログラムを完成せよ。ただし@とAは複数の回答がある。可能な限り全て答えよ。
2.変数aがメモリの1000番地に格納されていた。int型が4バイトとすると、変数bは何番地に格納されるか答えよ。
3.関数間のデータ受け渡しにポインタを使うメリットとデメリットを説明せよ。

#include<stdio.h>
/*ポインタ渡しでデータの交換*/
void swap(int *x, int *y);
int main(void)
{
int a=1731, b=935;
int *p1, *p2;
/*ポインタに代入*/
p1=&a;
p2=&b;
printf("初期状態\t");
printf("a=%d b=%d\n",a,b);
swap(@,A);
printf("swap終了後\t");
printf("a=%d b=%d\n",a,b);
return(0);
}

void swap(int *x, int *y)
{
B z;
z = C;
*x = D;
*y = E;
}
961デフォルトの名無しさん:2007/02/18(日) 13:11:36
宿題スレ池ヴォケ
962デフォルトの名無しさん:2007/02/18(日) 16:34:41
C++で、静的メンバ変数に関数ポインタを指定するにはどうすればいいのでしょうか?

class CA{
public:
static int (*s_m_func1)();
};
int * CA::s_m_func1();

これだと『'CA::s_m_func1()'は'CA'のメンバーではない』って言われて、コンパイルできません。
お助けお願いしますー。
963デフォルトの名無しさん:2007/02/18(日) 16:38:24
>>962
何そのありえない構文
964デフォルトの名無しさん:2007/02/18(日) 16:43:26
>>962
int (*CA::s_m_func1)() = 0;
965デフォルトの名無しさん:2007/02/18(日) 16:44:30
>>962
クラス内でstatic int (*s_m_func1)();と宣言したら、
その定義は機械的にstaticを外して名前にクラス名::を付けるだけで作れる。
int (*CA::s_m_func1)();
966デフォルトの名無しさん:2007/02/18(日) 16:48:55
>>963
馬鹿でごめんなさいm(_ _)m
>>963-965
ありがとうございました!
おかげでできました。
967デフォルトの名無しさん:2007/02/19(月) 10:45:27
質問です。
placement newのoperator delete(void *p, void* pMemory);で、
渡された*pの型を取得する方法はありませんでしょうか。
operator delete(void *p, void* pMemory)の中でデストラクタを呼んでやりたいのです。

通常のdeleteは、
delete pHoge;
で、Hogeを正しく解体できますし、デストラクタも呼んでいますよね。
これは正しい型情報(pHogeの型のものでしょう。void*にキャストしてから渡すとデストラクタは動きませんから)がdeleteに渡されているからだと思うのですが…。

968デフォルトの名無しさん:2007/02/19(月) 12:14:51
operator deleteの仕事は、メモリを適切に解放するだけです。もうデストラクタは呼ばれているはず。
969デフォルトの名無しさん:2007/02/19(月) 12:25:47
>>968
ありがとうございます。
なるほど。確かに通常のdeleteでは、その中に入る前にデストラクタが呼ばれていますね。
となると通常のdeleteはどんなトリックを使っているのでしょうか。
単純に「C++のコンパイラが、そこにデストラクタを呼ぶコードを自動で入れてるんだよ」ということでしょうか。

現在、こんなようなコードになっています。

template<class T>
class CHoge
{
/*省略*/

void test()
T* p;
p = new(pMemory) T;
operator delete(p, pMemory);
}
};

ここには二つの障害があるように思えます。
・Tのデストラクタをどうやって呼び出すか。
・そもそも、Tにデストラクタが無かったらエラーになってしまう。
この2点について、解決できる手法がありますでしょうか?
970デフォルトの名無しさん:2007/02/19(月) 12:33:05
デストラクタを明示的に呼び出してあげてください。こんな感じで

p->~T();

こことか参照 http://www.fides.dti.ne.jp/~oka-t/cpplab-placement-new-2.html
971デフォルトの名無しさん:2007/02/19(月) 12:38:14
new演算子の仕事 : operator newでメモリを確保 → コンストラクタ呼び出し
delete演算子の仕事 : デストラクタ呼び出し → operator deleteでメモリ開放

new/delete演算子と、operator new/deleteの意味の違いに気をつけよう、とMore Effective C++で読んだ。
972デフォルトの名無しさん:2007/02/19(月) 13:37:47
>>970
ありがとうございます。
intなどにもデストラクタが存在するというのは盲点でした。
思い込みにとらわれて、p->~T()がコンパイル通るか試していなかったのが恥ずかしいです。

>>971
なるほど。
その上で、placement new/delete にはnew/delete演算子形式の書式がないので自前でデストラクタを呼ぶ必要があるというわけですね。
ありがとうございます。

思ったとおりの実装ができそうです。
これにて967の質問は解決とさせていただきます。
ありがとうございました。
973デフォルトの名無しさん:2007/02/19(月) 17:55:49
new 演算子で確保した配列メモリのサイズを、
sizeof()で配列のサイズを得るようにするにはどうしたらいいのでしょうか…

ググり方が下手で見つけられませんでした…
    出来ればどうググったらよいのかも

もう一つ、reallocの動作をさせるのには、
いったんnewで別に配列メモリを確保して、古い配列メモリをdeleteした上で、
今確保したアドレスを代入するのが最良なのですか?

int *pa = new int[5];


int *pat = new int[10];

for(i = 0; i <= 5; i++){
pat[i] = pa[i];
}
delete [] pa;
pa = pat;

のような…
このとき最後にdeleteすべきなのはpa? pat?
974デフォルトの名無しさん:2007/02/19(月) 18:04:54
そんなことしないで、素直にstd::vector使えよ。
975デフォルトの名無しさん:2007/02/19(月) 18:49:06
質問があります。
class A
{
public:
Test();
};

class B
{
public:
Here();
};

と言うクラスがあるとします。
現在classBのHere()内にいてclassAのTest()関数を呼び出したいのですが、
どうするのが一番良いのでしょうか?
実際は他にもメンバがある状態でTest()のみを使用したいので継承はないかと思ってます。
となると、Here()内でclassAをインスタンス化して呼び出すか、classBに同じ関数を作るという方法を
思いついたのですがどうなのでしょうか?
よろしく御願いします。
976デフォルトの名無しさん:2007/02/19(月) 18:54:51
A::Testというのは普通Aのインスタンスを弄ると想定されるわけだが、
B::Hereにおいては、Aのインスタンスの変更以外の作用が欲しい、というところか?

A::Testのうち、インスタンスに依存しない部分を切り出すのはどうだろうか。
977975:2007/02/19(月) 19:02:09
説明不足ですいません。
A::Test()はclassAのメンバを弄るのではなく、引数で複数の変数ポインタを渡し
それらを計算してアドレスを返すという関数なんです。
classAのメンバ関数内でで数回呼び出すのでclassAのメンバ関数とした訳ですが、
構造的に悪かったですか?
978デフォルトの名無しさん:2007/02/19(月) 19:06:32
弄らないならstaticにでもしとけ。
979973:2007/02/19(月) 19:08:05
>>974
stringとかvector使うと
INIファイルを弄るあたりが面倒になるので、あまり使いたくないのですが…

たとえばGetPrivateProfileStringやGetWindowTextなどでバッファは配列アドレスを渡す必要があるので…
980975:2007/02/19(月) 19:10:18
>>978
あ、そういう手がありましたね。有り難うございました。
981デフォルトの名無しさん:2007/02/19(月) 19:17:10
>>979
vectorでできないわけないだろ・・・
982デフォルトの名無しさん:2007/02/19(月) 19:23:57
ジェネリック医薬品なテンプレート定義
983デフォルトの名無しさん:2007/02/19(月) 19:26:52
何のための&vector[0]だよ。
984デフォルトの名無しさん:2007/02/19(月) 20:01:04
>>979
std::vectorの要素はメモリ上で連続していることが保障されていて、
真にmalloc/realloc/freeなどと同じように動的メモリとして使える。
983の言うとおり先頭要素へのポインタという形で取り出せばよい。

ただしイテレータはポインタで実装されているとは限らないので、
begin()は狩にお前使っている処理系で使えたとしても使うべきでない。
985デフォルトの名無しさん:2007/02/19(月) 20:23:13
std::vector<char> v(0x1000, '\0');
std::fgets(v, v.size(), stdin);
std::vector<char>::iterator pos = std::find(v.begin(), v.end(), '\0');
std::string line(v.begin(), pos);

とかキモいな。
どうせC関数とインタフェースするところなんて、多かれ少なかれ汚いんだから、
適材適所で使い分ければいいんでねーの?

char v[0x1000];
std::fgets(v, sizeof v, stdin);
std::string(v);

のが記述が簡単で効率もいいだろ。
986985:2007/02/19(月) 20:24:42
ごめん
- std::fgets(v, v.size(), stdin);
+ std::fgets(&v[0], v.size(), std::stdin);
987デフォルトの名無しさん:2007/02/19(月) 20:37:03
なんでstd::findするの?string(&v[0])でいいじゃん。
vector<char>をNUL埋めする意味もわからん。
988デフォルトの名無しさん:2007/02/19(月) 20:39:58
そもそもなぜstd::getline使わない

>>987
どうせ省略しても'\0'で初期化されることに変わらない気がする
989973:2007/02/19(月) 20:40:13
…動的メモリとして使えるコトを全く知りませんでした…
vectorなんて使い必要ないじゃんとか考えていて……

バカなことばっかですいません。
990デフォルトの名無しさん:2007/02/19(月) 20:41:31
iostreamは遅い、というのが定説だからじゃないの。
991デフォルトの名無しさん:2007/02/19(月) 20:52:10
俺の周りでは定番なんで貼っとく。

>>989
http://www.s34.co.jp/cpptechdoc/article/vectorastemp/index.html
> テンポラリ・バッファとしての std::vector の利用
992デフォルトの名無しさん:2007/02/19(月) 20:57:35
>>990
それだったらOSのAPIを呼べよと俺は思ってしまう。
993985:2007/02/19(月) 21:02:05
>>987
前者はその通りだな。
後者は、予め領域は確保しなきゃならんでしょ?その副作用。

malloc()のように「確保だけする」手段ってstd::vectorにはないよね?
指定しなくとも、必ず何かデフォルト値で埋められる。
つまり効率が少なくともcalloc()並に落ちるということ。

auto配列とは比較にならないね。

>>988
単にC関数とインタフェースする例だよ。
別にfgets()である必要は全く無い。
994デフォルトの名無しさん:2007/02/19(月) 21:06:16
要素数固定でよければ、boost::arrayがいいと思っていた時期があった。
995973:2007/02/19(月) 21:07:32
>>991
そもそもvectorの根本的な使い方わかってなかったみたいです…

ともかく、おつきあいいただきありがとうございました。
996デフォルトの名無しさん:2007/02/19(月) 21:08:46
reserve()の立場は
997デフォルトの名無しさん:2007/02/19(月) 21:13:10
>>996
size()で得られるインデックス以上の要素にアクセスしてはならない以上、
固定長のバッファが欲しいときに使う性質のものではない。
998デフォルトの名無しさん:2007/02/19(月) 21:19:42
組込みのauto配列はコンパイル時固定サイズだが、それでは困るって場合には
alloca()使えばいい。
移植性にやや難があるけどな。
999デフォルトの名無しさん:2007/02/19(月) 21:24:12
allocaは不足しても延ばせないからなー
1000デフォルトの名無しさん:2007/02/19(月) 21:25:17
つ std::get_temporary_buffer
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。