質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C

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

解決済

C言語でのメモリの解放が出来ません

ain4425
ain4425

総合スコア0

C

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

3回答

0評価

1クリップ

15閲覧

投稿2018/07/06 05:01

編集2022/01/12 10:58

画像ファイルを読み込んで、いろいろなフィルタをかけて出力するプログラムを動かしていたのですが、画像枚数を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); //標準設定 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 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 ); } } } 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; } } }

以上よろしくお願いします

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

ttyp03
ttyp03

2018/07/06 07:11

質問タイトルと内容が一致してないので修正お願いします。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C

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