【初心者歓迎】C/C++室 Ver.44【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.44【環境依存OK】 - 暇つぶし2ch1:デフォルトの名無しさん
07/11/03 00:20:13
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.43【環境依存OK】
スレリンク(tech板)l50
【アップローダー】(質問が長い時はココ使うと便利)
URLリンク(kansai2channeler.hp.infoseek.co.jp)


2:デフォルトの名無しさん
07/11/03 00:27:39
                           / )     :::::::::::::::::::::::::::::::::::::::::::
          ::::::::::::::::::::::::::::::::::::::::::::::::   / /
           ::∩:::::::::::::::::::::::::::     / /
      ∧_∧ ...| |            ( (    /⌒ヽ
     < `Д´>//      ∧_∧   ヽ ヽ⊂ ̄ ̄ ̄⊃   ヨッシャ行くぞ、ゴルァ!!
     / ソウル..    ∧_∧ ´ー`)    \\(´∀` )     n  .∩
       ∧_∧   ( ´A `)浪人i      ハ      \    ( E)||   ∧_∧   ∧_∧    ∧_∧
       (丶`∀´)  /童貞 \ ノ       |  無職/ヽ ヽ_//  | .|  (丶`∀´)  (  ´∀`)  (  ^ω^)
 ( ヽ,  / 秋葉 ヽ、/ ,   // ヽ,       |     ノ  \__/   | .| /高卒  ヽ/ 中卒 ヽ、/ニート ヽ、


3:デフォルトの名無しさん
07/11/03 00:40:45
UTF16LEの文字はは可変長のはずですが、下のようにして読み込めます
これだと1文字2バイトってことだと思うのですか゛ 

while(!fp.eof()){
fp.read(( char * ) &(wbuf[n]), 4096 );
n+=fp.gcount()/2;}

wcout<<wbuf<<endl;

4:デフォルトの名無しさん
07/11/03 00:43:20
1文字4バイトの文字だったら、アドレスが2つ進んでしまい失敗でないですか?

5:デフォルトの名無しさん
07/11/03 00:47:43
wbuf[n]をゼロクリアしておき、読み込んだであろう最大の番号から逆に進めて0に無くなるところにもどせば安全かなあ

6:デフォルトの名無しさん
07/11/03 01:23:28
おまえはいったい何をいっているんだ。

wbufの型がUTF-16なら、1文字4バイトでアドレスが2つ進むのは問題無いんでねーの。

7:デフォルトの名無しさん
07/11/03 01:40:14
wstringは、2バイトでも4バイトでも1文字だぞ

8:デフォルトの名無しさん
07/11/03 04:12:41
string の+=は鈍いらしいけど、strcatや自前関数と比べてみるよ

9:デフォルトの名無しさん
07/11/03 04:45:39
必要なサイズをreserveで決めておけばstringはstrcatより断然速い
ひとつひとつコピーするのは面倒なのでパス stringは確保した時点ではメモリは0しか確保してない
0のままでほなんども足すとかなり鈍い

10:デフォルトの名無しさん
07/11/03 05:13:48
str.reserve(100*1000*1000);はうごくのですが
str.reserve(1000*1000*1000);はエラーになります
プログラムでエラーを察知できますか?

11:デフォルトの名無しさん
07/11/03 05:30:23
例外。ていうか(wchar_tが2バイトの処理系だとして)2GBも確保すんの?

12:デフォルトの名無しさん
07/11/03 05:42:16
テキストファイルはせいぜい300Mくらいだろうから、最初にメモリを確保してしまおうとおもうけど
万が一数ギガのファイルを渡されたら処理しきれなくなるからエラーを返さないとと思った

13:デフォルトの名無しさん
07/11/03 05:46:37
あと、どうやらメモリ領域を拡大する命令ってcにもc++無いようだね
新規に確保してコピーするみたいだね realloc()は内部でそのようなことをやっているらしい
となるとvectorでもstringでも初めに必要な領域をうまく設定することが速度にかなり影響するだろう

14:デフォルトの名無しさん
07/11/03 06:04:46
vectorとstringが自動で確保する領域を調べたけど
stringは最低限の確保しかしないけどvectorは一気に倍に増やすね
だからvectorはそれほど慎重に領域設定しなくていいとはおもうけど
それでも例えば500M 使うとすると途中で合計500M前後領域を作成してコピーすることになるから
確保しておけば速くなるね

15:デフォルトの名無しさん
07/11/03 06:41:41
久々にVisual Studio 2005 でC++プログラム作成しようとしたのですが
ビルドを実行したら、出力タブに途中結果、エラーメッセージが一切
表示されず最終結果しか表示されません。

例)
------ ビルド開始: プロジェクト: MatrixMultiply, 構成: Debug Win32 ------
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========

わざとスペルミスしても、正常終了しておりエラー一覧タブにも
一切表示されません。
修正したら、ビルドに成功してプログラムを実行できます。

ビルドの途中結果とエラーメッセージを表示する方法を教えて欲しいです。

16:デフォルトの名無しさん
07/11/03 09:32:29
char* buffer
にCreateFileなどでファイルの文字列を一気に読んで
それをstrtok_sで分割し、とっておきたいとします。

char* hoge = strtok_s(NULL,delim,&nexttoken);
char* hage = strtok_s(NULL,delim,&nexttoken);
int sage = atoi(strtok_s(NULL,delim,&nexttoken));

そして、読み込み&分割が終わった後に
delete[] buffer
と、後始末をすると、hoge hageの内容も一緒に消えてしまいます。
コピーをとっておく場合はどうやって書いたらいいんでしょうか?

文字列関係がまだ良く分かりませんので、できれば具体的に教えてください。

ちなみに、
char hoge[256];
strcpy(hoge,strtok_s(NULL,delim,&nexttoken));
とか
char hoge[256];
sprintf(hoge,strtok_s(NULL,delim,&nexttoken));

などとやttみたんですが、内容がフフフフの連続のようになってしまいました。
正しくはどうやって書いたらいいですか?

17:nkkn5
07/11/03 13:56:21
isprint についてどなたか教えてください。
(初心者です)

int l;
l = isprint(-1); cout << l << endl;
はOKなのですが、
l = isprint(-2); cout << l << endl;
とすると実行時に assertion failed の
エラーとなります。

これはなぜなのか教えてください。
(環境はWinXP、VisualC++2005ExpressEditionです)

<質問の過程>
あるC++の本にcharの文字と文字コードを
表示するプログラムが載っていて、
その中で表示できない文字は(isprintで判定)
" "を出力するというようになっておりました。
ところがその本ではcharは0から255という環境を
前提にfor文で0からCHAR_MAXまでループするよう
書かれており、自分の環境では-128(CHAR_MIN)から
127なのでこの部分を修正して実行してみたわけです。
すると実行時にエラーで落ちてしまい、
追及していったところ、isprintが原因らしいことが
わかったところです。
負の数を-1以外入れてはいけないのでしょうか?

18:デフォルトの名無しさん
07/11/03 14:02:49
isprint には unsigned char で表現可能な値または EOF しか指定できない。
それ以外の値を指定したときの動作は未定義。

19:nkkn5
07/11/03 14:24:52
>>18
ありがとうございます。
やはりそうなんですか。
そうしますと、私が見た本のように
charの定義域全体をisprintを使いながら
(表示できないものは表示しないようにしながら)
表示していくということはできないということですね。

あと、お答えにあったようなことは
今後どういった資料をみたらよいのか
教えていただけませんでしょうか。

HELP見たのですが、まだ理解できない
私のC++にの対しての理解状態ですので、
わかりやすいものがあればと思ったのですが。

20:デフォルトの名無しさん
07/11/03 14:43:03
Media Playerみたいにウインドウの概観を変えるプログラムって、どういう教科書を読めば良いでしょうか?
開発環境はVisualC++ 2005を想定しています。どなたか、よい教科書をご存知の方がいらっしゃいましたら、教えてください。

21:デフォルトの名無しさん
07/11/03 14:44:01
Owner Draw

22:デフォルトの名無しさん
07/11/03 14:49:47
>>20
SetWindowRgnでぐぐるといいかも

23:デフォルトの名無しさん
07/11/03 15:13:04
>>19
できる
char に対する CHAR_MAX のように、unsigned char に対しては UCHAR_MAX があるので、 0 ~ UCHAR_MAX まで回せばいい

資料は VC 使ってるなら MSDN でいいんじゃない
インストールしてるかどうか知らないが、オンラインでも読める

URLリンク(msdn2.microsoft.com)(VS.80).aspx
>is 系ルーチンは、-1 (EOF) ~ UCHAR_MAX (0xFF) の整数の引数に対して、意味のある結果を生成します。

URLリンク(msdn2.microsoft.com)(VS.80).aspx
>isprint は EOF でないパラメータまたは 0 ~ 0xFF の範囲にないパラメータを渡された場合に CRT アサートを表示します

わかりやすいかどうかはなんとも

24:デフォルトの名無しさん
07/11/03 15:54:43
みてるかどうか知らないけど前スレ 982 へ。
> encodingのauto-detectionに関しては俺も知りたいな。
> Mozillaのソースとか読むと良いのかな?
> マルチプラットフォームでライセンス緩めの適当なライブラリがあると有難いんだが。

universalchardet っていう Mozilla 由来のライブラリがある。
ライセンスは、「MPL1.1/GPL2.0/LGPL2.1 のいずれかを選択」らしい。微妙だな。

25:16
07/11/03 17:48:57
どうもどなたもご存じないようなので別スレ行って来ます。

26:デフォルトの名無しさん
07/11/03 18:07:25
低脳マルチ死ね

27:デフォルトの名無しさん
07/11/03 18:13:01
>>16
聞き方が悪いんだよ。ソースを切り貼りせずに、せめて関数ひとつくらいをそのまま貼ってくれ。
buffer がどこで確保されてどこで解放されてるのか、それに対してコピーをどこでやってるのかが
さっぱりわからん。

28:16
07/11/03 18:17:18
>>27
わからない人の言い訳など聞く耳持ちません。

29:16
07/11/03 18:18:56
ほえほえ

30:デフォルトの名無しさん
07/11/03 18:21:39
>>28
俺もわからん
情報が不足しすぎてる
コンパイルして実行できる(そのフフフという現象を確認できる)完全なプログラムを見せれと言いたい

31:デフォルトの名無しさん
07/11/03 18:22:34
アホすぎて教えるのに骨が折れる

32:16
07/11/03 18:31:57
>>31
教える資質が無い人というのもいますから、無理はしなくていいですよ。

33:61
07/11/03 18:36:00
>>32
覚える資質が無い人というのもいますから、無理はしなくていいですよ。

34:デフォルトの名無しさん
07/11/03 18:43:26
そうだぞみんな。無理はせず、スルーしようぜ。

35:16
07/11/03 19:00:41
>>27
スレリンク(tech板)l50
のスレ>>747に書きましたのでよければ見てください。お願いします。

36:nkkn5
07/11/03 19:23:44
>>23
ありがとうございます。
試してみたのですが、unsigned char で
うまくいきませんでした。

コード:
//for (char i = 0; ; i++) { <--- もともと
//for (char i = CHAR_MIN; ; i++) { <--- 実行時ERROR !
for (unsigned char i = 0; ; i++) { <--- テスト
switch (i) {
case '\a' : cout << "\\a"; break;
case '\b' : cout << "\\b"; break;
case '\f' : cout << "\\f"; break;
case '\n' : cout << "\\n"; break;
case '\r' : cout << "\\r"; break;
case '\t' : cout << "\\t"; break;
case '\v' : cout << "\\v"; break;
default : cout << ' ' << (isprint(i) ? i : ' '); // <--- ISPRINTはここです
}
// 整数型にキャストしたものを表示
cout << ' ' << hex << int(i) << ' ' << dec << int(i) << '\n';
//if (i == CHAR_MAX) break;
if (i == UCHAR_MAX) break;
}

つづく

37:nkkn5
07/11/03 19:24:44
つづき

結果:表示されるものがcharの場合は、
cout << ' ' << (isprint(i) ? i : ' '); での出力が、
その値が示す”文字”だったのですが
unsigned charにすると、
文字にならずに”数値”になってしまいます。

coutがよくわかっていないのかもしれません。
coutでunsigned charで定義した変数を使って、その数値ではなく
文字を出力する方法を教えていただけませんでしょうか。

MSDNの件、ありがとうございました。
まだ自分のレベルからすると難しいですが。。。
結論を教えていただいた後なので該当箇所は
雰囲気としてはわかる、、、という感じです。

38:デフォルトの名無しさん
07/11/03 19:28:13
>>37
coutでの出力される形式は、データの型によって決まるから、
文字として出力したければchar型の値を渡す必要があるよ。

cout << ' ' << (isprint(i) ? static_cast<char>(i) : ' ');

39:デフォルトの名無しさん
07/11/03 19:30:52
char でループって普通はあんまりしないな。

for (int i = 0; i <= UCHAR_MAX; i++) {
cout << (isprint(i) ? char(i) : ' ');
cout << ' ' << hex << i << ' ' << dec << i << endl;
}

こんな感じでどうか。 (switchは面倒いから省略した)

40:デフォルトの名無しさん
07/11/03 19:32:13
isprint は isascii が偽の場合には未定義ではありませんか?

41:nkkn5
07/11/03 19:40:26
>>38
ありがとうございます!
結果自体は、うまくいきました。

すいません、新たな疑問です。
static_cast<char>で、
charの範囲外のははずの
unsigned charが128以上の場合でも
(私の環境での話です)
なぜうまく文字になるのでしょうか。


42:デフォルトの名無しさん
07/11/03 19:40:31
標準の C に isascii なんてありませんから

43:nkkn5
07/11/03 19:45:57
>>39
ありがとうございます。
こちらもできました。

ただ、すいません、41と同じ疑問があります。
そういうものなのでしょうか。

44:デフォルトの名無しさん
07/11/03 19:58:40
isprint は、 c < 0 and c ≠ EOF なる char c に対して未定義ではありませんか。

45:nkkn5
07/11/03 19:59:53
>>38、39

すいません。
いただいたご提案では
うまく行ってなかったみたいです。

charが負のときにisprinntなしで行うと
カタカナの範囲も文字として出力されたのですが
よく結果を見ていたら出力されておりませんでした。

範囲外のcastは
やはり勝手な値になる?ようですね。
double--->intを実験したら、
(100000000000)
intの最小値に無理やりcast後の値が
なってしまいました。
(実行時エラーにも
ならないものなんですねえ)



46:デフォルトの名無しさん
07/11/03 20:18:27
>>43
んーむ。 根拠は見つけられなかった。

正しくは
for (int i = CHAR_MIN; i <= CHAR_MAX; i++) {
cout << (isprint((unsigned char)i) ? (char)i : ' ');
}
と書くべきかもしれんね。

規格上は signed char の範囲外の値を signed char に変換したときの動作は実装依存らしいけど、実際にはそれが問題になったことはないな。
signed char と unsigned char は 1 対 1 で対応してるもんだと考えてる。

>>45
それはたぶんロケールのせい。
setlocale(LC_ALL, ""); を試してみそ。
ムダかもしれんが。

47:nkkn5
07/11/03 21:49:17
>>38、39 さん (再)

どうやら、うまく行っていなかったのも
isprintのせいのようです。
isprintに128以上の数値を渡すと、
0が返ってきます(私の実験です)。

---実験コード---
for (int i = 0; i <= UCHAR_MAX; i++) {
cout << setw(3) << char(i) << ' ' ;
cout << setw(3) << (isprint(i) ? char(i) : '-') << ' ' ;
cout << setw(3) << isprint(i) << ' ' ; // <--- この部分128以上では0
cout << setw(3) << dec << i << endl;
}
----------------

そのため、カタカナがでるような数値になると
私の前のコードではスペースに置き換えられて
いたために出力されていないように見えて
いたのだしょう。

つづく


48:nkkn5
07/11/03 21:50:54
つづき

(訂正)
いたのだしょう--->いたのでしょう

なぜカタカナが非表示文字と判断されるのか、?です。
そういう仕様なんでしょうか。
ただ英語圏生まれのため、isprintとしては
そういうことになるのかな、とも思っております。
違いますでしょうか。

また、上記のコードを、
setlocale(LC_ALL, "");
後に実行すると、
ループ自体が128で止まってしまいます。
UCHAR_MAX自体は(表示させてみたところ)
255のまま変わっていないのですがね、、、
(こちらも?ですが、setlocaleは
私にはレベル的に早いかなーという気がします。
私の見ている本には載ってませんし。)


49:nkkn5
07/11/03 21:56:37
>>40,44
そうみたいですね。
先ほどこちらで教えていただきました。
(18です)

17--->18--->19--->23--->36,37
という流れをみていただけるとうれしいです。

結局のところ、今は、私が見ている本の前提である、
charの範囲が0から255ならば
「charの定義域全体に渡って、
”表示できない文字はisprintを使ってスペースに置き換えながら"
文字と数値を一覧で出す」ことができるが、
charの定義域が-128から127である私の環境の場合、
うまくいく方法は見つかっておりません。
(とくにマイナス部分(カタカナなど)について)

”表示できない文字はisprintを使ってスペースに置き換えながら"
ということを行わないのであれば話は簡単なのですが。

17で質問したときにはこんなに大事(オオゴト)になるとは
思っておりませんでした。。。


50:デフォルトの名無しさん
07/11/03 22:37:36
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 132
スレリンク(tech板)

こっちのスレで訊いた方が良いかもしれない。

51:デフォルトの名無しさん
07/11/03 22:48:17
昨日、ドトネトのbitmapで質問にきた者です。

再び、VC++ 2005 EXPRESS で質問です。

URLリンク(msdn2.microsoft.com)
↑ここ見て、とりあえず線を引くところから初めてみようと思ったのですが、
外部参照 5 が未解決です。(リンクエラー?)がでます。

これは、ウィンドウズプラットフォームSDKのインストール後の設定になんか不備があるのでしょうか?
それとも、ウィンドウズプラットフォームSDKのDLLを手動でリンカに設定するもんなのでしょうか?

52:203
07/11/03 22:50:06
>>22
なるほど、これでよさげな感じですね。
どうもでした。

53:デフォルトの名無しさん
07/11/03 22:59:14
C++でLinuxのTCP/IPネットワークプログラミングをする場合
自分でソケット関連のシステムコールをクラス化して
作るものですか?それとも既存のライブラリがあって、それを
利用するのが今の定石でしょうか?
Cでソケットプログラミングはしてるのですが、C++で
同じことをする場合、自作のクラスの作り方の雛形
というか定石がわかりません。大体、形は決まってると
予想しているのですが。

54:デフォルトの名無しさん
07/11/03 23:02:31
CでうごくならC++でうごく

55:デフォルトの名無しさん
07/11/03 23:03:38
ソケット用のstreamを作っちゃってる猛者もいたなぁ

56:デフォルトの名無しさん
07/11/03 23:05:51
>>54
それは現段階では誤解を招くぞ

57:デフォルトの名無しさん
07/11/03 23:09:20
関数の呼び出しを使って、整数xの2倍した値を返す関数を作りたいのですが下のソースでは、値が表示されません。
下記のソースでできるなら、どこが間違っているか、分かる方は教えてください。
この方法自体が間違っているのでしょうか。
#include <stdio.h>
int dec(int y){
int z; z=y+1;
return(z);
}
int inc(int y){
int z; z=y+1;
return(z);
}
int mult2(int y){
int i,j; i=y,j=y;
while(i>=0){
i=dec(i),j=inc(j);
}
return(j);
}
main(){
int i; i=6;
printf("%d\n",mult2(i));
}

58:デフォルトの名無しさん
07/11/03 23:10:20
>>51
リンカ-入力-追加の依存ファイル にgdiplus.libを追加。
ソースに #pragma comment(lib, "gdiplus") って書いておく方が楽だけど。

59:デフォルトの名無しさん
07/11/03 23:12:34
>>57
値が表示されないという事は、
そもそもprintfが機能していないという意味なのだが。
そういう話なのか?

60:デフォルトの名無しさん
07/11/03 23:14:05
int dec(int y){
int z; z=y-1;
return(z);
}
int inc(int y){
int z; z=y+1;
return(z);
}
int mult2(int y){
int i,j; i=y,j=y;
while(i>0){
i=dec(i),j=inc(j);
}

61:57
07/11/03 23:15:34
>>59
おそらくprintfだけの話ではなく、それ以前のソースが間違っているのだと思います。
その間違えを指摘してもらいたいです。

62:デフォルトの名無しさん
07/11/03 23:17:21
decなのに値が増えてないか?
無限ループじゃないの?

63:デフォルトの名無しさん
07/11/03 23:18:35
 int dec(int y){
×int z; z=y+1;
○int z; z=y-1;
 return(z);
 }

64:デフォルトの名無しさん
07/11/03 23:30:54
さらに、
60のように
while(i>0){
と >=ではなく、>

65:デフォルトの名無しさん
07/11/03 23:45:17
>>47-48
cout << setw(3) << char(i) << ' ' ;の行をコメントアウトしたら、
UCHAR_MAX == 255まで結果が出力されたぞ。

>>46>>48
C++では、std::locale::global(std::locale(""))が
Cでのsetlocale(LC_ALL, "")に相当する。

これには<locale>が必要。

66:nkkn
07/11/04 00:25:05
>>65
ありがとうございます。
うまくいったみたいです。

まとめてみます。
・setlocale(LC_ALL, ""); を設定しないと、
isprintは、カタカナ部分について
0を返してしまう。
なお、
cout << setw(3) << char(i) << ' ' ;
はiが129以降でも出力自体はされる。

・setlocale(LC_ALL, ""); を設定すると、
カタカナ部分についてのisprintの返り値が
ちゃんと0以外(私の環境では255)になる。
一方、
cout << setw(3) << char(i) << ' ' ;
はiが129以降は、(その出力行自体)なにも
出力されなくなる。
この部分をコメントアウトすれば、
途中で止まらず、カタカナも出力される。
これで合っていますでしょうか。

当初の質問の目的が達成されました!
ありがとうございました。


67:nkfを使って日本語ファイルをwstringへ読み込む関数出来たよ
07/11/04 01:03:45
#include <windows.h>
#include <string>
#include <vector>
#include <fstream>
using namespace std;
void wreadfile(char *inputfile, vector<wstring> &z){
typedef int (__stdcall *FNC)(char*);
typedef void (__stdcall *FND)(char* ,char*);
locale::global(locale("japanese"));setlocale(LC_ALL,"japanese");
HINSTANCE hd = LoadLibrary("nkf32.DLL");
FNC SetNkfOption=(FNC)GetProcAddress(hd,"SetNkfOption");
FND NkfFileConvert=(FND)GetProcAddress(hd,"NkfFileConvert2");
int n;char *tempdir;n=GetTempPath(1, tempdir);
tempdir = new char[n+30];GetTempPath(n, tempdir);
char temfile[20]="nihongohenkanyo";
strcat(tempdir, temfile);
SetNkfOption("-w16L0 -X -Lu -d");
NkfFileConvert(inputfile,tempdir);
fstream fp(tempdir,ios::in | ios::binary );
static wchar_t wbuf[2][1024*1024+20];
int N,flg=0,k;wstring str=L"";
while(!fp.eof()){
fp.read((char *)(wbuf[flg]), 1024*1024);
for(N=fp.gcount()/2+5; wbuf[flg][N-1]==0; N--);
wbuf[flg][N]='\0';
k=0;while(1){
for(n=k; wbuf[flg][n]!='\n'; n++)
if(n>=N){str=(wstring)&(wbuf[flg][k]); flg=1-flg; goto end;}
wbuf[flg][n]='\0';
z.push_back( str + (wstring)&(wbuf[flg][k]) );
if(k==0)str=L"";
k=n+1;}end:}remove(tempdir);}

68:デフォルトの名無しさん
07/11/04 01:05:57
上のをヘッダファイルに入れて次のようにすれば、vector<wstring>型に1行ずつ入る

#include <string>
#include <vector>
#include "wreadfile.h"
using namespace std;


main(){
vector<wstring> z;
wreadfile("file",z);
for(int n=0;n<z.size();n++)wcout<<z[n]<<endl;
}

69:57
07/11/04 01:24:03
>>60
>>62-64
出来ました!ありがとうございました!

70:デフォルトの名無しさん
07/11/04 04:16:17
すみません
wcoutって危険( 認識できない文字があると落ちる )と思うので、wcoutを自作したいのですが
自作関数に置き換えられますか?

71:デフォルトの名無しさん
07/11/04 04:20:46
void hyoji (wstring str)とかのほうがいいですかね?

72:デフォルトの名無しさん
07/11/04 10:27:49
basic_stringをカスタマイズすれば、できるんじゃね

名前空間に閉じ込めれば、wcoutって名前でそのまま使えるし

73:デフォルトの名無しさん
07/11/04 10:33:21
>>70
んなもんは用途に寄るだろ。UTF-8で吐けるんなら問題ねえし、エンコーディングが
仮定できないコンソール出力で、情報を全く失いたくないんなら、出力を
フィルターすべきかもな。
boost::iostreamsなんかが使えると思うよ。

74:デフォルトの名無しさん
07/11/04 14:24:32
CでIEの今現在開いているURLを得ることってできますか??

75:デフォルトの名無しさん
07/11/04 16:37:47
>>74
ActiveXを使う要領でできるけど道のりは遠い。


76:デフォルトの名無しさん
07/11/04 16:45:15
今更、参照回数計測クラスを自作するのは時間の無駄でしょうか?
やはりshared_ptrを使うのが当たり前ですかね?

77:デフォルトの名無しさん
07/11/04 17:10:22
>>76
よく分かってるじゃない。

78:デフォルトの名無しさん
07/11/04 17:28:45
>>76
「参照回数計測クラスを自作する」ことが目的じゃなければそうすべき。

79:デフォルトの名無しさん
07/11/04 18:06:08
>>77
>>78
レスどうも。C++の勉強のために一度作って動かして、
あとはライブラリを使用します。
仕事でC++を使うときに皆さんどうしてるのかなと思いまして。

80:デフォルトの名無しさん
07/11/04 19:09:26
MSDNの↓をC:/1111.bmpに変えて動かしてみたんだが、エラーがでるんだぜ。
なんでなんだぜ

Image image(L"Grapes.jpg");
graphics.DrawImage(&image, 60, 10);

Image image(L"C:/1111.bmp");
graphics.DrawImage(&image, 60, 10);

あと、線を引いてみよう、文字列を書いてみようも試してみたんだが、画面がマッシロなままなのさ!

81:デフォルトの名無しさん
07/11/04 20:05:55
bccでcをやっています。最近OpanGLを始めました
そうしたら影を付けるところで止まります。
コンパイルは出来るのに、実行すると止まります。
どうすればいいでしょうか。

82:デフォルトの名無しさん
07/11/04 20:18:04
どういう方法で影を付けようとしてるのかわからんから、答えようがない
具体的にどの関数をどういうふうに使ったのか

それと、そこで止まるっていうのはどうやって確かめた?
実は他のところで止まってるのかもしれんぞ

「止まる」っていうのも、もう少し具体的に
アニメーションしてるのが止まるのか、キーやマウスの反応がなくなることなのか、エラーメッセージが出て強制終了くらうことなのか、OSごと落ちるのか

83:デフォルトの名無しさん
07/11/04 20:20:27
つまりソースとエラーメッセージを出せ、と。

84:デフォルトの名無しさん
07/11/04 20:21:26
デバッガ…は無理そうだから、printf(MessageBox)デバッグだな。

85:分からないから寝る
07/11/05 00:44:19
ボーランドのturbo c++(forWin95)を見つけたので図書館からTURBO C++ジョイフルプログラミングという本を借りてきたのですが・・・
一番最初のたった5行の文がコンパイルするとエラーを吐きます

main()
{
 printf("C言語で遊ぼう\n");
 while(!kbhit());
}

3.4行目共にCall to undefined function なんですがなにが悪いんでしょうか?

86:デフォルトの名無しさん
07/11/05 01:12:11
C++ではプロトタイプ宣言のない関数は呼び出せない。
ちゃんと適切なヘッダをインクルードする必要がある。

87:デフォルトの名無しさん
07/11/05 01:48:19
Visual C++ 2005 EE と GCC ではちょっと動作が違うみたいですが、
どちらを使って勉強をすればいいのでしょうか?

88:デフォルトの名無しさん
07/11/05 02:13:05
さぁ?

89:デフォルトの名無しさん
07/11/05 02:16:04
変数名の付け方で時々悩むのですが、
みなさん「ハンガリアン記法」ってのを使ってますか?

90:80
07/11/05 02:25:10
仕事で強制されたら使うけど、個人的なプログラムでは使わない
といっても、java使いなんで、Cだとどうなることやら


エラーの原因がトンと分からなかったので、FromFileで読み込めるようなので試してみた。
Image::FromFile(L"1111.bmp");
Image::FromFile(L"C:\\1111.bmp");
Image::FromFile(L"C:/1111.bmp");

ぜんぶ0x00000000(null?)が返ってくる。なんで?
内部で画像の読み込みに失敗して、javaでいうヌルポでも発生してたんかしら?

91:デフォルトの名無しさん
07/11/05 02:30:19
>>87
GCCの方が文法に厳しいので勉強するならGCC

92:デフォルトの名無しさん
07/11/05 02:35:18
こういう時に注意かな
for(int i=0;i<10;i++) cout << i << endl;
cout << i << endl;

で、いらないテクニックを覚える…と
#define for if(1)for

93:デフォルトの名無しさん
07/11/05 07:59:41
>>89
タイプの方なら自然と使ってる。ってか便利。
システムの方は自然と使わなくなった。

94:デフォルトの名無しさん
07/11/05 08:16:02
>>92
さすがに、それはVC++でもNET 2003あたりから
コンパイル通らないほうがデフォルトになった。

>>93
それをいうならアプリケーションハンガリアンではないのか?

95:デフォルトの名無しさん
07/11/05 12:21:07
index が1000万あるとします 
indexごとにファイルを読みに行くとします
このとき、ファイルを一つにまとめるのと、一つ一つ分けるのと、いくつか束にするのではどれが速度速いですか?
ランダムに3個程度のindex値をアクセスすることにします

96:デフォルトの名無しさん
07/11/05 12:29:25
一ファイル当たり10KB以下として、indexは10万とします
このときファイルサイズは最大1Gになります 
indexは、0から10万の数字で与えられるとします
indexごとにファイルの位置を記録しておくか、index名のファイルを10万用意するかですが
どっちが良いですか?

97:デフォルトの名無しさん
07/11/05 13:00:49
あまり細かく分けると、クラスタサイズの制限から容量多く使ってしまいますね
10バイトしか記録しなくても512バイト程度使ってしまいますね

98:デフォルトの名無しさん
07/11/05 14:31:55
Unicode, ShiftJIS, EUC
あたりを相互変換できる文字コードライブラリを探しています。
・言語はCオンリー
・ライセンスがBSD以下のゆるさ
・サイズはなるべく小さめ
・ポータブル
の条件に合うよさげなライブラリがあったら教えてください。
よろしくお願いします。

99:デフォルトの名無しさん
07/11/05 15:53:16
スレ違いでね?

100:デフォルトの名無しさん
07/11/05 16:58:31
配列の入力の時に,EOFだと-1入力で終了になりますよね?
改行で入力終了にしたいのですが,どうすればいいですか?
1 1 0 0 1 0 1 1 改行
で入力を終了したいです。
教えてください。よろしくお願いします。

//---- 配列入力
num = 0;
do {
 scanf("%d", &arr[num]);
} while ( arr[num++] != EOF );   // 改行は入力の終了
num--;                // 有効な入力数


101:デフォルトの名無しさん
07/11/05 17:45:46
>>100
マルチすんなカス

102:デフォルトの名無しさん
07/11/05 19:23:00
>>100

char buf[MAXSIZE];
char *p;

fgets(buf, 99, stdin);

p = strtok(buf, " ");

while(p != NULL) {
 arr[num++] = atoi(p);
 p = strtok(NULL, " ");
}

103:デフォルトの名無しさん
07/11/05 19:24:02
>>100
訂正

char buf[MAXSIZE];
char *p;

fgets(buf, MAXSIZE - 1, stdin);

p = strtok(buf, " ");

while(p != NULL) {
 arr[num++] = atoi(p);
 p = strtok(NULL, " ");
}


104:デフォルトの名無しさん
07/11/05 19:26:35
他の言語のソースを移植すれば良くね?
サイズ小さいライセンスも気にしない

105:デフォルトの名無しさん
07/11/05 19:48:49
-Lオプションで指定したディレクトリのうち
その中にある特定のディレクトリを参照させないようにするにはどうすればいいですか?

たとえば
-L/usr/local/lib と指定したもののうち /usr/local/lib/gcc-4.0.4 は参照しないようにする
とかいう感じです

106:デフォルトの名無しさん
07/11/05 21:02:23
>>95-96
速度は実測が基本。
良い悪いの判断は本人にしかできない。

107:デフォルトの名無しさん
07/11/05 21:07:59
巨大なファイルのシーク時間と、ファイルのオープンに要する時間は一般的にどっちがかかるんですか?
ファイルのオープンの方がコストは多そうですが

108:デフォルトの名無しさん
07/11/05 21:09:47
>>107 聞く前に試せよサル

109:デフォルトの名無しさん
07/11/05 21:20:47
>>107 聞く前に試せよサル

110:デフォルトの名無しさん
07/11/05 21:44:45
>>107
使用するファイルシステムによっても違うしだろうし、ファイルシステム上の断片化などの状態にも依る。
キャッシュに乗ってるかも影響するはず。
試せ。

111:デフォルトの名無しさん
07/11/05 22:21:46
C++でAPIを組んでいるのですが
URLリンク(www.katsakuri.sakura.ne.jp)
この項目を入れたら
0x00412984 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00090f44 を読み込み中にアクセス違反が発生しました。
とエラーが出るようになったのですが、どこがおかしいのでしょうか?
作っているプログラムの内容は、チェックボックスにチェックが入っているところにEDITボックスを表示する、と言う感じです。
選択した場所によってはうまく動作することもあります。

112:デフォルトの名無しさん
07/11/06 00:37:59
ぶった切り失礼します

文字列をlongに変換するstrtol()という関数ですが
失敗時の返り値が0なのはいいのですが、文字列が"0"だったときの区別のつけ方は
変換不可能な文字列へのポインタの格納先を準備してあげるしかないのでしょうか?

113:デフォルトの名無しさん
07/11/06 01:31:55
自作関数作れば?
long mystrtol(char *cary, char **ep)
{
if(!strcmp(cary,"0"))
return 0L;
return strtol(cary,ep,10);
}
こんなのとかさ

114:デフォルトの名無しさん
07/11/06 01:58:10
>>113にツッコミたくてたまらない俺はまだまだ修行が足りないな。

115:デフォルトの名無しさん
07/11/06 02:16:20
>>114
つっこんでやれよ、本人のためにもさ

116:デフォルトの名無しさん
07/11/06 02:16:44
sscanfとか、StrToIntExとか

117:デフォルトの名無しさん
07/11/06 02:24:27
893が75キロ VS 105キロの空手家 体重差 30キロの殴り合い映像
URLリンク(video.nifty.com)
店でNo4 ホスト VS 黒帯空手家 死闘の映像
URLリンク(video.nifty.com)
イケメン ホスト VS ブルースリー ボコボコに殴る映像
URLリンク(video.nifty.com)
893 VS ブルースリー 対決映像
URLリンク(video.nifty.com)

118:デフォルトの名無しさん
07/11/06 05:27:21
算術命令圧縮って弱点あると思うんですが
例えば0 1の出現率が等しいとするとどのビット列も同じ確率になりますよね?
データの並び順を考えないと駄目ではないですか?
たとえば0000000000000000000000000000011111111111111111111111111111111などは
繰りかえし数を記録することでかなり圧縮できると思うのですが

119:デフォルトの名無しさん
07/11/06 05:42:46
算術命令圧縮ではなくて算術圧縮だったよ 
あと、文書を圧縮するならば前の1、2バイトごとに確率分布表を作って圧縮するといいと思うけど

120:デフォルトの名無しさん
07/11/06 06:39:22
算術の説明だと、1文字ずつの説明だけだけど、初めから5文字の分布を与えても出来るね
確率1%のものがあれば、2^(-7) = 0.0078125 だから小数点以下7桁程度を与えるのが良いと言うことになる
ハフマン圧縮の一般化といえるね

121:デフォルトの名無しさん
07/11/06 13:49:45
class BaseClass{
public:
int a;

BaseClass(){};
~BaseClass(){};
virtual void Func(){};
};

class SubClass : public BaseClass{
public:
int b;
void Func(){};
};

int main(){

BaseClass *pointer = new SubClass[2];

for(int i=0; i<2; i++) pointer[i].Func();

delete [] pointer;

return 0;
}

これでエラー起こるの何故

122:デフォルトの名無しさん
07/11/06 13:53:35
>BaseClass *pointer = new SubClass[2]; 

配列へのポインタはキャストしてはいけない

123:デフォルトの名無しさん
07/11/06 13:58:11
>>122
もし上みたいに子クラスのインスタンスの配列を親クラスのポインタに入れて使いたい場合どうしたらいいんですか?

124:デフォルトの名無しさん
07/11/06 14:04:50
親クラスのポインタの配列を作れば良いじゃないか。

125:デフォルトの名無しさん
07/11/06 14:17:58
申し訳ない…
具体的にはどんな書き方に…?

126:125
07/11/06 14:22:08
自己解決しました
ありがとうございました

127:デフォルトの名無しさん
07/11/06 17:52:46
そういうのも自己解決って言うのかw

128:デフォルトの名無しさん
07/11/06 19:06:46
ディジタル技術検定の問題集で「二つの正の整数の積を求めるプログラム」の解説をお願いします。
二つの正の整数の積ということなのですが、二つの整数をかけるだけ(a*b)ではいけないのでしょうか?
while文の処理がさっぱりわかりません。
よろしくお願いします。

#include <stdio.h>
void main(void){
int a,b,prod=0,temp;
printf("a="); scanf("%d",&a);
printf("b="); scanf("&d",&b);
if(a>b){
temp=a;
a=b;
b=temp;
}
while(a != 0){
if(a%2 == 1) prod +=b;
a=a/2
b=2*b
}
printf("product of %d * %d = %d", a, b, prod);
exit(0);
}

129:デフォルトの名無しさん
07/11/06 19:31:10
ループ中の計算をシフトとビット演算で置き換えると
乗除の演算なしで掛け算が出来るなぁ…、なんて。

130:デフォルトの名無しさん
07/11/06 19:33:33
燦然と輝くvoid main(void)

131:デフォルトの名無しさん
07/11/06 19:37:32
>>128
小学校で習った掛け算の筆算を二進数でやってるようなもんだ

132:128
07/11/06 19:40:53
>>129 こういうことですか?

while(a != 0){
if(a%2 == 1) prod +=b;
a=a >> 1 /* a=a/2 */
b=b << 1 /* b=2*b */
}


133:デフォルトの名無しさん
07/11/06 20:28:03
>>129
そこはコンパイラの最適化に期待ということでは?
もっとも、これくらいならC/C++でもシフト使えということは同意。

134:デフォルトの名無しさん
07/11/06 22:35:19
というか、そこで*を使ってしまうと、
「じゃあ(a*b)でよくね」みたいな話になるから(w

135:デフォルトの名無しさん
07/11/07 19:47:22
class hoge : public base
{
private:
base* m_base;
};

これって循環ですか?

136:デフォルトの名無しさん
07/11/07 20:25:07
開発中によく見る記述ですが何か心配なことでも?

137:デフォルトの名無しさん
07/11/07 20:58:33
循環なら避けたいんですが、
循環ですか?

hogeの定義にbaseが必要で
でもhogeはbaseを持ってるので
なんか循環っぽいなぁと。

138:デフォルトの名無しさん
07/11/07 21:13:18
ならお前の避けたい循環の意味をちゃんと書けやタコが

139:デフォルトの名無しさん
07/11/07 21:16:02
知ってる人に聞ければいいです。
そもそも知らない人は
自分が知らないのに人に教えられるわけがないでしょう。

140:デフォルトの名無しさん
07/11/07 21:18:34
それじゃ、誰にも答えられないね。

141:デフォルトの名無しさん
07/11/07 21:20:44
>>140
全知全能の神光臨。

142:デフォルトの名無しさん
07/11/07 21:29:49
循環じゃないよ

143:デフォルトの名無しさん
07/11/07 21:30:14
とりあえず循環参照が起こる可能性は充分すぎるほどに有るわな。
ただ場合によるので、具体的にやりたいことを示してくれないと問題点の指摘は出来ん。

144:デフォルトの名無しさん
07/11/07 21:33:34
baseの定義にhogeを必要としてたら循環定義

145:デフォルトの名無しさん
07/11/07 21:35:38
循環ってのは
class sage の宣言に class age を使ってて
class age の宣言に class sage を使ってる場合。

よって循環ではないべ?

146:デフォルトの名無しさん
07/11/07 21:36:24
>>135
普通に連結リストかなんかでありそうな気がするが

147:デフォルトの名無しさん
07/11/07 21:38:30
>>140の立場wwwwww

148:デフォルトの名無しさん
07/11/07 21:43:03
で、結局どっちの意味で循環って言ってるのよ?>>135は。

149:デフォルトの名無しさん
07/11/07 21:43:04
>>135
あほすぎ

150:デフォルトの名無しさん
07/11/07 21:55:38
>>149 = 顔をつぶされた>>140

151:デフォルトの名無しさん
07/11/07 22:08:21
>>150
はずれ

152:デフォルトの名無しさん
07/11/07 22:19:11
>>135
エスパーがいない可能性を考えないのか?

153:wolf ◆8VH3XAqjlU
07/11/07 23:08:13
>>135
base<---hogeで循環は存在しないけど
m_base = new する第3のクラスを含めた循環に注意です

154:デフォルトの名無しさん
07/11/08 00:11:41
で、結局誰もまともに答えられないんですね。がっかりしました。

155:デフォルトの名無しさん
07/11/08 00:51:46
>>154
>>153

156:デフォルトの名無しさん
07/11/08 00:59:52
それはもう読みましたよ。

157:デフォルトの名無しさん
07/11/08 10:37:40
>>156
お仕事頑張ってくださいね

158:デフォルトの名無しさん
07/11/08 10:38:57
なるほど循環参照の事か

159:デフォルトの名無しさん
07/11/08 11:07:44
>>154
聞いてる時点でお前はそれ以下じゃんw

160:デフォルトの名無しさん
07/11/08 11:28:52
>>158

>>137読めば分かるだろ。

161:デフォルトの名無しさん
07/11/08 16:06:16
>>159
それはつまり、回答者と質問者の理解度を対等に比較するのが
あなたにとっては「自然」である、ということですよね?
でもそれって、教師の知識が怪しい、という話をしている時に「生徒はそれ以下じゃんw」と
返すようなものですね。
こっちは、そういうレベルの人間が、知識を持っているという嘘をついて「教壇に立」って、
誰かに物を教えるのが間違いである、という点を言っているんですよ。
そういうレベルの人に回答者になってもらっては困るんです。質問者も、場も、混乱するだけなので。

確かに理解度は俺のほうが下です。
でも、あなた方も俺と同じ、質問者レベルなんです。回答者気取りをされると邪魔なのです。
そういうことです。

162:デフォルトの名無しさん
07/11/08 16:10:41
社会性の無いキチガイが紛れ込んでますね

163:デフォルトの名無しさん
07/11/08 16:15:12
>>161
何を聞きたいのか分かりません

実体の循環参照ならコンパイルできないので安心して下さい
ポインタを使う限り循環参照になる可能性は常にあります
諦めて下さい

164:デフォルトの名無しさん
07/11/08 16:28:37
プログラムの勉強に飽きたら2,3日何もしないとかいう人いる?

165:デフォルトの名無しさん
07/11/08 16:31:58
>>161
がっかりするとは俺もお前にがっかりだ

166:デフォルトの名無しさん
07/11/08 16:32:03
勉強つーか趣味のコーディングではよくある。一週間以上になることもしばしば。

167:デフォルトの名無しさん
07/11/08 17:15:41
リアルで >>161 は空気読めない人って
周りから言われるんじゃね?

教師は仕事で金もらって教えてるわけだが、
ここは2chだしなー
質問者はこうあるべき!
回答者はこうあるべき!
とか真面目に言われてもなー

郷に入れば郷に従えっていうから、
説教長文書くより、どうすれば
2chで回答を得られる可能性が高くなるのか?
を考えたほうが現実的。

妥協できないなら、ネットで質問なんてするな。
第三者からみれば、あんたが荒らしだから。


168:デフォルトの名無しさん
07/11/08 17:35:28
釣られすぎ。

169:デフォルトの名無しさん
07/11/08 17:58:31
>>162
まったくです。困ったものですね。
人に何かを教える立場というのは、自己顕示欲の異常に強い人達にとっては
魅力的なものなのでしょうね。だからそのスキルも無いのに気取りたがるのでしょう。

>>165
がっかりする分には好きなだけがっかりしてもいいですよ。
能もないのにでしゃばったりしないこと、これを学習することのほうが大切です。

>>167
「ここは2chだし理論」で物を言う人は、相手の言い分にもきちんとそれを適用して、
ここは2chなのだから説教なんかしてもしょうがない、という風に思い至るべきですよ。
ある理屈を、ある側にだけ適用するのはおかしな言動だと言わざるを得ません。
それから、「2chで回答を得られる可能性」は、この場合関係ありません。
回答者が回答できるレベルにあれば、それで解決していたことなので。
あと、第三者というのを一つの意志のように語るのは気持ち悪すぎです。
あっちの第三者と向こうの第三者は、異なる意識を持っているのです。
架空のみんなが自分を支持する夢から出て、自分の名義で物を言いましょう。

170:167
07/11/08 18:14:58
うわーすごいな
だから空気読めといっとろうが

質問してみた

バカにされた

マジ反論 ←いまここ

まともな回答もついてるんだからさ
それでいいじゃん?
これ以上何を望んでるの?


171:167
07/11/08 18:16:16
釣りなら見事に釣られたわけだがな>俺

172:デフォルトの名無しさん
07/11/08 18:37:21
釣りでしょ。少なくとも>154は漏れだし。

173:デフォルトの名無しさん
07/11/08 19:19:35
>>170
ダメ回答者達が維持したがっているダメな空気は、読んだ上で否定しています。
そんな種類の空気に支配的になられては困るので。

174:173
07/11/08 19:32:48
ごめん釣りでした。

175:デフォルトの名無しさん
07/11/08 19:34:54
ダメ回答者をバッタバッタと取り締まってくれる
救世主が登場


176:デフォルトの名無しさん
07/11/08 19:45:20
>>138 = >>140
がメンツをつぶされた挙句暴れている模様。

177:140
07/11/08 20:33:36
ちゅがうよ

178:デフォルトの名無しさん
07/11/08 23:26:50
スレッドで、void* で渡した引数をclassに変換したいのですがキャスト出来ないと言われます
2つ以上の引数をスレッドに渡すにはどうすればいいですか?

179:デフォルトの名無しさん
07/11/08 23:44:35
classじゃなくて、classへのポインタにキャストしてみればどーか?

void func(void *arg)
{
((hogeclass *)arg)->func();
}


180:デフォルトの名無しさん
07/11/08 23:49:05
サンクスやってみます

181:デフォルトの名無しさん
07/11/08 23:50:40
って、まさか本当に
HogeClass hoge = (HogeClass) threadArg;
 なんて記述をしてるんじゃ…。

182:デフォルトの名無しさん
07/11/08 23:59:34
キャストしたvoid型ポインタのarg引数のポインタの元の型
が適切な物なら良いけど、もしそうじゃないなら怖いな

183:デフォルトの名無しさん
07/11/09 00:12:57
俺はその辺が気持ち悪くなってboost::threadに逃げた。

184:デフォルトの名無しさん
07/11/09 04:19:15
空気読めて無い人って本当に空気読めてると思ってるんだ・・・
リアルでは出会えない珍獣を見た

185:デフォルトの名無しさん
07/11/09 05:51:13
>>184
とっくにスレの流れ変わってるんだから、空気読めよ。

186:デフォルトの名無しさん
07/11/09 06:34:46
違うんだ・・!>>184の空気を読めなくしたのは・・・本当は・・漏れなんだ・・・!

187:デフォルトの名無しさん
07/11/09 10:24:19
ビット列の出現個数を数えたいのですが毎回結果が違います 何ででしょうか?
#include <iostream>
#include <windows.h>
#include <process.h>
using namespace std;
#define N 1000
#define K 320000
unsigned int su[256];

unsigned WINAPI open(void *p){
unsigned long size; char *buf=new char [K+100];
HANDLE fp=CreateFile((char*)p,GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
ReadFile(fp,buf,K,&size,NULL);
for(int i=0;i<size;i++)su[ (unsigned char)buf[i] ]++;}

main(){
WIN32_FIND_DATA fd;
char path[200]="d:\\aaa\\",serchpath[200];
strcpy(serchpath, path); strcat(serchpath, "*");
SetCurrentDirectory(path);

HANDLE hd = FindFirstFile(serchpath, &fd);
int n; HANDLE hf[N];
for(n=0;n<256;n++)su[n]=0;
for(n=0;;n++){
for(;;){if(!FindNextFile(hd, &fd))goto end;
if(!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))break;}
hf[n]=(HANDLE)_beginthreadex(NULL, 0, open,(void*)fd.cFileName, 0 ,NULL);}

WaitForMultipleObjects(N, hf, TRUE, INFINITE);
end:
for(n=0;n<256;n++)cout<<n<<" no kosu "<<su[n]<<endl;}

188:デフォルトの名無しさん
07/11/09 10:27:39
su配列にマルチスレッドでアクセスしているところが駄目なんでしようか?

189:デフォルトの名無しさん
07/11/09 10:39:10
>>187
・同一メモリに複数スレッドから同時にアクセスしているから
・serchpathなんてへんな変数名だから
・thread内でnewしているのに解放していないから
・高々Kバイトしか読み込まないのに100バイトも余計に確保しているから
・変数nを違う目的に使い回しているから
・コーディングスタイルが変態だから
・ハンドル変数にfpなんて名前を使っているから
・どっかWinAPIと思しき辺りの使い方が間違っているから
・毎回ディレクトリの状態が違うから
・毎回ファイルの内容が違うから
どれだろね。

190:デフォルトの名無しさん
07/11/09 10:47:50
正解はなんなんですか?

191:デフォルトの名無しさん
07/11/09 10:56:48
>>190
1つずつ問題がないかどうか確認するんだ


192:デフォルトの名無しさん
07/11/09 10:58:06
これでも値が違います なぜでしょうか
#include <iostream>
#include <windows.h>
#include <process.h>
using namespace std;
#define N 200
#define K 16
unsigned int su[K];

unsigned WINAPI f(void *p){
int n=(int)p;
for(int i=0;i<n*n;i++)su[i%K]++;}

main(){
int n;
for(n=0;n<K;n++)su[n]=0;
HANDLE hf[N];
for(n=0;n<N;n++){
hf[n]=(HANDLE)_beginthreadex(NULL, 0, f,(void*)n, 0 ,NULL);}
end:
WaitForMultipleObjects(N, hf, TRUE, INFINITE);
for(n=0;n<K;n++)cout<<n<<" no kosu "<<su[n]<<endl;}

193:デフォルトの名無しさん
07/11/09 11:01:05
>>192
馬鹿だから。

194:デフォルトの名無しさん
07/11/09 11:03:41
192よりこっちのほうがたんじゅんかとおもいます どこが駄目なんでしょうか 
#include <iostream>
#include <windows.h>
#include <process.h>
using namespace std;
#define N 200
#define K 12
unsigned int su[K];

unsigned WINAPI f(void *p){for(int i=0;i<(int)p;i++)su[i%K]++;}

main(){
int n; for(n=0;n<K;n++)su[n]=0;
HANDLE hf[N];
for(n=0;n<N;n++){hf[n]=(HANDLE)_beginthreadex(NULL, 0, f,(void*)n, 0 ,NULL);}
WaitForMultipleObjects(N, hf, TRUE, INFINITE);
for(n=0;n<K;n++)cout<<n<<" no kosu "<<su[n]<<endl;}

195:デフォルトの名無しさん
07/11/09 11:09:00
書き手が駄目なんだろう。

196:デフォルトの名無しさん
07/11/09 11:12:06
こうしんされた値が、別のスレッドで更新されてしまうからですかね?
メモリがFDくらい動作がのろいとするとsu[・]の値を呼び出して
1を足して書き戻すときに、同時に呼び出して計算していた値で置き換えられると言うことです

197:189
07/11/09 11:16:26
ちゃんと最初に指摘しているのに……(TT

198:デフォルトの名無しさん
07/11/09 11:18:14
カワイソス

199:デフォルトの名無しさん
07/11/09 11:20:38
これと同じ事ですね 速くする為にスレッドにしたいのに排他制御入れたら鈍くなりますね

クリティカルセクション


ウェブページの来訪者数を表すカウンタのプログラムを例にとって説明する。カウンターのプログラムはおおまかに次の処理からなる。
ディスク等の記憶装置から現在のカウンタの値を読み出す
カウンタの値を1増やす
カウンタの値を記憶装置に書き戻す
URLリンク(ja.wikipedia.org)

200:デフォルトの名無しさん
07/11/09 11:24:24
配列の要素を LONG volatile にしてInterlockedIncrement。

201:187
07/11/09 11:33:53
いいこと思いついた スレッド側でビット列の個数を数えて、その個数を配列で返してメイン側で足しあわせる
これなら時間のかかる部分はスレッドでやってあるから高速のはず

202:デフォルトの名無しさん
07/11/09 12:39:04
環境:WindowsXP VS2005 SP1 MFCアプリケーション ダイアログベース

ある市販のDLL(libも付いてたので「追加の依存ファイルに指定済み」)の外部関数をコールするたびに、以下のようなメッセージが出力ウィンドウにでます。

HOGE.EXEの0x7c812a5bで初回の例外が発生しました:Microsoft C++の例外: std::runtime_error (メモリの場所 0x0012f16c)

0x7c812a5bでググるといくつかヒットしましたが、原因特定できず。
仕方ないので関数コールをtry catchでくくってもcatchできず。
_try _exceptでも受けれず。

このエラーはどうやったら出なくなるでしょうか?

203:デフォルトの名無しさん
07/11/09 12:40:31
非同期処理じゃなくて高速化が目的なのかヨ。

よく知らねぇんだが、デュアルコアとは言え
プロセスでもない単なるスレッドでOSがマルチな処理してくれるんか?
シングルコアな動きするなら、ディスパッチするだけでむしろ遅くなりそうなんだが。

204:デフォルトの名無しさん
07/11/09 12:42:39
ゆとり教育がどうこう言われてるけど、194はもっとソースにゆとりを持たせるべき
変態と言われてもそのままってことは真性のMなんだろうか

205:デフォルトの名無しさん
07/11/09 12:45:39
>>203
しかも、実態はディスクアクセスで律速されるから(同じディスク上のファイルを調べる限り)殆ど速くなる余地がない罠。

206:202
07/11/09 12:47:30
書き忘れましたが、出力ウィンドウに表示が出るだけで、
動作には影響は今のところありません。
あと、その市販のDLLに付いてきたMFCのサンプルプロジェクトで試しても同じエラーが出力ウィンドウに出ます。

207:デフォルトの名無しさん
07/11/09 14:46:34
その市販DLLの名前も書かんということはエスパー希望か。

208:デフォルトの名無しさん
07/11/09 15:54:58
const.cpp
1 #include <iostream>
2
3 void extfunc(const int &val)
4 { std::cout << val << std::endl; }
5
6 class A
7 {
8 static const int CONSTDATA = 0x100;
9 public:
10 void func()
11 { extfunc(CONSTDATA); }
12 };
13
14 int
15 main()
16 {
17 A a;
18 a.func();
19 return 0;
20 }

$ g++ --version
g++ (GCC) 4.2.3 20071014 (prerelease) (Debian 4.2.2-3)
$ g++ const.cpp
/tmp/ccN8OXMd.o: In function `A::func()':
const.cpp:(.text._ZN1A4funcEv[A::func()]+0x9): undefined reference to `A::CONSTDATA'

うーん・・・コンストメンバ変数って、参照で受ける事が出来ないんでしょうか?
extfunc(int(CONSTDATA)); とすれば通りますがなんか・・・

209:デフォルトの名無しさん
07/11/09 15:59:37
メーカーに電話。

210:デフォルトの名無しさん
07/11/09 16:19:18
>>208
定義が無いから賢いコンパイラなら定数データの領域は確保しないらしいね
(なので当然シンボルもない)
by メイヤーズ

定義してみなよ

const int A::CONSTDATA;

211:デフォルトの名無しさん
07/11/09 16:41:20
>>203
187の場合で効果があるかどうかは別として、少なくともWindowsでは、
マルチスレッドでも複数の論理CPUを使ってくれる。

212:デフォルトの名無しさん
07/11/09 16:46:47
Linuxにとっては、スレッドはプロセスと基本的には同じ。
従って、特定のスレッドがどのコアで実行されるかは
原則的にカーネルにゆだねられる。

213:デフォルトの名無しさん
07/11/09 17:07:17
>>210
なんと・・・

6 class A
7 {
8 static const int CONSTDATA;
9 public:
10 void func()
11 { extfunc(CONSTDATA); }
12 };
13
14 const int A:CONSTDATA = 0x100;

でOKでした,#defineしちゃいそうだけどここは我慢・・・
サンクスです

214:デフォルトの名無しさん
07/11/09 22:00:56
>>213
初期値の指定はクラス定義内でいいんだぜ。そうしないと配列要素数とかの
定数式につかえない。

>>210
クラスのメンバ変数は定義しない限り実体がなくて、参照やポインタを取ろうとすると
エラーになることは決まっている。整数型に限って初期値をクラス定義内に書けて、
書けば定数式に使えるという特別ルール。

215:デフォルトの名無しさん
07/11/09 22:03:41
>>206
DLL 内で throw されて DLL 内で catch されてるんでしょ。何も問題ない。

216:デフォルトの名無しさん
07/11/10 00:33:03
暗号アルゴリズムを勉強しはじめたところなのですが、
DES や AES など、一般的な暗号方式のライブラリはありませんか?
C でも C++ でもいいです。

ご存知のかた、もしくは自作モノを持っているかた、情報をお願いします。

;; できれば SHA-1 や base64 まで対応していると嬉しいですが、
;; 無くても構いません。



217:デフォルトの名無しさん
07/11/10 00:39:48
勉強なら自分で作れ。ライブラリを使えるようになっても勉強にならないぞ
あとSHA-1やbase64は暗号じゃない

218:デフォルトの名無しさん
07/11/10 00:58:37
>>216
opensslとかか?
まぁでも>>217に1票

219:デフォルトの名無しさん
07/11/10 01:07:12
>>214
だからEffectiveC++に載っていると。。

220:203
07/11/10 01:21:43
>>211-212
情報サンクス。
良く知らんことしゃべってすまんかった。

221:187 スレッド出来ました
07/11/10 03:02:08
#include <iostream>
#include <windows.h>
#include <process.h>
using namespace std;
#define N 100
#define K 320000
unsigned int su[N][256]; char fname[N][256],chk[N];

unsigned WINAPI open(void *p){
unsigned long size,n=(int)p; char *buf=new char [K+100];
HANDLE fp=CreateFile(fname[n],GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
while(1){ ReadFile(fp,buf,K,&size,NULL); if(size==0){chk[n]=0;return 0;}
for(int i=0;i<size;i++)su[n][ (unsigned char)buf[i] ]++;}}

main(){ WIN32_FIND_DATA fd;
char path[200]="d:\\aaa\\",serchpath[200];
strcpy(serchpath, path); strcat(serchpath, "*");
SetCurrentDirectory(path);
HANDLE hd = FindFirstFile(serchpath, &fd);
int n,i; HANDLE hf[N];
for(n=0;n<N;n++)for(i=0;i<256;i++)su[n][i]=0;for(n=0;n<N;n++)chk[n]=0;

for(;;){ if(chk[n]==0){
for(;;){if(!FindNextFile(hd, &fd))goto end;
if(!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))break;}
strcpy(fname[n],fd.cFileName); chk[n]=1;
hf[n]=(HANDLE)_beginthreadex(NULL, 0, open,(void*)n, 0 ,NULL);}
n++;if(n>=N)n=0;}
end: WaitForMultipleObjects(N, hf, TRUE, INFINITE);
for(n=1;n<N;n++)for(i=0;i<256;i++)su[0][i]+=su[n][i];
for(i=0;i<256;i++)cout<<i<<" no kosu "<<su[0][i]<<endl;}

222:デフォルトの名無しさん
07/11/10 08:40:14
>>221
>for(;;){ if(chk[n]==0){
最初にこの行に到達するとき n=N だぞ。

223:デフォルトの名無しさん
07/11/10 10:27:45
>>219
本は持ってないので知らないけど、クラス定義内の static const な整数型について
>210 みたいに「賢いコンパイラなら~」って書いてあるなら、ちょっと不正確だと思う。

224:デフォルトの名無しさん
07/11/10 11:24:44
>クラスのメンバ変数は定義しない限り実体がなくて、

これは必ずしも正しくないということが書かれてるよ。
これを実現するコンパイラがいわゆる賢いコンパイラ。
標準で、絶対に領域確保がされないことが保障されている
わけではなく、実装依存となる。static constなデータは、
確保されるならば、大抵静的領域になる。アドレスを必要とする
処理がある場合に限って(この場合は必ず領域確保が必要)領域
を確保してもいいし、無条件に確保しておいてもいい。
それは実装依存ということ。
領域確保を絶対に避けたければenumを使えばいい。

225:224
07/11/10 11:27:22
>クラスのメンバ変数は定義しない限り実体がなくて、

というのは、もちろん非staticなメンバーについては正しい。
上で書いたのはstaticなメンバーについて。

226:デフォルトの名無しさん
07/11/10 11:34:49
>>210>>214>>223

BCCで>>208で引っかかって調べたときに
>>208は新しい規格で>>213は古い規格」
みたいな記述を見たんだが。

コレがホントなら、「賢い」とかあんまり関係ないんじゃね?

正確なところ知ってる人、フォローplz


227:デフォルトの名無しさん
07/11/10 11:50:28
>>226
ポインタや参照とかのアドレスを必要としない場合でも常にメモリ確保
を強制されるというのを新しい規格で認るのは信じがたいけど。

正確なところ知ってる人、フォローplz

228:デフォルトの名無しさん
07/11/10 12:43:08
>>224
さっきから実装依存だと言ってるのって、名前空間スコープに定義した const 変数の
話じゃないの?

クラスの static const なメンバ変数はクラス定義内では宣言しかされないので、
別途定義が必要。整数型に限って、宣言につけた初期値を持つ定数式として使える
という特別ルールがあるだけ。

C++ 2003 規格の 9.4.2 p2 より
> The declaration of a static data member in its class definition is not a definition and may be of an
> incomplete type other than cv-qualified void. The definition for a static data member shall appear in a
> namespace scope enclosing the member’s class definition.

同じく 9.4.2 p4
> If a static data member is of const integral or const enumeration type, its declaration in the class
> definition can specify a constant-initializer which shall be an integral constant expression (5.19). In that
> case, the member can appear in integral constant expressions. The member shall still be defined in a namespace
> scope if it is used in the program and the namespace scope definition shall not contain an initializer.


229:228
07/11/10 12:53:51
あ、整数型の static const メンバ変数については "if it is used" ってあるから、
定数式の一部として使うぶんには定義は必要無いね。参照やポインタを取られる
可能性があるなら関係ないけど。

>208 の例もあるし、ライブラリとして提供するような時には気をつけて定義しとかないと
まずいね。


230:デフォルトの名無しさん
07/11/10 14:09:21
>>228
thx

231:デフォルトの名無しさん
07/11/10 14:23:44
bind1stやbind2ndの戻り値は何でしょうか?
どういう性質のものなのか?あと型名とか。

232:デフォルトの名無しさん
07/11/10 15:20:54
binder1stやbinder2nd

233:デフォルトの名無しさん
07/11/10 17:13:27
>>232
それは引数を一つとるoperator( )が定義されている関数オブジェクトの
クラス型ということですよね?

234:デフォルトの名無しさん
07/11/10 17:36:10
そう。
直接binder1stやbinder2ndを使っても問題は無いんだけど、
その場合はbinder1st<ここを書かなきゃいけないのがめんどいよね>。

235:デフォルトの名無しさん
07/11/10 17:42:20
>>234
どうも。
ストラップ本で理解できました。

236:デフォルトの名無しさん
07/11/10 18:11:21
紐本?

237:デフォルトの名無しさん
07/11/10 18:14:49
禿本

238:デフォルトの名無しさん
07/11/11 15:11:11
VC6.0でかかれたプログラムをVisualStudio2005に移植しようとしてます。

あるプロセスでstrtok()で、トークン分解中に静的リンクしたDLLの関数を呼んでいます。
その関数内でもstrtok()してるらしく、関数終えて呼び出し元で続きのstrtok()をしようとすると、意図しない値(具体的にはNULL)が入ってしまいます。

MSDNにはCランタイムライブラリの頁に静的リンクなら問題ないようなことを書いてますが、
なぜstrtok()が静的リンクした関数にひきづられるのでしょうか。
あとVC6.0の頃は引きずられなかったのでしょうか。

環境:XP MFC


239:デフォルトの名無しさん
07/11/11 15:26:26
>>238
strtok() はヌルを渡されたときのために前回の分割位置を静的な変数に覚えている
ことがある。だから、基本的にそういう使い方はできない。

URLリンク(msdn2.microsoft.com)(VS.80).aspx
静的リンクで DLL との競合が起こらない理由もちゃんと書いてある。
VC8(VS2005) でも静的リンクは使えるから、明示的に指定すれば同じ動作に
なるんじゃないの?

240:238
07/11/11 17:30:02
>>239
ありがとう。
自分もその頁見てたけど、静的リンクするのはCRTであって、
こちらが作ったDLLじゃないわけですね。
そこを勘違いしてました。

結局どのコンパイラオプションを選べばいいか調べきれなかったので
VC6.0の時は適切なコンパイラオプションだったんだろうけど、今回はstrtok_s()使うことにしました。

241:デフォルトの名無しさん
07/11/11 17:38:52
符号なし整数だとオーバフローが起きない
というような話をときどき伺うのですが、
どういうことなのか理解できません……
教えて頂けませんか?

242:デフォルトの名無しさん
07/11/11 17:56:28
オーバフローが起きないなんてことはないので忘れてください

243:デフォルトの名無しさん
07/11/11 18:00:02
>>241
符号なし整数の計算では、最大値の次が 0 で 0 の前が最大値というふうにラップしている
ものとして結果が必ずその型の範囲内に収まる、と規格で定められている。

ラップする場合を指してオーバーフローと言うかどうかは微妙なところ。

244:デフォルトの名無しさん
07/11/11 18:28:41
>>243
なるほど、納得できました
ありがとうございます

245:デフォルトの名無しさん
07/11/11 18:50:42
はじめまして。
初心者です。
C++について質問があります。
ArrayとVecotorの全ての値をファンクションに渡して、Arrayの全ての値をReturnしたいのですが、
うまくいきません。
コールの仕方と、プロトタイプの書き方、それからReturnの書き方を教えてください。

もしくは、何か別の方法をしないといけないのでしょうか…?

よろしくお願いします。

246:デフォルトの名無しさん
07/11/11 18:58:21
>>245

Array とか Vecotor とか聞いたことないけど
int なり何なりと変わらんと思うよ

Array func(Array a)
{
 /* a についていろいろ処理 */
 return a;
}

void func(Array *a)
{
 /* a についていろいろ処理 */
}

247:245
07/11/11 19:14:29
>246

IntやDouble、Char等のScalar変数(ひとつの値しか含まない変数)なら
うまくいくのですが、ArrayやVectorのようなCollection変数(二つ以上の値を含む変数)は
なぜかうまくいかないのです。

Int型Arrayについて、
Int myFunction(myArray[])

Arrayについて処理

return myArray[];

や、
String型Vectorについて

String myFunction(myVector[])

myVector処理
 
 return myVector[];


のようにやろうとしているのですが、間違えているのでしょうか…?

248:デフォルトの名無しさん
07/11/11 19:36:53
>>247
コンパイルもできないコードを貼って「間違えているのでしょうか…?」って、何考えてんだ?
エスパーでも募集してんのか?

とりあえず C/C++ では大文字小文字が区別されるから、区別しろ。いまのままじゃ
めちゃくちゃすぎる。

実際にコードを書いてコンパイルしろ。そしたらエラーメッセージが出るから、それを嫁。

249:デフォルトの名無しさん
07/11/11 19:36:59
何がやりたいのか、まだよくわからないなぁ。

250:デフォルトの名無しさん
07/11/11 19:38:02
これはC/C++なの?
myArray/myVectorがテンプレートなのかも怪しいけど
STL前提ならこう書くんじゃないか

// int型のベクタを定義
typedef std::vector<int> myIntArray;

myIntArray myIntFunction(myIntArray array)
{
  myArray::iterator i = array.begin();
  myArray::iterator e = array.end();
  while(i != e) {
    // arrayに対する処理(要素に1を足す)
    *i += 1;
    i++;
  }
  return array; // 処理結果を返す
}



251:デフォルトの名無しさん
07/11/11 19:42:54
わりぃ
  myIntArray::iterator i = array.begin();
  myIntArray::iterator e = array.end();
だわ

252:デフォルトの名無しさん
07/11/11 20:08:26
for_each使ったほうがよくね?

253:エスパー
07/11/11 20:12:05
>>247
そのArrayやVectorはコピーできない
だから関数にそのまま渡すことも返すこともできない

254:デフォルトの名無しさん
07/11/11 20:41:47
とりあえず何だ。
Int って何だ。Array って何だ。String って何だ。C/C++ にそんなものはない。

しかも、せっかく
>Array func(Array a)
ってアドバイスもらってるのに、
>Int myFunction(myArray[])
って思いっきり無視してるし。

255:デフォルトの名無しさん
07/11/11 21:58:30
すみませんスレチかも知れませんが質問です。

Windows VistaとVisual C++ 2005 ExpでOpenGLを使い簡単なゲームアプリを製作しました。
友人AのVista機ではなんら問題なく動作したのですが、友人BのXPでは動作しませんでした。
友人A、BともにOpenGLのDLLは入っています。

どなたか解決のヒントでもいいのでご存じであればよろしくおねがいします。

256:デフォルトの名無しさん
07/11/11 22:02:47
msvcr80.dllがなんたらっていうエラーメッセージだったら、
VC++ 2005のランタイムを入れろ。

257:デフォルトの名無しさん
07/11/11 22:02:51
Visual C++のランタイムは入ってるかね?

258:デフォルトの名無しさん
07/11/11 22:08:27
聞いてみたところ、ランタイムは入ってるとのことでした。エラーメッセージは
『このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。
アプリケーションを再度インストールすることにより問題が解決する場合があります。 』
らしいです。Vista環境では正常に動作するのですが……

259:デフォルトの名無しさん
07/11/11 22:22:56
じゃあ.NET Frameworkかな

260:デフォルトの名無しさん
07/11/11 22:45:16
これからVC++を学ぶ場合でもMFCは有効ですか?
それともMFCは今後使用されなくなっていくことが濃厚で
.NETとCLR?(この違いはわかりませんが)を勉強
したほうが良いでしょうか?

261:デフォルトの名無しさん
07/11/11 22:46:08
>>258
エラーメッセージでググったら、こんなの出てきたがどうよ?
URLリンク(rararahp.cool.ne.jp)

262:デフォルトの名無しさん
07/11/11 22:57:08
>>260
個人的な意見

.NETで良いと思う。
でもどっちみち、ちょっと突っ込んだことしようとすると
Win32APIをガシガシ叩くことになるんで、
まずはウィンドウに子ウィンドウ貼り付けて絵と文字を表示するぐらいは
Win32APIを触っとくのが良いと思う。
1週間も掛からんと思うし。

263:デフォルトの名無しさん
07/11/11 23:05:56
>>262
何か一冊.NETの本読んでみます。

ちなみにCLRは.NETとは関係無いものですか?
.NETはVBやVC#でも共通に使えるものでCLRはVC++
固有のものですか?

264:デフォルトの名無しさん
07/11/11 23:07:11
C++でのゲームの組み方について質問よいでしょうか

現在シューティングゲームを作ってるのですが、以下のようなタスクシステムで行なっています

class ITask
{
virtual void task()=0;
virtual void draw()=0;
};

class CEnemyZakoA : public ITask
class CEnemyZakoB : public ITask
class CEnemyFactory : public ITask
class CBg : public ITask
class CItem : public ITask

こんな感じで、全てのオブジェクトはITaskを継承し、一つのITaskリストに登録しています。
そこで疑問なのですが、Task同士が連携するにはどうすればよいでしょうか?

例えば「CBgの持つ『どのくらいスクロールしたか』の情報によって、CEnemyFactoryは生み出すZakoの種類を変える」
といった場合です。
一応素人考えながらこういう手を考えましたが、一般的にはどうするべきなのでしょうか?

1・FacotryのようなほかのTaskの情報に依存するものは、リストに登録せず特別扱いする(CEnemyFactryとして保持しておく)べき
2・他のTaskに依存するTaskは、その生成時にそのTaskへのポインタをもらっておくべき
3・他のTaskに影響を与える情報をまとめた構造体を持ち、それへのポインタをtask()の引数で渡してあげるべき

1はいまいちだと思います。特別が増えるたびに管理が増えますし、何のためのITaskリストなのかわかりません
2はなかなかいい手ですが、CBgが削除された時などに困ります(share_ptrを使うべき?)
3は構造体に新しい情報が加わるたびに、全てのCXXX.cppが再コンパイルになるのが不満です


265:デフォルトの名無しさん
07/11/11 23:15:15
>>264
こちらへ↓どうぞ。

タスクシステム総合スレ
スレリンク(gamedev板)

266:263
07/11/11 23:17:22
解決しました。
入門書にも書いてありました。

267:デフォルトの名無しさん
07/11/11 23:42:05
>>261
ありがとうございます!上手く行きました!
他にも助言頂いた方々本当にありがとうございました。

268:デフォルトの名無しさん
07/11/12 15:09:38
すまそ。JavaやPHPやVBやってたんだけど、C++やることになりました。

MFCだかCLIだか知らんけど、それを上なぞりするだけの言語仕様がつかめる
C++の本ないですか?一から細かいことまで調べる必要ないので。

C++も一応はわかっています。MFCとかCLIがソース見て理解できる程度の
上辺の知識を理解できるまでの文法力がつく本ってないですか?細かい言語使用は
適宜分厚い本でしらべるので。。よろしくお願いします。

269:デフォルトの名無しさん
07/11/12 16:15:11
サイズ不明のファイルの内容を全部読み込む際に
動的なメモリの割当をしたいとき、どのようにしますか?

i=0;
while(fgets(...) != NULL ){
++i;
}

とやってからnewとかmallocとかで配列を確保するのかなあ
とか考えましたけど、どう考えても余計な事をしているようで…

270:デフォルトの名無しさん
07/11/12 16:29:18
>>269
つ[std::vector]
つ[realloc()]

271:デフォルトの名無しさん
07/11/12 17:00:39
>>269
filelengthとか何らかの手段を使って、ファイルサイズを先に調べて、一気に割り当てる。

標準入力やパイプのようにサイズがわからない場合は、ある程度の大きさのブロックごとに
読み込み、ブロックのlinked listを作成する。大きさがあまり大きくないことがわかっているなら
reallocもあり。

272:デフォルトの名無しさん
07/11/12 17:21:57
>>269
バイナリモードでファイルオープンしてシーク操作でファイルサイズ取得
ifstream
seekg
tellg

273:デフォルトの名無しさん
07/11/12 18:49:16
C++ に thisってないの?
class sample {
int power;
public setPower(int power) {
this.power=power;
}
};
ってしたいんだけど、文法的に間違いだよね?

274:デフォルトの名無しさん
07/11/12 18:52:55
>>273
Javaとは違って、
this->power


275:デフォルトの名無しさん
07/11/12 21:17:31
>>273
C++のthisはポインタ

276:デフォルトの名無しさん
07/11/13 11:42:55
VC++2005(Express) で以下の可変長自動配列を使うコードが通ってくれません(g++では大丈夫でした)
可変長自動配列はC99からサポートされたらしいですがVC++ 2005は未対応?
固定長/ヒープにすればそれで終わりなのですけど、折角の便利仕様なので使いたい・・・

static cosnt int ARRAY_MAX 256

bool variable_array_test(int variable_len)
{
if (variable_len <= 0 || variable_len > ARRAY_MAX)
return false; // bad length

 char temporary[variable_len]; // << C2054 でエラー

 return true; // ok
}

c:\ cl
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86

CXXFLAGS = -nologo -Zm200 -GS -Od -Zi -Gm -MDd -GR -EHsc -W


277:273
07/11/13 11:52:33
>>274-275 ありがとう!どうせ、こんなとぼけた質問には返事がきてないだろう
とおもったら、来てた。おかげでよくわかりました。使い方と理屈が。
PHPのも参照だから矢印記号なんだ。なるほど、なるほど。お礼が遅くなり申し訳ないです。

278:デフォルトの名無しさん
07/11/13 11:53:21
VCはC99対応していない。
以上

279:デフォルトの名無しさん
07/11/13 12:05:27
>>278
('д`;)・・・把握,mingw入れて吊ってきます

280:デフォルトの名無しさん
07/11/13 12:06:32
C++のコンパイラとして見ればVC8は結構優秀なんだがねぇ…

281:デフォルトの名無しさん
07/11/13 16:06:15
そもそもC99とC++98って一緒に使えるの?

282:デフォルトの名無しさん
07/11/13 23:14:06
C++ の std::vector 使えばいいじゃんって事なんだろう。

283:デフォルトの名無しさん
07/11/13 23:57:52
C99はいらない子

284:デフォルトの名無しさん
07/11/14 01:48:09
可変長引数マクロだけはヨコセ

285:デフォルトの名無しさん
07/11/14 01:50:52
どうせなら__FUNC__もあるとうれしい。

286:デフォルトの名無しさん
07/11/14 02:44:38
>>284-285
両方 C++0x に入るみたい。ただし __FUNC__ じゃなくて __func__ ね。

287:デフォルトの名無しさん
07/11/14 07:41:10
で、C++0xまだー?

288:デフォルトの名無しさん
07/11/14 10:34:46
Cにclassが追加されるのも時間の問題だな

289:デフォルトの名無しさん
07/11/14 11:41:06
てかCいらねー

290:デフォルトの名無しさん
07/11/14 12:53:51
デバッグログ出力関係で可変引数マクロ使ってるんだが、
これも止めた方がいい?

291:デフォルトの名無しさん
07/11/14 12:54:47
あ、ヨセじゃなくてヨコセか

292:デフォルトの名無しさん
07/11/14 13:49:55
#include <string>
using namespace std;
class Palindrome{
private:
char *inputValue;
public:
Palindrome();
void setInputValue(char*);
bool isPalindrome();
~Palindrome();
};
Palindrome::Palindrome(){
this->inputValue = new char[100];
}
void Palindrome::setInputValue(char *str){
strcpy(this->inputValue,str);
}
Palindrome::~Palindrome(){
delete [] this->inputValue;
}

293:デフォルトの名無しさん
07/11/14 13:50:32
つづき
bool Palindrome::isPalindrome(){
char *aux = new char[100];
int k=0;
for(size_t i=0;i<strlen(this->inputValue);i++){
if((this->inputValue[i] >= 'A' && this->inputValue[i] <= 'Z') || (this->inputValue[i] >= 'a' && this->inputValue[i] <= 'z')){
aux[k] = tolower(this->inputValue[i]);
k++;
}}
aux[k] = '\0';
for(size_t i=0;i<strlen(aux)/2;i++){
if(aux[i] != aux[strlen(aux) - 1 - i]){
delete [] aux;
return false;
}}
delete [] aux;
return true;
}

294:デフォルトの名無しさん
07/11/14 13:52:03
つづき
#include "Palindrome.cpp"
#include <iostream>
using namespace std;
int main(){
Palindrome p;
char string[100];
while(true){
cout<<"文字を入力してください: ";
cin.getline(string,100);
if(strcmp(string,"") == 0){
break;
}
p.setInputValue(string);
cout<<"その文字は "<<(p.isPalindrome() == true ? "はパリンドロームです " : "違います ")<<endl;
}
return 0;
}

295:デフォルトの名無しさん
07/11/14 13:54:09
windoes上でこのふたつのプログラムは動くんですが、ubuntu上では
コンパイルできません。

だれか、直してもらえますか?

296:デフォルトの名無しさん
07/11/14 13:57:24
エラーメッセージくらい載せろ

297:デフォルトの名無しさん
07/11/14 14:09:02
コンパイルできたし、実行もできてるようだが…
(Ubuntu 7.10 / g++ 4.1)

まさかgccでコンパイルしようとはしてないだろうな

298:デフォルトの名無しさん
07/11/14 14:16:52
すみませんgccでコンパイルしました。
どうやってこんぱいるするんですか?
教えてください。

299:デフォルトの名無しさん
07/11/14 15:07:13
上に書いてあるように g++ でもダメなの?

300:デフォルトの名無しさん
07/11/14 15:07:54
>>298 そんなことより、さっさとエラーメッセージ貼れよ。

301:デフォルトの名無しさん
07/11/14 15:18:14
>>299
g++ でコンパイルできました。
どうもすみませんでした。
g++というのを知りませんでした。

302:デフォルトの名無しさん
07/11/14 16:12:07
>>297
質問です。
コンパイルは出来たんですが、実行が出来ません。
g++ aMain.cpp -o aMain
では何も起こらないんですがどうやって実行したんですか?

303:デフォルトの名無しさん
07/11/14 16:14:59
gccはコンパイラコレクションだからC++特化のライブラリを探してくれない。
g++はC++コンパイラだからC++特化のライブラリも探してくれる。

304:デフォルトの名無しさん
07/11/14 16:16:51
明示しなかった場合、実行モジュールはカレントディレクトリにa.outという名でできる。
実行するには、./a.outでいい。

つーか、その程度の基礎知識もなしにコンパイルなんてするなよw

305:デフォルトの名無しさん
07/11/14 16:18:11
>>302
何したいの?それで aMain というファイルができてるの?
できていえれば、 ./aMain とすれば走るはずだけど。

306:デフォルトの名無しさん
07/11/14 16:26:34
これはスルーしたほうがいいな

307:デフォルトの名無しさん
07/11/14 16:40:07
a.outができません。aMain.oだけできます。
./aMainだとpermission denied となってしまいます。

308:デフォルトの名無しさん
07/11/14 16:45:08
問題解決しました。./aMainでは実行できなくても
g++ aMain.cpp -o aMain && ./aMain
で実行できました。
お騒がせしてすみませんでした。

309:デフォルトの名無しさん
07/11/14 17:40:55
なんじゃそりゃ。
ただのタイプミスな気がする

310:デフォルトの名無しさん
07/11/14 18:06:04
>>308
そんなにあせらずに、Unix 系の CUI 使いかたの本薄いので
良いから一冊読むと大分時間の節約になると思うよぉ。

311:デフォルトの名無しさん
07/11/14 20:33:43
基本的なポインタの質問で申し訳ないんですが。
mallocなどで確保されてない領域を知る方法はありませんか?

char *str;
str=(char *)malloc(sizeof(char)*2);

for(int i=0; i<5; i++){
if( (str+i) == NULL)
//未確保
}
みたいな形でわかればいいんですが、必ずしもNULLが入ってるとは限らないので…。

よろしくお願いします。

312:デフォルトの名無しさん
07/11/14 20:40:37
確保したサイズを覚えておく。

313:311
07/11/14 20:41:58
>>312
なるほど・・・。
やっぱり、そういう方法しかないんですか・・・
せめてtry catchがあれば、強引に出来そうなんですけどね。

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


314:デフォルトの名無しさん
07/11/14 20:46:31
ていうかそのソース突っ込みどころ満載だから勉強頑張ろうな。

315:デフォルトの名無しさん
07/11/14 20:47:44
自分が確保したメモリのアドレスとサイズを持つ構造体でも定義すれば?

316:311
07/11/14 21:14:02
>>314
具体的にどのあたりでしょうか?
よろしくお願いします。

>>315
なるほど。
その方法も検討してみます。

317:デフォルトの名無しさん
07/11/14 21:18:32
DLLで確保されたメモリはそのDLLで解放しないといけないと聞きました。

そこでお聞きしたいのですが、例えば以下のような場合
 ・アプリケーションAがDLL_BとDLL_Cを参照
 ・DLL_B自身もDLL_Cを参照
DLL_BがDLL_Cで確保したメモリを
アプリケーションAからリンクされたDLL_Cで解放するのは大丈夫なのでしょうか?
よろしくお願いします。

318:デフォルトの名無しさん
07/11/14 21:33:27
>>317
OKだけど、LocalAllocにすればそんなこと気にしなくてもいいんじゃね?

319:デフォルトの名無しさん
07/11/14 21:42:20
いや、Win32ならLocal系よりHeap系だろ

320:デフォルトの名無しさん
07/11/14 21:55:12
>>316
>if ( ( str + i ) == NULL )
この行で、iに2以上の値が入った時点でアウト。
確保されていない領域を参照することになる。
NULLとの比較も無意味。
初期化されていない領域はゴミが入っているのでNULLかどうかなんてわからない。



321:デフォルトの名無しさん
07/11/14 22:06:29
そもそも参照できてない、それ。

322:デフォルトの名無しさん
07/11/14 22:07:09
>>318
LocalAlloc, HeapAlloc, GlobalAlloc
って名前が違うだけでは無いんですね。
知りませんでした。

>>319
Heap系はよけいなオブジェクトが必要になるのであまり使いたくないです・・・
そこが肝という気もしますが

323:デフォルトの名無しさん
07/11/14 22:09:06
>>320
それが出来ないから質問きたんだろ
出来るなら、既に解決してるじゃんw

そもそも
>この行で、iに2以上の値が入った時点でアウト。
これを判定したいって言う質問なのに、そのレスはナンセンス過ぎる

324:デフォルトの名無しさん
07/11/14 23:06:43
>>320
>この行で、iに2以上の値が入った時点でアウト。
単なるポインタに数字を足した値を見ただけで何でアウトなんだ?
*つけて参照してるならともかく・・・


325:デフォルトの名無しさん
07/11/14 23:14:37
>>322
ヒープハンドルは常にGetProcessHeap()で得たものを使うことにすれば、
Local/Globalと比べ、新たな面倒さが生まれることはないと思うぞ。

326:デフォルトの名無しさん
07/11/14 23:39:43
そもそもLocalとGlobalってかなり前にMSが使うのやめてっていってなかった?

327:デフォルトの名無しさん
07/11/15 01:27:02
もうCoTaskMemAllocでいいよ

328:デフォルトの名無しさん
07/11/15 01:59:11
>>324
配列要素数を超えたところを指すようにポインタに足し算すると未定義動作になる。

C99 6.5.6 p8 より( C++ では 5.7 p5 に同じ文面がある)
> If both the pointer operand and the result point to elements of the same array object, or one past the last element
> of the array object, the evaluation shall not produce an overflow; otherwise, the behavior is undefined.

この場合だと要素数 2 の char 配列とみなせるから、 2 までは大丈夫で 3 以上でアウトね。

329:デフォルトの名無しさん
07/11/15 02:05:54
ポインタは*つけて参照しなければ、単なる数字だよ。
しかも、ポインタ変数に代入したわけでもなく、単に+3をやってifで比較しただけでしょ?

その文面は
*(str+i)のように参照した場合や、str+=iのように加算を行った場合であって
str+iでは、何の意味もないかと。

試してみれば分かると思うけど
char *str;

if( (str+5000)!=NULL)
ってやろうと
if( (str+50000000)!=NULL)
ってやろうと、エラーは出るはず無いよ。

330:デフォルトの名無しさん
07/11/15 02:23:13
>>329
> *(str+i)のように参照した場合や、str+=iのように加算を行った場合であって

そんなことどこにも書いてない。 p + n という式自体について述べた部分だよ。
* で参照したり = で代入したりする前の話。

331:デフォルトの名無しさん
07/11/15 02:43:49
なんで「一つ後ろ」みたいな表現するんだろう
一瞬、「じゃあふたつ後ろならいいのかよ」とか思ってしまったよ

332:デフォルトの名無しさん
07/11/15 10:42:18
>>330
仕様の読み方わかってないだろ。
プログラムの勉強からはじめたほうがいいね。

333:デフォルトの名無しさん
07/11/15 10:57:22
>>332
どこをどう読んだら >329 みたいな解釈になるのか教えてください。

334:デフォルトの名無しさん
07/11/15 11:24:57
>>328

加減演算子

ポインタオペランド及びその結果の両方が同じ配列オブジェクトの要素、又は
配列オブジェクトの最後の要素を一つ越えたところを指している場合、演算に
よって、オーバーフローを生じてはならない。それ以外の場合、動作は未定義
とする。

あくまで未定義といっているのだから、規格上は何でもあり得る、つまり
実装依存ということになるね。>>329の言っている、エラーが出ない
とか参照しなければ単なる数字になるということは、多くの実装がそう
なっているだけであって、str+5000の加算演算で仮にクラッシュする実装が
あっても、それは規格には従っていることになる。結局、この場合、
動作は未定義だから実装まかせ。

なので、厳密には>>328の意見が正しいと思われる。

335:デフォルトの名無しさん
07/11/15 13:04:40
実際、タイトなメモリ空間モデルを持っている実装では、割と容易に起こり得る。
例えばint array[2]に対してarrayが0xfff0にアサインされているかもしれない。
ポインタもintも16bitなら、array + 4が0になってしまい、NULLと区別できなくなってしまう。
# 流石に即クラッシュはしないだろうけどね。

336:デフォルトの名無しさん
07/11/15 14:02:36
境界の問題はポインタ特有の話じゃありませんね

337:デフォルトの名無しさん
07/11/15 17:44:01
それがどうかしましたか?

338:デフォルトの名無しさん
07/11/15 17:57:27
つまり見当違い

339:デフォルトの名無しさん
07/11/15 18:16:43
どこが?
そもそも誰か、境界の話なんてしているんですか?

340:デフォルトの名無しさん
07/11/15 18:31:33
>>336が場違いな件について

341:wolf ◆8VH3XAqjlU
07/11/15 22:09:24
>>311
*** For your reference ***

Windows. _heapwalk (CRT)
URLリンク(msdn2.microsoft.com)(VS.80).aspx

Linux 2.4x
src\drivers\char\drm\sis_ds.c "void mmDumpMemInfo( memHeap_t *mmInit )"


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch