재귀호출 함수의 페이지 사이즈 문제

billiken의 이미지

파일을 읽어 정리하는 프로그램중입니다..
--------------------------------------------------
read_located 함수와 메인 프로그램은
문의를 위해 문의 창에 직접 입력을 한것이라 오류가 있을수 있습니다
--------------------------------------------------
파일의 내용은
아래와 같은 좌표 데이타가 1000개 이상있는경우도 있습니다.
===================================================
(35571.717, 117599.84, 0)
(35605.056, 117531.32, 76.2)
(35681.256, 117531.32, 0)
===================================================

===================================================
파일 소스
===================================================
FILE * spb;
void main(void)
{
file_read();

}
void file_read(void)
{
int line_read[350]
if((spb=fopen(readFile,"r"))==NULL){
printf("file error : cannot open %s \n",readFile);
exit(1);
}
while(fgets(line_read,350,spb)!=NULL){
read_located(spb,line_read);
}
}

void read_located(FILE * dump,char attr[]){
char line[350];
char attr_temp[200];
char *mem;
char locate_x[100],locate_y[100],locate_w[100];
int i;
int fill_check_count=0;

user_strcpy_s(attr_temp,strtok(attr,"(")); //strcpy 의 보완점개선한 함수 strcpy로 변경가능
user_strcpy_s(locate_x,strtok(NULL,","));//strcpy 의 보완점개선한 함수 strcpy로 변경가능
user_strcpy_s(locate_y,strtok(NULL,","));//strcpy 의 보완점개선한 함수 strcpy로 변경가능
user_strcpy_s(locate_w,strtok(NULL,")"));//strcpy 의 보완점개선한 함수 strcpy로 변경가능
//입력파일에서 데이타를 분리한것을 화면에 표시
printf("------------->[%d]xyw[%s,%s,%s]\n",fill_check_count,locate_x,locate_y,locate_w);

for (i=0;i<350 ;i++ )
{
line[i]=NULL;

}
fill_check_count++;

fgets(line,350,dump);
read_located(dump,line); // 재귀호출 함수

}

===================================================

문의사항 1:read_located(dump,line);
이함수로 재귀호출을 하면 800개쯤 읽고 나서 프로그램이 멈추어버립니다..
기존에 변수를 초기화 하지 않은것이 포함된경우는 300개정도 읽고 멈추었는데 좀더 파일이 큰것을 읽었더니 800개쯤에서 멈추네요..

재귀호출 함수는 메모리의 사용제한이 있는지요..??

문의 사항 2: 파일을 읽어 파일 포인트를 넘겨받아서 작업을 하고 있는데 이경우 파일 읽기 문제가 있는지 궁금합니다..

몇일동안 디버깅도 돌려보고 하는데 딱히 문제점이 없어보이는데 마지막 데이타를 읽을때쯤 문제가 발생을 합니다..메모리를 할당해서 사용하고 다시 free 를 해주는 방식으로 프로그램을 해야하는지 알고싶어서 문의를 드립니다..

raymundo의 이미지

저 상태에서는 재귀호출이 중단될 조건이 없으니까... 무한히 재귀호출할 거고 스택 영역이 꽉 차는 순간 죽겠네요.

애초에 file_read 쪽에서 루프를 돌며 한줄씩 읽을 수 있게 되어 있는데, 굳이 read_located 가 재귀호출하게 만드시는 이유라도...?

좋은 하루 되세요!

billiken의 이미지

전체 프로그램을 적은것이 아니라서 재귀호출 중단은 빠져있습니다..

재귀호출 중단은 똑같은 값이 나오지 않는부분이 호출되면 빠져나가고 있습니다..

read_located 가 재귀호출 되는것은 기존 원본파일이 조금 복잡합니다..
복잡한 파일구조에서 위에 좌표가 나오는 부분만 찾아서 출력하려 한것입니다..

저런 형태의 조건이 여러가지가 있어서..
조건에 따라 읽어들이면서 진행하다 거의 마지막 부분에서 멈추어버리네요..

따라서 어쩔수 없이 파일포인터를 가져왔는데.... 다른방법이 있는지 궁금합니다..

billiken의 이미지

전엔 제목을 고칠수 있었는데 수정버튼이 없어졌네요..ㅠㅠ

raymundo 님의 조언으로 메모리 문제일듯싶어..기존에 버퍼를 사용하던 것을 메모리 할당방식으로 처리해서 프로그램하였습니다..
============================================

int read_located(FILE * dump,char attr[]){
char *line;
char attr_temp[200];
char *mem;
char locate_x[100],locate_y[100],locate_w[100];
int i;
int fill_check_count=0;
 
	if((line = (char *)malloc(350)) ==NULL){
	printf("Memory Low\n");
	exit(1);
	}
if(다음 인수를 찾으면)   // 재귀호출 함수 빠져나가는부분 보강
fill_check_count=0;
return 1;
..................................이하동일
 
			fgets(line,350,dump);
			user_strcpy_s(attr,line);
			free(line);
			read_located(dump,attr);
..................................이하동일

============================================
위와같이 버퍼 할당을 메모리로 처리하여 완료하였습니다..
너무 많은 데이타를 읽어들여서 발생된것으로 보입니다..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.