★初心者にVisual C++を教えるスレ★ Part17

このエントリーをはてなブックマークに追加
876デフォルトの名無しさん:2005/04/12(火) 08:46:32
1つのダイアログの機能とデザイン、リソースIDなどをまるごと
他のプロジェクトへコピーしたいのですが、簡単な方法はありますか?
877デフォルトの名無しさん:2005/04/12(火) 09:00:50
ギャラリへ追加
878デフォルトの名無しさん:2005/04/12(火) 18:28:49
変数はループの外で宣言したほうが早くなりますか?

以下は例です。

for(int i;i<256;++i){
int a;
a=hoge(i);
}

int a;
for(int i;i<256;++i){
a=hoge(i);
}
879デフォルトの名無しさん:2005/04/12(火) 18:30:17
コンパイラの最適化で同じ物になりそう
880デフォルトの名無しさん:2005/04/12(火) 18:52:21
>>879
じゃあ可読性のよい方を選べばいいんですかね?
881デフォルトの名無しさん:2005/04/12(火) 19:09:45
>>880
スコープを小さくするメリットを優先すべし。
当然、前者の方がいい。
#つーか、仮令例でもiが初期化されていないの激しく気になる。
882デフォルトの名無しさん:2005/04/12(火) 19:13:57
>>881
お返事ありがとうございます。
スコープを小さくすることでレジスタに入ったりするということでしょうか?
iの初期化は例文のミスです。
883デフォルトの名無しさん:2005/04/12(火) 20:23:07
>>882
コンパイラはあんたより賢いからどちらでも同じコードを吐く。
寧ろ、あんたがミスしないようにエラー通知や警告さえしてくれるわけだ。
生存期間を短くすると言うことはそういうことだ。
884デフォルトの名無しさん:2005/04/12(火) 22:01:45
そんなとき俺なら更に初期化時に戻り値を受けるようにする。
for(int i = 0; i < 256; ++i) {
  int a = hoge(i);
}
885デフォルトの名無しさん:2005/04/12(火) 23:27:13
for (int i = 256; i ; i--) {
 int a = hoge(i);
}
886デフォルトの名無しさん:2005/04/12(火) 23:32:44
>>885
そんなひっかけ見たことない
887デフォルトの名無しさん:2005/04/12(火) 23:45:19
winsockで質問です。

現在、クライアントからselect()ベースでTelnetの通信制御を行う
プログラムをMFCで作成しております。

Telnet通信を行っているあいだに、とあるコマンドにおいてサーバ側が
自動で切断します。このときサーバ側は受信の応答を返さずに切断して
しまうので、これをクライアント側で切断のタイミングを検出し再接続
を行うようにしたいのです。

その検出方法でなかなか良い方法が見つかりません。
とあるサイトで切断のタイミングは受信バッファが0である
と見かけましたが、サーバ側からの受信バッファが途中で
一端途切れるため、実際に切断されるよりも前のタイミング
で検出してしまいます。

なにか良い方法はないのでしょうか?
888デフォルトの名無しさん:2005/04/13(水) 00:10:52
コマンドラインのワイルドカードを展開するときって setargv.obj をリンクしますよね。
VC6(SPなし、SP6どちらも)でMBCSビルドではうまくいくのですが、wsetargv.objを
リンクしてUNICODEビルドすると

wsetargv.obj : error LNK2001: 外部シンボル "___wsetargv" は未解決です

となってしまいます。どうしたらいいんでしょか?
(VC2003ではOKだった...)
889デフォルトの名無しさん:2005/04/13(水) 02:03:46
>>887
unixからの移植用のselectなんて使うのやめて、
Windows用のWSAAsyncSelectでFD_CLOSEイベントを受けとろう。
890デフォルトの名無しさん:2005/04/13(水) 02:12:33
なんかよう意味がわからん。
サーバがcloseかshutdownで切断すればクライアントは
recvで0を受け取って、切断されたんだな〜ってわかると思うが。
891デフォルトの名無しさん:2005/04/13(水) 05:41:36
>>887の人は、

> サーバ側からの受信バッファが途中で
> 一端途切れるため、実際に切断されるよりも前のタイミング
> で検出
と書いているから、
ブロッキングではなく、ノンブロッキングでrecvを呼んでいるのだと思う。
892デフォルトの名無しさん:2005/04/13(水) 06:25:29
下のようなコードを見たのですが、
boolをなんだか関数みたいな形でtypedefしてるみたいなのですが
わけがわからないです。これはどういうことでしょうか?
どんな意味か、どんなメリットがあるかも分かりません。教えて下さい。お願いします。

