二次元配列をつかい、mallocを使い、以下の条件で記したメモリ領域を確保するプログラムを作成せよ。という問題がわかりません。。。
array[m][n]
一行目・・・8列
二行目・・・4列
三行目・・・3列
四行目・・・6列
各領域はfloat型を格納できるものとする
ポインタの動的確保について
Re: ポインタの動的確保について
いろんな方法があると思いますがおそらく最も基本的なやり方と思われる方法は
int main( int argc, char **argv )
{
}
みたいにfloat **matrix;ダブルポインタまたはfloat *matrix[];で作ります。
まず一次元配列 float* matrixではどうmallocを習われました。
int main( int argc, char **argv )
{
}
みたいにfloat **matrix;ダブルポインタまたはfloat *matrix[];で作ります。
まず一次元配列 float* matrixではどうmallocを習われました。
Re: ポインタの動的確保について
一応3つ思い着いた中で一つ書いておきます。十分検証したつもりですが2次元配列とポインターは文法が乱れてる(読んでる本に書いてあります..)とこらしいので再度検証をして下さい。”四行目・・・6列”は省略してあります。
(計算部分はゲームに関係する数値を計算してるので書き換えてください。間違っているかも知れません。)
#include <stdio.h>
#include <stdlib.h>
int main(void) {
//割り振られた領域のアドレスを格納するためのfloat型のポインタfpを宣言
float *fp[3]; //Cの宣言では[] は* よりも優先順位が高い。ゆえにfloat *fp[2];
//という宣言はfloatへのポインタの配列を意味する(逆みたいですが)
int n1 = 8; //確保する要素数を入力
int n2 = 4;
int n3 = 3;
int i;
float delta = 1000.0f / 60.0f;//delta(Time)
fp[0] = (float *)malloc(n1 * sizeof(float)); //メモリ領域の確保
fp[1] = (float *)malloc(n2 * sizeof(float)); //メモリ領域の確保
fp[2] = (float *)malloc(n3 * sizeof(float)); //メモリ領域の確保
for (i = 0; i<n1; i++) { *(fp[0] + i) = delta * i; } // データ格納
for (i = 0; i<n1; i++) { printf("%f ", fp[0][i]); }// データ表示
printf("\n\n");
for (i = 0; i<n2; i++) { *(fp[1] + i) = delta * i; } // データ格納
for (i = 0; i<n2; i++) { printf("%f ", fp[1][i]); } // データ表示
printf("\n\n");
for (i = 0; i<n3; i++) { *(fp[2] + i) = delta * i; } // データ格納
for (i = 0; i<n3; i++) { printf("%f ", fp[2][i]); } // データ表示
free(fp[0]); //確保したメモリ領域の解放::この場合プログラムが終了するので不要
free(fp[1]); //確保したメモリ領域の解放::この場合プログラムが終了するので不要
free(fp[2]); //確保したメモリ領域の解放::この場合プログラムが終了するので不要
printf("\n\n");
return 0;
}
Re: ポインタの動的確保について
列のサイズの異なるメモリ領域を無駄なく確保して、
二次元配列のように使えるものです。
二次元配列も、malloc も使っていないので、解答ではありませんが。
二次元配列のように使えるものです。
#include <stdio.h>
int main(void)
{
enum { N0 = 8, N1 = 4, N2 = 3, N3 = 6 };
float m[N0 + N1 + N2 + N3];
float *array[4] = { m, array[0] + N0, array[1] + N1, array[2] + N2 };
for (int i = 0; i < N0; i++) printf(" %p", &array[0][i]); putchar('\n');
for (int i = 0; i < N1; i++) printf(" %p", &array[1][i]); putchar('\n');
for (int i = 0; i < N2; i++) printf(" %p", &array[2][i]); putchar('\n');
for (int i = 0; i < N3; i++) printf(" %p", &array[3][i]); putchar('\n');
return 0;
}
Re: ポインタの動的確保について
この様に書き換えれば正解になると思います。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
enum { N0 = 8, N1 = 4, N2 = 3, N3 = 6 };
float *m; //float m[N0 + N1 + N2 + N3];
float *array[4];//配列の配列
int i;
m = malloc(sizeof(float) * (N0 + N1 + N2 + N3));//メモリ領域の確保
array[0]=m; array[1]=array[0] + N0; array[2]=array[1] + N1; array[3]=array[2] + N2;
//array[4] = { m, array[0] + N0, array[1] + N1, array[2] + N2 };
for (i = 0; i < N0; i++) printf(" %p", &array[0][i]); putchar('\n');//2次元配列(=配列の配列)
for (i = 0; i < N1; i++) printf(" %p", &array[1][i]); putchar('\n');//2次元配列(=配列の配列)
for (i = 0; i < N2; i++) printf(" %p", &array[2][i]); putchar('\n');//2次元配列(=配列の配列)
for (i = 0; i < N3; i++) printf(" %p", &array[3][i]); putchar('\n');//2次元配列(=配列の配列)
return 0;
}