★初心者にVisual C++を教えるスレ★ Part17
876 :
デフォルトの名無しさん:2005/04/12(火) 08:46:32
1つのダイアログの機能とデザイン、リソースIDなどをまるごと
他のプロジェクトへコピーしたいのですが、簡単な方法はありますか?
877 :
デフォルトの名無しさん:2005/04/12(火) 09:00:50
ギャラリへ追加
変数はループの外で宣言したほうが早くなりますか?
以下は例です。
for(int i;i<256;++i){
int a;
a=hoge(i);
}
int a;
for(int i;i<256;++i){
a=hoge(i);
}
コンパイラの最適化で同じ物になりそう
>>879 じゃあ可読性のよい方を選べばいいんですかね?
>>880 スコープを小さくするメリットを優先すべし。
当然、前者の方がいい。
#つーか、仮令例でもiが初期化されていないの激しく気になる。
>>881 お返事ありがとうございます。
スコープを小さくすることでレジスタに入ったりするということでしょうか?
iの初期化は例文のミスです。
>>882 コンパイラはあんたより賢いからどちらでも同じコードを吐く。
寧ろ、あんたがミスしないようにエラー通知や警告さえしてくれるわけだ。
生存期間を短くすると言うことはそういうことだ。
そんなとき俺なら更に初期化時に戻り値を受けるようにする。
for(int i = 0; i < 256; ++i) {
int a = hoge(i);
}
for (int i = 256; i ; i--) {
int a = hoge(i);
}
886 :
デフォルトの名無しさん:2005/04/12(火) 23:32:44
winsockで質問です。
現在、クライアントからselect()ベースでTelnetの通信制御を行う
プログラムをMFCで作成しております。
Telnet通信を行っているあいだに、とあるコマンドにおいてサーバ側が
自動で切断します。このときサーバ側は受信の応答を返さずに切断して
しまうので、これをクライアント側で切断のタイミングを検出し再接続
を行うようにしたいのです。
その検出方法でなかなか良い方法が見つかりません。
とあるサイトで切断のタイミングは受信バッファが0である
と見かけましたが、サーバ側からの受信バッファが途中で
一端途切れるため、実際に切断されるよりも前のタイミング
で検出してしまいます。
なにか良い方法はないのでしょうか?
コマンドラインのワイルドカードを展開するときって setargv.obj をリンクしますよね。
VC6(SPなし、SP6どちらも)でMBCSビルドではうまくいくのですが、wsetargv.objを
リンクしてUNICODEビルドすると
wsetargv.obj : error LNK2001: 外部シンボル "___wsetargv" は未解決です
となってしまいます。どうしたらいいんでしょか?
(VC2003ではOKだった...)
>>887 unixからの移植用のselectなんて使うのやめて、
Windows用のWSAAsyncSelectでFD_CLOSEイベントを受けとろう。
なんかよう意味がわからん。
サーバがcloseかshutdownで切断すればクライアントは
recvで0を受け取って、切断されたんだな〜ってわかると思うが。
>>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)();
関数ポインタでぐぐれ
すみません質問なのですが、VisualC++はC言語の勉強もできますか?
4月から学校で習うので、もしできるのなら購入したいと思いまして。
皆様よろしくお願い致しますm(_ _)m
>>895 ありがとうございます
学生証もらったら買いに行きます
>>894 Cの勉強のためだけなら必ずしも買う必要もありませんが。
>>894 学校で使う程度なら、フリーのコンパイラでもいいんじゃない?
それで、プログラムに興味もって何か作ろうって思ったらVC買えばいいとおもう。
学校ってのが、高校なのか大学かはしらんが、大学ならUNIXだったりするぞ。
お勉強ならCygwinを入れてgccがいいんじゃないかな。
漏れはVC++を勧めるよ、コンパイラとしてではなくデバッガとして。
本当にここはVCのスレなんだろうか?
嫌がらせでわざと毎日スレ違いの質問しに来てるとしか思えない。
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"は未解決です
のエラーが発生しています。アドバイスをお願いします。
sub2.cはmain.cにもっている関数の宣言を知らないんじゃない?
906 :
デフォルトの名無しさん:2005/04/13(水) 16:27:51
>>905 そうとも考えまして
main.cで定義している関数を
sub2.cのインクルードファイルにextern宣言してみたりしたのですがうまく
コンパイルが通りません。
厨な方法なのですが、closePrcに書いている各関数の初期化や
破棄等をベタ書きで書いたりして無理矢理コンパイル通したりしたのですが
画面さえ閉じられる物のプロセスは生き残ってしまっています。
ヘッダファイル作れば良いんじゃないの?
908 :
904:2005/04/14(木) 09:07:29
レスありがとうございます。
すみません。インクルードファイルとはヘッダファイルの事でした。
既にヘッダファイルを作成して、各Cソース上部にそのヘッダをインクルードしています。
そのcloseなんとかがstatic関数だったりしない?
910 :
904:2005/04/14(木) 09:47:57
>>909 おっしゃる通りstaticで定義されております。
なぜstaticでないと行けないのかは解らないのでそのままなのですが
そこに問題ありでしょうか?
>>910 staticな関数は「そのファイルの外側からは見えない」
externしても無駄無駄
912 :
デフォルトの名無しさん:2005/04/14(木) 10:29:01
プログラム自身が現在使用しているメモリ量と、パソコンの残り空きメモリ量はどのようにしたら取得できるのでしょうか?
913 :
904:2005/04/14(木) 10:31:06
>>911 そういう問題があったのですね。
勉強不足ですみません。一度、指摘されました個所を
コメント化して現在の
static void ClosePrc(HWND hwnd);
から
void ClosePrc(HWND hwnd)
へ変更し、extern してみたのですが、同じくLNK1120のエラーが発生
してしまいました。何か他にも要因が考えられますでしょうか?
よろしくお願いします。
//main.c
void ClosePrc(HWND hwnd) {
....
}
//ヘッダ
extern void ClosePrc(HWND hwnd);
//sub2.c
#include "ヘッダ"
foo() {
ClosePrc(hoge);
}
って状態なんだよね?
ソース全部晒せ!
916 :
904:2005/04/14(木) 10:58:38
>>914 失礼しました。実態の定義部にstaticが残っておりました。
清書しまして現在、コンパイルが通りましたので
早速動作確認してみました。
やはりプロセスが生きのこってしまっています。
上記で教えていただきました、関数呼び元の
ClosePrc(hoge); ですが
hogeとはどのような意味がありますでしょうか?
当方コードではHWND hwnd;
で宣言しているClosePrc(hwnd);としています。
終了する際のハンドル取得に問題があるのでしょうか?
917 :
デフォルトの名無しさん:2005/04/14(木) 11:44:44
プログラム組む前の段階の質問で申し訳ないんですけど
今までVC++をCドライブのプログラムファイルフォルダ以下にインスト(多分デフォでここだったはず)
してたんですけど、どこかのスレでプログラムファイル以下にインストする奴は馬鹿みたいな事を書いていたのを見たんですけど
実際皆さんどこにインストールしてますか?プログラムファイル以下だと何か不都合があるんでしょうか?
>>916 初心者の特徴:ソースを見せずに「うまくいかないんです。なぜですか?」
919 :
904:2005/04/14(木) 11:56:59
>>918 すみません。ソースを全てお見せすると膨大な量となります。
主要部分を抜き出すと
>>914で確認の為に作成していただいた
各関数のコードのみとなるのですが。。。。
おっしゃる通り私は初心者です。申し訳ございません。
>>919 「ソースを見せずに」≠「ソースを全て見せずに」
問題の発生する必要最低限のコードを抜き出して見せないと満足な回答は得られないよ。
921 :
904: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);
922 :
904: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));
}
>>904 ・ExitProc()を読んだときのhWndには何が入ってるの?
main.cとsub2.cで違うものが入ってたら同じ動作はしない可能性が高いわけだが。
・ExitProc()にhWnd渡してるのに使ってないけど?
・同じく、hWndFtpとはなに?
初心者云々以前にプログラマに向いてない気が。
流れを読まずに質問。
ウィンドウのサイズを変更したら中にあるリストビューのサイズも追従させたいんだけど、どうすれば出来ますかね?
ウィンドウのサイズが変わったときに送られるメッセージとかあるの?
ある