如何在c中初始化局部变量?

时间:2018-03-20 13:19:24

标签: c

我试图在c中实现读取BMP文件。 我从谷歌那里得到了基本的bmp阅读模块,如下所示。

#include <stdio.h>
#include <malloc.h>
#include <memory.h>
#include <io.h>
#include <fcntl.h>
#include "ReadBMP.h"


char ReadBMPFile(const char *file_name, BMPDATA *ret_bmp_data)
{
    int fh;
    long file_length;
    void *bmp_file_data;

    fh = _open(file_name, _O_RDONLY, _O_BINARY);
    if (fh == -1)
    {
        return -1;
    }

    _lseek(fh, 0, SEEK_END);
    file_length = _tell(fh);
    _lseek(fh, 0, SEEK_SET);

    bmp_file_data = malloc(file_length);
    _read(fh, bmp_file_data, file_length);

    _close(fh);

    ReadBMPData(bmp_file_data, ret_bmp_data);

    free(bmp_file_data);
    return 0;
}

但我觉得很难在我的代码中使用上面的函数。

#include <windows.h>
#include "ReadBMP.h"
#define WIDTHBYTES(bits) (((bits)+31)/32*4)
#define BYTE    unsigned char

int main(int argc, char *argv[])
{
    FILE *fp;
    int i, j, k,n;
    int width = 16;
    int height = 16;
    int bpp = 24;

    FILE *fp_new;
    char *filename_new;
    char ch;
    BMPDATA *ret_bmp_data;

    int val[1000];
    char filename[100];
    //char *filename = "test.bmp"; 

    // Check if a filename has been specified in the command
    if (argc < 2)
    {
        printf("Missing Filename\n");
        return(1);
    }
    else
    {
        filename_new = argv[1];
        printf("Filename : %s\n", filename_new);
    }

    ReadBMPFile(filename_new, ret_bmp_data);

当我这样实施时,我收到了如下错误消息

  
    

错误C4700:未初始化的本地变量&#39; ret_bmp_data&#39;使用

  

如何初始化局部变量?

更新

我已经更新了ReadBMP.c文件。

#include <stdio.h>
#include <malloc.h>
#include <memory.h>
#include <io.h>
#include <fcntl.h>
#include "ReadBMP.h"

void DecodeData(const char *byte_data, int offset, BMPDATA *ret_bmp_data);
void DecodeInfomation(const char *byte_data, int offset, BMPDATA *ret_bmp_data);

char ReadBMPFile(const char *file_name, BMPDATA *ret_bmp_data)
{
    int fh;
    long file_length;
    void *bmp_file_data;

    fh = _open(file_name, _O_RDONLY, _O_BINARY);
    if (fh == -1)
    {
        return -1;
    }

    _lseek(fh, 0, SEEK_END);
    file_length = _tell(fh);
    _lseek(fh, 0, SEEK_SET);

    bmp_file_data = malloc(file_length);
    _read(fh, bmp_file_data, file_length);

    _close(fh);

    ReadBMPData(bmp_file_data, ret_bmp_data);

    free(bmp_file_data);
    return 0;
}

char ReadBMPData(const void *bmp_file_data, BMPDATA *ret_bmp_data)
{
    char *byte_data;   
    int offset;   

    byte_data = (char *)bmp_file_data;

    if ((byte_data[0] != 'B') || (byte_data[1] != 'M'))   
    {
        return -1;
    }

    memcpy(&offset, &byte_data[10], 4);

    DecodeInfomation(byte_data, offset, ret_bmp_data);
    DecodeData(byte_data, offset, ret_bmp_data);

    return 0;
}

void DecodeInfomation(const char *byte_data, int offset, BMPDATA *ret_bmp_data)
{
    if (offset == 26)
    {
        memcpy(&ret_bmp_data->width, &byte_data[18], 2);
        memcpy(&ret_bmp_data->height, &byte_data[20], 2);
        memcpy(&ret_bmp_data->bits_per_pixel, &byte_data[24], 2);
    }
    else
    {
        memcpy(&ret_bmp_data->width, &byte_data[18], 4);
        memcpy(&ret_bmp_data->height, &byte_data[22], 4);
        memcpy(&ret_bmp_data->bits_per_pixel, &byte_data[28], 2);
    }
}

void DecodeData(const char *byte_data, int offset, BMPDATA *ret_bmp_data)
{
    int data_size;

    if (ret_bmp_data->bits_per_pixel == 24)
    {
        data_size = ret_bmp_data->width * ret_bmp_data->height * 3;
        ret_bmp_data->data = malloc(data_size);
        memcpy(ret_bmp_data->data, &byte_data[offset], data_size);

    }
}

这是ReadBMP.h

#ifndef READBMP_H
#define READBMP_H

typedef struct BMPDATA
{
    short bits_per_pixel;
    int width;
    int height;
    unsigned char *data;
}BMPDATA;

#ifdef __cplusplus
extern "C"
{
#endif

char ReadBMPFile(const char *file_name, BMPDATA *ret_bmp_data);
char ReadBMPData(const void *bmp_file_data, BMPDATA *ret_bmp_data);

#ifdef __cplusplus
}
#endif


#endif

这是Source.cpp

#include <stdio.h>
#include <stdlib.h>     /* system, NULL, EXIT_FAILURE */
#include <windows.h>
#include "ReadBMP.h"
#define WIDTHBYTES(bits) (((bits)+31)/32*4)
#define BYTE    unsigned char

int main(int argc, char *argv[])
{
    FILE *fp;
    int i, j, k,n;
    int width = 16;
    int height = 16;
    int bpp = 24;

    ////////////////// add BMP read 2018-03-20 ///////////////
    FILE *fp_new;
    char *filename_new;
    char ch;
    BMPDATA *ret_bmp_data;

    int val[1000];
    char filename[100];
    //char *filename = "test.bmp"; 

    // Check if a filename has been specified in the command
    if (argc < 2)
    {
        printf("Missing Filename\n");
        return(1);
    }
    else
    {
        filename_new = argv[1];
        printf("Filename : %s\n", filename_new);
    }


    ReadBMPFile(filename_new, ret_bmp_data);
fclose(fp);
fclose(fp_new);
}

1 个答案:

答案 0 :(得分:2)

由于错误消息,似乎BMPDATA中的main变量不应该是BMPDATA指针而是BMPDATA对象。

像:

int main(int argc, char *argv[])
{
    ....

    BMPDATA ret_bmp_data;

    ....

    ReadBMPFile(filename_new, &ret_bmp_data);

    ....
}