typedef bool (*HOGE_FOO_AAA)( BAR bar, MOGE moge);
typedef bool (*HOGE_FOO_BBB)();
893デフォルトの名無しさん:2005/04/13(水) 06:31:14
関数ポインタでぐぐれ
894デフォルトの名無しさん:2005/04/13(水) 08:33:28
すみません質問なのですが、VisualC++はC言語の勉強もできますか?
4月から学校で習うので、もしできるのなら購入したいと思いまして。
皆様よろしくお願い致しますm(_ _)m
895デフォルトの名無しさん:2005/04/13(水) 08:52:16
>>894
はい
896デフォルトの名無しさん:2005/04/13(水) 08:56:58
>>895
ありがとうございます
学生証もらったら買いに行きます
897デフォルトの名無しさん:2005/04/13(水) 09:03:27
>>894
Cの勉強のためだけなら必ずしも買う必要もありませんが。
898デフォルトの名無しさん:2005/04/13(水) 09:03:58
>>894
学校で使う程度なら、フリーのコンパイラでもいいんじゃない?
それで、プログラムに興味もって何か作ろうって思ったらVC買えばいいとおもう。

学校ってのが、高校なのか大学かはしらんが、大学ならUNIXだったりするぞ。
899デフォルトの名無しさん:2005/04/13(水) 09:14:50
>>897-898
ありがとうございます
フリーのコンパイラの方も検討してみます。
900デフォルトの名無しさん:2005/04/13(水) 12:49:54
お勉強ならCygwinを入れてgccがいいんじゃないかな。
901デフォルトの名無しさん:2005/04/13(水) 13:37:45
漏れはVC++を勧めるよ、コンパイラとしてではなくデバッガとして。
902デフォルトの名無しさん:2005/04/13(水) 14:15:50
本当にここはVCのスレなんだろうか?
嫌がらせでわざと毎日スレ違いの質問しに来てるとしか思えない。
903デフォルトの名無しさん:2005/04/13(水) 14:49:03
>>899
むしろこっちをお勧め。

激安で買えるVisual Stdio.NET theSpoke Disc.9
http://pc8.2ch.net/test/read.cgi/tech/1103381010/
904デフォルトの名無しさん:2005/04/13(水) 15:22:03
教えてくださいお願いします。VisualStuido97で
作成しているプロジェクトなのですが
プロジェクトワークスペース内に
main.c メイン処理(初期化やクローズ、画面の作成)
sub1.c サブ関数群1
sub2.c サブ関数群2
という構成で一つのEXEが作成されています。
基本的には各処理が終わればmain.c内のClose関数で
画面の破棄、メモリの開放等を行っています。
ところが、ある条件が揃った時に致命的エラーが発生するのです。
要はデータファイルを共用しており、別のプログラムがデータファイルに
アクセスしている際に不具合が発生するようなのです
処理の優先順位は当該プログラム側の方が低い為
データアクセス競合時にこれを避けるために処理を強制的に終わらせたいと思います
競合時の判定はsub2.c コード内で取得できるので sub2c内のコードから
強制終了したいのですが、方法がわかりません。
main.cにもっているClose関数を呼ぼうとするとLNK1120:外部シンボル"ClosePrc"は未解決です
のエラーが発生しています。アドバイスをお願いします。
905デフォルトの名無しさん:2005/04/13(水) 16:19:35
sub2.cはmain.cにもっている関数の宣言を知らないんじゃない?
906デフォルトの名無しさん:2005/04/13(水) 16:27:51
>>905
そうとも考えまして
main.cで定義している関数を
sub2.cのインクルードファイルにextern宣言してみたりしたのですがうまく
コンパイルが通りません。
厨な方法なのですが、closePrcに書いている各関数の初期化や
破棄等をベタ書きで書いたりして無理矢理コンパイル通したりしたのですが
画面さえ閉じられる物のプロセスは生き残ってしまっています。
907デフォルトの名無しさん:2005/04/13(水) 20:55:30
ヘッダファイル作れば良いんじゃないの?
908904:2005/04/14(木) 09:07:29
レスありがとうございます。
すみません。インクルードファイルとはヘッダファイルの事でした。
既にヘッダファイルを作成して、各Cソース上部にそのヘッダをインクルードしています。
909デフォルトの名無しさん:2005/04/14(木) 09:45:16
そのcloseなんとかがstatic関数だったりしない?
910904:2005/04/14(木) 09:47:57
>>909
おっしゃる通りstaticで定義されております。
なぜstaticでないと行けないのかは解らないのでそのままなのですが
そこに問題ありでしょうか?
911デフォルトの名無しさん:2005/04/14(木) 10:25:52
>>910
staticな関数は「そのファイルの外側からは見えない」
externしても無駄無駄
912デフォルトの名無しさん:2005/04/14(木) 10:29:01
プログラム自身が現在使用しているメモリ量と、パソコンの残り空きメモリ量はどのようにしたら取得できるのでしょうか?
913904:2005/04/14(木) 10:31:06
>>911
そういう問題があったのですね。
勉強不足ですみません。一度、指摘されました個所を
コメント化して現在の
static void ClosePrc(HWND hwnd);
から
void ClosePrc(HWND hwnd)
へ変更し、extern してみたのですが、同じくLNK1120のエラーが発生
してしまいました。何か他にも要因が考えられますでしょうか?
よろしくお願いします。
914デフォルトの名無しさん:2005/04/14(木) 10:35:15
//main.c
void ClosePrc(HWND hwnd) {
....
}

