#5
by かずま » 8年前
a[0][n-1] の次に a[1][0] が連続している本当の 2次元配列に近いものです。
free も楽です。
コード:
#include <stdio.h> // printf, putchar, puts
#include <stdlib.h> // malloc, free
typedef struct rgb_t { unsigned char r, g, b; } rgb_t;
int init(rgb_t **a, int m, int n);
int tesu(rgb_t **a, int m, int n);
int main(void)
{
int m = 3, n = 4;
rgb_t **color = (rgb_t **)malloc(sizeof(rgb_t *) * m);
if (!color) { puts("Cannot allocate memory."); return 1; }
color[0] = (rgb_t *)malloc(sizeof(rgb_t) * m * n);
if (!color[0]) { puts("Cannot allocate memory."); return 1; }
for (int i = 1; i < n; i++) color[i] = color[i-1] + n;
init(color, m, n);
tesu(color, m, n);
free(color[0]), free(color);
return 0;
}
int init(rgb_t **a, int m, int n)
{
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++) {
a[i][j].r = i*10 + j;
a[i][j].g = i*10 + j + 100;
a[i][j].b = i*10 + j + 200;
}
return 0;
}
int tesu(rgb_t **a, int m, int n)
{
for (int i = 0; i < m; i++, putchar('\n'))
for (int j = 0; j < n; j++)
printf(" [%3d,%3d,%3d]", a[i][j].r, a[i][j].g, a[i][j].b);
return 0;
}
実行結果
コード:
C:\Users\sakamoto\tmp\C>a
[ 0,100,200] [ 1,101,201] [ 2,102,202] [ 3,103,203]
[ 10,110,210] [ 11,111,211] [ 12,112,212] [ 13,113,213]
[ 20,120,220] [ 21,121,221] [ 22,122,222] [ 23,123,223]
正方行列の場合、int m は要らないでしょう。
a[0][n-1] の次に a[1][0] が連続している本当の 2次元配列に近いものです。
free も楽です。
[code=c]
#include <stdio.h> // printf, putchar, puts
#include <stdlib.h> // malloc, free
typedef struct rgb_t { unsigned char r, g, b; } rgb_t;
int init(rgb_t **a, int m, int n);
int tesu(rgb_t **a, int m, int n);
int main(void)
{
int m = 3, n = 4;
rgb_t **color = (rgb_t **)malloc(sizeof(rgb_t *) * m);
if (!color) { puts("Cannot allocate memory."); return 1; }
color[0] = (rgb_t *)malloc(sizeof(rgb_t) * m * n);
if (!color[0]) { puts("Cannot allocate memory."); return 1; }
for (int i = 1; i < n; i++) color[i] = color[i-1] + n;
init(color, m, n);
tesu(color, m, n);
free(color[0]), free(color);
return 0;
}
int init(rgb_t **a, int m, int n)
{
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++) {
a[i][j].r = i*10 + j;
a[i][j].g = i*10 + j + 100;
a[i][j].b = i*10 + j + 200;
}
return 0;
}
int tesu(rgb_t **a, int m, int n)
{
for (int i = 0; i < m; i++, putchar('\n'))
for (int j = 0; j < n; j++)
printf(" [%3d,%3d,%3d]", a[i][j].r, a[i][j].g, a[i][j].b);
return 0;
}
[/code]
実行結果
[code=text]
C:\Users\sakamoto\tmp\C>a
[ 0,100,200] [ 1,101,201] [ 2,102,202] [ 3,103,203]
[ 10,110,210] [ 11,111,211] [ 12,112,212] [ 13,113,213]
[ 20,120,220] [ 21,121,221] [ 22,122,222] [ 23,123,223]
[/code]
正方行列の場合、int m は要らないでしょう。