質問編集履歴

5 imageをpimageに更新、呼び出し時のvoid削除、グローバル変数pimageの追加

ain4425

ain4425 score 17

2018/07/17 21:41  投稿

C言語でのメモリの解放が出来ません
画像ファイルを読み込んで、いろいろなフィルタをかけて出力するプログラムを動かしていたのですが、画像枚数を4枚から5枚に増やしたところ以下のようなエラーが出てしまいました。
```
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
image.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Fatal: Error detected (LME1514)
Fatal: Error detected (LME1514)
Fatal: Error detected (LME1514)
Fatal: Error detected (LME1514)
```
**[LME1514]**を調べてみたところ、どうもメモリの溢れが問題となっているようでした。
どうか助けて頂けると幸いです。
---
画像にフィルタをかけるプログラム部分は長くなるので省略しますので、読込、出力等の重要部分だけのプログラムを**image.c**として記載します。
上記に付随するヘッダーファイルは**ppmlib.h**として記載します。
**image.c**
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include"ppmlib.h"
int Setting(void);
void ReadImage(int set);
void SaveImage(void);
int main(void){
   //標準設定パラメータ
   int set;
   //メモリ確保
   memory(void);
   memory();
   //標準設定
   set=Setting();
   //画像読込
   ReadImage(set);
   //画像の出力
   SaveImage();
   //メモリの開放
   free(pimage);
   return 0;
}
//標準設定
int Setting(void){
   int set_flag;
   printf("標準設定→1\n");
   printf("詳細設定→0\n");
   scanf("%d",&set_flag);
   return set_flag;
}
//画像の読み込み
void ReadImage(set){
   load_color_image(0,1,set);
   load_color_image(1,2,set);
   load_color_image(2,3,set);
   load_color_image(3,4,set);
   load_color_image(4,5,set);
}
//画像の出力
void SaveImage(void){
   save_color_image(0,"");
   save_color_image(1,"");
   save_color_image(3,"");
   save_color_image(4,"");
}
```
**ppmlib.h**
```c
#include<stdlib.h>
#include<string.h>
//height[],width[]のMAX画素数
#define MAX_IMAGESIZE  3000
//諧調値
#define MAX_BRIGHTNESS  255
//階調数(+1)
#define GRAYLEVEL       256
//FILEnameの最大長
#define MAX_FILENAME    256
//Buffer最大長
#define MAX_BUFFERSIZE  256
//画像枚数
#define MAX_NUM_OF_IMAGES 5
char pimage;  
 
typedef unsigned char (*pimage_type)[MAX_IMAGESIZE][MAX_IMAGESIZE][3];
int width[MAX_NUM_OF_IMAGES],height[MAX_NUM_OF_IMAGES];
 
