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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.43【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1190860744/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
2デフォルトの名無しさん:2007/11/03(土) 00:27:39
                           / )     :::::::::::::::::::::::::::::::::::::::::::
          ::::::::::::::::::::::::::::::::::::::::::::::::   / /
           ::∩:::::::::::::::::::::::::::     / /
      ∧_∧ ...| |            ( (    /⌒ヽ
     < `Д´>//      ∧_∧   ヽ ヽ⊂ ̄ ̄ ̄⊃   ヨッシャ行くぞ、ゴルァ!!
     / ソウル..    ∧_∧ ´ー`)    \\(´∀` )     n  .∩
       ∧_∧   ( ´A `)浪人i      ハ      \    ( E)||   ∧_∧   ∧_∧    ∧_∧
       (丶`∀´)  /童貞 \ ノ       |  無職/ヽ ヽ_//  | .|  (丶`∀´)  (  ´∀`)  (  ^ω^)
 ( ヽ,  / 秋葉 ヽ、/ ,   // ヽ,       |     ノ  \__/   | .| /高卒  ヽ/ 中卒 ヽ、/ニート ヽ、
3デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/03(土) 00:43:20
1文字4バイトの文字だったら、アドレスが2つ進んでしまい失敗でないですか?
5デフォルトの名無しさん:2007/11/03(土) 00:47:43
wbuf[n]をゼロクリアしておき、読み込んだであろう最大の番号から逆に進めて0に無くなるところにもどせば安全かなあ
6デフォルトの名無しさん:2007/11/03(土) 01:23:28
おまえはいったい何をいっているんだ。

wbufの型がUTF-16なら、1文字4バイトでアドレスが2つ進むのは問題無いんでねーの。
7デフォルトの名無しさん:2007/11/03(土) 01:40:14
wstringは、2バイトでも4バイトでも1文字だぞ
8デフォルトの名無しさん:2007/11/03(土) 04:12:41
string の+=は鈍いらしいけど、strcatや自前関数と比べてみるよ
9デフォルトの名無しさん:2007/11/03(土) 04:45:39
必要なサイズをreserveで決めておけばstringはstrcatより断然速い
ひとつひとつコピーするのは面倒なのでパス stringは確保した時点ではメモリは0しか確保してない
0のままでほなんども足すとかなり鈍い
10デフォルトの名無しさん:2007/11/03(土) 05:13:48
str.reserve(100*1000*1000);はうごくのですが
str.reserve(1000*1000*1000);はエラーになります
プログラムでエラーを察知できますか?
11デフォルトの名無しさん:2007/11/03(土) 05:30:23
例外。ていうか(wchar_tが2バイトの処理系だとして)2GBも確保すんの?
12デフォルトの名無しさん:2007/11/03(土) 05:42:16
テキストファイルはせいぜい300Mくらいだろうから、最初にメモリを確保してしまおうとおもうけど
万が一数ギガのファイルを渡されたら処理しきれなくなるからエラーを返さないとと思った
13デフォルトの名無しさん:2007/11/03(土) 05:46:37
あと、どうやらメモリ領域を拡大する命令ってcにもc++無いようだね
新規に確保してコピーするみたいだね realloc()は内部でそのようなことをやっているらしい
となるとvectorでもstringでも初めに必要な領域をうまく設定することが速度にかなり影響するだろう
14デフォルトの名無しさん:2007/11/03(土) 06:04:46
vectorとstringが自動で確保する領域を調べたけど
stringは最低限の確保しかしないけどvectorは一気に倍に増やすね
だからvectorはそれほど慎重に領域設定しなくていいとはおもうけど
それでも例えば500M 使うとすると途中で合計500M前後領域を作成してコピーすることになるから
確保しておけば速くなるね
15デフォルトの名無しさん :2007/11/03(土) 06:41:41
久々にVisual Studio 2005 でC++プログラム作成しようとしたのですが
ビルドを実行したら、出力タブに途中結果、エラーメッセージが一切
表示されず最終結果しか表示されません。

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

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

ビルドの途中結果とエラーメッセージを表示する方法を教えて欲しいです。
16デフォルトの名無しさん:2007/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みたんですが、内容がフフフフの連続のようになってしまいました。
正しくはどうやって書いたらいいですか?
17nkkn5:2007/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デフォルトの名無しさん:2007/11/03(土) 14:02:49
isprint には unsigned char で表現可能な値または EOF しか指定できない。
それ以外の値を指定したときの動作は未定義。
19nkkn5:2007/11/03(土) 14:24:52
>>18
ありがとうございます。
やはりそうなんですか。
そうしますと、私が見た本のように
charの定義域全体をisprintを使いながら
(表示できないものは表示しないようにしながら)
表示していくということはできないということですね。

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

HELP見たのですが、まだ理解できない
私のC++にの対しての理解状態ですので、
わかりやすいものがあればと思ったのですが。
20デフォルトの名無しさん:2007/11/03(土) 14:43:03
Media Playerみたいにウインドウの概観を変えるプログラムって、どういう教科書を読めば良いでしょうか?
開発環境はVisualC++ 2005を想定しています。どなたか、よい教科書をご存知の方がいらっしゃいましたら、教えてください。
21デフォルトの名無しさん:2007/11/03(土) 14:44:01
Owner Draw
22デフォルトの名無しさん:2007/11/03(土) 14:49:47
>>20
SetWindowRgnでぐぐるといいかも
23デフォルトの名無しさん:2007/11/03(土) 15:13:04
>>19
できる
char に対する CHAR_MAX のように、unsigned char に対しては UCHAR_MAX があるので、 0 〜 UCHAR_MAX まで回せばいい

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

http://msdn2.microsoft.com/ja-jp/library/4yc6feha(VS.80).aspx
>is 系ルーチンは、-1 (EOF) 〜 UCHAR_MAX (0xFF) の整数の引数に対して、意味のある結果を生成します。

http://msdn2.microsoft.com/ja-jp/library/ewx8s4kw(VS.80).aspx
>isprint は EOF でないパラメータまたは 0 〜 0xFF の範囲にないパラメータを渡された場合に CRT アサートを表示します

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

universalchardet っていう Mozilla 由来のライブラリがある。
ライセンスは、「MPL1.1/GPL2.0/LGPL2.1 のいずれかを選択」らしい。微妙だな。
2516:2007/11/03(土) 17:48:57
どうもどなたもご存じないようなので別スレ行って来ます。
26デフォルトの名無しさん:2007/11/03(土) 18:07:25
低脳マルチ死ね
27デフォルトの名無しさん:2007/11/03(土) 18:13:01
>>16
聞き方が悪いんだよ。ソースを切り貼りせずに、せめて関数ひとつくらいをそのまま貼ってくれ。
buffer がどこで確保されてどこで解放されてるのか、それに対してコピーをどこでやってるのかが
さっぱりわからん。
2816:2007/11/03(土) 18:17:18
>>27
わからない人の言い訳など聞く耳持ちません。
2916:2007/11/03(土) 18:18:56
ほえほえ
30デフォルトの名無しさん:2007/11/03(土) 18:21:39
>>28
俺もわからん
情報が不足しすぎてる
コンパイルして実行できる(そのフフフという現象を確認できる)完全なプログラムを見せれと言いたい
31デフォルトの名無しさん:2007/11/03(土) 18:22:34
アホすぎて教えるのに骨が折れる
3216:2007/11/03(土) 18:31:57
>>31
教える資質が無い人というのもいますから、無理はしなくていいですよ。
3361:2007/11/03(土) 18:36:00
>>32
覚える資質が無い人というのもいますから、無理はしなくていいですよ。
34デフォルトの名無しさん:2007/11/03(土) 18:43:26
そうだぞみんな。無理はせず、スルーしようぜ。
3516:2007/11/03(土) 19:00:41
>>27
http://pc11.2ch.net/test/read.cgi/tech/1190745673/l50
のスレ>>747に書きましたのでよければ見てください。お願いします。
36nkkn5:2007/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;
}

つづく
37nkkn5:2007/11/03(土) 19:24:44
つづき

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

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

MSDNの件、ありがとうございました。
まだ自分のレベルからすると難しいですが。。。
結論を教えていただいた後なので該当箇所は
雰囲気としてはわかる、、、という感じです。
38デフォルトの名無しさん:2007/11/03(土) 19:28:13
>>37
coutでの出力される形式は、データの型によって決まるから、
文字として出力したければchar型の値を渡す必要があるよ。

cout << ' ' << (isprint(i) ? static_cast<char>(i) : ' ');
39デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/03(土) 19:32:13
isprint は isascii が偽の場合には未定義ではありませんか?
41nkkn5:2007/11/03(土) 19:40:26
>>38
ありがとうございます!
結果自体は、うまくいきました。

すいません、新たな疑問です。
static_cast<char>で、
charの範囲外のははずの
unsigned charが128以上の場合でも
(私の環境での話です)
なぜうまく文字になるのでしょうか。
42デフォルトの名無しさん:2007/11/03(土) 19:40:31
標準の C に isascii なんてありませんから
43nkkn5:2007/11/03(土) 19:45:57
>>39
ありがとうございます。
こちらもできました。

ただ、すいません、41と同じ疑問があります。
そういうものなのでしょうか。
44デフォルトの名無しさん:2007/11/03(土) 19:58:40
isprint は、 c < 0 and c ≠ EOF なる char c に対して未定義ではありませんか。
45nkkn5:2007/11/03(土) 19:59:53
>>38、39

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

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

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

46デフォルトの名無しさん:2007/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, ""); を試してみそ。
ムダかもしれんが。
47nkkn5:2007/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;
}
----------------

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

つづく
48nkkn5:2007/11/03(土) 21:50:54
つづき

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

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

また、上記のコードを、
setlocale(LC_ALL, "");
後に実行すると、
ループ自体が128で止まってしまいます。
UCHAR_MAX自体は(表示させてみたところ)
255のまま変わっていないのですがね、、、
(こちらも?ですが、setlocaleは
私にはレベル的に早いかなーという気がします。
私の見ている本には載ってませんし。)
49nkkn5:2007/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デフォルトの名無しさん:2007/11/03(土) 22:37:36
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 132
http://pc11.2ch.net/test/read.cgi/tech/1190261457/

こっちのスレで訊いた方が良いかもしれない。
51デフォルトの名無しさん:2007/11/03(土) 22:48:17
昨日、ドトネトのbitmapで質問にきた者です。

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

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

これは、ウィンドウズプラットフォームSDKのインストール後の設定になんか不備があるのでしょうか?
それとも、ウィンドウズプラットフォームSDKのDLLを手動でリンカに設定するもんなのでしょうか?
52203:2007/11/03(土) 22:50:06
>>22
なるほど、これでよさげな感じですね。
どうもでした。
53デフォルトの名無しさん:2007/11/03(土) 22:59:14
C++でLinuxのTCP/IPネットワークプログラミングをする場合
自分でソケット関連のシステムコールをクラス化して
作るものですか?それとも既存のライブラリがあって、それを
利用するのが今の定石でしょうか?
Cでソケットプログラミングはしてるのですが、C++で
同じことをする場合、自作のクラスの作り方の雛形
というか定石がわかりません。大体、形は決まってると
予想しているのですが。
54デフォルトの名無しさん:2007/11/03(土) 23:02:31
CでうごくならC++でうごく
55デフォルトの名無しさん:2007/11/03(土) 23:03:38
ソケット用のstreamを作っちゃってる猛者もいたなぁ
56デフォルトの名無しさん:2007/11/03(土) 23:05:51
>>54
それは現段階では誤解を招くぞ
57デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/03(土) 23:10:20
>>51
リンカ-入力-追加の依存ファイル にgdiplus.libを追加。
ソースに #pragma comment(lib, "gdiplus") って書いておく方が楽だけど。
59デフォルトの名無しさん:2007/11/03(土) 23:12:34
>>57
値が表示されないという事は、
そもそもprintfが機能していないという意味なのだが。
そういう話なのか?
60デフォルトの名無しさん:2007/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);
}
6157:2007/11/03(土) 23:15:34
>>59
おそらくprintfだけの話ではなく、それ以前のソースが間違っているのだと思います。
その間違えを指摘してもらいたいです。
62デフォルトの名無しさん:2007/11/03(土) 23:17:21
decなのに値が増えてないか?
無限ループじゃないの?
63デフォルトの名無しさん:2007/11/03(土) 23:18:35
 int dec(int y){
×int z; z=y+1;
○int z; z=y-1;
 return(z);
 }
64デフォルトの名無しさん:2007/11/03(土) 23:30:54
さらに、
60のように
while(i>0){
と >=ではなく、>
65デフォルトの名無しさん:2007/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>が必要。
66nkkn:2007/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以降は、(その出力行自体)なにも
出力されなくなる。
この部分をコメントアウトすれば、
途中で止まらず、カタカナも出力される。
これで合っていますでしょうか。

当初の質問の目的が達成されました!
ありがとうございました。
67nkfを使って日本語ファイルをwstringへ読み込む関数出来たよ:2007/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デフォルトの名無しさん:2007/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;
}
6957:2007/11/04(日) 01:24:03
>>60
>>62-64
出来ました!ありがとうございました!
70デフォルトの名無しさん:2007/11/04(日) 04:16:17
すみません
wcoutって危険( 認識できない文字があると落ちる )と思うので、wcoutを自作したいのですが
自作関数に置き換えられますか?
71デフォルトの名無しさん:2007/11/04(日) 04:20:46
void hyoji (wstring str)とかのほうがいいですかね?
72デフォルトの名無しさん:2007/11/04(日) 10:27:49
basic_stringをカスタマイズすれば、できるんじゃね

名前空間に閉じ込めれば、wcoutって名前でそのまま使えるし
73デフォルトの名無しさん:2007/11/04(日) 10:33:21
>>70
んなもんは用途に寄るだろ。UTF-8で吐けるんなら問題ねえし、エンコーディングが
仮定できないコンソール出力で、情報を全く失いたくないんなら、出力を
フィルターすべきかもな。
boost::iostreamsなんかが使えると思うよ。
74デフォルトの名無しさん:2007/11/04(日) 14:24:32
CでIEの今現在開いているURLを得ることってできますか??
75デフォルトの名無しさん:2007/11/04(日) 16:37:47
>>74
ActiveXを使う要領でできるけど道のりは遠い。
76デフォルトの名無しさん:2007/11/04(日) 16:45:15
今更、参照回数計測クラスを自作するのは時間の無駄でしょうか?
やはりshared_ptrを使うのが当たり前ですかね?
77デフォルトの名無しさん:2007/11/04(日) 17:10:22
>>76
よく分かってるじゃない。
78デフォルトの名無しさん:2007/11/04(日) 17:28:45
>>76
「参照回数計測クラスを自作する」ことが目的じゃなければそうすべき。
79デフォルトの名無しさん:2007/11/04(日) 18:06:08
>>77
>>78
レスどうも。C++の勉強のために一度作って動かして、
あとはライブラリを使用します。
仕事でC++を使うときに皆さんどうしてるのかなと思いまして。
80デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/04(日) 20:05:55
bccでcをやっています。最近OpanGLを始めました
そうしたら影を付けるところで止まります。
コンパイルは出来るのに、実行すると止まります。
どうすればいいでしょうか。
82デフォルトの名無しさん:2007/11/04(日) 20:18:04
どういう方法で影を付けようとしてるのかわからんから、答えようがない
具体的にどの関数をどういうふうに使ったのか

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

「止まる」っていうのも、もう少し具体的に
アニメーションしてるのが止まるのか、キーやマウスの反応がなくなることなのか、エラーメッセージが出て強制終了くらうことなのか、OSごと落ちるのか
83デフォルトの名無しさん:2007/11/04(日) 20:20:27
つまりソースとエラーメッセージを出せ、と。
84デフォルトの名無しさん:2007/11/04(日) 20:21:26
デバッガ…は無理そうだから、printf(MessageBox)デバッグだな。
85分からないから寝る:2007/11/05(月) 00:44:19
ボーランドのturbo c++(forWin95)を見つけたので図書館からTURBO C++ジョイフルプログラミングという本を借りてきたのですが・・・
一番最初のたった5行の文がコンパイルするとエラーを吐きます

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

3.4行目共にCall to undefined function なんですがなにが悪いんでしょうか?
86デフォルトの名無しさん:2007/11/05(月) 01:12:11
C++ではプロトタイプ宣言のない関数は呼び出せない。
ちゃんと適切なヘッダをインクルードする必要がある。
87デフォルトの名無しさん:2007/11/05(月) 01:48:19
Visual C++ 2005 EE と GCC ではちょっと動作が違うみたいですが、
どちらを使って勉強をすればいいのでしょうか?
88デフォルトの名無しさん:2007/11/05(月) 02:13:05
さぁ?
89デフォルトの名無しさん:2007/11/05(月) 02:16:04
変数名の付け方で時々悩むのですが、
みなさん「ハンガリアン記法」ってのを使ってますか?
9080:2007/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デフォルトの名無しさん:2007/11/05(月) 02:30:19
>>87
GCCの方が文法に厳しいので勉強するならGCC
92デフォルトの名無しさん:2007/11/05(月) 02:35:18
こういう時に注意かな
for(int i=0;i<10;i++) cout << i << endl;
cout << i << endl;

で、いらないテクニックを覚える…と
#define for if(1)for
93デフォルトの名無しさん:2007/11/05(月) 07:59:41
>>89
タイプの方なら自然と使ってる。ってか便利。
システムの方は自然と使わなくなった。
94デフォルトの名無しさん:2007/11/05(月) 08:16:02
>>92
さすがに、それはVC++でもNET 2003あたりから
コンパイル通らないほうがデフォルトになった。

>>93
それをいうならアプリケーションハンガリアンではないのか?
95デフォルトの名無しさん:2007/11/05(月) 12:21:07
index が1000万あるとします 
indexごとにファイルを読みに行くとします
このとき、ファイルを一つにまとめるのと、一つ一つ分けるのと、いくつか束にするのではどれが速度速いですか?
ランダムに3個程度のindex値をアクセスすることにします
96デフォルトの名無しさん:2007/11/05(月) 12:29:25
一ファイル当たり10KB以下として、indexは10万とします
このときファイルサイズは最大1Gになります 
indexは、0から10万の数字で与えられるとします
indexごとにファイルの位置を記録しておくか、index名のファイルを10万用意するかですが
どっちが良いですか?
97デフォルトの名無しさん:2007/11/05(月) 13:00:49
あまり細かく分けると、クラスタサイズの制限から容量多く使ってしまいますね
10バイトしか記録しなくても512バイト程度使ってしまいますね
98デフォルトの名無しさん:2007/11/05(月) 14:31:55
Unicode, ShiftJIS, EUC
あたりを相互変換できる文字コードライブラリを探しています。
・言語はCオンリー
・ライセンスがBSD以下のゆるさ
・サイズはなるべく小さめ
・ポータブル
の条件に合うよさげなライブラリがあったら教えてください。
よろしくお願いします。
99デフォルトの名無しさん:2007/11/05(月) 15:53:16
スレ違いでね?
100デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/05(月) 17:45:46
>>100
マルチすんなカス
102デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/05(月) 19:26:35
他の言語のソースを移植すれば良くね?
サイズ小さいライセンスも気にしない
105デフォルトの名無しさん:2007/11/05(月) 19:48:49
-Lオプションで指定したディレクトリのうち
その中にある特定のディレクトリを参照させないようにするにはどうすればいいですか?

たとえば
-L/usr/local/lib と指定したもののうち /usr/local/lib/gcc-4.0.4 は参照しないようにする
とかいう感じです
106デフォルトの名無しさん:2007/11/05(月) 21:02:23
>>95-96
速度は実測が基本。
良い悪いの判断は本人にしかできない。
107デフォルトの名無しさん:2007/11/05(月) 21:07:59
巨大なファイルのシーク時間と、ファイルのオープンに要する時間は一般的にどっちがかかるんですか?
ファイルのオープンの方がコストは多そうですが
108デフォルトの名無しさん:2007/11/05(月) 21:09:47
>>107 聞く前に試せよサル
109デフォルトの名無しさん:2007/11/05(月) 21:20:47
>>107 聞く前に試せよサル
110デフォルトの名無しさん:2007/11/05(月) 21:44:45
>>107
使用するファイルシステムによっても違うしだろうし、ファイルシステム上の断片化などの状態にも依る。
キャッシュに乗ってるかも影響するはず。
試せ。
111デフォルトの名無しさん:2007/11/05(月) 22:21:46
C++でAPIを組んでいるのですが
ttp://www.katsakuri.sakura.ne.jp/src/up29024.txt.html
この項目を入れたら
0x00412984 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00090f44 を読み込み中にアクセス違反が発生しました。
とエラーが出るようになったのですが、どこがおかしいのでしょうか?
作っているプログラムの内容は、チェックボックスにチェックが入っているところにEDITボックスを表示する、と言う感じです。
選択した場所によってはうまく動作することもあります。
112デフォルトの名無しさん:2007/11/06(火) 00:37:59
ぶった切り失礼します

文字列をlongに変換するstrtol()という関数ですが
失敗時の返り値が0なのはいいのですが、文字列が"0"だったときの区別のつけ方は
変換不可能な文字列へのポインタの格納先を準備してあげるしかないのでしょうか?
113デフォルトの名無しさん :2007/11/06(火) 01:31:55
自作関数作れば?
long mystrtol(char *cary, char **ep)
{
if(!strcmp(cary,"0"))
return 0L;
return strtol(cary,ep,10);
}
こんなのとかさ
114デフォルトの名無しさん:2007/11/06(火) 01:58:10
>>113にツッコミたくてたまらない俺はまだまだ修行が足りないな。
115デフォルトの名無しさん :2007/11/06(火) 02:16:20
>>114
つっこんでやれよ、本人のためにもさ
116デフォルトの名無しさん:2007/11/06(火) 02:16:44
sscanfとか、StrToIntExとか
117デフォルトの名無しさん:2007/11/06(火) 02:24:27
893が75キロ VS 105キロの空手家 体重差 30キロの殴り合い映像
http://video.nifty.com/cs/catalog/video_metadata/catalog_071105039557_1.htm
店でNo4 ホスト VS 黒帯空手家 死闘の映像
http://video.nifty.com/cs/catalog/video_metadata/catalog_071104039294_1.htm
イケメン ホスト VS ブルースリー ボコボコに殴る映像
http://video.nifty.com/cs/catalog/video_metadata/catalog_071103039028_1.htm
893 VS ブルースリー 対決映像
http://video.nifty.com/cs/catalog/video_metadata/catalog_071102038922_1.htm
118デフォルトの名無しさん:2007/11/06(火) 05:27:21
算術命令圧縮って弱点あると思うんですが
例えば0 1の出現率が等しいとするとどのビット列も同じ確率になりますよね?
データの並び順を考えないと駄目ではないですか?
たとえば0000000000000000000000000000011111111111111111111111111111111などは
繰りかえし数を記録することでかなり圧縮できると思うのですが
119デフォルトの名無しさん:2007/11/06(火) 05:42:46
算術命令圧縮ではなくて算術圧縮だったよ 
あと、文書を圧縮するならば前の1、2バイトごとに確率分布表を作って圧縮するといいと思うけど
120デフォルトの名無しさん:2007/11/06(火) 06:39:22
算術の説明だと、1文字ずつの説明だけだけど、初めから5文字の分布を与えても出来るね
確率1%のものがあれば、2^(-7) = 0.0078125 だから小数点以下7桁程度を与えるのが良いと言うことになる
ハフマン圧縮の一般化といえるね
121デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/06(火) 13:53:35
>BaseClass *pointer = new SubClass[2]; 

配列へのポインタはキャストしてはいけない
123デフォルトの名無しさん:2007/11/06(火) 13:58:11
>>122
もし上みたいに子クラスのインスタンスの配列を親クラスのポインタに入れて使いたい場合どうしたらいいんですか?
124デフォルトの名無しさん:2007/11/06(火) 14:04:50
親クラスのポインタの配列を作れば良いじゃないか。
125デフォルトの名無しさん:2007/11/06(火) 14:17:58
申し訳ない…
具体的にはどんな書き方に…?
126125:2007/11/06(火) 14:22:08
自己解決しました
ありがとうございました
127デフォルトの名無しさん:2007/11/06(火) 17:52:46
そういうのも自己解決って言うのかw
128デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/06(火) 19:31:10
ループ中の計算をシフトとビット演算で置き換えると
乗除の演算なしで掛け算が出来るなぁ…、なんて。
130デフォルトの名無しさん:2007/11/06(火) 19:33:33
燦然と輝くvoid main(void)
131デフォルトの名無しさん:2007/11/06(火) 19:37:32
>>128
小学校で習った掛け算の筆算を二進数でやってるようなもんだ
132128:2007/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デフォルトの名無しさん:2007/11/06(火) 20:28:03
>>129
そこはコンパイラの最適化に期待ということでは?
もっとも、これくらいならC/C++でもシフト使えということは同意。
134デフォルトの名無しさん:2007/11/06(火) 22:35:19
というか、そこで*を使ってしまうと、
「じゃあ(a*b)でよくね」みたいな話になるから(w
135デフォルトの名無しさん:2007/11/07(水) 19:47:22
class hoge : public base
{
private:
base* m_base;
};

これって循環ですか?
136デフォルトの名無しさん:2007/11/07(水) 20:25:07
開発中によく見る記述ですが何か心配なことでも?
137デフォルトの名無しさん:2007/11/07(水) 20:58:33
循環なら避けたいんですが、
循環ですか?

hogeの定義にbaseが必要で
でもhogeはbaseを持ってるので
なんか循環っぽいなぁと。
138デフォルトの名無しさん:2007/11/07(水) 21:13:18
ならお前の避けたい循環の意味をちゃんと書けやタコが
139デフォルトの名無しさん:2007/11/07(水) 21:16:02
知ってる人に聞ければいいです。
そもそも知らない人は
自分が知らないのに人に教えられるわけがないでしょう。
140デフォルトの名無しさん:2007/11/07(水) 21:18:34
それじゃ、誰にも答えられないね。
141デフォルトの名無しさん:2007/11/07(水) 21:20:44
>>140
全知全能の神光臨。
142デフォルトの名無しさん:2007/11/07(水) 21:29:49
循環じゃないよ
143デフォルトの名無しさん:2007/11/07(水) 21:30:14
とりあえず循環参照が起こる可能性は充分すぎるほどに有るわな。
ただ場合によるので、具体的にやりたいことを示してくれないと問題点の指摘は出来ん。
144デフォルトの名無しさん:2007/11/07(水) 21:33:34
baseの定義にhogeを必要としてたら循環定義
145デフォルトの名無しさん:2007/11/07(水) 21:35:38
循環ってのは
class sage の宣言に class age を使ってて
class age の宣言に class sage を使ってる場合。

よって循環ではないべ?
146デフォルトの名無しさん:2007/11/07(水) 21:36:24
>>135
普通に連結リストかなんかでありそうな気がするが
147デフォルトの名無しさん:2007/11/07(水) 21:38:30
>>140の立場wwwwww
148デフォルトの名無しさん:2007/11/07(水) 21:43:03
で、結局どっちの意味で循環って言ってるのよ?>>135は。
149デフォルトの名無しさん:2007/11/07(水) 21:43:04
>>135
あほすぎ
150デフォルトの名無しさん:2007/11/07(水) 21:55:38
>>149 = 顔をつぶされた>>140
151デフォルトの名無しさん:2007/11/07(水) 22:08:21
>>150
はずれ
152デフォルトの名無しさん:2007/11/07(水) 22:19:11
>>135
エスパーがいない可能性を考えないのか?
153wolf ◆8VH3XAqjlU :2007/11/07(水) 23:08:13
>>135
base<---hogeで循環は存在しないけど
m_base = new する第3のクラスを含めた循環に注意です
154デフォルトの名無しさん:2007/11/08(木) 00:11:41
で、結局誰もまともに答えられないんですね。がっかりしました。
155デフォルトの名無しさん:2007/11/08(木) 00:51:46
156デフォルトの名無しさん:2007/11/08(木) 00:59:52
それはもう読みましたよ。
157デフォルトの名無しさん:2007/11/08(木) 10:37:40
>>156
お仕事頑張ってくださいね
158デフォルトの名無しさん:2007/11/08(木) 10:38:57
なるほど循環参照の事か
159デフォルトの名無しさん:2007/11/08(木) 11:07:44
>>154
聞いてる時点でお前はそれ以下じゃんw
160デフォルトの名無しさん:2007/11/08(木) 11:28:52
>>158

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

確かに理解度は俺のほうが下です。
でも、あなた方も俺と同じ、質問者レベルなんです。回答者気取りをされると邪魔なのです。
そういうことです。
162デフォルトの名無しさん:2007/11/08(木) 16:10:41
社会性の無いキチガイが紛れ込んでますね
163デフォルトの名無しさん:2007/11/08(木) 16:15:12
>>161
何を聞きたいのか分かりません

実体の循環参照ならコンパイルできないので安心して下さい
ポインタを使う限り循環参照になる可能性は常にあります
諦めて下さい
164デフォルトの名無しさん:2007/11/08(木) 16:28:37
プログラムの勉強に飽きたら2,3日何もしないとかいう人いる?
165デフォルトの名無しさん:2007/11/08(木) 16:31:58
>>161
がっかりするとは俺もお前にがっかりだ
166デフォルトの名無しさん:2007/11/08(木) 16:32:03
勉強つーか趣味のコーディングではよくある。一週間以上になることもしばしば。
167デフォルトの名無しさん:2007/11/08(木) 17:15:41
リアルで >>161 は空気読めない人って
周りから言われるんじゃね?

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

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

妥協できないなら、ネットで質問なんてするな。
第三者からみれば、あんたが荒らしだから。
168デフォルトの名無しさん:2007/11/08(木) 17:35:28
釣られすぎ。
169デフォルトの名無しさん:2007/11/08(木) 17:58:31
>>162
まったくです。困ったものですね。
人に何かを教える立場というのは、自己顕示欲の異常に強い人達にとっては
魅力的なものなのでしょうね。だからそのスキルも無いのに気取りたがるのでしょう。

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

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

質問してみた

バカにされた

マジ反論 ←いまここ

まともな回答もついてるんだからさ
それでいいじゃん?
これ以上何を望んでるの?
171167:2007/11/08(木) 18:16:16
釣りなら見事に釣られたわけだがな>俺
172デフォルトの名無しさん:2007/11/08(木) 18:37:21
釣りでしょ。少なくとも>154は漏れだし。
173デフォルトの名無しさん:2007/11/08(木) 19:19:35
>>170
ダメ回答者達が維持したがっているダメな空気は、読んだ上で否定しています。
そんな種類の空気に支配的になられては困るので。
174173:2007/11/08(木) 19:32:48
ごめん釣りでした。
175デフォルトの名無しさん:2007/11/08(木) 19:34:54
ダメ回答者をバッタバッタと取り締まってくれる
救世主が登場
176デフォルトの名無しさん:2007/11/08(木) 19:45:20
>>138 = >>140
がメンツをつぶされた挙句暴れている模様。
177140:2007/11/08(木) 20:33:36
ちゅがうよ
178デフォルトの名無しさん:2007/11/08(木) 23:26:50
スレッドで、void* で渡した引数をclassに変換したいのですがキャスト出来ないと言われます
2つ以上の引数をスレッドに渡すにはどうすればいいですか?
179デフォルトの名無しさん:2007/11/08(木) 23:44:35
classじゃなくて、classへのポインタにキャストしてみればどーか?

void func(void *arg)
{
((hogeclass *)arg)->func();
}
180デフォルトの名無しさん:2007/11/08(木) 23:49:05
サンクスやってみます
181デフォルトの名無しさん:2007/11/08(木) 23:50:40
って、まさか本当に
HogeClass hoge = (HogeClass) threadArg;
 なんて記述をしてるんじゃ…。
182デフォルトの名無しさん :2007/11/08(木) 23:59:34
キャストしたvoid型ポインタのarg引数のポインタの元の型
が適切な物なら良いけど、もしそうじゃないなら怖いな
183デフォルトの名無しさん:2007/11/09(金) 00:12:57
俺はその辺が気持ち悪くなってboost::threadに逃げた。
184デフォルトの名無しさん:2007/11/09(金) 04:19:15
空気読めて無い人って本当に空気読めてると思ってるんだ・・・
リアルでは出会えない珍獣を見た
185デフォルトの名無しさん:2007/11/09(金) 05:51:13
>>184
とっくにスレの流れ変わってるんだから、空気読めよ。
186デフォルトの名無しさん:2007/11/09(金) 06:34:46
違うんだ・・!>>184の空気を読めなくしたのは・・・本当は・・漏れなんだ・・・!
187デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/09(金) 10:27:39
su配列にマルチスレッドでアクセスしているところが駄目なんでしようか?
189デフォルトの名無しさん:2007/11/09(金) 10:39:10
>>187
・同一メモリに複数スレッドから同時にアクセスしているから
・serchpathなんてへんな変数名だから
・thread内でnewしているのに解放していないから
・高々Kバイトしか読み込まないのに100バイトも余計に確保しているから
・変数nを違う目的に使い回しているから
・コーディングスタイルが変態だから
・ハンドル変数にfpなんて名前を使っているから
・どっかWinAPIと思しき辺りの使い方が間違っているから
・毎回ディレクトリの状態が違うから
・毎回ファイルの内容が違うから
どれだろね。
190デフォルトの名無しさん:2007/11/09(金) 10:47:50
正解はなんなんですか?
191デフォルトの名無しさん:2007/11/09(金) 10:56:48
>>190
1つずつ問題がないかどうか確認するんだ
192デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/09(金) 11:01:05
>>192
馬鹿だから。
194デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/09(金) 11:09:00
書き手が駄目なんだろう。
196デフォルトの名無しさん:2007/11/09(金) 11:12:06
こうしんされた値が、別のスレッドで更新されてしまうからですかね?
メモリがFDくらい動作がのろいとするとsu[・]の値を呼び出して
1を足して書き戻すときに、同時に呼び出して計算していた値で置き換えられると言うことです
197189:2007/11/09(金) 11:16:26
ちゃんと最初に指摘しているのに……(TT
198デフォルトの名無しさん:2007/11/09(金) 11:18:14
カワイソス
199デフォルトの名無しさん:2007/11/09(金) 11:20:38
これと同じ事ですね 速くする為にスレッドにしたいのに排他制御入れたら鈍くなりますね

クリティカルセクション


ウェブページの来訪者数を表すカウンタのプログラムを例にとって説明する。カウンターのプログラムはおおまかに次の処理からなる。
ディスク等の記憶装置から現在のカウンタの値を読み出す
カウンタの値を1増やす
カウンタの値を記憶装置に書き戻す
ttp://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AB%E3%83%AB%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3
200デフォルトの名無しさん:2007/11/09(金) 11:24:24
配列の要素を LONG volatile にしてInterlockedIncrement。
201187:2007/11/09(金) 11:33:53
いいこと思いついた スレッド側でビット列の個数を数えて、その個数を配列で返してメイン側で足しあわせる
これなら時間のかかる部分はスレッドでやってあるから高速のはず
202デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/09(金) 12:40:31
非同期処理じゃなくて高速化が目的なのかヨ。

よく知らねぇんだが、デュアルコアとは言え
プロセスでもない単なるスレッドでOSがマルチな処理してくれるんか?
シングルコアな動きするなら、ディスパッチするだけでむしろ遅くなりそうなんだが。
204デフォルトの名無しさん:2007/11/09(金) 12:42:39
ゆとり教育がどうこう言われてるけど、194はもっとソースにゆとりを持たせるべき
変態と言われてもそのままってことは真性のMなんだろうか
205デフォルトの名無しさん:2007/11/09(金) 12:45:39
>>203
しかも、実態はディスクアクセスで律速されるから(同じディスク上のファイルを調べる限り)殆ど速くなる余地がない罠。
206202:2007/11/09(金) 12:47:30
書き忘れましたが、出力ウィンドウに表示が出るだけで、
動作には影響は今のところありません。
あと、その市販のDLLに付いてきたMFCのサンプルプロジェクトで試しても同じエラーが出力ウィンドウに出ます。
207デフォルトの名無しさん:2007/11/09(金) 14:46:34
その市販DLLの名前も書かんということはエスパー希望か。
208デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/09(金) 15:59:37
メーカーに電話。
210デフォルトの名無しさん:2007/11/09(金) 16:19:18
>>208
定義が無いから賢いコンパイラなら定数データの領域は確保しないらしいね
(なので当然シンボルもない)
by メイヤーズ

定義してみなよ

const int A::CONSTDATA;
211デフォルトの名無しさん:2007/11/09(金) 16:41:20
>>203
187の場合で効果があるかどうかは別として、少なくともWindowsでは、
マルチスレッドでも複数の論理CPUを使ってくれる。
212デフォルトの名無しさん:2007/11/09(金) 16:46:47
Linuxにとっては、スレッドはプロセスと基本的には同じ。
従って、特定のスレッドがどのコアで実行されるかは
原則的にカーネルにゆだねられる。
213デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/09(金) 22:00:56
>>213
初期値の指定はクラス定義内でいいんだぜ。そうしないと配列要素数とかの
定数式につかえない。

>>210
クラスのメンバ変数は定義しない限り実体がなくて、参照やポインタを取ろうとすると
エラーになることは決まっている。整数型に限って初期値をクラス定義内に書けて、
書けば定数式に使えるという特別ルール。
215デフォルトの名無しさん:2007/11/09(金) 22:03:41
>>206
DLL 内で throw されて DLL 内で catch されてるんでしょ。何も問題ない。
216デフォルトの名無しさん:2007/11/10(土) 00:33:03
暗号アルゴリズムを勉強しはじめたところなのですが、
DES や AES など、一般的な暗号方式のライブラリはありませんか?
C でも C++ でもいいです。

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

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

217デフォルトの名無しさん:2007/11/10(土) 00:39:48
勉強なら自分で作れ。ライブラリを使えるようになっても勉強にならないぞ
あとSHA-1やbase64は暗号じゃない
218デフォルトの名無しさん:2007/11/10(土) 00:58:37
>>216
opensslとかか?
まぁでも>>217に1票
219デフォルトの名無しさん:2007/11/10(土) 01:07:12
>>214
だからEffectiveC++に載っていると。。
220203:2007/11/10(土) 01:21:43
>>211-212
情報サンクス。
良く知らんことしゃべってすまんかった。
221187 スレッド出来ました:2007/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デフォルトの名無しさん:2007/11/10(土) 08:40:14
>>221
>for(;;){ if(chk[n]==0){
最初にこの行に到達するとき n=N だぞ。
223デフォルトの名無しさん:2007/11/10(土) 10:27:45
>>219
本は持ってないので知らないけど、クラス定義内の static const な整数型について
>210 みたいに「賢いコンパイラなら〜」って書いてあるなら、ちょっと不正確だと思う。
224デフォルトの名無しさん:2007/11/10(土) 11:24:44
>クラスのメンバ変数は定義しない限り実体がなくて、

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

というのは、もちろん非staticなメンバーについては正しい。
上で書いたのはstaticなメンバーについて。
226デフォルトの名無しさん:2007/11/10(土) 11:34:49
>>210>>214>>223

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

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

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

正確なところ知ってる人、フォローplz
228デフォルトの名無しさん:2007/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.
229228:2007/11/10(土) 12:53:51
あ、整数型の static const メンバ変数については "if it is used" ってあるから、
定数式の一部として使うぶんには定義は必要無いね。参照やポインタを取られる
可能性があるなら関係ないけど。

>208 の例もあるし、ライブラリとして提供するような時には気をつけて定義しとかないと
まずいね。
230デフォルトの名無しさん:2007/11/10(土) 14:09:21
>>228
thx
231デフォルトの名無しさん:2007/11/10(土) 14:23:44
bind1stやbind2ndの戻り値は何でしょうか?
どういう性質のものなのか?あと型名とか。
232デフォルトの名無しさん:2007/11/10(土) 15:20:54
binder1stやbinder2nd
233デフォルトの名無しさん:2007/11/10(土) 17:13:27
>>232
それは引数を一つとるoperator( )が定義されている関数オブジェクトの
クラス型ということですよね?
234デフォルトの名無しさん:2007/11/10(土) 17:36:10
そう。
直接binder1stやbinder2ndを使っても問題は無いんだけど、
その場合はbinder1st<ここを書かなきゃいけないのがめんどいよね>。
235デフォルトの名無しさん:2007/11/10(土) 17:42:20
>>234
どうも。
ストラップ本で理解できました。
236デフォルトの名無しさん:2007/11/10(土) 18:11:21
紐本?
237デフォルトの名無しさん:2007/11/10(土) 18:14:49
禿本
238デフォルトの名無しさん:2007/11/11(日) 15:11:11
VC6.0でかかれたプログラムをVisualStudio2005に移植しようとしてます。

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

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

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

http://msdn2.microsoft.com/ja-jp/library/abx4dbyh(VS.80).aspx
静的リンクで DLL との競合が起こらない理由もちゃんと書いてある。
VC8(VS2005) でも静的リンクは使えるから、明示的に指定すれば同じ動作に
なるんじゃないの?
240238:2007/11/11(日) 17:30:02
>>239
ありがとう。
自分もその頁見てたけど、静的リンクするのはCRTであって、
こちらが作ったDLLじゃないわけですね。
そこを勘違いしてました。

結局どのコンパイラオプションを選べばいいか調べきれなかったので
VC6.0の時は適切なコンパイラオプションだったんだろうけど、今回はstrtok_s()使うことにしました。
241デフォルトの名無しさん:2007/11/11(日) 17:38:52
符号なし整数だとオーバフローが起きない
というような話をときどき伺うのですが、
どういうことなのか理解できません……
教えて頂けませんか?
242デフォルトの名無しさん:2007/11/11(日) 17:56:28
オーバフローが起きないなんてことはないので忘れてください
243デフォルトの名無しさん:2007/11/11(日) 18:00:02
>>241
符号なし整数の計算では、最大値の次が 0 で 0 の前が最大値というふうにラップしている
ものとして結果が必ずその型の範囲内に収まる、と規格で定められている。

ラップする場合を指してオーバーフローと言うかどうかは微妙なところ。
244デフォルトの名無しさん:2007/11/11(日) 18:28:41
>>243
なるほど、納得できました
ありがとうございます
245デフォルトの名無しさん:2007/11/11(日) 18:50:42
はじめまして。
初心者です。
C++について質問があります。
ArrayとVecotorの全ての値をファンクションに渡して、Arrayの全ての値をReturnしたいのですが、
うまくいきません。
コールの仕方と、プロトタイプの書き方、それからReturnの書き方を教えてください。

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

よろしくお願いします。
246デフォルトの名無しさん:2007/11/11(日) 18:58:21
>>245

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

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

void func(Array *a)
{
 /* a についていろいろ処理 */
}
247245:2007/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デフォルトの名無しさん:2007/11/11(日) 19:36:53
>>247
コンパイルもできないコードを貼って「間違えているのでしょうか…?」って、何考えてんだ?
エスパーでも募集してんのか?

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

実際にコードを書いてコンパイルしろ。そしたらエラーメッセージが出るから、それを嫁。
249デフォルトの名無しさん:2007/11/11(日) 19:36:59
何がやりたいのか、まだよくわからないなぁ。
250デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/11(日) 19:42:54
わりぃ
  myIntArray::iterator i = array.begin();
  myIntArray::iterator e = array.end();
だわ
252デフォルトの名無しさん:2007/11/11(日) 20:08:26
for_each使ったほうがよくね?
253エスパー:2007/11/11(日) 20:12:05
>>247
そのArrayやVectorはコピーできない
だから関数にそのまま渡すことも返すこともできない
254デフォルトの名無しさん:2007/11/11(日) 20:41:47
とりあえず何だ。
Int って何だ。Array って何だ。String って何だ。C/C++ にそんなものはない。

しかも、せっかく
>Array func(Array a)
ってアドバイスもらってるのに、
>Int myFunction(myArray[])
って思いっきり無視してるし。
255デフォルトの名無しさん:2007/11/11(日) 21:58:30
すみませんスレチかも知れませんが質問です。

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

どなたか解決のヒントでもいいのでご存じであればよろしくおねがいします。
256デフォルトの名無しさん:2007/11/11(日) 22:02:47
msvcr80.dllがなんたらっていうエラーメッセージだったら、
VC++ 2005のランタイムを入れろ。
257デフォルトの名無しさん:2007/11/11(日) 22:02:51
Visual C++のランタイムは入ってるかね?
258デフォルトの名無しさん:2007/11/11(日) 22:08:27
聞いてみたところ、ランタイムは入ってるとのことでした。エラーメッセージは
『このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。
アプリケーションを再度インストールすることにより問題が解決する場合があります。 』
らしいです。Vista環境では正常に動作するのですが……
259デフォルトの名無しさん:2007/11/11(日) 22:22:56
じゃあ.NET Frameworkかな
260デフォルトの名無しさん:2007/11/11(日) 22:45:16
これからVC++を学ぶ場合でもMFCは有効ですか?
それともMFCは今後使用されなくなっていくことが濃厚で
.NETとCLR?(この違いはわかりませんが)を勉強
したほうが良いでしょうか?
261デフォルトの名無しさん:2007/11/11(日) 22:46:08
>>258
エラーメッセージでググったら、こんなの出てきたがどうよ?
ttp://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200606/06060025.txt
262デフォルトの名無しさん:2007/11/11(日) 22:57:08
>>260
個人的な意見

.NETで良いと思う。
でもどっちみち、ちょっと突っ込んだことしようとすると
Win32APIをガシガシ叩くことになるんで、
まずはウィンドウに子ウィンドウ貼り付けて絵と文字を表示するぐらいは
Win32APIを触っとくのが良いと思う。
1週間も掛からんと思うし。
263デフォルトの名無しさん:2007/11/11(日) 23:05:56
>>262
何か一冊.NETの本読んでみます。

ちなみにCLRは.NETとは関係無いものですか?
.NETはVBやVC#でも共通に使えるものでCLRはVC++
固有のものですか?
264デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/11(日) 23:15:15
>>264
こちらへ↓どうぞ。

タスクシステム総合スレ
http://pc11.2ch.net/test/read.cgi/gamedev/1173708588/
266263:2007/11/11(日) 23:17:22
解決しました。
入門書にも書いてありました。
267デフォルトの名無しさん:2007/11/11(日) 23:42:05
>>261
ありがとうございます!上手く行きました!
他にも助言頂いた方々本当にありがとうございました。
268デフォルトの名無しさん:2007/11/12(月) 15:09:38
すまそ。JavaやPHPやVBやってたんだけど、C++やることになりました。

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

C++も一応はわかっています。MFCとかCLIがソース見て理解できる程度の
上辺の知識を理解できるまでの文法力がつく本ってないですか?細かい言語使用は
適宜分厚い本でしらべるので。。よろしくお願いします。
269デフォルトの名無しさん:2007/11/12(月) 16:15:11
サイズ不明のファイルの内容を全部読み込む際に
動的なメモリの割当をしたいとき、どのようにしますか?

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

とやってからnewとかmallocとかで配列を確保するのかなあ
とか考えましたけど、どう考えても余計な事をしているようで…
270デフォルトの名無しさん:2007/11/12(月) 16:29:18
>>269
つ[std::vector]
つ[realloc()]
271デフォルトの名無しさん:2007/11/12(月) 17:00:39
>>269
filelengthとか何らかの手段を使って、ファイルサイズを先に調べて、一気に割り当てる。

標準入力やパイプのようにサイズがわからない場合は、ある程度の大きさのブロックごとに
読み込み、ブロックのlinked listを作成する。大きさがあまり大きくないことがわかっているなら
reallocもあり。
272デフォルトの名無しさん:2007/11/12(月) 17:21:57
>>269
バイナリモードでファイルオープンしてシーク操作でファイルサイズ取得
ifstream
seekg
tellg
273デフォルトの名無しさん:2007/11/12(月) 18:49:16
C++ に thisってないの?
class sample {
int power;
public setPower(int power) {
this.power=power;
}
};
ってしたいんだけど、文法的に間違いだよね?
274デフォルトの名無しさん:2007/11/12(月) 18:52:55
>>273
Javaとは違って、
this->power
275デフォルトの名無しさん:2007/11/12(月) 21:17:31
>>273
C++のthisはポインタ
276デフォルトの名無しさん:2007/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
277273:2007/11/13(火) 11:52:33
>>274-275 ありがとう!どうせ、こんなとぼけた質問には返事がきてないだろう
とおもったら、来てた。おかげでよくわかりました。使い方と理屈が。
PHPのも参照だから矢印記号なんだ。なるほど、なるほど。お礼が遅くなり申し訳ないです。
278デフォルトの名無しさん:2007/11/13(火) 11:53:21
VCはC99対応していない。
以上
279デフォルトの名無しさん:2007/11/13(火) 12:05:27
>>278
('д`;)・・・把握,mingw入れて吊ってきます
280デフォルトの名無しさん:2007/11/13(火) 12:06:32
C++のコンパイラとして見ればVC8は結構優秀なんだがねぇ…
281デフォルトの名無しさん:2007/11/13(火) 16:06:15
そもそもC99とC++98って一緒に使えるの?
282デフォルトの名無しさん:2007/11/13(火) 23:14:06
C++ の std::vector 使えばいいじゃんって事なんだろう。
283デフォルトの名無しさん:2007/11/13(火) 23:57:52
C99はいらない子
284デフォルトの名無しさん:2007/11/14(水) 01:48:09
可変長引数マクロだけはヨコセ
285デフォルトの名無しさん:2007/11/14(水) 01:50:52
どうせなら__FUNC__もあるとうれしい。
286デフォルトの名無しさん:2007/11/14(水) 02:44:38
>>284-285
両方 C++0x に入るみたい。ただし __FUNC__ じゃなくて __func__ ね。
287デフォルトの名無しさん:2007/11/14(水) 07:41:10
で、C++0xまだー?
288デフォルトの名無しさん:2007/11/14(水) 10:34:46
Cにclassが追加されるのも時間の問題だな
289デフォルトの名無しさん:2007/11/14(水) 11:41:06
てかCいらねー
290デフォルトの名無しさん:2007/11/14(水) 12:53:51
デバッグログ出力関係で可変引数マクロ使ってるんだが、
これも止めた方がいい?
291デフォルトの名無しさん:2007/11/14(水) 12:54:47
あ、ヨセじゃなくてヨコセか
292デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/14(水) 13:54:09
windoes上でこのふたつのプログラムは動くんですが、ubuntu上では
コンパイルできません。

だれか、直してもらえますか?
296デフォルトの名無しさん:2007/11/14(水) 13:57:24
エラーメッセージくらい載せろ
297デフォルトの名無しさん:2007/11/14(水) 14:09:02
コンパイルできたし、実行もできてるようだが…
(Ubuntu 7.10 / g++ 4.1)

まさかgccでコンパイルしようとはしてないだろうな
298デフォルトの名無しさん:2007/11/14(水) 14:16:52
すみませんgccでコンパイルしました。
どうやってこんぱいるするんですか?
教えてください。
299デフォルトの名無しさん:2007/11/14(水) 15:07:13
上に書いてあるように g++ でもダメなの?
300デフォルトの名無しさん:2007/11/14(水) 15:07:54
>>298 そんなことより、さっさとエラーメッセージ貼れよ。
301デフォルトの名無しさん:2007/11/14(水) 15:18:14
>>299
g++ でコンパイルできました。
どうもすみませんでした。
g++というのを知りませんでした。
302デフォルトの名無しさん:2007/11/14(水) 16:12:07
>>297
質問です。
コンパイルは出来たんですが、実行が出来ません。
g++ aMain.cpp -o aMain
では何も起こらないんですがどうやって実行したんですか?
303デフォルトの名無しさん:2007/11/14(水) 16:14:59
gccはコンパイラコレクションだからC++特化のライブラリを探してくれない。
g++はC++コンパイラだからC++特化のライブラリも探してくれる。
304デフォルトの名無しさん:2007/11/14(水) 16:16:51
明示しなかった場合、実行モジュールはカレントディレクトリにa.outという名でできる。
実行するには、./a.outでいい。

つーか、その程度の基礎知識もなしにコンパイルなんてするなよw
305デフォルトの名無しさん:2007/11/14(水) 16:18:11
>>302
何したいの?それで aMain というファイルができてるの?
できていえれば、 ./aMain とすれば走るはずだけど。
306デフォルトの名無しさん:2007/11/14(水) 16:26:34
これはスルーしたほうがいいな
307デフォルトの名無しさん:2007/11/14(水) 16:40:07
a.outができません。aMain.oだけできます。
./aMainだとpermission denied となってしまいます。
308デフォルトの名無しさん:2007/11/14(水) 16:45:08
問題解決しました。./aMainでは実行できなくても
g++ aMain.cpp -o aMain && ./aMain
で実行できました。
お騒がせしてすみませんでした。
309デフォルトの名無しさん:2007/11/14(水) 17:40:55
なんじゃそりゃ。
ただのタイプミスな気がする
310デフォルトの名無しさん:2007/11/14(水) 18:06:04
>>308
そんなにあせらずに、Unix 系の CUI 使いかたの本薄いので
良いから一冊読むと大分時間の節約になると思うよぉ。
311デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/14(水) 20:40:37
確保したサイズを覚えておく。
313311:2007/11/14(水) 20:41:58
>>312
なるほど・・・。
やっぱり、そういう方法しかないんですか・・・
せめてtry catchがあれば、強引に出来そうなんですけどね。

どうもありがとうございました。
314デフォルトの名無しさん:2007/11/14(水) 20:46:31
ていうかそのソース突っ込みどころ満載だから勉強頑張ろうな。
315デフォルトの名無しさん:2007/11/14(水) 20:47:44
自分が確保したメモリのアドレスとサイズを持つ構造体でも定義すれば?
316311:2007/11/14(水) 21:14:02
>>314
具体的にどのあたりでしょうか?
よろしくお願いします。

>>315
なるほど。
その方法も検討してみます。
317デフォルトの名無しさん:2007/11/14(水) 21:18:32
DLLで確保されたメモリはそのDLLで解放しないといけないと聞きました。

そこでお聞きしたいのですが、例えば以下のような場合
 ・アプリケーションAがDLL_BとDLL_Cを参照
 ・DLL_B自身もDLL_Cを参照
DLL_BがDLL_Cで確保したメモリを
アプリケーションAからリンクされたDLL_Cで解放するのは大丈夫なのでしょうか?
よろしくお願いします。
318デフォルトの名無しさん:2007/11/14(水) 21:33:27
>>317
OKだけど、LocalAllocにすればそんなこと気にしなくてもいいんじゃね?
319デフォルトの名無しさん:2007/11/14(水) 21:42:20
いや、Win32ならLocal系よりHeap系だろ
320デフォルトの名無しさん:2007/11/14(水) 21:55:12
>>316
>if ( ( str + i ) == NULL )
この行で、iに2以上の値が入った時点でアウト。
確保されていない領域を参照することになる。
NULLとの比較も無意味。
初期化されていない領域はゴミが入っているのでNULLかどうかなんてわからない。

321デフォルトの名無しさん:2007/11/14(水) 22:06:29
そもそも参照できてない、それ。
322デフォルトの名無しさん:2007/11/14(水) 22:07:09
>>318
LocalAlloc, HeapAlloc, GlobalAlloc
って名前が違うだけでは無いんですね。
知りませんでした。

>>319
Heap系はよけいなオブジェクトが必要になるのであまり使いたくないです・・・
そこが肝という気もしますが
323デフォルトの名無しさん:2007/11/14(水) 22:09:06
>>320
それが出来ないから質問きたんだろ
出来るなら、既に解決してるじゃんw

そもそも
>この行で、iに2以上の値が入った時点でアウト。
これを判定したいって言う質問なのに、そのレスはナンセンス過ぎる
324デフォルトの名無しさん:2007/11/14(水) 23:06:43
>>320
>この行で、iに2以上の値が入った時点でアウト。
単なるポインタに数字を足した値を見ただけで何でアウトなんだ?
*つけて参照してるならともかく・・・
325デフォルトの名無しさん:2007/11/14(水) 23:14:37
>>322
ヒープハンドルは常にGetProcessHeap()で得たものを使うことにすれば、
Local/Globalと比べ、新たな面倒さが生まれることはないと思うぞ。
326デフォルトの名無しさん:2007/11/14(水) 23:39:43
そもそもLocalとGlobalってかなり前にMSが使うのやめてっていってなかった?
327デフォルトの名無しさん:2007/11/15(木) 01:27:02
もうCoTaskMemAllocでいいよ
328デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/15(木) 02:05:54
ポインタは*つけて参照しなければ、単なる数字だよ。
しかも、ポインタ変数に代入したわけでもなく、単に+3をやってifで比較しただけでしょ?

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

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

if( (str+5000)!=NULL)
ってやろうと
if( (str+50000000)!=NULL)
ってやろうと、エラーは出るはず無いよ。
330デフォルトの名無しさん:2007/11/15(木) 02:23:13
>>329
> *(str+i)のように参照した場合や、str+=iのように加算を行った場合であって

そんなことどこにも書いてない。 p + n という式自体について述べた部分だよ。
* で参照したり = で代入したりする前の話。
331デフォルトの名無しさん:2007/11/15(木) 02:43:49
なんで「一つ後ろ」みたいな表現するんだろう
一瞬、「じゃあふたつ後ろならいいのかよ」とか思ってしまったよ
332デフォルトの名無しさん:2007/11/15(木) 10:42:18
>>330
仕様の読み方わかってないだろ。
プログラムの勉強からはじめたほうがいいね。
333デフォルトの名無しさん:2007/11/15(木) 10:57:22
>>332
どこをどう読んだら >329 みたいな解釈になるのか教えてください。
334デフォルトの名無しさん:2007/11/15(木) 11:24:57
>>328

加減演算子

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

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

なので、厳密には>>328の意見が正しいと思われる。
335デフォルトの名無しさん:2007/11/15(木) 13:04:40
実際、タイトなメモリ空間モデルを持っている実装では、割と容易に起こり得る。
例えばint array[2]に対してarrayが0xfff0にアサインされているかもしれない。
ポインタもintも16bitなら、array + 4が0になってしまい、NULLと区別できなくなってしまう。
# 流石に即クラッシュはしないだろうけどね。
336デフォルトの名無しさん:2007/11/15(木) 14:02:36
境界の問題はポインタ特有の話じゃありませんね
337デフォルトの名無しさん:2007/11/15(木) 17:44:01
それがどうかしましたか?
338デフォルトの名無しさん:2007/11/15(木) 17:57:27
つまり見当違い
339デフォルトの名無しさん:2007/11/15(木) 18:16:43
どこが?
そもそも誰か、境界の話なんてしているんですか?
340デフォルトの名無しさん:2007/11/15(木) 18:31:33
>>336が場違いな件について
341wolf ◆8VH3XAqjlU :2007/11/15(木) 22:09:24
>>311
*** For your reference ***

Windows. _heapwalk (CRT)
http://msdn2.microsoft.com/en-us/library/h0c183dk(VS.80).aspx

Linux 2.4x
src\drivers\char\drm\sis_ds.c "void mmDumpMemInfo( memHeap_t *mmInit )"
342デフォルトの名無しさん:2007/11/16(金) 13:49:41
質問です!
単純な文章をファイル出力させようとfoutを使っているのですが
”(ダブルクォーテーション)
って奴はどうやったら出力できますか?
囲みを’に変えてみたりしたがうまくいかねえ…
343デフォルトの名無しさん:2007/11/16(金) 13:58:43
"\""
344デフォルトの名無しさん:2007/11/16(金) 15:06:55
MFCアプリケーションがリンクしてるMFC DLLがあります。
MFCDLLにはMFCのクラスのポインタを引数としたエクスポート関数があります。
MFCDLLでそのクラスをnewし、アプリケーション側でdeleteしています。

この両者が、プロジェクトの設定の"MFCの使用"を"共有DLLでMFCを使用する"
の設定だったらうまく動いてるけれど、
"スタティックライブラリでMFCを使用する"の設定にすると、アプリケーション側で
DLLでnewしたクラスをdeleteしたタイミングでハングします。
なぜスタティックリンクすると、だめなんでしょうか。
345344:2007/11/16(金) 15:07:37
追記、WindowsXPで、VS2005です。
346デフォルトの名無しさん:2007/11/16(金) 15:19:42
>343
サンクスです。それをやってもできないから質問したのに、
そこ以外の場所でミスってるとは思わなかった…
347デフォルトの名無しさん:2007/11/16(金) 15:20:26
>>344
EXEにスタティックリンクされたMFCとDLLにスタティックリンクされたMFCの2つのMFCが存在することになるから管理が混乱するんじゃないの
348デフォルトの名無しさん:2007/11/16(金) 22:43:06
メモリマネージャが違うから

ってのは嘘だけど、newもdeleteもアプリ側で行うようにできないのかね?
349デフォルトの名無しさん:2007/11/16(金) 23:02:27
質問です
関数のオーバーロードをした際、引数がぴたりとあってない場合に
「引数の型があいまいです」とでますよね。

暗黙の型変換をがんばろうとして駄目だった。ということはわかるのですが
どういう優先度でがんばろうとしてるのか、色々実験してみても法則がわかりませんでした
C++における「関数オーバーロード時の呼び出し優先順位の決め方」みたいなものを教えていただけませんでしょうか
350OPENCV:2007/11/16(金) 23:36:35
OpenCVというライブラリをVisual C++ 2005に導入しようとして躓きました。

ttp://www.seman.cs.uec.ac.jp/~takahashi/OpenCV/functions/index.htm
などを参考にすれば導入できるはずなのですが、
デバッグなしで開始をしたときに、

「プログラム 'C:\Users\koizumi\Documents\Visual Studio 2005\Projects\cv
\debug\cv.exe'を開始できません。

指定されたパスが見つかりません」
と言われてしまいます。

リンカの設定で
追加のライブラリディレクトリ--C:\Program Files\OpenCV\lib
追加の依存ファイル--cv.lib cxcore.lib cvaux.lib highgui.lib
と設定しましたし、

インクルードファイル、ライブラリファイルのパス設定もしました。

どこが悪いかわかる方がいらっしゃいましたら、教えてください。
よろしくお願いします。
351デフォルトの名無しさん:2007/11/16(金) 23:44:58
>>350
cv.exeが見つからないって感じに見えるんだけどコイズミくん。
352OPENCV:2007/11/17(土) 00:00:45
>>351
お返事ありがとうございます。

ビルドしたとき、エラーになっている感じはありません。
========== ビルド: 0 正常終了、0 失敗、1 更新、0 スキップ ==========
いつものようにデバッグなしで開始が通るときは、
Documentsフォルダの中にexeファイルができるのですが、
今回はexeファイル自体が作成されていないようです。

何かわかることがあれば、コメントお願いします。
353デフォルトの名無しさん:2007/11/17(土) 00:16:55
>>349
プログラミング言語C++を見てみろ
354デフォルトの名無しさん:2007/11/17(土) 00:50:48
>>349
JIS の規格買うか、 JIS の糞思い pdf を見るか、 ISO のドラフトダウンロードするか。
355OPENCV:2007/11/17(土) 08:08:15
>>353
>>354
コメントありがとうございます。

プログラミング言語C++は規格についても書かれた本のようですね。ただ、高い。。。
JISの規格は、私ではなおさら分からなくなりそう。。。

もう少し格闘してみます。
それで分からなければまた質問させてください。それでは。
356デフォルトの名無しさん:2007/11/17(土) 08:27:27
>>355
ルールを見る前に格闘したって時間の無駄。
先に確認すればいだろ。
357デフォルトの名無しさん:2007/11/17(土) 09:02:21
DXライブラリについて質問なんですが

ScreenFlip関数ってのは、「表示する画面を入れ替える」なんでしょうか、それとも「書き込む画面を入れ替える」なんでしょうか?
358357:2007/11/17(土) 09:07:00
唐突に解決しました
すんません
359デフォルトの名無しさん:2007/11/17(土) 15:31:07
>>349
>>355
プログラミング言語C++(第3版)の7.4(p193)にあります。立ち読みでどうぞ。
360デフォルトの名無しさん:2007/11/17(土) 15:39:45
ほかではC++の設計と進化にも抜粋されているはず。
361デフォルトの名無しさん:2007/11/17(土) 15:56:49
どうしても解決できないので教えてください。
MFCでメンバ変数のCFontをOnInitDialog内でダイアログのコントロールに設定してますが、
なぜかフォントの種類がMS ゴシックになってしまいます。

デフォルトはダイアログエディタでMS 明朝にしてます。
が、SetFontを呼ぶとサイズはCreatePointFontで指定したサイズになりますが、
なぜかフォントの種類が勝手にMS ゴシックになってしまうのです。
フォントには何を指定してもだめでした。(意味はなくてもMS 明朝で試しましたがMS ゴシックになりました)

サイズは変わってるのに何故でしょうか?
362361:2007/11/17(土) 16:22:41
ごめんなさいごめんなさい。
フォント作成時に指定したフォント名に1バイト余計な空白がありました。
なのにCreatePointFontが成功を返してたので気づきませんでした。
363OPENCV:2007/11/17(土) 19:35:00
>>356
>>359
コメントありがとうございます。
立ち読みして、ルールを知って、解決しようと思います。
364デフォルトの名無しさん:2007/11/18(日) 13:34:54
VC6、非MFCで開発をしています。
char *utf8Char に、ヌルターミネイトされたUTF8のバイト列が入っています。
("wb"でfopenして、fwrite( utf8Char, strlen( utf8Char), 1, fp )したものを
 テキストエディタでUTF8指定で開くとちゃんと読める。
 何もせずにcoutしてDOS窓に出すと、ASCII文字は読めるけど日本語が化ける)

これを_bstr_t型の変数に入れ込みたいのですが、どうすれば良いのでしょうか。
_bstr_t utf8Bstr( utf8Char );
cout << _com_util::ConvertBSTRToString( utf8Bstr ) << endl;
とすると、全体が文字化けしたようになりますし、
WideCharToMultibyteで別のchar *hogeに入れて、cout << hoge << endl;
としても文字化けしました…。
365デフォルトの名無しさん:2007/11/18(日) 14:14:04
utf-8はMultiByte。_bstr_tはメモリ確保が特殊なWCHAR。
だから、MultiByte2WideCharなんかで、UTF-8を明示した上で、WCHAR変換をかける。

これ以外の、ソースエンコーディングの指定がない変換系関数は、だいたい
ANSIコード(日本ではCP932)を仮定するので、変換が破綻する。
366デフォルトの名無しさん:2007/11/18(日) 16:15:42
>>365
http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200701/07010007.txt
このページの最後の方にある、UTF8ToUTF16という処理であってますでしょうか?
手元に開発環境がないので、今試せないのですが…。
367デフォルトの名無しさん:2007/11/18(日) 18:12:18
CComPtr< IHoge > hoge;
CComPtr< IHage > hage;

//hoge->HageがIHageのインスタンスを持つ処理

hage = hoge->Hage;
としたとき、その後すぐ hoge.Release() としてもいいんでしょうか。
した後でもhageはNULLになったりしてないようですが、
それはたまたまメモリがそのままになってるだけで、本当はhageを完全に使い終わってから
hage.Release();
hoge.Release();
としなければならないのでしょうか。
368デフォルトの名無しさん:2007/11/18(日) 19:43:29
>>366
それでもあってはいるけど、俺だったら直接_bstr_tへ書き込むようにする。
BOOL UTF8ToUTF16(const char* data, const int len, _bstr_t& ret)
{
    if (!data)
    {
        return FALSE;
    }
    if (len == 0)
    {
        ret = L"";
        return TRUE;
    }
    _bstr_t t;
    const int wlen = ::MultiByteToWideChar(CP_UTF8, 0, data, len, NULL, 0);
    if (wlen == 0)
    {
        return FALSE;
    }
    t.Attach(SysAllocStringLen(0, wlen));
    if (t.GetBSTR() == 0)
    {
        return FALSE;
    }
    if (::MultiByteToWideChar(CP_UTF8, 0, data, len, t.GetBSTR(), wlen) != 0)
    {
        ret = t;
        return TRUE;
    }
    return FALSE;
}
369デフォルトの名無しさん:2007/11/18(日) 19:46:13
>>367
そのための参照カウントなのだから大丈夫。
そもそもCComPtr使うんだったら、
必要に迫られない限りReleaseを明示的に呼ぶ必要もないと思うけど。
370デフォルトの名無しさん:2007/11/18(日) 19:50:32
CComPtrって、何がいいんだっけ
VC++なら_com_ptr_t使ったほうがよくね?
371デフォルトの名無しさん:2007/11/18(日) 19:52:24
>>367
理論上はhoge.Release()を先にしても問題無いし、そう実装されているべき。
ただ、OfficeのApplicationオブジェクトとかで、
稀に子オブジェクトも一緒くたに無効化してしまうことがあるので、
一応頭の片隅に置いておくといい。
昔の話かもしれないけど。
372デフォルトの名無しさん:2007/11/18(日) 19:58:16
>>370
_COM_SMARTPTR_TYPEDEF ('A`)マンドクセ
例外対応 ('A`)マンドクセ
ATLのシンプルな構造 (゚д゚)ウマー
373デフォルトの名無しさん:2007/11/18(日) 20:09:14
class hoge{
int x;
int y;
};

というクラスの「ポインタ」がたくさん入ったvectorがあるとして、
例えばこれを各ポインタが指しているxでソートすることってできますか?
ポインタでなければ<の定義でできると思うんですが、
ポインタの場合どうやって書いたらよいか分かりません。
もし可能でしたら書き方を教えてください。お願いします。
374デフォルトの名無しさん:2007/11/18(日) 20:11:36
MFCとboostを併用するというのはアリですか?
375デフォルトの名無しさん:2007/11/18(日) 20:17:19
>>373 比較関数つきの sort() を使う。
>>374 アリ。
376デフォルトの名無しさん:2007/11/18(日) 20:32:08
#include <algorithm>
#include <functional>
#include <vector>
#include <cassert>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
struct Value {
  int x;
  int y;
};
struct comparator : public std::binary_function<const Value*, const Value*, bool> {
  result_type operator()(first_argument_type lhs, second_argument_type rhs) const {
    return lhs->x > rhs->x;
  }
};
int main() {
  Value v0 = { 1,2 }, v1 = { 2,3};
  std::vector<Value*> v;
  v.push_back(&v0);
  v.push_back(&v1);
  std::sort(v.begin(), v.end(), comparator());
  assert(v[0]->x == 2 || v[0]->y == 3);
  using namespace boost::lambda;
  std::sort(v.begin(), v.end(), bind(&Value::x, *_1) < bind(&Value::x, *_2));
  assert(v[0]->x == 1 || v[0]->y == 2);
}

どっちにしろ大概だな
377デフォルトの名無しさん:2007/11/18(日) 20:36:13
速度がカリカリに必要ってんじゃなけりゃ、
bool hoge_less_x(hoge const* lhs, hoge const* rhs) { return lhs->x < rhs->x; }
でいいだろ。
378デフォルトの名無しさん:2007/11/18(日) 20:50:59
>>375-377
ども。
とりあえず比較関数を渡せるsortってのを試してみようと思います。
ありがとうございました。
379デフォルトの名無しさん:2007/11/19(月) 02:46:28
void doSomething(const Widget *p); // Widgetはクラス
という関数があった場合、
doSomething(&Widget());
という風にWidgetのオブジェクトを引数で作成して、そのままアドレス取って呼び出すのは、全く問題ないですか?
380デフォルトの名無しさん:2007/11/19(月) 05:50:07
次のステートメントに移る前には
そのオブジェクトがなくなってしまっていても
いいならいいんじゃないの
381デフォルトの名無しさん:2007/11/19(月) 09:10:29
&何らかのクラス() なんていうのは文法上通るの?
382デフォルトの名無しさん:2007/11/19(月) 10:47:53
>>379
&演算子はオブジェクトに対しては左辺値にしか適用できないんでないか?
383デフォルトの名無しさん:2007/11/19(月) 12:51:39
そうみたいだね
384デフォルトの名無しさん:2007/11/19(月) 12:56:30
最近そんなコードを書いた記憶があったので検索したらごっそり出てきたわ。> &Class()
385デフォルトの名無しさん:2007/11/19(月) 13:05:51
いいこと教えてやる
ファイルを閉じるときに、

fp.close();
while( fp && fp.fail() )Sleep(10);

とやると良いよ
まだ閉じていないで次のやつを開くと駄目だからだ
386デフォルトの名無しさん:2007/11/19(月) 13:08:05
&演算子をオーバーロードすればそういう書き方も通るんでない?

class A{
public:
  A(){}
  int operator&(){return 123;}
};
int main()
{
  printf("%d\n", &A());
}
387デフォルトの名無しさん:2007/11/19(月) 13:14:37
>>386
まずは、その必要性をよく考えたほうがいい。
388デフォルトの名無しさん:2007/11/19(月) 13:15:31
>>386
379はあくまでアドレスが欲しいわけだから意味ないんでない?
389デフォルトの名無しさん:2007/11/19(月) 13:32:34
#include <stdio.h>
#include <string.h>
char s[] = "This is a pen. That is an apple.";
void main(void)
{ char check[256],str[256];
int i;
printf("This is a pen. That is an apple.\n\n");
gets(str);
for(i=0;str[i]==s[i];i++)
{
check[i]=strcmp(str[i],s[i]);
if (check[i]==0)
{printf("ok");}
else
{printf("ng");}}}

初期化した文字列と入力した文字列strに対しThis is〜がstrで始まっているかどうかを
判定するプログラムですが、check[i]=strcmp(str[i],s[i]);にてエラーが出ます。
教えてください(例えばThis→OK,Th→OK,Thos→NG.....)
390デフォルトの名無しさん:2007/11/19(月) 14:05:06
#include <stdio.h>

char s[] = "This is a pen. That is an apple.";

int main(void)
{ char check[256],str[256];
int i,checker;
printf("This is a pen. That is an apple.\n\n");
gets(str);
for(i=0;str[i]!='\0';i++)
if(str[i]==s[i])
{
checker=1;
}

else
{
checker=0;
break;
}

if(checker==0)
{
printf("NG!その文字列から始まっていません。\n");
}

else
{
printf("OK!その文字列から始まっています。\n");
}
}
これでいけた
391デフォルトの名無しさん:2007/11/19(月) 14:10:47
strcmp って string を compare するんだよな…
392デフォルトの名無しさん:2007/11/19(月) 15:06:09
lexicographical_compare アルゴリズムについて教えてください。
この関数はlexicographical_compare(s1, s2);
とした場合、辞書順でs1がs2より前にあるときにtrueを返し、
そうでないときfalseを返すため、文字列の一致は判定できない
と思います。

この関数を使って二つの文字列(string)が等しいことを判定するためには
lexicographical_compare(s1, s2); //false (s1はs2の前にはない)
lexicographical_compare(s2, s1); //false (s2はs1の前にはない)
がともにfalseを返すことを確認しなければいけないのでしょうか?
393デフォルトの名無しさん:2007/11/19(月) 15:43:51
equal とか使えなかったっけ?
394392:2007/11/19(月) 15:47:44
実はEffective STLで大文字、小文字を区別しない比較
方法として以下のコードがあるのですが、これでは一致を
判定できないのでは?と思ったんです。

bool ciStringCompare(const string &s1, const string &s2)
{
return lexicographical_compare(s1.begin(), s1.end(),
s2.begin(), s2.end(),
ciCharLess);
}

// 1文字の比較
bool ciCharLess(char c1, char c2)
{
return tolower(static_cast<unsigned char>(c1)) <
tolower(static_cast<unsigend char>(c2));
}
395デフォルトの名無しさん:2007/11/19(月) 15:55:50
>>394
言いたいことがわからん。大文字小文字区別しないならその範囲で
しか一致は判定できないのでは?そんだけじゃないの?
396392:2007/11/19(月) 17:03:12
>>395
上記のプログラムでいうと
lexicographical_compareでは一方の文字列が他方のものより
辞書順で前にあるかないかは判定できますが、一致は判定
できないのでは?という意味です。
たとえば、ciStringCompareで二つのstringが一致
するかどうかを判定できるなら
ciStringCompare("ABC", "abc");
はtrueを返すと思ったのですが、呼び出している
lexicographical_compareの仕様ではfalseになります
よね?結局文字列の一致は判定できないのではないかと。

ソース Effective STL 第35項
397デフォルトの名無しさん:2007/11/19(月) 17:27:33
正誤表によるとciStringLessとして使ってくれだってさ。
ttp://www.aristeia.com/BookErrata/estl1e-errata_frames.html
398デフォルトの名無しさん:2007/11/19(月) 18:01:30
CPUとかメモリを良いものに交換したらコンパイルは速くなりますか?
また、どの部分に依存してますか?
399デフォルトの名無しさん:2007/11/19(月) 18:09:15
>>398
CPU,メモリも大事だけど、HDDが高速な方がいい。
ヘッダやライブラリ等がIDE接続のフラッシュメモリにあるとコンパイルは早い。
たぶんね。
400デフォルトの名無しさん:2007/11/19(月) 18:19:26
コンパイラにもよるが、マルチコアやマルチCPUだと複数ファイルいっぺんに
コンパイルするやつもある。
401デフォルトの名無しさん:2007/11/19(月) 18:31:19
各バスも太い方がいい?
402デフォルトの名無しさん:2007/11/19(月) 18:38:58
メモリ(の容量は)マジ大事
スワップが発生したらかなりの速度低下になるし、逆にパフォーマンス改善としては一番コストパフォーマンスがいいかも
最初から2Gとか積んでたらほとんど変わらないだろうがね
ちなみにクロック速度は殆ど関係ないと思うけど、実際はどうなんだろう
403392:2007/11/19(月) 18:54:25
>>397
正誤表確認してませんでした。
ありがとうございました。すっきりしました。
404デフォルトの名無しさん:2007/11/19(月) 19:24:08
>>388
thisを返すoperator &をメンバとして定義すれば可能なはず。
誰がやるかそんなもん、って程度のことだが。
405デフォルトの名無しさん:2007/11/19(月) 22:50:54
>>368
すいません、t.Attachのところなんですけど、_bstr_tにAttachという
メソッドが見あたらなかったんですが…。
何かをインクルードすればいいのでしょうか?
406デフォルトの名無しさん:2007/11/19(月) 22:53:11
AttachといえばCComPtr
407デフォルトの名無しさん:2007/11/20(火) 00:19:01
>>406
CComPtr< _bstr_t > t;
とかって…。
違う気がする。
すみません!教えてください!
>>368そのままではコンパイラ通らないので…。
408デフォルトの名無しさん:2007/11/20(火) 01:32:14
>>405
バージョンは何?
少なくともVC++ 7.1にはあるはずなんだけど。
http://msdn2.microsoft.com/en-us/library/c671cyay(VS.71).aspx
409デフォルトの名無しさん:2007/11/20(火) 03:01:35
CComBSTR?
あてずっぽうだけど
410デフォルトの名無しさん:2007/11/20(火) 06:54:36
>>408
VC6です。
411デフォルトの名無しさん:2007/11/20(火) 17:10:12
VC++EpressEdition2005でOpenGL使って
キューブ状態のものにLogo.bmpをテクスチャで貼り付けてクルクル回したスクリーンセーバを作りたいと考えました

OMEGA POINT - プログラミング(OpenGL,数学,画像処理,Win32API, C++) -
http://omega-point.ddo.jp/programming/opengl/index.html

の上から2コ目のzipファイルが使えそうだったのでホイホイ弄ってたら画像の読み込みで壁にぶつかりました
現在はキューブがクルクル回っているところですが、画像は読み込めてません
MFC使ってないのでBitmap定義が使えないみたいなんです ( ; ; )
ResouceFilesにはLogo.bmp(256*256)を登録してあるのでどうにかして触る方法がありませんか?
何かを勘違いしてる場合は指摘してくださいー
412デフォルトの名無しさん:2007/11/20(火) 17:42:07
Win32APIでLoadBitmapかLoadResource使えばいいと思うが
413デフォルトの名無しさん:2007/11/20(火) 20:51:20
openするファイル名を変数にしたいのですが
例えば
char File_Name[30];
fout.open(File_Name,ios::out);
とした場合、File_Nameに文章を詰め込む(File_Name="Function_Name")
みたいなことはできますか?
いや、できないことはなさげだけど、string型が詰められないとなると手がない…
414デフォルトの名無しさん:2007/11/20(火) 20:56:15
日本語でしゃべれよ
415デフォルトの名無しさん:2007/11/20(火) 21:01:51
string型なんてものがあるのはもっと上級言語だよ。

Cでは char Filename[] と char * Filename は同じモノ
つまりFilename[]="name"としてれば
416デフォルトの名無しさん:2007/11/20(火) 21:46:21
>>415
え?
417デフォルトの名無しさん:2007/11/20(火) 21:49:26
>>415
ろ?
418デフォルトの名無しさん:2007/11/20(火) 21:50:29
>>415
>Cでは char Filename[] と char * Filename は同じモノ
違う。前者はあくまで配列で、後者はポインタ。

関数の仮引数としてなら同義だ。
void func(char Filename[]);
void func(char *Filename);
419デフォルトの名無しさん:2007/11/20(火) 21:53:01
>>413
どうしてもというならstrcpyでも使えば?
stringのc_str使えばいいとは思うけど。
string File_Name;
fout.open(File_Name.c_str(),ios::out);
420419:2007/11/20(火) 21:54:23
訂正
string File_Name("Function_Name");
421デフォルトの名無しさん:2007/11/20(火) 21:57:22
char * mystrcpy( char * buf, char * src )
{
strcpy( buf, src ):
return src;
}
422デフォルトの名無しさん:2007/11/20(火) 22:08:30
初心者歓迎のスレだけど、普通は質問者の方だよな、初心者は。
423デフォルトの名無しさん:2007/11/20(火) 22:09:10
釣堀はここですね?
424デフォルトの名無しさん:2007/11/20(火) 22:53:46
水の干上がった釣り堀で喚いてるだけだけどな
425デフォルトの名無しさん:2007/11/20(火) 23:21:45
配列とポインタの実質の違いは、実体がどこにあるかだけだろ
426デフォルトの名無しさん:2007/11/20(火) 23:25:20
ほう
427デフォルトの名無しさん:2007/11/20(火) 23:51:29
>>425 別に配列じゃなくてもポインタ使うけど。
428デフォルトの名無しさん:2007/11/21(水) 00:32:33
>>425
馬鹿ですか?
429デフォルトの名無しさん:2007/11/21(水) 01:12:01
初々しい。C言語の初級と中級の中間ってとこだろうな。
430デフォルトの名無しさん:2007/11/21(水) 01:21:33
実体とか意識しだしたら大方中級な感じがする。
ここまで理解できてたらこれから先も呑み込めて行けそうじゃね?
間違いを受け止める心があればだけど・・・
431デフォルトの名無しさん:2007/11/21(水) 16:06:24
Linux環境

daemonを作りたいときに、

#include <stdlib.h>
int daemon(int nochdir, int noclose);

呼ぶのと、

#include <sys/types.h>
#include <unistd.h>

pid_t fork(void);

を2回呼ぶのって、実用上何か大きな違いはありますか?
432デフォルトの名無しさん:2007/11/21(水) 16:11:34
daemonは中でfork呼んでるだろう。
433デフォルトの名無しさん:2007/11/21(水) 16:12:46
>>432
じゃあ、fork()しかない環境ではforkを2回にして、
daemon()がある環境ではdaemon()使っとけって感じですかね。
434wolf ◆8VH3XAqjlU :2007/11/21(水) 21:32:30
>>433
*** For your reference ***

How to Daemonize in Linux [Doug Potter]
http://www-theorie.physik.unizh.ch/~dpotter/howto/daemonize
435デフォルトの名無しさん:2007/11/21(水) 22:16:54
おまいらみんな死んでしまえ。forkするなぼけが
と、djb教授がお怒りです(嘘
436デフォルトの名無しさん:2007/11/22(木) 12:04:21
fstreamで書式付きで出力できますか
437デフォルトの名無しさん:2007/11/22(木) 12:06:31
解決しました
fprintf(fp , )は出来ないですけどsprintfでchar配列に入れて出力すれば出来ますね
438デフォルトの名無しさん:2007/11/22(木) 12:50:29
マイクロソフトのwindowsの継承とかの情報はどこで手に入れられるんですか?
機能の上位機能についてです
439438:2007/11/22(木) 13:11:03
2500メガのMSDNライブラリにのってますか?
うちのパソコン鈍いので保存に二日かかりそうなんですが
あとこれってテキストファイルやhtmlに変換できますか
440デフォルトの名無しさん:2007/11/22(木) 13:17:09
>>436
<<演算子とマニピュレータ使えばできるんじゃない?
441デフォルトの名無しさん:2007/11/22(木) 20:54:43
>>438
MFCのこと?

>>439
MSDNライブラリの各記事の実体はHTML。
ただし、複数ファイルをまとめて圧縮した形で格納されている。
ms-help:で始まるURLを使えばIEからも見れる。
442デフォルトの名無しさん:2007/11/23(金) 05:06:20
http://www.kmonos.net/alang/boost/classes/next_prior.html
> next の代わりに (++lst.begin()) と書けば良いではないか?と思われるかもしれませんが、
> begin() の返すイテレータが例えば int* などの組込型であった場合、
> 残念ながらその記述はコンパイルエラーになってしまいます。

どうしてコンパイルエラーになってしまうのですか?
443デフォルトの名無しさん:2007/11/23(金) 05:33:15
組み込み型の一時オブジェクトは値を変更できない。
++0; がエラーなのと同じ。
444デフォルトの名無しさん:2007/11/23(金) 05:39:36
参照以外を返す関数の戻り値は右辺値(3.10.5)で
前置++の対象は変更可能な左辺値じゃない許されない(5.3.2)
から?
規格書買っちゃったけどイマイチ読みかたがわからねぇや
445442:2007/11/23(金) 05:44:47
>>443,444
なるほど。
ありがとうございました。
446デフォルトの名無しさん:2007/11/23(金) 06:52:27
int foo() { return 0; }
++foo(); // エラー
447デフォルトの名無しさん:2007/11/23(金) 14:35:51
なんとなく書いてみた
#include <stdio.h>

int *get_number(void){
static int number[2]={0,999};
return number;
}
int main(void){
printf("%d\n", ++*get_number());
printf("%d\n", ++*get_number());
printf("%d\n", (*get_number())++);
printf("%d\n", (*get_number())++);
printf("%d\n", *get_number()+1);
printf("%d\n", *(get_number()+1));
return 0;
}
448デフォルトの名無しさん:2007/11/23(金) 14:37:57
>>447
何が目的?
449デフォルトの名無しさん:2007/11/23(金) 14:44:32
>>448
なんとなく書いてみただけからスルーしてもらっておkです

#include <stdio.h>

typedef void (*func_t)(void);
typedef func_t (*func2_t)(void);

void hello(void){printf("Hello\n");}
func_t hello_func(void){return hello;}
func2_t hello_func_func(void){return hello_func;}

int main(void){
hello_func_func()()();
return 0;
}
450デフォルトの名無しさん:2007/11/23(金) 14:45:20
ここはお前の日記帳j(ry
451デフォルトの名無しさん:2007/11/23(金) 17:01:21
処理Aと処理Bがあって、
Aは1秒ごとに、Bは5秒ごとに呼ばれるものとします。
この1秒と5秒はおおよそで良いので、sleepで止めます。

このAとBを並行して実行させたいとき、
普通はマルチスレッドにするものですか?
Linuxです。
452デフォルトの名無しさん:2007/11/23(金) 17:03:53
おおよそでいいならA5回ごとにB呼べば?
453451:2007/11/23(金) 17:16:07
>>452
そこまでは「およそ」じゃないんです。
リアルタイム性は要らない程度の意味でした。
設定秒数を渡して5秒とか1秒ってのは変わりうるので。
454デフォルトの名無しさん:2007/11/23(金) 17:40:44
んじゃ、sleepで1秒待つループを作って、設定秒数ごとにそれぞれを呼ぶと。
455デフォルトの名無しさん:2007/11/23(金) 17:42:29
for (unsigned cnt; ;) {
sleep(1);
++cnt;
if (cnt % intervalA == 0) A();
if (cnt % intervalB == 0) B();
}
456451:2007/11/23(金) 18:00:21
>>454-455
それだと、usleepなんかにして1秒の倍数じゃないときに駄目なんで。
457デフォルトの名無しさん:2007/11/23(金) 18:39:37
ひとつの処理にどれくらいの時間がかかるかと、
どれくらいの誤差まで許されるかが問題だな
458デフォルトの名無しさん:2007/11/23(金) 18:40:50
>>456
だからなんなんだw
455のソースをms単位に変更するだけじゃないか
459デフォルトの名無しさん:2007/11/23(金) 18:44:39
ns単位(ry
460デフォルトの名無しさん:2007/11/23(金) 18:59:33
まあ、マルチスレッド使えるんなら使うのが素直な気はする。
461デフォルトの名無しさん:2007/11/23(金) 22:10:54
すいません。
いきなりスコープ解決演算子を二つ続けて、関数を呼び出す意味が分からないのですが、
普通は [クラス名] :: [関数名]() のようにして、どのクラスのメソッドを呼び出しているか
指定する為に使うんですよね?
誰かクラス名が無い場合の意味を教えてください
462デフォルトの名無しさん:2007/11/23(金) 22:19:15
わからないままでいいんじゃないかなぁ
そこらへんは趣味の世界だし
463デフォルトの名無しさん:2007/11/23(金) 22:22:29
>>461
そのクラスに属していない、グローバルネームスペースの関数を呼び出すことを明示するために使う。
MFCのソースはその典型。
464デフォルトの名無しさん:2007/11/23(金) 22:23:41
>>461
どこのクラスにも名前空間にも属していない名前を明示的に指定したいときに使う。

void f(); //(1)

class Hoge
{
    void f(); //(2)

    void g()
    {
        ::f(); //(1)を呼ぶ
        f(); //(2)を呼ぶ
        this->f(); //(2)を呼ぶ
    }
};
465デフォルトの名無しさん:2007/11/23(金) 22:37:18
>>462->>464
ありがとうございます
なくても良かったんですね^^;
聞いて本当によかった。もうすぐ発狂するところでした。
466デフォルトの名無しさん:2007/11/23(金) 22:47:33
>>465
分かっているとは思うけど、「なくても良い」ではないよ。
>>464の(1)を呼ぶ例のように、場面によっては必要だからね。
467デフォルトの名無しさん:2007/11/23(金) 22:57:44
('∀`)そうだと思ってました本当です。
468デフォルトの名無しさん:2007/11/23(金) 22:58:29
>>465
>>464を読んで「なくても良かった」という結論はないな。
469デフォルトの名無しさん:2007/11/23(金) 23:42:39
無くてもいい場面も多いけどな
470デフォルトの名無しさん:2007/11/24(土) 00:11:40
簡単な使い捨てコードなら namespace 気にしないでもいいと思う。
かったるいし。
471デフォルトの名無しさん:2007/11/24(土) 22:04:08
質問です。
Visual Studio .NET 2005 C++ の WIN32 プロジェクトで、

TRACE("hogehoge="+hogehoge)

のように、自分用デバッグログを出力ウィンドウかどこかに出したいのですが、方法がわかりません。
標準出力に出力してもどこにも出力されていません(と思う)
どなたかご教授お願いいたします。
472デフォルトの名無しさん:2007/11/24(土) 22:19:47
>>471
基本はOutputDebugString。ただし引数は文字列の一つのみ。
CRTのデバッグルーチンも悪くないが、引数が真面目過ぎて多少面倒。
void dbgprintf (LPCTSTR fmt, ...)
みたいなのを自分で用意しておくのが無難じゃないかな。
473デフォルトの名無しさん:2007/11/24(土) 22:51:16
質問です。
C言語を使って構文解析ソフトCaboChaを使いたいのですが

ttp://chasen.org/~taku/software/cabocha/libcabocha.html
↑このサイトの通りに以下のプログラムを実行してみたのですが

Undefined symbol: cabocha_destroy_
Undefined symbol: cabocha_new_
Undefined symbol: cabocha_sparse_tostr_

↑このようなエラーが表示されてうまくできません。
どなたかわかるかたいらっしゃいませんか?

〜実行したプログラム〜
#include <cabocha.h>
#include <stdio.h>

int main (int argc, char **argv)
{
cabocha_t *c;
char p[1024] = "太郎は次郎が持っている本を花子に渡した。";

c = cabocha_new(argc, argv);

printf ("INPUT: %s\n", p);
printf ("RESULT:\n%s", cabocha_sparse_tostr(c, p));

cabocha_destroy(c);

return 0;
}
474デフォルトの名無しさん:2007/11/24(土) 22:54:04
csvファイルを読み込み、各データをint型の変数に代入するプログラムを作りました。
以下がソースです。
  ifstream fin;
  TCHAR line[252];
  LPTSTR buff[3];
  int result[64][3];
  stringstream ss;

  fin.open(_T("temp.csv"));

  if(!fin.is_open()) // 開いていなければ、FALSEを返す
  {
    return FALSE;
  }

  int i = 0;
  while (!fin.eof()){
    fin.getline(&line[0],sizeof(line));

    buff[0] = strtok(line,",");
    buff[1] = strtok(NULL,",");
    buff[2] = strtok(NULL,",");

    ss.str(""); //stringstreamをクリア
    ss << buff[0] << _T(" ") << buff[1] << _T(" ") << buff[2];
    ss >> result[i][0] >> result[i][1] >> result[i][2];

    //カウンタ
    i++;
  }

  fin.close();
475デフォルトの名無しさん:2007/11/24(土) 22:54:37
csvファイルの中身は以下のような並びになっています。
  2,2,49,
  2,4,0,
  ...
  2,46,27
  2,48,0

fin.close()のひとつ前の行でブレークポイントを入れると「アクセス違反」のエラーがでます。
i++の行でブレークポイントを入れると、i=0のときはうまくresult配列にデータが入ってくれますが、
i=1以降は、何も代入されないようです。
これを直す方法をご教授くださいませんか。
なお、今回のcsvファイルにはint型に代入するデータしかありませんが、
以下のような文字交じりのcsvファイルも使用したいので、string型の変数に代入する予定です。
  36,1,1,3,Orange,50,長崎
  24,1,2,2,Red,50,静岡
  ...
↑のプログラムがうまくいっていたら、stringstreamから>>演算子でstring型の変数に代入するつもりでしたが、
stringに代入するにあたって、何か注意するべき点がありましたら、ご教授ください
476デフォルトの名無しさん:2007/11/24(土) 22:55:44
>>473
「コンパイル方法」の項を読めば分かる
477471 :2007/11/24(土) 23:17:36
>>472さん
お答いただいてありがとうございます。

  OutputDebugString("hoge");

でコンパイルすると、

error C2664: 'OutputDebugStringW' : 1 番目の引数を 'const char [5]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。

とコンパイルエラーにになり(昔はでなかったような)、そこで

const char a[] = "hoge";
OutputDebugString((LPCWSTR)a);


とやってみたところ、コンパイルは通り、実行もできるのですが、残念ながらあいかわらずどこに"hoge"が出力されるのかわかりませんでした。
何か良い方法がありましたらお願いします。
478デフォルトの名無しさん:2007/11/24(土) 23:18:32
>>477
OutputDebugStringA
479デフォルトの名無しさん:2007/11/24(土) 23:51:42
OutputDebugString(_T("hoge"));
の方が好みだなー
480471 :2007/11/25(日) 00:00:46
>>478さん

OutputDebugStringA !!目から鱗ありがとうございます!!!

コンソールにも出したかったのですが、これは一応自己解決しましたのでご報告。

FILE *stream;
if (!::AttachConsole(ATTACH_PARENT_PROCESS)) { //XP以降はアタッチ
::AllocConsole(); //無理な場合は新たに開く
}
freopen_s(&stream, "CON", "r", stdin); // 標準入力の割り当て
freopen_s(&stream, "CON", "w", stdout); // 標準出力の割り当て

cout << "hoge" << endl;

::FreeConsole(); //アタッチ解放

以上です、ありがとうございました!
481デフォルトの名無しさん:2007/11/25(日) 00:02:56
イベントログに出力しちゃいなYO!
482473:2007/11/25(日) 01:26:22
>>473
自己解決しました
483デフォルトの名無しさん:2007/11/25(日) 13:11:04
    if ("a" < "b")
        cout << "ok" << endl;
    else
        cout << "ng" << endl;

この場合はokと表示されるのですが

    if ("aa" < "bb")
        cout << "ok" << endl;
    else
        cout << "ng" << endl;

この場合はngと表示されます。

aのほうが文字コードが小さいのでokと表示されることを期待しているのですが
なぜこうなってしまうのでしょうか?
484デフォルトの名無しさん:2007/11/25(日) 13:15:39
文字列リテラルを不等号で大小比較比較しても、それはただ文字列リテラルの値(=アドレス値)の
大小を比較しているだけだよ。
文字順の比較をしたければ strcmp などを使え。

上記の意味が分からなければ、まずはちゃんとした入門書などを読んだほうがいい。
485デフォルトの名無しさん:2007/11/25(日) 14:39:57
string
486デフォルトの名無しさん:2007/11/25(日) 15:45:20
>>483
それは文字列が格納されているメモリアドレスを比較してるだけ
文字列の内容を比較したいなら strcmp を使え
487デフォルトの名無しさん:2007/11/25(日) 16:09:55
>>483
つ[ std::string("aa") < std::string("bb")]
488デフォルトの名無しさん:2007/11/25(日) 16:17:47
構造体を色んなソースで使いまわしたいのですが上手くいきません。

 共通ヘッダ: typedef struct TAG TYPE_NAME;
          TYPE_NAME nantoka1;

   ソースA: struct TAG { int a; int b; };

   ソースB: nantoka1 = { 3, 5 }

こんな風にしてみたんですが、ソースBは 'TAG' を認識してくれません。
どうすればいいでしょうか
489デフォルトの名無しさん:2007/11/25(日) 16:27:38
>>488
共通ヘッダ:
 struct TAG { int a; int b; };
 extern struct TAG nantoka1;
ソースA:
 いらない。
ソースB:
 struct TAG nantoka1 = {3, 5}
 
490デフォルトの名無しさん:2007/11/25(日) 16:39:43
リンクが絡まりそうなヘッダだな。
nantoka1が必要なソースでexternするようにした方がいいと思う。
491488:2007/11/25(日) 17:05:02
489さんのやり方でやってみたら上手くいきました。ありがとうございます。
492デフォルトの名無しさん:2007/11/25(日) 23:01:29
ねーねー
連結リストの先頭のHeadをポインタで宣言しないのはどうして?
ポインタで宣言したほうが構造体分無駄にならなくなくない?
493デフォルトの名無しさん:2007/11/25(日) 23:03:56
boost初心者です。

以下がVC+2005ではコンパイル・実行できますが、Linux g++ 4.0ではコンパイル
できません。エラーコードはテンプレートだらけでよくわかりません。
何が違うのでしょうか?

#include <iostream>
#include <boost/bind.hpp>
using namespace std;
using namespace boost;

int someKeisan(int n1, int n2)
{
 return n1 * n2;
}

int main()
{
 cout << bind(someKeisan, _1, 10)(6) << endl;

 return 0;
}
494デフォルトの名無しさん:2007/11/25(日) 23:06:44
>>492
ポインタで宣言できるなら、そうすればいいんじゃないか?
むしろ、先頭用の構造体を持ってる実装のほうが珍しいと思うが。
495デフォルトの名無しさん:2007/11/25(日) 23:11:42
>>494
そうなの?
Googleとかで引っかかるサイトだと普通に宣言してるのが多いから
そういうもんかと思ってたよ
何にしてもありがとう
疑問が一つ解けたよ
496デフォルトの名無しさん:2007/11/25(日) 23:16:08
>>493
Cygwinでg++ 4.1.1だけどコンパイルできたよ。
497デフォルトの名無しさん:2007/11/25(日) 23:17:45
>>495
「連結リスト」でググって一番上にあるサイトからポインタで実装してるぞw
その次のはダミー作ってたけど。
498デフォルトの名無しさん:2007/11/25(日) 23:18:38
>>496
ヘッダーも存在してるし、
実装が未熟なんですかね?
499デフォルトの名無しさん:2007/11/25(日) 23:22:47
ちなみに
OS : Fedora Core 4
g++ 4.0.0でデフォルトのものを使ってます。

500デフォルトの名無しさん:2007/11/25(日) 23:26:35
>>499
boostを入れてないってことないか?
501デフォルトの名無しさん:2007/11/25(日) 23:29:22
>>500
functionやtokenizerは動作しますんで
boostは入ってると思います。
/usr/include/boostにhppファイルはあります。
502デフォルトの名無しさん:2007/11/25(日) 23:41:10
うちのFedora7でもだめだった。
503デフォルトの名無しさん:2007/11/26(月) 00:02:09
>>495
先頭要素が必ず存在するようにしたほうがコードを簡略化できるケースもあるから
あえてポインタではなく構造体を使用するということもあるよ。
よほど大きな構造体でない限り、高々1個を省略することは大きな意味はないから。
504デフォルトの名無しさん:2007/11/26(月) 00:22:16
>>502
そうですか。
tr1/functionalヘッダとtr1::placeholdersを指定しても
ダメでした。
VC++で我慢します。
505502:2007/11/26(月) 01:38:50
気になったんで試してみた。同じ g++でも環境によって違うみたい。FreeBSDでは成功した。
以下結果と環境だけ。エラーメッセージは長いので省きます。

[FreeBSD 6.2R : コンパイル成功]
>GNU C++ version 3.4.6 [FreeBSD] 20060305 (i386-undermydesk-freebsd)
> compiled by GNU C version 3.4.6 [FreeBSD] 20060305.
>GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096

[ Fedora7 : コンパイル失敗 ]
>GNU C++ version 4.1.2 20070925 (Red Hat 4.1.2-27) (i386-redhat-linux)
> compiled by GNU C version 4.1.2 20070925 (Red Hat 4.1.2-27).
>GGC heuristics: --param ggc-min-expand=98 --param ggc-min-heapsize=129178

[ Cygwin : コンパイル失敗 ]
>GNU C++ version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125) (i686-pc-cygwin)
> compiled by GNU C version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125).
>GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072


コンパイル失敗した二つは同じエラーが出てる。
>a.cpp:13: error: no match for call to ‘(boost::_bi::bind_t<int, int (*)(int, int), boost::_bi::list2<boost::arg<1>, boost::_bi::value<int> > >) (int)’
506503:2007/11/26(月) 01:49:36
boostのversionの問題かも。
以下boost/version.hpp 内の定義比較。

[FreeBSD 6.2R]
>#define BOOST_VERSION 103401
>#define BOOST_LIB_VERSION "1_34_1"

[Fedora7][Cygwin]
>#define BOOST_VERSION 103301
>#define BOOST_LIB_VERSION "1_33_1"

コンパイル成功したFreeBSDだけ、1_34_1 だ
507502:2007/11/26(月) 01:51:57
上ネーム欄間違い、503じゃなくて502。

これがboostのバージョンが原因なら、boostバージョンアップで解決するかもね。
508デフォルトの名無しさん:2007/11/26(月) 02:06:32
cout << bind(&someKeisan, _1, 10)(6) << endl;

にしたらどう?
509502:2007/11/26(月) 02:19:41
Cygwin に boost 1_34 入れてみたら、コンパイル通った。
なんか修正されたんだな。リリースノートどこにあるんだろ・・・。

とりあえずすっきりした。これで寝れる。

>>508
だめ。
510デフォルトの名無しさん:2007/11/26(月) 15:06:00
VS2005スレで聞いたほうがよいのか迷いましたが、まずはこちらで質問させてください
VS2005でC++を使って組んでいるのですが、「関数宣言はされているものの実態が存在しない」というリンクエラーが大量に出て困っています。
(私の言う関数とは、クラスの関数。つまりメソッドです)

自分で作ったのなら当然実体も定義するのですが、これは他人のソースで、さらにその人は「とりあえずヘッダに必要そうな関数をかたっぱしから宣言しておく」人のようです。

実体が存在しない関数に関しては「一度も呼び出した無い」そうで、コンパイルオプションだかで「一度も呼び出してない関数は、宣言もろとも無視する」ことができる(そうやって実行ファイルを作りテストした)そうなのですが、どうすればよいのでしょうか?
(残念ながら、そのソースを書いた人自身に質問することができないのです)
511デフォルトの名無しさん:2007/11/26(月) 15:08:02
>>510
警告じゃなくて?
512デフォルトの名無しさん:2007/11/26(月) 15:18:44
>>510
仮想関数の場合は実体は必要だけどね。
513デフォルトの名無しさん:2007/11/26(月) 15:19:50
まさかデフォルトコンストラクタ?
514デフォルトの名無しさん:2007/11/26(月) 15:22:34
>>511-513
すいません、自己解決しました
>>510は友人の悩みをヒアリングして私が(私の体験っぽく)書き込んだのですが、511の指摘で「確かに警告ならわかるんだけどなぁ」と思い私自身でソースを調べてみました。

単に友人が渡されてるlibファイルを組み込んでいないだけの話でした(ちなみにその関数はちゃんと呼び出されていました。呼び出されていたからこそ警告ではなくエラーとなっていました)
お騒がせしてすいませんでした
515デフォルトの名無しさん:2007/11/26(月) 15:25:21
>>514
そんなミスは誰でもよくやることですから気にしなくてよいのですよ。

と、ご友人にはお伝えください。
516493=504:2007/11/26(月) 15:41:12
boostを1.3.4にバージョンアップしたら
コンパイル・実行できました。
517デフォルトの名無しさん:2007/11/26(月) 23:15:38
すみません、くだらない質問なのですが
これまでマクロとか使ったことがなくて…教えてください。

#define IX(i,j) ((i)+(N+2)*(j))
と書かれていて
1次元の配列ポインタに x[IX(i,j)]
こう書かれていた場合、どこをアクセスしてるのでしょうか。

また
#define SWAP(x0,x) {float * tmp=x0;x0=x;x=tmp;}
これも意味がわかっていません。

おねがいします、助けてください
518デフォルトの名無しさん:2007/11/26(月) 23:21:23
>>517
落ち着いて展開すれば大丈夫。
x[ IX( i, j ) ]→x[ i + N + 2 * j ]
一次元配列を二次元配列のように扱う時に使ったりするかな?

SWAPのほうは単純に2つの値(float *)を入れ替えてるだけ。
SWAP( fp1, fp2 );とかけば
{ float * tmp = fp1; fp1 = fp2; fp2 = tmp; }
519デフォルトの名無しさん:2007/11/26(月) 23:34:20
ありがとうございます(;;
ものすごい優しく応えてくれて、なんかほんとに涙出てきました。

>一次元配列を二次元配列のように扱う時に使ったりするかな?
まさしくその通りです。
1次元配列の i+N+2*j ということですね。

{1 2 3 4
5 6 7 8
9 8 7 6
5 4 3 2} の場合 2段目の6にアクセスしたいとき N=4だから
IX(1,1) = 1+4+2*1 = 6 つまり、前から6番目の6にアクセスできますね!
ありがとうございます。。。ほんとようやくわかりました(;;

SWAPの方は、入る値は float * 型じゃないとダメ、ですよね?
これに1次元の配列ポインタが入ると、配列そのものが入れ替わる、ということですよね?

ほんと、、、わからなくて、悶々として、誰にも聞けなかったので
本当に助かりました。ありがとうございました(;;
520デフォルトの名無しさん:2007/11/27(火) 01:11:23
>>519
>これに1次元の配列ポインタが入ると、配列そのものが入れ替わる、ということですよね
単に変な文章になっているだけかもしれないけど、配列そのものが入れ替わるのではなく、
ポインタが指しているものが入れ替わるだけだよ。

int a[100], b[100];
int *p = a;
int *q = b;

SWAP(a, b); // コンパイルエラー
SWAP(p, q); // pがbを指し、qがaを指すようになる。a, bの実体は何も変わらない。
521デフォルトの名無しさん:2007/11/27(火) 14:42:13
最大で2000ほどの双方向リストがあるのですが
これを高速にソートするにはどういった方法があるのでしょうか?
頻繁にソートが呼び出されるのでバブルソートでいいものなのかどうなのか判断つきません
522デフォルトの名無しさん:2007/11/27(火) 14:51:15
マージソートとかクイックソートとか

頻繁の程度にもよるし、どの程度の遅さまで許容されるかにもよるし、
実際やってみて遅くなければ別にいいんじゃね?
523デフォルトの名無しさん:2007/11/27(火) 15:04:46
だからって、バブルソートなんか実装したら間抜けだけどな。
524デフォルトの名無しさん:2007/11/27(火) 15:11:55
頻繁にソートする必要があるのなら、常にソート済みの状態にしておくべき。
525デフォルトの名無しさん:2007/11/27(火) 16:36:22
マージソートでいってみようと思います
ありがとうございました
526デフォルトの名無しさん:2007/11/27(火) 18:19:50
普通に STL のソートじゃダメなの?
527デフォルトの名無しさん:2007/11/27(火) 21:00:21
Cなのかもしれないし、C++コンパイラは使えるけどSTLがないのかもしれない。
528wolf ◆8VH3XAqjlU :2007/11/27(火) 22:09:04
>>521
>>525

**** may be something complicated *****

strategy pattern
http://home.earthlink.net/~huston2/dp/strategy.html
529デフォルトの名無しさん:2007/11/28(水) 00:48:43
mapのキーに構造体を利用してデータを格納しているのですが、
[]を使用した際に想定した動きをしてくれません。
下記がそのソースです。

#include <iostream>
#include <map>
#include <string>

// キー
struct StaffKey {
int section;
std::string code;
};
bool operator <(const StaffKey& lhs, const StaffKey& rhs) {
return lhs.section < rhs.section || lhs.code < rhs.code;
}
// データ
struct StaffData {
std::string name;
};
// キーとデータを紐付ける
typedef std::map<StaffKey, StaffData> StaffMap;

void insert(StaffMap& staffs, int sect, const char* cd, const char* nm) {
StaffKey key = {sect, cd};
StaffData& data = staffs[key];
data.name = nm;
}
530529:2007/11/28(水) 00:49:27
int main() {

StaffMap staffs;
insert(staffs, 1, "ab123", "Taro");
insert(staffs, 2, "ab123", "Jiro");
insert(staffs, 1, "ab111", "Hanako");
insert(staffs, 1, "ab133", "Ken");

for (StaffMap::iterator it = staffs.begin(); it != staffs.end(); ++it) {
const StaffKey& key = it->first;
const StaffData& data = it->second;
std::cout << key.section << "," << key.code << ":" << data.name << std::endl;
}
std::cout << std::endl;
for (StaffMap::iterator it = staffs.begin(); it != staffs.end(); ++it) {
const StaffKey& key = it->first;
const StaffData& data = staffs[key];
std::cout << key.section << "," << key.code << ":" << data.name << std::endl;
}
}
531529:2007/11/28(水) 00:50:28
----------------
実行結果
----------------
1,ab111:Hanako
1,ab123:Taro
1,ab133:Ken
2,ab123:Jiro

1,ab111:Hanako
1,ab123:Taro
1,ab133:
2,ab123:Jiro

はじめにイテレータを用いて全件のダンプを出力しています。
次に、[]を使ってデータを取得&出力しているのですが、
一部のデータのみ値が取得できない状態に陥っています(ab133:Kenのデータ)
独学で勉強しており他の人に聞くことが出来ないため、どこがおかしいのか全く判りません。
どうか助力をお願いします

長々とすみません。
なお、環境はLinux + GCC4.1.2です。
532デフォルトの名無しさん:2007/11/28(水) 00:53:27
>>531
allocator が無いからじゃないかな?(綴り怪しいけど)
533デフォルトの名無しさん:2007/11/28(水) 00:58:09
>>529
> bool operator <(const StaffKey& lhs, const StaffKey& rhs) {
> return lhs.section < rhs.section || lhs.code < rhs.code;
> }

これが順序付けになってないっぽい。
↓これでいいかな?

if (lhs.section < rhs.section) return true; else if (rhs.section < lhs.section) return false;
return lhs.code < rhs.code;
534529:2007/11/28(水) 01:11:31
>>532
mapのテンプレート引数にstd::allocator<StaffKey> を追加してみましたが変わらずでした。
(見よう見まねに意味判らずやってます)

>>533
出来ました!!
||だとショートサーキットが有効になるので大丈夫だろうと思って深く考えていませんでしたが
やはり単純なミスだったんですね。。。

助かりました。どうもありがとうございました
535デフォルトの名無しさん:2007/11/28(水) 01:16:33
そもそも StaffKey::section の比較で両者とも同じだった(順序付けできなかった)場合に、
という仕様とは完全に異なるからな。
536529:2007/11/28(水) 01:27:07
右辺値のsectionと左辺値のsectionが等しかった場合の考慮がされていなかった
ってことですよね?
だから正しく順序付けが出来ず、key指定時にデータの特定が出来なかった。
537デフォルトの名無しさん:2007/11/28(水) 02:17:08
a.i.u.e.oとかa->i->u->e->o(以下果てしなく続く)のような
ながーい構造体とかポインタの参照は
コンピュータ内部では一つ一つ計算してたぐり寄せているのでしょうか?
仮にそうだとして10万くらい続いているとしたら
終わりのx->y->z ←こいつのポインタを持っておけば無駄が省けるのでしょうか?
538デフォルトの名無しさん:2007/11/28(水) 02:19:17
省ける
持っておけるなら。
539デフォルトの名無しさん:2007/11/28(水) 02:25:03
>>538
やはりそうでしたか
これでまた一つ疑問が解けました
ありがとうございました
540デフォルトの名無しさん:2007/11/28(水) 04:46:32
a.b.cの形は、オフセット計算だけで、コンパイル時に確定してるから無意味だよ。
a->b->cは間接参照で、実行時に中身を追うから、bに相当するポインタをtmpとして持つ意味があるけど。

もちろんこれはC/C++の話で、
他言語だとCの->に相当する部分で.を使用するから別の話になるし
配列として宣言して、あえて->を使う場合なんかはあてはまらないけどね。
541デフォルトの名無しさん:2007/11/28(水) 09:31:45
一時的に特定のキーボードのキー入力を受け付けなくする方法か関数を教えてください
542デフォルトの名無しさん:2007/11/28(水) 10:02:24
我慢する
543デフォルトの名無しさん:2007/11/28(水) 10:07:21
キーボードクラッシャーにお願いする
天皇陛下万歳
544デフォルトの名無しさん:2007/11/28(水) 10:08:20
キーを外してしまうのは確かに有効だな
545デフォルトの名無しさん:2007/11/28(水) 10:40:10
ああ、おれもPOWERキーとかWINキーとかは外してるな。
546デフォルトの名無しさん:2007/11/28(水) 12:01:54
こんにちは.改行制限で見難くなっていますがどうかお許しください.

シリアルポートの開け方について質問させてください.
環境は…Windows XP SP2,Borland C++ Compiler 5.5,言語はC言語です.
この環境で下のコードをコンパイルしようとするのですが,
C:\borland\bcc55\Include\winuser.h 4804: 宣言が正しく終了していない
C:\borland\bcc55\Include\winuser.h 4811: 型名が必要
という二つのエラーがでて,コンパイルできません.
winuser.hの該当箇所は, typedef struct tagINPUT{…} の部分です.
いろいろいじってみたのですが,どうも見当がつきません.どこがおかしいのでしょうか.
下のコードは,
ttp://www.geocities.jp/terukat/_geo_contents_/win/comm.html
ttp://members.jcom.home.ne.jp/0434383301/vc10.htm
ttp://plaza.harmonix.ne.jp/~ahoshino/vb/CreateFile.htm
を参考にしました.

#include<windows.h>
int main(void){
HANDLE hComm = CreateFile(
"COM1",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
return 0;
}
547デフォルトの名無しさん:2007/11/28(水) 12:05:11
>>546
bccで他にWinAPIを呼ぶプログラムを書いたことは?
それがあるならそれを参考に見直してみればいい。
そうでないなら、そういうサンプルを探せばいい。
548デフォルトの名無しさん:2007/11/28(水) 12:20:06
>>541
Ctrl + Alt Dlt を無視したいとかそういうアプリではどうにもならない割り込みのあれかな?
549デフォルトの名無しさん:2007/11/28(水) 12:34:00
>>546
>bcc32 a
Borland C++ 5.6.4 for Win32 Copyright (c) 1993, 2002 Borland
test.cpp:
警告 W8004 a.cpp 13: 'hComm' に代入した値は使われていない(関数 main() )
Turbo Incremental Link 5.66 Copyright (c) 1997-2002 Borland

BCB6だけどエラーが出ない

>>541
WindowsならCtrl+Alt+Deleteとかの特殊なの以外はキーフックで殺せる
550546:2007/11/28(水) 12:42:20
>>547
ありがとうございます.
APIプログラミングの経験はないです.
C言語とAPIでシリアルポートにアクセスしているプログラムのソースは
見つかったんですが,どこが違うのかわかりません.
他に必要な処理があるのかと思ったんですが,
私の力ではそのプログラムのなかからそれを見つけることができませんでした….

>>549
ありがとうございます.
私も今TurboC++で試してみたんですが,
同じ警告しかでませんでした.
うーん.なんででしょう.
551546:2007/11/28(水) 12:45:20
>>550に対する補記

Turbo C++ でならコンパイルできたということです.
552デフォルトの名無しさん:2007/11/28(水) 12:45:32
bcc55だと他にインクルードする必要があったりしてね。
553デフォルトの名無しさん:2007/11/28(水) 12:48:18
>>546
#include <windows.h> だけのソースもコンパイルできなかったりする?
554546:2007/11/28(水) 12:51:48
>>552
550で書いているソースがインクルードしていたものを
一応すべてインクルードしてみたんですが,だめでした….

>>553
コンパイルできなかったです.
555デフォルトの名無しさん:2007/11/28(水) 12:58:35
>>554
bcc5.5.1で>>546のソースコンパイルできたよ
ファイルが壊れてるかもしれんから、再インストールしてみ
556デフォルトの名無しさん:2007/11/28(水) 12:58:37
>>554
そりゃなんかおかしいね
bcc再インストールしてみた方がいいかもしんない
557546:2007/11/28(水) 13:20:32
再インストールをしてみたら,無事にコンパイルできました!
お騒がせしました.みなさん本当にありがとうございました!
558デフォルトの名無しさん:2007/11/28(水) 18:14:23
すいません、仮想関数とか継承とかで頭がこんがらがってきたので教えてください
仮想関数を含むオリジナルクラスを継承したクラスのインスタンスをnewしてそのポインタを
オリジナルクラスにキャストしてもう一度もとのクラスにキャストし直したもどした場合は
正常に動作するのですが、オリジナルクラスに仮想関数が含まれない場合はコンパイラエラーが出ます、
これは仮想関数を含むオリジナルクラスのインスタンスの場合だけそのクラスを継承したポインタにキャストできるということなのでしょうか?
この場合、オリジナルクラスのインスタンスには継承先の情報が無いと思うのですがどこから持ってきてるのでしょうか?

ついでにもうひとつお願いします
newでインスタンスを作成した場合deleteしなければ、プログラム終了まで有効なのでしょうか?
例えば関数の中でnewを行いクラスのポインタを変数に格納してそれを関数の引数として戻してnewを行った関数の外で使用しても
最後にdeleteさえすれば大丈夫なのでしょうか?

乱文失礼しましたが、よろしくお願いします。





559デフォルトの名無しさん:2007/11/28(水) 18:29:41
>仮想関数を含むオリジナルクラスのインスタンスの場合だけそのクラスを継承したポインタにキャストできる
dynamic_castの話なら、そのとおり。仮想関数を持たないクラスには働かない。
継承先の情報はインスタンスが隠し持ってる仮想関数テーブルに入ってる。
そもそもそれがなきゃ仮想関数の呼び先を解決できない。

deleteしなければプログラム終了まで有効。その続きのも大丈夫。
deleteし忘れてどんどんnewしてるとそのうちメモリを食い尽くすから要注意。
560デフォルトの名無しさん:2007/11/28(水) 18:54:52
>>559
回答、ありがとうございます。
これでやっと先にすすめそうです。
561デフォルトの名無しさん:2007/11/28(水) 18:59:42
最近deleteがdelegateに見えてしょうがないんだがもうダメなのか?
562デフォルトの名無しさん:2007/11/28(水) 19:04:58
だめだね。あの手の便利すぎる機能はプログラマの脳を破壊する。
563デフォルトの名無しさん:2007/11/28(水) 19:37:45
本物のプログラマは○○を使わない

【○○にはお好きな(またはお嫌いな)単語をお入れください】
564デフォルトの名無しさん:2007/11/28(水) 19:38:21
本物のプログラマはコンドームを使わない
565デフォルトの名無しさん:2007/11/28(水) 19:39:46
本物のプログラマは有給を使わない
566デフォルトの名無しさん:2007/11/28(水) 19:53:16
すいません、もうひとつお願いします。
関数内で仮想関数を含むオリジナルクラスを継承したクラスのインスタンスをnewでつくりそのポインタを
オリジナルクラスにキャストして関数の引数として返し、そのポインタをもう一度継承後のクラスにキャストした場合、
オリジナルクラスに存在しない継承後のクラスが持っているメンバ変数の値が維持されているのを確認できたのですが
この部分の値もずっと保持されるであってますか?
567デフォルトの名無しさん:2007/11/28(水) 20:03:54
- 本物のプログラマは有給を使わない
+ 本物のプログラマは有給を使えない
568デフォルトの名無しさん:2007/11/28(水) 20:11:30
>>563
そういうネタはマ板の方がいいんじゃね
569デフォルトの名無しさん:2007/11/28(水) 20:13:07
>>566
合ってる
ポインタをいくらキャストしてもインスタンスの実際のクラスが変わったりはしない
570デフォルトの名無しさん:2007/11/28(水) 20:31:14
>>569
回答、ありがとうございます
571デフォルトの名無しさん:2007/11/28(水) 20:36:46
本物のプログラマは言葉を使わない
572デフォルトの名無しさん:2007/11/28(水) 21:05:56
>>566
それはダウンキャストと言うのは知ってるね
dynamic_castは何をしようとするのかプログラマが知ってる限り
問題はない
573デフォルトの名無しさん:2007/11/28(水) 21:24:52
どうでもいいけど(いや、よくないけど)関数が返す物は引数じゃないんじゃね?
574デフォルトの名無しさん:2007/11/28(水) 23:00:01
3つほど質問させてください

・C++にはキャストがいくつかありますが、それぞれの役割がよく分かりません。詳説願います。

・inline関数についてですが、同一ソース中でないとinline展開されえないですか?

・演算子オーバーロードにおいて左オペランドに自作関数をとる演算子等を定義する場合、
通常のメンバ関数のような形式で定義するのと通常のグローバル関数のような形式で定義するのにはどのような違いがありますか?
bool Foo::operator +(Foo rhs)とbool operator +(Foo lhs,Foo rhs)みたいなののことです

よろしくお願いします
575デフォルトの名無しさん:2007/11/28(水) 23:09:03
576デフォルトの名無しさん:2007/11/28(水) 23:31:54
>>574
オブジェクト間最適化機能のあるコンパイラなら、別のコンパイル単位にある関数でも
インライン展開され得る。
577デフォルトの名無しさん:2007/11/28(水) 23:41:11
■キャスト
詳説せず、厳密さも気にせず簡単にまとめるとこんな感じ。
・const の付け外し→const_cast
・標準変換、およびその逆変換→static_cast
・安全な downcast や crosscast→dynamic_cast
・A→B→Aで戻る以外は実装依存→reinterpret_cast

■inline
同一ソースって何?
規格上は基本的に同一翻訳単位に inline 関数の定義がないと駄目だし(ただし定義前に呼び出しがあってもOKと書いてあった)、翻訳単位間で定義が一致する必要がある。
最適化としての inline 化なら最近は >576 らしい。Exceptional C++ Style にもそんなことが書いてあった。

■演算子オーバーロード
×自作関数
○自作クラス
だとして、メンバ関数にすると第 1 引数がその自作クラスの場合に限定される。
例えば、Foo() + 1 はどちらでも実現可能だけど、 1 + Foo() はメンバ関数で実現することができない。
578デフォルトの名無しさん:2007/11/28(水) 23:46:00
ごめん。
>左オペランドに
って明示してあった。
その場合は、operator+() が class Foo が定義されている namespace 内で定義されている限りはほとんど変わらないと思う。
もちろんメンバに対するアクセス制限は異なるけど。
579デフォルトの名無しさん:2007/11/29(木) 01:07:40
質問があります。
C言語(linux gcc)にて、テキストファイルの指定した一行を読み込んだ後に、
その行を削除する処理を行いたいのですが、何か手立てはありませんでしょうか?

無理言って申し訳ないのですが、別ファイルに指定行以外をコピーした後ファイルのリネームを行う、
もしくはメモリにファイル内容を確保し、指定行以外をファイルに上書きすると言う手法以外で
何か解決手段をご教授いただければと思います・・・。
よろしくお願いします。
580デフォルトの名無しさん:2007/11/29(木) 01:09:48
削除するってことは、その削除した部分を埋めるように後ろのデータをずらしてくるってことだ
つまり、それをやればよい
581デフォルトの名無しさん:2007/11/29(木) 01:54:00
後ろのデータを前にずらしながら書き込んで、最後にファイルサイズを小さくするのを忘れないでね。
582デフォルトの名無しさん:2007/11/29(木) 02:16:17
そうは言うがな大佐、メモリに読み込まずにどうやってずらすというのだ。
583デフォルトの名無しさん:2007/11/29(木) 07:37:02
一文字ずつ読んでシーク位置を一定数戻して書くを繰り返す
それでは時間がかかるので適当なバッファを用意してある程度まとめて読んでまとめて書く

て定石はさておいて
メモリに読み込まずにずらす方法を考えようか
アセンブラでレジスタだけ使ってどうにかならんかね
584デフォルトの名無しさん:2007/11/29(木) 07:58:01
>>575-578
サンクスサンクスサンクス
参考になりますた
585デフォルトの名無しさん:2007/11/29(木) 08:11:39
今までの常識を打ち破る画期的なファイルシステムを創造すればよくね?

例えば、ブロック単位で読み書きするのではなく
1バイトごとにリスト構造にして持つとか。
586デフォルトの名無しさん:2007/11/29(木) 08:18:51
テキストファイルやめてデータベースにすればいいとおもうよ
587デフォルトの名無しさん:2007/11/29(木) 12:32:01
そのファイルをメモリにマップしてmemmove
588デフォルトの名無しさん:2007/11/29(木) 20:35:17
VC++ 6.0 WinXP ともに ProEditionで開発しています。
DLLを作成し、そのDLLの関数にCWnd型(MFCのやつです)のポインタを渡そうと思って、次のようなコードを書いてみましたが、
上手く渡りません。問題としてはCWnd::m_hWndの値が変わってしまうというものです。
以下にコードをあげます。

//DLL
void CTestClass::TestFunc(CWnd* pWnd)
{
TRACE(_T("TestFunc 0x%08x \n"), pWnd->m_hWnd);
}

//EXE
void CTestDialog::OnOK()
{
CTestClass test;
TRACE(_T("OnOK 0x%08x \n"), m_hWnd);
test.TestFunc(this);
}

このようにして、処理を行うと出力されるm_hWndの値が変わってしまいます。
理由をご存知の方がいらっしゃいましたら、教えてください。
よろしくお願いします。
589デフォルトの名無しさん:2007/11/29(木) 20:50:59
CTestDialogで新しくm_hWndメンバ変数を作っちゃったとか?
590デフォルトの名無しさん:2007/11/29(木) 20:54:35
C言語で最後がNULLで終わっている双方向リストを
マージソートするにはどうすればいいのでしょうか?
普通のマージソートなら出来るのですが
双方向の場合どうすればいいのか解りません;;
591デフォルトの名無しさん:2007/11/29(木) 21:31:42
逆向きのリンクを気にせず、単方向リストとして扱いながらソートする
その後、ソートしたリストを順方向に辿りながら、逆向きのリンクを張りなおす
592デフォルトの名無しさん:2007/11/29(木) 21:59:51
>>591
おおー、その発送はありませんでした
無事できましたありがとう^^
593デフォルトの名無しさん:2007/11/29(木) 22:31:14
テキストがUNICODEなら、削除する文字を、
ZERO-WIDTH系の文字に置換しとけばよくね?
594デフォルトの名無しさん:2007/11/29(木) 22:34:42
>>589
回答ありがとうございます。ですが、それは違いました。
595デフォルトの名無しさん:2007/11/29(木) 22:42:35
それぞれ見ているMFCが、DLL->DLL版MFCで
EXE->スタティクリンクしたMFCで違う、みたいな話ではない?
596デフォルトの名無しさん:2007/11/29(木) 23:07:08
TRACE(_T("TestFunc 0x%08x 0x%08x \n"), pWnd->m_hWnd, &(pWnd->m_hWnd));
TRACE(_T("OnOK 0x%08x 0x%08x \n"), this->m_hWnd, &(this->m_hWnd));
とりあえずDLL,EXE両方が同じアドレスを参照出来ているかを確かめてみようか。
597デフォルトの名無しさん:2007/11/30(金) 00:26:19
VC6で開発しています。
あるISequentialStreamのオブジェクトstreamにデータが入っていて、Readメソッドで
vector< char > buf;
buf.reserve( MAX );

for ( 読み終わるまでループ ) {
 buf.resize( buf.size() + size );
 stream.Read( &buf[ 0 ], size, read );
}

のように、size単位でデータをバッファに格納しようとしています。
データのサイズは1KB〜130MBほど、MAXは余裕をもって150MB、sizeは1MBです。
このstreamはあるライブラリ(Soap Toolkit 3.0)で提供されているもので、内部の実装は
どうなってるかわかりません。
上記でデータ自体は取ってこれるんですが、非常に時間がかかってしまいます。
3GHz、2GメモリのPCで3分とか…。
メモリに格納するだけでこんなに時間がかかる訳ないと思うんですが、Readのやり方が
間違っているのでしょうか?
sizeが1MBなのは、小さいサイズのデータの方がほとんどで100MBクラスはまれである
ということと、

buf.resize( MAX );
stream.Read( &buf[ 0 ], MAX - 1, read );

のように、一回で全部読み込もうとしたときに、Readの返値のHRESULTが不明なエラーを
示す値を返し、readが0になるという現象が起きるのが理由です。
この原因もわかってないです。
ISequentialStreamとかは使ったことないので、どう使うのが正しいのかよく分からない状況です。
教えていただけると助かります。よろしくお願いします。
598デフォルトの名無しさん:2007/11/30(金) 02:42:18
>3GHz、2GメモリのPCで3分とか…。
そんなものだよ。正常。
599デフォルトの名無しさん:2007/11/30(金) 03:15:23
ストリームが読み取るデータを用意するのに時間がかかっているんじゃないの?
600デフォルトの名無しさん:2007/11/30(金) 14:58:28
>>595,596
sizeof(CWnd)を出力してみて、違う値が出てきたので、色々確認した結果、
>>595さんの言う通りの話でした。

ありがとうございます。
601デフォルトの名無しさん:2007/11/30(金) 20:29:34
9,6,4,7,12,14,1,11,10,15,3,5,8,13,2を小さいものから順に並び替える関数です。

0 #include<stdio.h>
1 void quicksort(int x[],int n){
2 int m;
3 int *pa=x+2. *pz=x+n
4 if(n==2){
5 if(x[1]>x[2])m=x[1],x[1]x[2],x[2]=m;
6 return;
7 }
8 while(pa<pz){
9 while(pa<=x+n && *pa<x[1])pa++;
10 while(pz>=x+2 && *pz>=x[1])pz--;
11 if(pa<pz)m=*pa, *pa++=*pz, *pz--=m;
12 }
13 if(pa>x+2)m=x[1],x[1]=*(--pa),:pa=m;
14 if(pa-x>2)quicksort(x,pa-1-x);
15 if(x+n-pz>1)quicksort(pz.x+n-pz);
16 }

これの8〜12行目の部分は、9行目で前から数列の6,4,7,12まで進み、
10行目で後ろから2まで進み、12と2を交換するという意味であってますか?
602デフォルトの名無しさん:2007/11/30(金) 21:44:31
再発明やめてqsortを使えばいい
603デフォルトの名無しさん:2007/11/30(金) 22:06:45
何かと思えば行番号か
604デフォルトの名無しさん:2007/11/30(金) 23:54:11
今日からC言語の勉強を開始しようと思っていますが、初心者でも使いやすい
コンパイラーあれば、教えて頂けないでしょうか?
ちなみにVisual C++ 2005 Express Edition持ってます、使えますでしょうか?
605デフォルトの名無しさん:2007/11/30(金) 23:57:53
それで充分。
606デフォルトの名無しさん:2007/11/30(金) 23:58:46
うむ
607デフォルトの名無しさん:2007/12/01(土) 00:03:29
早速使ってみました。
とりあえずコピペで、ちゃんとコンパイルできるか見てみましたが、
エラーなにがおかしいですか?

// test.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
int i;

for(i = 0; i < 10; i++)
printf("i = %d\n", i);

printf("end.\n");

return 0;
}
608デフォルトの名無しさん:2007/12/01(土) 00:05:09
日本語でおk
609デフォルトの名無しさん:2007/12/01(土) 00:14:15
>>608 すまなかった
Visual C++ 2005 Express Editionのプロジェクトを開けて、コード記入する欄が
できたので、上のように試しにコードを貼り付けして デバッグというボタン押したら、
エラーになりました。コードのどこがおかしいのでしょうか
610デフォルトの名無しさん:2007/12/01(土) 00:24:47
エラー内容書かない理由は?

stdio.hをincludeしてないからだと思うけど
611デフォルトの名無しさん:2007/12/01(土) 00:34:17
ありがとうございます。

#include"stdio.h"と入力すればよろしいでしょうか
612デフォルトの名無しさん:2007/12/01(土) 00:35:51
コード書く前に基本的な勉強しろ
613デフォルトの名無しさん:2007/12/01(土) 00:44:13
また「エラーになりました」か。
死んでほしいな、こういうヤツ。
614デフォルトの名無しさん:2007/12/01(土) 03:28:40
関数 kansu()があるとします はじめにkansu_init()を使ってデータを生成したとしてkansu()でも使えるようにするにはどうしたらいいですか?
グローバル変数にして使いたいのですが
615デフォルトの名無しさん:2007/12/01(土) 03:29:52
組み合わせnCr=n!/r!(n-r)!を計算するプログラムでポインタを使って値を返さないものを作らなきゃいけません。

void (int x, int *pt)
{

int i;

i = 0; *pt = 1;
while (i < x) {
++i; *pr = *pt * i;
}
printf("factorial called, %3d!=%12ld\n", x, *pt);
}

最初の定義をこんな風につくったんですがダメなとこを指摘してください。
616614:2007/12/01(土) 03:31:05
関数内でグローバル変数を定義することは出来ませんか?
617デフォルトの名無しさん:2007/12/01(土) 03:35:54
>>615
>void (int x, int *pt) 
関数の名前がない

>>616
関数の外でグローバル変数を定義すればいいじゃん
何か問題があるのか?
618614:2007/12/01(土) 03:37:00
>>617
わかりました 外に定義します
619デフォルトの名無しさん:2007/12/01(土) 03:42:11
>>616
そもそもグローバル変数が何かをわかってないだろ。
620615:2007/12/01(土) 03:43:09
>>617
void factorial(int x, int *pt);
こうですか
621デフォルトの名無しさん:2007/12/01(土) 03:57:01
Visual C++ 8 で Win アプリを作りながら勉強しようと思ってるんですが、
Cの標準ライブラリの関数を使おうとしたら色々とエラーが出てきました。
で、MSDNを読んでみたら、

1. 標準関数の strlen とかは危険だから _strnlen_l みたいなVCの独自関数を使え。
2. WinAPI は char の時代は終わったから TCHAR や _tcs 系の関数を使え。

ってことが書いてありました。
警告を減らせば char 型やCの標準関数も使えるみたいですが、
このままVC独自色に染まってしまった方が良いのでしょうか?
622デフォルトの名無しさん:2007/12/01(土) 04:10:05
counter=i;


for (counter=i ;counter<=i+9;counter++) {・・・

for文が苦手です。この一文はどういうふうに解釈してよいか
わかりません。解説して頂けないでしょうか
623デフォルトの名無しさん:2007/12/01(土) 04:16:41
for( 式1; 式2; 式3 )
{

}



式1
while( 式2 )
{

式3
}

と殆ど同じ。
こうすればわかるか?

counter=i;
while( counter <= i+9 )
{
/* 何か */
counter++;
}
624デフォルトの名無しさん:2007/12/01(土) 04:19:07
実行してみればいいじゃん、どうなるか
625デフォルトの名無しさん:2007/12/01(土) 04:25:29
>>621
なるべく標準的にしたいなら標準で
速度を優先したいならWindows APIなどで
626デフォルトの名無しさん:2007/12/01(土) 05:17:00
>>621
なぜstrlenが危険といわれるのか?scanfやprintf、strcpyなどもそう
なぜcharを使用しなくなったのか?
それをちゃんと知っておいたほうがいい。
VC色に染まってもいいが、VC以外で開発するときに代替案がすぐに
浮かぶようであれば問題ないと思う。
標準準拠を目標にして自作するのもいいし、危険とされる関数を
ラッピングして安全なものを作るのでもいい(←この時はpragmaで警告抑制)
627デフォルトの名無しさん:2007/12/01(土) 06:55:28
MSDNの売り文句そのままですが、
標準関数は関数の方でバッファサイズをチェックしてなかったり文字列が '\0' で終了していないと止まらなかったりで危険。
VC 版は必ずバッファサイズと最大長を指定させていて、文字列が長すぎたりする時は途中で打ち切ってくれるので安全。
ってことですよね。

char は...Win9x は内部的に char 型だったけど最近のXPとかは内部的に UNICODE だから?

一緒に買ってきた教科書には当然のごとく _strnlen_l とか何にも載っていないんですが、
VC流で勉強しても教科書探しとか他の人との情報交換とかの妨げにならないか心配です。
628デフォルトの名無しさん:2007/12/01(土) 07:27:17
安全なバッファサイズと最大長はどこからやってくるのか問い詰めたい
629デフォルトの名無しさん:2007/12/01(土) 07:39:53
size_t strlen (const char * str){
const char *eos = str;
while( *eos++ ) ;
return( eos - str - 1 );
}
koeeeee!!!
630デフォルトの名無しさん:2007/12/01(土) 07:41:22
size_t strnlen(const char *str, size_t maxsize) {
size_t n;
for (n = 0; n < maxsize && *str; n++, str++);
return n;
}
よs
631デフォルトの名無しさん:2007/12/01(土) 07:43:47
引数に渡すバッファサイズはバッファの確保時点で決まるはずだし、
打ち切って欲しい長さはやりたいことやプログラムの仕様によって決まるはず。
例えば文字列が100文字未満か100文字以上かで分岐させたいとき、
strlen だと'\0'が見つかるまで暴走を続けるが
strnlen_lなら「とりあえず100文字目までに'\0'はなかった」と帰ってきてくれる。
それ以外の場合でも「これ以上長いのは怪しいから扱いません」って断れるはず。
632デフォルトの名無しさん:2007/12/01(土) 07:44:50
それが安全だと思い込むことの方がよっぽど危険なんだが。
633デフォルトの名無しさん:2007/12/01(土) 07:58:09
それは詭弁
634デフォルトの名無しさん:2007/12/01(土) 08:01:06
普通のstrlenと最大バッファ長指定のstrlenどっちがより安全かと言う話で
しかもその為のコストは極僅かときたもんだ
少なくともその部分でのオーバーフローの可能性は無くなる
まぁ大抵の人はこんなもの出る前から自作のセーフなライブラリ作って使ってたけどね
635デフォルトの名無しさん:2007/12/01(土) 08:11:35
詭弁君をひさしぶりにみた
636デフォルトの名無しさん:2007/12/01(土) 08:24:28
質問です。
123456.jpg
123.jpg
このようファイル名の、数字のところだけを抜き出したいんです。
数字のところの長さは変わります。
そこでとりあえず、
char argnum[10];
hogeStrcpy(argv[1], argnum);
void hogeStrcpy(char *origin, char *number){
int i;
for(i = 0; origin[i] != '¥x2e'; i++){
number[i] = origin[i];
}
}
みたいなださださな物を書いてみたのですが、
引数の数字が短かかった場合、表示するとargnumにゴミが残ってしまいます。
なんとか数字だけをコピーしたいのですが、何か良い方法はないでしょうか?
637デフォルトの名無しさん:2007/12/01(土) 08:28:06
>>633は一体何が誤りだと言ってるんだ?
638デフォルトの名無しさん:2007/12/01(土) 08:35:55
>>636
atoi("123456.jpg")とかじゃなくて?
そうでないならsscanf("123456.jpg", "%[^.]", buf)って話かな。
639デフォルトの名無しさん:2007/12/01(土) 08:52:40
思い込むもなにもstrlenとstrnlen_lどっちが安全ってstrnlen_lに決まってるべ。
strnlen_lが十分に安全じゃなかったとしても、strlenはそれ以上に危険なんだから。
640デフォルトの名無しさん:2007/12/01(土) 09:02:09
>>638
atoi完全に存在を忘れてました。
ありがとうございます。
641デフォルトの名無しさん:2007/12/01(土) 09:05:29
>>636

>引数の数字が短かかった場合、表示するとargnumにゴミが残ってしまいます。

文字列の長さがargnumの配列サイズ以下、ってことか?
argnumを初期化するか、hogeStrcpyの最後で'\0'を入れればいい。
642636:2007/12/01(土) 09:34:44
>>638
>>641
すいません。atoiでは駄目みたいです。
やりたいことは、
絶対パス
/usr/boku/graphic/123456.jpg
/usr/boku/graphic/1234.jpg
で渡される引数を、
/usr/boku/graphic/123456
/usr/boku/graphic/1234
で切り出して、
/usr/boku/graphic/123456hoge.jpg
/usr/boku/graphic/1234meso.jpg
みたいな感じで書き出したいんです。
/usr/boku/graphic/123456
/usr/boku/graphic/1234
の長さが変わるので、
配列argnum以下の長さだった場合、
argnumにゴミが残ってしまうんです。
で、別に文字列として表示する訳ではないので、
argnumを0で初期化したり、最後に'¥0'を入れたとしても、
/usr/boku/graphic/12345600hoge.jpgや
/usr/boku/graphic/12340000meso.jpg
みたいになるんじゃないかなと。
何か良い方法はないでしょうか?
643デフォルトの名無しさん:2007/12/01(土) 09:39:25
>>642
"0"と'\0'は違う。
ヌルターミネートでぐぐれ
644デフォルトの名無しさん:2007/12/01(土) 09:58:37
グラフィックを使うために、
Borland 用のGRWINをインストールしました。

#include <stdio.h>
#include "GrWin.h"


int main(){
GWinit();
GWopen(0);
GWindow(-1,-1,1,1);
GWline(-1,-1,1,1);
}

のプログラムのコンパイルが通りません。


Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル '_GWinit' が未解決(C:\BORLAND\PRG\GRWIN\DEBUG\MAIN.OBJ が参照)
Error: 外部シンボル '_GWopen' が未解決(C:\BORLAND\PRG\GRWIN\DEBUG\MAIN.OBJ が参照)
Error: 外部シンボル '_GWindow' が未解決(C:\BORLAND\PRG\GRWIN\DEBUG\MAIN.OBJ が参照)
Error: 外部シンボル '_GWline' が未解決(C:\BORLAND\PRG\GRWIN\DEBUG\MAIN.OBJ が参照)

** error 1 ** deleting Debug\grwin.exe

インストールがちゃんとできてないんでしょうか??


645デフォルトの名無しさん:2007/12/01(土) 10:04:51
>>644
libはちゃんとリンクしてんの?
646デフォルトの名無しさん:2007/12/01(土) 10:09:18
>>645
それはなんですか?Includeフォルダには grwin.hがインストールされてますが・・・・
647636:2007/12/01(土) 10:14:28
>>643
アルェー。
ビックリ。
出来てしまいました。
ヌルターミネートって何なんですか?
調べた限り、¥0との違いが良くわかんなかったです。
配列に文字列を代入した場合、0が続くと文字の終端になる?
1230000000005みたいな物だった場合もうまくいくのは何故ですか?
648デフォルトの名無しさん:2007/12/01(土) 10:16:07
>>646
自分の環境くらい晒してくれ
grwinは使ったことないが、
http://gimite.net/bcbqtree/qtreemain.cgi?mode=thread&thread=753
とか見る限りヘッダには宣言しかされてなくて、libファイルをリンクしないと駄目なんだろ、たぶん
649デフォルトの名無しさん:2007/12/01(土) 10:22:30
>>648
リンク先みたらわかりました!助かりました。
ありがとうございました
650デフォルトの名無しさん:2007/12/01(土) 12:22:39
char *ch;
int i;

で定義したchar型のデータに変数を代入したいんですが、どうすればいいですか?

pt = "ほげほげ";

はできるんですが、 

ほげほげ i みたいに変数の値も代入するやりかたがわからないです
651デフォルトの名無しさん:2007/12/01(土) 12:23:10
pt = "ほげほげ";


ch = "ほげほげ";

でした
652デフォルトの名無しさん:2007/12/01(土) 12:23:25
>>647
'0'は、0の文字コードをあらわします。(値としては0x30)
'\0'は、値として0をあらわします

文字列と言うのは、char型の配列であるので、
たとえば、"1230005"と言う文字列は、

31,32,33,30,30,30,35,0

と言う風に入っていると考えれば大体問題ないかと

ちなみに、 ""で括るのと、''で括るのでも意味が違うので、注意してください。
653デフォルトの名無しさん:2007/12/01(土) 12:35:08
>>650
>char *ch;
これは、char型のポインタです。char変数のアドレスもしくは、
配列の先頭アドレスを入れるものです。

>ch = "ほげほげ";
これは、わかりやすく言うと、実行プログラム中に、
"ほげほげ"という文字列が確保されていて、
そこの先頭アドレスをchに代入しているだけのことです。

>ほげほげ i みたいに変数の値も代入するやりかたがわからないです
いまいちやりたいことがわからないのですが、
変数の値を文字列にして、ほげほげのあとに追加するのなら、
charの配列をある程度確保しておいて、そこに、ほげほげをコピーして、
その後ろに文字列に変換した数字をコピーすればいい。

なんにせよ、ポインタをきちんと理解しておいたほうがいいですよ。
654デフォルトの名無しさん:2007/12/01(土) 12:51:35
>>653
文字列をグラフに印字する関数に、文字列を渡すんです。

char a[2] ;

a[0]='A';
a[1]=i;

として、iをfor文でまわして、A1 A2 A3みたいにしたいんですが、こうすると
Aのあとに変な記号が出てしまいます
655デフォルトの名無しさん:2007/12/01(土) 12:54:07
>>654
文字列を充分理解してない
char a[3];
a[0] = 'A';
a[1] = i + '0';
a[2] = '\0';
656デフォルトの名無しさん:2007/12/01(土) 12:56:40
>>655
なるほど
a[1]で、i+'0'としてるのはなぜですか?
657デフォルトの名無しさん:2007/12/01(土) 13:01:23
>>656は、>>652からアンカーをさかのぼっていっても良いし、
もしくは、ヌルターミネーターで調べても良い。
658デフォルトの名無しさん:2007/12/01(土) 13:02:48
ああ、すまん。そっちか。

この場合は、>>652を参照なのは確かだが、ヌルターミネータは関係なかった。
659デフォルトの名無しさん:2007/12/01(土) 13:13:15
>>656
文字コード表では文字0〜9の文字コードは連続してる。
'0'は整数0x30
'1'は整数0x31
'2'は整数0x32



'9'は整数0x39
660デフォルトの名無しさん:2007/12/01(土) 13:14:25
>>659
なぜプラスしないといけないんでしょうか?
661デフォルトの名無しさん:2007/12/01(土) 13:18:28
>>655
一般的にchar型に入れる文字コード上で、
数字を表す文字'0'〜'9'は連続した数値で表される
'0' = 48
'1' = 49
'2' = 50
(以下略)
だから、iが10進で一桁であれば、'0'+iで該当の文字コード(数値)が得られる
○ i=2の時に、2を'2'に変換
'0'+i = 48+2 = 50 = '2'

iが0〜9で無い場合(10以上とか負数とか)であれば
charの配列とitoaやsprintf辺りを使う。

char str[256];/* 全体で255文字まで保存出来る領域) */
char *ch;
int i;

ch = "hoge";

sprintf(str, "%s%d", ch, i);

「char str[256]」と「char *ch」の違いについては、また別途調べてみ。
662デフォルトの名無しさん:2007/12/01(土) 13:23:50
>>661
分かりました。ありがとうございました。
663デフォルトの名無しさん:2007/12/01(土) 14:25:24
例えば、1分経つと数字が一つずつ増え(1,2.3・・・) それを1時間ごとにその時間の数字の平均値を
for文のループを使って計算させるには、どういう風に
書けばいいんだろう? もし、書けるとしたらこれは無限ループってことになるよね?

俺のイメージだとfor(i=0; i>=0; i++)
{平均値を求めよ}
664デフォルトの名無しさん:2007/12/01(土) 14:32:18
>>663
よく意味がわからないが最初は1個の数字、1分後には2個の数字さらに1分後は3個の数字
ってなるなら無限ループにならないでその数字の数のMAXとればいいだけじゃね?
665デフォルトの名無しさん:2007/12/01(土) 15:09:01
>>661
iが10以上の時もできるようにしたんですが、
一番最後のiの時だけおかしいです。
666665:2007/12/01(土) 15:16:27
できました。すいません!
667デフォルトの名無しさん:2007/12/01(土) 15:35:24
詰まらん質問ですが

void Func()
{
 return;
}

void Func()
{

}

この二つの関数の実行速度は同じですか?
668デフォルトの名無しさん:2007/12/01(土) 15:41:39
>>667
うん
669デフォルトの名無しさん:2007/12/01(土) 15:44:02
a=0;
LABEL:
if(a>10000)goto END;
a++;
goto LABEL:
END:

for(a=0;a<=10000;a++);

の速度は同じですか?
670デフォルトの名無しさん:2007/12/01(土) 15:51:53
最適化によってループが消えるかもしれないから何ともいえない
671デフォルトの名無しさん:2007/12/01(土) 15:57:11
a=0;x=0;
LABEL:
if(a>10000)goto END;
a++;x+=3:
goto LABEL:
END:
printf("%d",x);

x=0;for(a=0;a<=10000;a++);x+=3;printf("%d",x);

はどうですか
672デフォルトの名無しさん:2007/12/01(土) 15:57:52
コンパイラにとっては素直な書き方をした方が最適化しやすいと言われている
673デフォルトの名無しさん:2007/12/01(土) 16:00:01
>>671
それは後者の方が速いと思う
なぜなら前者はループの中でx+=3してるが後者はループの中が空っぽ
674デフォルトの名無しさん:2007/12/01(土) 16:03:09
x=0;for(a=0;a<=10000;a++)x+=3;printf("%d",x);はどうなりますか
675デフォルトの名無しさん:2007/12/01(土) 16:07:30
知らん
実際にやって測ってみろ
676デフォルトの名無しさん:2007/12/01(土) 16:09:42
他人様の手を煩わす前にやるべき事があるんじゃないのかと。
677デフォルトの名無しさん:2007/12/01(土) 16:11:07
>>674
頭にウンコがのってるよ
678デフォルトの名無しさん:2007/12/01(土) 16:18:40
>>663 です 言葉足りなくてすいません。
例えば、1分ずつ時間が経つと数字も1増えるとしたら、
   最初の1時間は  1〜60と数字が増えていきます。
これを時間ごと平均値を出すように命令したいので、60で割った計算をさせる

2時間目は数字は61〜120までなので、これらをすべて足して60で割る計算を
させる。

こんな感じの命令文作るとしたら、どんな文を作ったらよいか思ったのです。
で、もし、作ることができるなら、何時間後までやって下さいという命令文で
なければ、無限ループになるのではと思ったのです。
679デフォルトの名無しさん:2007/12/01(土) 16:21:41
>>674
うちのコンパイラが生成したコードを見てみると
movl    $LC0, (%esp)
movl    $30003, %edx
movl    %edx, 4(%esp)
call    _printf
計算済みの答え30003が即値で渡されている
680デフォルトの名無しさん:2007/12/01(土) 16:25:11
>>678
time関数で現在時刻を取得できるから、それを見て判断すればいいんじゃないか
681デフォルトの名無しさん:2007/12/01(土) 16:32:35
ありがとうございます。
タイム関数というのまだ使ったことないのですが、どのような命令文
を作成して、1〜60を自動的に計算させることができるのでしょうか?
682デフォルトの名無しさん:2007/12/01(土) 16:37:31
要求が曖昧なので具体的には書けないな。
1分に1回だけ1個ずつ出すの?
1分間のあいだ同じ数字をずーっと何個も出し続けるの?
683デフォルトの名無しさん:2007/12/01(土) 16:39:51
ところで命令文って言い方に違和感を感じているんだが、スレ間違ってないよな?
684デフォルトの名無しさん:2007/12/01(土) 16:43:45
1分目 1
2分目 2


45分目 45

というふうに1分経つと、数字の方も1ずつ多くカウントされて
数字の方は1〜60をどんどん足し算して、
1時間ずつ経ったらら、その合計値を60で割って、平均値を出すということです

わかりづらい質問してすいません。よろしくお願いします
685デフォルトの名無しさん:2007/12/01(土) 16:46:05
スレ間違いしてないですよ。C言語の勉強始めたばかりで、for文の
ことを考えていたのです。プログラム自体も初心者なので、専門用語
もよくわかりませんので、妥当そうな言葉使ってすいません

686デフォルトの名無しさん:2007/12/01(土) 16:56:02
>>684
こんな感じかね
#include <stdio.h>
#include <time.h>
int main()
{
 int i = 0, j = 0;
 time_t t = time(NULL);
 for (;;) {
  i++;
  while (difftime(time(NULL), t) < i * 60);
  printf("%d分目 %d\n", i, i);
  j += i;
  if (i % 60 == 0) {
   printf("1時間経った 平均%d\n", (j / 60));
   j = 0;
  }
 }
}
687デフォルトの名無しさん:2007/12/01(土) 17:06:55
おぉありがとうございます。まだプログラム慣れしてないので、複雑そうに
見えるが、頭で思っていたよりいろんな関数が必要なんですね。
whileが必要とは以外でした。for文ですべてできるかと思いました・・・
熟読してみます。
688デフォルトの名無しさん:2007/12/01(土) 17:08:04
C言語で使われてる関数を一覧できるサイトありますか?
689デフォルトの名無しさん:2007/12/01(土) 17:09:35
標準関数ならあるよ
690デフォルトの名無しさん:2007/12/01(土) 17:10:09
>>687
いやforとwhileは可換だからどっち使ってもいいんだけどね
書きやすいとか読みにくいとかその程度の問題だし
691デフォルトの名無しさん:2007/12/01(土) 17:30:57
標準関数で良いのでサイトを教えて頂けないでしょうか?
692デフォルトの名無しさん:2007/12/01(土) 17:34:13
>>691
unkoがのってるよ
693デフォルトの名無しさん:2007/12/01(土) 17:45:59
ttp://en.wikipedia.org/wiki/List_of_C_functions

とかでいいのかしらん。
694デフォルトの名無しさん:2007/12/01(土) 19:12:41
C言語で型の前方参照ってどうやればいいでしょうか?
やりたいことは

typedef struct{
Fuga f;
}Hoge;
typedef struct{
Hoge h;
}Fuga;
ということがしたいのですが2行目で怒られます…よろしくお願いします
695デフォルトの名無しさん:2007/12/01(土) 19:17:21
Fuga f;
f.h.f.h.f.h.f.h.......?
そんな無限ループみたいな構造体は作れません。
696694:2007/12/01(土) 19:45:02
うっ、そうなんですか。
C++ではできるのですがCではできないということですか?
2つのオブジェクト(データ)がお互いを指しているような構造は
Cでは実現できないのでしょうか?
697デフォルトの名無しさん:2007/12/01(土) 19:55:04
ポインタ使えば?
698694:2007/12/01(土) 19:58:49
ポインタでも結局怒られませんか?

typedef struct{
Fuga* f;
}Hoge;
typedef struct{
Hoge* h;
}Fuga;
699デフォルトの名無しさん:2007/12/01(土) 19:59:04
>>694 は、指してるんじゃなくて含んでるんだよ
指すんなら出来る

typedef struct Fuga Fuga; 
typedef struct Hoge Hoge;
struct Hoge{ 
    Fuga *f;
}; 
struct Fuga{ 
    Hoge *h;
};
700デフォルトの名無しさん:2007/12/01(土) 20:07:33
>>696
> C++ではできるのですが
うそつくなヴォケ
701694:2007/12/01(土) 20:11:01
>>695 697 699
ありがとうございました。
私の初めの例が変でした。すみません。
699がまさにやりたかったことでした。重ね重ねありがとうございます。
702694:2007/12/01(土) 20:21:12
>>700
すみません
class Hoge;
class Fuga{
Hoge* h;
};
class Hoge{
Fuga* f;
};
ならできますよね?ということが言いたかったんです(ポインタなんですが)
つまり初めの例が変だったんです。
初心者歓迎ということで許してね♪
703デフォルトの名無しさん:2007/12/01(土) 21:00:14
すまんが初心者以前は・・・いやなんでもない
704デフォルトの名無しさん:2007/12/01(土) 22:50:15
> 初心者歓迎ということで許してね♪
なかなか面白いこと吐くじゃねーか
705デフォルトの名無しさん:2007/12/01(土) 23:19:39
どこが笑いどころ?
706デフォルトの名無しさん:2007/12/01(土) 23:25:48
> な
>  ま
>    者
707デフォルトの名無しさん:2007/12/01(土) 23:36:33
現在時刻を表示させるにはどうしたら良い?
708デフォルトの名無しさん:2007/12/01(土) 23:47:23
>>707
#include <stdio.h>
#include <time.h>
int main()
{
time_t t = time(NULL);
struct tm *tm = gmtime(&t);
printf("%s",asctime(tm));
return 0;
}
709デフォルトの名無しさん:2007/12/02(日) 00:26:35
VS2005です
int ymd = 20071201;
int y, m, d;
y = 2007
m = 12
d = 1
のように年月日をそれぞれy m dに取得するいい方法はないですか?
710デフォルトの名無しさん:2007/12/02(日) 00:45:30
y = ymd / 10000;
m = ymd % 10000 / 100;
d = ymd % 100;

こうしたいの?
711デフォルトの名無しさん:2007/12/02(日) 01:23:21
>>710
サンクス、ばっちりです
712デフォルトの名無しさん:2007/12/02(日) 01:38:53
すみません>< 今日初めてプログラムを書きます
仮に {0,1,2,3,4,5,6,7,8,9} という配列が書き込まれているとし、
それが再生される段階でどこかが抜けてしまった場合、
例えば {0,1,2,4,5,6,7,8,9,0} となってしまうプログラムを書きたいんですが、
全然うまくいきません。

以下のものを書きました・・

*****************************************************************

#include<stdio.h>

int main()
{
int i;
int length = 10; //length of the sequence
int start = 3; //start of asynchronous

int Seq1[] = {0,1,2,3,4,5,6,7,8,9};
int Seq2[] = {0,0,0,0,0,0,0,0,0,0};

for(i = start; i < length; i++)
{
Seq2[i] = Seq1[i+1];
};

printf("%3d", Seq2[]);
return(0);
}
713デフォルトの名無しさん:2007/12/02(日) 01:50:31
>>712
>Seq2[i] = Seq1[i+1];
iが9のとき、10番目にアクセスしてアウト。
ってか、何がやりたいのかさっぱり。
startが3だから3が抜けた配列を作りたいの?
for ( i = 0; i < length; i++ ) {
if ( Seq1[ i ] != start ) {
Seq2[ i ] = Seq1[ i ];
}
}
こういうことか?
714デフォルトの名無しさん:2007/12/02(日) 01:51:48
>>712
>それが再生される段階でどこかが抜けてしまった場合
ここを詳しく
715デフォルトの名無しさん:2007/12/02(日) 01:53:31
優しい人の集まるスレですね
俺なら日本語でおkとしか言えない
716デフォルトの名無しさん:2007/12/02(日) 02:12:34
>>714

実はこのプログラムはですね、HDDのある特殊な媒体において、
「再生時に同期が外れて書き込まれている磁化パターンがヘッドで読めないところが出てくる」という現象を作りたいんです。

ABCDEF という系列を挙げると、左が過去です。A→B→C→・・・ という順でヘッドで再生されていくと考えてください。
そこで、どこかでヘッドと媒体の同期が取れなくて、読めないとこが出て、A→B→D→・・・ となる場合があるとしてます。

このプログラムは、ある既存のプログラムに追加したいものなのですが、
とりあえずプログラムを書いたことが無いので、このプログラム単体でビットのシフトを再現したいんです・・・

日本語おkですみません・・
717デフォルトの名無しさん:2007/12/02(日) 02:21:09
抜きたい数字はランダムだとすると

rd

for(i = 0; i < NUM_MAX; i++)
{
718712:2007/12/02(日) 02:37:49
>>717
ありがとう 
実際は同期がはずれるのは当然ランダムだから、参考にさせてもらうよ

ところで、結果を表示する 

printf("%3d", Seq2[]);  っておかしいでしょうか?

適当に書いてたらこれがあると構文エラーになって出力できない・・・・orz
俺アホすぎ・・
719デフォルトの名無しさん:2007/12/02(日) 02:58:16
こんなんでいいのかどうかわからんけど
void main ()
{
srand( (unsigned int)time(NULL) );
int i;
const int length = 20;
int index = 0;
int Seq1[length];
int Seq2[length];
for( i = 0; i < length; i++ ){
Seq1[i] = i;
Seq2[i] = 0;
}

// 抜けた数字
int out = rand() % length;
for( i = 0; i < length; i++ ){
if( out != i ){
Seq2[index] = Seq1[i];
index++;
}
}
printf( "抜けた数字:%d\n", out );
for(i = 0; i < length; i++)
printf("%d ", Seq2[i]);
printf("\n");
}
720712:2007/12/02(日) 03:17:19
>>719
ありがとう


でもムズイぜ・・・('A`)
721デフォルトの名無しさん:2007/12/02(日) 05:58:57
struct point{
int x;//X座標
int y;//Y座標
};
int main(void)
{
struct Point A[1000],B[1000];


線分A[i]B[i]とA[j]B[j]が交差するか判定していくプログラムで
単に二重for文で一個ずつ判定していくんじゃなくて(n-1)^2/2回の判定で済むようなプログラムの書き方を
ご教授願いたいのですが

722デフォルトの名無しさん:2007/12/02(日) 11:13:41
単純に for 文で1個ずつ判定していけば
n(n-1) / 2 回の判定で行けるんじゃないの?
723デフォルトの名無しさん:2007/12/02(日) 11:16:56
>>721
for(i=0;i<n;++i){
for(j=i+1;j<n;++j){
//処理
}
}
こういうこと?
多分n(n-1)/2だが。
724デフォルトの名無しさん:2007/12/02(日) 11:18:32
nC2=n(n-1)/2
(n-1)^2/2回じゃ全て網羅しきれない
725デフォルトの名無しさん:2007/12/02(日) 14:59:42
この場合n=1000で
一回目…A[0]B[0]に対して残り全部の照合1000-1回
二回目…A[1]B[1]に対してA[0]B[0]を除いた1000-2回
   ・
   ・
   ・
1000回目…A[1000]B[1000]に対して0回
for文は使わないという意味じゃなくて
for(i=0;i<n:i++){
for(j=0;j<n:j++){
と単にするだけじゃなくてもっと効率よくするという意味です。
分かり辛くてすいません。
726636:2007/12/02(日) 15:44:54
すません質問です。
皆様のお陰で、文字列の抜き出し、結合は出来るようになりました。
今度は、抜き出した文字列の分離をしたいんですが、そんな関数有りますでしょうか?
具体的には
argv[1] = "/usr/boku/graphics/1234.jpg
から、"/usr/boku/graphics/1234"を抜き出して
hoge[40] = "/usr/boku/graphics/1234"
meso[] = "ero.jpg"
strcat(hoge, meso);
でhoge[40] = "/usr/boku/guraphics/1234ero.jpg"
にすることは出来たんです。
それでこんどはまた、
hoge[40] = "/usr/boku/guraphics/1234ero.jpg"
から"/usr/boku/graphics/1234"を抜き出して、
masaru [] = "eroero.jpg"
strcat(hoge, meso)
でhoge[40] = "/usr/boku/guraphics/1234eroero.jpg"
にしたいんです。
抜き出す時点で、
hoge[40] = "/usr/boku/graphics/1234"
hoge1[40]
strcpy(hoge1, hoge);
で後は、strcpyでhoge1を使い回せば良い気もするんですが、もっと良い方法はないでしょうか?
727デフォルトの名無しさん:2007/12/02(日) 15:49:13
>725
それは >723 な気がするが。

もうちょっと工夫するなら

・A[i].x <= B[i].x となるように必要があれば A[i] と B[i] を交換
・A[i].x で昇順ソート

しておけば、B[i].x < A[j].x になった時点で内側の j のループを break できるので、短い線分が広い範囲にばらばら存在してるケースでは比較回数が削れると思う。

まじめにやるんだったら平面走査法になると思うけどいい参考ページがちょっと見つからなかった……
728デフォルトの名無しさん:2007/12/02(日) 15:53:17
>726
hoge[40] = "/usr/boku/graphics/1234" になってる時点で、
char *begin = hoge + strlen(hoge);
しておいて、
strcpy(begin, masaru);
729636:2007/12/02(日) 16:29:19
>>728
なるほど。
こんなことが出来たのは感激。さすがC言語って感じ。
char *begin = hoge + strlen(hoge);
で*beginにhoge[40] = "/usr/boku/graphics/1234"以降の空白の配列のポインタを代入して、
strcpy(begin, masaru);で結果として、/usr/boku/graphics/1234eroero.jpgが出来ると。
char masaru[] = "ero.jpg";
char meso[] ="eroero.jpg";
char hoge[40] = "/usr/boku/graphics/1234" ;
int i = strlen(hoge);
char *begin = hoge + i;
strcpy(begin, masaru);
printf("%s¥n",hoge);
begin = hoge + i;
strcpy(begin, meso);
printf("%s¥n",hoge);
これだったら、確かに"/usr/boku/graphics/1234"が使い回せますね。
でも、こんなプログラム書いたらコメントしてないと後で何してるのかわからなくなりそう。
730デフォルトの名無しさん:2007/12/02(日) 16:40:38
>>726
>hoge[40] = "/usr/boku/guraphics/1234ero.jpg"
>から"/usr/boku/graphics/1234"を抜き出して、
ディレクトリ変わってるのはtypoよな?

>今度は、抜き出した文字列の分離をしたいんですが、そんな関数有りますでしょうか?
ない

具体的なコードの流れとか関数の切り分け方とか
分からんとどうするのが良いとか何とも言えないけど、
個人的な好みだと、
hoge[40] = "/usr/boku/graphics/1234" の段階でstrcatは使わずに
hoge1[40]、hoge2[40]を用意してそれぞれ
sprintf(hoge1, "%s%s", hoge, meso);
sprintf(hoge2, "%s%s", hoge, masaru);
とすると思う。

どうしても切り出す必要があるなら、前提条件が揃えばstrstrを使うとか
hoge[strlen(hoge)-strlen(meso)] = '\0'とか、まぁ色々あると思うけど。
731730 :2007/12/02(日) 16:42:12
うぇwww質問主の返事の方が早かったw
でしゃばってすんまへん
732636:2007/12/02(日) 16:45:39
>>730
いえいえ、そんな。
本当にありがとうございます。
ここの人達はめっちゃ紳士だから大好きだ。
733デフォルトの名無しさん:2007/12/02(日) 16:56:33
>めっちゃ紳士
失礼な!
734デフォルトの名無しさん:2007/12/02(日) 17:49:49
Visual C++ 2005 Express EditionをC言語のコンパイラーとして 使いたいけど そのまま打ち込めばちゃんとコンパイルされますか?
735デフォルトの名無しさん:2007/12/02(日) 18:05:21
いいえ、正しい手順に則って打ち込まないとコンパイルしてくれません
736デフォルトの名無しさん:2007/12/02(日) 18:44:08
735さん ありがとうございます。 わざわざ他のをインストールしてやるより楽でいいかなと思ったですが、 C言語とどういう点で違うかわかりますか? 初歩的なレベルのC言語をやる程度です
737デフォルトの名無しさん:2007/12/02(日) 19:33:37
厳密にCとC++を区別する必要がないなら今は気にしなくていいよ。
参考書等を頼りに勉強して、不明点が出てきたらまた聞きに来るといい。
738デフォルトの名無しさん:2007/12/02(日) 19:35:01
とりあえず拡張子を.cにすればコンパイラがよしなにはからってくれるんじゃね?
739デフォルトの名無しさん:2007/12/02(日) 20:12:12
マクロを全く同じ名前/内容の関数に置き換えたいのですが、
そういうことってできますか?
740デフォルトの名無しさん:2007/12/02(日) 20:20:10
例えば?
741デフォルトの名無しさん:2007/12/02(日) 20:25:58
>>739

ケースバイケース。
Cの場合、使われてる場所で引数の型が異なると無理。
C++だと、テンプレートにすれば大概OK。
引数の型が一緒なら、どっちでもできるはず。
742デフォルトの名無しさん:2007/12/02(日) 21:06:06
## を使ってるマクロなら駄目そうだ。
743デフォルトの名無しさん:2007/12/02(日) 22:44:59
#define func(f,x) f(x)

int foo(int x){
return x+1;
}

int main(){
return func(foo,-1);
}
744デフォルトの名無しさん:2007/12/02(日) 22:48:24
typedef int (*p_func)(int);

int func(p_func f,int x){
return f(x);
}

int foo(int x){
return x+1;
}

int main(){
return func(f,-1);
}
745デフォルトの名無しさん:2007/12/02(日) 22:49:14
int main(){
return func(f,-1);
}

int main(){
return func(foo,-1);
}
746デフォルトの名無しさん:2007/12/02(日) 23:31:04
BCC Developerで多倍長精度の計算をするgmpライブラリは使えますか?
747デフォルトの名無しさん:2007/12/02(日) 23:33:28
int *aとint* aの違いって何ですか?
748デフォルトの名無しさん:2007/12/02(日) 23:36:10
見た感じが違う
749デフォルトの名無しさん:2007/12/02(日) 23:37:58
スペースの空き方が違う
750デフォルトの名無しさん:2007/12/02(日) 23:40:42
int *a; //アスタリスクが修飾するのは型ではなく変数名の方だと言う事を確り分かっている普通の書き方
int* a; //「型が変化するのに修飾対象が変数名だなんておかしい」と現実に目を向けない人可哀相な人がよくする書き方。
751デフォルトの名無しさん:2007/12/02(日) 23:48:52
またそんな燃料投下しなくても・・・
別にどっちだっていいよ、プロジェクト等ならコーディング規約に沿えばいい。
個人なら自分がいいと思うほうにすればいい。
何でこの話題で荒れるか知りたければCFAQとか見ればいい。
752デフォルトの名無しさん:2007/12/02(日) 23:49:02
前者はC、後者はC++でよく見かける。
753デフォルトの名無しさん:2007/12/02(日) 23:51:53
じゃ、int*a がBestなのですね。 有難うございました。
754デフォルトの名無しさん:2007/12/02(日) 23:57:46
両方くっつけるのは全然見ない
755デフォルトの名無しさん:2007/12/02(日) 23:58:07
int * a;
756デフォルトの名無しさん:2007/12/02(日) 23:58:29
新しいなw
まぁ俺も「int * a」派だから似たようなもんかw
757デフォルトの名無しさん:2007/12/03(月) 00:02:40
LPINT a;
758デフォルトの名無しさん:2007/12/03(月) 00:11:06
そいつぁ#defineの臭いがするぜ
759デフォルトの名無しさん:2007/12/03(月) 00:11:35
テンプレートを考えたら int* を型として扱ってるから * は int 寄りだろうな。
760デフォルトの名無しさん:2007/12/03(月) 00:21:47
結論は、貴方が
Cをしているなら: int *a
C++をしているなら: int* a
どちらか不明な場合は: int * a
ちょうど初心者なら: int*a
と書くのが良いと思われます。
761デフォルトの名無しさん:2007/12/03(月) 01:53:37
常に int *a がいいと思うけどな
まぁ好みでどうぞ
762デフォルトの名無しさん:2007/12/03(月) 01:55:43
int* *a
みたいなw
763デフォルトの名無しさん:2007/12/03(月) 04:09:41
C++の場合、使い込んでいくうちに、
ポインタは「イテレータと呼ばれる型」の一形態で、ポインタのデリファレンスはoperator*の一形態、
という意識がどんどん支配的なっていく。
昔ながらの下位概念側から比較的新しい上位概念を見る、のではなく、その逆の見方になる。
イテレータやスマートポインタを自作したりすると、特に。

そういう意識の中で int *a; という書き方を見ると、ちょいと異物感があるというか、
自分の「C++スタイルの深まり」との協調性に欠けていると感じる、ってのはあるかな。
もちろん、こんなのは小さなこと・・・っていうか、極端にいえば単なる「気分」の話であって、
実際には読み書き両面において、あらゆる書き方に慣れているべきなわけだけど。

結論:どっちでもいい。ただ、どんなスタイルであれ、それなりに理由があって生まれているから、
    語り出すと長いしウザいw
764デフォルトの名無しさん:2007/12/03(月) 04:12:57
ポインタを返す関数の例:
T* f()
T *f()
dotch?

A:
pointer<T> f()
よs(ry
765デフォルトの名無しさん:2007/12/03(月) 07:12:16
int* と書いて問題になる場面ってあまりないけどね。
ショートコード大好きな人には大問題なのかもしれないけど。
766デフォルトの名無しさん:2007/12/03(月) 09:50:34
問題は二つ以上の変数を同時に宣言したいときだよな
767デフォルトの名無しさん:2007/12/03(月) 10:16:34
そこでD言語ですよ
768デフォルトの名無しさん:2007/12/03(月) 12:21:17
変数を宣言する場合は、文法に沿って
int *hoge
型を表すだけの場合は、文法に沿って
int*
769デフォルトの名無しさん:2007/12/03(月) 15:15:56
ICカードに情報を書き込むプログラムを作成しています。
もともとのサンプルプログラムに指定した情報を書き込めるようにしようと以下のプログラムを加えました。
以下実際に自分が加筆した部分を含んだソースコードのURLと自分で加筆した部分です。
ソースコード:ttp://www.uploda.org/uporg1141577.zip.html
以下実際に書き込んだ部分
/*----------------加筆部分ここから----------------*/
//自分で書き込むデータを指定する場合
unsigned char write_block_data[16];
//gets()の引用数、\0+1のサイズを設定
char str[80];
char strlen;
size_t len;
fprintf(stdout,"書き込むデータの入力(16バイト以下)");
gets(str);
//16バイト以上を入力してしまった場合
while(len = strlen(str)>16){
fprintf(stdout,"文字数が多すぎます。もう一度入力してください。");
gets(str);
}
//i文字目がNULLにならない間一文字ずつ入力
for(int i=0;str[i]!='\0';i=i+1)
write_block_data[i] = str[i];
//文字数が少ない間
while(i < 16)
//文字数が少ない場合はゴミを表示しないようにする。
write_block_data[i++] = ' ';

input_write_block_without_encryption.block_data = write_block_data;
/*----------------加筆部分ここまで----------------*/
770769:2007/12/03(月) 15:18:31
>>769です。
そのあとコンパイルをしたら
1>sample_09.cpp
1>c:\documents and settings\ユーザー1\デスクトップ\rfid_system\sdk.for.felica.sample.code+header\c\sample_09.cpp(77) : warning C4996: 'gets' が古い形式として宣言されました。
1> c:\program files\microsoft visual studio 8\vc\include\stdio.h(270) : 'gets' の宣言を確認してください。
1> メッセージ: 'This function or variable may be unsafe. Consider using gets_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
1>c:\documents and settings\ユーザー1\デスクトップ\rfid_system\sdk.for.felica.sample.code+header\c\sample_09.cpp(79) : error C2064: 1 引数を取り込む関数には評価されません。
1>c:\documents and settings\ユーザー1\デスクトップ\rfid_system\sdk.for.felica.sample.code+header\c\sample_09.cpp(79) : fatal error C1903: 直前のエラーを修復できません。コンパイルを中止します。
1>ビルドログは "file://c:\Documents and Settings\ユーザー1\My Documents\Visual Studio 2005\Projects\felica\felica\Debug\BuildLog.htm" に保存されました。

と表示されました。
error C2064: 1 引数を取り込む関数には評価されません。
というものの対処法をぐぐっても意味がわからないのでどうやって解決していいのかもわかりません。
もしよろしければこれらのエラーの解決方法を教えていただけないでしょうか。

環境は
Windows XP Professional SP2
Microsoft Visual C++ 2005 Express Edition
です。
よろしくお願いします。
長文失礼しました。
771デフォルトの名無しさん:2007/12/03(月) 15:27:02
>>770
#include <cstring>
772デフォルトの名無しさん:2007/12/03(月) 15:31:42
>>770
原因は寧ろこれ。
>char strlen;

つーか、突っ込みどころ多すぎだろ。
773デフォルトの名無しさん:2007/12/03(月) 15:33:00
>>769
fgets使え
774デフォルトの名無しさん:2007/12/03(月) 15:35:28
// 加筆部分はこれでいいよ
unsigned char write_block_data[17];
char str[sizeof(write_block_data + 1];
fprintf(stdout, "...");
fgets(str, sizeof(str), stdin);
char * p = strchr(str, '\n');
if (p) * p = '\0';
sprintf(write_block_data, "%16.16s", str);
// 最後の一行コピペすんのめんどくせ
775769:2007/12/03(月) 15:37:25
>>769です。
レスありがとうございます。
>>771
先頭につけてもエラーはかわりませんでした。
>>772
char strlenというものをつけないでやってみたのですが、そのときは
1>c:\documents and settings\ユーザー1\デスクトップ\rfid_system\sdk.for.felica.sample.code+header\c\sample_09.cpp(80) : error C3861: 'strlen': 識別子が見つかりませんでした
というエラーが出てしまいました。
>>773
fgetsですか。
getsとかいてある部分をfgetsになおせばいいのでしょうか。
776769:2007/12/03(月) 15:40:02
>>774
最後の一行は
input_write_block_without_encryption.block_data = write_block_data;
ですよね?
F5を押してコンパイルしたら
1>sample_09.cpp
1>c:\documents and settings\ユーザー1\デスクトップ\rfid_system\sdk.for.felica.sample.code+header\c\sample_09.cpp(94) : error C2143: 構文エラー : ')' が ']' の前にありません。
1>c:\documents and settings\ユーザー1\デスクトップ\rfid_system\sdk.for.felica.sample.code+header\c\sample_09.cpp(97) : error C3861: 'strchr': 識別子が見つかりませんでした
1>c:\documents and settings\ユーザー1\デスクトップ\rfid_system\sdk.for.felica.sample.code+header\c\sample_09.cpp(99) : error C2664: 'sprintf' : 1 番目の引数を 'unsigned char [17]' から 'char *' に変換できません。(新しい機能 ; ヘルプを参照)
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>c:\documents and settings\ユーザー1\デスクトップ\rfid_system\sdk.for.felica.sample.code+header\c\sample_09.cpp(119) : error C3861: 'print_vrctor': 識別子が見つかりませんでした
というエラーが出てきました。
777769:2007/12/03(月) 15:43:51
1>c:\documents and settings\ユーザー1\デスクトップ\rfid_system\sdk.for.felica.sample.code+header\c\sample_09.cpp(94) : error C2143: 構文エラー : ')' が ']' の前にありません。
というのは
char str[sizeof(write_block_data + 1]; を
char str[sizeof(write_block_data + 1)]; に変更したらエラーがなくなりました。

識別子が見つかりませんというエラーは例えばintやcharの宣言が必要という意味なのでしょうか。
778デフォルトの名無しさん:2007/12/03(月) 15:48:04
code plz.
779769:2007/12/03(月) 15:50:55
>>778
ttp://www.uploda.org/uporg1141602.zip.html
ヘッダーとファイルをうpしました。
780デフォルトの名無しさん:2007/12/03(月) 15:52:58
>>777
char str[sizeof(write_block_data) + 1]
781769:2007/12/03(月) 15:54:53
>>780
()の部分を訂正しました。
782デフォルトの名無しさん:2007/12/03(月) 16:05:46
これって C++ か…限りなく C に近いコードだな。
783769:2007/12/03(月) 16:07:19
>>782
C言語だと思っていたのですが*.cppファイルだからC++なんじゃないのかと思ってますw
といってもサンプルプログラムの入っていたフォルダの名前がCになっていたのでC言語だとは思うのですが・・・。
784769:2007/12/03(月) 16:22:12
ファイルの先頭を
//#include "stdafx.h"
#include <cstdio>
#include <cstdlib>
#include <conio.h>
#include <cstring>

#include "felica.h"

としてみたらエラーが2つになりました。

1>コンパイルしています...
1>sample_09.cpp
1>c:\documents and settings\ユーザー1\デスクトップ\rfid_system\sdk.for.felica.sample.code+header\c\sample_09.cpp(99) : error C2664: 'sprintf' : 1 番目の引数を 'unsigned char [17]' から 'char *' に変換できません。(新しい機能 ; ヘルプを参照)
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>c:\documents and settings\ユーザー1\デスクトップ\rfid_system\sdk.for.felica.sample.code+header\c\sample_09.cpp(119) : error C3861: 'print_vrctor': 識別子が見つかりませんでした
785デフォルトの名無しさん:2007/12/03(月) 16:26:12
reinterpret_cast<char *>(write_block_data)
786769:2007/12/03(月) 16:29:56
>>785
unsigned char write_block_data[17];
char str[sizeof(write_block_data) + 1];
reinterpret_cast<char *>(write_block_data);
fprintf(stdout, "...");
fgets(str, sizeof(str), stdin);
char * p = strchr(str, '\n');
if (p) * p = '\0';
sprintf(write_block_data, "%16.16s", str);
input_write_block_without_encryption.block_data = write_block_data;
と設定してみました。
でもエラーメッセージがかわらないです。。。
787デフォルトの名無しさん:2007/12/03(月) 16:34:16
なんでエラーが出たところで対処しようと思わないのだろう……
788デフォルトの名無しさん:2007/12/03(月) 16:37:59
>>786
reinterpret_cast<char *>(write_block_data);
はおかしいだろ。

sprintf(reinterpret_cast<char *>(write_block_data), "%16.16s", str);
789769:2007/12/03(月) 16:39:35
>>787
エラーが出たから検索をしてみてはいるのですがまったくわからなくて。
すみません。
790769:2007/12/03(月) 16:42:40
>>788
アドバイスありがとうございます。
早速直してみたところエラーがひとつになりました。

1>c:\documents and settings\ユーザー1\デスクトップ\rfid_system\sdk.for.felica.sample.code+header\c\sample_09.cpp(122) : error C3861: 'print_vrctor': 識別子が見つかりませんでした

というエラー文です。
識別子が見つからないのというのは単にintやcharなどの宣言がないと言うことなのかと思ったのですがどうやら違うようでした。
791デフォルトの名無しさん:2007/12/03(月) 16:46:55
>>790
変数だか関数だか知らんがprint_vrctorという識別子を持つ何かが定義
されてないとコンパイラがメッセージ出してるだろ。

勝手な予想だがキーボードの位置からして
print_vector
の間違いか?
792デフォルトの名無しさん:2007/12/03(月) 16:50:19
マジで書いているんだったらとんでもない間抜けだな。
--
print_vrctor("書き込みデータ:",write_block_data,sizeof(write_block_data));
--
void print_vector(char* title, unsigned char* vector, int length);
--
793769:2007/12/03(月) 16:52:59
>>790
たしかにそうなのかもしれません。
print_vrctorをprint_vector
に訂正してみました。
そうしたら

1>------ ビルド開始: プロジェクト: felica, 構成: Debug Win32 ------
1>コンパイルしています...
1>sample_09.cpp
1>c:\documents and settings\ユーザー1\デスクトップ\rfid_system\sdk.for.felica.sample.code+header\c\sample_09.cpp(102) : warning C4996: 'sprintf' が古い形式として宣言されました。
1> c:\program files\microsoft visual studio 8\vc\include\stdio.h(345) : 'sprintf' の宣言を確認してください。
1> メッセージ: 'This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
1>マニフェストをリソースにコンパイルしています...
1>リンクしています...
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__dispose_library が関数 _main で参照されました。
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__close_reader_writer が関数 _main で参照されました。
794769:2007/12/03(月) 16:54:03
(>>793の続きです)

1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__read_block_without_encryption が関数 _main で参照されました。
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__write_block_without_encryption が関数 _main で参照されました。
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__polling_and_get_card_information が関数 _main で参照されました。
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__open_reader_writer_auto が関数 _main で参照されました。
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__initialize_library が関数 _main で参照されました。
1>sample_09.obj : error LNK2019: 未解決の外部シンボル __imp__get_last_error_types が関数 "void __cdecl error_routine(void)" (?error_routine@@YAXXZ) で参照されました。
1>C:\Documents and Settings\ユーザー1\My Documents\Visual Studio 2005\Projects\felica\Debug\felica.exe : fatal error LNK1120: 外部参照 8 が未解決です。
1>ビルドログは "file://c:\Documents and Settings\ユーザー1\My Documents\Visual Studio 2005\Projects\felica\felica\Debug\BuildLog.htm" に保存されました。
1>felica - エラー 9、警告 1
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========

というエラーが出てきました。

>>792
すみません。本気で書いてましたorz タイピングミスはしないように見直しているつもりなのですが・・・。
795デフォルトの名無しさん:2007/12/03(月) 16:54:22
いきなりfelicaとか使わんで、もうちょい勉強してからのほうがいいような…
796デフォルトの名無しさん:2007/12/03(月) 16:59:29
スタティックリンクライブラリファイル(*.lib)をリンクしる
797769:2007/12/03(月) 17:01:31
>>795
はい、でも卒業研究で作成中のプログラムの一部として使用していまして。
どうしてもこの部分が必要になってまして・・・。
自分なりに頑張って他のパーツの作成は、できたのですがどうしてもこれだけができなくてorz

>>796
*.libをリンク??
*.libを持っていないので作成する必要がありますよね。
>>779のURLにうpしたファイルがすべてなのでちょっとわからないです。
すみません。。。
798デフォルトの名無しさん:2007/12/03(月) 17:05:28
sdkかなにか持ってるんじゃないの?
それにlibが入ってるか、ソースが入ってるならそれをビルドすればいい
799769:2007/12/03(月) 17:13:45
はい。SDK for FeliCaというソフトウェアです。
CD-ROMにlibraryというフォルダがあります。
その中に
felica.lib
felica_for_vb.lib
rw.lib
というファイルがあります。
これをMicrosoft Visual C++ 2005 Express Editionを使って
ファイル→開く→ファイルでfelica.libを指定して開いてみようとしたら

"C:\(略)\felica.lib"に対応するエディタはありません。
このファイルの種類(lib)のアプリケーションがインストールされていることを確認してください。

という警告が表示されてしまい表示できないですorz
800デフォルトの名無しさん:2007/12/03(月) 17:16:28
なあ、これって釣りだよな?
801デフォルトの名無しさん:2007/12/03(月) 17:17:16
うん
802769:2007/12/03(月) 17:18:06
>>800
釣りじゃないです。釣りとまで思われるようですみません。
803デフォルトの名無しさん:2007/12/03(月) 17:19:38
>>799
その問題解決能力ではこれから厳しいぞ
とりあえず、今までのレスからlibやらリンクやらのキーワードがあるんだからぐぐろうよ
数時間試行錯誤して駄目だったら再び質問するくらいの根気でがんばれ
804デフォルトの名無しさん:2007/12/03(月) 17:19:57
>>802
じゃあまずはC言語の勉強から始めたら?
805デフォルトの名無しさん:2007/12/03(月) 17:23:26
>>802
真面目に答えてやりたいが、VC++は(というかIDEは)使ったことないので完璧に予測で答えてみる。
多分、以下のどれかだ。
・プロジェクトにlibファイルを追加する
・「プロジェクトで使用するlibファイル」みたいなところに追加する
・ビルド時にlibファイルを指定する
まあ、メニューからそれっぽいの探して試してみろよ。
それくらいできるだろ
806デフォルトの名無しさん:2007/12/03(月) 17:24:00
卒研ということは情報系の学生なんかな。
コンパイル、リンクとか少なくとも作業としてわかってるのかしらん。
807デフォルトの名無しさん:2007/12/03(月) 17:27:54
うちのアホ大学(偏差値55くらい)の院生は、Cのポインタが理解できてなかった。
それでも一部上場のSIへ入社していった。入社後の本人&指導役が大変そうだ。
今の中堅以下の情報系学部ってそんなもんじゃないだろうか。
808デフォルトの名無しさん:2007/12/03(月) 17:29:52
大丈夫
立派なパワポマスターに成長するさ
809デフォルトの名無しさん:2007/12/03(月) 17:31:47
何故あんなに凝ったプレゼンをするのかパワーポインタを理解できません
810デフォルトの名無しさん:2007/12/03(月) 17:31:48
>>808
そうそう、かの人はパワポと発表は上手だった。
彼は絶対、営業職の方が成功すると思ったなぁ。
まぁ既に営業系のSEに配置換えになってるかもしれないけどw
811デフォルトの名無しさん:2007/12/03(月) 17:32:31
この程度のレベルで卒業研究とは…
何しに大学行ってたんだい?
812769:2007/12/03(月) 17:36:34
皆さんレスありがとうございます。
>>803
もう少し試行錯誤してみます。
>>805
よくわかりませんが色々試してみます。
追加してみることはできたけど変なエラーが出てしまったので恐らく追加の仕方が間違っているのだと思うのでもう少し探してみます。
>>806
はい、情報系です。正直よくわかりませんorz
>>811
毎日それなりにプログラミングはやっていたつもりなのですが4年間まったくわからなくて・・・。
813デフォルトの名無しさん:2007/12/03(月) 17:40:25
ま、毎日?!
814デフォルトの名無しさん:2007/12/03(月) 17:41:54
あまり判りやすい嘘は付かない方が良い・・・毎日ってw
815デフォルトの名無しさん:2007/12/03(月) 17:43:46
>>812
根本的にプログラミングに向いてないね。
そこまで理解できてないのってのはいっそ文系脳では? 何故に情報学部に行った?
816デフォルトの名無しさん:2007/12/03(月) 17:47:07
>>815
文系を人外の生物みたいに言うな!
文系と理系の違いは興味の方向性みたいなもんだ
できるかできないかは別問題
817デフォルトの名無しさん:2007/12/03(月) 17:48:55
まぁプログラミングはホント人を選ぶ、ってか向き不向きがハッキリ出るからね。
うっかり情報系に入っちゃった人は、就職で心機一転、情報系以外の職種に就いた方がいいね。
学部で流れて就職するときっと後々後悔する。
818デフォルトの名無しさん:2007/12/03(月) 17:52:55
学生と接することが多いが、769 さんみたいな学生は結構今は多い
ような気がする。「一流大学」でも結構よくいる。情報が簡単に
見つかるのでついつい情報集め命で対処療法になってしまう。

一二冊で良いから本を初めから最後まで読んで、系統的に理解すれば
最終的には大分楽なんだけどね(情報系に限らず)。
819デフォルトの名無しさん:2007/12/03(月) 18:20:09
情報学部に入ってるのに、情報におぼれてるのか?
いったい何を得に行ってるのやら。
学費もったいねぇ。
とりあえず入れたところがたまたま
情報学部ってところなんだろうな。
820デフォルトの名無しさん:2007/12/03(月) 18:20:52
IT業界で出世するのは文系。人外なんてとんでもない
まぁ文系理系にかかわらずまれにいるけどな
821769:2007/12/03(月) 18:32:33
>>769です。
皆様のお力添えでようやくライブラリの問題は解決しました。
少しプログラム上の問題が出ているので考えてみます。
>>814
一応毎日やってました。プログラミング演習という実習が再履修一度だけというのもあったので。
forやif文を書くレベルで落ちて再履修しましたorz
822デフォルトの名無しさん:2007/12/03(月) 19:03:27
どんだけ低レベルなんだよwwww
独習Cとか買って最低限勉強しておいたほうがいいかもね
823デフォルトの名無しさん:2007/12/03(月) 19:06:42
C++ cookbookおすすめ!
makeとかbjamの使い方も載ってる
特にbjam、C++使うならこれを使わない手は無いぜ?
824769:2007/12/03(月) 19:11:46
数学や英語は好きで大学入ってから資格をとれたりしましたがプログラミングだけはどうしてもわからなくてorz
825デフォルトの名無しさん:2007/12/03(月) 19:26:49
>>824
慣れだ。
あときちんと本を読んで実際にコーディングをすることをお勧めする。
IT業界にいくつもりなら会社に入れば嫌でも覚える。
プログラミングもできない、なんちゃってSEも多いけど。
情報収集には英語は必須だからきちんと勉強しておいたほうがいい。
語学の習得に比べたらプログラムなんてなんてことはない。
数学の弱いプログラマにはレベル低い奴が多いから勉強しとけ。
DSPとかいじるなら数学のセンスは必須。
826デフォルトの名無しさん:2007/12/03(月) 19:37:40
画像扱うなら最低限、三角関数の定積分と二次元空間での図形の回転くらいできてて欲しいと思う今日子の頃。
827769:2007/12/03(月) 19:41:57
>>825
貴重なアドバイスありがとうございます。
C言語の初歩から家で就職まで勉強します。
SEではなく一応コンサル配属らしいけど親会社が外資系メーカーなのでIT業界には変わりないと思うので頑張ります。
英語はずっと勉強してます。院生に英語の文献読まされてよく和訳依頼されるのでw
数学ももっとやっときます。大学の教養レベルまで大抵わかってるつもりなのでプログラミングにも応用できるよう頑張ります。
828デフォルトの名無しさん:2007/12/03(月) 20:21:02
new演算子を型ごとにオーバーロードすることはできるでしょうか?
829デフォルトの名無しさん:2007/12/03(月) 20:22:32
>>828
new演算子はオーバーロードできない。
operator newならできる。
830デフォルトの名無しさん:2007/12/03(月) 20:24:11
>>829
それnew演算子w
いや、言いたいことはわからなくもないけどさ。

>>828
クラスなら可能。
非侵入的にはできないと思う。
831デフォルトの名無しさん:2007/12/03(月) 20:28:08
>>829
operator newとnew演算子の違いが判らないのですが?
832828:2007/12/03(月) 20:42:07
ありがとうございます
クラスのメンバにすると解決しました
833デフォルトの名無しさん:2007/12/03(月) 21:22:21
>>830
new演算子とoperator new()は明確に違う。
new演算子は
1. operator new()でメモリ確保する。
2. コンストラクタで初期化する。
この動作を変えることはできない。そういう意味でオーバーロード不可能。
ただし、1. の動作を再定義することはできる。

おれはこう理解している。
834デフォルトの名無しさん:2007/12/03(月) 21:59:12
演算子関数のことを言おうとしてるんだよな、きっと。
835デフォルトの名無しさん:2007/12/04(火) 00:29:00
double型のNコの配列Arrayを動的確保し、後のどっかで値が入って、
その後いろんな処理を経た後、マイナス値があればエラーを返して終了、
というものの場合、以下の「⇒」の箇所でアボートします。
他のうまくいっているプログラムと同じように書いたつもりなんですが、
ループの中でdeleteするのがいけないんでしょうか。

double* Array = NULL;
Array = new double[ N ];

// この後なんやかんやで値が入る

for( int i = 0; i < N; i++ )
{
if( Array[i] < 0.0 )
{
⇒ delete [] Array; // ここでアボート
Array = NULL;
}
836デフォルトの名無しさん:2007/12/04(火) 00:34:54
例えば y=2x のように簡単な比例の計算をさせるには
どのように書いたらよろしいでしょうか。
よろしくお願いします
837デフォルトの名無しさん:2007/12/04(火) 00:36:33
>>835
配列Arrayの複数の要素が負だったら、複数回deleteしてるんじゃね?
838デフォルトの名無しさん:2007/12/04(火) 00:39:02
>>836
int f(int x)
{
 return 2 * x;
}
839デフォルトの名無しさん :2007/12/04(火) 00:43:01
>>835
簡単に言えばi==0の時点でArray[i]にマイナス値が入ってたら
その時点でif文内のdeleteが実行されてメモリ解放されても
引き続きi=1,2,3・・ってインデックスでアクセスし続ける訳だから・・・
まぁ、解ってのとおりループ内でdeleteしてるのがまずい。
840835:2007/12/04(火) 01:20:44
あ〜、ごめんなさい。うつしまつがえです。

⇒ delete [] Array; // ここでアボート
Array = NULL;
retuen -1; // ここでエラーコードを返しているのです・・・

せっかく答えてくださったのにごめんなさい。
841835:2007/12/04(火) 01:22:28
再度ごめんなさいorz
retuen ⇒ return です。
一個でもマイナス値があると、returnで抜けてるはずなんです・・
842デフォルトの名無しさん:2007/12/04(火) 01:36:50
そういう場合は、動かないソースをコピペしたほうが良い。
ミスもあるし、関係ないと思って省いたところが原因だったりもする。
843デフォルトの名無しさん:2007/12/04(火) 01:39:50
>>841
// この後なんやかんやで値が入る

Arrayの値を書き換えたりしてないよね?
844デフォルトの名無しさん:2007/12/04(火) 01:44:18
俺はよくreturnをretrunと打っちゃうぜ。
845841:2007/12/04(火) 07:32:48
// この後なんやかんやで値が入る
は、複雑な関数をいっぱい呼んでて、全体はコピペしきれません。

>>Arrayの値を書き換えたりしてないよね?

いろんなところでしてます。値を書き換えてるところをもう一度、確認してみます。
おさわがせしますた
846デフォルトの名無しさん:2007/12/04(火) 10:04:14
C言語使って移動平均線の計算することできますか?
847デフォルトの名無しさん:2007/12/04(火) 10:06:33
移動平均線って株価のかね?
無論できるが、計算だけなら筆算でも電卓でも出来るだろうにw
848デフォルトの名無しさん:2007/12/04(火) 10:12:06
指数平均も、単純平均も出来るよ
849デフォルトの名無しさん:2007/12/04(火) 10:25:09
>889 名前:仕様書無しさん :2007/12/04(火) 10:07:10
>C言語使って移動平均線の計算をするにはどうしたら良い?
ttp://pc11.2ch.net/test/read.cgi/prog/1189987548/889
850デフォルトの名無しさん:2007/12/04(火) 13:00:26
解答ありがとうございます。

勉強ついでに移動平均線を作ってみたいのでアドバイス頂けませんか?
851デフォルトの名無しさん:2007/12/04(火) 13:05:47
何が分からないのかが分からないとアドバイスしようがない
852デフォルトの名無しさん:2007/12/04(火) 13:37:24
大工道具で家は立てられますか?レベルの質問だよなこれは。
853デフォルトの名無しさん:2007/12/04(火) 13:41:06
まず、紙と鉛筆で計算してみて、そのやり方をプログラムにすればよろし
854デフォルトの名無しさん:2007/12/04(火) 14:04:45
エクセル使えよ
855デフォルトの名無しさん:2007/12/04(火) 14:17:15
セックスで子供が作れますか?と同じだよ
受精できるのはIQ130の優秀などうみても精子
856デフォルトの名無しさん:2007/12/04(火) 16:55:53
質問なのですが、
実行ファイルからどのコンパイラでコンパイルしたか判別することは可能なのでしょうか?
たとえば、visual c++ .net 2003 アカデミックパッケージ
でコンパイルした実行ファイルは、このパッケージのコンパイラで
コンパイルされたという情報が含まれていたりするのでしょうか?
また、gccでコンパイルしたのかvisual c++でコンパイルされたのか判別できるのでしょうか?
857デフォルトの名無しさん:2007/12/04(火) 17:01:26
実行ファイルの形式があるんじゃね?
ELF PE
よくわかんね。
858デフォルトの名無しさん:2007/12/04(火) 17:22:36
>>856
同じ環境でもコンパイラによってリンクするモジュールが若干違うので
埋め込まれたシンボルからコンパイラを推測することは可能。
例えば、同じLinux上でgccとiccでコンパイルした場合を較べると、
後者には前者に存在しない__intel_cpu_indicatorなんてシンボルが埋まっている。
しかし、IDEのパッケージの違いまでは判らないと思うが。
859デフォルトの名無しさん:2007/12/04(火) 17:29:55
CとかC++とかC#とか言うけど、どう違うんですか?
全部C言語なんじゃないんですか?
860デフォルトの名無しさん:2007/12/04(火) 17:33:01
C#は全くの別物。
C++はCのオブジェクト指向拡張に過ぎない。
861デフォルトの名無しさん:2007/12/04(火) 17:39:15
>>859
騙されるな。C++もCをベースにしてはいるが最早別の言語だ。
862デフォルトの名無しさん:2007/12/04(火) 17:48:31
CをインクリメントしたのがC++で
半音上げたのがC#だ
863デフォルトの名無しさん:2007/12/04(火) 17:48:40
C#の文法はキモイな。ごちゃ混ぜ感丸出しだ。
864デフォルトの名無しさん:2007/12/04(火) 18:13:16
C#はCと名乗ってはいるものの実際はJavaとVBの合いの子みたいな感じ。
865デフォルトの名無しさん:2007/12/04(火) 18:24:40
どっちかというとJavaとObjectPascalじゃないか?
866デフォルトの名無しさん:2007/12/04(火) 18:33:47
質問です
#define TEST_PRINT( ... ) printf( __VA_ARGS__ )
とやると、...の部分で
error C2010: '.' : マクロの仮引数リスト内に予期せぬ文字列があります。
と出ます。

これは、どうやったら予期してくれるんでしょうか?
867デフォルトの名無しさん:2007/12/04(火) 18:36:41
配列の定義でしてプログラムを組んでいるのですが

int N=100;
int a[N];

でNの値を100から500000ぐらいに変えると、コンパイルはできるのですが実行画面に

Documents and Setting\ユーザー名\デスクトップ>ファイル名

Press any key to exit (Input "c" to Continue)

と出てしまい実行結果が出力されません。どうしたらよいでしょうか。

Cpadを使っています。ただのメモリー不足でしょうか。配列の要素数が多ければ多いほど信頼性のあるデータが得られるので、できるだけNの値を大きくしたいのです。
868デフォルトの名無しさん:2007/12/04(火) 18:37:37
>>865
C++Builderのコンポーネント作ってたレベルだからあれだが
DelphiとC#の似てる部分はVCLとFrameworkぐらいで
文法はずいぶん違うよ〜
869デフォルトの名無しさん:2007/12/04(火) 18:40:28
>>867
空白が入っていないところにデータをおくんだ 保存するんだ
#include <vector>
using namespace std;

main(){
int N=100;
vector< int > a;
a.resize[N];
}

とやると巨大配列が作成できる たんなるintでは制限がきつい
870デフォルトの名無しさん:2007/12/04(火) 18:45:29
制限はスタックサイズね
871デフォルトの名無しさん:2007/12/04(火) 18:52:35
>>866
残念ながらVC++はC99未対応
872デフォルトの名無しさん:2007/12/04(火) 19:00:11
>>871
ありがとうございます。
検索してみたら他にも色々対応していないのも分かり参考になりました。
873デフォルトの名無しさん:2007/12/04(火) 19:09:24
>>867
でかい配列を作るときはnew(ただのCならmalloc)を使って作るんだ。
int a[N]; では一時変数用の領域(あんまり広くない)に確保されちゃうから。
newやmallocで確保した領域は、使い終わったらdelete(ただのCならfree)すること。
で、メモリ管理の面倒さを感じ始めたら>>869が教えてくれたvectorにGOだ。

(以上、かなり乱暴な説明をしてるので使う前にちゃんと勉強してね。)
874デフォルトの名無しさん:2007/12/04(火) 19:15:48
>>866
Visual C++ 2005以上を使えばいい。
http://msdn2.microsoft.com/en-us/library/ms177415(VS.80).aspx
875デフォルトの名無しさん:2007/12/04(火) 19:29:43
>>869
詳しく解説して下さってありがとうございます。
Victorっていうのを使った後はfor文の中で

b[i]=a[i];

のように使えるのでしょうか。

>>863
どうもありがとうございます。今日はパソコン室閉まっちゃったので試せませんが明日試してみます。
876デフォルトの名無しさん:2007/12/04(火) 19:35:03
>>869 それで compile するの?
877デフォルトの名無しさん:2007/12/04(火) 23:00:23
はじめはwin32APIスレで相談したけど
よく考えたらこちら向きな気がするので質問です
マルチ気味で申し訳ないです

スプライト処理をしたいのですがマスクしてBitBltする以外に方法はあるのでしょうか
やはりdirectXをりようしたほうが手っ取り早いのですか?
878デフォルトの名無しさん:2007/12/04(火) 23:15:06
BCC Developerをお使いになっている方にお聞きしたいのですが、メイク機能を使ってもなぜかexeファイルになりません。この場合はどうしたらよろしいのでしょうか?
すごく簡単なことだと思うのですが、C言語を始めたばかりでまだあまり分かっていないので、どうかよろしくお願いします。
879デフォルトの名無しさん:2007/12/04(火) 23:26:26
>>878
C言語というかプログラム自体も経験少なそうだね。
エラーが出て作ることができないのか、それ以外なのか、
エラーが出ているならどういうエラーが出ているのかを書いた方が応えやすい。
質問の仕方から勉強した方がいい。
880デフォルトの名無しさん:2007/12/04(火) 23:44:40
VC++2005のwindowsフォームアプリケーションでプログラムを書いてます。
textBox1などの値を変えるためにメンバ関数を作りたいのですが、それを呼び出そうとすると
「静的でないメンバ関数の呼び出しが正しくありません」
とエラーがでます。そこで関数にstaticをつけると
「左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。」
と出てしまいます。
分かることがあればヒントでいいのでお願いします
881デフォルトの名無しさん:2007/12/04(火) 23:57:59
>>877
とりあえずC/C++にはあまり関係ない。
DirectXが手っ取り早いかどうかは人による。
882デフォルトの名無しさん:2007/12/04(火) 23:59:16
>>880
class::メンバ関数で呼び出せないかな?
なにをしたいかよくわからないけど
883デフォルトの名無しさん:2007/12/05(水) 00:18:54
>>882
ボタンをクリックしたときに呼び出される関数button1_Clickなどでは
textBox1->Text = "test";ということができるので、
外部からtextBox1の値を変えるのも同じようにそこに関数を作っていき、
それを呼び出せばいいと思っていたのですが・・・。
884デフォルトの名無しさん:2007/12/05(水) 00:46:28
>>883
textBox1->Textってのがローカル変数というかメンバ変数じゃないんでないの?
885デフォルトの名無しさん:2007/12/05(水) 00:58:44
>>884
そのメンバ変数を外部から見たいときはどうすればいいんでしょうか
886デフォルトの名無しさん:2007/12/05(水) 01:05:24
>>884
パブリックにすればいいのでは・・・。
というか、textBox1ってもダイアログとか別のクラスのものですよね?
そういうのは
CTestDlg Dlg;
でまずクラスを作ってあげる?ことをしないと基本できませんよねたしか。
887デフォルトの名無しさん:2007/12/05(水) 03:06:45
ファイルが開かれていて、閉じられていない間待つようにしたいのですが、fpには演算&&が定義できないようです
どうすればいいですか

while(fp&&fp.fail())Sleep(10);
888デフォルトの名無しさん:2007/12/05(水) 04:08:57
よくわからんが
fp != NULL
889デフォルトの名無しさん:2007/12/05(水) 04:18:50
サンクス
890デフォルトの名無しさん:2007/12/05(水) 09:05:22
乱数を使うプログラムを組んでいるのですが、毎回同じ結果になってしまいます。
教授には、「タイムスラングはやった?やってない?じゃあもういーや」というようなことを言われました。
具体的にはどうすればよいのでしょうか。
891デフォルトの名無しさん:2007/12/05(水) 09:07:20
>>890
srand(time(NULL));
892デフォルトの名無しさん:2007/12/05(水) 09:19:06
C++ Win32APIでスタンドアロンの一人用チャットを作っています。
入出力にエディットコントロールを1つずつ設置して、エンターキーが押されたら
入力エリアの内容を出力エリアに渡したいんですが、漢字変換の決定のエンターキーでも
反応してしまって、単語単位でしか打てません。
何かいい方法はないでしょうか。
893892:2007/12/05(水) 09:39:23
事故解決しました。
894デフォルトの名無しさん:2007/12/05(水) 10:13:17
>>891
どうもありがとうございます。
頭にそれを付ければよいのですよね?
895デフォルトの名無しさん:2007/12/05(水) 10:22:05
>>894
プログラム実行の最初に1回だけな。
乱数出力の関数を呼び出すたびに呼ぶんじゃないぞ。
896892:2007/12/05(水) 10:22:45
エンターキーの二連続入力を探知しようと思ったけど、冷静に考えてみたら英語入力だと使えなくなるのでだめでした。
正規表現で改行コードを監視し続ける方法も考えたけど、正規表現を使うのにライブラリが必要らしく諦めました。
どうすればいいんでしょうか。
897デフォルトの名無しさん:2007/12/05(水) 10:27:57
何をどうやってんの?
普通そのreturnは区別できるけど。
898デフォルトの名無しさん:2007/12/05(水) 10:39:08
>>896
なんで正規表現が要るのよ?
単純に文字列から"\r\n"を検索するだけだろ?
stringのfindか、Cならstrstrかなんかで。
899892:2007/12/05(水) 10:39:24

| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|  ←出力用エディットコントロール
|            .|   (エンターキーが押されたら、ここに入力された文を出力したい)
|________|
________
|あいうえお     |   ←入力用エディットコントロール(一行)
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
今はこれでGetAsyncKeyState(VK_RETURN)でエンターキーの入力を監視して、trueなら
GetWindowTextで入力内容を取得→SetWindowTextで出力をしようとしています。
900デフォルトの名無しさん:2007/12/05(水) 10:41:23
IDOKひろったほうがいい気がするが
901デフォルトの名無しさん:2007/12/05(水) 10:42:32
>>896
どうもありがとうございます。一行だけ加えればよいとのことで修正が楽そうでよかったです。本当にありがとうございました!
902デフォルトの名無しさん:2007/12/05(水) 11:19:08
>>892
WM_IME_STARTCOMPOSITIONとENDCOMPOSITION拾ってその間のキー入力は無視
903デフォルトの名無しさん:2007/12/05(水) 11:48:55
昨日、配列のことで質問した者ですが、
例えば巨大配列にa[i]にiをいれてa[i]を表示するというプログラムを作成する場合、
昨日の解説を元に以下のようなプログラムを作成したのですが、

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<time.h>
#include<vector>
using namespace std;

main(){

int N=1000000000;
vector<int> a;
a.resize[N];
int i,n;
n=N;
for(i=0;i<n;++i){
a[i]=i;
}
for(i=0;i<n;++i){
cout << a[i] << " ";
}
}

以下のようなエラーが出ました。

エラー E2235 練習.cpp 14: メンバー関数は呼び出すかそのアドレスをとらなければならない(関数 main() )
エラー E2062 練習.cpp 14: 無効な間接参照(関数 main() )

根本的に間違って理解してしまっているような気がするので、どうかご指導をよろしくお願いします。
904デフォルトの名無しさん:2007/12/05(水) 11:52:28
>>903
14行目ってどこだよ。
905デフォルトの名無しさん:2007/12/05(水) 12:00:29
前のレスでも指摘されてたと思うが、
a.resize[N]; はおかしいだろ。a.resize(N);じゃないの?
だが何故にresize?
最初からvector<int> a(N);じゃだめなのか?
それに領域は確保せずにpush_back使えばいいだろ。
それとCのライブラリを使うのは控えたほうがよいと思う。
どうしても使う場合C++ヘッダcstdlibやctimeを使った
ほうが良いと思う。
906デフォルトの名無しさん:2007/12/05(水) 12:09:59
>>904
すいません
14行目となっているのは
  a.resize[N];
の部分です。

>>905
いろいろなご指摘ありがとうございます。
昨日の指摘にそってプログラムを組んだつもりなのですが・・・。
なるほど、resizeでやる必要はないのですね。

907デフォルトの名無しさん:2007/12/05(水) 12:15:21
>>905
push_backは遅い。せめてreserveしてからにしろ。
908デフォルトの名無しさん:2007/12/05(水) 12:17:10
905さんの言うとおりにa.resize[N]の[]を()に変えたところ
コンパイルはできたのですが、今度は実行画面に
Abnormal program termination
と表示されてしまいました。
うーん、なんじゃこりゃ。
909デフォルトの名無しさん:2007/12/05(水) 12:18:26
--
#include<stdio.h> // 間違い。iostreamを使うなら不要
#include<stdlib.h> // 間違い。現時点では不要
#include<iostream>
#include<time.h> // 間違い。現時点では不要
#include<vector>
using namespace std;

main(){ // 間違い。

int N=1000000000;
vector<int> a;
a.resize[N]; // 間違い。そもそも必要ない。
int i,n; // iはここで宣言すべきではない。nは存在意義がない。
n=N;
for(i=0;i<n;++i){
a[i]=i;
}
for(i=0;i<n;++i){ // iteratorを使うほうがいい。
cout << a[i] << " ";
}
}
910デフォルトの名無しさん:2007/12/05(水) 12:19:44
>>908
だってお前、int型を10億個っていったら、4GBのメモリが要るってことだぞ。
911デフォルトの名無しさん:2007/12/05(水) 12:20:01
>int N=1000000000;
そんなに大きな配列は32bit環境では作れない。
912デフォルトの名無しさん:2007/12/05(水) 12:20:40
>>910
いいえ。メモリがないのが問題じゃありません。
913デフォルトの名無しさん:2007/12/05(水) 12:25:38
じゃあアドレス空間
914デフォルトの名無しさん:2007/12/05(水) 12:43:54
数字を減らしたらなんとかできました。ありがとうございました。
ただ練習ではできたのですが、本番の課題でコンパイルし、実行した結果、ウィンドウが出て来てアドレス系の警告がでて正しく動作しませんでした。

一度int a[N]で作ったソースはかなり長いものなので、あまり大体的には変えたくないのです。

もうすこし頑張ってみます。
915デフォルトの名無しさん:2007/12/05(水) 12:52:01
>>907
そこまで書いたってわからねーだろ
916892:2007/12/05(水) 13:05:01
>>898 >>902
たぶん自分のソースの書き方が悪いんだと思うんですが、やってみてもエンターと同時に出力するか
表示されないかでした。ちょっと時間がないので明日あたり報告にきます。
917デフォルトの名無しさん:2007/12/05(水) 13:43:45
>>914
0から書き直したほうが早いと思うぞ
918デフォルトの名無しさん:2007/12/05(水) 21:31:14
卒論の時期だなあ( ´ー`)y--┛~~
919デフォルトの名無しさん:2007/12/05(水) 21:39:52
思うように結果が出せず理解があやふやになり孤独と絶望に打ちひしがれる
まさしく一人デスマだった
思い出したくもない
920デフォルトの名無しさん:2007/12/05(水) 21:47:23
マ板に逝け
921デフォルトの名無しさん:2007/12/05(水) 22:08:29
a[N][N] b[N][N] c[N][N]

という2つの2次元配列を宣言したすると、その配列の領域のオーダーはどうなりますか?

N^2ですか?
922デフォルトの名無しさん:2007/12/05(水) 22:13:56
>>921
そう。ってかスレ違いじゃね?
923デフォルトの名無しさん:2007/12/05(水) 22:38:05
>>922
どのあたりのスレがいいんですか?
924デフォルトの名無しさん:2007/12/05(水) 22:54:00
#include <stdio.h>
#include <time.h>


int main(void){

clock_t start, end;

start = clock();

なんかの処理

end = clock();

printf("%5.2f\n", (double)(end-start)/CLOCKS_PER_SEC);
return 0;
}

これをC++で書くとどうなりますか?
925デフォルトの名無しさん:2007/12/05(水) 23:02:08
>>924
同じ
926デフォルトの名無しさん:2007/12/05(水) 23:04:41
>>925
変えるのは、表示の部分だけですね。ありがとうございます
927デフォルトの名無しさん:2007/12/05(水) 23:10:26
どうしてもC++的にってんなら
http://www.kmonos.net/alang/boost/classes/timer.html
これだな。
928デフォルトの名無しさん:2007/12/05(水) 23:23:30
>>926
別に、C++でprintfを使ってはいけないという法はないがな
929デフォルトの名無しさん:2007/12/06(木) 04:04:08
C++標準ライブラリで書くと<iostream>だな
930デフォルトの名無しさん:2007/12/06(木) 04:12:53
入門篇からのマルチポストすいません。。。急ぎでしてどなたか部分的にでも回答お願いします

WindowsXP SP2 VC++6.0で動くプログラムの
共有メモリについて質問があります。

複数プロセス間で参照する共有メモリとして、
メモリマップドファイルを検討しているのですが
以下の認識であっていますでしょうか

・mallocで動的に確保する場合に(3M確保を想定)発生する
 O/Sのページング作業がありませんか?
 (連続した物理メモリを取る為に、メモリの入れ替え作業が
  必要になりファイルにメモリの内容を書いたりする事全般)

・メモリマップドファイルの確保、読み書きは普通のファイル
 より高速らしいですが、普通のメモリ確保とどう違いますか?

・メモリマップドファイルを確保したプロセスが解放せず死亡
 した場合にファイルに書く事はできますか?

・そもそも、メモリを確保する際ページング作業をしない保障は
WIndowsではできないのでしょうか?
そうだとしたら、ディスクをFlashMemory等のRAMディスク
にした場合高速にできますか?

当方、組み込み系システムの詳細設計レベルしかやったことがなく、
担当設計者のフォロー?で、代わりにWINDOWSで基本設計 しています。
時間的要件があるので、処理時間が特定できないのはマズいのですが・・
931デフォルトの名無しさん:2007/12/06(木) 04:26:15
>>930
・3MB程度なら、搭載メモリが512くらいあれば余程過労してない限り発生しない。
・メモリマップドファイルとはあたかもメモリの一部のように読み書きできるファイルのことである
・しらね
・できない。普通は備え付け補助記憶装置であるHDDの方が
 外部から差し込んだFlashMemoryよりも距離的に近いし高速。
932デフォルトの名無しさん:2007/12/06(木) 08:34:03
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5414.txt

すみません質問です。上のC++プログラムをg++でコンパイルすると、イテレータの所でエラーが出て失敗するんですが
どうすれば上手くいくでしょうか?

933デフォルトの名無しさん:2007/12/06(木) 08:54:06
>>932
質問するならコンパイルエラーなのか実行時エラーなのか、あとエラーの内容も書いてくれ。

イテレータの宣言のところでコンパイルエラーが出るってわかってるのなら、
その辺の文法とか見直そうよ。

vector<int>::iterator ite;
934892:2007/12/06(木) 11:24:25
WM_IME_STARTCOMPOSITIONでMyflagをtrue、WM_IME_ENDCOMPOSITIONでMyflagをfalseにして

case WM_LBUTTONUP:
  if(Myflag==false){        //Myflagは変換用アンダーバーが出ていたらtrue
    strText = (char *)malloc(256);
    GetWindowText(edit , strText , 256);
    SetWindowText(copy , strText);
    free(strText);
  }
 return 0;

case WM_COMMAND:
  if(GetAsyncKeyState(VK_RETURN)&0x8000){
    if(Myflag==false){        //Myflagは変換用アンダーバーが出ていたらtrue
      strText = (char *)malloc(256);
      GetWindowText(edit , strText , 256);
      SetWindowText(copy , strText);
      free(strText);
    }
  }
  return 0;

こうすると、左クリックを押した時は期待通りに入力ウィンドウの内容を出力ウィンドウへコピーしてくれるんですが、
エンターキーを押した時は無反応です。
WM_COMMANDとGetAsyncKeyStateの相性が悪いんだろうと思ってメッセージループに同じ内容を書き込んでみたら、
今度は逆に変換決定のエンターキーで反応してしまってます。
935デフォルトの名無しさん:2007/12/06(木) 11:51:33
case WM_KEYUP:
if (wParam == VK_RETURN) {
は?
936デフォルトの名無しさん:2007/12/06(木) 11:54:23
IDOKでいいのに
937デフォルトの名無しさん:2007/12/06(木) 11:57:00
spyかなんかでメッセージの流れ読めば、どういう手順でメッセージを処理すればよいか見えてくるはず
938デフォルトの名無しさん:2007/12/06(木) 12:58:09
巨大配列のことを質問したものですが、
newやvectorを使って書き直したところ、メモリのアドレスがでてきてwrite出来ませんでしたやら、readできませんやら出てきました。原因の行はわかったのですが、他の行となんらかわりのない文です。これはもう初めからやり直すしかないですかね?
939デフォルトの名無しさん:2007/12/06(木) 13:14:29
必要なサイズをちゃんと確保していないんだろ
たとえば10000個しか確保していないのにa[10001]に代入しようとしたらエラーになる
940デフォルトの名無しさん:2007/12/06(木) 13:16:28
そうだね、生まれ直して0からスタートするといいと思うよ。
941デフォルトの名無しさん:2007/12/06(木) 13:21:33
ソースコードをあげてみれば分かるよ
942デフォルトの名無しさん:2007/12/06(木) 13:24:22
vcでbluetoothのプログラミングをしたいのですが、vcでできるんでしょうか?
943デフォルトの名無しさん:2007/12/06(木) 13:27:39
>bluetoothのプログラミング
ってなんですか?
944デフォルトの名無しさん:2007/12/06(木) 13:28:58
知らない人は反応しなくていいです。

vcでできるんでしょうか?>まともな方々
945デフォルトの名無しさん:2007/12/06(木) 13:30:12
出来る。
946デフォルトの名無しさん:2007/12/06(木) 13:35:23
Embedded開発か
>bluetoothのプログラミング
(笑)
947デフォルトの名無しさん:2007/12/06(木) 13:45:57
環境がそろえばPCがらみのプログラムを作成する事は出来るんじゃね?

どうやって環境をそろえるんですか?
なんて聞く奴は環境をそろえる事は出来ないと思うけどな〜
948デフォルトの名無しさん:2007/12/06(木) 13:49:18
自分で調べもしないで質問してるっぽいなw
949デフォルトの名無しさん:2007/12/06(木) 13:50:17
n 個の石が環状に並んでいる.それぞれの石には番号がついており,最初は時計回りに順番に並べられている.番号は 0 から n-1 までの整数である.
m 番の石を最初に取り除く.直前に除いた石から時計回りに石をたどって k 個目を取り除く作業を,残り 1個になるまで繰り返すとする.
標準入力から,n, m, k の 3つの整数値が与えられたとき,最後に残る石の番号を答えるプログラムを書きなさい.

普通の継子立てとおなじく考えてたら全然ダメでした。。。アドバイスお願いします。
950デフォルトの名無しさん:2007/12/06(木) 13:53:13
宿題スレ池
951デフォルトの名無しさん:2007/12/06(木) 13:57:19
>>948
ここで質問する==調べものをする
だからなw
952デフォルトの名無しさん:2007/12/06(木) 13:58:29
>>949
どこで詰まってるのかよくわからんが、代数的に解かなくても

>m 番の石を最初に取り除く.直前に除いた石から時計回りに石をたどって k 個目を取り除く作業を,残り 1個になるまで繰り返す

この手順通りのことを実際にやるようなプログラムを作ればいいんでない?
953デフォルトの名無しさん:2007/12/06(木) 14:29:05
0xFFFLの最後のLが意味わからんとです
954デフォルトの名無しさん:2007/12/06(木) 14:31:34
>>953
long
955デフォルトの名無しさん:2007/12/06(木) 14:31:38
Lを付けるとlong型
0L とか 4095L とか
956デフォルトの名無しさん:2007/12/06(木) 14:34:04
>>949
継子立てでいけると思うけど、どうダメだった?
957デフォルトの名無しさん:2007/12/06(木) 21:50:36
巨大配列の男ですが、ご指摘してくれたように、領域確保が要素数に対して少なかったという理由でした。
課題もなんとか終わりました。質問に対して答えてくれた方々、本当にどうもありがとうございました。
958デフォルトの名無しさん:2007/12/06(木) 23:35:17
どこで聞けばいいのかわからないのでとりあえずここで。

配列のサイズってどこに格納されているんでしょうか?
gcc -S でソースを眺めてみたところ特にサイズらしきデータが見当たらず、
sizeofした結果は即値で見つけやすかったんですが。

関係あるかどうかinfo scopeでは配列はサイズは表示されるのですが、
型と要素数では表示されないんですね。

スレ違いなら誘導よろ。
959デフォルトの名無しさん:2007/12/06(木) 23:49:39
>>958
配列のサイズって格納されてるの? 俺はできるだけ
vector とか使って size わかるようにして使うようにしてるけど。
960デフォルトの名無しさん:2007/12/06(木) 23:50:37
>>958
配列サイズメモリには残っていない
コンパイル中にだけ残っている
サイズ知りたければvector
961デフォルトの名無しさん:2007/12/06(木) 23:51:10
配列サイズは、メモリには残っていない
962デフォルトの名無しさん:2007/12/06(木) 23:59:07
>>958の人気にshit

ただし、newで作った配列は、どこかにサイズ情報を持ってる。返されるアドレスの直前とか。
そうでないと、delete[]で正しく開放できないからね。
963デフォルトの名無しさん:2007/12/07(金) 00:06:26
レスどうも。

スタック上の固定長配列はオフセットに化けてメモリ上には展開されないって感じでしょうか。

>>962
そういえば、delete[]はサイズ意識しますもんね。
今度newした配列見てみることにします。
964デフォルトの名無しさん:2007/12/07(金) 00:58:34
new[]でも要素数を知る方法はプログラマが用意しない限りない。
965デフォルトの名無しさん:2007/12/07(金) 08:50:47
>>933
すみません、ご指摘ありがとうございました。
966282:2007/12/07(金) 20:55:28
テキストファイルに他のプログラム用のコードを書くプログラムなのですが、
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std ;
int main(){
stringstream ss;
FILE *fp ;
for ( int t = 0 ; t < 100 ; t++ ){
ss << "data" << t ;
cout << ss.str() <<endl;
if ((fp = fopen(ss.str().c_str(), "r" )) == NULL )
return 0 ;
ss.str("");}}
上記の部分で、ファイルはresult0〜result99まで存在しているにもかかわらず
result46でプログラムが終了します。
ifの判定ミス?だとは思うのですが、どうしてそうなるのかまったくわかりません。
コンパイラはborland C++です
967デフォルトの名無しさん:2007/12/07(金) 21:05:44
答えはfcloseが無いから。
968デフォルトの名無しさん:2007/12/07(金) 21:11:57
すいません初心者で基本的なことかもしれませんが、
知っている方がおられれば教えてください

10進数で11とかだと16進数でbになると思うのですが
4桁で000bと出力するにはどうすればよろしいでしょうか?
よろしくお願いします。
969デフォルトの名無しさん:2007/12/07(金) 21:13:37
うまくいきました。ありがとうございます。

ageたり、282とか間違ってるし答えも単純だし、終わってるな俺 orz
970デフォルトの名無しさん:2007/12/07(金) 21:14:54
printf("%04x", 11);
971デフォルトの名無しさん:2007/12/07(金) 21:20:01
>>970

すいません、ありがとうございます。
04の0が抜けてました。
ほんとうにありがとうございます。
972デフォルトの名無しさん:2007/12/07(金) 22:50:12
非仮想インターフェースの使い方がいまいち解りません
多重継承時に処理のし忘れを防止するというのはわかるが
それだけのためにラッパーを作るのはどうかなという気がしないわけでもないのですが…
973デフォルトの名無しさん:2007/12/07(金) 23:04:14
使い方なんてわからなくてもいいんじゃない?
意味や意図がわかってれば

public な仮想関数は2つの役目を担っているので
public な非仮想関数と private な仮想関数に分けましょう
ってことを意識すれば public な仮想関数は気持ちわるい

そうやって1つのエンティティに1つの役目を負わすことを意識して
シンプルで扱いやすい設計ができた経験があれば
974デフォルトの名無しさん:2007/12/08(土) 02:25:51
>>972
気持ち悪いと思うならやめた方がいいと思う。
そもそもある設計手法が効果的に働くためには一定の条件が必要で、
>>972のプログラムではNVI(Non Virtual Interface)が効果的に働かない部類のものかもしれない。
将来的に不具合が出てきたら変えればいい。
パターンは大事だけど、経験も大事。
975デフォルトの名無しさん:2007/12/08(土) 07:26:29
すみません
デルファイのようにGUIでプログラムできるC++はありますか ボーランドC++以外のやつ有りますか?
976デフォルトの名無しさん:2007/12/08(土) 08:05:46
・VC(CLI + .net)
・WideStudio
977デフォルトの名無しさん:2007/12/08(土) 08:18:40
>>976
サンクス
978デフォルトの名無しさん:2007/12/08(土) 08:28:10
ドットネットと、ボーランド以外ではWideStudioしかないってことで良いかな?
なんか初めの二つは、SP2とドットネットのインストールが必須な上に作業中の動作が重いんだ
古いパソコンでもDelphi6のように動くC++が使いたいとおもった
979デフォルトの名無しさん:2007/12/08(土) 08:33:03
あと、もっとも簡単にC++でネィティブwindowsアプリを開発するにはどうしたらいいかな? ATLやWTLが簡単なの?
なんかこれでも難しいんだ・・・
980デフォルトの名無しさん:2007/12/08(土) 09:06:44
MFC
981デフォルトの名無しさん:2007/12/08(土) 09:07:28
wxWidgets
982デフォルトの名無しさん:2007/12/08(土) 10:04:45
一番簡単なのは、MFCですか? wxWidgetsですか? WTLですか? ネイティブで簡単なのが良いです
983デフォルトの名無しさん:2007/12/08(土) 10:07:57
>>982
釣りか?
一番なんてものは主観だ
全て使ってみて自分で選べ
984デフォルトの名無しさん:2007/12/08(土) 10:55:08
詳しくないが結構 MFC 嫌う人多いね。
Win32API の方が良いといって使ってたりする。
985デフォルトの名無しさん:2007/12/08(土) 11:14:23
>>978
C++Builder6
986デフォルトの名無しさん:2007/12/08(土) 11:26:15
だれかwindows APIのみを使って、windowsアプリを開発できるC++の開発環境を開発してもらえないだろうか?
987デフォルトの名無しさん:2007/12/08(土) 11:39:08
Windows APIつかえばいいじゃん
988デフォルトの名無しさん:2007/12/08(土) 11:41:42
標準入力からnを入力して、

A[n][n]の配列を宣言するにはどうしたらいいですか?
989デフォルトの名無しさん:2007/12/08(土) 11:45:19
int n;
scanf("%d",&n);
int A[n][n];
990デフォルトの名無しさん:2007/12/08(土) 11:46:20
>>989
それじゃできないです
991デフォルトの名無しさん:2007/12/08(土) 11:47:56
int **A;
A=new int*[N];
for(n=0;n<N;n++)A[n]=new int[N];
992デフォルトの名無しさん:2007/12/08(土) 11:51:49
vector< vector<int> > A(10);
for(int n=0;n<10;n++)A[n].resize(10);
993989:2007/12/08(土) 11:52:25
>>990
できる。
994989:2007/12/08(土) 11:53:33
$ cat a.c
#include <stdio.h>

int main() {
int n;
scanf("%d", &n);
int A[n][n];
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
A[i][j] = i * 10 + j;
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
printf("A[%d][%d]=%d\n", i, j, A[i][j]);
return 0;
}
$ cc -std=c99 a.c
$ ./a
3
A[0][0]=0
A[0][1]=1
A[0][2]=2
A[1][0]=10
A[1][1]=11
A[1][2]=12
A[2][0]=20
A[2][1]=21
A[2][2]=22
995デフォルトの名無しさん:2007/12/08(土) 11:54:32
C99とかだろ?
996デフォルトの名無しさん:2007/12/08(土) 12:07:32
>>992
> vector< vector<int> > A(10);
> for(int n=0;n<10;n++)A[n].resize(10);

10 ってなんだ?

cin>>n;
vector<vector<int> > A(n,vector<int>(n));

かな。
997デフォルトの名無しさん:2007/12/08(土) 12:08:28
>>993
定数値が必要っていわれます
998デフォルトの名無しさん:2007/12/08(土) 12:10:12
C99じゃないんだろ。
999デフォルトの名無しさん:2007/12/08(土) 12:10:22
>>997
自分の環境も書かずに質問するからそうなる。
1000デフォルトの名無しさん:2007/12/08(土) 12:25:09
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。