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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.38【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1180877635/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
2デフォルトの名無しさん:2007/06/25(月) 12:04:06
>>1
3ちんこ:2007/06/25(月) 12:33:43
4デフォルトの名無しさん:2007/06/25(月) 12:36:12
チン腰ね
5デフォルトの名無しさん:2007/06/25(月) 13:26:07
                  /  / /   ヽ  ヽ
        /^ 7    / // i /| .ト、 !ハ   .
        ,′// }.  |ハト、{ヽ! ヽ! ヽト/ハ ! !
    三  | /  /  | ハ ,=、  =、 ☆ | |
      _| / ミ  /ノ,, ,, ___ ,, |   ! j|
 \  /三L」 ミ  / 二コ、ヽ . _ .ノ ,イ / . ′ 
    X/  .| | ミ / xく | > ┬  イリ. / /
  // \ | |__ /   .!斗―/.! / ./ /__{
  .{_ __ / ̄ヽj      从|  トイヽ_/{ {  ∧
   ̄_  {___人   / /` .。ノ     ___ \
    //∨ } \< /     ′   ※亠‐┐ 〉
   //ミ ノ_人  \{    {    j!|   }|/!
6デフォルトの名無しさん:2007/06/25(月) 15:08:41
C言語 XP Borland C++ Compiler 5.5

ファイルから別のファイルに内容をコピーする場合
コピー元のファイルを開いて中身を配列に格納してコピー元のファイルを閉じ、
コピー先をファイルを開いて配列に格納した内容をコピー先に送ってコピー先のファイルを閉じる
ってやり方でOKでしょうか?

それともコピー元とコピー先のファイルを一緒に開いて直接コピーする事は可能ですか?
7デフォルトの名無しさん:2007/06/25(月) 15:11:17
同時にオープンしてても大丈夫
8デフォルトの名無しさん:2007/06/25(月) 15:25:43
>>6
と言うかメモリに収まりきらない巨大なファイルをコピーする場合は
同時にオープンするしかないでしょ。
seekg()とかでちょっとずつコピーする事もできるけど現実的じゃないし。
9デフォルトの名無しさん:2007/06/25(月) 15:28:02
有難うございます
同時にファイルを開く場合、書き方としてはこれで大丈夫でしょうか?

FILE *fp1,*fp2;
char ch;

if((fp1 = fopen(argv[1],"r")) == NULL){
printf("ファイルを開くことが出来ません\n");
exit(1);
}

if((fp2 = fopen(argv[2],"a")) == NULL){
printf("ファイルを開くことが出来ません\n");
exit(1);
}

while((ch = fgetc(fp1)) != EOF){
fputc(ch,fp2);
10デフォルトの名無しさん:2007/06/25(月) 15:35:53
fclose()も忘れずにな
それから"a"で開いてるのはどうして?
11デフォルトの名無しさん:2007/06/25(月) 15:42:42
>>9
・引数の数チェック汁
・fgetc()はgetc()と機能は同じだがfgetc()のほうが速いことはまずない
 fputc()も同様
 まぁどっちもファイルコピーに使うには遅すぎだが
・つかファイルをコピーしたいんならバイナリで開け
・開けなかった時はperror()を使うと処理系定義のエラーメッセージを出してくれる
12デフォルトの名無しさん:2007/06/25(月) 15:46:45
>>10 w+ に変更しますた
>>11 今日、ファイル入ったばかりでまだバイナリまでいってないんす・・・
でこんな感じで書いてみたのですが、何故かコピー先のファイルから結果が表示されない・・・どちて?
int main(int argc,char *argv[])
{
FILE *fp1,*fp2;
char ch;
if(argc != 2){
printf("使用法:<プログラム名> <コピー元ファイル名> <コピー先ファイル名>\n");
exit(1);
}
if((fp1 = fopen(argv[1],"r")) == NULL){
printf("ファイルを開くことが出来ません\n");
exit(1);
}
if((fp2 = fopen(argv[2],"w+")) == NULL){
printf("ファイルを開くことが出来ません\n");
exit(1);
}
while((ch = fgetc(fp1)) != EOF)
if(fputc(ch,fp2) == EOF){
printf("ファイル書き込みエラー\n");
exit(1);
}
fclose(fp1);
while((ch = fgetc(fp2)) != EOF) putchar(ch);
fclose(fp2);
return 0;
}
13デフォルトの名無しさん:2007/06/25(月) 15:49:49
- if(argc != 2){
+ if (argc != 3) {

それと
while((ch = fgetc(fp2)) != EOF) putchar(ch);
の前に
rewind(fp2);
入れろ
14デフォルトの名無しさん:2007/06/25(月) 15:52:27
>>13
できました
ありがとうごぜいます
15デフォルトの名無しさん:2007/06/25(月) 16:12:16
windows、C++Builderです。
バックアップソフトを作りたいと思ってます。
フォルダの中身を、違うパーティションにコピーするだけです。

’曜日’と’時間’だけ、タイムテーブルのようなものに
記録しておいて、時間が来たらコピーする。ということを
永久に繰り返します。
月曜日は、5:00と13:00と18時
火曜日は、5:00
水曜日は、3:00
・・・
など、曜日によって回数も様々です。
どういう仕組みを使うのが、良いでしょうか?

time_t current;
time(¤t);
で、1秒ごとに時刻を取得して比較してたら
大変ですよね。
16デフォルトの名無しさん:2007/06/25(月) 16:14:42
基本的にはタイマー設定すると思うけど。
17デフォルトの名無しさん:2007/06/25(月) 16:17:10
>>15
1.次のバックアップまでの時間に応じてチェックする間隔を変更する(時間に応じて2時間、30分、5分、1分のように)
2.Windows付属のスケジューラを使う
3.多少の誤差は気にせず指定時間までSleep
18デフォルトの名無しさん:2007/06/25(月) 16:27:43
RHEL3環境で、gcc(ver 2.95.3であると思われます)
c++でcursesを使ったプログラミングをしているのですが、

  string str[2]
 str[0] = "hoge0";
  str[1] = "hoge1";
  str[2] = "hoge2";
 for(int i=0; i<3; ++i){
    printf("%s\n",str[i]);
    refresh();
    sleep(1);
  }

のように行うことで出力したいのですがうまくコンパイルできません。
stirng型を出力する方法はないでしょうか?

教えてください。


19デフォルトの名無しさん:2007/06/25(月) 16:31:49
>>18
つ str[i].c_str()

つか、君の読んでる本には載ってないのか?
20デフォルトの名無しさん:2007/06/25(月) 16:32:52
>>18です。
追記です。
出力に●や彡を出力したいので、charではうまくいかず、
stringを使っています。
%sがchar*だからstringの出力ができないと思うのですが、
%sの代わりの変換指定子が分かりません。

お願いします。
21デフォルトの名無しさん:2007/06/25(月) 16:34:39
>>18です。
>>19さんの書き込み見る前に>>20を書き込んでしまいました。
今試して見ます。

ありがとうございます。
22デフォルトの名無しさん:2007/06/25(月) 16:35:08
>>18
- string str[2]
+ string str[3];
>>20
>>19を嫁
c_str()はconst char*を返すから%sでいい
23デフォルトの名無しさん:2007/06/25(月) 16:38:53
文字列の表示に変換指定子の「%s」を使っての
ひらがな、カタカナ、漢字などの全角文字の表示に問題なかったのですが
実際は半角英数字以外使ってはいけないとかあるのでしょうか?
初心者向けの書籍だとみな半角の英語を使って説明されているので
全角文字でも問題がないのかどうか判断に困っています。
24デフォルトの名無しさん:2007/06/25(月) 16:42:18
>>23
ためせ
25デフォルトの名無しさん:2007/06/25(月) 17:01:14
試してOKだったけど、どうなの?って話だろうに。

>>23
char* なら、ASCII だろうと多バイト文字列だろうと問題ナス。
26デフォルトの名無しさん:2007/06/25(月) 17:02:42
>>12
その場合
char ch;
は間違い。
int ch;
にすべし。
2724:2007/06/25(月) 17:03:40
ああ、「問題なかった」と言ってるんだから「試せ」も糞も無いな
ごめん

実際には
・その特定のエンコーディングのソースをコンパイラが処理できるか
・実際に表示(端末に出力)した際に、その特定のエンコーディングの文字列を
 端末が表示できるか
といった問題が関係してくる

まあ日本語に対応したOSや端末で、日本語に対応したコンパイラを使っている
分には通常問題が無いが、
例えばEUC-JPやISO-2022-JPやUTF-8なソースをVC++は食えない
最近のgccは-finput-charsetだの-fexec-charsetだのを適切に指定することで
多国語に対応する
28デフォルトの名無しさん:2007/06/25(月) 17:07:16
>>18です。
>>19さん
のように行ったらできました。ありがとうございました。
私の使っている、「やさしいC++」にはc_str()は載ってませんでした。

これが分かった上でもうひとつお聞きしたいのですが、
  string str[2];
 str[0] = "hoge0";
  str[1] = "hoge1";
  str[2] = "hoge2";

  char* s[2];
  s[0] = str[0].c_str();
  s[1] = str[1].c_str();
  s[2] = str[2].c_str();

が行えません。
char*にchar*を入れているのでいけると思ったのですが。
これはなぜでしょうか?



29デフォルトの名無しさん:2007/06/25(月) 17:08:28
>>28
>>22で指摘したのに……
配列str[]のサイズは2ではなく3にしろ
30デフォルトの名無しさん:2007/06/25(月) 17:10:00
なんでダメかというと
char*にconst char *はそのままでは代入できないからだ

const char *s[3];
とするか(こっちが推奨)、
s[0] = const_cast<char*>(str[0].c_str());
とでも汁(こっちは非推奨)
31デフォルトの名無しさん:2007/06/25(月) 17:11:53
>>29さん
すみません、これは単純な書きミスでした。

 string str[3];
  str[0] = "●";
  str[1] = "●●";
  str[2] = "●●●";

  char* s[3];
  s[0] = str[0].c_str();
  s[1] = str[1].c_str();
  s[2] = str[2].c_str();

としてます。
32デフォルトの名無しさん:2007/06/25(月) 17:16:47
>>30
非推奨っつーか、やっちゃだめ
33デフォルトの名無しさん:2007/06/25(月) 17:17:48
>>30さん
ありがとうございます。
やってみたらできました。

みなさんありがとうございました。

# 書き込む前に新しいレスがあるかリロードでチェックしなくてはいけませんね。
# 何か自分が書き込むタイミングが一歩遅いようで。申し訳ないです。
34デフォルトの名無しさん:2007/06/25(月) 17:18:39
>>32
char *s = "hello";
と犯罪性は同じだと思うけど。
でもこれは合法だしな未だに。
3523:2007/06/25(月) 17:20:24
>>25
>>27
詳しい説明ありがとうございます、
助かるとともに勉強になります。
36デフォルトの名無しさん:2007/06/25(月) 17:21:18
>>34
そんな負の遺産も使っちゃダメ。
37デフォルトの名無しさん:2007/06/25(月) 17:23:44
>>36
 〃〃∩  _, ,_
  ⊂⌒( `Д´) < ヤダヤダ!
    `ヽ_つ ⊂ノ
           ジタバタ
38デフォルトの名無しさん:2007/06/25(月) 17:54:43
main で catch(...) ってどう思います?

例外がキャッチされなかった場合、
デストラクタが実行されるかどうかは未定義で、
実際 g++ だと実行されなかったりします。
それを考えると、main で catch(...) しといた方が
安全なのかな・・・とか思うのですが。
39デフォルトの名無しさん:2007/06/25(月) 18:03:13
#include<stdio.h>
#include<stdlib.h>

char *search_r(char *s,char *p){
char *x;
int i;
x=p;
i=sizeof(p);
while(1){
p=x;
if(*s=='\0')exit(1);
while(*s==*p){
if(*s=='\0')exit(1);
s++;
p++;
}
if(*p=='\0')break;
s++;
}
return s-(i-1);
}
int main(){
char *x;
x=search_r("konbanhasensei","hasen");
printf("%s",x);
return 0;
}
文字列pから文字列sを検索するプログラム
このプログラムで結果を 「hasensei」と表示したいのですが「sensei」となってしまいます。
どこがおかしいのでしょうか。
よろしくお願いします。
40デフォルトの名無しさん:2007/06/25(月) 18:08:15
>>39
マンドクセーからちゃんと読んでないが
> i=sizeof(p);

sizeof(p)はポインタpのサイズ(4とか)が分かるだけだ。
pが指してる文字列の長さを測りたいのなら、strlen()を使え。
41デフォルトの名無しさん:2007/06/25(月) 18:08:25
sizeof(p) → strlen(p)
s-(i-1) → s-i

exit(1); が凄い気になるが・・・。
NULL 返したのでいいんじゃないかな。
for 使ってないあたりも読みづらい。
42デフォルトの名無しさん:2007/06/25(月) 18:11:37
>>40
>>41
ありがとうございます。
43デフォルトの名無しさん:2007/06/25(月) 18:19:29
それ以外にもバグはあるけど、
まあそれは自分で確認してくれ。
44デフォルトの名無しさん:2007/06/25(月) 21:19:09
環境はC++です

今日自分の作ったサブルーティンを上司がチェックしたみたいなんですが
この構造体はインパラメータだから値渡しにしろ
と言ってきました。
サブルーティンの引数に構造体を渡すときに値渡しって使いますか?
このサブルーティンで使っている構造体のサイズは決して小さくはありませんし、
自分的には構造体のサイズが小さくても値渡しは使わないと思っていたので
ちょっと衝撃的でした。
45デフォルトの名無しさん:2007/06/25(月) 21:25:18
場合による
46デフォルトの名無しさん:2007/06/25(月) 21:25:36
>>44
const参照渡しをしててそう言われたんなら上司を鼻で笑ってやれ
constのつかないポインタ渡しでもしてたんなら君も悪い
47デフォルトの名無しさん:2007/06/25(月) 21:47:18
つうか値渡しでどうやって受け取るんだ
4847:2007/06/25(月) 21:48:37
あぁ読み込みパラメータね

勘違いした ごめんよ
49デフォルトの名無しさん:2007/06/25(月) 21:56:24
const ポインタ渡しするのが普通だな。

小さい構造体の場合は別な事もあるけど、
まあ場合によるな。
5044:2007/06/25(月) 22:21:39
>>46
上司を鼻で笑ってやったら首になりました。
貰ってやって下さい。
51デフォルトの名無しさん:2007/06/25(月) 22:24:29
>>50
早っ!
52デフォルトの名無しさん:2007/06/25(月) 22:24:49
>>50
うちに来い。Cだが、ひどいデスマも無い。
残業代は0だけど・・・
53デフォルトの名無しさん:2007/06/25(月) 22:43:57
>>16-17
15です。
曜日、時間でのバックアップの件でしたが、
お礼遅れてすみません。sleepで行きます。
ありがとうございました。
54デフォルトの名無しさん:2007/06/25(月) 23:02:28
>>49
C++ならconst参照だろ
55デフォルトの名無しさん:2007/06/25(月) 23:03:36
あ、C++ だったか。
大きな構造体って時点で C かと思ってしまってた。
56デフォルトの名無しさん:2007/06/25(月) 23:07:00
C++です。

struct S {
int a;
int b;
int c;
};
という定義の構造体があったとして、

S s = {0};
と書いた場合、b と c が 0 になることは保証されますか?
57デフォルトの名無しさん:2007/06/25(月) 23:09:31
されます。
58デフォルトの名無しさん:2007/06/25(月) 23:16:54
8.5.1p7 に書いてあるね。
int() すなわち 0 で初期化される。
59デフォルトの名無しさん:2007/06/25(月) 23:24:54
>>57,58
ありがとです。
60デフォルトの名無しさん:2007/06/26(火) 01:00:48
C++Builderです。
builderのウィンドウで、タブ(Astandard,Additional,Win32,System,,,)
ってありますが、こういうことする場合は、どんな部品を
使用すればよいでしょうか?
6160:2007/06/26(火) 01:03:49
タブをクリックしたら、なにか表示させたり、
追加、削除もしたいんです。
よろしくお願いします。
62デフォルトの名無しさん:2007/06/26(火) 02:34:19
>>38
あんたの思ってるとおり、しといたほうが安全だよ。
その前に std::exception は別でキャッチしてエラー表示してね。
63デフォルトの名無しさん:2007/06/26(火) 05:55:44
変な状態のままデストラクタが呼ばれたら、
それはそれで危険という気もしなくもない。
どっちがいいのかね?
64デフォルトの名無しさん:2007/06/26(火) 06:36:20
例外と言えば、例外指定って使ってる?
俺は使ってない。
65デフォルトの名無しさん:2007/06/26(火) 08:37:35
正常にインスタンスができたかどうかフラグ持っておけばいいんじゃないか
66デフォルトの名無しさん:2007/06/26(火) 08:41:34
まあ、たとえ例外が起きても
メンバ変数が変にならないように気をつけるべきということで、
キャッチされても問題ないように作るべき、なのかな?
67デフォルトの名無しさん:2007/06/26(火) 08:55:33
>>63,65,66
http://www.boost.org/more/generic_exception_safety.html
http://boost.cppll.jp/HEAD/more/generic_exception_safety.html

「まるで例外は、正しいコードに対するミステリアスな攻撃であり、
我々が自らをその攻撃から守らなければいけないようなものであると
見なされているかのようである。 言うまでもなく、これはエラー捕捉との
健全な関係に繋がらない!」
68デフォルトの名無しさん:2007/06/26(火) 09:00:32
>>64
boost や標準ライブラリの方針によれば、使わないほうがいいってことになる。
http://www.boost.org/more/lib_guide.htm#Exception-specification
69デフォルトの名無しさん:2007/06/26(火) 09:08:14
最適化の問題で使わない方がいいという話もあるのか。なるほど。
70デフォルトの名無しさん:2007/06/26(火) 09:17:40
標準ライブラリで std::exception::what だけ例外的に例外指定を持ってるのは、
catch 中で別の例外起こされたら面倒だからかな?
71デフォルトの名無しさん:2007/06/26(火) 09:23:55
>>67
確かに健全な関係ではないけど、
無視できないんだよなあ。

例外指定を普通使わない以上、
どの関数がどんな例外を投げるか
パッと見分からないことも多いし、
思わぬ例外を投げられたらそれは
ミステリアスな攻撃と思われてもしゃーない気がするよ。

全ての関数が例外を投げる可能性があるって感覚で
プログラムを組むのがいいのかね。
72デフォルトの名無しさん:2007/06/26(火) 09:35:26
>>71
安全側に倒すという意味で、そう思ってかかってもいいだろう。

思わぬ例外を投げられてもきちんと動作するように書くべきだし、
極力そう書くことができるように言語や標準ライブラリが整備されている。
73デフォルトの名無しさん:2007/06/26(火) 09:36:45
>>70
標準ライブラリの中でも throw() はいろんな関数についてるよ。
型付で指定してるのはグローバルな operator new () ぐらいかな?
74デフォルトの名無しさん:2007/06/26(火) 09:44:20
>>73
あ、そうなんだ。
std::exception::what はオーバーライドすることがあるから
目立つってだけのことか。
75デフォルトの名無しさん:2007/06/26(火) 09:46:24
>>72
Joel タンが例外嫌いなのも、そのあたりが気持ち悪いからなんだろうな。
でも、標準ライブラリやキーワードが例外投げる以上、
無視するわけにもいかないと思うんだけどね・・・。
76デフォルトの名無しさん:2007/06/26(火) 10:26:57
>>75
あの話は戻り値についてもいっしょだろ。
ただ単に戻り値でのチェックに慣れているから、
戻り値をチェックしていないコードのほうが見つけやすいって話。

例外に慣れてしまえば、例外安全でないコードは同じぐらい
簡単に見つけられる。ただし現状では、↑の理由で他の人に
伝わらないことが多い。

敢えて言い切ってみたけど、ホントのところはちょっと自信が無い。

新しい言語をデザインするなら、 try ブロックじゃなくって
nothrow ブロックを作ればいいんじゃないかと思う。
「オレはここでは例外が飛ばないと仮定して書くぜ」っていう
ブロックね。
77デフォルトの名無しさん:2007/06/26(火) 10:31:57
どうなんかねえ。
例外をうっかり無視するコードより、
戻り値をうっかり無視するコードの方が危険性は高いと
個人的には思うんだけど。
78デフォルトの名無しさん:2007/06/26(火) 10:35:19
つーかC++の例外が糞で使いにくいだけ
79デフォルトの名無しさん:2007/06/26(火) 10:35:24
例外は「うっかり無視」できないのがいいんだよ。
80デフォルトの名無しさん:2007/06/26(火) 10:43:09
そうそう。
81デフォルトの名無しさん:2007/06/26(火) 11:55:16
例外は戻り値と違って発生源や内容の概要が簡単に特定できるから
エラー→復旧っていう処理に使いやすい

エラーしたら即一連の処理を中断するだけなら戻り値でもいいけど
エラー内容によってstrategyパターンを使って処理を色々と変えるなら
例外の方がやりやすい

と思ったんだけどどうかな?
軽く試してみてちょっと良いかもって思っただけで使い続けられるとは限らないけど
82デフォルトの名無しさん:2007/06/26(火) 14:05:12
std::fstream のコンストラクタに渡すファイル(パス)文字列って、
ネイティブなフォーマットのものなの?それとも POSIX
準拠じゃなきゃいけない?たとえば UNIX では /home/hoge/test.txt
で Windows では C:\home\hoge\test.txt ?

どういうフォーマットのパス文字列を取りうるかに関する
規約って定められてるの??
83デフォルトの名無しさん:2007/06/26(火) 14:39:34
POSIX かんけーねー。
処理系で好きに決めりゃいいべさ。
84デフォルトの名無しさん:2007/06/26(火) 14:48:09
そうか・・・標準の C++ のライブラリではそこまでは
決められていないんだね。 boost::filesystem では
native/ portable が厳密に切り分けられていたので、
fopen や fstream でもそうなってるのかと思った。
85デフォルトの名無しさん:2007/06/26(火) 14:51:43
>>82
const char*なのが困り物

たとえばVC++8.0ではlocale依存の方法でUTF-16に変換する
それ以前ではコードページ依存の方法でUTF-16に変換する
いずれにせよ、NTFSのUTF-16なパスを正しく扱えるとは言いがたい

UTF-16なパス名をちゃんと扱いたければ、fstreamを捨てて
カスタムのストリームバッファを作れという話になるだろう
86デフォルトの名無しさん:2007/06/26(火) 21:17:53
ofstreamやifstreamでファイルを開くとき、
ios::binary指定というのは、意味があるのでしょうか?
コンパイラはg++です。
いままでとくに指定してもしなくても結果は同じになりました。
87デフォルトの名無しさん:2007/06/26(火) 21:23:21
>>86
UNIX系は関係ない。
WIndowsはstd::endlや\nを書き込むと0x0d0x0aになって書き込まれ
読むときは0x0d0aが0x0aになる。
88デフォルトの名無しさん:2007/06/26(火) 21:26:02
ios::binaryしない奴は死ねっていつも思う。
89デフォルトの名無しさん:2007/06/26(火) 21:27:15
>>86
テキストファイルを特別扱いする(というよりC++としては特別扱いしなければならない)環境も結構ある
有名どころではDOS/Windows系のテキストファイルでは改行コードがCR+LFになっていることが挙げられる
そういう環境では、テキストファイル特有の処理を行わせたくないときに、バイナリモードを指定する必要がある
逆にUnix関係では大抵違いがないが、移植性向上のために必要に応じバイナリモードを意識的に使うのは良いことだ

Unixとかでもワイド文字ストリームなら、文字コード変換をどうするかで
テキストモードとバイナリモードの違いが表れるはず
90デフォルトの名無しさん:2007/06/26(火) 23:37:20
while(!feof(fp1)){
ch = fgetc(fp1)
if(!feof(fp1) fputc(ch,temp);
}

ファイルの中身を別のファイルにコピーする場合の例題に書かれていたコードなんですが
whileの式で(!feof(fp1))と記述されているにもかかわらず何故さらにif(!feof(fp1)と書いているのは何故なんでしょうか?
何か意味があるんですか?
whileの式でファイルの末端にきたらループ終了なのでifの式は必要ないように思えるんですが
91デフォルトの名無しさん:2007/06/26(火) 23:44:12
>>90
意味以前にその例題、コンパイルできるか?
92デフォルトの名無しさん:2007/06/26(火) 23:45:19
>>90
fgetc()で読みに行ってみないとEOFだとわからんことがあるから。
その場合、whileの条件式の時点ではEOFではないと判断して
読みに行ってみたらEOFだった(読めませんでした)というカタチになるので
下のチェックが要る。

だがこんなのは糞コード。
while ((ch = getc(fp)) != EOF) putc(ch, temp);
とするがよい。
93デフォルトの名無しさん:2007/06/27(水) 00:12:20
>>92
バイナリファイルを操作する場合は>>90の方がよい
94デフォルトの名無しさん:2007/06/27(水) 00:13:20
>>93
なぜ?
95デフォルトの名無しさん:2007/06/27(水) 00:16:51
>>94
int型と比較した時、EOFと同じ値のバイトが存在する可能性があるから
96デフォルトの名無しさん:2007/06/27(水) 00:17:02
とても初歩的な質問ですが

short i;
long k;
float f;
double d;

としたときに

@ (f+15)/(long)(d-15)
A k+20.0
B (int)d/i

の型(double,longなど…)はどうなるでしょうか?
こういう場合は計算式の中でもっとも高精度な変数の型になると理解すればいいのでしょうか?
97デフォルトの名無しさん:2007/06/27(水) 00:17:55
>>95
あ、chがcharだと仮定しているわけね。
それならば、単にint chと宣言して>>92のコードで良い。
98デフォルトの名無しさん:2007/06/27(水) 00:21:04
>>96
整数拡張、型の昇格
99デフォルトの名無しさん:2007/06/27(水) 00:23:00
というかgetc()の戻り値をcharで受け取る奴がアホ
100デフォルトの名無しさん:2007/06/27(水) 02:13:04
C++でのバイナリファイルの読み書きは、ifstreamのreadとか、ofstreamのwriteを使うんですよね。
気になったのは、どちらも char * を指定するところです。freadは void * だったと思うんですが。。。

ifs.read(reinterpret_cast<char *>(&hoge), sizeof(unsigned)); という感じで、毎回キャストしないといけないんですか?
101デフォルトの名無しさん:2007/06/27(水) 02:27:57
>>100
残念ながらキャストが必要。
毎回キャストするのが嫌なら、適当な関数で包め。
102デフォルトの名無しさん:2007/06/27(水) 04:13:44
別にfread使っても一向にかまわないわけだし。
適材適所。
103デフォルトの名無しさん:2007/06/27(水) 09:36:59
freadはvoid*の代わりに、サイズと数の2つを指定するだろう
104デフォルトの名無しさん:2007/06/27(水) 09:42:16
fread()/fwrite()は(Unixの)read()/write()のインタフェース
真似れば良かったのにな
105デフォルトの名無しさん:2007/06/27(水) 10:16:53
データがBIG ENDIANかLITTLE ENDIANのどちらかで
単純に&hogeで受け取れない場合もあるし。

つまり、CPUとデータの並びが逆の場合。

今回みたいに並びが合ってるのなら、union使えばいいんじゃないか?
106デフォルトの名無しさん:2007/06/27(水) 10:26:23
ネットワークを跨ぐとか、別PCでもそのファイルを r/w するのならエンディアン気にするけど…
たかだか、同じPC内で完結するのならそのまま保存するよね?
107デフォルトの名無しさん:2007/06/27(水) 10:41:33
そりゃファイル仕様に因るべさ。
108デフォルトの名無しさん:2007/06/27(水) 10:49:46
ああ、先にファイル仕様があって(当然エンディアンも明示されてて)それを
読む→(なんかする)→(書く) なら、それに従うしかないね。
109デフォルトの名無しさん:2007/06/27(水) 12:14:06
>>87-89
なるほど、ではテキストでないときには、
ios::binaryを付けるようにします。
110デフォルトの名無しさん:2007/06/27(水) 14:39:49
基底クラスのポインタを継承クラスの動的配列でオーバーライドすることはできませんか?
class Base{
public:
Base(){val0=0;};
virtual ~Base(){};
virtual void show(void){cout << val0 << endl;}
int val0;
};
class Deriv:public Base{
public:
Deriv(){val1 = 1;};
virtual ~Deriv(){};
virtual void show(void){cout << val1 << endl;}
int val1;
};
int main(int argc, char *argv[]) {
Base *test;
int num = 10;
test = new Deriv[num];
for(int i=0;i<num;i++)
test[i].show();
}
を実行すると,main()の中のfor文2回目のループ(i=1)で
0x0041e12c でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x00000005 を読み込み中にアクセス違反が発生しました。 。
というエラーが出ます。
test[0]は無事Derivにオーバーライドできていますが,test[1]以降が不可能なようです。
何か良い方法はないでしょうか?
環境:WindowsXP + VisualC++ Ver.7
111110:2007/06/27(水) 15:02:56
オーバーライドの意味間違ってますね。
何と呼んで良いのか分からないですが、領域確保?
とにかくnewするという意味です。
112デフォルトの名無しさん:2007/06/27(水) 15:11:45
>>110-111
BaseとDerivのメモリ上の大きさが違うのに、配列でどう動けと。
113デフォルトの名無しさん:2007/06/27(水) 15:34:55
無理するなら↓
 ((Deriv *)((char *)test + sizeof(Deriv) * i))->show();
もしくは↓
 ((Deriv *)test)[i].show();
114110:2007/06/27(水) 15:51:45
>>112,113
ありがとうございます。
なんとなく分かりました。
new Deriv[num]が失敗してるのではなく、
forループのなかでのindexの指定が間違ってるということですね。
*testがBase型のポインタなので
test[i]はtest[0]からBaseを基準にアドレスを進めることになるのか。
>>113さんの方法で動きましたけど、
そもそもこういう状況が必要になる設計はまずいでしょうか?
115デフォルトの名無しさん:2007/06/27(水) 16:28:34
>>114
一般的にはまずい。
でも、テンプレートを使って下のようにやればできないことはない。

template<class T>
class poly_array {
 template<class U>
 poly_array(U *ptr, int array_size) : ptr_(ptr), size_(sizeof(U)) ... {...}

 T *get(int i) {return (T *)((char *)ptr_ + size_ * i); }

private:
 T *ptr_;
 size_t ptr_size_;
 ...
};
116デフォルトの名無しさん:2007/06/27(水) 16:34:21
基底クラスへのポインタの配列を作って、
それぞれに対してまたオブジェクトを作っていくのが、
まあ一番安全なのかね。
メモリ管理が複雑になるという点では、
安全とは言えんかもしれんが。

>>115 はちょっと感動したよ。
117デフォルトの名無しさん:2007/06/27(水) 17:51:04
下記を左側の数字のキー値で、ソートしたいです。
(8,x),(2,y),(3,z)・・・
ソートして、
(2,y),(3,z),(8,x)・・・
を出力。(int,std::string)の形です。

どういうデータで扱って、どのような方法がよいでしょうか。
mapとか自動でソートされるみたいですが、
自分で比較して並べ替えたいです。
よろしくお願いします。
118デフォルトの名無しさん:2007/06/27(水) 17:58:37
int, std::string をメンバに持つ構造体の配列?
それなら構造体で < 演算子をオーバーロードするか
比較関数を定義するかすれば
std::sort でソートできるけど。
119デフォルトの名無しさん:2007/06/27(水) 18:00:21
>>117
つ[std::vector]
120デフォルトの名無しさん:2007/06/27(水) 18:12:57
訂正お願いします。
×キー値で、ソート
○キーでソート

>>118
ごめんなさい。
「(int,std::string)」
これは、余計でした。(数字,文字列) なんです。
どのデータに入れて、どんな風に処理するのか知りたいです。

>>119
std::vectorに、キーを入れてソートするんでしょうか?
対応する値は、どうやって対応させて出力を。。。

121デフォルトの名無しさん:2007/06/27(水) 18:19:20
何がしたいのかよく分からない。
int 値はキーで、std::string はキーに対応する値?
std::map を使うのがベストだと思うけど、
std::map を使わない理由は何かあるの?
122デフォルトの名無しさん:2007/06/27(水) 18:22:08
>>117
とりあえず、すんごい単純で愚直な方法。
#include <iostream>
#include <string>
#include <vector>
#include <utility>
#include <algorithm>

typedef std::pair<int,std::string> nspair;
bool cmp(const nspair& a, const nspair& b) { return a.first < b.first; }
int main()
{
    int n;
    std::string s;
    std::vector<nspair> vec;
    while (std::cin >> n >> s)
        vec.push_back(nspair(n,s));
    sort(vec.begin(), vec.end(), cmp);
    for (std::vector<nspair>::iterator i = vec.begin(); i != vec.end(); ++i)
        std::cout << '(' << i->first << ',' << i->second << ')' << std::endl;
}
123デフォルトの名無しさん:2007/06/27(水) 18:25:51
>>116
つboost::ptr_vector
124デフォルトの名無しさん:2007/06/27(水) 18:41:02
>>121
(数字,文字列),,,,
をキーでソートするんですが、どんなデータに格納して
どんな処理をするのか知りたかったんです。

>>122
プログラムも、書いていただきありがとうございます。
数分しかたってないのに。(汗

中身がstd::pairのstd::vectorですか。
typedefの使い方もすごい勉強になります。
ありがとうございました。
125119:2007/06/27(水) 19:10:32
ちっ、プログラムを書いてみたけどstd::pairとstructの違いだけで殆ど同じだから貼るのやめよ。
126デフォルトの名無しさん:2007/06/27(水) 21:01:34
>>124
(数字,文字列) 全体がキーなの?
じゃ、それに対応する値もあるの?
それとも set みたいにキー=値なの?

そして、数字が同じ時には文字列も比較するの?

と、質問攻めになってしまった。
127デフォルトの名無しさん:2007/06/27(水) 21:30:26
結局ポインタって何に使うんですか?
違った名前の変数で同じ値を参照できるってことですか?
でも同じアドレスの値を参照するだけならわざわざポインタの方の変数を作る必要は無い気が・・・・
ていうかそもそもいろんなソースコードを見ててもポインタを使ってるのはあまり見かけませんが・・・・
128デフォルトの名無しさん:2007/06/27(水) 21:32:29
>>127
C はポインタが無ければ配列も関数に渡せない言語です。
129デフォルトの名無しさん:2007/06/27(水) 21:34:24
ポインタ使いまくりw
ポインタを理解していないみたいだが君も知らない内に使ってるよ
130デフォルトの名無しさん:2007/06/27(水) 22:04:33
>>127
scanfを使ったことはないのかい?
131デフォルトの名無しさん:2007/06/27(水) 22:08:35
ポインタより似たような文法上の特徴を持つC++のイテレータの方から覚えた方がいいかもね
概念としては似たようなもんだし、イテレータ理解できるならポインタも理解できるようになるか
どうしてもポインタが駄目ならC++でイテレータから入るのも十分ありだよ
132デフォルトの名無しさん:2007/06/27(水) 22:54:19
ポインタの概念を理解できないレベルでイテレータを理解できるか疑問
133デフォルトの名無しさん:2007/06/27(水) 23:05:18
イテレータ自体がデータをポインタライクに扱うようなもんだしなぁ
134デフォルトの名無しさん:2007/06/27(水) 23:08:52
ポインタのノリでイテレータが使うとそれはそれでバグの元に・・・
135デフォルトの名無しさん:2007/06/27(水) 23:10:27
アドレスがどうのという話が無いぶんイテレータの方が簡単だと思うな
概念的な話より、何が出来るかの方が理解しやすいだろう
136デフォルトの名無しさん:2007/06/27(水) 23:25:39
抽象概念を理解できない香具師にはどっちみち理解できない罠。
137デフォルトの名無しさん:2007/06/28(木) 00:07:25
ポインタがわからない→Javaへ行く
Javaのダメプログラマがまた一人。
138デフォルトの名無しさん:2007/06/28(木) 00:17:46
>>127
a = 5; /* aに対応する箱に5を入れる */
b = a; /* bに対応する箱に、aに対応する箱から取り出した値を入れる */

おんなじaでも式の右辺と左辺ではぜんぜん意味が違うのだが、それを理解してるかな?
物を入れるには箱が必要で、Cで箱そのものを値として取り回すための
仕掛けがポインタだ。
どういう時に必要になるかはいずれ分かる。
139デフォルトの名無しさん:2007/06/28(木) 00:47:44
Cでのポインタの必要性が特に大きいのは、配列や左辺値を渡す手段が
他に存在しないから。関数は全部値渡しだし。
参照渡しが存在するならポインタの必要性は大分減るが、リストや木のような
配列より複雑なデータ構造を扱うようになれば、ポインタの有用性が自然に
理解できるだろう。
140デフォルトの名無しさん:2007/06/28(木) 01:14:41
>>127
関数とのデータ受け渡し時に構造体とかそのまま実体渡すとコピーされるのでメモリの無駄だし速度的にもデメリットがある
それに不定なサイズのデータを扱おうと思ったらポインタ使うと思うが。
141デフォルトの名無しさん:2007/06/28(木) 14:42:29
vc++2005で警告レベルを/W4にした時、
stlのアルゴリズム使って代入処理とかイテレータを用いたコンテナの初期化とかすると
> xutility(1685) : warning C4244: '+=' : '__int64' から '__w64 unsigned int' への変換です。
> データが失われる可能性があります。
とかコンパイラ様が仰られて出力窓がカオスになって困るのでこれをどうにかしたい訳ですが

こういうのは#includeディレクティブの羅列全体に(つまりxutilityを使ってるライブラリ全体を)
#pragma warning(disable:4244)と
#pragma warning(default:4244)やpush, pop使って抑制を適用しちゃっていいんでしょうか?
一応、ライブラリ以外の部分ではちゃんと/W4で警告が行われますし問題ないと思うんですが

なんか良い解決法ってございませんかね?
142デフォルトの名無しさん:2007/06/28(木) 14:47:55
>>141
__w64 は 64 ビットにするんじゃなくて、
32 ビット環境でコンパイルする時にも
もし 64 ビットにしたとしても整合性が取れるかチェックするだけ。

つまり、__w64 unsigned int は 32 ビット環境では 32 ビット符号無し整数型になる。
__int64 は 64 ビット符号付き整数型だから、
そこから 32 ビット符号無し整数型への暗黙変換で警告が出るのは当たり前。

それで本当に大丈夫なのかをまず確認した方がいい。
143デフォルトの名無しさん:2007/06/28(木) 14:53:54
boost::serialization ってクロスプラットフォームで
使ってもおk?つまりできたファイルはプラットフォームを
またいで移動してもおk?たとえば endian の異なる
プラットフォームに持っていっても安全?
144デフォルトの名無しさん:2007/06/28(木) 15:32:13
>>142
なるほど、助言をヒントに
使用するされているイテレータの差の型にsize_tを指定して定義すればあっさりと消えました
どうもです><
145デフォルトの名無しさん:2007/06/28(木) 17:04:11
>>144
> イテレータの差の型
difference_typeのことならstd::size_tよりも
符号付のstd::ptrdiff_tのほうがいい。

it = begin();
it2 = begin();
++it2;
このときit2 - itは1になるはずで、it - it2は-1になるべきだから。
146デフォルトの名無しさん:2007/06/28(木) 17:25:10
>>143
あれの出力形式にはいろいろあって、
バイナリは知らないけど、xmlなら間違いなくできる。
147デフォルトの名無しさん:2007/06/28(木) 17:51:43
API の話ではないが、質問していいですか。
_tprintf(_T("あいう"));
とするとコンソールに正常に表示されないのですが、
どのようにしたら正常に表示できるでしょうか?
148デフォルトの名無しさん:2007/06/28(木) 18:00:43
setlocale(LC_ALL, ""); でできた。
149デフォルトの名無しさん:2007/06/28(木) 22:02:18
イテレータの差ならiterator_traits<hoge_iterator>::difference_typeだろ。
150デフォルトの名無しさん:2007/06/28(木) 23:31:40
板違いで流れてきましたw

01011010みたいに
日付が4桁4桁になってる
8桁の数字一覧の出力方法教えてください
151デフォルトの名無しさん:2007/06/29(金) 00:53:49
>>128-140
関数内で宣言した変数はほかへは渡せないから、同じ中身を参照できるポインタを使って
ほかの関数内でも関数内で変更した変数を渡せるようにするのがポインタですか?
自分で書いててわけがわからない文だな・・・・
とりあえずまだまだ自分は未熟なのがわかったのでまた最初から勉強しなおします!
152デフォルトの名無しさん:2007/06/29(金) 07:50:22
>>150
それは、西暦101年10月10日か、01年1月10日10時なのか、1月1日10時10分なのか、101日目、10時10分なのか、
或いはそれ以外の表現なの?
そもそも一覧とはなんなの?
153デフォルトの名無しさん:2007/06/29(金) 09:46:27
お客様の中にESP能力者の方は・・
154デフォルトの名無しさん:2007/06/29(金) 09:48:43
%04d%02d%02d
155デフォルトの名無しさん:2007/06/29(金) 13:59:10
同じ内容の関数を、マルチスレッドで動かして
ログファイルに処理内容を、追加書き込みで
書き出してます。

std::ofstream ofs( FileName.c_str(), std::ios::out|std::ios::app);
ofs << message;

結構、同じタイミングで書き込むときあると思うのですが、
排他処理したほうがいいでしょうか?

そもそも"ファイルが壊れる"っていうのは、どんな壊れ方があるのでしょうか?

真っ白になっちゃうのか、混ぜこぜで書き込みされる。などですか?
156デフォルトの名無しさん:2007/06/29(金) 14:04:07
>>155
混ざります。しかも、通常バッファリングされるので行の途中でもお構いなしに混ざることになります。
運が悪いと、書き込んだ筈の分がロストしたり以前の分がロストしたりするかもしれません。
157デフォルトの名無しさん:2007/06/29(金) 14:06:54
俺の認識な。
ファイルが壊れる = ファイルアクセスに失敗してしまう。 居るように見えて実体が居なかったりする等

マルチスレッドのロギングで、同期取ってない場合
出力が途中で差し込まれたようなデータ列になる等、意図してないフォーマットで出力されてしまう
158デフォルトの名無しさん:2007/06/29(金) 14:07:57
>>156
混ざるのは、構わないと思ってたのですが
無くなるときもあるんですか。

じゃあ、ファイルロックとかで、ロックするようにします。
ありがとうございました。
159デフォルトの名無しさん:2007/06/29(金) 14:09:19
>>157
ふむふむです。勉強になります。
ありがとうございます。
160デフォルトの名無しさん:2007/06/29(金) 14:12:02
>>157
もみもみです。あぁ〜ん♪
感じちゃう?
161デフォルトの名無しさん:2007/06/29(金) 14:24:45
>>155
使っているlibc++がマルチスレッド対応してるなら(今時なら普通してると思うが)
istream/ostreamの関数呼び出しの単位で排他してくれてるはずだ。
つまり、例えばあるスレッドでoperator<<()が呼ばれた場合、その間は
streambufがロックされるので、streambufの内部状態が壊されることが無い。
ヘルプなどのドキュメントに明記されていないなら、ソースを読むんだね。

ただ、排他はあくまで関数呼び出し単位なので、例えば
ofs << n << ":" << s << endl;
のようなことをやっているコードでは、operator<<()が4回呼ばれている間に
他のスレッドからの出力が割り込む可能性は当然あって、その場合は
出力がぐじゃぐじゃになる。
それを避けたければ、常に1行単位で出力関数を呼ぶようにするとよいだろう。
無論自前で排他をするという手もあるが。
162デフォルトの名無しさん:2007/06/29(金) 14:25:36
バッファリングはどーなのよ
163デフォルトの名無しさん:2007/06/29(金) 14:28:01
>>162
バッファリングを管理しているのはstreambufで、これがstdioのFILEの対応物。
i/ostreamはstreambufへのポインタを保持しており、排他はstreambuf自体を
ロックするような形でやっていることが多いはずだ。

つかソース嫁よ。
164デフォルトの名無しさん:2007/06/29(金) 14:31:06
結局スレッドセーフなカスタムストリームを実装するしか無いなね…orz
165デフォルトの名無しさん:2007/06/29(金) 14:35:55
無いなね
166デフォルトの名無しさん:2007/06/29(金) 14:36:41
OTL
167デフォルトの名無しさん:2007/06/29(金) 14:51:26
>>163
別に聞いたわけじゃない。
>>161のように排他してもバッファリングしてたら意味無いだろ、と
168デフォルトの名無しさん:2007/06/29(金) 14:56:17
アンダーバーで始まる関数
_stprintf_s みたいにアンダーバーで始まる関数があるのですが、
アンダーバーで始まる関数には何がしの意味があってアンダーバーをつけてるのですか?
たとえば、MSによって拡張されたことを示すために付けられたとか
169デフォルトの名無しさん:2007/06/29(金) 14:59:44
バッファへの操作込みで排他処理されてるんじゃないのか?
170デフォルトの名無しさん:2007/06/29(金) 15:03:59
171デフォルトの名無しさん:2007/06/29(金) 15:05:18
って前の _ か
標準じゃないやつにつけるべ
172デフォルトの名無しさん:2007/06/29(金) 15:07:11
MS は独自の拡張関数に _ つけるよね。
173デフォルトの名無しさん:2007/06/29(金) 15:16:35
>>168
アンダーバーから始まる名前は処理系のために予約されている
と規格で決められている
174デフォルトの名無しさん:2007/06/29(金) 15:25:35
>>169
バッファリングされる場合、実際にファイルに書き出されるのはどのタイミングか判って言ってる?
175デフォルトの名無しさん:2007/06/29(金) 15:31:43
それが何か関係あるの?
176デフォルトの名無しさん:2007/06/29(金) 15:33:57
バッファ単位での実書き出し最中に、別スレッド側のバッファ操作はどうなるか
177デフォルトの名無しさん:2007/06/29(金) 15:37:59
失敗するー
だから入出力関数の戻り値は常にチェックしてけって話ですか?
178デフォルトの名無しさん:2007/06/29(金) 15:39:21
同じバッファ使って操作するわけじゃなくて、
別々のバッファで操作しようとしてるの?
179デフォルトの名無しさん:2007/06/29(金) 15:47:23
そりゃ別スレッドなんだからバッファは違うだろう
180デフォルトの名無しさん:2007/06/29(金) 15:49:43
同じファイルに追記するだけなら、
別スレッドで同じオブジェクトを共有して
操作したんでいいんじゃないの?
181デフォルトの名無しさん:2007/06/29(金) 15:58:37
OS管理下のファイル本体
 ↑↓
OS管理下のバッファ
 ↑↓
ライブラリ管理下のバッファ

なんとなくライブラリ管理下のバッファの排他がかかってればうまくいきそうだが…
182デフォルトの名無しさん:2007/06/29(金) 16:00:15
スレッドセーフ版のライブラリを名乗るからには
そうなってんじゃないの?
183デフォルトの名無しさん:2007/06/29(金) 16:59:25
>>167
バッファリングされていようが、何の問題もないよ。
脳内の想像でいい加減なことを言っていないで、ソースを読むかせめて
実験したらどう?
184デフォルトの名無しさん:2007/06/29(金) 17:18:33
>>172
_snprintf() と snprintf() の挙動の違いにしょんぼりした。
185デフォルトの名無しさん:2007/06/29(金) 17:24:42
今のgnustdc++ってMT safeなんかな?
VC++だと、basic_ostream<>::sentryを利用して排他制御をやってるんだが、
3.4.4ぐらいのgccだと、何もやってないように見えるな。
186デフォルトの名無しさん:2007/06/29(金) 17:29:58
もしかして>>167は、同じostreamオブジェクトに複数スレッドから
書き込むのではなく、
同じファイルに複数スレッドから別々のostreamオブジェクト経由で書き込むという
状況を想定してたのか?
無論、その場合はostream内部で排他制御しても何の意味も無いぞ。
187デフォルトの名無しさん:2007/06/29(金) 17:34:42
>>186
>同じファイルに複数スレッドから別々のostreamオブジェクト経由で書き込む
こっちのほうが複雑な排他制御になりそうだな…
188デフォルトの名無しさん:2007/06/29(金) 17:49:39
ログ出力のように行レベルではアトミックであって欲しい&必ず追加書きって
ケースを想定するなら、
例えばUnixだと、O_APPENDでopen()してwrite()一発で1行を書き込むように
している限りは、マルチスレッドだろうがマルチプロセスだろうが、
何の排他制御も要らない。
189デフォルトの名無しさん:2007/06/29(金) 20:46:52
Visual C++ 2005を使用しています。

xmlの書式で書かれたデータがint型の配列に入っているとします。
その配列から、xmlのあるタグ(例えば<script>という文字列)が
あるかどうかを検索したいと思います。

この場合、どのような方法がお勧め(簡単な実装、早い検索)でしょうか?
以下のいずれかを考えていますが、どうでしょうか?
(1) memcmp()を使いながら、<Script>に対応する数字を探していく

(2) string型に変更し、string.find()で探す

そのほかにお勧めの方法はあるならご教授願います。
(2)をすべきなら、どのようにint→stringに変換するのでしょうか?atoiを使うので
しょうか?



190デフォルトの名無しさん:2007/06/29(金) 20:49:38
> xmlの書式で書かれたデータがint型の配列に入っているとします。
ここから既にイミワカンネェ
191デフォルトの名無しさん:2007/06/29(金) 20:56:43
どうやって読み出してきたら、int型配列になるんだ?
ひょっとして、UCS4なのか?
192デフォルトの名無しさん:2007/06/29(金) 21:05:29
xml形式のデータがint型の配列に返ってくるメソッドがあるのです。
void method(int *value)
というメソッドを使うと、valueの中にxmlが返ってくるケースがあります。
xmlデータじゃないのも返ってくるのでint の配列で返ってくるのだと
思います。

すいませんが、教えていただけないでしょうか?
193デフォルトの名無しさん:2007/06/29(金) 21:12:22
エスパー募集中☆
194デフォルトの名無しさん:2007/06/29(金) 21:16:38
intにどうやってxmlを入れるんだ?
195デフォルトの名無しさん:2007/06/29(金) 21:20:22
>>192
だから、その int 配列の中にどういう形式で文字列が入ってるんだ? と。
>>191の言うように UNICODE (しかも32ビットの UCS4)なのか。
コード体系によってその "<script>" だって表現の方法が変わってしまうから、
そこが分からなければ意味がないし(というかそれこそがこの問題の本質)、
そこを君が述べていないので「ESP」とか言われてしまうのだよ、と。
196デフォルトの名無しさん:2007/06/29(金) 21:20:27
無理矢理入れます。処女マンコ犯すように
197デフォルトの名無しさん:2007/06/29(金) 21:21:27
>>195
xmlで入ってます。
198デフォルトの名無しさん:2007/06/29(金) 21:22:01
xmlを扱うなら専用ライブラリ使う、もしくは作るべし
199デフォルトの名無しさん:2007/06/29(金) 21:22:18
ご返信ありがとうございます。
"<?xml" だったら "60 63 120 109 108"とそれぞれの値が
int型の配列に入っております。

String型でデータをもらえればいいのですが、メソッドの仕様の
関係上、int配列でしか受け取れません。
200デフォルトの名無しさん:2007/06/29(金) 21:22:34
もはや釣りにしか見えん
201デフォルトの名無しさん:2007/06/29(金) 21:22:57
なんで言葉で説明しようとするのかね。
データをそのまま貼り付ければいいのに。
202デフォルトの名無しさん:2007/06/29(金) 21:23:48
とりあえず文字列形式に変換してから、
ライブラリ通して解析すべき
203199:2007/06/29(金) 21:23:59
Asciiコードで入っております。
みなさんを混乱させる状況にしてしまってすいません。
204デフォルトの名無しさん:2007/06/29(金) 21:24:23
>>199
漢字が入ってる場合はどういう具合に返ってくる?
205デフォルトの名無しさん:2007/06/29(金) 21:24:42
文字化けして返ってきます。
206デフォルトの名無しさん:2007/06/29(金) 21:25:03
>>205
文字化けじゃわからんから、実例で示せ
207デフォルトの名無しさん:2007/06/29(金) 21:27:33
ってか、漢字ってこの話で関係あるのか?
208199:2007/06/29(金) 21:27:41
返ってくるデータに漢字は含まれないのでわかりません・・・
みなさんを怒らせてしまってすいません。int→stringの文字列
変換を行うことを考えて実装してみます。
本当にすいませんでした。
209デフォルトの名無しさん:2007/06/29(金) 21:28:29
失礼しちゃうわ!
210デフォルトの名無しさん:2007/06/29(金) 21:29:20
>>207
エンコーディングを判別したかったんだが。
XMLライブラリを使うんなら必要なことだろ。
211デフォルトの名無しさん:2007/06/29(金) 21:30:10
asciiって言ってるじゃん。
212デフォルトの名無しさん:2007/06/29(金) 21:31:09
>>211
漢字は文字化けするとも言ってるが。
213デフォルトの名無しさん:2007/06/29(金) 21:32:17
まあ本人がもういいつってんだからどうでもいいやな。
214デフォルトの名無しさん:2007/06/29(金) 21:32:20
>>212
だから、Asciiだから漢字は含まれていないし、
含まれていたらどうなるか分かりませんって言ってるんでしょ。
215デフォルトの名無しさん:2007/06/29(金) 21:32:33
VCのデバッガで見て言ってたんじゃないかな
216199:2007/06/29(金) 21:35:06
たびたび出てきてすいません。
205は私は書いておりません。ASCII文字です。
215さんのおっしゃるとおり、デバッグで確認して
回答していました。
217デフォルトの名無しさん:2007/06/29(金) 21:35:45
失礼しちゃうわ!
218デフォルトの名無しさん:2007/06/29(金) 21:38:01
191が指摘しているとおりなのだが、
intが4バイトならUTF-32、2バイトならUTF-16と見なして構わないはず。
そのまま適当なXMLのライブラリへ投げてしまえ。
219デフォルトの名無しさん:2007/06/29(金) 21:38:19
> xml形式のデータがint型の配列に返ってくるメソッドがあるのです。

> "<?xml" だったら "60 63 120 109 108"とそれぞれの値が
> int型の配列に入っております。

もしかして、単にテキストファイルを読み込んで各文字(ASCII)のコードを
int型の配列に格納しているだけ?
1行ずつとか、ファイル全体とか。XMLの構造に関係なく。
220デフォルトの名無しさん:2007/06/29(金) 21:38:29
質問です。
配列の要素数をキーボードからの入力によって定めさせたい場合、どのような方法があるでしょうか。
int n;
int a[n];
という宣言だとa[n]の宣言がエラーになってしまい、scanfによってnの値を決定した後にa[n]を宣言してみてもやはり「そこで宣言は出来ない」とエラーになってしまいます。
どなたかよろしくお願いします。
221デフォルトの名無しさん:2007/06/29(金) 21:40:02
int *a;
nを読み込む。
a = (int*)malloc(sizeof(int)*n);
222199:2007/06/29(金) 21:42:18
219さんのおっしゃる通りでした。xmlなどの概念を理解せずに
使用してしまって混乱を招いてしまったようです。

>もしかして、単にテキストファイルを読み込んで各文字(ASCII)のコードを
>int型の配列に格納しているだけ?
>1行ずつとか、ファイル全体とか。XMLの構造に関係なく。

この場合、XMLのライブラリを使えるのでしょうか?
223デフォルトの名無しさん:2007/06/29(金) 21:42:21
>>220
CかC++か、どっちだい
Cならmalloc/freeで検索
C++ならnew/deleteで検索、もしくはstd::vectorで検索
でもそのレベルだとnを十分大きく取るって解決策の方が
いいかもしれない
224デフォルトの名無しさん:2007/06/29(金) 21:45:24
>>222
もし非ASCII文字が入っていないなら、>>219の言うとおりにやればいい。
と言いたい所だが、sizeof(wchar_t) != sizeof(int)のときに、
int配列をそのまま処理してくれるXMLライブラリってあるのかな。
俺は知らない。

ただ、非ASCII文字が無いのなら、stringなりchar配列に変換するのは
難しいことでも何でもない。受け取ったint配列の値をそのまま
突っ込んでいくだけだからな。
225デフォルトの名無しさん:2007/06/29(金) 21:45:58
>>199
とりあえずXMLのライブラリを探してきて、その仕様を調べること。
仕様を見て理解できないようなら、まずはC言語の基本とかXMLについてもっと勉強すること。
226199:2007/06/29(金) 21:47:54
みなさん、本当にありがとうございました
(1) XMLのライブラリを調べる、勉強する
(2) int型配列をStringに変換することを考える

で、がんばってみたいと思います。ありがとうございました。
227デフォルトの名無しさん:2007/06/29(金) 21:49:54
100年後にまた会えるといいな
228デフォルトの名無しさん:2007/06/29(金) 21:50:56
真面目にやれば数日後だと思うけど、まあ頑張れ
229デフォルトの名無しさん:2007/06/29(金) 22:01:06
ところでさっきからStringといっているのが気になるが、
もしかして.NET FrameworkのSystem.Stringのことか?
それならUnmanagedMemoryStream + StreamReader + UTF32Encoding
必要ならそれにXmlTextReaderでいいような気がする。
230デフォルトの名無しさん:2007/06/29(金) 22:04:48
>>168 です。
お前ら、ありがトン。
アンダーバーで始まる関数:
アンダーバーから始まる名前は処理系のために予約されている。
そして、これを利用してMS は独自の拡張関数の名前の最初に_ つけている。
ということだな。
231デフォルトの名無しさん:2007/06/29(金) 22:06:12
違うよ?
232デフォルトの名無しさん:2007/06/29(金) 22:14:24
>>231
230でないけど何が違うか教えてください
233デフォルトの名無しさん:2007/06/30(土) 00:58:49
>ということだな。
違うよ?
234デフォルトの名無しさん:2007/06/30(土) 04:16:48
「処理系のために」ではないだろ。
235デフォルトの名無しさん:2007/06/30(土) 07:22:32
ハード的なクリックでは無くソフト側で移動・クリック・入力の繰り返しをさせるプログラムを作りたいのですが
MSDNの見方がよく分からなくてmouse_eventを使うかもしれないという程度しかわかりませんでした・・・

使えるAPI・サンプルなどがあったら教えてください

よろしくお願いします
236デフォルトの名無しさん:2007/06/30(土) 08:39:51
SendInput
237デフォルトの名無しさん:2007/06/30(土) 09:01:14

質問です!!

C言語のボーランドでコンパイルしたら元のメモ帳と、コンパイル後のファイルとって感じでいくつか手元にファイルできますよね。
そのとき作ったメモ帳が消えてしまったのですが(プログラムの実行はできる状態)。
コンパイル後のファイルからもとのメモ帳ってもう見ることができないのでしょうか・・・?

わかる方よろしくお願いします。
238デフォルトの名無しさん:2007/06/30(土) 09:02:16
メモ帳って何だ?
239デフォルトの名無しさん:2007/06/30(土) 09:03:12
んと、メモ帳にmainやらintやら打ち込んで、ボーランドでコンパイルしてコマンドプロンプトで実行って形でやってます。
そのとき書き込んだメモ帳です。
240デフォルトの名無しさん:2007/06/30(土) 09:11:39
先ず最初に、「メモ(すなわちファイル)」と「メモ帳(アプリ)」を区別するところからはじめる必要がありそうだ。
で、あんたはその「メモ」をなんて名前で保存したんだ? そいつはコマンドプロンプトでdirしても見えないのかい?
241デフォルトの名無しさん:2007/06/30(土) 09:15:54
dir でも見えないし、元の場所からは特に動かしてないので・・・
お恥ずかしながら消しちゃったみたいなんです・・・・

コンパイルの逆、みたいなことってできないのでしょうか?
242デフォルトの名無しさん:2007/06/30(土) 09:22:53
>>241
それは無理。
243デフォルトの名無しさん:2007/06/30(土) 09:23:43
う・・・・orz

ありがとうございました。
244デフォルトの名無しさん:2007/06/30(土) 11:32:14
>>234
>17.4.3.1.2
>Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace.
implementationだから処理系でいいんじゃない?
JISの方も処理系て訳されてるし。
245デフォルトの名無しさん:2007/06/30(土) 11:37:12
一応逆コンパイラはあるけど、
元のコードがそのまま出てくるわけじゃないからなあ。
246デフォルトの名無しさん:2007/06/30(土) 11:46:10
デコンパイラでぐぐれ
247デフォルトの名無しさん:2007/06/30(土) 18:46:38
スレッドで、複数の引数を受け取りたいとき、
std::vector<std::string>で渡したいと思ってます。

//スレッド関数
void Thread(void* vector){
 std::vector<std::string> *vec=(std::vector<std::string>*)vector; //エラーでません。正しい?
 vec->clear(); //コンパイルできても、例外がどうのと出て止まります。vec.clear()のつもりです
 printf("%d",*vec[0].c_str()); //これだめです
}
○vectorの関数push_buck(),insert(),clear()など、使用したり、
vec[0]、、、の中の値が知りたいのですが、方法ありますでしょうか。

○vec.clear()とかしたいので、左辺にvecのままにして、いろいろ試しました。
std::vector<std::string> vec=(std::vector<std::string>)vector;
これは、コンパイルできませんでした。右辺がおかしいみたいです。どうすれば。。。
----------------------------------------------------------------

○構造体の場合:
vectorがstd::vectorではなく、自分で作った構造体の場合は、
Data *data = (Data *)vector;
data->hoge;
の要領で、できました。
よろしくお願いします。
248デフォルトの名無しさん:2007/06/30(土) 18:53:01
>>247
たぶんスレッドに引数渡してるところがおかしい。
249デフォルトの名無しさん:2007/06/30(土) 18:54:17
>>247
・C言語の形式のキャストではなく、C++のキャストを使ったほうがいい。
・コール元からThread()に渡したstd::vector<std::string>オブジェクトの寿命は大丈夫?
・vec[0]を見たいなら、std::cout << vec[0]; で良いんじゃない?
250デフォルトの名無しさん:2007/06/30(土) 19:08:19
>>248
複数渡したいとき、構造体か配列などなどとあったので。。。
正直よくわからないです。すみません。

>>249
・C++のキャスト検索してみます。
・std::vector<std::string>オブジェクトの寿命ですか、
 良く、無いものを参照して、プログラム止まります。
 同じ症状なので、これかもしれません!
・vec[0]で、大丈夫ですか。了解しました。
ありがとうございました。
251デフォルトの名無しさん:2007/06/30(土) 19:54:57
>>250
>>249が指摘してるが、多分スタック上に確保したvectorのアドレスそのまま
渡してるだろ。それじゃクラッシュするのは当たり前だ。
252デフォルトの名無しさん:2007/06/30(土) 19:56:01
>>250
ごめん、まちがえた。
× vec[0]
○ (*vec)[0]
253デフォルトの名無しさん:2007/06/30(土) 20:32:10
  //void* のポインタキャスト行ったりきたり実験
  std::vector<std::string> vec2;
  vec2.push_back("hoge" );
  void *vo=(void *)&vec2; //void*型、準備OK
  //ここから、スレッドの関数で受け取ってから、std::vector<std::string>に戻す。
  std::vector<std::string> *vec=(std::vector<std::string> *)vo;//キャストしました。
  std::vector<std::string> vec3=*vec;
  cout << vec3[0].c_str()<< endl;
  cout << (*vec)[0].c_str()<< endl;//おまけ。std::vector<std::string>にしなくても、これでもいい。
これは、正常に動きました。キャストの仕方とか大丈夫みたいなので、
参照しようと思ったデータが無いみたいです。

>>251
>多分スタック上に確保したvectorのアドレスそのまま
>渡してるだろ。それじゃクラッシュするのは当たり前だ。
スタック?検索すると、
”処理中のデータや戻りアドレスなどを一時的に退避する場合に使うことが多い”
ってありました。
vectorは使用しなくなると自動的に、
開放しちゃうっていう、あれのことでよかったでしょうか?
254デフォルトの名無しさん:2007/06/30(土) 20:38:10
なぜ新訂版More Effcitive C++の訳本は糞なのでしょうか?
255247:2007/06/30(土) 20:39:16
vector、map、pairなど、いろいろあると思いますが、
こういうの使いたいときは、どうすればよいでしょうか?

自動で開放してくれなくても、いいので
構造体使うのが、わかりやすいですか。
256デフォルトの名無しさん:2007/06/30(土) 20:42:28
>>253
> vectorは使用しなくなると自動的に、
> 開放しちゃうっていう、あれのことでよかったでしょうか?

ほんとに意味を分かって言ってる?
Javaなどのガベージコレクションと勘違いしないか?

ここで問題にしてるのは、C/C++で関数(またはブロック)内で宣言した変数は
その関数(またはブロック)を抜けると破棄されるということ。
いつの間にか勝手に消えるわけじゃない。
257デフォルトの名無しさん:2007/06/30(土) 20:51:30
使用しなくなったら開放、って理解でいいと思うよ。
考えるな感じるんだ。
258デフォルトの名無しさん:2007/06/30(土) 20:57:05
>>255
vector, map, pairなどはそれぞれ特徴が異なる。
データ同士の意味的なつながりとか、検索/更新の方法や性能など。
複雑なデータの管理をするときに、その使用方法にあったデータ構造を選択すればいい。

単にいくつかの型が異なるデータをひとまとめにして扱いたいだけなら
構造体でいい。
259デフォルトの名無しさん:2007/06/30(土) 20:57:17
あぁ〜ん!感じちゃう♪
260247:2007/06/30(土) 21:12:13
>>256
詳しい解説ありがとうございます。
>>257
どもです。^^
>>259
261デフォルトの名無しさん:2007/07/01(日) 03:24:35
何を突っ込もうとしてたんだ、>290にw
262247:2007/07/01(日) 06:54:52
>>258
255って、自分でした。
構造体でよかったですか。ありがとうございます。
263デフォルトの名無しさん:2007/07/01(日) 10:16:49
template<class T> inline void ZeroMem(T& dest) {
memset(&dest, 0x00, sizeof(T));
};
っていうのを作ったんですがこれって危険でしょうか?
264デフォルトの名無しさん:2007/07/01(日) 10:18:02
めっちゃ危険
265263:2007/07/01(日) 10:19:58
用途はwinapiで使う構造体の初期化です
一応実際のものは、POD以外渡すとコンパイルエラーになるようにboost::type_traitsとか作って
細工してあります
266デフォルトの名無しさん:2007/07/01(日) 10:30:09
>>265
クラスの中に、newなどで確保済みポインタがあったらどうするんだい?
267デフォルトの名無しさん:2007/07/01(日) 10:36:33
それはそういうのを渡さないように気をつけるとしか。。。
でもそんな事いったらmemsetも使えませんし
MSG msg;
msg.hwnd = 0;
msg.wParam = 0;
とか打っていくのが面倒なんで考えたので
初期化済みかどうかを判別する方法があればいいのですが
268デフォルトの名無しさん:2007/07/01(日) 10:39:35
>>267
MSG msg = {0}; // 全部 0 で初期化
msg = MSG(); // 全部 0 を代入
269デフォルトの名無しさん:2007/07/01(日) 10:42:44
そういう手があったんですね、トンクスです
270デフォルトの名無しさん:2007/07/01(日) 10:44:03
何がトンクスど、トランクスか
271デフォルトの名無しさん:2007/07/01(日) 10:44:04
こんなことも知らない奴がboost::type_traitsとか使ってんの蚊


釣りかと思った
272デフォルトの名無しさん:2007/07/01(日) 10:56:34
一年ほど前に使った記憶はありますが
boostやpstadeと格闘している間、
構造体の初期化なんて殆ど使わなかったので忘れていました
ま、実質知らないのと同じですね^^^;
273デフォルトの名無しさん:2007/07/01(日) 10:58:34
^^^何だこれは3つ目小僧か
274デフォルトの名無しさん:2007/07/01(日) 12:48:20
どうしてC++にはコンストラクタとデストラクタがあって
デコンストラクタはないのなぜ?
275デフォルトの名無しさん:2007/07/01(日) 12:53:36
>>274
デコンストラクタって何ですか?デストラクタと同じものではないですか?
276デフォルトの名無しさん:2007/07/01(日) 12:53:41
Con structor
De structor
277デフォルトの名無しさん:2007/07/01(日) 12:53:49
con-struct-erとde-struct-erだから
説明になっていないけど
278デフォルトの名無しさん:2007/07/01(日) 12:53:51
デコンストラクタ = デストラクタ って考えちゃダメなの?
名前が違うだけやん
279デフォルトの名無しさん:2007/07/01(日) 12:55:19
15秒で4レスついてるw
280デフォルトの名無しさん:2007/07/01(日) 13:00:42
すみません
int a[] = new int[10];
int *b = new int[10];
みたいに確保したときって
delete a;
delete a[];
delete b;
delete b[];
それぞれ解放の仕方で動作おかしくなりますか?

281デフォルトの名無しさん:2007/07/01(日) 13:06:03
delete a;  アウト
delete a[]; アウト
delete b; アウト
delete b[]; アウト
282デフォルトの名無しさん:2007/07/01(日) 13:08:16
これもアウトだ。
int a[] = new int[10];
283デフォルトの名無しさん:2007/07/01(日) 13:08:56
>>275
デコンストラクタは脱構築です
ただの破壊ではありません
ポストモダンなのです

たぶん
284デフォルトの名無しさん:2007/07/01(日) 13:09:01
>>274
「デコンストラクタ」はただの誤用だろ。

と思ったらこんなところにも。
http://msdn2.microsoft.com/ja-jp/library/sxbac7x8(vs.80).aspx

原文はちゃんと destructor なのにね。
http://msdn2.microsoft.com/en-us/library/sxbac7x8(vs.80).aspx

いちおう deconstruct という言葉も存在するらしい。
http://ja.wikipedia.org/wiki/%E8%84%B1%E6%A7%8B%E7%AF%89
285デフォルトの名無しさん:2007/07/01(日) 13:09:57
>>280 自分で試してから聞けよカス
286デフォルトの名無しさん:2007/07/01(日) 13:38:11
>>285
それは禁句だよ。
new[]してdeleteのような正しくないのに環境によっては動くものを
正しい方法だと思ってしまう可能性がある。
287デフォルトの名無しさん:2007/07/01(日) 13:40:29
配列のnew deleteは
T* v = new T[n];
delete [] v;
でおkなはず
288デフォルトの名無しさん:2007/07/01(日) 13:46:31
いやここでstd::vectorとか言い出してやる。
289デフォルトの名無しさん:2007/07/01(日) 13:48:11
valarrayの事も時々でいいから思い出してあげてください
290デフォルトの名無しさん:2007/07/01(日) 13:49:43
>>286
今回はそれ以前の話。コンパイルできないのがダメ。
291デフォルトの名無しさん:2007/07/01(日) 13:50:45
shared_arrayでいいんジャマイカ
292デフォルトの名無しさん:2007/07/01(日) 14:00:49
いつものパターン:
書く → ビルド → エラーの数が100を超え(ry → (´・ω・`) → 少しずつ直していく 
→ コンパイラ通過 → \(^o^)/ →実行時エラー → /(^o^)\ナンテコッタイ
293デフォルトの名無しさん:2007/07/01(日) 14:03:35
delete b;
は正常に動作する。
今回に限ってはメモリリークを起こさない。
ただ、b[1]〜b[9]のデストラクタが呼び出されないので、
プリミティブ型以外では動作保証ができない。
いかなる場合においても、new[]で確保したら、かならずdelete[]で解放すること。

だったっけ?
294デフォルトの名無しさん:2007/07/01(日) 14:10:41
>>291
たまにはscoped_arrayのことも思い出してあげてください……。
295デフォルトの名無しさん:2007/07/01(日) 14:15:44
>>293
いや違う。
未定義動作でFA。
296デフォルトの名無しさん:2007/07/01(日) 14:29:41
>>293
デストラクタがあったらメモリの開放に失敗して落ちる環境がほとんど。
297デフォルトの名無しさん:2007/07/01(日) 14:33:54
delete bで開放するのいいけど

その後メモリ取ろうdeleteした近辺にnewなんかされると
悲惨なことになるぞw
298デフォルトの名無しさん:2007/07/01(日) 14:35:24
>delete bで開放するのいいけど
良くない
299デフォルトの名無しさん:2007/07/01(日) 14:39:20
言語的にだめなのは分かるんだけど
PODの場合で
new[]で確保したのをdeleteでシメた場合に
実際に不具合があるような実装って
おおいの?
300デフォルトの名無しさん:2007/07/01(日) 14:39:43
結論としては色々とややこしいから最初は配列なんか使わずにコンテナつかっとけってこと?
301デフォルトの名無しさん:2007/07/01(日) 14:41:50
>>300
でも
const char *bad_words[] = { "fxxk", "pxxsy", "axxl", "cxxt", ... };
みたいなのは配列が便利じゃね?
302デフォルトの名無しさん:2007/07/01(日) 14:42:36
>>299
すくないとか言ったら使いそうだから言わない。
303デフォルトの名無しさん:2007/07/01(日) 14:43:38
>>302
いや、実は見たこと無いから聞いてみたんだけど(ボソッ)
304デフォルトの名無しさん:2007/07/01(日) 14:45:28
見たことないけど、
将来デバッグモードで変なことするコンパイラが
出てくる可能性もなくはないと思う。
305デフォルトの名無しさん:2007/07/01(日) 14:46:14
>>299 それは実装に不具合があるわけじゃねーぞ。
306デフォルトの名無しさん:2007/07/01(日) 14:47:44
>>305
落ちるとかバグるとかそういう環境は多かったりするのか?
という話なわけで。
307デフォルトの名無しさん:2007/07/01(日) 14:48:13
>>305
いや勿論そういう意味じゃなくて、
メモリが解放されなかったり
ヒープが壊れたり
無限ループに陥ったり
ハードディスクが初期化されたり
といった問題が生じるかどうか、という意味
308デフォルトの名無しさん:2007/07/01(日) 14:51:56
>>301
new[]で確保するのでなければ別に構わないと思う。
309デフォルトの名無しさん:2007/07/01(日) 14:56:57
>>307
そんな問題が生じたこともないし生じるようにも思わないが生じる可能性はある。
310デフォルトの名無しさん:2007/07/01(日) 15:10:03
int a[] = new int[10];

何が問題なの?
311デフォルトの名無しさん:2007/07/01(日) 15:12:32
そもそもコンパイラ通らないだろ
312デフォルトの名無しさん:2007/07/01(日) 15:12:34
>>310
コンパイルエラー
313デフォルトの名無しさん:2007/07/01(日) 15:13:58
まずコンパイルしてからなんか家w
314デフォルトの名無しさん:2007/07/01(日) 15:15:37
int a[] =(int[]) new int[10];
315デフォルトの名無しさん:2007/07/01(日) 15:21:46
C、C++の基本的なことは勉強してきました。
それで簡単なGUIアプリから作ってみたいのですがVisual C++とDelphiで迷っています。
DelphiだとPascalを勉強しなければいけないそうですが大変でしょうか?
C、C++が無駄になりそうで怖いですが。
C++を勉強してきた場合、Visual C++のほうがいいでしょうか?
316デフォルトの名無しさん:2007/07/01(日) 15:21:52
コンパイルエラー
317デフォルトの名無しさん:2007/07/01(日) 15:23:32
>>315
C/C++ 勉強したなら VC++ 使えば?
318デフォルトの名無しさん:2007/07/01(日) 15:26:37
そしてうっかりCLRアプリケーションのプロジェクトを選択して
C++/CLIを勉強する羽目に。
319デフォルトの名無しさん:2007/07/01(日) 15:27:10
>>315
どれくらいのレベルか知らないが、勉強のためVC++をススメておく
DelphiでもCやC++で勉強してきた基礎は無駄にならないと思うけどね
320デフォルトの名無しさん:2007/07/01(日) 15:27:41
Delphi には将来性が・・・
321デフォルトの名無しさん:2007/07/01(日) 15:29:13
int *a[] = new int[10];
322デフォルトの名無しさん:2007/07/01(日) 15:29:48
int *a[|] = new int[00];
323デフォルトの名無しさん:2007/07/01(日) 15:32:27
int **a = new int*[10]

for( int i = 0; i < 10; ++i )
  a[i] = new int;

for( int i = 0; i < 10; ++i )
 delete a[i];

delete [] a;
324デフォルトの名無しさん:2007/07/01(日) 15:33:57
int (*a)[10] = new int[10][10];
delete[] a;
325デフォルトの名無しさん:2007/07/01(日) 15:35:19
delete[] you;
326デフォルトの名無しさん:2007/07/01(日) 15:40:56
Segmentation fault (core dumped)
327デフォルトの名無しさん:2007/07/01(日) 15:52:25
std::vector<int> a(10);
328デフォルトの名無しさん:2007/07/01(日) 15:53:19
std::vector<inpo> you(10);
329デフォルトの名無しさん:2007/07/01(日) 17:10:26
struct A { int x; };みたいなのをA a;と宣言してこれを
std::cout << a;のようにした時にメンバであるxの値を出力するように変換関数を定義したいんですが
どうすれば良いんでしょう?
operator std::string();とやってみましたが変換できないようです
330デフォルトの名無しさん:2007/07/01(日) 17:16:12
>>329 operator << (std::ostream&, A const&)
331デフォルトの名無しさん:2007/07/01(日) 17:16:22
std::ostream& operator<<(std::ostream& os, A& a) {
 os << a.x;
 return a;
}

A内で上の関数をfriend宣言しておく
332デフォルトの名無しさん:2007/07/01(日) 17:17:31
>>331 friend は要らんだろ
333デフォルトの名無しさん:2007/07/01(日) 17:20:35
>>329
cout << static_cast<std::string>(a);
とやるか、
std::ostream& operator<<(std::ostream& os, const A& a) { return os << a.x; }
でも定義汁
334デフォルトの名無しさん:2007/07/01(日) 17:28:57
皆様の回答を参考にぐぐったら出てきました
ttp://www.higlab.k.dendai.ac.jp/~numata/index.php?C%2B%2B%A5%E1%A5%E2#w5403b76
なるほどオーバーロードとfriendの複合技ですか、さらにostreamを戻す事で連結も可能と…
かなり使えそうな方法ですね、助言ありがとうございました!
335デフォルトの名無しさん:2007/07/01(日) 17:40:54
>>334
ここまで必要になるか分からないけど、

class A {
public:
 virtual void print(std::ostream &os);
};
std::ostream& operator<<(std::ostream& os, const A& a) { a.print(os); return os; }

とやった方が、もしかしたらいいかもしれない。
こうすると継承クラスでprintを再定義できる。
336334:2007/07/01(日) 18:02:45
>>335
なるほど継承ですか、実行時の多態性については意識し取りませんでした
確かにこの振る舞いをもたせたいのがAだけに限るわけではないですしね
とりあえず参考にしてNVI使ってこうやってみました

// 構造体A周辺の定義
struct Base {
public: void print(std::ostream& os) const { _print(os); }
private: virtual void _print(std::ostream& os) const =0;
};
struct A : public Base {
private: void _print (std::ostream& os) const { os << x; }
public: int x;
};
std::ostream& operator<<(std::ostream& os, const Base & base)
{ base.print(os); return os; }

// 使用例
#include <iostream>
int main() {
    A a;
    a.x = 1;
    std::cout << a;
}

…しかし鶏を捌くのに牛刀をなんとやらですね
実際に使うとなればここまでする必要も出てきそうな気もせんでも無いですが
337デフォルトの名無しさん:2007/07/01(日) 18:27:37
この場合のNVIって何の意味があるの・・・?
338デフォルトの名無しさん:2007/07/01(日) 18:29:47
最近おぼえて使いたくなったんだろ。気にするな。
339デフォルトの名無しさん:2007/07/01(日) 18:35:35
NVI
ってなんですか?
340デフォルトの名無しさん:2007/07/01(日) 18:40:11
>>339 ググレカス
341デフォルトの名無しさん:2007/07/01(日) 18:49:35
NVI=non virtual interface のこと。つまり↓
struct Hoge {
 void hage(T1 arg1, T2 arg2) {_hage(arg1, arg2); }
protected:
 virtual void _hage(T1 arg1, T2 arg2) = 0;
};
下位クラスには_hageを継承してもらう。

なぜこんなことをするのか)
公開仮想インターインターフェイスが果たす目的は以下の二つ(と言われてる^^)
 1. 使う人に使い方(インターフェイス)を提供する
 2. 派生クラスに「こういうふうにメソッドを継承して下さい」とカスタマイズの規約を提供している

たとえば、NVIを使わず下位クラスがhageをそのまま継承してしまうと
Hoge#_hageのインターフェイスを変更したときに下位クラスすべてのメソッドを書き直す必要があるんだけど、
もしNVIを採用していればそういうことにはならない。
逆にインターフェイスを変更せず、実装メソッドの方だけを変更することもできる。

>>336の場合、インターフェイスが変更される可能性は全く無くて、無駄に複雑にしてるだけだと思う。
342デフォルトの名無しさん:2007/07/01(日) 18:52:31
そもそも値型のクラスの継承はあまり宜しくない
343デフォルトの名無しさん:2007/07/01(日) 18:54:58
値型のクラス???
344デフォルトの名無しさん:2007/07/01(日) 19:11:16
Value classの事
・publicなデストラクタとコピーコンストラクタと代入演算子を持ち
・デストラクタを含め仮想関数を持たなくて
・具象クラスであり抽象クラスでない
・スタック上や他のクラスのメンバとしてインスタンス化される
とまぁおおよそ組み込み型のように振舞えるものでこういうのは継承じゃなくて委譲を使うべきらしいけど、
実際のところはそれが妥当なのか場合によるからよくわかんねけど
俺は複雑な構造体を継承してえらい目にあったので「あまり宜しくない」と思うようになった
ちなみに出展はmore effective C++あたりだったと思う
345341:2007/07/01(日) 19:23:42
>>344
Value classなんて初めて知った。
全部が全部ってわけじゃないけど、ほとんどは>>344のいうとおりだろうね。

ただ、サンプルプログラムでそういうことを考えちゃうと
バーチャルなデストラクタや、privateなoperator =を書く必要が出てきて
全体的に焦点がぼやけてしまいまふ。
>>341ではとりあえずそういうことは無視させてもらいますた^^
346デフォルトの名無しさん:2007/07/01(日) 19:29:32
>>344
そんな区別意味無いだろ。
public なデストラクタが virtual じゃないクラスを継承したのが間違いだったんじゃないの?

value class って用語も検索結果が日本語ページ多すぎで胡散臭いし。
347デフォルトの名無しさん:2007/07/01(日) 21:00:20
値のセマンティクスを持つクラスと言いたいのでは?
ググったらこんなページを見付けたが、こういう話だろう。
http://www.ogis-ri.co.jp/otc/hiroba/technical/CppDesignNote/
348デフォルトの名無しさん:2007/07/01(日) 21:09:43
つうかそういうクラスはそもそも継承を前提に作ってないだろ

他言語ならsealedクラスになってるタイプのクラス
349デフォルトの名無しさん:2007/07/01(日) 21:29:11
>>342に戻ると
良いサンプルってやっぱ難しいんだね
350デフォルトの名無しさん:2007/07/01(日) 21:33:35
複雑なものを扱うためのテクニックを簡単なサンプルで見せても
無意味にしか見えんからのう
351デフォルトの名無しさん:2007/07/01(日) 22:17:49
とりあえず、NVIならこの程度のサンプルでも十分通用するね
352デフォルトの名無しさん:2007/07/01(日) 22:18:38
NVIってExceptional C++で勉強しましたか?
353デフォルトの名無しさん:2007/07/01(日) 22:22:03
Exceptional C++―47のクイズ形式によるプログラム問題と解法
Exceptional C++ Style―40のクイズ形式によるプログラム問題と解法=スタイル編 Exceptional C++ Style―40のクイズ形式によるプログラム問題と解法=スタイル編

これって何が違うんでしたっけ?
354デフォルトの名無しさん:2007/07/02(月) 00:12:21
4バイトint型 num = 10,000,000の16バイト表現を、
ビッグエンディアンで
char型 d[10]のd[5]〜d[8]の各要素に格納したいと思っております。

numを表現する4バイトそれぞれの値を取得するためには
どうすればいいのでしょうか?
char *p = (char *)num; // numのポインタを取得
d[5] = p; // 1Byte分の値を取得
p++; // charのポインタなので1Byte分ポインタを変更
とやることを考えたのですが、pの値がおかしな値になります。

どのようにコーディングするとよいでしょうか?
355デフォルトの名無しさん:2007/07/02(月) 00:14:59
char *p = (char*)#
の間違いだと思うのだがどうよ
356デフォルトの名無しさん:2007/07/02(月) 00:17:24
たびたび、すみません。
スレッドに複数の引数を渡したい者です。

//スレッド関数
void Thread_f(void* StructData){
 //何にもしないスレッド StructDataは、下で出てくるData構造体
}

メインのほうで、スレッド作成
Data data; //Dataっていう複数の引数を渡すための構造体
for(int i=0;i<n;i++){
  data=datalist[i];//datalistは、Data構造体のポインタ配列 代入してから渡してます
  handle[i] =(HANDLE) _beginthread(CameraThread,0, (void *)&data);
  Sleep(3000); i++;
  //スレッド立ち上げてる間に、全部スレッド側で全部datalist[n]になってしまうので。
  //ちょっとSleepしました。すごいダメな処理です。すみません。 
}
n=1のときは、エラーでないです。
nが2より大きいと、動くことは動きますが、×(ウィンドウの閉じるボタン)
で閉じると、
-ElnvalidPointerクラスの例外を生成しました。
-'無効なポインタ操作'
-プロセスは停止しています。・・・・
というエラーがでます。
”同じポインタを 2 回破棄したり,すでに破棄したポインタを参照したりすると出る”
とネットの掲示板でありました。

同じ関数のスレッドに、それぞれ違うdataを渡したいときは、スレッド関数に引数渡さないほうがいいですか?
248さんが言ってたのは、このことかなぁと思って、今は、引数渡さない方法でやってますが。

上記のプログラムに、手を加えてエラーで無い方法ないでしょうか。
357デフォルトの名無しさん:2007/07/02(月) 00:21:55
あっ、CameraThreadは、ほんとの関数名でした。
Thread_fに、訂正お願いします。
358デフォルトの名無しさん:2007/07/02(月) 00:23:23
>>356
だから、スタック上のオブジェクトのポインタをスレッド関数に渡すなと。
呼び出し側のコンテキストが平然と進行しつづけてスコープ抜けた瞬間に
無効になっちゃうだろが。

malloc()やnewでフリーストア上にオブジェクトを確保して、その
ポインタを渡すんだな。無論渡されたスレッド側で不要になったら
破棄すること。

本当はC++使ってるんなら、スレッドをラップするクラスを作るのが良いが
それはまあいい。
359354:2007/07/02(月) 00:23:58
>355
ご指摘どおりです。
char *p = (char *)# // numのポインタを取得
d[5] = *p; // 1Byte分の値を取得
p++; // charのポインタなので1Byte分ポインタを変更
d[6] = *p;
p++;
・・・

としているのですが、値が正常にとれません・・・
360デフォルトの名無しさん:2007/07/02(月) 00:32:53
>>358
レスありがとうございます。
new演算子は、Dataをでしょうか?
Data *datalist = new Data[N];
これで処理してます。
361デフォルトの名無しさん:2007/07/02(月) 00:34:23
>>360
それなら、そのdetalistをそのまんま(void*にキャストして)渡せばいい
362デフォルトの名無しさん:2007/07/02(月) 00:42:56
>>361
data=datalist[i];
これを、なくして
handle[i] =(HANDLE) _beginthread(CameraThread,0, (void *)&datalist[i]);
ということですよね。
これでも、同じ症状です。

dataにコピーしてから、渡すとエラーが消えるかも、
と思って入れたおまじないの処理なんです。
363デフォルトの名無しさん:2007/07/02(月) 00:46:27
>>362
ちょっとまて
意味わかんなくなってきた

スレッドをN個起動してて、i番目のスレッドにdatalist[i]を渡したいのか
だがそれだと、datalist[]の破棄はどうする?
いつどこで誰がやってるんだ?
364デフォルトの名無しさん:2007/07/02(月) 00:48:21
今日ここで俺がやる
365デフォルトの名無しさん:2007/07/02(月) 00:55:11
メインの方で、スレッドの処理が終わるのを、待ってからです。

スレッドが終わるまで待ちます。
for (int i=n; i>0; i--){
 while(WaitForMultipleObjects(n, (CONST HANDLE *)handle,TRUE, 500) == WAIT_TIMEOUT){//タイムアウトなのでループ}
}
delete data;
366デフォルトの名無しさん:2007/07/02(月) 00:57:35
>>365
datalist じゃないのか? delete [] じゃないのか?
367デフォルトの名無しさん:2007/07/02(月) 01:03:11
>>365
その i でまわしてる for ループは何のつもり?
WaitForMultipleObjects() で全部待つんだろ?
あと、戻り値はちゃんとチェックしろよ。

(CONST HANDLE *) とかいうキャストも要らんだろ?
っていうか前のコードから要らないキャスト多すぎだ。
368デフォルトの名無しさん:2007/07/02(月) 01:04:02
お手数かけてすみません。
delete datalist;
です。
369デフォルトの名無しさん:2007/07/02(月) 01:04:48
>>365
よくわからんが、メモリバリアを_beginthreadex()の前後あたりに
挿入すると状況が改善されるかも
370デフォルトの名無しさん:2007/07/02(月) 01:05:24
>>368
それじゃダメだ。 delete [] 使え。理由は聞かずにちょっと前のログを見ろ。
371デフォルトの名無しさん:2007/07/02(月) 01:27:44
while(WaitForMultipleObjects(n, (CONST HANDLE *)handle,TRUE, 500) == WAIT_TIMEOUT){}
スレッドが終わったっていう合図以外は、ここでループしてます。
タイムアウト以外というコメント不正確でした。
forで、n回繰り返すと、n個のスレッドが終了するのを待ったことになります。



delete datalist [];
deleteの使い方理解していないので、
ちょっと時間掛かるかもです。構文エラーとか出てきます。
372デフォルトの名無しさん:2007/07/02(月) 01:29:11
構わんよ、おつまみみたいでみんな喜んでるみたいだし
373デフォルトの名無しさん:2007/07/02(月) 01:29:40
delete [] datalist;
ああ、反対でした。
同じエラー出てきました。
374デフォルトの名無しさん:2007/07/02(月) 01:36:17
>>371
> forで、n回繰り返すと、n個のスレッドが終了するのを待ったことになります。

WaitForMultipleObjects() の第3引数は BOOL fWaitAll で TRUE の時は
その呼び出しで全部待つ。戻り値にはエラーもある。仕様をちゃんと見て使え。
375デフォルトの名無しさん:2007/07/02(月) 01:43:53
delete [] datalist;
コンパイル通りました。

-ElnvalidPointerクラスの例外を生成しました。
-'無効なポインタ操作'
-プロセスは停止しています。・・・・

やっぱり、これが出てきてしまいます。。。
スレッド1個(n=1,N=1)にすると、大丈夫なんですよね。

あと、>>356で、Sleepの次i++が入ってまずが
頭がおかしくなって、入力してしまったのかもしれません。
すみません。
376デフォルトの名無しさん:2007/07/02(月) 01:47:27
疲れてるなら休めば?スッキリしてないと頭の回転悪いよ
377デフォルトの名無しさん:2007/07/02(月) 01:51:18
ぶっちゃけそのレベルで
メダパニとラリホーかけられてちゃ
どんな間違いやってても不思議じゃないな
378デフォルトの名無しさん:2007/07/02(月) 02:02:34
>>374
ありがとうございます。
WaitForMultipleObjectsで、苦労したんですが
なんか思い出だしてきました。


結局、スレッドの方では、なんにもしてないので、
newで渡すのがだめな気がしてきました。
379378:2007/07/02(月) 02:14:02
今日は、ちょっとギブアップします。
ありがとうございました。
380デフォルトの名無しさん:2007/07/02(月) 09:25:30
>>315
間取ってC++Builder使えばいいんじゃね?
381デフォルトの名無しさん:2007/07/02(月) 09:42:53
>>332
A内でfriend宣言しておかないとA.aのように参照した場合
もしaがprivateやprotectedだった場合エラーになる。
382デフォルトの名無しさん:2007/07/02(月) 09:55:23
>>381
この場合はstructで全部publicだから要らんと言われてただけでしょ
383378:2007/07/02(月) 10:18:40
378です。
シンプルなプログラムを別に作って、
new演算子でも大丈夫なこと確認しました。

それで、本物の方のプログラムの方をGUIの部品とか
1個ずつはずしていって、シンプルなプログラムに近づけていったところ。。。
(6時間後・・・)

void __fastcall TForm1::Button17Click(TObject *Sender)
{
//なにもしないボタンです。これから実装します。
}
ボタン17を削除して、またボタン作ったら
なぜか閉じるボタンで、ポインタエラーがでなくなりました。
ということで、new演算子で渡しても大丈夫みたいです。
ありがとうございました。
384デフォルトの名無しさん:2007/07/02(月) 13:07:16
VC7でswitch内で

 switch (val)
 {
//コメント
 //コメント
 case 1:
  〜〜
  break;
 }

こんな感じでcaseの上に複数コメントがあるブロックが多いと、
デバッグの時のブレークポイントや、実行時の位置が
おかしくなることがあるみたいなんですが、どこかに詳細な
報告はありませんか?
検証が甘いですが、VC2005でも同じ現象が起こるみたいです。
385デフォルトの名無しさん:2007/07/02(月) 14:12:08
int (*a)[] = new int[10];
386デフォルトの名無しさん:2007/07/03(火) 17:39:39
質問です。

Foo::Foo() : m1(), m2(), m3() {}

このようなFooクラスのコンストラクタにおいてm2のコンストラクタが例外を投げたとき、
既に初期化が完了していたm1のデストラクタが呼ばれることは「C++の規格で保障」されているのでしょうか?

VC++2005で確認した限りではその通りの動作をするようですが…
387デフォルトの名無しさん:2007/07/03(火) 17:44:42
保証されてる。

Foo::Foo() try : m1(), m2(), m3() { } catch(...) { }

みたいにしてキャッチすることもできるけど、
例外は必ず再送出される。
388386:2007/07/03(火) 17:51:16
>>387
ありがとうございます。

> Foo::Foo() try : m1(), m2(), m3() { } catch(...) { }
そういえば function-try block なんて見たのは久々^^;
389デフォルトの名無しさん:2007/07/03(火) 18:04:46
コンストラクタが失敗して例外を投げたときって、
中途半端にコンストラクトされた状態だと思うんだけど、
デストラクタは呼ばれないわけだよね?
メモリリークの原因にならないのかな?
390デフォルトの名無しさん:2007/07/03(火) 18:07:50
if(pMem){ delete pMem; }
でおk
391デフォルトの名無しさん:2007/07/03(火) 18:09:32
>>389
ちゃんと自分で例外をキャッチして開放してくだちぃ。
それが嫌なら vector とかスマートポインタとか使ってデストラクタに任せてくだちぃ。
392デフォルトの名無しさん:2007/07/03(火) 18:12:42
>デストラクタは呼ばれないわけだよね?
catchしたら呼べばいいじゃん。
393デフォルトの名無しさん:2007/07/03(火) 18:12:52
>>390
deleteはNULL渡したら勝手に無視してくれなかったっけ?
394デフォルトの名無しさん:2007/07/03(火) 18:13:12
してくれる。
395デフォルトの名無しさん:2007/07/03(火) 18:13:59
仕様上は無視することになってるが、
昔の VC++ あたりはしてくれなかった記憶がある。
396デフォルトの名無しさん:2007/07/03(火) 18:20:11
そうだっけ?
もしそうなら、そのときはその仕様がまだなかったんじゃないか
397デフォルトの名無しさん:2007/07/03(火) 18:21:03
http://www.google.com/search?hl=ja&q=directx+if+delete+release&lr=lang_ja
なんてググると、DirectXあたりで
#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } }
こんなマクロが出てきたりするからてっきり勘違いしていた。
398デフォルトの名無しさん:2007/07/03(火) 18:24:56
>>396
VC6 あたりまでそうだったと思う。
この仕様があるかどうか微妙な時代かもしれん。
399デフォルトの名無しさん:2007/07/03(火) 21:20:22
SAFE_DELETEの利点は変数にぬるぽを代入してくれる点

解放後にアクセスしようとすると素直に落ちてくれる
400デフォルトの名無しさん:2007/07/03(火) 21:28:18
ニートで暇だからプログラミングの練習でもするかとゲームを作り始めたのですが
いきなり挫折しました。かれこれ4時間ほど睨めっこしてるのですが
どこに間違いがあるのか検討つきません。ご教示お願いします。

環境はコンパイラはBoland C++ 5.5 + BolandDeveloper 1.221
WinアプリケーションでDXライブラリです。(多分環境は関係無いんでしょうが)

メッセージはint型はchar *型に変換出来ないと出ます。

一部抜粋
FILE *fp;
char *file_name="map1.txt",buf[99];
char* p;
char* q;

if((fp=fopen(file_name,"r"))==NULL)return-1;

このぎょうです。→ while((fgets(buf,sizeof(buf),fp))!=EOF){
j=0;
p=strtok(buf,",");
map_data[i][j]=atoi(p);
j++;
while(p!=NULL){
p=strtok(NULL,",");
if(p!=NULL){
map_data[i][j]=atoi(p);
j++;
}
}
i++;
}
fclose(fp);
401デフォルトの名無しさん:2007/07/03(火) 21:32:58
とりあえず、fgetsはEOFなんか返さないってば。
402デフォルトの名無しさん:2007/07/03(火) 21:39:19
>>401
ありがとうございます。
・・・orz

混乱していたから別ファイルで作ったのを
コピペ改変していました。

なんでこんなミスばっかりやらかすんだろな・・。俺は。
403デフォルトの名無しさん:2007/07/03(火) 21:39:50
だからニートなんだろ
404デフォルトの名無しさん:2007/07/03(火) 22:38:48
すみません。mallocって確保したメモリのポインタが返ってくるのですが、
このポインタって確保したメモリのどこを指しているのですか?
このポインタ指しているところの規定ってあるのですか?あればどんな規定?
405デフォルトの名無しさん:2007/07/03(火) 22:42:38
>>404
最初(0アドレス)を指してる。
406デフォルトの名無しさん:2007/07/03(火) 22:47:07
0アドレスって凄い誤解されそうな・・・。
407デフォルトの名無しさん:2007/07/03(火) 22:49:05
char *p = malloc(size); とすれば、

p[0] 〜 p[size - 1] のメモリをアクセスできることが保証され、
p + size が無効なアドレスにならないことが保証されている。
408デフォルトの名無しさん:2007/07/03(火) 23:27:47
何となく思ったことなんですが、
char *s = "hoge"; は
char s[] = "hoge"; と違って、中身を書き換えたりしたらダメなんですよね。じゃあ、最初から
const char *s = "hoge"; としておいた方が、間違って書き換えちゃったりしたらコンパイル時にエラーになって、
深夜のデバッグ作業突入を防げるような気がするんですが、これはいい考えですか?
それとも、気をつければいいだけですか?
409デフォルトの名無しさん:2007/07/03(火) 23:30:13 BE:223773825-2BP(21)
>>408
とてもいい考えアル
と、effective c++あたりに書いてあった希ガス
410デフォルトの名無しさん:2007/07/03(火) 23:37:22
>>408
char *s = "hoge";
char s2[] = "hage";
s = s2;
s[1] = 'i';

constをつけるとこれもできなくなる。やらないと思うけど。
411デフォルトの名無しさん:2007/07/03(火) 23:43:50
const char* const s ="hoge";

にすれば
s++
とかも防げるぜ!



以下修飾子の位置について終わりのない議論が始まります
412デフォルトの名無しさん:2007/07/03(火) 23:45:27
>>408
少なくとも自分は条件反射的にconstつけてる
413デフォルトの名無しさん:2007/07/03(火) 23:46:11
結論出たので終了
414デフォルトの名無しさん:2007/07/04(水) 01:05:17
今日wstring型ってのを知ったのですが、
  wstring a[2];
  a[0] = L"あああああ";
  a[1] = L"いいいいい";

  wcout << a[0] << endl;
  wcout << a[1] << endl;

ってやっても何も出力されません。
なぜでしょうか?教えてください。
ググっても良い資料が見つからない、、、。
415デフォルトの名無しさん:2007/07/04(水) 01:06:39
>>414です。
”何も”ではなく空白行が2行出力されます。
416デフォルトの名無しさん:2007/07/04(水) 01:07:36
wcout locale imbue
でググるんだ!
417デフォルトの名無しさん:2007/07/04(水) 01:23:30
string
418デフォルトの名無しさん:2007/07/04(水) 01:25:59
横レスだが、MacOSX GCC 4.0.1 だと locale に何渡しても runtime_error になるな。
419デフォルトの名無しさん:2007/07/04(水) 01:53:39
Javaの静的初期化メソッドみたいなもの、C++にありましたっけ?
たとえば、

class hoge {
static int num[100]; //この配列を0-99まで初期化したい
}
hoge::int num[100];

といったとき、どう書くのが一番スマートですか?
(num[100]={0, 1, 2...} とやるのはなしとして)
コンストラクタ内で初期化しようとすると
インスタンスを生成するたびに何度も同じ処理が
繰り返されることになるので無駄だし……
初期化処理が既に終わっているかどうかを示す
フラグを追加するとかでしょうか。
420デフォルトの名無しさん:2007/07/04(水) 02:04:49
今考えたけど、こういうゴリ押しができなくもないな。
friend しなくても通ったけど、これって規格的におkなの?

#include <iostream>

class hoge {
private:
static const int SIZE = 10;
private:
struct static_init {
static_init() {
for(int i = 0; i < SIZE; ++i) {
num[i] = i;
}
}
};
public:
static void show() {
for(int i = 0; i < SIZE; ++i) {
std::cout << num[i] << std::endl;
}
}
private:
static int num[SIZE];
static static_init static_init_;
};
int hoge::num[hoge::SIZE];
hoge::static_init hoge::static_init_;

int main() {
hoge::show();
}
421デフォルトの名無しさん:2007/07/04(水) 02:17:42
この程度で充分じゃね?
class hoge {
 static int num[100];
};
int hoge::num[100];
static int initialize() {
 for (....) {
  ...
 }
}
static int initializer = initialize();

ファイルスコープのstaticが嫌いならnamespace{}でも。
422デフォルトの名無しさん:2007/07/04(水) 02:24:58
関数を friend にする必要があるね。
個人的には戻り値 int が必要になるのが気持ち悪い。
423デフォルトの名無しさん:2007/07/04(水) 02:36:10
>>421
うわー、その手がありましたか。
絶対忘れないように今すぐそれ使って何か書いてきます。
ありがとうございました。
424デフォルトの名無しさん:2007/07/04(水) 02:56:23
class CStaticInt
{
public:
  CStaticInt(void)
  {
    for( int i = 0; i < 100; i++ )
       a[i] = 0;
  }
  ~CStaticInt(void){}

  static CStaticInt* GetInst( void ) {
    static CStaticInt obj;
    return &obj;
  }
  int a[100];
};

こういうのもどう?
んで、CStaticInt::GetInst()->a[0]でアクセスする
マクロ化すれば使用に耐えられなくも無い…かもしれん('A`)
425デフォルトの名無しさん:2007/07/04(水) 12:45:31
scanf("%s",str);
if(strcmp(str," ")==0)
printf("空白文字");
これで入力された文字が空白かどうか調べようとすると
strcmpが0とならずprintfが実行されません。
これってどこがダメなのでしょうか?
426デフォルトの名無しさん:2007/07/04(水) 12:47:49
>>425
入力が半角空白1文字じゃないんだろう。
else で puts(str) してみれば?
427デフォルトの名無しさん:2007/07/04(水) 13:02:37
>>426
う〜ん、なんか動かしてみると
scanfが空白文字を読み込んでないみたいな動作をするというか、
半角空白を入力すると入力が終了せず延々と入力を促すようになるのです。
だからif文の後もelse文も実行されない感じでしょうか。
428デフォルトの名無しさん:2007/07/04(水) 13:11:21
%s は空白を飛ばすから当然そうなる。
429デフォルトの名無しさん:2007/07/04(水) 13:16:38
>>428
そうなのですかorz
では文字列を入力するという処理で空白文字が入力されたか
というのを調べるには↓みたいにするしかないですか?

fgets(str,N-1,stdin);
if(str[0]==' ')
printf("空白文字");
430デフォルトの名無しさん:2007/07/04(水) 13:20:54
strstr()
431デフォルトの名無しさん:2007/07/04(水) 13:42:00
>>429
どういう仕様にしたいのかが今ひとつ分からんから何とも言えんなあ。
" hoge " とか "hoge hoge hoge" とか入力された場合どうしたいのかな?
432デフォルトの名無しさん:2007/07/04(水) 14:08:13
>>431

char str[N][N];
int i;
for(i=0;i<MAX;i++){
printf("文字列入力:");
fgets(str[i],N-1,stdin);
if(str[0]==' ') break;
}

こんな感じで空白文字が入力されたら入力を打ち切る仕様にしたいのです。
だから"hoge hoge hoge"の場合はそのまま文字列として格納です。

>>430
紛らわしいこと書いてすみません、仕様は上記のような感じでした。
433デフォルトの名無しさん:2007/07/04(水) 14:10:00
if(str[i][0]==' ') break;
でした。書き間違い。
434デフォルトの名無しさん:2007/07/04(水) 14:12:14
>>432
" hoge " はどうなの?
435デフォルトの名無しさん:2007/07/04(水) 15:15:03
>>434
それは考慮してなかった…。
コマンドラインでの入力が「半角スペース+Enter」の場合のみ
入力を打ち切るという仕様だと思います。
436デフォルトの名無しさん:2007/07/04(水) 15:19:33
>>435
あと、" hoge " と入力された時、
最初と最後の空白をどうするのかという問題もある。
437デフォルトの名無しさん:2007/07/04(水) 17:09:55
TCHAR buf[100];
cin >> buf;
ってすると UNICODE 版でコンパイルするとエラーになるのですが、
cin の TCHAR バージョンってないのでしょうか?
438デフォルトの名無しさん:2007/07/04(水) 17:13:46
自分で作るしかなかったと思う。

#ifdef UNICODE_
wistream& tcin = wcin;
#else
istream& tcin = cin;
#endif
439デフォルトの名無しさん:2007/07/04(水) 18:37:17
>>404 から >>407 さんへ、有難うございました。
すいません
>>407
>p + size が無効なアドレスにならないことが保証されている。
これ意味の解らないのですが、p + sizeのアドレスって、
確保されたメモリの次アドレス(確保外)が無効なアドレスにならないてことですよね。
なぜ、確保外の次のアドレスを無効なアドレスにならないことを保証しなければならないのですか?
440デフォルトの名無しさん:2007/07/04(水) 18:46:51
ポインタ変数でループする際の終端として使えるようにするため。
441デフォルトの名無しさん:2007/07/04(水) 18:48:26
>>439の訂正
誤:これ意味の解らないのですが、
正:これの理由が解らないのですが、
442デフォルトの名無しさん:2007/07/04(水) 18:55:36
>>440
有難うございました。
つまり、これに使うためにってことですね。
for( char* ptr = p; p != ptr; ptr++){}

>>407 さんと >>440さんのおかげで少し賢くこうなりました、ぺこり
443デフォルトの名無しさん:2007/07/04(水) 19:15:40
それだといきなりループが終わるw
C++ やってりゃ分かると思うけど、
algorithm でやってるあーいう処理ね。
444デフォルトの名無しさん:2007/07/04(水) 20:59:34
あいやー、いきなりループが終わるんですか、ガクブル、どうすれば良いんですか
445デフォルトの名無しさん:2007/07/04(水) 21:01:14
こんな感じ

#include <stdio.h>
#include <stdlib.h>

void fill(int *begin, int *end, int first, int step) {
int *p;
int n = first;
for(p = begin; p != end; p++, n += step) {
*p = n;
}
}

int sum(int *begin, int *end) {
int *p;
int n = 0;
for(p = begin; p != end; p++) {
n += *p;
}
return n;
}

#define SIZE 5

int main() {
int *p = malloc(sizeof (int) * SIZE);
if(p == NULL) { return EXIT_FAILURE; }
fill(p, p + SIZE, 0, 1);
printf("%d\n", sum(p, p + SIZE));
free(p);
}
446デフォルトの名無しさん:2007/07/04(水) 21:05:50
c++で全角と半角を格納している配列から一文字ずつ読んで
標準出力させたいんですが、全角の1文字目と半角を区別することができません。

string str = "あイウ()";

for (int i = 0;i<=100;i++)
{
printf("%c",str[i]);
}

こうすると半角は正しく出力されますが、半角が出ません。
どうしたらいいですか?
447デフォルトの名無しさん:2007/07/04(水) 21:12:41
>>446
色々方法はある。
_mbclenを使うとか、wstringやUNICODEにするとか。
448デフォルトの名無しさん:2007/07/04(水) 21:26:22
> 半角は正しく出力されますが、半角が出ません

どっちなんだよ?
449デフォルトの名無しさん:2007/07/04(水) 21:32:50
>>445
有難うございます、あす、これとmallocの知識を引っさげて学校で自慢してきます
450デフォルトの名無しさん:2007/07/04(水) 21:33:27
>>449
他にこのスレ見てるやつもいるかもなw
451445:2007/07/04(水) 21:34:47
>>447
なるほど。書いてもらったやつで調べてみたら
できそうですね。ありがとうございます。

あと少し教えてください。
「_mbclen」のアンダーバーは何を意味しているんですか?

それとアンマネージドというのは.NETの機能を
使わなければいいんですよね?
MFC、ATL、SDK、WINDOWS APIとかその辺の区別が全く理解できなくて・・・。
452デフォルトの名無しさん:2007/07/04(水) 21:35:45
>>448
すいません。「全角が出ません」の間違いです。
453デフォルトの名無しさん:2007/07/04(水) 21:44:47
>>451
処理系オリジナルのものと言う証。
下線で始まる名前は、処理系のために予約されている。
454デフォルトの名無しさん:2007/07/04(水) 21:59:18
C++初心者です。型変換のことで教えてください。
main(){ int iv; iv=int(3.14); }
この「int()」は何ですか?キャスト演算子ですよね?それとも値生成演算子?
また、
class T { int miv; public: T(int iv=0):miv(iv){} };
main(){ T oa; oa=T(2); }
このT(2)は、変換コンストラクタの呼び出しですよね?キャストとは呼ばない?
さらに、main()を次のように書き換えると、
main(){ T oa; oa=static_cast<T>(2); }
このstatic_cast<T>(2)はキャストだけど、実はT(2)と同じですよね。
じゃあ、T(2)もやはりキャストなのでしょうか?コンストラクタの呼び出しとは言わない?
ネットやいろんな本を見ても、このあたり、はっきり書いてないのです。
455デフォルトの名無しさん:2007/07/04(水) 22:00:47
>>453
わかりました。ありがとうございました。
456デフォルトの名無しさん:2007/07/04(水) 22:06:07
>>454
>この「int()」は何ですか?キャスト演算子ですよね?それとも値生成演算子?
int のコンストラクタの呼び出しによるテンポラリオブジェクトの作成。

>このT(2)は、変換コンストラクタの呼び出しですよね?キャストとは呼ばない?
T のコンストラクタの呼び出しによるテンポラリオブジェクトの作成。

>このstatic_cast<T>(2)はキャストだけど、実はT(2)と同じですよね。
多分同じ。
457454:2007/07/04(水) 22:20:46
>>456さん、早速ありがとうございます。
intのようなC言語からある型の場合も、コンストラクタ、オブジェクトという概念で
考えるのですかぁ。C++では、intなどの型もクラスのような感じ?

C++本やネットでは、int()は(C風の)キャストだという記述が多いですが、
「コンストラクタ呼び出しによるテンポラリオブジェクトの作成」は、
別な言い方をすれば「キャスト」と同じこと、という理解で良いのでしょうか?
static_cast<T>(2)はT(2)と規格上同じだし、(T)2、と書くことも出来るから考えると。

458デフォルトの名無しさん:2007/07/04(水) 22:23:22
キャストは引数を複数取れないから基本的には別のもの。
引数が 1 つの場合は同じようになるだけで。
459デフォルトの名無しさん:2007/07/04(水) 22:27:09
規格票の 5.2.3 明示的型変換(関数的記法) によれば、
この記法とキャストは同等だと書いてありますね。
460454:2007/07/04(水) 22:40:00
型がクラスの場合は、
引数1つだとキャストと同じ表記だけどキャストとは別もののコンストラクタ呼び出し、
というのは、納得です。

じゃあ、例えばintの場合、Cでは「 (int)3.14」はキャストですよね?
C++では、「(int)3.14」はコンストラクタ呼び出しであって、キャストではないということ?
それとも、「(int)3.14」はキャストだけど「int(3.14)」はコンストラクタ呼び出し?

と、ここで>>459さんもコメントどうもです。
とすると、意味合いとしてはキャストと、このコンストラクタ呼び出しは同じってこと?
それとも、記法としては同じであって、でも意味合いとしては別もの、ということ?
461デフォルトの名無しさん:2007/07/04(水) 22:46:33
同じものの違う表記法というだけみたいですね。
462デフォルトの名無しさん:2007/07/04(水) 22:47:33
>>408
char *s = "hoge";
は、書き換えたりしない(書き換えられないとは違う)。
同じ文字列リテラル(ダブルクォーテーションで括った文字列)は、
コンパイラに特別指定しない限り同じ領域を指すポインタである。
深夜までデバッグしたくなければ書き換えるのはやめれ。

従って、("hoge"[2] == 'g')
は、真になる。参照する方はやりたい放題。

関数内での
char s[] = "hoge";
はありえないと思うのだが、検証した?

char s[]というのはポインタではなく、要素数を省略した配列なので、
まず、要素数が決まる `= { ... }' という構文が必要。
そして、この構文は静的変数(グローバル変数か、スタティック変数)にだけ許される。

例えば、static char s[] = { 'h', 'o', 'g', 'e', '\0' };
これなら別の値に自由に変更可。

例外として、引数がある
void hogege(char hoge[]);
これは
void hogege(char *hoge);
と全く同義なので自由に書き換えられる。
もちろん、呼び出し元の関数と調和をはかるように。
463454:2007/07/04(水) 22:51:48
昨日、本屋で「C++の設計と進化」を立ち読みしたです。
索引で見つけた「コンストラクタの表記」を引いてみると、
クラス型名(式)の表記によってコンストラクタを式中でも使えるようになった、
というようなことが書いてあり、さらには、この表記は、
キャストの表記と同じだ、とも書いてありました。
でも、コンストラクタの表記とキャストは同一だという説明はなく、
このあたりは、はっきりとは書かれていなかったです。

C++の本は、新しい4つのキャスト演算子については必ず説明がありますが、
オブジェクトの初期化とコピーコンストラクター以外の
コンストラクタの呼び出し(とテンポラリオブジェクトの作成)については、
ほとんど説明がないですねぇ。。

464デフォルトの名無しさん:2007/07/04(水) 22:57:01
正確な情報を知りたければ規格票を見るのが一番ですよ。
http://www.jisc.go.jp/app/JPS/JPSO0020.html
C++ の規格番号は X3014 です。
465454:2007/07/04(水) 23:00:56
>>464
はい、逝ってきます・・・
466デフォルトの名無しさん:2007/07/04(水) 23:17:00
>>460
459ではあれだけで終わっているが、
実際のところ、5.2.3には続きがあって、括弧の中の式の並びが複数ある場合、
コンストラクタを呼び出して一時オブジェクトを作ると規定されている。

歴史的には、コンストラクタを呼んでクラスの一時オブジェクトを作る構文として
導入されたのが最初で、後にそれを一般化して全ての型に対して使えるようになった。
(C++の設計と進化に書いてあるとおり)
その際、組込型では型変換演算子と同じ効力を持たせたという次第。

また、1つしか引数を取らないコンストラクタは、そのクラス型への型変換を提供する。
だから454でのstatic_cast<T>(2)は結局コンストラクタ呼出として機能する。
(あと型変換演算子の話もしたいが省略)

C++は、型変換を即ち新しいオブジェクトが作り出されることと捉えているように思われる。
すると、コンストラクタ呼出と型変換の境界が非常に曖昧になっているも納得がいく。
467デフォルトの名無しさん:2007/07/04(水) 23:24:01
(int*)p はできるけど int*(p) はできないってところとか、
本当に細かい文法的な違いはあるね。
468454:2007/07/04(水) 23:34:42
>>466
ちょっと判ったような気になりました。ありがとう。
ついでにもう一つ。これから変換関数、変換演算子を勉強しようとしているところですが、
この2つ、同じものですよね?呼び方が違うだけで。


>>467
そーですね。単一名称(単純名称)でないとだめ、という説明はよく見ます。
typedefすれば大丈夫、ともよく書いてある。
469454:2007/07/04(水) 23:49:26
いま、JIS3014を検索してみました。
「変換関数」はたくさん出てきます。
「変換演算子」というのは該当無しで、
「型変換演算子」は、dynamic_cast, static_cast, reinterpret_cast, const_cast
のことを指すのですね。
ネットでググると、変換関数の意味で「変換演算子」を使っているページが
たくさんヒットするんですが、これらはみんな間違ってるのかな。

というか、JIS3014、おもしろい。絶対的な信頼があるから、
間違いを疑う必要もないしね。
470デフォルトの名無しさん:2007/07/05(木) 00:18:30
間違いはないけど、コンパイラが対応してないこともw
export とかほとんど対応してないし。
471デフォルトの名無しさん:2007/07/05(木) 00:35:03
>>462
初心者騙して楽しいか?

> 同じ文字列リテラル(ダブルクォーテーションで括った文字列)は、
> コンパイラに特別指定しない限り同じ領域を指すポインタである。

そんなことは決まってない。

> そして、この構文は静的変数(グローバル変数か、スタティック変数)にだけ許される。

自動変数でも配列要素数の省略は使える。
472デフォルトの名無しさん:2007/07/05(木) 04:58:00
質問です。
Microsoft Visual C++ 2005 Express Editionにおいて、
C++のアプリケーションを作っています。

コンパイル後の.exeファイルのプロパティで
バージョン情報や会社名などが表示されるタブが出ません。

ソリューションエクスプローラ中にはAssemblyInfo.cppという、
AssemblyTitleAttributeなどが配置されたファイルが自動生成されています。
しかし、反映されません。(検索などではC#で作成され、csの場合のみ反映されるらしい)

対処法か代替案を持っていらっしゃる方はおりませんか?
473デフォルトの名無しさん:2007/07/05(木) 05:13:07
>>472
こっちで聞いた方がいいと思う

Visual Studio 2005スレ Part21
http://pc11.2ch.net/test/read.cgi/tech/1180692040/
474デフォルトの名無しさん:2007/07/05(木) 09:03:52
実行環境はWindows環境、開発環境はVS6.0です。
メールを送りたいのですが一般的な既存ライブラリは存在しているのでしょうか?
イメージしているのはWinsockに依存したライブラリですが
普通はそのままSMTPを喋るものなのでしょうか?

受信は必要なく、OB25Pも問題ありません。
475デフォルトの名無しさん:2007/07/05(木) 09:38:14

Windowsで一般的といえばMAPIだろうな

俺は使いたくないけどw

476デフォルトの名無しさん:2007/07/05(木) 09:42:20
basp21.dll
477デフォルトの名無しさん:2007/07/05(木) 10:46:02
>>476
そういえばそんなのもあったね。
478デフォルトの名無しさん:2007/07/05(木) 11:05:27

ttp://www.hi-ho.ne.jp/babaq/basp21.html
2007年6月29日更新

タイムリーすぎてワロス
まさか自演じゃないだろうな
479デフォルトの名無しさん:2007/07/05(木) 11:31:25
Windowsで簡単に見た目もいけてるGUIを作るにはどんな方法があるでしょうか?

ちなみに過去にチャレンジしたこと

・C++/CLR
コントロールは豊富だが、OfficeとかVSにあるようなフローティングメニューが見つからないので中断
日本語の資料が少なくて困る
既存のリソース(DLLなど)と組み合わせるときに
DLLのほうの仕様を変えないとうまく動かないor非常にめんどくさいの2択になる
あと変な拡張構文がキモい

・MFC
デフォルトのコントロール数が貧弱だが、資料も多いし、
Win32APIをラッピングしてある程度のものが多くわかりやすい。
VS2005で作成するとManifestでうんぬんとうざいのでスタティックリンクできないプロジェクトだとだるい。

・C++Builder
GUIのデザインをするには最強だと思うが、本体が生きてるのか死んでるのかよくわからんのと
重い、謎のバグがいつまでも取れない、というのがネック。
未だに6を使ってる人が多い。
VCと一緒に入れるとデバッガが正常に動かない可能性がある?

・WTL
何がいいのかさっぱり
480デフォルトの名無しさん:2007/07/05(木) 11:40:11
CEGUI
481デフォルトの名無しさん:2007/07/05(木) 11:56:50
>>479
SWINGとかAWT継承すれば?
C++じゃなくなるけど
482デフォルトの名無しさん:2007/07/05(木) 12:21:14
SwingとかAWTをJNI通してC++から使うっていう意味?
483デフォルトの名無しさん:2007/07/05(木) 12:22:06
SQING や AWT がイケてるとは思えないけどw
484デフォルトの名無しさん:2007/07/05(木) 12:36:44
ロジック部分を C++ で書いて
ユーザインターフェイスは C# で書く。
C# からアンマネージドなDLL呼び出せるし。
だめ?
485デフォルトの名無しさん:2007/07/05(木) 12:43:30
FrameworkもJREも無しですませたい
486デフォルトの名無しさん:2007/07/05(木) 12:52:35
すみません
stringのfindは、またはの検索できませんか

たとえば"あい"または"大塚"または"愛"

とかです
487デフォルトの名無しさん:2007/07/05(木) 12:53:34
str.find("あい"|"大塚"|"愛")

でいいんでしょうか
488デフォルトの名無しさん:2007/07/05(木) 12:56:49
なんで試さないの?
489デフォルトの名無しさん:2007/07/05(木) 12:58:48
>>486-487
str.find("あい") != string::npos ||
str.find("大塚") != string::npos ||
str.find("愛") != string::npos

正規表現ライブラリを使ったほうがいいかもね。
490デフォルトの名無しさん:2007/07/05(木) 13:01:18
>>499
ヒットする、またはヒットする、ってやるんですね
サンクス わかりました
491デフォルトの名無しさん:2007/07/05(木) 13:02:37
でも、番号がわからないような気が・・正規表現ライブラリを調べてみます!
492デフォルトの名無しさん:2007/07/05(木) 13:07:19
場所が欲しかったら代入してやればいい
if ((pos = str.find("あい")) != string::npos ||
(pos = str.find("大塚")) != string::npos ||
(pos = str.find("愛")) != string::npos) {
// みつかった
} else {
// みつからへん
}

493デフォルトの名無しさん:2007/07/05(木) 14:22:14
ライセンスキーを入力->立ち上がる
これをやりたんです。

・キーの発行は手作業で。
・アプリ側ですること、ライセンスキーを認証するdllを作成。

こんなこと想像してます。解説しているページや
簡単に実現できるツールなどありませんか。
494472:2007/07/05(木) 15:53:44
>>473
誘導感謝。そっちへ行ってみます。
495デフォルトの名無しさん:2007/07/05(木) 23:58:22
>> 同じ文字列リテラル(ダブルクォーテーションで括った文字列)は、
>> コンパイラに特別指定しない限り同じ領域を指すポインタである。
>
>そんなことは決まってない。

そうでない処理系を挙げてくれ。

>
>> そして、この構文は静的変数(グローバル変数か、スタティック変数)にだけ許される。
>
>自動変数でも配列要素数の省略は使える。

どんな例か試しに書いてくれ。
496デフォルトの名無しさん:2007/07/06(金) 00:04:06
VCとか。

C89(ANSI-C)以前の人は、自動変数で
int hoge[]={1,2,3};式の初期化が出来ないとか言い張ることあるよね。
497デフォルトの名無しさん:2007/07/06(金) 00:08:04
>>495
Visual C++では、コンパイラオプション/GFを指定しないと
同一文字列リテラルが同じ領域を共有するようにならない。
(なお/O1や/O2などの最適化オプションを指定すると暗黙の内に/GFも指定されたことになる)

ローカル変数での配列でもchar s[] = "hoge";や
char s[] = {'h', 'o', 'g', 'e', '\0'};のように書くことは可能。
このように静的変数や大域変数と同じ構文。
少なくともANSI/ISO Cではできることになっているし、
PC用のコンパイラなら今時できないものを見つけるほうが難しい。

498デフォルトの名無しさん:2007/07/06(金) 00:12:14
>>495
===== 同じ文字列リテラルが違う領域を指す例 =====
gcc -c b.c
gcc a.c b.o
/*----- a.c -----*/
#include<stdio.h>
char *p_hello(void);
int main(void){
printf("%s %s\n", "hello", p_hello());
printf("%p %p\n", "hello", p_hello());
return 0;
}
/*----- b.c -----*/
char *p_hello(void){
return "hello";
}
----- 実行結果 -----
hello hello
00403000 00403020


===== 自動変数で配列要素数の省略 =====
#include<stdio.h>
int main(void){
int i, data[]={0,1,2,3,4,5,6,7,8,9};
for(i=0;i<sizeof(data)/sizeof(data[0]);i++)
printf("%d\n", data[i]);
return 0;
}
499デフォルトの名無しさん:2007/07/06(金) 00:22:06
>>495
わざわざ無知を晒しに出てこなくてもよかったのにね。
500デフォルトの名無しさん:2007/07/06(金) 00:28:25
まあ聞くは一時の恥、聞かぬは一生の恥と言うし、
495はいい勉強になったということでいいじゃないか。
501デフォルトの名無しさん:2007/07/06(金) 00:38:17
>>493
至極簡単だと思うけど…
502474:2007/07/06(金) 01:01:18
皆様回答ありがとうございます。
BASP21はタイムリーですね。自演ではないです。

調べてみたところSMTP-AUTHに対応してなさそうな感じでしたので
MAPIをもう少し調べてみようと思います。
ありがとうございました。
503493:2007/07/06(金) 02:01:09
>>501
1.大量のライセンスキーのデータベースが入っていて、マッチング。
2.それとも、秘密の値を一つだけ持っていて、
  数学的になにか計算して、(ハッシュなど)マッチング。

一番目ってキーの数が多かったら、大変ですよね。ぬー。
ということは、数学のなにかを使って、やるんでしょうか?

たとえば、ウィンドウズだと、どんな感じでしょうか。
504デフォルトの名無しさん:2007/07/06(金) 02:25:49
ライセンスキーをソートした状態で持っておけば、2分検索が使えるよ。
505デフォルトの名無しさん:2007/07/06(金) 02:45:47
だいたいはアルゴリズムで、
ブラックリストデータベースも利用、かなー。
MSのは、公開鍵認証とハッシュがどーの、という話があったけどねー
506デフォルトの名無しさん:2007/07/06(金) 06:36:31
オンライン認証じゃないのか
507493:2007/07/06(金) 10:40:35
>>504-505
たくさんの大量のライセンスキーを
用意して、ただマッチングがわかりやすいです。
オンライン認証もいいですね。

>MSのは、公開鍵認証とハッシュがどーの、という話があったけどねー
ハッシュ、公開鍵、秘密鍵、独自の計算方法、を使うんですか。
難しそうなので、うまいアルゴリズムは、徐々に考えていこうと思います。

興味があったので、勉強のために質問させていただきました。
ありがとうございました。
508デフォルトの名無しさん:2007/07/06(金) 11:17:24
MSの場合はデータベースを使ってるに決まってるだろ。
509495:2007/07/06(金) 21:41:30
検証してANSI-Cでは動的配列等の初期化ができると分かって来て見たら非難誹謗の嵐だ。
わざわざお礼を言おうと思ったが、そんな非礼な人間に感謝の気持ちなどなくなった。

そうだよ。俺はANSI-C以前からC使いだった。
C++を黎明期から覚えて使い始めてからは、string系クラスが活躍してくれて
外的・静的配列以外に初期化子を使う必要もなかったからな。

君らが古いコードをメンテする憂き目に遭うことを祈ってるよ。
510デフォルトの名無しさん:2007/07/06(金) 21:46:42
どんな理由があろうが捨て台詞は格好悪いから辞めた方がいいって
511495:2007/07/06(金) 21:50:05
ああ、ちなみに俺は『夜中までデバッグしたくなかったら』という前提で
文字列リテラルは同じポインタを参照するって意味で書いたんだぜ。

その辺は文脈嫁。

それから、C/C++の教本を読んでる暇があったら職を探せよ(w
512495:2007/07/06(金) 21:53:19
漢字もろくに書けないゆとりに説教されるとはな。
辞める→止める、やめる

適当にアラスカ。
513デフォルトの名無しさん:2007/07/06(金) 21:56:33
なんだこのオッサン
年甲斐もなく2chで火病かよ

一生やってろ
514デフォルトの名無しさん:2007/07/06(金) 21:58:22
俺をあげつらったやつら、特に学生よ、昔のコードには

int a[100] = { 0 };

なんて構文はなかったんだぜ。
就職先のコンパイラが古かったら、解けないバグに悩まされろよ。
515495:2007/07/06(金) 21:59:34
>>513
そのつもりだぜ?
516デフォルトの名無しさん:2007/07/06(金) 22:00:17
日々のストレスで頭がおかしくなったんだよ。
そっとしといてやれ。
517デフォルトの名無しさん:2007/07/06(金) 22:01:08
>>514
古いコンパイラでその構文が通らなければエラーになるだけなので
解けないバグも糞も無いんだが……
518デフォルトの名無しさん:2007/07/06(金) 22:01:08
そんなに悔しかったのか
519495:2007/07/06(金) 22:03:08
そっとしてくれないのはまさに君じゃあないか >>516
火病だろうがなんだろうが、アラシがいると皆楽しそうだなあ。ふふっ

期待してるんじゃないのか?
520デフォルトの名無しさん:2007/07/06(金) 22:03:32
こりゃC99の話とかしたらおもしろそうだな
521495:2007/07/06(金) 22:07:05
>>518
そうだな。例えば君が車の免許を取ったとする。
10年後に、君の知らない新しい規則で捕まったとしよう。
それは悔しくないか?

100歩譲って仕方ないとしても、
見ず知らずの人間から「そんなことも知らんバカがいる」
と言われて悔しくない奴がいるかい?
522デフォルトの名無しさん:2007/07/06(金) 22:08:15
技術者なら仕様の更新くらい把握しとけよ
523デフォルトの名無しさん:2007/07/06(金) 22:10:18
この業界の人間ならまず己を恥じるけどな

アンテナ張らなくなったら終わりだぞ
524デフォルトの名無しさん:2007/07/06(金) 22:11:59
昔から半導体のプロセス技術で仕事をしていて、
年々プロセスが細くなってきて、昔は気にもしなかったような
トンネル効果やらリーク電流やらに悩まされるような感じか
525デフォルトの名無しさん:2007/07/06(金) 22:12:53
>>521
つーか技術者なら、まず自分の無知を恥じろよ。
で、どういうカタチであれ知識を教えてもらったことを有難いと思えよ。

ま、アンタの場合、恥じるべきは自分の無知よりむしろ
年甲斐も無いDQNさだろうな。
もっぺん自分のレス読みかえせよ。

>>495は人にものを尋ねる態度か?
簡単に自分に確かめられることなのに、自分で確かめようともせずに
まるでケンカ越しで偉そうに聞いてたよな。
一体何様のつもりなんだか。
526デフォルトの名無しさん:2007/07/06(金) 22:16:09
>>521
悔しいのはわかるが、それをばねに勉強するなど
その気持ちをほかの方向へ向ける手もあるだろうに。
527495:2007/07/06(金) 22:17:10
>>520
complex型とか色々増えたんだろ。
確か、enumも面倒くさい仕様になったんだよな。
全く知らないわけじゃないが、不要な機能も多そうだ。
C言語仕様で遊んでる奴らは、もっと基本に返って欲しいぜ。
528デフォルトの名無しさん:2007/07/06(金) 22:19:12
自分が最近の仕様に疎いという自己認識があるんなら
最初から>>462みたいに偉そうに書かなきゃいいのに

初心者相手と思ってやったんならなおタチ悪いぞ
529デフォルトの名無しさん:2007/07/06(金) 22:19:51
enum で何か大きく変わったっけ?
最後にコンマつけても良くなった程度じゃない?
530495:2007/07/06(金) 22:25:49
ほら、説教オタが集まってきた。
これだから嵐はやめられん。
>>523
お前は常にアンテナを張っているといえるのか?

>>524
それは『道具を作る』側の悩みだろ。現場だから悩みは直ぐ分かるぜ。
俺は言語を作ってるわけじゃない『道具を使ってる』側だから、勝手に変えられるのもこまるんだぜ。

>>525
そうさ、お礼をするつもりだったのさ。
その後は前に書いたとおりだ。二度も言わせるな。

人にモノを尋ねる態度じゃないと思ったら
答えなきゃいいじゃないか。それか無視すればいいんじゃね?
君の知識で答えられるとは思えないがな。実は今日初めて知った仕様じゃないのかい(w

>>526
そのつもり。

531デフォルトの名無しさん:2007/07/06(金) 22:26:54
無視すればいいんじゃね?
どうみても過剰反応の荒しなんだが。
532495:2007/07/06(金) 22:28:11
>>529
ほーら。こう言う人もいる。

分かる奴はenum談義でもしてやれよ。ほら。さあさあ。
533デフォルトの名無しさん:2007/07/06(金) 22:30:16
いまどきノーヘルで捕まって悔しがる馬鹿っているのか?
そのレベルだろ
534495:2007/07/06(金) 22:31:35
>>531
過剰反応じゃなきゃ嵐とは言えネー。
そして君は無視してなーい(藁)
535デフォルトの名無しさん:2007/07/06(金) 22:32:37
>>534
漏れは楽しんでるからどんどん過剰反応してくれ
536495:2007/07/06(金) 22:34:16
>>533
これだけ例えが分からん奴も珍しい。
心から軽蔑してやるぜ。
537デフォルトの名無しさん:2007/07/06(金) 22:35:55
何を今更、ってたとえ話だろ。
538デフォルトの名無しさん:2007/07/06(金) 22:38:21
文字通りの老害だね。


釣りじゃなければ
539デフォルトの名無しさん:2007/07/06(金) 22:40:12
>>537
原付に乗っていきがっている中学生と似たようなもんだ、ということかと思った。
540デフォルトの名無しさん:2007/07/06(金) 22:44:37
免許持ってるおっさんだと仮定して話してしまった
よく読んだら免許持ってるともおっさんだとも言ってないな
今は反省してる。
541デフォルトの名無しさん:2007/07/06(金) 22:45:14
>521
なるほど。プログラマも更新必須の免許制に白って話だな。
んで、更新場で5000円はらって、「今度のC++09では〜こういう変更が〜」
みたいな話をありがたくちょうだいしろ、と。
542デフォルトの名無しさん:2007/07/06(金) 22:50:41
>>521
法律は法律だろ…。
知らなかったなんて言い訳が通用するはずもない。
悔しいとか関係ないし。

自分で例えにもなってない例えを出しておいて、
よく他人に「例えが分からん」とか言えたものだな。
543デフォルトの名無しさん:2007/07/06(金) 22:53:16
つーかC99ならまだしもC89なんて何年前の話だ
544デフォルトの名無しさん:2007/07/06(金) 22:58:16
こいつの下についてる奴は哀れだな
普段から嬉々として間違ったことばかり言ってるが
「××さんそこはこうですよ」とか突っ込むと
逆切れして仕事にならんから適当な按配に放置されてると見た
545523:2007/07/06(金) 23:00:35
>>530
当然だろ。おまえは違うみたいだけど
546デフォルトの名無しさん:2007/07/06(金) 23:07:24
ってか、未来のコンパイラで使える技術と、
今の多くのコンパイラで使える技術ってちょっと違わないか?

>>495の内容は、コンパイルして確認できる程度のものだろ。
547デフォルトの名無しさん:2007/07/06(金) 23:23:29
>検証してANSI-Cでは動的配列等の初期化ができると分かって来て見たら非難誹謗の嵐だ。
規格に当たれば済むことを、いい加減な検証で分かった気になるとは。

>わざわざお礼を言おうと思ったが、そんな非礼な人間に感謝の気持ちなどなくなった。
例を言うのに「わざわざ」なんて副詞をつけるくらいなら最初から言わない方がましだ。

>そうだよ。俺はANSI-C以前からC使いだった。
別に珍しくもないが、普通は今時のコンパイラに触れているうちに理解するもんだ。

>C++を黎明期から覚えて使い始めてからは、string系クラスが活躍してくれて
string系? std::stringに類似品があったっけ? std::basic_stringのことか?

>外的・静的配列以外に初期化子を使う必要もなかったからな。
無知蒙昧極まれり。

>君らが古いコードをメンテする憂き目に遭うことを祈ってるよ。
憂き目? まさか。温故知新と言う言葉はご存じないかな?
548495:2007/07/06(金) 23:33:34
>>538 文字通りの老害だね。

そういう君の方が年上で無知だったりして。
2chで無意味なことを言う奴だ。

>>541
何言ってんの?免許制?そりゃあいい。
仕事だけじゃなく、きちんと新しい仕様を勉強する公な時間がとれるぜ。

君らも仕事するようになったら、アンテナ張るのが限界になることが分かるぜ、学生、失業者。

>>542
お前にゃ『例え』という概念も理解し難いらしい。
この例えが不適切だったと思う奴はちょっとレスしてみろ。

>>543
新しい仕様は受け入れるよ。そろそろ新しいC言語の教本を読む頃だ。
だが、K&R C言語の第2版でさえ、やはり自動変数の初期化子は
目の上のたんこぶ扱いだったようだ。

ゆとり世代がループ内で自動(配列)変数の初期化子なんか使われたら困るぜ。

>>544
安心しろ。会社ははけ口にならんからここに毒を吐いてるんだ。
549デフォルトの名無しさん:2007/07/06(金) 23:36:40
アンテナ張るのも辛い職場ってどんだけブラックなんですか
550デフォルトの名無しさん:2007/07/06(金) 23:40:36
技術者として新技術の吸収が無理だと分かったら、そいつはもうそこまでだぜ
このおっさんは汎用機と心中するしかないCOBOLerと一緒だな

周囲はゆとりと学生だけなんだ、自分は悪くないんだ、仕事やってりゃ皆こうなんだ、
と思い込もうとしてるんだね

実に哀れだね
551デフォルトの名無しさん:2007/07/06(金) 23:43:48
>>548
(´・ω・`)⊃旦 < 毎日お疲れ様です、お茶ドウゾ。
552デフォルトの名無しさん:2007/07/06(金) 23:49:41
自分で試さずに「試しに書いてくれ」ってまるでゆとり世代のようだな
553495:2007/07/06(金) 23:51:42
>>545
君は自分の無知を自覚しようとしない奴だ。
ソクラテスはそういう事を何と言ったか知ってるか?

>>546
今日コンパイルしたのさ。

>>547
仕事中に新しい機能を覚える時間とそれを検証する時間をくれるなら進んでやるぜ。
社長は君かい(笑)

>string系? std::stringに類似品があったっけ? std::basic_stringのことか?
世の中にはSTLしかないと思っている奴を発見した。
しかも、wstringすら知らない奴もいたもんだ。

それから温故知新の使い方が逆だ。
君の使い方は『古いことを知り、かつ新しい事を知るべきだ』という意味にしかとれないが、
本当の意味は
『新しいことを知るには、古いことを知っておく事も重要だ』という意味。

やれやれ。ゆとり君=>>547
554デフォルトの名無しさん:2007/07/06(金) 23:55:42
>>553が憂き目の意味を理解してるかどうかが気になる
555デフォルトの名無しさん:2007/07/06(金) 23:57:12
どんどん香ばしくなっていくな
556495:2007/07/07(土) 00:03:14
>>550
そういうなよ、ゆとり。
それより、採用試験に向けて、人と目を合わせて話す練習をした方がいいよ。

>>551
サンキュー

>>552
そのときは思いもよらなかったからさ。
今日は仕事が一区切りつけたから検証できたんだ。

>>554
つらい体験

>>555
そう言うなよゾロ目
全員が無視されたら嵐は自然といなくなるんだぜ?
557デフォルトの名無しさん:2007/07/07(土) 00:05:03
すごく・・・不毛です・・・
558デフォルトの名無しさん:2007/07/07(土) 00:09:45
>>556
憂き目って、単につらいだけじゃなくて悲しいといったニュアンスも入るんだけど理解してる?
それでいて使い方が逆とか言ってる?
559デフォルトの名無しさん:2007/07/07(土) 00:14:54
憂うっていうのは残念
560デフォルトの名無しさん:2007/07/07(土) 00:20:56
まだやってんのか?
勉強の時間が取れないって割には暇なんだな。
561デフォルトの名無しさん:2007/07/07(土) 00:20:58
いつから三つの数字をぞろ目と言うようになったのだろう……
562デフォルトの名無しさん:2007/07/07(土) 00:21:58
>>553
> 仕事中に新しい機能を覚える時間とそれを検証する時間をくれるなら進んでやるぜ

こういう人多いんだよねぇ
・プライベートで自己啓発しようという考えが無い
・新しいことにチャレンジして新しい技術を仕事と共に身につけようという考えも無い
・自分に時間的余裕が無いのは上が悪いせいだ

ま、どうぞ勝手に腐ってくださいとしか
563デフォルトの名無しさん:2007/07/07(土) 00:23:33
土曜日だからってはしゃぎすぎだろ。
そろそろ寝ろよおっさん。
564デフォルトの名無しさん:2007/07/07(土) 00:24:07
>>561
それはふつうに言うんでないか?
ちんちろりんとかサイコロ3つ使うけど
565495:2007/07/07(土) 00:28:19
>君らが古いコードをメンテする憂き目に遭うことを祈ってるよ。

>>558
よし答えてやろう。
憂き目がつらい体験というのはおおよそ間違ってないのではないかな。
それとも、『つらく悲しい経験』(goo辞書から抜粋)とでも答えてほしかったのかな?

そして、学生や就職浪人なんぞの世代が古いコードをメンテしたとき、
コンパイラは当時の同じバージョンの処理系で
コンパイルするのが常套ではないか?

もちろん、新しいコンパイラを使っても構わないが、動くように直すより、当時の規格に沿って
メンテした方が遥かに楽な場合が多いだろう。

そして、私の憎む君らが、知るべくもない仕様に基づいたバグにはまり、
(悲しく)つらい体験をするのを祈っているのだよ。

何か変?
566デフォルトの名無しさん:2007/07/07(土) 00:31:11
ANSI以前のCで自動変数の配列を直接初期化できないのはまだ有名なほうだと思う。
567495:2007/07/07(土) 00:34:10
>>560
眠いと勉強ははかどらないが、悪口ならいくらでもでてくるからなあ。

>>562
おやおや。私がまるで何も勉強してないとでも。
はい。腐るときは勝手に腐るのでいちいち構わなくてもいいですよ。
自称自己啓発君。>>562君がせめて鬱で自殺しませんように(爆

>>563
さっき言っただろう。
嵐の敵はみんなの無視。
眠くなったら寝るから気にするな。
568デフォルトの名無しさん:2007/07/07(土) 00:35:46
>>566
んだな。
つうかそれ、もし対応して無いコンパイラを使ったら、コンパイル通らないだけ
じゃん。で、エラーメッセージが出力される。
全然困らんぞ。

ほんとうに昔のソースでは、確信犯的にリテラルを書き換えていることがあるが、
そっちのがまだ困るだろね。
ま、それに気づけば、コード書き換えるなり-fwritable-stringsを指定するなり
すればいいわけだが。
569デフォルトの名無しさん:2007/07/07(土) 00:38:05
>>565
「メンテする憂き目」じゃなくて、
メンテする際につらい体験をするのを祈ってるって話だったのか
570デフォルトの名無しさん:2007/07/07(土) 00:39:26
みんなこんなおっさん弄ってあげるなんて親切だなあ
571495:2007/07/07(土) 01:14:31
>>568
古いANSI-C(K&R第2版の頃な)で

void foo {
int a[100] = {0};
...
}

とでも書いてみたまえ。コンパイルは通るがaの要素がa[0]以外全てランダム値で
深刻なバグに発展するかもしれんね?

つまりだね。たかが一つ昔の仕様を回避したところで、
反証にはならんのですね。

それを何を偉そうに「全然困らんぞ」だって?
自分で気づいて直すならまだマシだが、納品後にクレームの電話。待ちますか?
572デフォルトの名無しさん:2007/07/07(土) 01:17:42
納品後ってコンパイル通ったらすぐ納品しちゃうの?そんなに切羽詰った職場なの?
573495:2007/07/07(土) 01:28:59
>>572
ハイハイ。君の言ってる事は
「お前は何時何分地球が何回、回ったときに納品した?」
というレベル。

あっちでママが呼んでますよー。『そろそろ寝なさい』だって。ププ
574495:2007/07/07(土) 01:31:27
もう厨房しか居ないし、寝るかな。
また明日ー。俺が気に入らなかったら削除依頼でも出しときな。
575デフォルトの名無しさん:2007/07/07(土) 01:32:07
明日も来る気ですかw
おっさん忙しいんじゃなかったのかw
576デフォルトの名無しさん:2007/07/07(土) 02:03:04
Kusakabe と毛色は違うが同類だな
577デフォルトの名無しさん:2007/07/07(土) 02:26:42
削除依頼ワラタ

削除したいのはお前だけだって
578デフォルトの名無しさん:2007/07/07(土) 04:20:16
よっぽど自分の間違いを「なかったこと」にしたいんだろうなぁ。
こういう責任の自覚がない香具師が下らん犯罪の元仁になったりするんだ。
くわばらくわばら
579デフォルトの名無しさん:2007/07/07(土) 05:51:35
新しい仕様はC++には取り入れられないのかな?
580デフォルトの名無しさん:2007/07/07(土) 05:51:49
新しい仕様はC++には取り入れられないのかな?
581デフォルトの名無しさん:2007/07/07(土) 05:51:57 BE:115689986-2BP(7)
新しい仕様はC++には取り入れられないのかな?
582デフォルトの名無しさん:2007/07/07(土) 05:52:02
新しい仕様はC++には取り入れられないのかな?
583デフォルトの名無しさん:2007/07/07(土) 10:19:27
>>524
そんな問題とは違うだろ
新しいルールは後から参加してきた守銭奴によって政治的に作られるんだから
自然の法則に従って限界に達して出てきた障害とは一緒にするな
584デフォルトの名無しさん:2007/07/07(土) 10:23:09
585495:2007/07/07(土) 10:55:13
なんだ。捨て台詞しかないのか。ツマラン
586デフォルトの名無しさん:2007/07/07(土) 11:04:21
windowsのSIZEとかPOINTとかRECTの構造体で、
メンバの型をtemplate構文を使うことにより自由に決められるやつってありますか?
こういうのって絶対誰もが考えると思うんだけどWTLにすらなくて・・・
自力で実装するしかないんでしょうか?(´・ω・`)
587デフォルトの名無しさん:2007/07/07(土) 11:07:04
はあ?
588デフォルトの名無しさん:2007/07/07(土) 11:10:46
>>585
いい加減ネタも尽きて来たしな。

>>586
ないね。俺も考えたことあるけど。
589デフォルトの名無しさん:2007/07/07(土) 11:29:17
>>586
あるよ。ほら。
template<typename T>class size
{
T width_;
T height_;
public:
size() : width_(), height_() {}
size(T width, T height) : width_(width), height_(height) {}
size(const size & foo) : width_(foo.width()), height_(foo.height()) {}
size & operator=(const size & foo) {width_ = foo.width(); height_ = foo.height(); return * this;}

bool operator==(const size & foo) const {return width() == foo.width() && height() == foo.height();}
T width() const {return width_;}
T height() const {return height_;}
T area() const {return width() * height();}
};
今作ったからバグってるかも知れないけど。
590デフォルトの名無しさん:2007/07/07(土) 13:03:31
環境依存すらOKのスレで、
古いANSI-Cが前提となっている理由が理解できない。
それは君の勉強不足だろうと。
591デフォルトの名無しさん:2007/07/07(土) 13:18:15
やっぱ無いんですね・・・
とりあえずsizeは参考にさせてもらいます
仕方ないのでboostとか使ってSTL対応の格好いいのを作っちゃうことにします(`・ω・´)
いざ出来ても動作が重いとかサイズを食うとかで結局使わない感バリバリですが…
592デフォルトの名無しさん:2007/07/07(土) 13:22:47
つうかWin32APIに渡す時点で構造体サイズは結局そこに合わせなきゃいけないから
RECT<float>とかしたところでたいした意味はない
593デフォルトの名無しさん:2007/07/07(土) 13:29:28
結局変換の時に一時オブジェクト生成する分オーバーヘッドになるだけですか…
それでもAPIに渡すまででポータブルに扱う分には役立つだろうと思ったけどあまり意味無いですね(´・ω・`)
594デフォルトの名無しさん:2007/07/07(土) 13:32:55
>>593
>589程度のクラスなら、どうせ最適化で消えるだろうからどんどん使えば?
size, point, rect辺りの綺麗にまとまったテンプレートクラスにして公開してくれたら
積極的に使ってあげるよ。
595デフォルトの名無しさん:2007/07/07(土) 21:38:05
C++の質問があります。
map<int, FUNC> MAP;
キーをint型、値を関数ポインタで、関数ポインタに関しては、他のクラスのメンバ関数も
セット出来るようにしたいのですが、FUNCの定義の仕方がイマイチ分かりません。

御願いします。
596デフォルトの名無しさん:2007/07/07(土) 21:40:05
>>595
メンバ関数ポインタを他のクラスのも使えるようにするってあーた・・・・
thisポインタをどうやって区別するつもり?
597デフォルトの名無しさん:2007/07/07(土) 21:40:20
boost::function
598デフォルトの名無しさん:2007/07/07(土) 21:46:26
>>595
つBoost.Bind
599デフォルトの名無しさん:2007/07/07(土) 21:47:36
>>598 bind は型じゃないだろ。
600デフォルトの名無しさん:2007/07/07(土) 21:49:57
仮想関数へのポインタなら、基底クラスの関数ポインタを使っとけば大丈夫。
601デフォルトの名無しさん:2007/07/07(土) 23:36:29
オーバーロードされたコンストラクタについて質問です。

class A
{
  int data;
public:
  A(int x, int y){
    data = x+y;
  }
  A(int x){
    A(x, 0);
  }
};

のような感じで、2つ目のコンストラクタは1つ目のコンストラクタを内部で呼んでいるのですが、
うまく値が入りません。
(これは例なので簡単にしてありますが、実際はもっと複雑なことをしています)
コンストラクタの中で別のコンストラクタを呼ぶことはできないんでしょうか?
いちおうコンパイルは通るのですが。
602デフォルトの名無しさん:2007/07/07(土) 23:39:16
できない。
A(x, 0)は単に一時オブジェクトを作る式となるだけ。
元のオブジェクトとは何の関係も持たない。
603デフォルトの名無しさん:2007/07/07(土) 23:41:01
何でデストラクタは単体で呼べるのにコンストラクタは呼べないの?
604601:2007/07/07(土) 23:42:02
なるほどそういう意味ですか。
ではどうするのがスマートなやりかたでしょうか?
初期化用の関数を作ってそれぞれのコンストラクタから呼ぶのがいいんでしょうか?
605デフォルトの名無しさん:2007/07/07(土) 23:47:29
結局それが一番だよ。
606デフォルトの名無しさん:2007/07/07(土) 23:47:43
>>603
placement new を使えば単体でコンストラクタを実行することはできる。
でもコンストラクタの中で自身に対して使っても正しい意味は成さない。
デストラクタだって、デストラクタの中から自身に対して呼んだりしちゃいけない。
607デフォルトの名無しさん:2007/07/08(日) 00:13:21
deleteするとき、与えられたポインタの型が元のポインタの型ではなかった場合でも、正常に削除できますか?

int *int_ptr = new int;
void *void_ptr = reinterpret_cast<void *>(int_ptr);
...
delete void_ptr;
608デフォルトの名無しさん:2007/07/08(日) 00:24:20
PODならmalloc/freeでいいんでないの。
609デフォルトの名無しさん:2007/07/08(日) 00:38:01
>>607
deleteでは、オブジェクトのデストラクタを呼んだ後
メモリを確保する必要があって
そのデストラクタが正しく呼べるなら違うポインタ型にしてもOk。
610デフォルトの名無しさん:2007/07/08(日) 00:48:13
みなさんデストラクタの戻り値はチェックしていますか?
611デフォルトの名無しさん:2007/07/08(日) 00:49:47
>>610
基本中の基本
612デフォルトの名無しさん:2007/07/08(日) 00:56:12
僕はコンストラクタの戻り値もチェックしてまつよ(`・ω・´)
613デフォルトの名無しさん:2007/07/08(日) 00:56:44
>>610 無理。
614デフォルトの名無しさん:2007/07/08(日) 00:59:01
>>607 ダメ。未定義動作。 5.3.5p3
615デフォルトの名無しさん:2007/07/08(日) 01:13:30
C++を始めてする人にオススメという本はないでしょうか
自分はC言語を少し齧った程度で、オブジェクト指向の意味すらわかりません
616デフォルトの名無しさん:2007/07/08(日) 01:19:40
>>615
メイヤーの「Eiffelオブジェクト指向入門」がオススメ
617デフォルトの名無しさん:2007/07/08(日) 01:27:51
>>616
教えてくれてありがとうございます、明日辺り早速本屋で探してこようと思います
618デフォルトの名無しさん:2007/07/08(日) 01:39:11
おいおい
619617:2007/07/08(日) 01:40:38
>>618
おいおいとか言われたら不安になるじゃないかぁーーー!!
620デフォルトの名無しさん:2007/07/08(日) 01:41:25
おれはこのページだけで勉強した
ttp://www.asahi-net.or.jp/~yf8k-kbys/

少し古いけど初心者が勉強するには十分
621デフォルトの名無しさん:2007/07/08(日) 01:49:14
>>620
全俺が感動した
622デフォルトの名無しさん:2007/07/08(日) 02:04:16
>>617
俺もその本は持っているが、とても実践向きじゃない。
十数年前はオブジェクト指向なんて言葉自体珍しかったから、名前だけで買ってしまった。

Eiffel(エッフェル)なんて、謎の言語を覚える気なら敢えて止めはしない。
623デフォルトの名無しさん:2007/07/08(日) 02:24:20
オブジェクト指向理解のためなら、JavaかC#あたりのほうがとっつきやすい。
C++はいろいろ細かいルールが多すぎて焦点がぼける感がある。
624デフォルトの名無しさん:2007/07/08(日) 02:37:45
細かいルール云々というよりC++はマルチパラダイムなために、
オブジェクト指向に限らないというのが逆に理解のネックになるのかもな。

初心者だった頃先輩に薦められてModernC++Designを読んだときは一気に挫折しかけたwww
625デフォルトの名無しさん:2007/07/08(日) 07:30:41
SADでも必死に会社に行っている人 [メンタルヘルス]
626デフォルトの名無しさん:2007/07/08(日) 07:57:28
>>607
"デストラクタ virtual" でぐぐれ
627デフォルトの名無しさん:2007/07/08(日) 08:41:03
>>620
そのサイトは間違いを指摘しても直さないから余りお勧めできないが。
628デフォルトの名無しさん:2007/07/08(日) 09:14:02
629デフォルトの名無しさん:2007/07/08(日) 09:44:26
630デフォルトの名無しさん:2007/07/08(日) 09:55:37
C の勉強を K&R だけでやった。
C++ というかオブジェクト指向の入門を C Magazine の
連載だったと思う A級B型C++ だけでやった。

あとはテクニック本をよみつつ、本当に疑問に思った仕様は
おおもとの仕様書(規格書)にあたる。
631デフォルトの名無しさん:2007/07/08(日) 10:02:40
>>627
暇そうなのにね
632デフォルトの名無しさん:2007/07/08(日) 10:05:09
不明=別にどっちでもいいよって事だな
えぴの記事は内容は古いけど初心者がC++の深遠を覗くにはいいと思うし
あとC++プライマーとか普通の入門書を一冊手元においておけばどんなページでも役に立つと思うぜ
633デフォルトの名無しさん:2007/07/08(日) 10:06:09
>>630
仕様とパラダイムは違うからねぇ
634デフォルトの名無しさん:2007/07/08(日) 10:39:28
VC++とWin32APIプログラミングの違いが分かりません(´・ω・`)
635デフォルトの名無しさん:2007/07/08(日) 10:51:09
ワープロと小論文の違いがわかりませんと言われても困る。
636デフォルトの名無しさん:2007/07/08(日) 11:12:10
VC++使ってるけど Win32 API なんてほとんど使わないなぁ。
637デフォルトの名無しさん:2007/07/08(日) 11:44:44
俺ライブラリとかATLとかその他公開されているライブラリにラップして使ってる人が殆どだと思う
638デフォルトの名無しさん:2007/07/08(日) 13:28:24
10年前にVC++6.0使ってたんだけど、
今はWindowsでのC++開発環境って何がメジャーなの?
VC++2007ってありますか?
639デフォルトの名無しさん:2007/07/08(日) 13:30:39
残念ながらVS2008になりそうです
640デフォルトの名無しさん:2007/07/08(日) 13:41:35
>>638
「VC++」でぐぐるとVisual Studio 2005のページが出てくるから、とりあえずそこ読んでおけ
641デフォルトの名無しさん:2007/07/08(日) 13:44:19
cygwin/gcc/g++
mingw
642デフォルトの名無しさん:2007/07/08(日) 15:24:33
コンパイル時に数が決まっている要素の数をカウントしたいんですが、
643デフォルトの名無しさん:2007/07/08(日) 15:29:09
elementofマクロの話?
644デフォルトの名無しさん:2007/07/08(日) 15:47:34
すみません。途中で送信されてしまったようです。
コンパイル時に数が決まっている要素(あるクラスを継承しているクラス)の数をカウントしたいんですが、
マクロの様なものを単純にコピペするだけでカウントするにはどうすればいいんでしょうか。
645デフォルトの名無しさん:2007/07/08(日) 16:01:43
詳細が分からんと何も言えん
646デフォルトの名無しさん:2007/07/08(日) 16:18:54
あるクラスを継承しているクラスの総数を知りたい?
それはリンク段階でしか判らないこと無いか?
647デフォルトの名無しさん:2007/07/08(日) 16:36:31
同一ソースコードに書いてあるので、コンパイル時にコードを下へ逐次見ていくだけで機械的にカウントできます。
648デフォルトの名無しさん:2007/07/08(日) 16:37:28
今boost::preprocessorを使ってもがいてます...
649デフォルトの名無しさん:2007/07/08(日) 16:46:40
VC++1.51をWIN98で使ってるんですが、DOSのプログラムを組んで走らせると
ハングする事が多いです。BCC5.5でコンパイルすると問題無く動くのですが。
1.51でDLL16使うのはWIN95までしか対応してないのでしょうか。
650デフォルトの名無しさん:2007/07/08(日) 16:58:25
>>649
IDE自体はWin9x/NT系で動かすとハングしやすいな。
デバッグ実行は特にめろめろだが、
作ったプログラムが単体でハングするならそれはあなたの作ったバグ。
651デフォルトの名無しさん:2007/07/08(日) 18:10:53
builderで、警告が100個超えたら、
「エラーあるいは警告が多すぎる」と、最後にエラーが出てきました。
警告の上限の数は、決まってますか?
652デフォルトの名無しさん:2007/07/08(日) 19:26:18
C言語でputchar('a');みたいに'あ'を出力するにはどうすれば良いでしょうか?

ググってみたら
#include <stdio.h>
 #include <wchar.h>
int main(void)
{
putwchar(L'あ');
return 0;
}
こうかと思ったのですが、どうも違うようでよく分からないですorz
653デフォルトの名無しさん:2007/07/08(日) 19:27:39
printf("あ");
654デフォルトの名無しさん:2007/07/08(日) 19:27:52
Visual C++ 2008 になったら tr1 とかも実装されるのかな。
C99 互換モードとかもつくのかな。
655デフォルトの名無しさん:2007/07/08(日) 19:28:17
>>651
コンパイラ次第
656デフォルトの名無しさん:2007/07/08(日) 19:31:01
>>653
書いた後でそう言われそうだと思ったけど、
そういう意味じゃなくて、
int hoge='a';
putchar(hoge);
こういう感じで'あ'を扱うにはどうしたら良いでしょうか?
657デフォルトの名無しさん:2007/07/08(日) 19:36:28
a と あ って全然違うだろ。1バイトと2バイトだし
658デフォルトの名無しさん:2007/07/08(日) 19:37:19
UTF-8 なら3バイト。
659デフォルトの名無しさん:2007/07/08(日) 19:39:29
>>656
char hoge="あ";
putchar(hoge);
660デフォルトの名無しさん:2007/07/08(日) 19:39:44
>>659
コンパイルエラー
661デフォルトの名無しさん:2007/07/08(日) 19:40:43
wint_t hoge='あ';
putwchar(hoge);
662デフォルトの名無しさん:2007/07/08(日) 19:40:44
>>659
それなら、
char hoge[]="あ";

にしないとまずいだろ。
663デフォルトの名無しさん:2007/07/08(日) 19:43:25
あまりにもひどい流れだ
664デフォルトの名無しさん:2007/07/08(日) 19:48:08
>>660
自分もそうやるのかと思ったんですが、
それだと何も表示されないです。(VC++2005で)
665デフォルトの名無しさん:2007/07/08(日) 19:56:05
ぬるぽ
666デフォルトの名無しさん:2007/07/08(日) 19:56:43
666
667デフォルトの名無しさん:2007/07/08(日) 20:02:53
ロケール?
668デフォルトの名無しさん:2007/07/08(日) 20:06:59
あはなぁ・・・・
669デフォルトの名無しさん:2007/07/08(日) 20:16:32
文字型を文字列で初期化できるわけねーだろ
670デフォルトの名無しさん:2007/07/08(日) 20:22:14
>>652
↓で良いが、例えばVC++8.0(VS2005)ではバグによって何も表示されない。
wchar_tやロケールまわりをまともに使える処理系か確認するこった。

#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main(void)
{
    setlocale(LC_CTYPE, "");
    putwchar(L'あ');
    return 0;
}
671デフォルトの名無しさん:2007/07/08(日) 20:29:35
wchar_t を使う事は根本的な解決になってるんだろうか。
672デフォルトの名無しさん:2007/07/08(日) 21:06:30
>>652
#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main(void)
{
setlocale(LC_ALL, "");
putwchar(L'あ');
return 0;
}
Visual C++ 2005だとこれだけではバグってだめみたいだけど。
673デフォルトの名無しさん:2007/07/08(日) 21:23:41
>>670,>>672
ありがとうございます。
ちょっとbcc入れるのに手こずってました。
bccだと無事に動くっぽいですが、VCではダメなんですね。
しかしこれって単純に出来るものかと思ってたら、
意外と上手いこといかないものなんですね><
674デフォルトの名無しさん:2007/07/08(日) 21:25:33
>>673
VC++でも以前のバージョンなら問題なく動くんだがな
675デフォルトの名無しさん:2007/07/08(日) 21:39:11
Visual Studio 2005買うか迷う
早く2007か2008発売してくれたらいいんだけどな…
676デフォルトの名無しさん:2007/07/08(日) 21:41:47
今買うのはいかにも時期が悪いだろう
バグ持ちだしな(SPでも直ってねぇし)
677デフォルトの名無しさん:2007/07/08(日) 22:26:22
おれはEclipse派
678デフォルトの名無しさん:2007/07/08(日) 22:50:56
あれだけ難しいと思ってた「C言語ポインタ完全制覇」が今なんとなく読んだら
全部スラスラと理解できてワロタ
昔買った本読み返すとあぁ俺ちゃんと成長してると実感できてうれしいなw
679デフォルトの名無しさん:2007/07/08(日) 22:52:44
ちょうどあるから読んでみよっと
680デフォルトの名無しさん:2007/07/08(日) 22:55:05
Modernはいまだに7割くらいしか理解できん…
681デフォルトの名無しさん:2007/07/08(日) 23:54:54
>675
2008は4Q(多分12月ごろ)。MSDNにすれば?
682デフォルトの名無しさん:2007/07/09(月) 01:30:28
すみませんが質問です。
ある関数のバイナリを表示するプログラムを作ったのですが思ったとおりに表示されません。
source:
#include <stdio.h>

int func(void)//この関数のバイナリを表示したい。
{
  return 0x12345678;
}

void fend(void){}//func関数の終わりをこの関数のアドレスから求める。

int main(void)
{
  char *p;
  char i;
  p = (char *)func;//func関数のアドレスをchar型のポインタへ代入。
  for(i=1; p<(char *)fend; i++) {
    printf("%2.2X ", *p++);//func関数のバイナリを1バイトごとに表示。
    if(!(i%16)) putchar('\n');//とりあえず16バイトごとに改行。
  }

  return 0;
}
result:
55 FFFFFF8B FFFFFFEC FFFFFFB8 78 56 34 12 5D FFFFFFC3

55 8B EC B8 78 56 34 12 5D C3と表示されるのを期待していたのですがうまくいきません。
コンパイラはBorlandコンパイラです。
根本的な間違いの指摘、もしくは強引な方法でうまく表示させる方法を教えてください。
683デフォルトの名無しさん:2007/07/09(月) 01:34:30
>>682
そこまでできてるんなら char を unsigned char にすればいけそうな気はするね。
でも、移植性のあるコードじゃないことは理解しておけよ。
684682:2007/07/09(月) 01:36:30
685デフォルトの名無しさん:2007/07/09(月) 01:37:00
pの型を char → unsigned char
686デフォルトの名無しさん:2007/07/09(月) 01:38:46
ついでに、%2.2Xは%Xで大丈夫な希ガス
687682:2007/07/09(月) 01:39:53
ミスりました。
>>683
ありがとうございます。
解決できました。
移植性のないコードであることは百も承知でございます。
cl.exeでコンパイルするとうまくC3のret命令で終わらなかったです。
ただ、アセンブリの勉強のために作ったので自らの環境で動けば問題なしです。
ご丁寧にどうもありがとうございました。

688デフォルトの名無しさん:2007/07/09(月) 01:45:28
1byte文字、2byte文字が混ざった文字列から、
1文字ずつ読み込んで、これが1byteか2byteか判定するにはどうしたら良いでしょうか?

お願いします。
689デフォルトの名無しさん:2007/07/09(月) 01:48:08
txtから数字を読み込んでバブルソートするプログラムを組みたいのですが
(数字は一行ずつ記述された状態)
出来ればそのあとさらにtxtに出力したいです
fgetsに関する記述方法がいまいち理解できないです
この後にどのような記述をすればいいのでしょうか

#include<stdio.h>
#include<stdlib.h>
#define swap(type,x,y) do{type t=x;x=y;y=t;}while(0)
int bubble(int a[],int n)
{
int i,j;
for(i=0;i<n-1;i++){
for(j=n-1;j>i;j--){
if(a[j-1]>a[j]){
swap(int,a[j-1],a[j]);
}
}
}
}
int main(void)
{
FILE *fp;
if((fp=fopen("data.txt","r"))==NULL){
printf("file open失敗\n");
exit(1);
}
while(fgets(
690デフォルトの名無しさん:2007/07/09(月) 01:49:02
gccだと型そのままでも %02hhX にすれば問題なく表示できるんだが
bccでも同じなのかどうかは知らない
まぁ、バイナリ扱うなら unsigned char にしとくほうが良いだろうけど
691デフォルトの名無しさん:2007/07/09(月) 01:56:53
>>689
フォーマットが固定ならfscanfで読み込んでfprintfで出力すれば良いだけだと思うけど

fgetsで読み込みたいなら読み込んだ奴をstrtolするかsscanfにかければいいし
692デフォルトの名無しさん:2007/07/09(月) 02:08:14
カレーが食べたいよ
693デフォルトの名無しさん :2007/07/09(月) 04:08:03
>>678
遅レスだけど、俺もスラスラ読めて、さらには
「JAVAだとどうだとか、ほっといたれや」
とまで思ったりして、はじめ読んだときは「なるほどな〜」と
思ってたのに、今じゃ文句までつけやがる俺。
どんどんひねくれていく自分に嫌気がさす。
694デフォルトの名無しさん:2007/07/09(月) 07:03:58
>>682
func と fend がメモリ上で連続する保証はあるの?
695デフォルトの名無しさん:2007/07/09(月) 08:13:30
>>694
ない。でも>>687
696デフォルトの名無しさん:2007/07/09(月) 14:14:04
age
697デフォルトの名無しさん:2007/07/09(月) 14:15:09
sage
698デフォルトの名無しさん:2007/07/09(月) 15:40:00
おしえてください (VC++ 6.0 MFC)
エディットコントロールに複数行の文字列を表示させた時、
その時のスクロールの位置を一番下の行にしたいのですが、うまくいきません。
m_editMsg.SetWindowText( m_strLog );
m_editMsg.SetScrollPos( SB_VERT, m_editMsg.GetScrollLimit( SB_VERT ) );
この処理を行うと、スクロールバー自体は一番下の行に移動した様な表示になるのですが、
表示される文字列データは、先頭部分が表示されてしまいます。
どうしたらいいのか教えて下さい。お願いします。
699デフォルトの名無しさん:2007/07/09(月) 16:24:14
エディットは、キャレットの位置を動かせ
EM_SETSEL 使えばいいかな。
700デフォルトの名無しさん:2007/07/09(月) 16:44:31
>>687
関数間が NOP (90h) で埋められてるなら
NOP が出てくるまで・・・と出来そうな気はするけど、
コードの途中で境界合わせに NOP が出てこない保証もないし、
ダメかなあ・・・。
701デフォルトの名無しさん:2007/07/09(月) 16:58:25
>>700
定義順に関数アドレスが並ぶ保証はどこにもないよ
702デフォルトの名無しさん:2007/07/09(月) 17:12:31
>>699
ありがとうございます。調べてみます。
703デフォルトの名無しさん:2007/07/09(月) 17:51:57
>>701
?
704デフォルトの名無しさん:2007/07/09(月) 18:17:06
>>700
関数間がNOPで埋められる保証もどこにも無いよ。
705デフォルトの名無しさん:2007/07/09(月) 19:37:39
>>704
「関数間が NOP (90h) で埋められてるなら」
という条件付きで話してる事に、そう言われても・・・
706デフォルトの名無しさん:2007/07/09(月) 19:42:30
この手の板にはよくあること
707デフォルトの名無しさん:2007/07/09(月) 19:43:36
関数のアドレスが、ジャンプテーブルだったりするのも
よくある話。
708デフォルトの名無しさん:2007/07/09(月) 20:06:18
C++だけではGUIって作れない?
API勉強しないとだめ?
709デフォルトの名無しさん:2007/07/09(月) 20:09:33
>>708
「C++だけ」ってのが「標準C++ライブラリだけ」ってことならyesだな
710デフォルトの名無しさん:2007/07/09(月) 20:19:22
>>709
ありがとう。さすがにCUIばっかりで飽きてきちゃったからAPI勉強してみる(`・ω・´)
711デフォルトの名無しさん:2007/07/09(月) 20:34:28
>>709
否定形の問いかけに対して安易にyesと答えてはいけないw
712デフォルトの名無しさん:2007/07/09(月) 20:56:37
>>705
VC2005だとそうなっては無かったから、
結構多くのコンパイラでその仮定は間違っているんじゃ無いの? と思っただけ。
どっちにしても>>700はあんまり意味無さそうだね。
713デフォルトの名無しさん:2007/07/09(月) 21:24:20
>>707
vc8のインラインアセンブラだと
 × call printf
 ○ call dword ptr [printf]
 ○ call test_func
 ○ call dword ptr [test_func]
(test_funcは同じオブジェクト内の自作関数)
じゃないとうまく動かなかった。
不思議なような、そうでもないような。うーん。
714デフォルトの名無しさん:2007/07/09(月) 21:32:18
call printfがだめなのは、ランタイムDLLを使っているからという可能性は無い?
715デフォルトの名無しさん:2007/07/09(月) 21:40:08
>>714
That's right !  そのとおりだった!

ってか、前にMTでテストしたはずだったんだけどな・・・orz
716デフォルトの名無しさん:2007/07/09(月) 23:51:37
関数最後のサブルーチンコールはジャンプで実装する最適化もあるぞ。
717デフォルトの名無しさん:2007/07/10(火) 00:19:18
>>712
昔の VC6 くらいそうなってなかったかなあ。
718デフォルトの名無しさん:2007/07/10(火) 09:55:26
2005もDebugとReleaseで違うしな
719デフォルトの名無しさん:2007/07/10(火) 21:51:23
質問です。

基本的にMFCのDoc-Viewを用いたプログラムです。自分で生成した特定の
ウィンドウのスナップショットを、画像に保存したいのですが、どのようなアプローチで
進めたらいいのか悩んでいます。

1. 非アクティブまたは非表示な場合でも、フレームを含めたウィンドウ全体を
画像として取得するような手段はあるのでしょうか?

2. 1.が不可能なら、非アクティブまたは非表示で、ウィンドウの内容(例えばCViewの
中身)のみを取得する手段はあるのでしょうか?

XP VC2005 SP1
720デフォルトの名無しさん:2007/07/10(火) 22:07:13
fgets(str,N-1,stdin);
printf("%d",(int)strlen(str));

↑な感じのコードを書いて実行させると、
【実行画面】
>hoge
5

となるのですが、これってどうなっているのでしょうか?
721デフォルトの名無しさん:2007/07/10(火) 22:12:05
hogeの後に改行文字がくっついてて、それも数えられてるから
722デフォルトの名無しさん:2007/07/10(火) 22:14:58
あぁ、改行文字を読み込んでたのか!
ヌル文字は入れないはずなのになんでかと思ったら…。
>>721サンクスです!
723デフォルトの名無しさん:2007/07/10(火) 23:00:52
>>718
2005だとRelease,Debugとも基本的にNOPは使ってないよ。
724デフォルトの名無しさん:2007/07/10(火) 23:24:29
char str[10]="piyo";

これでstrが指す場所を"yo"にしたいのですが、
どうすれば良いでしょうか?
725デフォルトの名無しさん:2007/07/10(火) 23:25:23
>>724
strcpy(str, "yo");
726デフォルトの名無しさん:2007/07/10(火) 23:28:13
>>725
char *str2 = &str[2];
727デフォルトの名無しさん:2007/07/10(火) 23:31:52
>>725
文字列をコピーしたいってより、yoの場所まで移動させたいのです。
array[i++]=strtol(str,&err,0);
これを繰り返し行う際にstrをstrから任意のバイト分進めた値にして
文字列を完全に走査、数値格納したいのです。
728デフォルトの名無しさん:2007/07/10(火) 23:39:50
そのstrは配列だからそもそも指すとかそういう表現はしない
&str[2]とかstr+2好きなように表記すればよか
これが気持ち悪いなら別途charへのポインタ用意して
char *p=str;
とした後に読み進めたいバイト分だけp+=2みたいにインクリメントすればいい
729デフォルトの名無しさん:2007/07/10(火) 23:41:26
char* p = &str[2];
でいいんじゃね
730デフォルトの名無しさん:2007/07/10(火) 23:44:48
str[i]2
731デフォルトの名無しさん:2007/07/10(火) 23:46:04
>>727
strtol の使い方が知りたかっただけなんだね

#include<stdio.h>
#include<stdlib.h>

int main(void){
long value[100];
char str[]="100 200 300 400 500 x 600 777";
char *ptr=str, *endptr;
int i, value_num=0;

for(value_num=0;value_num<100;value_num++){
value[value_num]=strtol(ptr, &endptr, 10);
if(ptr==endptr) break;
ptr=endptr;
}

for(i=0;i<value_num;i++){
printf("%ld\n", value[i]);
}

return 0;
}
732デフォルトの名無しさん:2007/07/10(火) 23:47:28
>>726,>>728-729
なるほど、ありがとうございます。
それを参考にちょっと今から思った通り出きるか作ってみます。
733732:2007/07/11(水) 00:34:56
で、出来た…。
>>731さんのものを参考に、一行にある複数数字(途中非数字あり)
を格納して表示するプログラムを作ってみました。
これってあと直すところとかどうでしょうか?

>12 32 aaa43jfie55 32
たとえば入力が上のようなら、
12,32,43,55,32が配列に格納されて表示される仕様です。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 256
int main(void){
long value[N];
char str[N];
char *ptr=str, *endptr;
int i, value_num=0,l;
fgets(str,N,stdin);
l=strlen(str)-1;
for(i=0;i<l;i++){
if(strtol(ptr, &endptr, 10)!=0)
value[value_num++]=strtol(ptr,&endptr,10);
ptr=++endptr;
}
for(i=0;i<value_num;i++){
printf("%ld\n", value[i]);
}

return 0;
}
734デフォルトの名無しさん:2007/07/11(水) 00:37:08
#define N 256
735デフォルトの名無しさん:2007/07/11(水) 00:37:13
あれ、>>732>>731さんへのアンカを入れ忘れてました…。
申し訳ない、>>731さんも激しくありがとうございます。
736デフォルトの名無しさん:2007/07/11(水) 01:01:54
どなたかC++に詳しい方、教えてください。今日、はまりました。
以下ClassAに、オーバロードしたfunc()という関数が2つがあるとします。
ClassAを継承したClassBをnewし、classb->func(NUM_2);をコールすると、期待通りに
ClassA::func(NUM)がコールされるのですが、(1)だけオーバライドしたClassCを
newし、classc->func(NUM_2);をコールするとClassC::func(int, NUM)がコールされて
しまいます。
期待した動作はClassA::func(NUM)がコールされる事でした。
これはC++の仕様なのでしょうか。コンパイラがどういう論理でenumを使用した関数の
オーバライド/オーバロードを解決しているのかご存知の方、ご教示お願いします。

enum NUM { NUM_1, NUM_2, NUM_3 };
class ClassA {
virtual int func(int a, NUM b = NUM_1); // ←(1)
virtual int func(NUM a = NUM_1); // ←(2)
};
class ClassB : public ClassA
{
// ClassAの(1),(2)はオーバライドしていないクラス
};
class ClassC : public ClassA
{
// ClassAの(1)だけをオーバライド
int func(int a, NUM b = NUM_1);
};
737デフォルトの名無しさん:2007/07/11(水) 01:03:17
738デフォルトの名無しさん:2007/07/11(水) 01:06:12
呼び出し側のコードはどうなってんの
739デフォルトの名無しさん:2007/07/11(水) 01:12:08
NUMばっか出てきてとか見づれーんだよ。もっと考えて書けよドカスが
>classc->func(NUM_2);をコールするとClassC::func(int, NUM)
理由は>>737
ClassCでfunc(int,NUM)を宣言しちゃったから、ClassAのfunc(int,NUM)が見えなくなってる。
あとvirtualな関数にデフォルトパラメータつけるな
740デフォルトの名無しさん:2007/07/11(水) 01:58:14
>>737
>>738
>>739
見づらくてすいません。
C++にそんな仕様があるとは知りませんでした。
ありがとうございました。

参考までに
>あとvirtualな関数にデフォルトパラメータつけるな
は何故でしょうか?
741デフォルトの名無しさん:2007/07/11(水) 02:10:29
デフォルトパラメータは静的な型に依存する

class B{
virtual void foo(int a=300){std::cout << a;}
}
class D{
void foo(int a=100){std::cout << a;}
}

B* pb = new D();
pb->foo(); //300と表示される

D* pd = new D();
pd->(foo); //100と表示される

だった筈
742デフォルトの名無しさん:2007/07/11(水) 02:11:50
>>741
> pd->(foo);
モチツケ
743デフォルトの名無しさん:2007/07/11(水) 02:24:20
>>741
なるほど。納得しました。
ありがとうございます。
744デフォルトの名無しさん:2007/07/11(水) 10:08:49
>>188
PHPアプリとCアプリとログ出力先を共通化という
無茶な事を要求されているときも
行単位の一発書き込みなら大丈夫かな?

2プロセス立ち上げてそれぞれ適当に書き込みをさせて
100万回くらいテストしたんだけど これで混ざんなかったから
多分大丈夫だよね?
745デフォルトの名無しさん:2007/07/11(水) 10:52:14
>>744
「行単位の一発書き込み」がシステムコールレベルでそうなっているなら大丈夫。
具体的には、(直接的または間接的に)O_APPENDでopen()されており、write()
一発で1行を書き込んでいるなら大丈夫。
それから少しでもズレるならダメ。

Win32の場合、O_APPENDに相当する機能がCreateFile()に存在しないので、
*必ず*排他が必須になるようだ。
746デフォルトの名無しさん:2007/07/11(水) 14:55:19
質問失礼します。
シャノンの符号化法による符号語生成プログラムと、
表計算ソフトを用いた符号語生成の違いについて説明して頂けないでしょうか?
よろしくお願いします。
747デフォルトの名無しさん:2007/07/11(水) 16:23:30
>>746
表計算ソフトを用いた符号語生成って、何のことか教えて。
748デフォルトの名無しさん:2007/07/11(水) 21:59:26
>>743
ちなみに741の問題を回避するためにもNVIパターンが使えるぞ。
749デフォルトの名無しさん:2007/07/12(木) 08:23:23
すみません
string型でファイル名を持っているとき、それをオープンしようとすると
エラーが出ます。char型にするにはどうすれば良いですか?
750749:2007/07/12(木) 08:26:48
自己解決しました
751デフォルトの名無しさん:2007/07/12(木) 08:26:59
つc_str()
752デフォルトの名無しさん:2007/07/12(木) 08:27:49
ありがとうございました
753デフォルトの名無しさん:2007/07/12(木) 08:51:04
ファイルを読み込むとき、終端で必要以上のサイズを
読み込むと配列が最後まで埋まってしまいます
どうすれば実データのみ読めますか??

fp.read(str,N); とすると strのサイズはNになります
754デフォルトの名無しさん:2007/07/12(木) 08:58:00
何使って読み込んでるの? fp の型は?
755デフォルトの名無しさん:2007/07/12(木) 09:04:02
fstream fp ("filename", ios::in | ios::binary );

なんですけど、fp.read(str,N); の戻り値は、istream 型です

どうすればサイズがわかりますか??
756755:2007/07/12(木) 09:24:03
自己解決しました

fp.gcount();で読み込みサイズが出ました
757デフォルトの名無しさん:2007/07/12(木) 13:10:42
すみません
サイズの小さいファイルをクローズしようとするとエラーが出ます
開いてから閉じるまでの期間が短すぎる為だと思います
どうしたらいいでしょうか?
758デフォルトの名無しさん:2007/07/12(木) 13:12:24
>>757
エラーメッセージ貼れ。できれば問題を再現できるソースもな。
759デフォルトの名無しさん:2007/07/12(木) 13:22:08
>>758
すみません
fstream fp ("filename", ios::in | ios::binary );で開いたファイルが
閉じられているかどうかを調べる方法はないですか?
760デフォルトの名無しさん:2007/07/12(木) 13:27:08
failbit で状態が調べられるんですけど、
close()した時点でwindowsからエラーが出てしまいます

そのため状態は取得できません・・・
761デフォルトの名無しさん:2007/07/12(木) 13:34:06
コンパイラを変えたらエラー出ません 無視して別のコンパイラ使います
762デフォルトの名無しさん:2007/07/12(木) 13:50:53
763デフォルトの名無しさん:2007/07/12(木) 14:10:00
649>> はメモリモデルをHUGEにしてみよう。
764デフォルトの名無しさん:2007/07/12(木) 14:31:12
1〜136の昇順に並んでる数字の列をランダムな順に並び替えたい
765デフォルトの名無しさん:2007/07/12(木) 14:34:01
数列をstd::vector<T>の形で用意してやれば
std::random_shuffle()で終了〜
やっぱC++って最高だろ?そうだろ、そうだといえよコラ
766デフォルトの名無しさん:2007/07/12(木) 15:33:55
>>764
136って…麻雀?

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int hairetsu[136],i,j,k;
srand((unsigned)time(NULL));
for(i=0;i<136;i++)hairetsu[i]=i;
for(i=0;i<136;i++)j=rand()%136,k=hairetsu[i],hairetsu[i]=hairetsu[j],hairetsu[j]=k;
for(i=0;i<136;i++){printf("%4d",hairetsu[i]);if(i%17==0)printf("\n");}
return 0;
}

767デフォルトの名無しさん:2007/07/12(木) 15:40:55
>>765
配列でも構いやせんぜ、旦那。
  int value[135];
      :
      :
  std::random_shuffle(value, value + 135);
768デフォルトの名無しさん:2007/07/12(木) 15:58:15
135?
769デフォルトの名無しさん:2007/07/12(木) 22:48:12
VC++を使ってます

class A{
char *buf[] = { "数学", "英語", "理科" };
};
と書くと

.\prac.cpp(6) : error C2059: 構文エラー : '{'
.\prac.cpp(6) : error C2334: '{' の前に予期しないトークンがありました。関数の本体は無視されます

って出ちゃうんですがクラスの中でポインタを初期化しちゃいけないって言う決まりみたいなのがあるんでしょうか?
770デフォルトの名無しさん:2007/07/12(木) 22:50:46
>>769
静的整数メンバ以外はダメ
771デフォルトの名無しさん:2007/07/12(木) 22:51:23
メンバ変数ならコンストラクタで初期化しろ
772デフォルトの名無しさん:2007/07/12(木) 22:51:50
>>770
わかりました
ありがとうございます
773デフォルトの名無しさん:2007/07/12(木) 22:52:00
間違えた
staticでconstな整数型以外はダメ
774デフォルトの名無しさん:2007/07/12(木) 22:52:29
>>771
了解です
ありがとうございます
775デフォルトの名無しさん:2007/07/12(木) 23:13:09
class A {
 char *buf[3];
public:
 A() {
  buf[0] = "数学";
  buf[1] = "英語";
  buf[2] = "理科";
 }
};

こうなるんかな? なんかダサイぞ
776デフォルトの名無しさん:2007/07/12(木) 23:35:03
>>775
試しにそれ実行したら
なんかすごいエラー出ますた
777デフォルトの名無しさん:2007/07/12(木) 23:40:14
メモリ確保してないのに代入するとあぼん
778デフォルトの名無しさん:2007/07/12(木) 23:42:41
std::vector<std::string>使えよ
779デフォルトの名無しさん:2007/07/12(木) 23:44:51
これでどう?
class A {
 char *buf[3];
public:
 A() {
  buf[0] = new "数学";
  buf[1] = new "英語";
  buf[2] = new "理科";
 }
};
780デフォルトの名無しさん:2007/07/12(木) 23:46:17
入門書読めば解決
781デフォルトの名無しさん:2007/07/12(木) 23:47:29
インデント表現するために全角スペース使ってるからだろ。
782デフォルトの名無しさん:2007/07/12(木) 23:49:19
>>778
<..>使ったことありません,oTZ
783デフォルトの名無しさん:2007/07/12(木) 23:50:28
>>779
>>775はコピペしたせいで全角空白が認識されてしまったみたいです。
プラグラムの内容とは関係なかったです
長々と申し訳ないです
ありがとうございます
784デフォルトの名無しさん:2007/07/13(金) 00:06:53
const付けとけよ
785デフォルトの名無しさん:2007/07/13(金) 00:11:17
class A {
 const char * const buf[3];
public:
 A() : buf(...) {}
};

こうしたい場合、bufはどうやって初期化すればいいの?
786デフォルトの名無しさん:2007/07/13(金) 00:24:38
配列リテラルでは初期化できないはずだから、他に定義したポインタを持ってきて初期化することになるのでは
787デフォルトの名無しさん:2007/07/13(金) 00:28:00
配列は初期化リストが使えないから無理なんじゃねw
788デフォルトの名無しさん:2007/07/13(金) 00:28:48
#include <iostream>

class A {
static const char* const buf[3];
public:
A() {}
void operator()(std::ostream& os) {
os << buf[0] << buf[1] << buf[2] << std::endl;
}
};
const char* const A::buf[3] = {"nullpo","nul","aa"};

int main() {
A a;
a(std::cout);
}
あんまり意味が無いどころか臭ってくるけどこんな感じで
789デフォルトの名無しさん:2007/07/13(金) 09:45:56
>>777
これはひどい
790デフォルトの名無しさん:2007/07/14(土) 09:09:48
すいません質問です。
static struct s_keywords funcs[] = {
{ "+", FTYPE(FTYPE_SYS, FTYPE_ANY_ARGS), KW_ADD },
{ "-", FTYPE(FTYPE_SYS, FTYPE_ANY_ARGS), KW_SUB },
{ "*", FTYPE(FTYPE_SYS, FTYPE_ANY_ARGS), KW_TIMES },
{ "/", FTYPE(FTYPE_SYS, FTYPE_ANY_ARGS), KW_QUOTIENT },
{ "divide", FTYPE(FTYPE_SYS, 2), KW_DIVIDE },
{ ">", FTYPE(FTYPE_SYS, 2), KW_GT },
{ "<", FTYPE(FTYPE_SYS, 2), KW_LT },
{ NULL, -1, -1 }
};
これって配列なのでしょうか?
どういうふうに解釈すれば良いんでしょうか?
791デフォルトの名無しさん:2007/07/14(土) 09:21:33
そのコード書いたやつに聞けよ。
792デフォルトの名無しさん:2007/07/14(土) 09:51:11
オマエはEmacsのソース読んでて、
わからなかったらRMSに聞きに行くのか?
オマエはLinuxのカーネル読んでて、
わからなかったらリーナスに聞きに行くのか?
オマエはMINIXのソース読んでて、
わからなかったらタネンバウムに聞きに行くのか?
オマエはWindowsのAPIが
わからなかったらゲイツに聞きに行くのか?
おまえはDarwinのソース読んでて分からなかったら
アビに聞きに行くのか?
オマエはC言語がわからなかったら、
カーニハンとリッチーに聞きに行くのか?
793デフォルトの名無しさん:2007/07/14(土) 10:09:41
>>791
ほんと間抜けな回答だなぁ・・・
794デフォルトの名無しさん:2007/07/14(土) 10:15:12
>>790
頭わるいなぁ・・・
struct s_keywords の配列以外のなにものでもない
一行がひとつの struct s_keywords だよ
795デフォルトの名無しさん:2007/07/14(土) 10:19:14
>>794
トンです。
本あさくってたら、解説してありました。
>>791
まじ、センスねぇ。
796デフォルトの名無しさん:2007/07/14(土) 10:20:40
なんでバカなのにえらそうなんだ
煽りはスルーしろよ
もちろんこのレスも
797デフォルトの名無しさん:2007/07/14(土) 10:23:11
なんでダイレクトな回答を書かずに
ねちねちどうでもいい話する香具師が多いんだ
798デフォルトの名無しさん:2007/07/14(土) 12:49:46
char str[256];
ifstream in1("data.txt");
while(in1.getline(str, sizeof(str)) > 0){
if(str == "aaa")
cout << str << endl;
}
上のような感じでdata.txtファイルに”aaa”という一行があればそれを出力、というプログラムを書きたいんですが
"aaa"という行があってもなぜか何も出力せずに終わってしまいます。

if文をコメントアウトした場合全行出力されたのですが
char型配列の比較部分に問題があるんでしょうか?
どなたか教えてください
799デフォルトの名無しさん:2007/07/14(土) 12:51:15
>>798
文字列の比較方法を勉強しよう
800デフォルトの名無しさん:2007/07/14(土) 12:54:04
strcmp
801デフォルトの名無しさん:2007/07/14(土) 12:54:35
>>799
ありがとうございます
勉強してきます
802デフォルトの名無しさん:2007/07/14(土) 13:09:34
C++ならstd::string使いなさいな
803デフォルトの名無しさん:2007/07/14(土) 16:15:15
>>798
>if(str == "aaa")
直感的に打ち込みましたって感じだな。
やってることは
strという配列の先頭アドレスと
無名なconst charであり中身が"aaa"である文字列の先頭アドレスを比較しているだけで
常に結果は偽である意味不明なコードなんだが。
804デフォルトの名無しさん:2007/07/14(土) 16:24:09
char型から勉強したなら
if(str[i] == 'a' && str[i+1] == 'a' str[i+2] == 'a')
まず、こういうのを考えると思うんだけど
Javaから入ったとかかな
805デフォルトの名無しさん:2007/07/14(土) 16:25:23
訂正
if(str[i] == 'a' && str[i+1] == 'a' && str[i+2] == 'a')
806デフォルトの名無しさん:2007/07/14(土) 16:25:42
ないない。
intの比較がi==hでいけて、
Cの文字列はchar *hoge="str"だ、と習ったら、
文字列の比較はhoge=="str"でいけると思うって。
807デフォルトの名無しさん:2007/07/14(土) 16:32:31
std::stringクラスならそういう比較も出来るのにね
808デフォルトの名無しさん:2007/07/14(土) 17:35:43
stringの機能つかいたいんですけど
ファイルから一行読み込んでいきなりstrinに入れられませんか?
そういう入力がないような
809デフォルトの名無しさん:2007/07/14(土) 17:40:20
#include <iostream>
#include <string>
#include <fstream>

int main() {
  std::ifstream ifs("test.txt");
  std::string buf;
  std::getline(ifs, buf);
  std::cout << buf;
}
こんな感じで割りと簡単に出来る
810デフォルトの名無しさん:2007/07/14(土) 17:55:50
>>809
サンクス
811808:2007/07/14(土) 18:06:38
あのー間違ってバイナリをgetlineで読み込むと止まらなくなってしまいます
バイナリのときは開かないようにするにはどうしたらいいですか?
812デフォルトの名無しさん:2007/07/14(土) 18:14:23
それならstring使わずにchar型の配列なり使って
#include <iostream>
#include <fstream>

int main() {
  std::ifstream ifs("test.txt");
  char buf[10];
  ifs.getline( buf, sizeof(buf) );
  std::cout << buf;
}
のようにして一行の最大文字数を限定するとか
813808:2007/07/14(土) 18:17:34
binaryで開いてから、 NULL 文字 (バイナリ値で 0) が
入っていたらバイナリ、いなければテキストとすればいいんでしょうか?
そしてからテキストモードで開き直す
814デフォルトの名無しさん:2007/07/14(土) 18:19:37
>>812
それだと当初の目的と違ってしまいます....
いきなりstringにいれたいんです
815808:2007/07/14(土) 18:44:08
80Kバイトまで読み込んで、バイナリで0が現れなければテキスト
としたらサンプルをすべて判別できましたよ
816デフォルトの名無しさん:2007/07/14(土) 19:04:47
貼り付けておきますね でもすべてで有効ではないようです

int binchk(char *name){
fstream fp(name,ios::in|ios::binary);if(!fp)return 1;
int i,j,n=1;char t[4096];
for(i=0;i<20;i++){
fp.read(t,4096);n=fp.gcount();
if(n<1)return 0;
for(i=0;i<n;i++)if(t[i]==0)return 1;}
return 0;}
817デフォルトの名無しさん:2007/07/14(土) 19:05:12
ここでUTF-16の登場です
818デフォルトの名無しさん:2007/07/14(土) 19:51:07
C言語の勉強したいんですが初めて使う本とソフトは何がいいですか?プログラムは何もやったこと無くてPCの知識は0です。
猫でもわかるC言語と猫でもわかるwindowプログラムの本を買って、Microsoft visual studio 2005 Professinal edition というのをインストールしてみました。
ソフトのほう種類がたくさんあってこの時点で何がなんだかわからないんですがソフトはこれであってますか?
819デフォルトの名無しさん:2007/07/14(土) 20:07:55
>>818
初心者は、BCC developerとc++ (STL)をやったほうが良いですよ
cで出来る事はc++でより簡単にできます
820デフォルトの名無しさん:2007/07/14(土) 20:09:39
嘘を嘘とry
821デフォルトの名無しさん:2007/07/14(土) 20:15:03
マジレスすると
PCの基本的なことを知らないままプログラム書いていると
とんでもないヘボなことしてて気付かない糞プログラマになるよ
多少回り道だと思っても基本はおろそかにしないでくれ給へ
822デフォルトの名無しさん:2007/07/14(土) 20:15:57
>>818
本もソフトもそれでいいよ、でも
>Microsoft visual studio 2005 Professinal edition というのをインストールしてみました
これは有料ソフトじゃねーの?
ExpressEditionなら無料であった気がするけど
823デフォルトの名無しさん:2007/07/14(土) 20:25:39
ていうかPC初心者でプログラミング未経験ならCは薦めない
824デフォルトの名無しさん:2007/07/14(土) 20:29:52
理由は?
825デフォルトの名無しさん:2007/07/14(土) 20:32:24
すみません
ファイルポインタが使用中か判定できませんか?


while(1){
str 生成、fn 生成
fstream fq(fn,ios::out);if(!fq)return 0;
fq <<str<<endl;
fq.close();
}

という動作を1Kバイトくらいで繰り返すと、エラーで止まります
826デフォルトの名無しさん:2007/07/14(土) 20:33:30
fq.close()の終了前に、オープンしようとしてエラーになると思うのですが・・・
827デフォルトの名無しさん:2007/07/14(土) 20:34:10
低水準すぎて、やりたいことができるようになるまでの道のりが遠いだろう。
とは言え、何を薦められるかというと、難しいところだが。
828デフォルトの名無しさん:2007/07/14(土) 20:35:52
delete str
829デフォルトの名無しさん:2007/07/14(土) 20:37:02
>>828
strとは関係ないとおもうんですけど・・・
閉じる処理が完了する前に次へいってしまう所では?
830デフォルトの名無しさん:2007/07/14(土) 20:37:42
HSPからすべてがはじまる・・・!
831デフォルトの名無しさん:2007/07/14(土) 20:38:05
>>825
「エラーが出て止まる」の意味が分からん
どういうエラーが出るの?
832デフォルトの名無しさん:2007/07/14(土) 20:41:41
while(1){
str 生成、fn 生成
{
fstream fq(fn,ios::out);if(!fq)return 0;
fq <<str<<endl;
}
}
これでおk?
833デフォルトの名無しさん:2007/07/14(土) 20:45:08
>>831
すべての処理が終わる前に、return 0をしてしまいます
別名ファイルを出力用に生成しますから通常はエラーにならないはず
834デフォルトの名無しさん:2007/07/14(土) 20:46:33
すみません自己解決しました

#include <windows.h>

while(1){
str 生成、fn 生成
fstream fq(fn,ios::out);if(!fq)return 0;
fq <<str<<endl;
fq.close();
if(fq.fail())Sleep(1000);
}

でokになりました
835デフォルトの名無しさん:2007/07/14(土) 21:07:12
何だそりゃ
めちゃくちゃ訳わかんねぇ
つか怪しすぎ
836デフォルトの名無しさん:2007/07/14(土) 21:08:13
まさか同じ秒だと同じファイル名を生成していましたとかいう
下らねぇ落ちじゃねぇだろうな
837デフォルトの名無しさん:2007/07/14(土) 21:11:54
ファイル生成部分


char fn[9];fn[8]='\0';
s=m;
for(i=0;i<8;i++)
{fn[7-i]=s%10+'0';s/=10;}
fstream fq(fn,ios::out);if(!fq)return 0;m++;

です 一回ごとに変わります
838デフォルトの名無しさん:2007/07/14(土) 21:14:22 BE:1409770297-2BP(29)
似たような問題を経験したことあるけどclear(0)したらバグんなくなったよ
なんでバグらなくなったのかわからんし、それに効くかもわからんけどw
839デフォルトの名無しさん:2007/07/15(日) 02:48:47
16進文字列を、0から15の数値へ変換するにはどうしたら良いですか?
840・∀・)っ-○◎●:2007/07/15(日) 02:51:22
strtolとか。
sscanfで書式%xで読み出す
841デフォルトの名無しさん:2007/07/15(日) 02:58:57
サンクス
自分でやってみました
cが16進文字のとき、x= e>64?e-55:e-48が数値です・・・
842・∀・)っ-○◎●:2007/07/15(日) 03:04:58
ASCIIコード依存のプログラムはあんまり書く癖つけないほうがいいかも

