2013-02-18 116 views
0

就在這裏可變長度字符串的是函數本身。我在那裏有段錯誤,因爲顯然我無法將字符串分配給數組中的值。叮噹/ gcc都給我一個警告。鏗鏘的是一個更好的是「期待字符分配char *」。我不知道任何其他方式與該詞典一起工作,因爲我嘗試過的一切都無法正常工作。我也將包括所有輔助函數,但我很確定它是在這個函數本身。陣LZW壓縮

按照往常一樣,我會給予好評的作品的任何答案,我會接受,我個人選擇的一個。無論如何,我將發佈下面的其他「幫手」功能。

void lzw_compress(char *uncompressed_data,size_t uncompressed_length,char *out){ 
unsigned long i=0,j=0; 
char *character=malloc(1); 
char *word=malloc(65535); 
char *word_character=malloc(65535); 
unsigned long word_size=0; 
long *tmp_buffer=malloc(65535); 
char *dictionary=malloc(130000); 
for(i=0;i<=255;++i){ 
    dictionary[i]=base_dictionary[i]; 
} 
long index=0; 
unsigned long dictionary_size=256; 
for(i=0;i<uncompressed_length;++i){ 
    character[0]=(unsigned char)uncompressed_data[i]; 
    //arrcat(word_character,word,word_size,character); 
    for(j=0;j<word_size;++j){ 
     word_character[j]=word[j]; 
    } 
    word_character[j]=*character; 
    index=search(dictionary,dictionary_size,word_character); 
    if(index!=-1){ 
     for(j=0;j<(word_size+1);++j){ 
      word[j]=word_character[j]; 
     } 
     ++word_size; 
    } 
    else{ 
     tmp_buffer[j++]=index; 
     ++dictionary_size; 
     //dictionary[dictionary_size++]=(unsigned long *)word_character; 

      dictionary[dictionary_size]=*word_character; 

     word=*character; 
     word_size=1; 
    } 
} 
if(memcmp(word,"",1)!=0){ 
    tmp_buffer[j++]=search(dictionary,dictionary_size,word); 
} 
    char *debug=""; 
    for(i=0;i<j;++i){ 
     sprintf(debug,"%s%lu,",debug,tmp_buffer[i]); 
    } 
    printf("%s",debug); 

} 

long search(char *table,unsigned long table_length,char 
*search_value){ 
    unsigned long i=0; 
    for(i=0;i<table_length;++i){ 
     if(table[i]==*search_value){ 
      return i; 
     } 
    } 
    return -1; 
} 

因此,你可以看到我正在嘗試做一個類似於純c的lzw程序。我總是與-Wall -std = c99編譯(因爲我偶爾使用p99.h來處理預處理器宏)。但由於某種原因,我無法讓我的字符串數組工作,我知道我已經使用類似於它的代碼(但顯然我沒有備份它......)但無論如何是啊。我無法弄清楚我應該怎樣做(正確地)。我將非常感謝任何人對此問題的幫助。

按照正常的任何代碼我張貼在這裏,是公共領域,除非另有說明,一旦我得到了整個事情的工作我張貼在這裏,讓別人找它可以得到它的工作了。

最後感謝您閱讀本線,併爲和平我(如果你知道如何)。一旦我回到城裏後回來(如果已經有答案),我會檢查/標記一些事情。但不要讓這讓你灰心,因爲你的解決方案可能比我選擇的解決方案更好,你仍然可以得到滿意的結果。

編輯1:(根據GIT)編輯的代碼是什麼之前。

編輯2:修正了很多東西,得到它看起來更好。數組比較函數仍然不起作用(出於某種奇怪的原因)。

回答

1

現在,你有撥款,有可確定爲錯誤從幾點:

