ページ 11

GetWindowRectの使い方

Posted: 2010年6月28日(月) 20:22
by shiro4ao
ウィンドウを現在位置から右へ10移動したいです。

==================コードの一部========================
//自分のウィンドウハンドルはhWndです
LPRECT rc;
GetWindowRect(hWnd,(LPRECT)&rc);  
SetWindowPos( hWnd,HWND_TOP, (int)rc.left+10,(int)rc.top,(int)rc.right+10,(int)rc.bottom, SWP_SHOWWINDOW);
=================ここまで=============================

上のようなコードを書きましたが、インテリセンス機能から「使用可能なメンバがありません」
と怒られました。
なにかまずいのでしょうか。 画像

Re:GetWindowRectの使い方

Posted: 2010年6月28日(月) 20:37
by シエル
Getwindowrectの第二引数はLPRECT型ですよね?

ですので、
GetWindowRect(hWnd,(LPRECT)&rc); ではなくて、

LPRECT型のrcをそのまま下記のようにしてみて下さい。

GetWindowRect(hWnd,rc);


そうすれば、インテリセンス機能が働くはずです
 

Re:GetWindowRectの使い方

Posted: 2010年6月28日(月) 20:57
by スキマ妖怪
どちらか言うと

LPRECT rc;

RECT rc;

だと思いますよ。


個人的にインテリセンスは、あまり信用できないですね(コード量が多くなると、利かない時があるので)

Re:GetWindowRectの使い方

Posted: 2010年6月28日(月) 21:03
by シエル
すいません。スキマ妖怪さんの言うとおりです。

LPRECT rc
で宣言した場合、そのメンバにアクセスするには
rc->rightでアクセスする。


RECT rc
で宣言した場合は、
GetWindowRect(hWnd,&rc)って書いて、

rc.rightでメンバにアクセスできます。

Re:GetWindowRectの使い方

Posted: 2010年6月28日(月) 21:26
by shiro4ao
>LPRECT型のrcをそのまま下記のようにしてみて下さい。
LPRECTなのに何をしていたのでしょうね私は・・・
うまくいきました。

申し訳ないです。

課題の問題でつまってしまいました

Posted: 2010年7月07日(水) 14:04
by かむかむ
題名の通り、学校の課題でつまってしまいました。
誰か教えてください。 お願いします。


↓問題文
基本: 構造体の配列、関数への構造体の引渡し

基本課題 13..2

name(名前: char型配列), height(身長: float型変数), bloodType(血液型: char型変数)をメンバに持つ構造体を宣言し, 128名分が記憶可能になるようその構造体の配列を定義せよ.また,その配列に対して値を入力し,さらに表示できるようにせよ.構造体のメンバ値を表示するには、ひとつの構造体の各メンバの値を表示する関数を作成すること。

% ./bodyData
1人目のデータ: いい漢 175.5 A
2人目のデータ: 竹達彩菜 169.0 B
3人目のデータ: 能登麻美子 180.4 O
4人目のデータ: 0 0 0 ← 0 0 0 と入力すると終わる.
名前 身長 血液型
いい漢   175.5 A
竹達彩菜 169.0 B
能登麻美子 180.4 O
%


ヒント: 各人の名前、身長、血液型のデータを1行で入力するためには、参考12.1に示されたfgets()関数で、これらを1度に取り込み、最初の空白までを名前とみなし、次の空白までを身長とみなし、次に改行までを血液型をみなせばよい。これらを別々の文字列として、必要に応じて整数や浮動小数点数に変換し、構造体のメンバに設定すること。

ヒント: ひとつの構造体の各メンバの値を表示する関数に構造体を引渡すことを繰り返えせばよい。





↓とりあえず考えて作ってみたもの



#include<stdio.h>
#define BUFFER_SIZE 256
#define NUMBER 128
#define NAME_SIZE 32

struct PROFILE{
char name[NAME_SIZE];

float height;

char bloodType;
}


