2012-11-12 27 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類型的值。這是錯誤的,這是一種不透明的類型,應該始終由指針處理。