ページ 11

メモリ割り当てについてよくわからない

Posted: 2015年3月09日(月) 18:46
by がーまる
構造体を使い、それをメモリ割り当てする三角形の面積を求めるプログラミングを作成しました。(c言語です)
メモリ割り当てについて持っている教材ではよくわからず、とりあえず割り当てまでは出来ました。しかし、これを「使う」というところで詰まっています。メモリ割り当てしたものの使い方を教えて下さい。

コード:

#include <stdio.h>
#include <stdlib.h>
#define DBG()  printf("%s(%d) ", __FILE__, __LINE__)

struct s_type{ 
	int takasa; 
	int teihen; 
	double area;
}s;

double keisan(int takasa, int teihen){
	DBG();
	return (double)s.takasa * (double)s.teihen / 2.0;
}


int main(void){
	struct s_type *mbuf;
	mbuf = (struct s_type *)malloc( sizeof(struct s_type) );
	if (!mbuf) {
		printf("メモリ割り当てエラー");
		exit(1);
	}

	double (*p)(int, int);

	printf("高さの入力\n");
	for( ; ; ){
		scanf("%d", &s.takasa);
		if(s.takasa < 1){
			printf("もう一度入力してください");
		} else {
			break;
		}
	}
	printf("底辺を入力\n");
	for( ; ; ){
		scanf("%d", &s.teihen);
		if(s.teihen < 1){
			printf("もう一度入力してください");
		} else {
			break;
		}
	}

	s.area = keisan(s.takasa, s.teihen);
	printf("\n三角形の面積は%f\n", s.area);
	free(mbuf);
	return 0;
} 

Re: メモリ割り当てについてよくわからない

Posted: 2015年3月09日(月) 19:31
by みけCAT
*(割り当てをしたメモリのアドレスの式(ポインタ型))と書くことで、そのメモリをそのポインタの変数と同じように利用できます。
hogeが構造体の時、(*hoge).fugaはhoge->fugaと書けます。

コード:

#include <stdio.h>
#include <stdlib.h>
#define DBG()  printf("%s(%d) ", __FILE__, __LINE__)

struct s_type{ 
	int takasa; 
	int teihen; 
	double area;
} /* s */; /* sは現時点ではいらない */

/* 構造体とは関係なく、三角形の面積を計算する */
/*
double keisan(int takasa, int teihen){
	DBG();
	return (double)s.takasa * (double)s.teihen / 2.0;
}
*/

/* struct s_typeのareaを設定する */
void keisan_s_type(struct s_type *m) {
	DBG();
	if (m != NULL) m->area = (double)m->takasa * (double)m->teihen / 2.0;
}


int main(void){
	struct s_type *mbuf;
	mbuf = (struct s_type *)malloc( sizeof(struct s_type) );
	if (!mbuf) {
		printf("メモリ割り当てエラー");
		exit(1);
	}

	/* 現時点ではいらない */
	/* double (*p)(int, int); */

	printf("高さの入力\n");
	for( ; ; ){
		scanf("%d", &mbuf->takasa); /* (*mbuf).takasaと書いてもよい */
		if(mbuf->takasa < 1){
			printf("もう一度入力してください");
		} else {
			break;
		}
	}
	printf("底辺を入力\n");
	for( ; ; ){
		scanf("%d", &mbuf->teihen);
		if(mbuf->teihen < 1){
			printf("もう一度入力してください");
		} else {
			break;
		}
	}

	/* mbuf->area = keisan(mbuf->takasa, mbuf->teihen); */
	keisan_s_type(mbuf);
	printf("\n三角形の面積は%f\n", mbuf->area);
	free(mbuf);
	return 0;
}

Re: メモリ割り当てについてよくわからない

Posted: 2015年3月09日(月) 20:55
by box
構造体とか三角形の面積とかの前に、まずは
・int型1個だけの領域を動的に確保する
・その領域に何か値を入れる
・入れた値を単に出力するだけの関数を作ってみる
というようなところから始めてみてはどうでしょうか。

問題解決の方向は、「単純→複雑」であるべきではないか、と思います。

Re: メモリ割り当てについてよくわからない

Posted: 2015年3月09日(月) 21:57
by がーまる
みけCATさん
なるほど、->を利用すればよいのですね、ありがとうございます。

boxさん
根底からの見直し、ありがとうございます。
その考えも考慮し、問題解決に望んでみようと思います。