【初心者歓迎】C/C++室 Ver.49【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/02/20(水) 12:33:41ただしその場合、質問者は必ず環境を書きましょう。
※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
0751744
2008/02/25(月) 21:48:04「C++の勉強したいんだがどの本買って勉強したらいいんですか?」
って聞いてるのと一緒だべ?
0752デフォルトの名無しさん
2008/02/25(月) 21:50:19私にもそんな時期がありました(マジで)
0753デフォルトの名無しさん
2008/02/25(月) 21:51:50プロファイルとってそこだけしぼって最適化すればいい。
最初から保守性犠牲にしてまでパフォーマンスチューニングが必要な分野って
限られてると思うよ。
0754デフォルトの名無しさん
2008/02/25(月) 21:55:02今からC++勉強するよりもおまいは吉里吉里勉強したほうが幸せになれると思う
0755744
2008/02/25(月) 22:06:01エニバディー、ティーチ ミーしてくれませんか?
0756デフォルトの名無しさん
2008/02/25(月) 22:16:44理解できずに挫折したか。
0757デフォルトの名無しさん
2008/02/25(月) 22:16:590758デフォルトの名無しさん
2008/02/25(月) 22:18:58関係はないが、とりあえずバッファを buffer_size しか確保してないのに
fgets で filesize 読もうとしてるのはヤバい。
0759デフォルトの名無しさん
2008/02/25(月) 22:28:27else if(count > 0)
0760744
2008/02/25(月) 22:29:05bufferはstring型でいこうとおもったんですが、
fin>>buffer;でやると、単語読み込みで一行読み込みにはならないし、
fgets(buffer.c_str(),filesize,fin);はコンパイラに怒られるし、
どうしようもないんで駆け込み寺としてここにきました。
たぶんこれも慣れた人なら簡単に直せるんだとは思いますが、
いままでC言語ばっかりやってたもんで、変な癖ついてるんです。
0761デフォルトの名無しさん
2008/02/25(月) 22:30:580762744
2008/02/25(月) 22:32:36K&Rにも載ってたんで知ってます。
0763デフォルトの名無しさん
2008/02/25(月) 22:32:53よくわからんが、
一行よむなら、std::.getline( fin, buffer );だが。むろん、finはifstream辺りの必要はある。
初めて"{"が存在する行をみつけたとき、上のifでcount++になって、
下のifも成立してでcount++で2になるんだが、そういうものなのかね?
0764デフォルトの名無しさん
2008/02/25(月) 22:33:420765デフォルトの名無しさん
2008/02/25(月) 22:35:10あと必要な物はやる気と根気ですかね?
>>751
"だべ"ってどういう意味ですか?
マルチリンガーじゃないので日本語以外わからないんです、本当にごめんなさい。
0766デフォルトの名無しさん
2008/02/25(月) 22:36:48キモス
0767744
2008/02/25(月) 22:43:14else ifですか。基本的なところ躓きました。
ありがとうございます。勉強になりました。
>>763
そんな関数があったんですか。
ちょっとgetlineの中をのぞいて使わせてもらいます。
>>764
Cアンサーブックのほうです。
バイブル本とか釣られてやってみたけど、
糞面白んないんで解くのやめました。
0768デフォルトの名無しさん
2008/02/25(月) 22:44:52string buf (n, '\0' );
&buf0]; ← これはchar*のところへ入れられる
と使うと便利だ 自動で消滅するし
0769744
2008/02/25(月) 23:06:24下のほうhtmlのタグみたいですね。
奥の手っぽいんでどうしようもないときに使ってみます。
ありがとうございました。
0770デフォルトの名無しさん
2008/02/25(月) 23:48:16さっき、恐らくは想定したと思われる仕様を完璧に満たすソースを書いたんだが、
反応がなかったから会社に置いてきちゃった。次に会社に出るのは3日後なんで、
後で寝ちゃわなければ軽く再現してみるよ。
0771デフォルトの名無しさん
2008/02/25(月) 23:57:46>次に会社に出るのは3日後なんで
何でだ?
0772デフォルトの名無しさん
2008/02/26(火) 00:01:47続きそうな文章だなw
0773デフォルトの名無しさん
2008/02/26(火) 00:08:58本体 > VC++
開発用ユーティリティ > TurboC++ Exploer (BCB)
でいいんでないの?
VC++はGUIアプリの構築はそれなりに手間かかるし、BCBは紙芝居の開発じゃ全然VCLの長所が生かせない。
0774デフォルトの名無しさん
2008/02/26(火) 00:16:21単に、明日明後日は客先直行直帰だから。
>>744
手直ししながら、「クラスにする必要ないじゃん」とか
「変数は極力局在化しろよな」とか「マクロシンボルは大文字だろ」とか
「入力にfgets()を使うなら出力はfputs()じゃないか」なんて乗りで
修正してたらこうなった。
#include <cstdio> #include <cstring>
#define BUFFER_SIZE 1000
int func(char *argv[]) {
FILE * fin = fopen(argv[1],"r");
if (fin == NULL) return 1;
unsigned count = 0;
char buffer[BUFFER_SIZE];
while(fgets(buffer, sizeof(buffer), fin)!=NULL) {
if (count == 0) {
if (strchr(buffer,'{') != NULL) {
fputs(buffer, stdout);
count++;
}
} else if (count > 0) {
if (strchr(buffer,'{') != NULL) count++;
if (strchr(buffer,'}') != NULL) count--;
fputs(buffer, stdout);
}
}
fclose(fin);
return 0;
}
int main(int argc,char *argv[]) {
return func(argv);
}
0775744
2008/02/26(火) 00:36:44まぁ人には癖があるからね。
ありがとう。
人と自分のソースを比較するのが、
一番勉強になるよ。
0776デフォルトの名無しさん
2008/02/26(火) 00:45:12>774は常套句の宝庫だと思うよ。fgets(buffer, sizeof(buffer), fin)とか。
>744のクラスは、変数をばら撒くだけでクラスとしては何もしない無意味な設計だったし。
後はあれだな、関数に渡すのはconst char *にしてmain()で予めargcのチェックと
argv[1]の抽出位しておくのが常套手段か。
0777744
2008/02/26(火) 00:57:36途中で配列にしたら楽だろうなぁとかは思ったが、
配列だと途中でサイズの変更が利かないから。
ポインタだと動的メモリの割り当てで適当なサイズに
割り当てできるし、と思っただけです。
別に機能さえあってればどのやりかたでもいいんだけど、
個人的には
stdoutの使い方がいまいちわかんなかったから、
そこが勉強になったのと、マクロの名前が大文字ね。
それ完全に忘れてたから勉強になった。
ありがとうってのは主にそこかなぁ・・・。
クラスは再利用に機能を発揮するから今の段階では必要としていないけど、
あとあと拡張していくにあたって必要になってくるから残しておきました。
確かにこの辺は言わんとわからんかったかもしれない。
突っ込まれたんで補足しておきました。
0778デフォルトの名無しさん
2008/02/26(火) 05:08:28ありがとう、ちょっと不安だったんだ。
名前も無いまま渡されるオブジェクトってどうなるんだろ、って。
0779デフォルトの名無しさん
2008/02/26(火) 05:56:26返してもらうにはどう書けばよいのでしょう?
BOOL hoge( HOGE *ptr )
{
…略
ptr = address;
return TRUE;
}
としても上手く動かないようです。
0780デフォルトの名無しさん
2008/02/26(火) 06:00:17整数を受け取るには整数のポインタを渡す必要がある。
構造体を受け取るには構造体のポインタを渡す必要がある。
構造体のポインタを受け取るには構造体のポインタのポインタを渡す必要がある。
0781デフォルトの名無しさん
2008/02/26(火) 06:03:19BOOL hoge( HOGE **ptr )
ちなみにC++なのですが、参照渡しを使ってこれは良いのでしょうか?
BOOL hoge( HOGE *&ptr )
一応コンパイルは通るのですが…
0782デフォルトの名無しさん
2008/02/26(火) 07:25:270783デフォルトの名無しさん
2008/02/26(火) 11:34:24ある場合には、親オブジェクトから子オブジェクトを通して親オブジェクトのprivateデータを
参照できたのですが、これってこういうもの?
#include <iostream>
using namespace std;
class test2;
class test {
public:
void func(const test2 &a);
private:
int p;
};
class test2 : public test {
public:
void func2(const test2 &a);
};
void test::func(const test2 &a) {
cout << a.p << endl;
}
test2 T2;
int main()
{
test t;
t.func(T2);
return 0;
}
0784デフォルトの名無しさん
2008/02/26(火) 11:37:480785デフォルトの名無しさん
2008/02/26(火) 11:40:09というか出来ないとまずいだろ。
コピーコンストラクタとか代入演算子の定義が出来なくなってしまうよ。
0786デフォルトの名無しさん
2008/02/26(火) 12:06:040787デフォルトの名無しさん
2008/02/26(火) 12:22:230788デフォルトの名無しさん
2008/02/26(火) 13:01:03機能のスタティックリンクできるライブラリをご存じないでしょうか?
環境はVisualC++.net2003です。
0789デフォルトの名無しさん
2008/02/26(火) 13:07:03zlib
0790デフォルトの名無しさん
2008/02/26(火) 13:30:25同じクラスのインスタンスへの参照やポインタを持つとアクセス権限ブッチぎれちゃうのか
なんかカプセル化とかそういう面で考えると気持ち悪いというかなんというか
仕様上出来ないと仕方ないと言うのも分かるのだが・・・
0791デフォルトの名無しさん
2008/02/26(火) 13:33:530792デフォルトの名無しさん
2008/02/26(火) 13:34:460793デフォルトの名無しさん
2008/02/26(火) 14:02:36すみません、寝てました。返答有難うございます。
ちなみに「ポインタ変数を参照で渡す」と言う意味ならむしろ
BOOL hoge( HOGE &*ptr )
のような気がするのですが、なんで*&ptrなのでしょう?
それが仕様と言われればそこまでですが。
0794デフォルトの名無しさん
2008/02/26(火) 14:24:18http://kmaebashi.com/programmer/pointer.html
これの応用。
ptrのほうからreference to pointer to HOGEと読める。
0795デフォルトの名無しさん
2008/02/26(火) 14:26:03typedef HOGE * HOGE_PTRしてみれば判る。
0796デフォルトの名無しさん
2008/02/26(火) 14:37:54なるほど。正直きちんと理解できたかは自信ないですが、ちゃんと法則が
あってそうなっているのは分かりました。
どうも有難うございましたm(__)m
0797デフォルトの名無しさん
2008/02/26(火) 14:46:05vc6でコンパイルしたいです
sp1で鈍いパソコンです
0798デフォルトの名無しさん
2008/02/26(火) 14:48:160799デフォルトの名無しさん
2008/02/26(火) 14:49:23コンパイラだけ手に入れるのは無理だが
コマンドラインでの利用はできるよ
0800デフォルトの名無しさん
2008/02/26(火) 14:56:400801デフォルトの名無しさん
2008/02/26(火) 15:02:40kwsk
according to standard
0802デフォルトの名無しさん
2008/02/26(火) 15:49:24DOSの実行ファイルで、標準出力へは書き出されないメッセージを取得する方法ありませんか?
hoge.exe > log.txt
として取得できないやつです 画面には出ます
標準出力、標準エラーの取り方はわかります
0803デフォルトの名無しさん
2008/02/26(火) 16:09:38それのどこがC/C++に関係があるの?
0804デフォルトの名無しさん
2008/02/26(火) 16:18:38つ printscreen
0805デフォルトの名無しさん
2008/02/26(火) 16:34:10標準出力はこれで受け取れますが、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はWindowを持っているアプリケーションなのか?
だとしたら、メッセージフックなどの手段が必要になるよ。
つーか、HtoX32とやらが何ものかにも依るけど同等のプログラムを自分で書いた方が手っ取り早かったりしてね。
0807デフォルトの名無しさん
2008/02/26(火) 16:59:39ソースが公開されていたり定番のライブラリとかありませんか?
0808デフォルトの名無しさん
2008/02/26(火) 17:03:030809デフォルトの名無しさん
2008/02/26(火) 17:11:51http://support.microsoft.com/kb/190351/ja
0810デフォルトの名無しさん
2008/02/26(火) 17:15:43あればだけど
0811デフォルトの名無しさん
2008/02/26(火) 17:44:11そのコードだと、自プロセスの標準出力が hFile になるけど、子プロセ
スの HtoX32c.exe の標準出力はコンソールのままでは?
0812デフォルトの名無しさん
2008/02/26(火) 17:44:15suruct 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:410814デフォルトの名無しさん
2008/02/26(火) 17:54:43typedef SAMPLE SAMPLE2;
0815デフォルトの名無しさん
2008/02/26(火) 18:02:57>>814
情報ありがとうございます。
テンプレート関数が一番やりたかった事を解決してくれそうでした。
ありがとうございました。
0816デフォルトの名無しさん
2008/02/26(火) 18:10:58テンプレートを使うということはC++で良いので、それならメンバ関数にしてしまった方が良い。
0817デフォルトの名無しさん
2008/02/26(火) 18:22:32freadみたいにふつうに戻り値が来るのかと思いきや違うみたいですし…。
0818デフォルトの名無しさん
2008/02/26(火) 18:28:130819デフォルトの名無しさん
2008/02/26(火) 18:29:13自己レス。failで少なくとも期待通りの
バイト数読めたかどうかは取得できるのね。
0820デフォルトの名無しさん
2008/02/26(火) 18:30:300821デフォルトの名無しさん
2008/02/26(火) 18:31:39APIのほうがよい
0822デフォルトの名無しさん
2008/02/26(火) 18:55:550823デフォルトの名無しさん
2008/02/26(火) 19:18:08どのコンパイラでも同じ動作になる
あと3000個とか開けない
0824デフォルトの名無しさん
2008/02/26(火) 19:18:501 = あいうえお
2 = かきくけこ
3 = さしすせそ
4 = あいうえお
if (a = 1){
}
みたいなことをやりたいのですがどうしたら良いでしょうか?
0825デフォルトの名無しさん
2008/02/26(火) 19:19:440826デフォルトの名無しさん
2008/02/26(火) 19:20:33コンパイラで差はないかもしれないが・・・
0827デフォルトの名無しさん
2008/02/26(火) 19:21:41んなばかな
APIがMS一社で規定されてるなんて初めて知った
MSはついに世界を征服したのか
0828デフォルトの名無しさん
2008/02/26(火) 19:23:040829デフォルトの名無しさん
2008/02/26(火) 19:55:080830デフォルトの名無しさん
2008/02/26(火) 21:19:23どうやったらいいですか?
0831デフォルトの名無しさん
2008/02/26(火) 21:22:250832デフォルトの名無しさん
2008/02/26(火) 21:58:13問題ない?
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__declspec(dllimport) int __stdcall hoge( LPWORD, LPWORD, LPWORD );
という形の関数のアドレスが入る関数ポインタhageを作りたいのですが、
うまく宣言できません。
__declspec(dllimport) int __stdcall (*hage)(LPWORD, LPWORD, LPWORD );
などとやるとコンパイルエラーになってしまいます。
どうすれば宣言できるのでしょうか?
0835デフォルトの名無しさん
2008/02/26(火) 22:17:260836デフォルトの名無しさん
2008/02/26(火) 22:19:030837デフォルトの名無しさん
2008/02/26(火) 22:19:32typedef __declspec(dllimport) int __stdcall hogetype( LPWORD, LPWORD, LPWORD );
hogetype hoge;
0838デフォルトの名無しさん
2008/02/26(火) 22:36:15最近 if を見るたびにすぐ関数テーブル化してしまう。
間違い?
0839デフォルトの名無しさん
2008/02/26(火) 22:39:070840デフォルトの名無しさん
2008/02/26(火) 22:43:09鈍いです
0841デフォルトの名無しさん
2008/02/26(火) 22:47:58CreateProcessを短期間に20回以上使うと動かなくなるエラーってありますか?
実行する側のexeのせいかもしれないですが
0842デフォルトの名無しさん
2008/02/26(火) 22:50:02if の中にさらに if があるともうその地点でうわ・・って思ってしまう。
ちょっとソース見直してみます
0843デフォルトの名無しさん
2008/02/26(火) 22:50:41ありがとう。今度からそうする
0844デフォルトの名無しさん
2008/02/26(火) 22:54:190845デフォルトの名無しさん
2008/02/26(火) 22:59:28無理して避けることもないよ。何事も程々が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:570848デフォルトの名無しさん
2008/02/26(火) 23:05:38静的なシングルトンもグローバル変数も似たようなもんだ
グローバル変数でいいんじゃね?
ただ、関数経由にしておけばデバッグするときに setter で引っ掛ければいいだけだから
ずいぶんと楽になる*かもしれない*
0849デフォルトの名無しさん
2008/02/26(火) 23:30:59シングルタスクなら良いけど。
GUIでスレッド使って随時処理しながら入力待ちして、
入力はコールバックで処理、みたいのだと、
ゲッタやセッタ作った方が排他処理し易いかなぁ。
まぁケースバイケース?
0850デフォルトの名無しさん
2008/02/26(火) 23:32:07インスタンスが複数なら、
状態ごとの処理に、状態管理変数をクラス化したものを渡すとか、
もしくはstateパターンなんてのもいいかもしれない。
■ このスレッドは過去ログ倉庫に格納されています