这是我对二值图像的输出,可是用到动态数组时程序就运行不了,恳请各位大佬帮忙看看,未加动态数组的正常程序在最下面

Xingye86_ 2024-02-01 16:54:26

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
void readBmp(char filename[]);
int fac(int n);
struct Bmp
{
int w; // 二值图像的宽度(像素的列数)
int h; // 二值图像的高度(像素的行数)
int s; // 二值图像像素数据存储的起始位置
unsigned char **data;
}bmp;
int main(void)
{
    int i;
    char filename[128];
    readBmp(filename);
    for(i=bmp.h-1;i>=0;i--)
    printf("%s\n",bmp.data[i]);
    for(i=0;i<bmp.h;i++)
        free(bmp.data[i]);
    free(bmp.data);
}
void readBmp(char filename[])
{
int count=0,i,m=0,n=0,r,j,k;
unsigned int flag;
int data[8],**a=NULL;
 FILE *fp;
 bmp.data=NULL;
printf("请输入二值位图图像的文件名:");
gets(filename);
fp=fopen(filename, "rb"); // 打开文件
if(fp == NULL)
{
printf("图像文件 %s 不存在,请检查后重试!\n", filename);
exit(1);
}
fseek(fp, 18, SEEK_SET);
fread(&bmp.w, sizeof(int), 1, fp); // 读图像的宽度
fread(&bmp.h, sizeof(int), 1, fp); // 读图像的高度
fseek(fp, 10, SEEK_SET);
fread(&bmp.s, sizeof(int), 1, fp); // 读取图像像素数据存储的起始位置
printf("图像的宽度 = %d\n", bmp.w);
r=bmp.w%32;
printf("图像的高度 = %d\n", bmp.h);
printf("图像像素数据存储的起始位置 = %d\n", bmp.s);
bmp.data=(unsigned char**)malloc(sizeof(unsigned char)*bmp.h);
if(bmp.data==NULL)
{
    printf("can't");
    exit(-1);
}
for(i=0;i<bmp.h;i++)
bmp.data[i]=(unsigned char*)malloc(sizeof(unsigned char)*(bmp.w+1));
a=( int**)malloc(sizeof( int)*bmp.h);
for(i=0;i<bmp.h;i++)
a[i]=(int*)malloc(sizeof(int)*(bmp.w+32));
fseek(fp,bmp.s,SEEK_SET);
while(1)
{
    k=fread(&flag,1,1,fp);
    if(k!=1)
    {
        printf("no");
        exit(-1);
    }
    if(feof(fp)!=0)
        break;
    for(i=0;i<8;i++)
    {
        data[i]=flag%2;
        flag=flag/2;
    }
    for(i=7;i>=0;i--)
    {
        a[m][n]=data[i];
        n++;
    }
    if(r!=0)
    {
        if(n>=bmp.w+32-r)
        {
        m++;
        n=0;
        }
    }
    else if(n>=bmp.w)
    {
        m++;
        n=0;
    }
    for(i=0;i<bmp.h;i++)
    {
        for(j=0;j<bmp.w;j++)
           if(a[i][j]==0)
            bmp.data[i][j]='*';
             else 
            bmp.data[i][j]=' ';
        bmp.data[i][j]='\0';
    }
}
for(i=0;i<bmp.h;i++)
free(a[i]);
free(a);
fclose(fp);
}

下面的是未加动态数组时的程序,能正常运行

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define MAX_ROWS 300
#define MAX_COLS 300
void readBmp(char filename[]);
int fac(int n);
struct Bmp
{
int w; // 二值图像的宽度(像素的列数)
int h; // 二值图像的高度(像素的行数)
int s; // 二值图像像素数据存储的起始位置
unsigned char data[MAX_ROWS][MAX_COLS];
}bmp;
int main(void)
{
    int i;
    char filename[128];
    readBmp(filename);
    for(i=bmp.h-1;i>=0;i--)
    printf("%s\n",bmp.data[i]);
}
void readBmp(char filename[])
{
int count=0,i,m=0,n=0,r,j;
unsigned int flag;
int data[8],a[300][320];
 FILE *fp;
printf("请输入二值位图图像的文件名:");
gets(filename);
fp=fopen(filename, "rb"); // 打开文件
if(fp == NULL)
{
printf("图像文件 %s 不存在,请检查后重试!\n", filename);
exit(1);
}
fseek(fp, 18, SEEK_SET);
fread(&bmp.w, sizeof(int), 1, fp); // 读图像的宽度
fread(&bmp.h, sizeof(int), 1, fp); // 读图像的高度
fseek(fp, 10, SEEK_SET);
fread(&bmp.s, sizeof(int), 1, fp); // 读取图像像素数据存储的起始位置
printf("图像的宽度 = %d\n", bmp.w);
r=bmp.w%32;
printf("图像的高度 = %d\n", bmp.h);
printf("图像像素数据存储的起始位置 = %d\n", bmp.s);
fseek(fp,bmp.s,SEEK_SET);
while(1)
{
    fread(&flag,1,1,fp);
    if(feof(fp)!=0)
        break;
    for(i=0;i<8;i++)
    {
        data[i]=flag%2;
        flag=flag/2;
    }
    for(i=7;i>=0;i--)
    {
        a[m][n]=data[i];
        n++;
    }
    if(r!=0)
    {
        if(n>=bmp.w+32-r)
        {
        m++;
        n=0;
        }
    }
    else if(n>=bmp.w)
    {
        m++;
        n=0;
    }
    for(i=0;i<bmp.h;i++)
    {
        for(j=0;j<bmp.w;j++)
           if(a[i][j]==0)
            bmp.data[i][j]='*';
             else 
            bmp.data[i][j]=' ';
        bmp.data[i][j]='\0';
    }
}
fclose(fp);
}

...全文
139 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
forever74 02-01
  • 打赏
  • 举报
回复 1

bmp.data=(unsigned char**)malloc(sizeof(unsigned char *)*bmp.h);
Xingye86_ 02-01
  • 举报
回复
@forever74 谢谢哥,这个错误我竟然没注意到,感谢

69,283

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