画像ファイルを読み込んで、いろいろなフィルタをかけて出力するプログラムを動かしていたのですが、画像枚数を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
1#include <stdio.h> 2#include <stdlib.h> 3#include <math.h> 4#include <time.h> 5#include"ppmlib.h" 6 7int Setting(void); 8void ReadImage(int set); 9void SaveImage(void); 10 11int main(void){ 12 //標準設定パラメータ 13 int set; 14 15 //メモリ確保 16 memory(); 17 18 //標準設定 19 set=Setting(); 20 21 //画像読込 22 ReadImage(set); 23 24 //画像の出力 25 SaveImage(); 26 27 //メモリの開放 28 free(pimage); 29 return 0; 30} 31 32//標準設定 33int Setting(void){ 34 int set_flag; 35 printf("標準設定→1\n"); 36 printf("詳細設定→0\n"); 37 scanf("%d",&set_flag); 38 39 return set_flag; 40} 41 42 43 44//画像の読み込み 45void ReadImage(set){ 46 47 load_color_image(0,1,set); 48 load_color_image(1,2,set); 49 load_color_image(2,3,set); 50 load_color_image(3,4,set); 51 load_color_image(4,5,set); 52 53} 54 55//画像の出力 56void SaveImage(void){ 57 save_color_image(0,""); 58 save_color_image(1,""); 59 save_color_image(3,""); 60 save_color_image(4,""); 61}
ppmlib.h
c
1#include<stdlib.h> 2#include<string.h> 3 4//height[],width[]のMAX画素数 5#define MAX_IMAGESIZE 3000 6//諧調値 7#define MAX_BRIGHTNESS 255 8//階調数(+1) 9#define GRAYLEVEL 256 10//FILEnameの最大長 11#define MAX_FILENAME 256 12//Buffer最大長 13#define MAX_BUFFERSIZE 256 14//画像枚数 15#define MAX_NUM_OF_IMAGES 5 16 17char pimage; 18 19typedef unsigned char (*pimage_type)[MAX_IMAGESIZE][MAX_IMAGESIZE][3]; 20int width[MAX_NUM_OF_IMAGES],height[MAX_NUM_OF_IMAGES]; 21 22 23void memory(void); 24void load_color_image( int n, int no, int set ); 25void save_color_image( int n, char name[] ); 26void copy_color_image( int n1, int n2 ); 27void init_color_image( int n, int red, int green, int blue ); 28 29void memory(void){ 30 pimage_type pimage = (pimage_type)malloc(MAX_NUM_OF_IMAGES * MAX_IMAGESIZE * MAX_IMAGESIZE * 3); 31} 32 33void load_color_image( int n, int no, int set ){ 34 35 char fname[MAX_FILENAME]; 36 char buffer[MAX_BUFFERSIZE]; 37 FILE *fp; 38 int max_gray=0,x,y,col; 39 40 if( no==1 && set==1){ 41 printf("INPUT FILE : white1.ppm\n"); 42 strcpy(fname,"white1.ppm"); 43 } 44 else if( no==2 && set==1){ 45 printf("INPUT FILE : white2.ppm\n"); 46 strcpy(fname,"white2.ppm"); 47 } 48 else if( no==3 && set==1){ 49 printf("INPUT FILE : white3.ppm\n"); 50 strcpy(fname,"white3.ppm"); 51 } 52 else if( no==4 && set==1){ 53 printf("INPUT FILE : white4.ppm\n"); 54 strcpy(fname,"white4.ppm"); 55 } 56 else if( no==5 && set==1){ 57 printf("INPUT FILE : white5.ppm\n"); 58 strcpy(fname,"white5.ppm"); 59 } 60 else{ 61 printf("INPUT FILE : "); 62 scanf("%s", fname); 63 } 64 if ( (fp = fopen( fname, "rb" ))==NULL ){ 65 printf("CAN'T OPEN THE FILE\n"); 66 exit(1); 67 } 68 fgets( buffer, MAX_BUFFERSIZE, fp ); 69 //check P6 70 if ( buffer[0]!='P' || buffer[1]!='6' ){ 71 printf("FILE TIPE WRONG!\n"); 72 exit(1); 73 } 74 width[n] = 0; 75 height[n] = 0; 76 while ( width[n] == 0 || height[n] == 0 ){ 77 fgets( buffer, MAX_BUFFERSIZE, fp ); 78 if ( buffer[0] != '#' ) { 79 sscanf( buffer, "%d %d", &width[n], &height[n] ); 80 } 81 } 82 83 while ( max_gray == 0 ){ 84 fgets( buffer, MAX_BUFFERSIZE, fp ); 85 if ( buffer[0] != '#' ){ 86 sscanf( buffer, "%d", &max_gray ); 87 } 88 } 89 printf("----------------------------\n"); 90 printf("WIDTH :%d\n",width[n]); 91 printf("HEIGHT :%d\n",height[n]); 92 printf("MAX RGB:%d\n",max_gray); 93 printf("----------------------------\n"); 94 if ( width[n] > MAX_IMAGESIZE || height[n] > 95 MAX_IMAGESIZE || 96 max_gray != MAX_BRIGHTNESS ){ 97 printf("SIZE or RGB WRONG!\n"); 98 exit(1); 99 } 100 for(y=0;y<height[n];y++){ 101 for(x=0;x<width[n];x++){ 102 for(col=0;col<3;col++){ 103 pimage[n][x][y][col] = (unsigned char)fgetc( fp ); 104 } 105 } 106 } 107 printf("COMPLETE! ---> image[%d]\n",n); 108 printf("----------------------------\n"); 109 fclose(fp); 110} 111 112 113void save_color_image( int n, char name[] ){ 114 char fname[MAX_FILENAME]; 115 FILE *fp; 116 int x,y,col; 117 if ( name[0] == '\0' ){ 118 printf("OUTPUT FILE : "); 119 scanf("%s",fname); 120 } else strcpy( fname, name ); 121 if ( (fp = fopen(fname, "wb"))==NULL ){ 122 printf("CAN'T SAVE THE FILE\n"); 123 exit(1); 124 } 125 fputs( "P6\n", fp ); 126 fputs( "# Created by Image Processing\n", fp ); 127 fprintf( fp, "%d %d\n", width[n], height[n] ); 128 fprintf( fp, "%d\n", MAX_BRIGHTNESS ); 129 130 for(y=0;y<height[n];y++){ 131 for(x=0;x<width[n];x++){ 132 for(col=0;col<3;col++){ 133 fputc( pimage[n][x][y][col], fp ); 134 } 135 } 136 } 137 fclose(fp); 138 printf("COMPLETE!\n"); 139} 140 141 142void copy_color_image( int n1, int n2 ){ 143 int x,y,col; 144 145 width[n2] = width[n1]; 146 height[n2] = height[n1]; 147 for(y=0;y<height[n1];y++){ 148 for(x=0;x<width[n1];x++){ 149 for(col=0;col<3;col++){ 150 pimage[n2][x][y][col] = pimage[n1][x][y][col]; 151 } 152 } 153 } 154} 155 156 157void init_color_image( int n, int red, int green, int blue ){ 158 int x, y; 159 160 for(y=0;y<height[n];y++){ 161 for(x=0;x<width[n];x++){ 162 if (red != -1) pimage[n][x][y][0] = red; 163 if (green != -1) pimage[n][x][y][1] = green; 164 if (blue != -1) pimage[n][x][y][2] = blue; 165 } 166 } 167}
以上よろしくお願いします
質問タイトルと内容が一致してないので修正お願いします。
回答3件
あなたの回答
tips
プレビュー