for(i=0;i<uncompressed_length;++i){ 
    character[0]=(unsigned char)uncompressed_data[i]; 
    //arrcat(word_character,word,word_size,character); 
    for(j=0;j<word_size;++j){ 
     word_character[j]=word[j]; 
    } 

最初,內存word點是未初始化,並word_size爲1。所以你複製不確定的charword[0]word_character[0]。我不確定是否應該最初設置word_size = 0,或者移動該複製循環或其他內容。

word_character[j]=character; 

你分配一個char*char。你的意思可能是word_character[j] = *character;(或者character[0]而不是*character,這相當於)。

dictionary[dictionary_size]=word_character; 

再次分配char*char。我無法猜出你想要的東西,因爲dictionary_size在循環中沒有改變。也許你想增加dictionary_size並複製word_character字符串?

word=character; 
    word_size=1; 

這裏你失去的句柄分配給word最初的記憶 - 通常被稱爲內存泄漏 - 讓word點具有對一個字符足夠空間的內存塊。您可能是要複製指向的字符,

word[0] = character[0]; 

那裏?


的原代碼最初的回答:

void lzw_compress(char *uncompressed_data,size_t uncompressed_length,char *out){ 
unsigned long i=0,j=0; 
char *character; 
char *word; 
char *word_character; 
unsigned long word_size=1; 
long *tmp_buffer=malloc(65535); 
char *dictionary; 
for(i=0;i<=255;++i){ 
    dictionary[i]=base_dictionary[i]; 
} 

您還沒有分配的任何內存爲dictionary指向,這是一個非零段錯誤概率不確定的行爲。

long index=0; 
unsigned long dictionary_size=256; 
for(i=0;i<uncompressed_length;++i){ 
    character[0]=(unsigned char)uncompressed_data[i]; 

您還沒有爲character分配內存,也是未定義的行爲。

//arrcat(word_character,word,word_size,character); 
    for(j=0;j<word_size;++j){ 
     word_character[j]=word[j]; 
    } 

word_characterword不指向分配的內存或者,更不確定的行爲。

word[j]=(unsigned long)character; 

你鑄造char*unsigned long並指定該值一(未分配)char。即使word[j]是有效的記憶,這裏的意圖是什麼?

index=search(dictionary,dictionary_size,word_character); 
    if(index!=-1){ 
     for(j=0;j<(word_size+1);++j){ 
      word[j]=word_character[j]; 
     } 
     ++word_size; 
    } 
    else{ 
     tmp_buffer[j++]=index; 
     ++dictionary_size; 
     //dictionary[dictionary_size++]=(unsigned long *)word_character; 
     for(j=0;j<word_size;++j){ 
      dictionary[dictionary_size]=word_character; 
     } 
     word=character; 
     word_size=1; 
    } 
} 
if(memcmp(word,"",sizeof word)!=0){ 

sizeof wordchar*的大小。你可能打算在這裏使用字符串的長度。

tmp_buffer[j++]=search(dictionary,dictionary_size,word); 
} 
    char *debug=""; 
    for(i=0;i<j;++i){ 
     sprintf(debug,"%s%lu,",debug,tmp_buffer[i]); 

調用sprintf與重疊的源和目標是未定義的行爲。在這種情況下,它甚至是一個字符串文字。字符串文字是不可修改的,所以這是未定義行爲的另一個來源,並且由於嘗試修改字符串文字而可能導致崩潰。

} 
    printf("%s",debug); 

} 
+0

我忘記了之前代碼中的無符號長位。我已經爲字典分配了130k的內存,對字符分配了1byte(因爲它只有1個字節),對於字是65k,對word_character分配了65k,並且我仍然有該段錯誤。我會嘗試編輯上面的內容,以前與我一起工作的內容。 – 133794m3r 2013-02-18 16:46:08

+0

另外我這樣做是因爲我試圖找到一種方法,將tmp_buffer中保存的長無符號值放入調試字符串中,這是我的初衷。我知道這是愚蠢的,但我已經超過7個月沒有觸及任何代碼,我試圖再次回到事情。另外,我已經編輯了以上的「應該」之前的內容。我將把sprintf變成一個printf,然後把它變成一個巨大的長循環,看看它是否會導致段錯誤。 – 133794m3r 2013-02-18 16:53:02

+0

它現在正在工作,至少不會出現殘疾現在我必須通過我的其他代碼並找出爲什麼它不起作用。所以一切都是「不一樣」的工作。因爲我只問過這個問題,所以我標記了你的答案並給了你一個贊成票。 – 133794m3r 2013-02-18 17:04:55