2

このコードは、画像ファイルから配列に値を読み取るためのものです (サイズが 16*8 であることはわかっています)。

img 配列を動的に作成して任意のサイズの画像を作成すると、実行時にクラッシュしますが、手動で正しいサイズ ( char img[16][8];) にすると動作します。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    FILE *fin;
    fin= fopen ("test.pgm","rb");
    if (fin == NULL)
    {
        printf ("ERROR");
        fclose(fin);
    }

    int i=0,j=0,u=16,v=8,d;
    char test[20];
    char k;
    char c[10];
    while((k=fgetc(fin))!='\n')
    {
        test[j]=k;  
        j=j+1;
    }

    char **img = (char**) calloc(u,sizeof(char*));
    for ( i = 0; i < u; i++ )
    {
        img[i] = (char*) calloc(v,sizeof(char));
    }

    fread(img,1,(u*v),fin);
    for (i=0; i<u; i++)
    {
        for (j=0; j<v; j++)
        {
            printf("%d ",img[i][j]);
        }
        printf("\n");
    }
    fclose(fin);
}
4

3 に答える 3

0

ポインターの配列を恐れますが、それらはメモリ内のさまざまな場所を指しているため、機能しません。

それが機能するためには、ポインタが同じブロックを指すように設定しますが、オフセットは異なります

だから代わりに

char **img = calloc(u,sizeof(char*));
for ( i = 0; i < u; i++ )
{
    img[i] = calloc(v,sizeof(char));
}

行う

char **img = calloc(u,sizeof(char*));
char *block = calloc(u*v,sizeof(char);
for ( i = 0; i < u; i++ )
{
    img[i] = block + v*i;
}

それから

fread(block,1,(u*v),fin);
于 2013-09-09T06:30:24.553 に答える