2012-11-12 66 views
1

我目前正在做一个家庭作业评估,我正在编写一个程序,用一块ascii图像来拼接文本文件,以创建所有作品的完整图像。我打算编写代码的方式是通过寻找零件并将它们添加到数组中的目录来查看while循环。然而,在我的AddFile方法中(或者当我把它称为是精确的时候),我得到了一个coredump ..我刚开始使用c,所以我不知道它是否对你们中的一些人非常明显,为什么我得到一个coredump或更复杂。此外,我originaly编写的addFile方法来使用和接受int的,而不是FILE类型,在这一点上,它没有任何coredumps完美的工作,所以我怀疑(但嘿,我可能是错的),它出错了,当我试图实现它与FILE类型。Coredump自制arrayList

#include <stdio.h> 
#include <stdlib.h> 

typedef struct{ 
int listSize; 
int listCapacity; 
FILE *fileStream; 
}FileList; 

void addFile(FileList* list, FILE file) 
{ 
    if((*list).listSize<(*list).listCapacity) 
    { 

     (*list).fileStream[(*list).listSize]=file; 
     (*list).listSize+=1; 

    } 
    else 
    { 

     FILE *tempArray = calloc((*list).listSize,sizeof(FILE)); 
     for(int i=0; i<(*list).listSize; i++) 
     { 
      tempArray[i]=(*list).fileStream[i]; 
     } 
     //Do something with array... 
     free((*list).fileStream); 

     (*list).listCapacity=((*list).listCapacity)*2; 
     (*list).fileStream=calloc((*list).listCapacity,sizeof(FILE)); 
     for(int i=0; i<(*list).listSize; i++) 
     { 

      (*list).fileStream[i]=tempArray[i]; 
     } 

     (*list).fileStream[(*list).listSize]=file; 
     (*list).listSize+=1; 

     free(tempArray); 
    } 

} 
int main() 
{ 
    FileList intList; 
    intList.listSize=0; 
    intList.listCapacity=1; 
    intList.fileStream=calloc(intList.listCapacity,sizeof(int)); 
    int fileYcoord=0; 
    int fileXcoord=0; 
    while(1) 
    { 

     char fileName [100]; 
     int fileNameLength=sprintf(fileName,"part_%02d-%02d",fileXcoord,fileYcoord); 
     FILE * pFile = fopen (fileName,"r"); 
     if(pFile!=NULL) 
     { 
      printf("- ! found file: %s - name length : %d \n",fileName,fileNameLength); 
      addFile(&intList,*pFile); 
      fclose(pFile); 
      fileXcoord++; 
     } 
     else 
     { 
      if(fileXcoord!=0) 
      { 
       fileYcoord+=1; 
       fileXcoord=0; 
      } 
      else 
      { 
       break; 
      } 

     } 
    } 
    printf("size %d , %d",fileXcoord, fileYcoord); 
    free(intList.fileStream); 
    return 0; 
} 
+1

为什么使用'(* list).'而不是'list->'?两个字少写,应该是一个比较节省。 :) –

+0

我也建议你看看['realloc'](http://en.cppreference.com/w/c/memory/realloc)函数。你应该看看你第一次分配'fileStream'。 –

回答

0

呼叫到addFile()被解引用FILE *,产生FILE类型的值。这是错误的,这是一种不透明的类型,应该始终由指针处理。