かく言う俺も高速化のためには良く使うんだけど
843デフォルトの名無しさん:2007/07/15(日) 03:07:33
#if #error でも仕込んどけばいい。
844デフォルトの名無しさん:2007/07/15(日) 03:20:33
「16進文字列」という用語を、0-9,a-fと理解したか、
0xabcと受け止めたかだな
845デフォルトの名無しさん:2007/07/15(日) 03:22:47
最近boost始めようと思い立った次第ですが、
http://boost.cppll.jp/HEAD/libs/lambda/doc/ar01s08.html
掲載の、

boost::function<int(int, int)> f = _1 + _2;
boost::function<int&(int&)> g = (_1 += 10);
int i = 1, j = 2;
f(i); // returns 3
g(i); // sets i to = 11;

をコンパイルできるフリーのコンパイラはご存じでしょうか?
OSはWindowsでお願いします。
VC Express付属のVC8もCygwin付属のgcc3.4.4もダメでしたし、
BCC5.5.1に至ってはそもそもlambdaに対応してないようですし……
846・∀・)っ-○◎●:2007/07/15(日) 03:27:34
847デフォルトの名無しさん:2007/07/15(日) 03:27:56
こんな感じか?

int char_su(char c){
return c>64?c-55:c-48;}

int str_su(char *c){
int n,k,sum=0;
for(n=0;c[n]!='\0';n++);
for(k=0;k<n;k++)sum+=c[k]<<(4*(n-k));
return sum;}
848デフォルトの名無しさん:2007/07/15(日) 03:31:03
boostが標準で入っているコンパイラはないのでは?
C++ならどれでも使えるのでは?テンプレートがコンパイルできれば
849・∀・)っ-○◎●:2007/07/15(日) 03:33:50
cygwinで選べばプリコンパイル済みのが入るよ
850デフォルトの名無しさん:2007/07/15(日) 03:42:06
newとvectorとintとstatic intでは確保できる配列数に違いがありますか??
851デフォルトの名無しさん:2007/07/15(日) 03:49:37
>>850 自分で試せば?
852・∀・)っ-○◎●:2007/07/15(日) 04:03:20
C/C++で食うつもりなら大半は制御系逝きだからなぁ
書き換え可能な静的配列は利用制限があるんじゃないの?
853デフォルトの名無しさん:2007/07/15(日) 04:23:33
制御系なら何だというのか?その理由は静的か動的かで変わるのか?
854デフォルトの名無しさん:2007/07/15(日) 04:28:45
>>845
fの呼び出し間違ってるぞ
855・∀・)っ-○◎●:2007/07/15(日) 04:35:42
確保できるメモリって意味でしょ。

