トップページ⇒tech
1001コメント301KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2008/02/20(水) 12:33:41
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.48【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1202141921/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0784デフォルトの名無しさん2008/02/26(火) 11:37:48
そういうもの。
0785デフォルトの名無しさん2008/02/26(火) 11:40:09
>>783
というか出来ないとまずいだろ。
コピーコンストラクタとか代入演算子の定義が出来なくなってしまうよ。
0786デフォルトの名無しさん2008/02/26(火) 12:06:04
protectedじゃなくてもアクセス出来ちゃうの?
0787デフォルトの名無しさん2008/02/26(火) 12:22:23
protectedにすると、さらにtest2からも参照できるようになる
0788デフォルトの名無しさん2008/02/26(火) 13:01:03
プログラムにZIPを解凍する機能を盛り込みたいのですが、そのような
機能のスタティックリンクできるライブラリをご存じないでしょうか?

環境はVisualC++.net2003です。
0789デフォルトの名無しさん2008/02/26(火) 13:07:03
>>788
zlib
0790デフォルトの名無しさん2008/02/26(火) 13:30:25
>>783じゃないが試してみたけど
同じクラスのインスタンスへの参照やポインタを持つとアクセス権限ブッチぎれちゃうのか

なんかカプセル化とかそういう面で考えると気持ち悪いというかなんというか
仕様上出来ないと仕方ないと言うのも分かるのだが・・・
0791デフォルトの名無しさん2008/02/26(火) 13:33:53
789�d
0792デフォルトの名無しさん2008/02/26(火) 13:34:46
C++のprivateはクラスプライベートであってインスタンスプライベートの意味ではない
0793デフォルトの名無しさん2008/02/26(火) 14:02:36
>>782
すみません、寝てました。返答有難うございます。

ちなみに「ポインタ変数を参照で渡す」と言う意味ならむしろ
BOOL hoge( HOGE &*ptr )
のような気がするのですが、なんで*&ptrなのでしょう?
それが仕様と言われればそこまでですが。
0794デフォルトの名無しさん2008/02/26(火) 14:24:18
>>793
http://kmaebashi.com/programmer/pointer.html
これの応用。
ptrのほうからreference to pointer to HOGEと読める。
0795デフォルトの名無しさん2008/02/26(火) 14:26:03
>>793
typedef HOGE * HOGE_PTRしてみれば判る。
0796デフォルトの名無しさん2008/02/26(火) 14:37:54
>>794>>795
なるほど。正直きちんと理解できたかは自信ないですが、ちゃんと法則が
あってそうなっているのは分かりました。
どうも有難うございましたm(__)m
0797デフォルトの名無しさん2008/02/26(火) 14:46:05
vc2008のコマンドラインコンパイラだけ手に入りますか
vc6でコンパイルしたいです
sp1で鈍いパソコンです 
0798デフォルトの名無しさん2008/02/26(火) 14:48:16
EEを入れてみたか?
0799デフォルトの名無しさん2008/02/26(火) 14:49:23
>>797
コンパイラだけ手に入れるのは無理だが
コマンドラインでの利用はできるよ
0800デフォルトの名無しさん2008/02/26(火) 14:56:40
sp1にインストールできますか
0801デフォルトの名無しさん2008/02/26(火) 15:02:40
>>792
kwsk

according to standard
0802デフォルトの名無しさん2008/02/26(火) 15:49:24
すみません
DOSの実行ファイルで、標準出力へは書き出されないメッセージを取得する方法ありませんか?
hoge.exe > log.txt
として取得できないやつです 画面には出ます
標準出力、標準エラーの取り方はわかります
0803デフォルトの名無しさん2008/02/26(火) 16:09:38
>>802
それのどこがC/C++に関係があるの?
0804デフォルトの名無しさん2008/02/26(火) 16:18:38
>>802
つ printscreen
0805デフォルトの名無しさん2008/02/26(火) 16:34:10
>>803
標準出力はこれで受け取れますが、exeが返す実行結果がとれません

#include <windows.h>

main(){
HANDLE hFile = CreateFile("log.txt",GENERIC_WRITE,FILE_SHARE_WRITE, NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
SetStdHandle(STD_OUTPUT_HANDLE , hFile);

STARTUPINFO si; PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));ZeroMemory(&pi, sizeof(pi));
si.cb = sizeof(si);
si.hStdOutput =hFile ;
si.hStdError =hFile ;
si.wShowWindow = SW_HIDE;

