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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
がーまる

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

#1

投稿記事 by がーまる » 11年前

構造体を使い、それをメモリ割り当てする三角形の面積を求めるプログラミングを作成しました。(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;
} 

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 11年前

*(割り当てをしたメモリのアドレスの式(ポインタ型))と書くことで、そのメモリをそのポインタの変数と同じように利用できます。
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;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 15年前

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

#3

投稿記事 by box » 11年前

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

問題解決の方向は、「単純→複雑」であるべきではないか、と思います。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

がーまる

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

#4

投稿記事 by がーまる » 11年前

みけCATさん
なるほど、->を利用すればよいのですね、ありがとうございます。

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

閉鎖

“C言語何でも質問掲示板” へ戻る