void memory(void);
void load_color_image( int n, int no, int set );
void save_color_image( int n, char name[] );
void copy_color_image( int n1, int n2 );
void init_color_image( int n, int red, int green, int blue );
void memory(void){
   pimage_type pimage = (pimage_type)malloc(MAX_NUM_OF_IMAGES * MAX_IMAGESIZE * MAX_IMAGESIZE * 3);
}
void load_color_image( int n, int no, int set ){
   char fname[MAX_FILENAME];
   char buffer[MAX_BUFFERSIZE];
   FILE *fp;
   int max_gray=0,x,y,col;
   if( no==1 && set==1){
   printf("INPUT FILE : white1.ppm\n");
       strcpy(fname,"white1.ppm");
   }
   else if( no==2 && set==1){
   printf("INPUT FILE : white2.ppm\n");
       strcpy(fname,"white2.ppm");
   }
   else if( no==3 && set==1){
   printf("INPUT FILE : white3.ppm\n");
       strcpy(fname,"white3.ppm");
   }
   else if( no==4 && set==1){
   printf("INPUT FILE : white4.ppm\n");
       strcpy(fname,"white4.ppm");
   }
   else if( no==5 && set==1){
   printf("INPUT FILE : white5.ppm\n");
       strcpy(fname,"white5.ppm");
   }
   else{
       printf("INPUT FILE : ");
       scanf("%s", fname);
   }
   if ( (fp = fopen( fname, "rb" ))==NULL ){
       printf("CAN'T OPEN THE FILE\n");
       exit(1);
   }
   fgets( buffer, MAX_BUFFERSIZE, fp );
   //check P6
   if ( buffer[0]!='P' || buffer[1]!='6' ){
   printf("FILE TIPE WRONG!\n");
       exit(1);
   }
   width[n] = 0;
   height[n] = 0;
   while ( width[n] == 0 || height[n] == 0 ){
       fgets( buffer, MAX_BUFFERSIZE, fp );
       if ( buffer[0] != '#' ) {
           sscanf( buffer, "%d %d", &width[n], &height[n] );
       }
   }
   while ( max_gray == 0 ){
       fgets( buffer, MAX_BUFFERSIZE, fp );
       if ( buffer[0] != '#' ){
           sscanf( buffer, "%d", &max_gray );
       }
   }
   printf("----------------------------\n");
   printf("WIDTH :%d\n",width[n]);   
   printf("HEIGHT :%d\n",height[n]);
   printf("MAX RGB:%d\n",max_gray);
   printf("----------------------------\n");
   if ( width[n] > MAX_IMAGESIZE || height[n] >
       MAX_IMAGESIZE ||
       max_gray != MAX_BRIGHTNESS ){
       printf("SIZE or RGB WRONG!\n");
       exit(1);
   }
   for(y=0;y<height[n];y++){
       for(x=0;x<width[n];x++){
           for(col=0;col<3;col++){
             image[n][x][y][col] = (unsigned char)fgetc( fp );
             pimage[n][x][y][col] = (unsigned char)fgetc( fp );
           }
       }
   }
   printf("COMPLETE! ---> image[%d]\n",n);
   printf("----------------------------\n");   
   fclose(fp);
}
void save_color_image( int n, char name[] ){
   char fname[MAX_FILENAME];
   FILE *fp;
   int x,y,col;
   if ( name[0] == '\0' ){
       printf("OUTPUT FILE : ");
       scanf("%s",fname);
   } else strcpy( fname, name );
   if ( (fp = fopen(fname, "wb"))==NULL ){
       printf("CAN'T SAVE THE FILE\n");
       exit(1);
   }
   fputs( "P6\n", fp );
   fputs( "# Created by Image Processing\n", fp );
   fprintf( fp, "%d %d\n", width[n], height[n] );
   fprintf( fp, "%d\n", MAX_BRIGHTNESS );
   for(y=0;y<height[n];y++){
       for(x=0;x<width[n];x++){
           for(col=0;col<3;col++){
               fputc( image[n][x][y][col], fp );
               fputc( pimage[n][x][y][col], fp );
           }
       }
   }
   fclose(fp);
   printf("COMPLETE!\n");
}
void copy_color_image( int n1, int n2 ){
   int x,y,col;
   width[n2] = width[n1]; 
   height[n2] = height[n1];
   for(y=0;y<height[n1];y++){
       for(x=0;x<width[n1];x++){
           for(col=0;col<3;col++){
               image[n2][x][y][col] = image[n1][x][y][col];
               pimage[n2][x][y][col] = pimage[n1][x][y][col];
           }
       }
   }
}
void init_color_image( int n, int red, int green, int blue ){
   int x, y;
   for(y=0;y<height[n];y++){
       for(x=0;x<width[n];x++){
           if (red  != -1) image[n][x][y][0] = red;
           if (green != -1) image[n][x][y][1] = green;
           if (blue != -1) image[n][x][y][2] = blue;
           if (red  != -1) pimage[n][x][y][0] = red;
           if (green != -1) pimage[n][x][y][1] = green;
           if (blue != -1) pimage[n][x][y][2] = blue;
       }
   }
}
```
以上よろしくお願いします
  • C

    5044 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

4 mallocを含む関数名をmemoryに変更、free関数の書き直し

ain4425

ain4425 score 17

2018/07/17 20:38  投稿

C言語でのメモリの解放が出来ません
画像ファイルを読み込んで、いろいろなフィルタをかけて出力するプログラムを動かしていたのですが、画像枚数を4枚から5枚に増やしたところ以下のようなエラーが出てしまいました。
```
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
image.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Fatal: Error detected (LME1514)
Fatal: Error detected (LME1514)
Fatal: Error detected (LME1514)
Fatal: Error detected (LME1514)
```
**[LME1514]**を調べてみたところ、どうもメモリの溢れが問題となっているようでした。
どうか助けて頂けると幸いです。
---
画像にフィルタをかけるプログラム部分は長くなるので省略しますので、読込、出力等の重要部分だけのプログラムを**image.c**として記載します。
上記に付随するヘッダーファイルは**ppmlib.h**として記載します。
**image.c**
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include"ppmlib.h"
int Setting(void);
void ReadImage(int set);
void SaveImage(void);
int main(void){
   //標準設定パラメータ
   int set;
   //メモリ確保
   malloc();
   memory(void);
   //標準設定
   set=Setting();
   //画像読込
   ReadImage(set);
   //画像の出力
   SaveImage();
   //メモリの開放
   free();
   free(pimage);
   return 0;
}
//標準設定
int Setting(void){
   int set_flag;
   printf("標準設定→1\n");
   printf("詳細設定→0\n");
   scanf("%d",&set_flag);
   return set_flag;
}
//画像の読み込み
void ReadImage(set){
   load_color_image(0,1,set);
   load_color_image(1,2,set);
   load_color_image(2,3,set);
   load_color_image(3,4,set);
   load_color_image(4,5,set);
}
//画像の出力
void SaveImage(void){
   save_color_image(0,"");
   save_color_image(1,"");
   save_color_image(3,"");
   save_color_image(4,"");
}
```
**ppmlib.h**
```c
#include<stdlib.h>
#include<string.h>
//height[],width[]のMAX画素数
#define MAX_IMAGESIZE  3000
//諧調値
#define MAX_BRIGHTNESS  255
//階調数(+1)
#define GRAYLEVEL       256
//FILEnameの最大長
#define MAX_FILENAME    256
//Buffer最大長
#define MAX_BUFFERSIZE  256
//画像枚数
#define MAX_NUM_OF_IMAGES 5
typedef unsigned char (*pimage_type)[MAX_IMAGESIZE][MAX_IMAGESIZE][3];
int width[MAX_NUM_OF_IMAGES],height[MAX_NUM_OF_IMAGES];
void malloc(void);
void free(void);
void memory(void);
void load_color_image( int n, int no, int set );
void save_color_image( int n, char name[] );
void copy_color_image( int n1, int n2 );
void init_color_image( int n, int red, int green, int blue );
void malloc(void){
void memory(void){
   pimage_type pimage = (pimage_type)malloc(MAX_NUM_OF_IMAGES * MAX_IMAGESIZE * MAX_IMAGESIZE * 3);
}  
 
void free(void){  
   free(pimage);  
}
void load_color_image( int n, int no, int set ){
   char fname[MAX_FILENAME];
   char buffer[MAX_BUFFERSIZE];
   FILE *fp;
   int max_gray=0,x,y,col;
   if( no==1 && set==1){
   printf("INPUT FILE : white1.ppm\n");
       strcpy(fname,"white1.ppm");
   }
   else if( no==2 && set==1){
   printf("INPUT FILE : white2.ppm\n");
       strcpy(fname,"white2.ppm");
   }
   else if( no==3 && set==1){
   printf("INPUT FILE : white3.ppm\n");
       strcpy(fname,"white3.ppm");
   }
   else if( no==4 && set==1){
   printf("INPUT FILE : white4.ppm\n");
       strcpy(fname,"white4.ppm");
   }
   else if( no==5 && set==1){
   printf("INPUT FILE : white5.ppm\n");
       strcpy(fname,"white5.ppm");
   }
   else{
       printf("INPUT FILE : ");
       scanf("%s", fname);
   }
   if ( (fp = fopen( fname, "rb" ))==NULL ){
       printf("CAN'T OPEN THE FILE\n");
       exit(1);
   }
   fgets( buffer, MAX_BUFFERSIZE, fp );
   //check P6
   if ( buffer[0]!='P' || buffer[1]!='6' ){
   printf("FILE TIPE WRONG!\n");
       exit(1);
   }
   width[n] = 0;
   height[n] = 0;
   while ( width[n] == 0 || height[n] == 0 ){
       fgets( buffer, MAX_BUFFERSIZE, fp );
       if ( buffer[0] != '#' ) {
           sscanf( buffer, "%d %d", &width[n], &height[n] );
       }
   }
   while ( max_gray == 0 ){
       fgets( buffer, MAX_BUFFERSIZE, fp );
       if ( buffer[0] != '#' ){
           sscanf( buffer, "%d", &max_gray );
       }
   }
   printf("----------------------------\n");
   printf("WIDTH :%d\n",width[n]);   
   printf("HEIGHT :%d\n",height[n]);
   printf("MAX RGB:%d\n",max_gray);
   printf("----------------------------\n");
   if ( width[n] > MAX_IMAGESIZE || height[n] >
       MAX_IMAGESIZE ||
       max_gray != MAX_BRIGHTNESS ){
       printf("SIZE or RGB WRONG!\n");
       exit(1);
   }
   for(y=0;y<height[n];y++){
       for(x=0;x<width[n];x++){
           for(col=0;col<3;col++){
             image[n][x][y][col] = (unsigned char)fgetc( fp );
           }
       }
   }
   printf("COMPLETE! ---> image[%d]\n",n);
   printf("----------------------------\n");   
   fclose(fp);
}
void save_color_image( int n, char name[] ){
   char fname[MAX_FILENAME];
   FILE *fp;
   int x,y,col;
   if ( name[0] == '\0' ){
       printf("OUTPUT FILE : ");
       scanf("%s",fname);
   } else strcpy( fname, name );
   if ( (fp = fopen(fname, "wb"))==NULL ){
       printf("CAN'T SAVE THE FILE\n");
       exit(1);
   }
   fputs( "P6\n", fp );
   fputs( "# Created by Image Processing\n", fp );
   fprintf( fp, "%d %d\n", width[n], height[n] );
   fprintf( fp, "%d\n", MAX_BRIGHTNESS );
   for(y=0;y<height[n];y++){
       for(x=0;x<width[n];x++){
           for(col=0;col<3;col++){
               fputc( image[n][x][y][col], fp );
           }
       }
   }
   fclose(fp);
   printf("COMPLETE!\n");
}
void copy_color_image( int n1, int n2 ){
   int x,y,col;
   width[n2] = width[n1]; 
   height[n2] = height[n1];
   for(y=0;y<height[n1];y++){
       for(x=0;x<width[n1];x++){
           for(col=0;col<3;col++){
               image[n2][x][y][col] = image[n1][x][y][col];
           }
       }
   }
}
void init_color_image( int n, int red, int green, int blue ){
   int x, y;
   for(y=0;y<height[n];y++){
       for(x=0;x<width[n];x++){
           if (red  != -1) image[n][x][y][0] = red;
           if (green != -1) image[n][x][y][1] = green;
           if (blue != -1) image[n][x][y][2] = blue;
       }
   }
}
 
```
以上よろしくお願いします
  • C

    5044 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

