掲示板ランキング  プラスター(微香・無臭タイプ)  プラスター(肌にやさしい)


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.7224

ポインタ?
投稿者---fo(2007/03/16 09:19:44)


windowsのプログラミングで、ファイルのコピーを作る物です。
for文の の抜ける条件を教えてください


lpCmdLineにファイル名を渡します。

1回目for文で、a.txtを渡すと、 a.txt0  となり
2回目何も渡さなくても param2++で、1なので


if (*(lpCmdLine + param2) == ' ') break;

の条件にあてはまらないので、永久ループするんですか?




また以下の文は何を行っているんでしょうか?

*(lpCmdLine + param2) = 0;
param2++;


教えてください。






#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
                   PSTR lpCmdLine , int nCmdShow) {



    int param2;

    for (param2 = 0 ; *(lpCmdLine + param2) ; param2++)
        if (*(lpCmdLine + param2) == ' ') break;

    *(lpCmdLine + param2) = 0;
    param2++;

    if (!CopyFile(lpCmdLine , lpCmdLine + param2 , TRUE))
         MessageBox( NULL , TEXT("ファイルをコピーできません) ,
            NULL , MB_OK
        );

    return 0;
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ポインタ? 7225 επιστημη 2007/03/16 09:59:42
<子記事> Re:ポインタ? 7226 Blue 2007/03/16 10:06:59


No.7225

Re:ポインタ?
投稿者---επιστημη(2007/03/16 09:59:42)
http://blogs.wankuma.com/episteme/


> for (param2 = 0 ; *(lpCmdLine + param2) ; param2++)
>  if (*(lpCmdLine + param2) == ' ') break;

文字列 lpCmdLine に現れる最初の空白の位置を求めています。
たとえば lpCmdLine が "abc def" であったとき、
*(lpCmdLine+3) == ' ' なので param2 = 3 となります。

> *(lpCmdLine + param2) = 0;
> param2++;

見つけた空白の位置に0を書くのでそこが文字列の末端となります。
さらにその末端の次をparam2が指すため、

lpCmdLine : "abc"
lpCmdLine+param2 : "def"

となります。



この投稿にコメントする

削除パスワード

No.7226

Re:ポインタ?
投稿者---Blue(2007/03/16 10:06:59)


MSDNですが,WinMain関数のlpCmdLine引数の説明に
アプリケーションのコマンドラインが格納された NULL で終わる文字列へのポインタが入ります。

とあります。

ということは、ポインタをインクリメントしていけば
いずれそのポインタが指す先の値にNULLが見つかるということです。

すなわち
>for (param2 = 0 ; *(lpCmdLine + param2) ; param2++)
の場合、for文の終了条件

*(lpCmdLine + param2);



*(lpCmdLine + param2)

が真つまり0以外のときとなります。
ここで NULL文字(\0)は値としては0なので、文字列の終わりまで繰り返せ
ということになります。

わかりにくいようであれば

for (param2 = 0 ; *(lpCmdLine + param2) != '\0' ; param2++)

として解釈してみてください。



この投稿にコメントする

削除パスワード

No.7234

Re:ポインタ?
投稿者---fo(2007/03/16 18:26:10)


回答どうもありがとうございます。
ポインタをインククリメントしていたんですね。
その辺が良くわかりませんでした。

*(lpCmdLine + param2) = 0;
param2++;

の解説もどうもありがとうございます。
プログラムの流れが良くわかりました。


どうもありがとうございました!



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