CreateProcess(NULL, "HtoX32c.exe e:\\0.htm ", NULL, NULL, FALSE,0, NULL, NULL, &si, &pi);

WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandle(hFile);
}
0806デフォルトの名無しさん2008/02/26(火) 16:51:04
HtoX32とやらが標準エラー出力に出している可能性は無い?
そもそも、まさかHtoX32はWindowを持っているアプリケーションなのか?
だとしたら、メッセージフックなどの手段が必要になるよ。
つーか、HtoX32とやらが何ものかにも依るけど同等のプログラムを自分で書いた方が手っ取り早かったりしてね。
0807デフォルトの名無しさん2008/02/26(火) 16:59:39
HTMLをテキストに変換するプログラムです
ソースが公開されていたり定番のライブラリとかありませんか?
0808デフォルトの名無しさん2008/02/26(火) 17:03:03
正規表現での消し方のサンプルみながら自分でやってみます
0809デフォルトの名無しさん2008/02/26(火) 17:11:51
>>805
http://support.microsoft.com/kb/190351/ja
0810デフォルトの名無しさん2008/02/26(火) 17:15:43
popenを使えたら楽だな
あればだけど
0811デフォルトの名無しさん2008/02/26(火) 17:44:11
>>805
そのコードだと、自プロセスの標準出力が hFile になるけど、子プロセ
スの HtoX32c.exe の標準出力はコンソールのままでは?

0812デフォルトの名無しさん2008/02/26(火) 17:44:15
1つの関数に複数の構造体を渡すことって可能でしょうか?

suruct typedef{
int x,y;
}SAMPLE;
SAMPLE sample;

suruct typedef{
int x,y;
}SAMPLE2;
SAMPLE2 sample2;

void AA(??? *s){
int a = s->x;
int a = s->y;
}

void main(){
AA(&sample);
AA(&sample2);
}
こんな処理をしたいのですが、???の所がわかりません。
良い方法を教えていただきたいです。

仮の構造体を1つ作って、その変数に代入→渡すってやり方だとできましたが
激しく面倒くさい。
0813デフォルトの名無しさん2008/02/26(火) 17:52:41
関数オーバーロード、もしくはテンプレート関数でぐぐれ。
0814デフォルトの名無しさん2008/02/26(火) 17:54:43
>>812
typedef SAMPLE SAMPLE2;
0815デフォルトの名無しさん2008/02/26(火) 18:02:57
>>813
>>814
情報ありがとうございます。
テンプレート関数が一番やりたかった事を解決してくれそうでした。
ありがとうございました。
0816デフォルトの名無しさん2008/02/26(火) 18:10:58
構造体のメンバを決め打ちするようなテンプレート関数は感心しないな。
テンプレートを使うということはC++で良いので、それならメンバ関数にしてしまった方が良い。
0817デフォルトの名無しさん2008/02/26(火) 18:22:32
ifstream::readって実際に何バイト読めたか検出できないんですか?
freadみたいにふつうに戻り値が来るのかと思いきや違うみたいですし…。
0818デフォルトの名無しさん2008/02/26(火) 18:28:13
つ gcount
0819デフォルトの名無しさん2008/02/26(火) 18:29:13
>>817
自己レス。failで少なくとも期待通りの
バイト数読めたかどうかは取得できるのね。
0820デフォルトの名無しさん2008/02/26(火) 18:30:30
>>818 と思ったらそんなメソッドがあったか。サンクス
0821デフォルトの名無しさん2008/02/26(火) 18:31:39
fstreamは重要なところでは使うべきではない
APIのほうがよい
0822デフォルトの名無しさん2008/02/26(火) 18:55:55
んなこたーない
0823デフォルトの名無しさん2008/02/26(火) 19:18:08
fstreamは一社の開発ではないがAPIはMS一社
どのコンパイラでも同じ動作になる
あと3000個とか開けない
0824デフォルトの名無しさん2008/02/26(火) 19:18:50
if文って 文字列と文字列を比べることって出来ないですよね?
1 = あいうえお
2 = かきくけこ
3 = さしすせそ
4 = あいうえお
if (a = 1){
}
みたいなことをやりたいのですがどうしたら良いでしょうか?
0825デフォルトの名無しさん2008/02/26(火) 19:19:44
stringはできる
0826デフォルトの名無しさん2008/02/26(火) 19:20:33
> どのコンパイラでも同じ動作になる
コンパイラで差はないかもしれないが・・・
0827デフォルトの名無しさん2008/02/26(火) 19:21:41
>>823
んなばかな
APIがMS一社で規定されてるなんて初めて知った
MSはついに世界を征服したのか
0828デフォルトの名無しさん2008/02/26(火) 19:23:04
Windowsのファイル入出力APIのことを指す
0829デフォルトの名無しさん2008/02/26(火) 19:55:08
>>824 strcmpしとけ
0830デフォルトの名無しさん2008/02/26(火) 21:19:23
CreateProcessしたときに止まらなくなったら停止させたいんですけど
どうやったらいいですか?
0831デフォルトの名無しさん2008/02/26(火) 21:22:25
ググって解決しました
0832デフォルトの名無しさん2008/02/26(火) 21:58:13
マルチスレッドで動かしてる関数って_endthread()書かなくてもreturn;書いてたら
問題ない?
0833デフォルトの名無しさん2008/02/26(火) 22:04:41
問題ない。
ところで_beginthreadは使うなよ。_beginthreadexにしろよ。
http://msdn2.microsoft.com/ja-jp/library/kdzttdcb(VS.80).aspx
0834デフォルトの名無しさん2008/02/26(火) 22:15:49
VC6.0です。