3 malloc()とfree()の実装

ain4425

ain4425 score 17

2018/07/17 20:13  投稿

C言語でのメモリの解放が出来ません
画像ファイルを読み込んで、いろいろなフィルタをかけて出力するプログラムを動かしていたのですが、画像枚数を4枚から5枚に増やしたところ以下のようなエラーが出てしまいました。
```
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
image.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Fatal: Error detected (LME1514)
Fatal: Error detected (LME1514)
Fatal: Error detected (LME1514)
Fatal: Error detected (LME1514)
```
**[LME1514]**を調べてみたところ、どうもメモリの溢れが問題となっているようでした。
どうか助けて頂けると幸いです。
---
画像にフィルタをかけるプログラム部分は長くなるので省略しますので、読込、出力等の重要部分だけのプログラムを**image.c**として記載します。
上記に付随するヘッダーファイルは**ppmlib.h**として記載します。
**image.c**
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include"ppmlib.h"
int Setting(void);
void ReadImage(int set);
void SaveImage(void);
int main(void){
   //標準設定パラメータ
   int set;
   
   //標準設定
   set=Setting();
   
   //画像読込
   ReadImage(set);
   
   //画像の出力
   SaveImage();
   
       //メモリの開放
       free(pimage);
   return 0;
   //標準設定パラメータ
   int set;
   //メモリ確保
   malloc();
   //標準設定
   set=Setting();
   //画像読込
   ReadImage(set);
   //画像の出力
   SaveImage();
   //メモリの開放
   free();
   return 0;
}
//標準設定
int Setting(void){
   int set_flag;
   printf("標準設定→1\n");
   printf("詳細設定→0\n");
   scanf("%d",&set_flag);
   
   return set_flag;
   int set_flag;
   printf("標準設定→1\n");
   printf("詳細設定→0\n");
   scanf("%d",&set_flag);
   return set_flag;
}
//画像の読み込み
void ReadImage(set){
   
   load_color_image(0,1,set);
   load_color_image(1,2,set);
   load_color_image(2,3,set);
   load_color_image(3,4,set);
   load_color_image(4,5,set);
   
   load_color_image(0,1,set);
   load_color_image(1,2,set);
   load_color_image(2,3,set);
   load_color_image(3,4,set);
   load_color_image(4,5,set);
}
//画像の出力
void SaveImage(void){
   save_color_image(0,"");
   save_color_image(1,"");
   save_color_image(3,"");
   save_color_image(4,"");
   save_color_image(0,"");
   save_color_image(1,"");
   save_color_image(3,"");
   save_color_image(4,"");
}
```
**ppmlib.h**
```c
#include<stdlib.h>
#include<string.h>
//height[],width[]のMAX画素数
#define MAX_IMAGESIZE  3000
//諧調値
#define MAX_BRIGHTNESS  255
//階調数(+1)
#define GRAYLEVEL       256
//FILEnameの最大長
#define MAX_FILENAME    256
//Buffer最大長
#define MAX_BUFFERSIZE  256
//画像枚数
#define MAX_NUM_OF_IMAGES 5
//以下訂正前  
//unsigned char image[MAX_NUM_OF_IMAGES][MAX_IMAGESIZE][MAX_IMAGESIZE][3];  
 