int main(){
struct PROFILE man[NUMBE[/url];

char buf[BUFFER_SIZE];

int i, j, k, h;
for(i = 0;man.name[0] == '0' && man.height == 0 && man.bloodType == 0;i++){
printf("%d人目のデータ: ", i + 1);

fgets(buf, BUFFER_SIZE, stdin);

for(j = 0;buf[j] != ' ';j++){
man.name[j] = buf[j];
}
for(k = j+1;buf[k] != ' ';k++){
man.height = buf[k];
}
for(h = k+1;buf[h] != '\n';h++){
man.bloodType = buf[h];
}
}
printf("名前\t身長\t血液型\n");
for(j = 0;j <= i;j++){
printf("%s\t%f\t%c\n", man[j].name, man[j].height, man[j].bloodType);
}
return 0;
}

Re:課題の問題でつまってしまいました

Posted: 2010年7月07日(水) 15:15
by へろりくしょん
うほっ いい課題。 とでもいいのでしょうか。 最初の人は阿部さんですよね。

つっこみどころが多くてどこからどう説明したらいいのか解らないので、そこは他の人にまかせます。

とりあえずざっくりと作ってみました。 動作確認はしてません。
エラーチェックも、読み込んだデータの整合性のチェックもしてません。


何も無い改行だけの入力を受け取ると、入力ループを抜けます。
#include <stdio.h>
#include <stdio.h> 
#include <string.h>
#include <math.h>
#define BUFFER_SIZE 256 
#define NUMBER 128 
#define NAME_SIZE 32 

struct PROFILE{ 
    char name[NAME_SIZE]; 

    float height;

    char bloodType;
};


void printProfile(PROFILE *pf)
{
    printf("\t名前: %s\n\t身長: %f\n\t血液型: %c\n\n",
        pf->name, pf->height, pf->bloodType);
}

int main()
{ 
    int i, count;
    struct PROFILE man[NUMBE[/url];

    char buf[BUFFER_SIZE]; 

    count = 0;
    while(count < NUMBER && fgets(buf, BUFFER_SIZE, stdin)){
        if(*buf == '\n') break;

        strcpy(man[count].name, strtok(buf, " "));
        man[count].height = (float)atof(strtok(NULL, " "));
        man[count].bloodType = *strtok(NULL, " ");

        count++;
    }

    for(i = 0;i<count;i++){
        printf("%d 人目\n", i);
        printProfile(&man);
    }

  return 0; 
}



追記:
000を入力すると終わりなのですね。 読み飛ばしてました。
人の文章はにょろんとしか読まない癖があるらしくしばしばこういう事があります。 ごめんなさい。

画像

Re:課題の問題でつまってしまいました

Posted: 2010年7月07日(水) 16:25
by 白い時空
for文とか使わなくても、sscanf関数でできます。
あまり知られていない関数ですが。
fgets(buf, sizeof(buf), stdin);
        
sscanf(buf,"%s %f %c",
    man.name,
    &man.height,
    &man.bloodType);

とするだけで、それぞれにデータが入ります。
あと、
man.bloodType == 0
ではなく
man.bloodType =='0'
です。

もうひとつ、bloodTypeはchar型ですが、血液型ABが入らないのでは?

Re:課題の問題でつまってしまいました

Posted: 2010年7月07日(水) 16:58
by たかぎ
> bloodTypeはchar型ですが、血液型ABが入らないのでは?

そこを工夫するのも問題のうちなのでは?

Re:課題の問題でつまってしまいました

Posted: 2010年7月07日(水) 21:29
by へろりくしょん
>for文とか使わなくても、sscanf関数でできます。

そういえばそんな関数もありましたね。
しかし、for文等を使わずに、どうやって人数分を入力を受け取るのですか?


>あと、
>man.bloodType == 0
>ではなく
>man.bloodType =='0'
>です。

これから入力を受け取る構造体が空だったら、というループ条件だと解釈しましたが、
その場合 man.bloodType == 0 でよいのでは無いかと。
まぁ、メンバにfloat型が含まれてる時点でアレですが。
そもそも初期化もされてませんが。


>もうひとつ、bloodTypeはchar型ですが、血液型ABが入らないのでは?

そういえば、そんな血液型もありましたね。

Re:課題の問題でつまってしまいました

Posted: 2010年7月07日(水) 22:25
by 白い時空
ちょっと誤解を招いてしまいましたね。
説明が下手ですいません。
for(j = 0;buf[j] != ' ';j++){
      man.name[j] = buf[j];
    }
    for(k = j+1;buf[k] != ' ';k++){
      man.height = buf[k];
    }
    for(h = k+1;buf[h] != '\n';h++){
      man.bloodType = buf[h];
    }


の部分でたくさんfor文を使われていたので、そのようなfor文は必要ないという意味です。
人数分入力するためのfor文は必要です。

具体的にはこんな感じです。
for(i=0;i<NUMBER;i++){
    printf("%d人目のデータ:",i+1);
    
    fgets(buf, sizeof(buf), stdin);
    
    sscanf(buf,"%s %f %c",
        man.name,
        &man.height,
        &man.bloodType);
    
    if(man.name[0] == '0' && man.height == 0 && man.bloodType == '0')
        break;
}

Re:課題の問題でつまってしまいました

Posted: 2010年7月08日(木) 00:40
by ISLe
sscanfの戻り値をチェックしたほうが良い気がします。

Re:課題の問題でつまってしまいました

Posted: 2010年7月08日(木) 07:44
by へろりくしょん
>の部分でたくさんfor文を使われていたので、そのようなfor文は必要ないという意味です。

なるほど納得です。

>if(man.name[0] == '0' && man.height == 0 && man.bloodType == '0')

終了条件ってこういう意味だったのですね。
確かに、スレ元を見ると0と0の間にスペースが入ってます。

てっきり "000\n" という入力を受け取ったら終わると思ってました。
変わった仕様だなと思ってました。
相当流し読みしてたみたいです。

やっぱり”いっぺん死んでみる?”とか言われるのでしょうか。

Re:課題の問題でつまってしまいました

Posted: 2010年7月08日(木) 23:10
by かむかむ
みなさん、ありがとです。

sscanfとの二通りで作ってみようと、現在格闘しております。

Re:課題の問題でつまってしまいました

Posted: 2010年7月14日(水) 00:57
by かむかむ
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define BUFFER_SIZE 256
#define NUMBER 128
#define NAME_SIZE 32

struct PROFILE{
char name[NAME_SIZE];

float height;

char bloodType;
};

void printProfile(struct PROFILE *pp){
printf("名前:%s\t身長:%f\t血液型:%c\n", pp->name, pp->height, pp->bloodType);

}

int main(){

int i, count;
struct PROFILE man[NUMBE[/url];
char buf[BUFFER_SIZE];

float *height;
char *blood;
count = 0;

height = &man[count].height;
blood = &man[count].bloodType;

while(count < NUMBER){
printf("%d人目: ", count + 1);
fgets(buf, BUFFER_SIZE, stdin);

strcpy(man[count].name, strtok(buf, " "));
height = double atof(strtok(NULL, " ")); ←40行目
blood = strtok(NULL, "\n");

count++;

if(man[count].name[0] == '0' && man[count].height == '0' && man[count].bloodType == '0')
break;
}

for(i = 0;i < count;i++){
profilePrint(&man);
}

return 0;
}


自分なりに考えてやってみたのですが、40行目に文法エラー befre "double"っとエラーになってしまいます


あと、char型変数にAB型を一文字として入れるにはどうすればよいのでしょうか?