__declspec(dllimport) int __stdcall hoge( LPWORD, LPWORD, LPWORD );

という形の関数のアドレスが入る関数ポインタhageを作りたいのですが、
うまく宣言できません。

__declspec(dllimport) int __stdcall (*hage)(LPWORD, LPWORD, LPWORD );
などとやるとコンパイルエラーになってしまいます。

どうすれば宣言できるのでしょうか?
0835デフォルトの名無しさん2008/02/26(火) 22:17:26
declspecは関係ないだろ
0836デフォルトの名無しさん2008/02/26(火) 22:19:03
関係あるよ
0837デフォルトの名無しさん2008/02/26(火) 22:19:32
関数ポインタで悩んだら、typedef

typedef __declspec(dllimport) int __stdcall hogetype( LPWORD, LPWORD, LPWORD );
hogetype hoge;
0838デフォルトの名無しさん2008/02/26(火) 22:36:15
関数ポインタの便利さになれすぎてしまって
最近 if を見るたびにすぐ関数テーブル化してしまう。

間違い?
0839デフォルトの名無しさん2008/02/26(火) 22:39:07
なるべくシンプルにかくのを推奨されますからね
0840デフォルトの名無しさん2008/02/26(火) 22:43:09
関数テーブル間違いです
鈍いです
0841デフォルトの名無しさん2008/02/26(火) 22:47:58
なんかCreateProcessすると不安定になる スレッドでsystemで実行してみる
CreateProcessを短期間に20回以上使うと動かなくなるエラーってありますか?
実行する側のexeのせいかもしれないですが
0842デフォルトの名無しさん2008/02/26(火) 22:50:02
テーブルだめなのか・・
if の中にさらに if があるともうその地点でうわ・・って思ってしまう。

ちょっとソース見直してみます
0843デフォルトの名無しさん2008/02/26(火) 22:50:41
>>833
ありがとう。今度からそうする
0844デフォルトの名無しさん2008/02/26(火) 22:54:19
そこでBoost::functionとコールバックですよ。
0845デフォルトの名無しさん2008/02/26(火) 22:59:28
>>842
無理して避けることもないよ。何事も程々が1番。
0846デフォルトの名無しさん2008/02/26(火) 23:02:18
グローバル変数って絶対使わない方がいいんですかねえ
例えばゲームプログラムを作っていて、状態を管理するグローバル変数を使っているとする。
その変数には、ゲームの進行に合わせて、例えば
定数(TITLE=0, STAGE1, STAGE2, STAGE3, STAGE_CLEAR, GAME_OVER, ENDING)が入るとする。
処理は上の状態それぞれでモジュール化されているとすると、
どうしても状態管理変数はグローバル変数化してどの状態からでも
参照・設定できるようにせざるを得ないと思うのですが、何かいい手があるのでしょうか。
状態管理変数をファイル内static変数にしてセッターを使って書き換えるようにしたり、
状態管理変数とセッターをクラスにしてそのオブジェクトのスコープをグローバルにするもしくは状態管理変数とセッターを
staticにしてどのクラスからでも書き換えられるようにするくらいなら最初から状態管理変数をグローバルにしといた方が
シンプルだと思うのですがどうでしょうか。
0847デフォルトの名無しさん2008/02/26(火) 23:03:57
数が多くなければOK、重要ならOK
0848デフォルトの名無しさん2008/02/26(火) 23:05:38
>>846
静的なシングルトンもグローバル変数も似たようなもんだ
グローバル変数でいいんじゃね?

