就在這裏可變長度字符串的是函數本身。我在那裏有段錯誤,因爲顯然我無法將字符串分配給數組中的值。叮噹/ 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:修正了很多東西,得到它看起來更好。數組比較函數仍然不起作用(出於某種奇怪的原因)。
我忘記了之前代碼中的無符號長位。我已經爲字典分配了130k的內存,對字符分配了1byte(因爲它只有1個字節),對於字是65k,對word_character分配了65k,並且我仍然有該段錯誤。我會嘗試編輯上面的內容,以前與我一起工作的內容。 – 133794m3r 2013-02-18 16:46:08
另外我這樣做是因爲我試圖找到一種方法,將tmp_buffer中保存的長無符號值放入調試字符串中,這是我的初衷。我知道這是愚蠢的,但我已經超過7個月沒有觸及任何代碼,我試圖再次回到事情。另外,我已經編輯了以上的「應該」之前的內容。我將把sprintf變成一個printf,然後把它變成一個巨大的長循環,看看它是否會導致段錯誤。 – 133794m3r 2013-02-18 16:53:02
它現在正在工作,至少不會出現殘疾現在我必須通過我的其他代碼並找出爲什麼它不起作用。所以一切都是「不一樣」的工作。因爲我只問過這個問題,所以我標記了你的答案並給了你一個贊成票。 – 133794m3r 2013-02-18 17:04:55