//ヘッダ
extern void ClosePrc(HWND hwnd);

//sub2.c
#include "ヘッダ"
foo() {
ClosePrc(hoge);
}
って状態なんだよね?
915デフォルトの名無しさん:2005/04/14(木) 10:55:49
ソース全部晒せ!
916904:2005/04/14(木) 10:58:38
>>914
失礼しました。実態の定義部にstaticが残っておりました。
清書しまして現在、コンパイルが通りましたので
早速動作確認してみました。
やはりプロセスが生きのこってしまっています。
上記で教えていただきました、関数呼び元の
ClosePrc(hoge); ですが
hogeとはどのような意味がありますでしょうか?
当方コードではHWND hwnd;
で宣言しているClosePrc(hwnd);としています。
終了する際のハンドル取得に問題があるのでしょうか?
917デフォルトの名無しさん:2005/04/14(木) 11:44:44
プログラム組む前の段階の質問で申し訳ないんですけど
今までVC++をCドライブのプログラムファイルフォルダ以下にインスト(多分デフォでここだったはず)
してたんですけど、どこかのスレでプログラムファイル以下にインストする奴は馬鹿みたいな事を書いていたのを見たんですけど
実際皆さんどこにインストールしてますか?プログラムファイル以下だと何か不都合があるんでしょうか?
918デフォルトの名無しさん:2005/04/14(木) 11:45:22
>>916
初心者の特徴:ソースを見せずに「うまくいかないんです。なぜですか?」
919904:2005/04/14(木) 11:56:59
>>918
すみません。ソースを全てお見せすると膨大な量となります。
主要部分を抜き出すと>>914で確認の為に作成していただいた
各関数のコードのみとなるのですが。。。。
おっしゃる通り私は初心者です。申し訳ございません。
920デフォルトの名無しさん:2005/04/14(木) 12:05:50
>>919
「ソースを見せずに」≠「ソースを全て見せずに」
問題の発生する必要最低限のコードを抜き出して見せないと満足な回答は得られないよ。
921904:2005/04/14(木) 12:18:43
>>920
失礼しました。主要関数内部のコードを貼ります。よろしくお願いします。
//Main.c 処理の終了
void ExitProc(HWND hWnd)
{
CancelFlg = YES;
CloseTransferThread();
DeleteAlltempFile();
DisconnectProc();
WSACleanup();
DestroyWindow(hWndFtp);
return;
}

//sub2.c 処理状況の取得
int ReadReplyMessage(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork, char *Tmp)
{
int iRetCode;
int iContinue;
int Lines;

HWND hWnd;

if(Buf != NULL)
memset(Buf, NUL, Max);
Max--;

iRet = ReadLine(cSkt, Tmp, ONELINE_BUF_SIZE, CancelCheckWork);
922904:2005/04/14(木) 12:19:18
FirstCode = 0;
if(cSkt != INVALID_SOCKET)
{
Lines = 0;
do
{
iContinue = NO;
//正常終了(連続処理時の正常終了)
if (strstr(Tmp,"Transfer complete")!=0){
MessageBox(NULL,"","終了確認",MB_OK);
ExitProc(hWnd);//アプリケーションの終了
}

if(){//エラー判定割愛
ExitProc(hWnd);//アプリケーションの終了
FirstCode = 500
break;
}
Lines++;

}
while(iContinue == YES);
FirstCode = iRet
}
return(FirstCode));
}
923デフォルトの名無しさん:2005/04/14(木) 13:05:34
>>904
・ExitProc()を読んだときのhWndには何が入ってるの?
main.cとsub2.cで違うものが入ってたら同じ動作はしない可能性が高いわけだが。
・ExitProc()にhWnd渡してるのに使ってないけど?
・同じく、hWndFtpとはなに?

初心者云々以前にプログラマに向いてない気が。
924デフォルトの名無しさん:2005/04/14(木) 13:19:15
流れを読まずに質問。
ウィンドウのサイズを変更したら中にあるリストビューのサイズも追従させたいんだけど、どうすれば出来ますかね?
ウィンドウのサイズが変わったときに送られるメッセージとかあるの?
925デフォルトの名無しさん
ある