ただ、関数経由にしておけばデバッグするときに setter で引っ掛ければいいだけだから
ずいぶんと楽になる*かもしれない*
0849デフォルトの名無しさん2008/02/26(火) 23:30:59
>>846
シングルタスクなら良いけど。
GUIでスレッド使って随時処理しながら入力待ちして、
入力はコールバックで処理、みたいのだと、
ゲッタやセッタ作った方が排他処理し易いかなぁ。

まぁケースバイケース?
0850デフォルトの名無しさん2008/02/26(火) 23:32:07
ゲーム状態のインスタンスが1つだけなら、グローバル変数でいいと思う。

インスタンスが複数なら、
状態ごとの処理に、状態管理変数をクラス化したものを渡すとか、
もしくはstateパターンなんてのもいいかもしれない。
0851デフォルトの名無しさん2008/02/26(火) 23:33:35
どうせグローバル変数的に使うとはいえ、
それゆえにどこから変更されてるかを追跡するためにも
>関数経由にしておけばデバッグするときに setter で引っ掛ければいいだけだから
というのは地味に大事
0852デフォルトの名無しさん2008/02/26(火) 23:38:31
ゲーム状態も例えば、プレイヤキャラの他にAIキャラが裏で進行中なんてことになると、
グローバルだと破綻するよね。そんな場合はゲーム状態はキャラクタに依存する情報になるわけだけど。
0853デフォルトの名無しさん2008/02/26(火) 23:46:14
シングルトンとグローバル変数は違う。
グローバル変数として使ってる間違ってる例が多いのが勘違いの原因かもしれない。

自分だったら>>846の場合、シーンマネージャクラスを作ってそいつに振る舞いを管理させる。
極力グローバル変数は使わない。
0854デフォルトの名無しさん2008/02/27(水) 00:01:10
シングルトンは初期化のタイミングを選べるからグローバルとは大きく違う。
0855デフォルトの名無しさん2008/02/27(水) 00:20:00
結局オブジェクト指向の導入でCにおけるグローバル変数使用の問題は解決できてないんじゃねえの
Cを極めればオブジェクト指向言語を使わなくても良いコードが書けるんじゃねえの結局クラスとか
オブジェクトとかデザインパターンとか複雑で分かりにくくするなだけじゃね
0856デフォルトの名無しさん2008/02/27(水) 00:21:36
system は空白が改行のように扱われてしまいます
パラメータは渡せませんか?
0857デフォルトの名無しさん2008/02/27(水) 00:22:49
>>855
んなこたーない
0858デフォルトの名無しさん2008/02/27(水) 00:26:23
ファイルの読み込みについての質問です。

 ----
 2008/02/20,01:00:00
 2008/02/21,02:00:00
 2008/02/26,03:00:00
 …
 ----

と書かれたファイルを、

 tmp[0] = 2008;
 tmp[1] = 2;
 tmp[2] = 20;
 tmp[3] = 01;

といったように取り込みたいです。
スラッシュとカンマとコロンを区切りにしてうまく取り込む方法を教えてください。
もし、スラッシュしかなければstrtokとatoiでできたのですが、3種類あるので困っています。
よろしくお願いします。
0859デフォルトの名無しさん2008/02/27(水) 00:28:04
>>856
どんな文字列を渡したとき?
0860デフォルトの名無しさん2008/02/27(水) 00:28:08
見た感じフォーマットは固まってるだろうから
単純に先頭からパースするだけじゃね
0861デフォルトの名無しさん2008/02/27(水) 00:29:09
string s;