//以下訂正後  
typedef unsigned char (*pimage_type)[MAX_IMAGESIZE][MAX_IMAGESIZE][3];
pimage_type pimage = (pimage_type)malloc(MAX_NUM_OF_IMAGES * MAX_IMAGESIZE * MAX_IMAGESIZE * 3);  
 
int width[MAX_NUM_OF_IMAGES],height[MAX_NUM_OF_IMAGES];
void malloc(void);  
void free(void);  
void load_color_image( int n, int no, int set );
void save_color_image( int n, char name[] );
void copy_color_image( int n1, int n2 );
void init_color_image( int n, int red, int green, int blue );
void malloc(void){  
   pimage_type pimage = (pimage_type)malloc(MAX_NUM_OF_IMAGES * MAX_IMAGESIZE * MAX_IMAGESIZE * 3);  
}  
 
void free(void){  
   free(pimage);  
}  
 
void load_color_image( int n, int no, int set ){
   
   char fname[MAX_FILENAME];
   char buffer[MAX_BUFFERSIZE];
   FILE *fp;
   int max_gray=0,x,y,col;
   
   if( no==1 && set==1){
   printf("INPUT FILE : white1.ppm\n");
   printf("INPUT FILE : white1.ppm\n");
       strcpy(fname,"white1.ppm");
   }
   else if( no==2 && set==1){
   printf("INPUT FILE : white2.ppm\n");
   printf("INPUT FILE : white2.ppm\n");
       strcpy(fname,"white2.ppm");
   }
   else if( no==3 && set==1){
   printf("INPUT FILE : white3.ppm\n");
   printf("INPUT FILE : white3.ppm\n");
       strcpy(fname,"white3.ppm");
   }
   else if( no==4 && set==1){
   printf("INPUT FILE : white4.ppm\n");
   printf("INPUT FILE : white4.ppm\n");
       strcpy(fname,"white4.ppm");
   }
   else if( no==5 && set==1){
   printf("INPUT FILE : white5.ppm\n");
   printf("INPUT FILE : white5.ppm\n");
       strcpy(fname,"white5.ppm");
   }
   else{
       printf("INPUT FILE : ");
       scanf("%s", fname);
   }
   if ( (fp = fopen( fname, "rb" ))==NULL ){
       printf("CAN'T OPEN THE FILE\n");
       exit(1);
   }
   fgets( buffer, MAX_BUFFERSIZE, fp );
   //check P6
   if ( buffer[0]!='P' || buffer[1]!='6' ){
   printf("FILE TIPE WRONG!\n");
   printf("FILE TIPE WRONG!\n");
       exit(1);
   }
   width[n] = 0;
   height[n] = 0;
   while ( width[n] == 0 || height[n] == 0 ){
       fgets( buffer, MAX_BUFFERSIZE, fp );
       if ( buffer[0] != '#' ) {
           sscanf( buffer, "%d %d", &width[n], &height[n] );
       }
   }
 
   while ( max_gray == 0 ){
       fgets( buffer, MAX_BUFFERSIZE, fp );
       if ( buffer[0] != '#' ){
           sscanf( buffer, "%d", &max_gray );
       }
   }
   printf("----------------------------\n");
   printf("WIDTH :%d\n",width[n]);   
   printf("WIDTH :%d\n",width[n]);   
   printf("HEIGHT :%d\n",height[n]);
   printf("MAX RGB:%d\n",max_gray);
   printf("----------------------------\n");
   if ( width[n] > MAX_IMAGESIZE || height[n] >
       MAX_IMAGESIZE ||
       max_gray != MAX_BRIGHTNESS ){
       printf("SIZE or RGB WRONG!\n");
       exit(1);
   }
   for(y=0;y<height[n];y++){
       for(x=0;x<width[n];x++){
           for(col=0;col<3;col++){
 
             image[n][x][y][col] = (unsigned char)fgetc( fp );
           }
       }
   }
   printf("COMPLETE! ---> image[%d]\n",n);
   printf("----------------------------\n");   
   printf("----------------------------\n");   
   fclose(fp);
}
void save_color_image( int n, char name[] ){
   char fname[MAX_FILENAME];
   FILE *fp;
   int x,y,col;
   if ( name[0] == '\0' ){
       printf("OUTPUT FILE : ");
       scanf("%s",fname);
   } else strcpy( fname, name );
   if ( (fp = fopen(fname, "wb"))==NULL ){
       printf("CAN'T SAVE THE FILE\n");
       exit(1);
   }
   fputs( "P6\n", fp );
   fputs( "# Created by Image Processing\n", fp );
   fprintf( fp, "%d %d\n", width[n], height[n] );
   fprintf( fp, "%d\n", MAX_BRIGHTNESS );
   
   for(y=0;y<height[n];y++){
       for(x=0;x<width[n];x++){
           for(col=0;col<3;col++){
               fputc( image[n][x][y][col], fp );
           }
       }
   }
   fclose(fp);
   printf("COMPLETE!\n");
}
void copy_color_image( int n1, int n2 ){
   int x,y,col;
   
   width[n2] = width[n1]; 
   height[n2] = height[n1];
   for(y=0;y<height[n1];y++){
       for(x=0;x<width[n1];x++){
           for(col=0;col<3;col++){
               image[n2][x][y][col] = image[n1][x][y][col];
           }
       }
   }
}
void init_color_image( int n, int red, int green, int blue ){
   int x, y;
   for(y=0;y<height[n];y++){
       for(x=0;x<width[n];x++){
           if (red  != -1) image[n][x][y][0] = red;
           if (green != -1) image[n][x][y][1] = green;
           if (blue != -1) image[n][x][y][2] = blue;
       }
   }
}
```
以上よろしくお願いします
  • C

    5044 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

2 image.cにfreeの追加、ヘッダファイルの綴りミスの訂正

ain4425

ain4425 score 17

2018/07/17 19:39  投稿

C言語でのメモリの解放が出来ません
画像ファイルを読み込んで、いろいろなフィルタをかけて出力するプログラムを動かしていたのですが、画像枚数を4枚から5枚に増やしたところ以下のようなエラーが出てしまいました。
```
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
image.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Fatal: Error detected (LME1514)
Fatal: Error detected (LME1514)
Fatal: Error detected (LME1514)
Fatal: Error detected (LME1514)
```
**[LME1514]**を調べてみたところ、どうもメモリの溢れが問題となっているようでした。
どうか助けて頂けると幸いです。
---
画像にフィルタをかけるプログラム部分は長くなるので省略しますので、読込、出力等の重要部分だけのプログラムを**image.c**として記載します。
上記に付随するヘッダーファイルは**ppmlib.h**として記載します。
**image.c**
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include"ppmlib.h"
int Setting(void);
void ReadImage(int set);
void SaveImage(void);
int main(void){
   //標準設定パラメータ
   int set;
   
   //標準設定
   set=Setting();
   
   //画像読込
   ReadImage(set);
   
   //画像の出力
   SaveImage();
   
       //メモリの開放  
       free(pimage);  
 
   return 0;
}
//標準設定
int Setting(void){
   int set_flag;
   printf("標準設定→1\n");
   printf("詳細設定→0\n");
   scanf("%d",&set_flag);
   
   return set_flag;
}
//画像の読み込み
void ReadImage(set){
   
   load_color_image(0,1,set);
   load_color_image(1,2,set);
   load_color_image(2,3,set);
   load_color_image(3,4,set);
   load_color_image(4,5,set);
   
}
//画像の出力
void SaveImage(void){
   save_color_image(0,"");
   save_color_image(1,"");
   save_color_image(3,"");
   save_color_image(4,"");
}
```
**ppmlib.h**
```c
#include<stdlib.h>
#include<string.h>
//height[],width[]のMAX画素数
#define MAX_IMAGESIZE  3000
//諧調値
#define MAX_BRIGHTNESS  255
//階調数(+1)
#define GRAYLEVEL       256
//FILEnameの最大長
#define MAX_FILENAME    256
//Buffer最大長
#define MAX_BUFFERSIZE  256
//画像枚数
#define MAX_NUM_OF_IMAGES 5
//以下訂正前
//unsigned char image[MAX_NUM_OF_IMAGES][MAX_IMAGESIZE][MAX_IMAGESIZE][3];
//以下訂正後
typedef unsigned char (*pimage_type)[MAX_IMAGEIZE][MAX_IMAGEIZE][3];
pimage_type pimage = (pimage_type)malloc(MAX_NUM_OF_IMAGE * MAX_IMAGEIZE * MAX_IMAGEIZE * 3);
typedef unsigned char (*pimage_type)[MAX_IMAGESIZE][MAX_IMAGESIZE][3];
pimage_type pimage = (pimage_type)malloc(MAX_NUM_OF_IMAGES * MAX_IMAGESIZE * MAX_IMAGESIZE * 3);
int width[MAX_NUM_OF_IMAGES],height[MAX_NUM_OF_IMAGES];
void load_color_image( int n, int no, int set );
void save_color_image( int n, char name[] );
void copy_color_image( int n1, int n2 );
void init_color_image( int n, int red, int green, int blue );
void load_color_image( int n, int no, int set ){
   
   char fname[MAX_FILENAME];
   char buffer[MAX_BUFFERSIZE];
   FILE *fp;
   int max_gray=0,x,y,col;
   
   if( no==1 && set==1){
   printf("INPUT FILE : white1.ppm\n");
       strcpy(fname,"white1.ppm");
   }
   else if( no==2 && set==1){
   printf("INPUT FILE : white2.ppm\n");
       strcpy(fname,"white2.ppm");
   }
   else if( no==3 && set==1){
   printf("INPUT FILE : white3.ppm\n");
       strcpy(fname,"white3.ppm");
   }
   else if( no==4 && set==1){
   printf("INPUT FILE : white4.ppm\n");
       strcpy(fname,"white4.ppm");
   }
   else if( no==5 && set==1){
   printf("INPUT FILE : white5.ppm\n");
       strcpy(fname,"white5.ppm");
   }
   else{
       printf("INPUT FILE : ");
       scanf("%s", fname);
   }
   if ( (fp = fopen( fname, "rb" ))==NULL ){
       printf("CAN'T OPEN THE FILE\n");
       exit(1);
   }
   fgets( buffer, MAX_BUFFERSIZE, fp );
   //check P6
   if ( buffer[0]!='P' || buffer[1]!='6' ){
   printf("FILE TIPE WRONG!\n");
       exit(1);
   }
   width[n] = 0;
   height[n] = 0;
   while ( width[n] == 0 || height[n] == 0 ){
       fgets( buffer, MAX_BUFFERSIZE, fp );
       if ( buffer[0] != '#' ) {
           sscanf( buffer, "%d %d", &width[n], &height[n] );
       }
   }
 
   while ( max_gray == 0 ){
       fgets( buffer, MAX_BUFFERSIZE, fp );
       if ( buffer[0] != '#' ){
           sscanf( buffer, "%d", &max_gray );
       }
   }
   printf("----------------------------\n");
   printf("WIDTH :%d\n",width[n]);   
   printf("HEIGHT :%d\n",height[n]);
   printf("MAX RGB:%d\n",max_gray);
   printf("----------------------------\n");
   if ( width[n] > MAX_IMAGESIZE || height[n] >
       MAX_IMAGESIZE ||
       max_gray != MAX_BRIGHTNESS ){
       printf("SIZE or RGB WRONG!\n");
       exit(1);
   }
   for(y=0;y<height[n];y++){
       for(x=0;x<width[n];x++){
           for(col=0;col<3;col++){
             image[n][x][y][col] = (unsigned char)fgetc( fp );
           }
       }
   }
   printf("COMPLETE! ---> image[%d]\n",n);
   printf("----------------------------\n");   
   fclose(fp);
}
void save_color_image( int n, char name[] ){
   char fname[MAX_FILENAME];
   FILE *fp;
   int x,y,col;
   if ( name[0] == '\0' ){
       printf("OUTPUT FILE : ");
       scanf("%s",fname);
   } else strcpy( fname, name );
   if ( (fp = fopen(fname, "wb"))==NULL ){
       printf("CAN'T SAVE THE FILE\n");
       exit(1);
   }
   fputs( "P6\n", fp );
   fputs( "# Created by Image Processing\n", fp );
   fprintf( fp, "%d %d\n", width[n], height[n] );
   fprintf( fp, "%d\n", MAX_BRIGHTNESS );
   
   for(y=0;y<height[n];y++){
       for(x=0;x<width[n];x++){
           for(col=0;col<3;col++){
               fputc( image[n][x][y][col], fp );
           }
       }
   }
   fclose(fp);
   printf("COMPLETE!\n");
}
void copy_color_image( int n1, int n2 ){
   int x,y,col;
   
   width[n2] = width[n1]; 
   height[n2] = height[n1];
   for(y=0;y<height[n1];y++){
       for(x=0;x<width[n1];x++){
           for(col=0;col<3;col++){
               image[n2][x][y][col] = image[n1][x][y][col];
           }
       }
   }
}
void init_color_image( int n, int red, int green, int blue ){
   int x, y;
   for(y=0;y<height[n];y++){
       for(x=0;x<width[n];x++){
           if (red  != -1) image[n][x][y][0] = red;
           if (green != -1) image[n][x][y][1] = green;
           if (blue != -1) image[n][x][y][2] = blue;
       }
   }
}
```
以上よろしくお願いします
  • C

    5044 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

