ページ 11

すみません課題なんですが・・・・

Posted: 2007年2月09日(金) 13:39
by もも
構造体 TEST_Vの実体testをmain関数のローカルで宣言し、test()関数を呼び出す。
test()関数内でtestの内容を設定する。設定内容は以下の通り。
a:1000,
b:[システムサポート],
c:文字[P]を代入しなさい。

test()関数を呼び出す前後で各メンバを表示する事。
又、main()関数の先頭でtestくぉ初期化する事。0x00で埋める。

#include <stdio.h>
#include <string.h>

struct test_v{
int a;
char b[256];
char c;
};

void change(test);


int main(void)
{
test_v test={0,"0",'0'};

printf("初期状態を表示\n");
printf("a=%d\n", test1.a);
printf("b=%s\n", test1.b);
printf("c=%c\n", test1.c);

test1=change(test);

printf("変更後の変数a,b,cを表示します\n");
printf("a=%d\n", test1.a);
printf("b=%s\n", test1.b);
printf("c=%c\n", test1.c);

return 0;
}

ここからわかりません。・・・どなたか教えてください・・・

Re:すみません課題なんですが・・・・

Posted: 2007年2月09日(金) 15:25
by Yuki
>構造体 TEST_V
とあるので、構造体の宣言はこのようになります。
#typedef struct test_v{
int a;
char b[256];
char c;
}TEST_V;
※ C言語では大文字、小文字が区別されるので注意してください。

#typedefをまだ習っていないようでしたら、以下の説明の「TEST_V」は「struct TEST_V」に
置き換えてお考えください。


>構造体 TEST_Vの実体testをmain関数のローカルで宣言し、test()関数を呼び出す。
>void change(test);
test関数?change関数?どちらですか?

とりあえずchange関数で構造体に値を設定すると仮定して、
上記の関数宣言ではchange関数はtestがどんな型かわかりませんよね?
void change(TEST_V test);
としてあげると良いでしょう。

>test()関数内でtestの内容を設定
change関数で設定された値をmain関数でも使用したい場合は、
2つのやり方があります。
【1】構造体をリターン値として受け取る
TEST_V change(void);
としてあげます。

【2】構造体をポインタで渡す
void change(TEST_V *ptest);
としてあげます。
※ main関数のtestと区別しやすくするために、変数名をptestにしました。

関数内で構造体に値を設定する方法は、↓のHPを熟読していただければ
ヒントが得られると思います。
http://www9.plala.or.jp/sgwr-t/c/sec15-4.html

またわからないことがありましたら、問い合わせください。

Re:すみません課題なんですが・・・・

Posted: 2007年2月09日(金) 15:39
by keichan
#typedef struct test_v{ 
	int a; 
	char b[256]; 
	char c; 
}TEST_V; 