static constなメモリ領域はマスクROMに焼ける
856デフォルトの名無しさん:2007/07/15(日) 08:07:08
returnって何?
関数じゃないよね。
857デフォルトの名無しさん:2007/07/15(日) 08:17:24
関数から戻る、戻り値を指定する文のためのキーワード。
858デフォルトの名無しさん:2007/07/15(日) 10:28:04
struct Point {
int x;
int y;
};

struct Point SizeToPoint(struct Point offsetPoint, int width, int height){
offsetPoint.x = offsetPoint.x + width;
offsetPoint.y = offsetPoint.y + height;
return offsetPoint;
}

int main (){
struct Point location = {100,100};
printf(
"rectangle¥n¥t"
"left= %d:top%d¥n¥t"
"right=%d:bottom=%d¥n",
location.x,location.y,SizeToPoint(location,200,40).x,SizeToPoint(location,200,40).y
);
return 0;
}
こんなプログラムが有ったとして、
なぜ、SizeToPoint(location,200,40).x,SizeToPoint(location,200,40).yのような書き方が許されるの?
これがoffsetPoint.xとoffsetPoint.yに置き換えられたとしても、スコープの関係上おかしくないんですか?
859デフォルトの名無しさん:2007/07/15(日) 10:29:25
うん
860デフォルトの名無しさん:2007/07/15(日) 10:29:28
>>845
これならg++ 3.4.4(Cygwin付属)やg++ 4.1.1、VC++ 8でコンパイル・実行できたぞ。
#include <iostream>
#include <boost/function.hpp>
#include <boost/lambda/lambda.hpp>

