ページ 11

変数の有効範囲について

Posted: 2011年2月06日(日) 23:49
by megane
変数の有効範囲とポインタについて教えてください。
以下のように、main関数でポインタを宣言して、他の関数を経由して、値を取得したい場合には
どのようにすればいいのでしょうか?

このプログラムを実行した場合、 point関数で値を表示しようとすれば、menseki関数で定義された値を表示
できますが、その呼び出し元のmain関数では、point関数が終了した時点で領域が消えるので値の表示ができません。
main関数で SQUARE_tをポインタで宣言しなければできるのはわかるのですが、ポインタで宣言した場合の方法が知りたいです。


コード:

#include <stdio.h>

typedef struct
{
	int x;
	int y;
	int h;
	int w;
} SQUARE_t;


void point (SQUARE_t *);
SQUARE_t *menseki ();

int main(void)
{
	SQUARE_t *square;
	point(square);
	
	printf("x[%d]\n",square->x);
	printf("y[%d]\n",square->y);
	printf("h[%d]\n",square->h);
	printf("w[%d]\n",square->w);

return 0;
}


void point(SQUARE_t *square)
{

	square = menseki();
	
}


SQUARE_t *menseki ()
{
static	SQUARE_t square;
	square.x = 0;
	square.x = 1;
	square.x = 2;
	square.x = 3;
	return 	&square; 
}

Re: 変数の有効範囲について

Posted: 2011年2月07日(月) 00:17
by kimuchi
SQUARE_t構造体定義をグローバル化してしまうか、
SQUARE_tサイズのメモリを確保してそのポインタを利用するか、
などはどうでしょう?
後者は試したことがないですが。

Re: 変数の有効範囲について

Posted: 2011年2月07日(月) 00:23
by Ciel
なにをしたいのかよくわからない関数ですが、
ポインタのポインタを渡せばいいんじゃないですか?

コード:

#include <stdio.h>
 
typedef struct
{
    int x;
    int y;
    int h;
    int w;
} SQUARE_t;
 
 
void point (SQUARE_t **);
SQUARE_t *menseki ();
 
int main(void)
{
    SQUARE_t *square;
    point(&square);
    
    printf("x[%d]\n",square->x);
    printf("y[%d]\n",square->y);
    printf("h[%d]\n",square->h);
    printf("w[%d]\n",square->w);
 
return 0;
}
 
 
void point(SQUARE_t **square)
{
 
    *square = menseki();
    
}
 
 
SQUARE_t *menseki ()
{
static  SQUARE_t square;
    square.x = 0;
    square.x = 1;
    square.x = 2;
    square.x = 3;
    return  &square; 
}