×:#typedef
○:typedef
typedefに # は付けてはいけません。
(#はプリプロセッサ命令及び文字連結に使用します)

Re:すみません課題なんですが・・・・

Posted: 2007年2月09日(金) 16:05
by もも
#include <stdio.h>
#include <string.h>

struct test_v{
int a;
char b[256];
char c;
};

struct test_v test(void);

int main(void)
{
struct test_v test1;

test1.a=0;

test1.c='0';



printf("初期状態を表示\n");
printf("a=%d\n", test1.a);
printf("b=%s\n", test1.b);
printf("c=%c\n", test1.c);

test1=test();

printf("変更後の変数a,b,cを表示します\n");
printf("a=%d\n", test1.a);
printf("b=%c\n", test1.b);
printf("c=%c\n", test1.c);

return 0;
}

struct test_v test(void)
{
struct test_v test2;

test2.a=1000;

test2.c='p';

return test2;

}

こんな感じでしてみました^^;しかし、bの初期化と関数内でどのように書けばいいのかわかりません。

Re:すみません課題なんですが・・・・

Posted: 2007年2月09日(金) 16:24
by Yuki
keichanさん
>typedefに # は付けてはいけません。
いつもの悪い癖が出てしまいました。ご指摘ありがとうございます。


ももさん
>bの初期化と関数内でどのように書けばいいのかわかりません。
構造体は置いておいて
char str[256];
という変数があったときに、初期化はどうしますか?
また、どのように値を代入していましたか?

Re:すみません課題なんですが・・・・

Posted: 2007年2月09日(金) 16:25
by バグ
初期化はmemset関数を使えば便利かもしれませんが…使い方が分からなければ、ループで初期化してもいいのではないでしょうか?

for( i = 0 ; i < 256 ; i++ )
{
test1.b = '\0';
}

こんな感じでどうでしょう?

文字列への代入(?)はsprintf関数を使うといいですよ(^-^)

ところで、今回の課題に<string.h>って、必要ない気がするのですが…?

Re:すみません課題なんですが・・・・

Posted: 2007年2月09日(金) 16:47
by もも
for( i = 0 ; i < 256 ; i++ )
{
test1.b = '\0';
}
を利用したんですが、表示に0がかあり並びました^^;
1つだけ0を表示したかったんですが・・。

Re:すみません課題なんですが・・・・

Posted: 2007年2月09日(金) 16:57
by Yuki
>test1.b = '\0';
これはどこでやっていますか?

今できているソースをすべてアップしてくれると、指摘しやすいのですが。

Re:すみません課題なんですが・・・・

Posted: 2007年2月09日(金) 16:57
by バグ
あら?0x00で初期化というのは、文字列の終わりを示す'\0'で初期化という意味ではなかったのですね。
1つだけ0をするのであれば…

sprintf( test1.b , "0" );

でいけるかと思います。

Re:すみません課題なんですが・・・・

Posted: 2007年2月09日(金) 18:22
by もも
先ほどの問題なんですが、ポインタでするようです。。。ポインタでやるとどうなるのでしょか?

Re:すみません課題なんですが・・・・

Posted: 2007年2月09日(金) 18:30
by Yuki
私が紹介したHPは熟読していただけたでしょうか?

【2.アドレス渡し】
の項にヒントがあると思うのですが。

Re:すみません課題なんですが・・・・

Posted: 2007年2月09日(金) 18:46
by バグ
ヒントです(^-^)
#include	<stdio.h>

void	Plus( int *pVal )
{
	( *pVal ) += 5;
}

int	main( void )
{
	int	nVal = 0;

	printf( "変更前の nVal の値\n" );
	printf( "nVal = %d\n" , nVal );

	Plus( &nVal );

	printf( "Plus関数通過後の nVal の値\n" );
	printf( "nVal = %d\n" , nVal );

	return( 0 );
}

Re:すみません課題なんですが・・・・

Posted: 2007年2月09日(金) 19:21
by もも
#include <stdio.h>
#include <string.h>

struct test_v{
int a;
char b[256];
char c;
};

void test(struct test_v *test1);

int main(void)
{
struct test_v test1={0,"\0",'0'};



printf("初期状態を表示\n");
printf("a=%d\n", test1.a);
printf("b=%s\n", test1.b);
printf("c=%c\n", test1.c);

test(&test1);

printf("変更後の変数a,b,cを表示します\n");
printf("a=%d\n", test1.a);
printf("b=%s\n", test1.b);
printf("c=%c\n", test1.c);

return 0;
}

void test(struct test_v *test1)
{
struct test_v test2;

test2->a=1000;
strcpy(test2->b,"システムサポート");
test2->c='p';

}

こんな感じなんでしょうか? 少し自分なりに書いてみました。

Re:すみません課題なんですが・・・・

Posted: 2007年2月09日(金) 19:39
by box
> こんな感じなんでしょうか? 少し自分なりに書いてみました。

もし、お手元にコンパイル・実行できる環境があるならば、
まずはご自分で確かめてみてください。