1 ヘッダファイルの変数定義部分を書き換えました

ain4425

ain4425 score 17

2018/07/17 18:46  投稿

C言語でのメモリの解放が出来ません
画像ファイルを読み込んで、いろいろなフィルタをかけて出力するプログラムを動かしていたのですが、画像枚数を4枚から5枚に増やしたところ以下のようなエラーが出てしまいました。
```
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
image.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Fatal: Error detected (LME1514)
Fatal: Error detected (LME1514)
Fatal: Error detected (LME1514)
Fatal: Error detected (LME1514)
```
**[LME1514]**を調べてみたところ、どうもメモリの溢れが問題となっているようでした。
どうか助けて頂けると幸いです。
---
画像にフィルタをかけるプログラム部分は長くなるので省略しますので、読込、出力等の重要部分だけのプログラムを**image.c**として記載します。
上記に付随するヘッダーファイルは**ppmlib.h**として記載します。
**image.c**
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include"ppmlib.h"
int Setting(void);
void ReadImage(int set);
void SaveImage(void);
int main(void){
   //標準設定パラメータ
   int set;
   
   //標準設定
   set=Setting();
   
   //画像読込
   ReadImage(set);
   
   //画像の出力
   SaveImage();
   
   return 0;
}
//標準設定
int Setting(void){
   int set_flag;
   printf("標準設定→1\n");
   printf("詳細設定→0\n");
   scanf("%d",&set_flag);
   
   return set_flag;
}
//画像の読み込み
void ReadImage(set){
   
   load_color_image(0,1,set);
   load_color_image(1,2,set);
   load_color_image(2,3,set);
   load_color_image(3,4,set);
   load_color_image(4,5,set);
   
}
//画像の出力
void SaveImage(void){
   save_color_image(0,"");
   save_color_image(1,"");
   save_color_image(3,"");
   save_color_image(4,"");
}
```
**ppmlib.h**
```c
#include<stdlib.h>
#include<string.h>
//height[],width[]のMAX画素数
#define MAX_IMAGESIZE  3000
//諧調値
#define MAX_BRIGHTNESS  255
//階調数(+1)
#define GRAYLEVEL       256
//FILEnameの最大長
#define MAX_FILENAME    256
//Buffer最大長
#define MAX_BUFFERSIZE  256
//画像枚数
#define MAX_NUM_OF_IMAGES 5
unsigned char image[MAX_NUM_OF_IMAGES][MAX_IMAGESIZE][MAX_IMAGESIZE][3];
//以下訂正前
//unsigned char image[MAX_NUM_OF_IMAGES][MAX_IMAGESIZE][MAX_IMAGESIZE][3];
//以下訂正後
typedef unsigned char (*pimage_type)[MAX_IMAGEIZE][MAX_IMAGEIZE][3];
pimage_type pimage = (pimage_type)malloc(MAX_NUM_OF_IMAGE * MAX_IMAGEIZE * MAX_IMAGEIZE * 3);
int width[MAX_NUM_OF_IMAGES],height[MAX_NUM_OF_IMAGES];
void load_color_image( int n, int no, int set );
void save_color_image( int n, char name[] );
void copy_color_image( int n1, int n2 );
void init_color_image( int n, int red, int green, int blue );
void load_color_image( int n, int no, int set ){
   
   char fname[MAX_FILENAME];
   char buffer[MAX_BUFFERSIZE];
   FILE *fp;
   int max_gray=0,x,y,col;
   
   if( no==1 && set==1){
   printf("INPUT FILE : white1.ppm\n");
       strcpy(fname,"white1.ppm");
   }
   else if( no==2 && set==1){
   printf("INPUT FILE : white2.ppm\n");
       strcpy(fname,"white2.ppm");
   }
   else if( no==3 && set==1){
   printf("INPUT FILE : white3.ppm\n");
       strcpy(fname,"white3.ppm");
   }
   else if( no==4 && set==1){
   printf("INPUT FILE : white4.ppm\n");
       strcpy(fname,"white4.ppm");
   }
   else if( no==5 && set==1){
   printf("INPUT FILE : white5.ppm\n");
       strcpy(fname,"white5.ppm");
   }
   else{
       printf("INPUT FILE : ");
       scanf("%s", fname);
   }
   if ( (fp = fopen( fname, "rb" ))==NULL ){
       printf("CAN'T OPEN THE FILE\n");
       exit(1);
   }
   fgets( buffer, MAX_BUFFERSIZE, fp );
   //check P6
   if ( buffer[0]!='P' || buffer[1]!='6' ){
   printf("FILE TIPE WRONG!\n");
       exit(1);
   }
   width[n] = 0;
   height[n] = 0;
   while ( width[n] == 0 || height[n] == 0 ){
       fgets( buffer, MAX_BUFFERSIZE, fp );
       if ( buffer[0] != '#' ) {
           sscanf( buffer, "%d %d", &width[n], &height[n] );
       }
   }
 
   while ( max_gray == 0 ){
       fgets( buffer, MAX_BUFFERSIZE, fp );
       if ( buffer[0] != '#' ){
           sscanf( buffer, "%d", &max_gray );
       }
   }
   printf("----------------------------\n");
   printf("WIDTH :%d\n",width[n]);   
   printf("HEIGHT :%d\n",height[n]);
   printf("MAX RGB:%d\n",max_gray);
   printf("----------------------------\n");
   if ( width[n] > MAX_IMAGESIZE || height[n] >
       MAX_IMAGESIZE ||
       max_gray != MAX_BRIGHTNESS ){
       printf("SIZE or RGB WRONG!\n");
       exit(1);
   }
   for(y=0;y<height[n];y++){
       for(x=0;x<width[n];x++){
           for(col=0;col<3;col++){
             image[n][x][y][col] = (unsigned char)fgetc( fp );
           }
       }
   }
   printf("COMPLETE! ---> image[%d]\n",n);
   printf("----------------------------\n");   
   fclose(fp);
}
void save_color_image( int n, char name[] ){
   char fname[MAX_FILENAME];
   FILE *fp;
   int x,y,col;
   if ( name[0] == '\0' ){
       printf("OUTPUT FILE : ");
       scanf("%s",fname);
   } else strcpy( fname, name );
   if ( (fp = fopen(fname, "wb"))==NULL ){
       printf("CAN'T SAVE THE FILE\n");
       exit(1);
   }
   fputs( "P6\n", fp );
   fputs( "# Created by Image Processing\n", fp );
   fprintf( fp, "%d %d\n", width[n], height[n] );
   fprintf( fp, "%d\n", MAX_BRIGHTNESS );
   
   for(y=0;y<height[n];y++){
       for(x=0;x<width[n];x++){
           for(col=0;col<3;col++){
               fputc( image[n][x][y][col], fp );
           }
       }
   }
   fclose(fp);
   printf("COMPLETE!\n");
}
void copy_color_image( int n1, int n2 ){
   int x,y,col;
   
   width[n2] = width[n1]; 
   height[n2] = height[n1];
   for(y=0;y<height[n1];y++){
       for(x=0;x<width[n1];x++){
           for(col=0;col<3;col++){
               image[n2][x][y][col] = image[n1][x][y][col];
           }
       }
   }
}
void init_color_image( int n, int red, int green, int blue ){
   int x, y;
   for(y=0;y<height[n];y++){
       for(x=0;x<width[n];x++){
           if (red  != -1) image[n][x][y][0] = red;
           if (green != -1) image[n][x][y][1] = green;
           if (blue != -1) image[n][x][y][2] = blue;
       }
   }
}
```
以上よろしくお願いします
  • C

    5044 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る