s.substr(0,4);
s.substr(5,2);
s.substr(7,2);
とかでいいのでは?
0862デフォルトの名無しさん2008/02/27(水) 00:31:49
>>858
fscanf(fp, "%d/%d/%d,%d:*[^\n]", &tmp[0], &tmp[1], &tmp[2], &tmp[3]);
0863デフォルトの名無しさん2008/02/27(水) 00:31:50
>>859
自己解決しました 同名のexeがありそれが動いていたようです
0864デフォルトの名無しさん2008/02/27(水) 00:34:11
862の訂正 *の前に%
fscanf(fp, "%d/%d/%d,%d:%*[^\n]", &tmp[0], &tmp[1], &tmp[2], &tmp[3]);
0865デフォルトの名無しさん2008/02/27(水) 00:34:23
>>855
>Cを極めればオブジェクト指向言語を使わなくても良いコードが書けるんじゃねえの
これは当たり前なんだが、(といってもオブジェクト指向を使わないって意味じゃない、
Cでもオブジェクト指向は昔から存在する)

>結局クラスとかオブジェクトとかデザインパターンとか複雑で分かりにくくするなだけじゃね
何が複雑なんだ?
デザインパターンなんか当たり前の設計パターンに名前付けただけじゃないか。
0866デフォルトの名無しさん2008/02/27(水) 00:36:27
変数へのアクセスを制限することで単純になるんだけどなぁ。
無制限に変数にアクセスできたほうが複雑だって、わかんないかなぁ。
0867デフォルトの名無しさん2008/02/27(水) 00:48:26
Perlの文法が糞なのは間違いない。
08688582008/02/27(水) 01:12:38
>861
レスありがとうございます。
が、、私ではうまいこと使えませんでした。ごめんなさい。。

>860, 864
fscanfでできました。
どうもありがとうございました。
0869デフォルトの名無しさん2008/02/27(水) 01:23:50
C++で配列のコピーってどうやりますか?
for()文で代入を回す?
0870デフォルトの名無しさん2008/02/27(水) 01:24:40
memcpyが最速では
0871デフォルトの名無しさん2008/02/27(水) 01:26:15
>866
何を以て「単純」とするかに依るんだろうな。
多分 >855 は言語の構造として単純であること、習得の容易さなどを見て言っているんだろうが
大きなコードを、そのまま扱うと中身はかなり複雑化する。
クラスや名前空間などを使って、大きなコードを小さな部品の集合体として考えて
それぞれの部品単位で扱うことで、ひとつひとつの部分は単純になる。
0872デフォルトの名無しさん2008/02/27(水) 01:26:28
>>869 std::copy()
0873デフォルトの名無しさん2008/02/27(水) 01:27:43
>>870 C++ で memcpy() は使わない。禿との約束だよ。
0874デフォルトの名無しさん2008/02/27(水) 01:30:02
推奨されていなくても確保の仕方から
vectorでもstringで有効でしょう memcpy
0875デフォルトの名無しさん2008/02/27(水) 01:31:12
memcpyより自分でアセンブラ書いた方がはやかったんだけど、そんなもん?
0876デフォルトの名無しさん2008/02/27(水) 01:31:59
>>875 それはめずらしい。
0877デフォルトの名無しさん2008/02/27(水) 01:39:54
memcpyより早いコードくれ
0878デフォルトの名無しさん2008/02/27(水) 01:40:26
SSE使ったんだけどね
0879デフォルトの名無しさん2008/02/27(水) 02:17:49
マイクロソフトのCHMファイルはなかなかいいんだけど
SJISしかコンパイルできなくて、サイズが20Mとかになるとコンパイルに失敗する
CHMをパクってWindowsの標準ヘルプ形式を作りたい 
参加者募集中
圧縮接尾辞配列がいいと思う
ブロックーソーティングしたデータはそのまま全文検索できるとおもうがどうか?
0880デフォルトの名無しさん2008/02/27(水) 02:27:20
複数のテキスト文書を圧縮できてかつ高速に全文検索できて
CHMのような普及率を目指したい
デスクトップサーチとは目的が違う 元のファイルが復元できてまとめられる点が大事
0881デフォルトの名無しさん2008/02/27(水) 02:28:28
tarでいいじゃない
0882デフォルトの名無しさん2008/02/27(水) 02:33:30
tarは全文検索できるように設計されてるの?
0883デフォルトの名無しさん2008/02/27(水) 02:38:51
tarは圧縮しないからね。
■ このスレッドは過去ログ倉庫に格納されています