int main()
{
  namespace bll = boost::lambda;
  using bll::_1;
  using bll::_2;
  boost::function<int(int, int)> f = _1 + _2;
  boost::function<int&(int&)> g = bll::ret<int&>(_1 += 10);
  int i = 1, j = 2;
  std::cout << f(i, j) << '\n'; // returns 3
  std::cout << g(i) << '\n'; // sets i to = 11;
  std::cout << i << std::endl;
}
861デフォルトの名無しさん:2007/07/15(日) 10:32:59
>>858
int f(int n) { return n; }

printf("%d\"n, f(1));

がおかしくなるとお思いか?
862デフォルトの名無しさん:2007/07/15(日) 10:35:14
>859
>うん
何故ですか?
offsetPoint.xとoffsetPoint.yが通用するのは
関数SizeToPointの中だけじゃないんですか?
どういう風に評価されるんですか?
863デフォルトの名無しさん:2007/07/15(日) 10:38:31
>>861
>int f(int n) { return n; }
>printf("%d¥"n, f(1));
コレは納得できるんです。
だってこの場合は数を返しているから。
864デフォルトの名無しさん:2007/07/15(日) 10:43:59
返しているのは「値」であって「変数」じゃないというのは判ってるんだね。
じゃあ、返り値がstructである場合も、返しているのは「値」だというのはわかるかい?
865デフォルトの名無しさん:2007/07/15(日) 10:52:58
>>864
>返しているのは「値」であって「変数」じゃないというのは判ってるんだね。
はい。
>じゃあ、返り値がstructである場合も、返しているのは「値」だというのはわかるかい?
ここなんですよ。
この理屈なら構造体変数offsetPointにも値がないと説明がつかないですよね。
ならoffsetPointの値は何という話になりますよね。
866デフォルトの名無しさん:2007/07/15(日) 10:54:48
>>865
x, y の値の組み合わせだろ。
867デフォルトの名無しさん:2007/07/15(日) 10:59:45
locationの値がoffsetPointに渡されてるんだろ
868デフォルトの名無しさん:2007/07/15(日) 11:04:20
>>866
>x, y の値の組み合わせだろ。
仮にx,yの組み合わせが返ってきたとしても、
そもそもその組み合わせである構造体offsetPointが通用するのは
関数SizeToPointの中だけでmain関数からは構造体としては見えないんじゃないんですか?
869デフォルトの名無しさん:2007/07/15(日) 11:07:52
>>868
変数 offsetPoint が通用するのは関数 SizeToPoint() の中だけだが、
その戻り値は違う。
870デフォルトの名無しさん:2007/07/15(日) 11:09:01
>>868
mainから見えてるのはoffsetPoint変数じゃない
Point構造体は見えてる
871デフォルトの名無しさん:2007/07/15(日) 11:11:39
具体的にアドレス表示させて見ると違うってわかるかも
872デフォルトの名無しさん:2007/07/15(日) 11:18:16
戻り値のアドレスは取れんのじゃないか?
873デフォルトの名無しさん:2007/07/15(日) 11:18:25
>>869
>変数 offsetPoint が通用するのは関数 SizeToPoint() の中だけだが、
>その戻り値は違う。
>>870
>mainから見えてるのはoffsetPoint変数じゃない
>Point構造体は見えてる
>>871
>具体的にアドレス表示させて見ると違うってわかるかも

そうなんですか?
まぁ納得できました。
そういえば昔コンパイルされたプログラムの中では局所変数の名前の情報は失われる
って書いてあった本を読んだ事が有るような無いような。
874デフォルトの名無しさん:2007/07/15(日) 11:31:35
>>872
ですよねーw
875デフォルトの名無しさん:2007/07/15(日) 11:37:08
>>873
名前の情報とかいうのはイマイチずれてるな。
876デフォルトの名無しさん:2007/07/15(日) 11:46:44
戻り値のアドレスを取得しようとしたんですけれど
良く分からなくてダメでした。
どうしてダメなんですか?
コンピューターの中のデータは全部メモリに格納されていて
アドレスがついているんじゃないんですか?
877デフォルトの名無しさん:2007/07/15(日) 11:54:24
もう「戻り値のアドレス」なんて話は忘れろ。
Cの関数は「値」を返す、それだけ。
「値」、つまり1とか2とかに、アドレスがあるわけないだろ(厳密にはどこかに記録されているけど)。
878デフォルトの名無しさん:2007/07/15(日) 11:56:06
で、戻り値が整数なら、整数がその「値」だし
浮動小数や構造体なら、それぞれ別の「値」を持つだけ。
879デフォルトの名無しさん:2007/07/15(日) 11:58:47
なんか連投してるが

で、もちろん、「実装としては一般的にどうする」というのはある。
構造体を返す場合は隠れた第一引数でアドレスを渡す、とか。

でも、そんな事は普通は気にするべきじゃない。
880デフォルトの名無しさん:2007/07/15(日) 12:04:28
struct Point *SizeToPoint(struct Point offsetPoint, int width, int height){
offsetPoint.x = offsetPoint.x + width;
offsetPoint.y = offsetPoint.y + height;
return &offsetPoint;
}

int main (){
struct Point location = {100,100};
printf(
"rectangle\n\t"
"left= %d:top%d\n\t"
"right=%d:bottom=%d\n",
location.x,location.y,SizeToPoint(location,200,40)->x,SizeToPoint(location,200,40)->y
);
return 0;
}

逆に、問題になりそうなパターンを考えてみるとか
881デフォルトの名無しさん:2007/07/15(日) 12:06:21
・(C++の)参照を返す関数以外の関数呼び出しは右辺値式ではない
・&演算子はオペランドとして左辺値式を要求する
・メンバ演算子はオペランドとして左辺値式を要求しない
ってだけだろ
882881:2007/07/15(日) 12:09:55
typoった
×・(C++の)参照を返す関数以外の関数呼び出しは右辺値式ではない
○・(C++の)参照を返す関数以外の関数呼び出しは左辺値式ではない
883デフォルトの名無しさん:2007/07/15(日) 14:13:18
Borland C++ Compiler 5.5です。

Cでは、Javaのlengthメソッドのような、配列の長さを取得する手段はありますか?
884デフォルトの名無しさん:2007/07/15(日) 14:21:58
sizeof(array) / sizeof(*array)
885883:2007/07/15(日) 14:28:33
ありがとうございます!
for文がかけなくて困ってました。
886デフォルトの名無しさん:2007/07/15(日) 14:29:34
Cのプログラムをjava風にvoid main()って書くのはいけないことなの?
887デフォルトの名無しさん:2007/07/15(日) 14:31:20
intを返すべきと昔から決まってます
888デフォルトの名無しさん:2007/07/15(日) 14:32:11
そうなのかーthx
889デフォルトの名無しさん:2007/07/15(日) 15:23:56
>>855 だんご、
Core 2 Duoはやっぱりもっさりだった スレの住人がニヤニヤしながら、お前を待ってるぞ。
今、住人はhttp://pc11.2ch.net/test/read.cgi/jisaku/1182676928/ に居る、早く来い。
890デフォルトの名無しさん:2007/07/15(日) 16:22:43
>>880
関数*SizeToPointの第一引数struct Point offsetPointはコピーなのに、
return &offsetPoint; としても問題ないんですか?
コピーは関数を抜けたら消えると思うんですけど
891デフォルトの名無しさん:2007/07/15(日) 16:33:04
>>890 「問題になりそうなパターン」
892デフォルトの名無しさん:2007/07/15(日) 16:35:25
>>890
問題あるよ。
コンパイルエラーにならないし、動いちゃうことも多いから気をつけるべき
893デフォルトの名無しさん:2007/07/15(日) 22:00:10
HWND LPCSTR LPSTR DWORDという変数にはどういった意味があるんでしょうか?

DLLを使いたいんですけど、()内に入ってます
894デフォルトの名無しさん:2007/07/15(日) 22:05:31
C++ なら const 参照で受ければ
テンポラリオブジェクトのアドレスを取得できるね。
895デフォルトの名無しさん:2007/07/15(日) 22:07:21
>>893
とりあえず変数じゃない
896デフォルトの名無しさん:2007/07/15(日) 22:08:34
>>893
もの凄い勢いで typedef について調べるんだ
897デフォルトの名無しさん:2007/07/15(日) 22:12:15
>>893 の意味が気になって10秒ごとのリロードしてます。
HWND LPCSTR LPSTR DWORDが何なのかを教えてください。ペコリ、ペコリ
898デフォルトの名無しさん:2007/07/15(日) 22:20:56
うぜえ。
ググれや。
899デフォルトの名無しさん:2007/07/15(日) 22:21:56
HWND →ウィンドウハンドル
LPCSTR →NULL終端の変更不可な8ビット文字列へのポインタ(const char*)
LPSTR →NULL終端の8ビット文字列へのポインタ(char*)
DWORD →32ビット符号なし整数(unsigned int)
900デフォルトの名無しさん:2007/07/15(日) 22:22:00
>>897
typdefを知らないならこうしてるもんだとでも思え↓

#define LPCSTR char *
#define DWORD unsigned long
901デフォルトの名無しさん:2007/07/15(日) 22:33:08
おーーーーっ、リロードしまくりの甲斐がありました。誠に有難うございました。
なんで、そんなめんどくさい別名を付けてるんですか?
HWNDには本名ないのですか? 無いのにC言語で使えるって変じゃないですか?
902デフォルトの名無しさん:2007/07/15(日) 22:41:15
>>901
定義はincludeフォルダをgrepしろよ。
別名をつけるのは意味的に分かりやすくするためだよ。
いつもいつも素で書いてたら意味不明になってくるだろうが
903デフォルトの名無しさん:2007/07/15(日) 22:50:39
>>901
処理系依存の部分をラップして移植性を高めるため。

例えばintが何ビットかは(殆どが32ビットだが)仕様で定められているわけではない。
DWORDの場合などは実際の型を隠蔽することで32ビット値であることを保障してるわけだ。

これ以上はググれ。
904デフォルトの名無しさん:2007/07/15(日) 22:51:59
実際には隠蔽し切れてないし元の型が何であるかを無視はできないけどな
905デフォルトの名無しさん:2007/07/15(日) 23:19:47
すみません、grepってはじめて知りました。

LPCSTR →NULL終端の変更不可な8ビット文字列へのポインタ(const char*)
LPSTR →NULL終端の8ビット文字列へのポインタ(char*)
DWORD →32ビット符号なし整数(unsigned int)
今のWinの場合は()の中が本体だけど、本体は将来変わる可能性あり、でも、
→から(の前の定義は変えないよということですね。
どうも、どうも。

906デフォルトの名無しさん:2007/07/16(月) 00:41:19
Cにはクラスがなかったからだよ
907デフォルトの名無しさん:2007/07/16(月) 00:56:52
HINSTANCEの定義
 DECLARE_HANDLE (HINSTANCE)
 #define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
つまり
 typedef struct HINSTANCE__ {
  int unsed;
 } HINSTANCE;
となるんだけど、なんのためにこんなことしてるの?
908デフォルトの名無しさん:2007/07/16(月) 01:00:14
>>907
HINSTANCE hi = ...
HDC hd = hi; // これをエラーにしたい。
909デフォルトの名無しさん:2007/07/16(月) 01:04:45
>>908
その場合、単純に
 struct HINSTANCE__; typedef struct HINSTANCE__ *HINSTANCE;
じゃダメなんかな?
910デフォルトの名無しさん:2007/07/16(月) 01:31:59
それでは前方宣言しかしてないのでは
911デフォルトの名無しさん:2007/07/16(月) 01:34:17
そうだねぇ。不完全型の扱いがヘボいコンパイラでもあったんじゃね?
VOID を typedef してる時代だからな。
912デフォルトの名無しさん:2007/07/16(月) 01:34:34
いや、それで問題ない。それどころか、これで十分なはず
913デフォルトの名無しさん:2007/07/16(月) 01:35:07
>>910
ポインタだけ使うから前方宣言だけで十分なのに構造体の定義まで
与えてるのが要らないってことだろ。
914912:2007/07/16(月) 01:37:39
すまん。途中で送信してしまった。
typedef struct HINSTANCE__ *HINSTANCE;
915910:2007/07/16(月) 01:51:59
ああ、そうかorz

あとはもうサイズ合わせの用途くらいしか思いつかない
916デフォルトの名無しさん:2007/07/16(月) 01:53:20
time_t time(time_t *t); みたいなもんか

917デフォルトの名無しさん:2007/07/16(月) 02:28:47
しつもんです。
他のところでは
0x70000000
と16進数が使われているのに
一部分だけ
0 << 28
と書いてあります。
どうして作者は
0<< 0x1c
としなかったのでしょうか?
918デフォルトの名無しさん:2007/07/16(月) 02:30:54
919デフォルトの名無しさん:2007/07/16(月) 02:31:02
各所わかりやすい方で書いてるんだと思うよ
920デフォルトの名無しさん:2007/07/16(月) 02:31:44
921デフォルトの名無しさん:2007/07/16(月) 02:32:13
1 << 28 だろー

ビットシフトの右側の値は 16 進数にする理由がない。
922デフォルトの名無しさん:2007/07/16(月) 03:07:53
>909
エラーにしたいのは、STRICTが定義されているときだけ。
だったはず。
923デフォルトの名無しさん:2007/07/16(月) 03:13:36
現在ゲーム木を作っていて、
あるクラスオブジェクトをノードに持たせるか、
クラスオブジェクトに枝を持たせるかで悩んでいます。

定石があれば教えてください。

class A{
:
};

class Node{
A a;
長男を指す枝構造体へのポインタ;
:
}

とするか、

class Edge{
:
}

class A{
:
長男を指す枝クラス(Edge)へのポインタ
}

を迷っています。おかしなこと言ってないといいんだけど……。
924デフォルトの名無しさん:2007/07/16(月) 03:19:22
>>923
どっちでも同じことができるんだから、あとは本人以外に判別不能。好きにしろ。
925デフォルトの名無しさん:2007/07/16(月) 03:27:59
>>923
クラスオブジェクト自身が子ノードの情報を持つ必要があるなら枝を持たせる。
そうでなければノードに持たせる。
926デフォルトの名無しさん:2007/07/16(月) 03:28:32
>>924
オブジェクトとデータ構造はなるだけ分けたいから、自分なら前者かなぁ
927926:2007/07/16(月) 03:29:19
×>>924>>923
928デフォルトの名無しさん:2007/07/16(月) 05:54:58
重箱だがC++にクラスオブジェクトは無いよな
929デフォルトの名無しさん:2007/07/16(月) 06:35:19
あるクラスのオブジェクトと読み替えてあげようぜ
930デフォルトの名無しさん:2007/07/16(月) 06:58:32
そういうときは
インスタンスとか
エンティティとか
ふさわしい表現があるだろ
931デフォルトの名無しさん:2007/07/16(月) 08:46:32
実体はこの文脈ではどうなんだろう?
オブジェクトの方がいいような気がする。個人的には。
932デフォルトの名無しさん:2007/07/16(月) 11:32:20
C++的にはインスタンスと言う方が多い気がする

ていうかオブジェクトという単語は意味が多すぎて
933デフォルトの名無しさん:2007/07/16(月) 12:01:08
>インスタンス
>「オブジェクト」とほぼ同義語のように用いられることが多いが、
>実際にメモリ上に配置されたデータの集合という意味合いが強く、
>データの実体をより具体的・直接的に捕らえた用語である。

だそうだ
934デフォルトの名無しさん:2007/07/16(月) 12:02:54
ライブラリを作る作業は「リンク」って表現しますか?
935デフォルトの名無しさん:2007/07/16(月) 12:06:49
>>923
Stroustrupの「プログラミング言語C++」の用語で言うと
前者が非侵入的リスト、後者が侵入的リストに相当するのかな。
どっちも設計としてはあり得る。

非侵入的リストは汎用的にするなら普通はstd::list<>のようなテンプレートに
なるだろうし、
侵入的リストの場合は、リンク部分を独立した型にして、それを包含させるか
継承するか、という形にするのが普通だとは思うが。

BSDのsys/queue.hのようなものはマクロをつかってCで侵入的リストを
実現している好例だ。
Windowsでも、winnt.hに似たような代物がある。
936デフォルトの名無しさん:2007/07/16(月) 12:47:05
>>924-926,935
ありがとうございました。
自分のプログラムと検討してみます。
937デフォルトの名無しさん:2007/07/16(月) 15:23:54
ファイルの解凍できたんですけど、解凍おわるまで待つにはどうしたらいいですか?

#include <windows.h>

typedef int (__stdcall *FNC)(const HWND , LPCSTR , LPSTR , const DWORD);

main(){
HMODULE hd = (HMODULE)LoadLibrary("UNZIP32.DLL");
if (hd== NULL) return 0;

FNC pf = (FNC)GetProcAddress(hd,"UnZip");
if (pf == NULL) return 0;

char c[]="aaa.zip",s[16];
(*pf)(NULL, c, s, sizeof(s));

FreeLibrary(hd);
}
938デフォルトの名無しさん:2007/07/16(月) 15:24:59
(*pf)の戻り値か、sの値をみればいいですか?
939デフォルトの名無しさん:2007/07/16(月) 16:01:36
>>937です
どうやら、解凍が終わるまで停止するようです
940デフォルトの名無しさん:2007/07/16(月) 21:38:13
vectorにファイル名とポイント持たせられますか?
既に存在していればそれを使いなければ追加したいんですが?
map とかの方がいいですか?
941デフォルトの名無しさん:2007/07/16(月) 21:43:01
>>940
日本語でおk。

えーと。エスパーしてみると、
君の言うようにstd::map<>やstd::set<>向きの仕事だと思う。
たぶんね。
942デフォルトの名無しさん:2007/07/16(月) 21:56:43

map<string, fstream> m;

m.insert (pair<string, fstream>("filename", fp));

とするとエラーになります
なぜでしょうか
943デフォルトの名無しさん:2007/07/16(月) 21:59:36
string fname[1000];
fstream fpoint[1000];

とやって多めに確保して地味にやっていきます・・・
944デフォルトの名無しさん:2007/07/16(月) 22:01:26
>>940
Vector・mapはだめ、リンクリストが最適だよ
945デフォルトの名無しさん:2007/07/16(月) 22:02:59
>>942
そりゃ、fstreamはコピーができないからだ
STLコンテナは要素がコピー可能であることを要求する

ポインタを使うんだね
946デフォルトの名無しさん:2007/07/16(月) 22:06:49
map<string, fstream*> m;
m.insert (pair<string, fstream*>(str, &fp));

でいいんでしょうか?
947デフォルトの名無しさん:2007/07/16(月) 22:08:59
>>946
それでもよいのだが、そうする場合はfpの寿命管理に気をつけろ。
出来ればナマのstd::fstream*ではなく、boost::shared_ptr<std::fstream>などを
使うのが良いだろう。
948946:2007/07/16(月) 22:20:48
サンクス
949デフォルトの名無しさん:2007/07/16(月) 22:53:50
ヘルパーあるんだからstd::make_pair使おうよ。
950デフォルトの名無しさん:2007/07/16(月) 23:07:28
あのファイルの出力用オープンが失敗するんですけど
原因はわかりますか??
出来るやつと出来ないやつがあります
空き容量は十分にあります
951デフォルトの名無しさん:2007/07/16(月) 23:08:57
失敗するやつはSleepで休んでからでも失敗します
952デフォルトの名無しさん:2007/07/16(月) 23:15:24
成功するファイル名についてです

成功するファイル名
AUDJPY-2002-03.txt
AUDJPY-2002-04.txt
CHFJPY-2002-03.txt
CHFJPY-2002-04.txt

失敗するファイル名
AUDJPY-2002-11.txt
AUDJPY-2003-03.txt
AUDJPY-2003-09.txt
CHFJPY-2002-11.txt
CHFJPY-2003-03.txt
CHFJPY-2003-09.txt

953デフォルトの名無しさん:2007/07/16(月) 23:20:33
エスパー降臨キボンヌ

地震きたー
954デフォルトの名無しさん:2007/07/16(月) 23:39:40
ファイルを確実に閉じたり開いたり出来る方法ないですか?
closeもopenもうまくいきません
955デフォルトの名無しさん:2007/07/16(月) 23:40:20
>>952
ソースうp
956デフォルトの名無しさん:2007/07/17(火) 00:00:34
VisualStudio.NET 2003 C++ XP SDK( MFCなどは使わず)

質問です
システムのミキサーの音量設定をプログラムから調整するにはどんなAPIを使ったらいいんでしょうか?。どなたかお願いします。m(__)m
957デフォルトの名無しさん:2007/07/17(火) 00:05:04
なんでコンパイラやらOSやらが頑張って表示してくれてるエラーメッセージを
さっくり無視するんだろうねえ
958デフォルトの名無しさん:2007/07/17(火) 00:06:26
>>956
APIスレ池
959デフォルトの名無しさん:2007/07/17(火) 00:08:20
>>954
普通に書けばうまくいくよ
君の書いたコードが悪い
960デフォルトの名無しさん:2007/07/17(火) 00:17:31
>>954
VC++8.0で日本語を含むファイルが開けないのなら、ロケールを設定汁
ウムラウトとかを含むファイルが開けないのなら、stdioやfstreamを
使うのは断念してCreateFileW()を使え
961デフォルトの名無しさん:2007/07/17(火) 00:20:02
同時に開ける数に制限があるとか 46個開くと次が駄目です
962956:2007/07/17(火) 00:26:31
>>958


スレ違いスマソ
963デフォルトの名無しさん:2007/07/17(火) 00:38:11
>>961
なんでそんなに同時に開く必要がある?
よほど大きいファイルを扱うんでなければメモリ上で処理すれば良いだけだと思うんだけど
何かそれ以外の制約でもあるんか?
964デフォルトの名無しさん:2007/07/17(火) 00:38:51
>>961はどうみても質問者ではないだろう
965964:2007/07/17(火) 00:39:56
と思ったけど、やっぱ質問者な気がしてきた


すまん
966デフォルトの名無しさん:2007/07/17(火) 00:46:42
全部で20ギガのテキストなんです・・・
それを約1000個のファイルに種類分けしたいんです・・
でも、CreateFileつかったら48個以上いけました!!
1000個同時に開けるかは不明です・・
967デフォルトの名無しさん:2007/07/17(火) 00:50:46
基本的にwindowsの関数の方が優れているんですかね???
968デフォルトの名無しさん:2007/07/17(火) 00:52:58
969デフォルトの名無しさん:2007/07/17(火) 00:56:03
>>968
CやC++の標準関数は安定してそうだけど実はwindowsXPの関数(API)の方が
いいんですかね??ってことですよ
windowsのユーザーは多いし、アップデートも頻繁だし
970デフォルトの名無しさん:2007/07/17(火) 00:58:34
>>969
安定してるとか、そういうことじゃないから。
C/C++ のライブラリ関数は OS の API を利用して作られている。
971デフォルトの名無しさん:2007/07/17(火) 01:02:03
>>969
ま、ケースバイケースだな。
標準関数は移植性が高いが、仕様が限定的で不便なこともある。出来ることも
限られている。

ファイルをあまり開けなかったりするのは、まあCランタイムの実装都合だな。
多分ファイル構造体配列をstaticに保持しており、その中の開きスロットを
見つけて使うような実装なんだろう。
一応FOPEN_MAXという定数が定められており、それを越えるファイルをstdioでは
同時に扱うことは保障されないと思っていい。
972デフォルトの名無しさん:2007/07/17(火) 02:11:16
(STLじゃなくて)C++の標準ライブラリ(ifstreamやstringなど)の豊富な説明が載ったWebサイトはありますか?
それとも、本を買って調べるべきですか?
973デフォルトの名無しさん:2007/07/17(火) 02:17:25
974デフォルトの名無しさん:2007/07/17(火) 02:18:07
windowsXPのコマンドプロンプトから、bcc32を使ってコンパイルしています。
const char a[] = "●○";
cout << char[1];
と出力させようとすると、おかしな表示になります。

日本語 出力 
const wchar_t a = L"●○";
wcout.imbue( locale("japanese") );
wcout << char[1];
としても駄目です。どうすれば良いでしょうか?
975デフォルトの名無しさん:2007/07/17(火) 02:19:32
char[1]じゃない。
a[1]だorz
976974:2007/07/17(火) 02:58:20
自己解決しました。

char *a[] = {"●","○"};
cout << a[1];
としたらできました。
ポインタで指定した文字列なら、普通に出力できる??? なんでだ。
977デフォルトの名無しさん:2007/07/17(火) 03:03:56
>>976
マルチバイト文字列だから。
978デフォルトの名無しさん:2007/07/17(火) 18:58:35
cコンパイラってすべてwindows APIを利用しているんですか??
アセンブラに翻訳してwindowsの機能は使わずcpuの機能を使っているのかとおもいました
979デフォルトの名無しさん:2007/07/17(火) 19:12:30
API使ってるのはファイル操作とかOS依存の部分だけ。
980デフォルトの名無しさん:2007/07/17(火) 19:18:09
サンクス
981デフォルトの名無しさん:2007/07/17(火) 22:13:50
質問です。
int main (){
int i = 0xFFF, i1;
unsigned char *ch = (char *)&i;
i1 = *ch;
printf ("i1=%X¥n",i1);
return;
}
このi1の値が0xFFになるはずなのですが、
0にしかなりません。
どうしてでしょうか?
982デフォルトの名無しさん:2007/07/17(火) 22:19:36
>>981
>このi1の値が0xFFになるはずなのですが
そんなこと決まってないよ。環境依存。環境は?
983デフォルトの名無しさん:2007/07/17(火) 22:20:13
> unsigned char *ch = (char *)&i;

この辺で何か変なことが起こってるんじゃないかと想像
unsigned char *ch = (unsigned char *)&i;
にしたらどうなる?
984デフォルトの名無しさん:2007/07/17(火) 22:22:01
とりあえず俺はFFになった。
985デフォルトの名無しさん:2007/07/17(火) 22:22:16
>>981
実はビッグエンディアンとか
環境はなに?
986デフォルトの名無しさん:2007/07/17(火) 22:26:41
そもそも
> unsigned char *ch = (char *)&i;
ではコンパイルできないんですが@VC2005
>unsigned char *ch = (unsigned char *)&i;
ならちゃんとコンパイルでき結果もFFになりますが…
987デフォルトの名無しさん:2007/07/17(火) 22:28:34
>986
どーせ拡張子がcppというオチ
988デフォルトの名無しさん:2007/07/17(火) 22:28:59
あ、そっか。
MacでPower PCだからならないのか。
Power PCってビックエンディアンだから。
すいませんでした。
989デフォルトの名無しさん:2007/07/17(火) 22:30:27
というか、printf中の\n(U+5C, U+6E)が¥n(U+A5, U+6E)になるのは、結構
書き込み環境としても珍しくない?
990デフォルトの名無しさん:2007/07/17(火) 22:57:06
VC++で純粋なC++プログラミングはできますか?
STLやらBOOSTやらがやりたいです。
991デフォルトの名無しさん:2007/07/17(火) 22:58:23
2005ならlambdaも普通に使えるよ
よかったね^^
992デフォルトの名無しさん:2007/07/17(火) 23:04:58
整数かどうかを判別する関数はisdigit()ですが、実数かどうかを判別する関数はないのでしょうか?
993デフォルトの名無しさん:2007/07/17(火) 23:08:25
isdigit()は整数じゃなくて、(10進数の)数字かどうか判定する関数じゃね?
994デフォルトの名無しさん:2007/07/17(火) 23:13:38
ということはisdigit(12)でもisdigit(0.34)でも10進数であれば1が返ってくるという感じですか?
995デフォルトの名無しさん:2007/07/17(火) 23:19:55
isdigit(x) は '0' <= x && x <= '9'と意味的に等価。
引数の「文字」が、'0' - '9'の範囲にあれば真。
12とか0.34がこの範囲に入るコードは見たことがないな。
996デフォルトの名無しさん:2007/07/17(火) 23:31:35
>>992
それがやりたいなら、こんな感じかなぁ
bool is_digit(int x) {return false; }
bool is_digit(float x) {return true; }
bool is_digit(double x) {return true; }
...

boostのtype_traitsにもっといいのがあるよ。
997デフォルトの名無しさん:2007/07/17(火) 23:37:55
996
998デフォルトの名無しさん:2007/07/17(火) 23:39:27
途中で送信してしまったorz

>>996
>>992のチェックしたいのは型でなく文字列じゃないか?
999デフォルトの名無しさん:2007/07/17(火) 23:47:41
やりたいこととしては、char配列の中の文字が数値であれば整数or実数どちらなのかを調べたい なんです。
1000デフォルトの名無しさん:2007/07/17(火) 23:51:29
1000だったらC++が崩壊して
Cが復権!!
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。