Avatar billede bumle90 Nybegynder
09. januar 2004 - 10:02 Der er 111 kommentarer og
1 løsning

Fortsættelse til windowsAPI(stadig nyubegynder)(komprimering)

Hej. Jeghar nu fået listet alle filerne på min computer, og har gemt dise i en txt fil.
Da jeg jo har frygtelig mange filer på min computer filer denne txt fil jo altså en hel del.
Derfor vil jeg gerne komprimere/pakke filen, så denne fylder mindre.
Jeg har siddet og kigget lidt på Lempel-Ziv algoritmen, som MS bruger.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/file_management_functions.asp
(nederst)

Jeg er dog lidt i tvivl om disse er de rette at bruge. Så hvis nogle kunne hjælpe mig lidt mere på vej ville jeg blive glad
Avatar billede soreno Praktikant
09. januar 2004 - 10:23 #1
Umiddelbart ser det ud som om at de funktioner kun kan bruges til at læse fra zip filer.
Avatar billede soreno Praktikant
09. januar 2004 - 10:25 #2
zlib kan både læse og skrive:
http://www.gzip.org/zlib/

Jeg har ikke selv prøvet zlib, men jeg ved at der er mange der bruger den.
Avatar billede arne_v Ekspert
09. januar 2004 - 10:33 #3
Vær opmærksom opå at der er både LZ77 og LZ78, som er 2 forskellige
algoritmer (dog med en fælles grund ide).

ZLIB bruges af rigtigt mange.
Avatar billede bumle90 Nybegynder
09. januar 2004 - 12:05 #4
zlib, er det et eksternt 3. parts bibliotek der koster penge?
Avatar billede soreno Praktikant
09. januar 2004 - 12:09 #5
zlib is designed to be a free, general-purpose, legally unencumbered -- that is, not covered by any patents -- lossless data-compression library for use on virtually any computer hardware and operating system.
Avatar billede soreno Praktikant
09. januar 2004 - 12:09 #6
Avatar billede bumle90 Nybegynder
09. januar 2004 - 12:44 #7
Arne, mht. det program du skrev igår.
Når metoden FindNextFile() kaldes, indsætter den et "\..\" så der gås et niveau op. Hvorfor gør den det?
Altså jeg starter med at
kalde funktionen med
c:\test\*.*
og det blir dernæst lavet om til  c:\test\\..\*.*

Hvordan kan jeg undgå det?
Avatar billede arne_v Ekspert
09. januar 2004 - 12:49 #8
En måde er ihvertfald at modificere programmet til at spring "." og ".."
over.
Avatar billede bumle90 Nybegynder
09. januar 2004 - 12:59 #9
Hmmmm har prøvet at fjerne det, men den skriver en masse (null)
Måske du kan se hvad der er galt?

#define WIN32_LEAN_AND_MEAN
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>

void scanDir(char path[])
{
  char samletsti[2000]={0};//nulstil strengen
  char level[1];
  char wildcard[3];
  strcpy (level,"\\");
  strcpy (wildcard,"*.*");
  int i;

     

  WIN32_FIND_DATA data;
  HANDLE h = FindFirstFile(path,&data);
 


  if(h!=INVALID_HANDLE_VALUE) {

    while(FindNextFile(h,&data)) {
    //for(i=0;i<strlen(samletsti);i++)
        //printf("\n#####%s#####\n",path);
       
        strncat (samletsti,path,strlen(path)-7);//fjern \..\*.* da FindNextFile() indsætter \..\
       
       
        if (data.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY)
        {
            strcat (samletsti,data.cFileName);//sæt mappenavn i ende
            strcat (samletsti,level);//sæt \ i ende
            strcat (samletsti,wildcard);//sæt *.* i ende
            scanDir(samletsti);//rekursivt kald
        }
        else
        {
       
            strcat (samletsti,data.cFileName);//sæt filnavn i ende
            for(i=0;i<strlen(samletsti);i++);
                printf("%s",samletsti[i]);
       
        /*Her skal sammenlignes med de filtyper der skal scannes*/
        }
       
   
    }
  }
  FindClose(h);
}


int main(int argc, char* argv[])
{
    char startsti[1000]={0};//Skal være stort array. Da denne skal sættes til argv.
    int i;
    strcpy (startsti,"c:\\test\\*.*");
      for(i=0;i<strlen(startsti);i++)
      printf("%c",startsti[i]);
    scanDir(startsti);
    return 0;
}
Avatar billede bumle90 Nybegynder
09. januar 2004 - 13:04 #10
Mangler vidst et */ afslutning efter

strncat (samletsti,path,strlen(path)-7);//fjern \..\*.* da FindNextFile() indsætter \..\

hehe :)
Men virker dog stadig ikke
Avatar billede arne_v Ekspert
09. januar 2004 - 13:04 #11
Jeg ville sætte det ind helt anderledes.

Logik som:

if this fil is a directory {
  if it is neither "." or ".." {
      make recursive call
  }
}
Avatar billede arne_v Ekspert
09. januar 2004 - 13:05 #12
if (data.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY)

bør nook iøvrigt være:

if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
Avatar billede bumle90 Nybegynder
09. januar 2004 - 13:07 #13
ahhh jamen oki, så dvs. efter hver dirnavn sætter den .. ind? eller hvordan, Det er nok fordi jeg ikke helt har forstået hvordan FindFirstfile virker
Avatar billede bumle90 Nybegynder
09. januar 2004 - 13:11 #14
if it is neither "." or ".."
Hvad er it ?
filnavnet eller endelsen af filnavnet eller hvordan?
Avatar billede arne_v Ekspert
09. januar 2004 - 13:13 #15
Logikken finder alle fileri et directory.

Lad os sige at vi slår op på:
  "C:\\dir\\*"
og at den returnerer:
  "."
  ".."
  "adir"
  "afile.ext"

Test på directory vil så returnere:
  true
  true
  true
  false

Og uden noget specielt vil vi recurse ned i:
  "C:\\dir\."
  "C:\\dir\.."
  "C:\\dir\adir"

men ved at ligge et terstind på "." og ".." nøjes vi med at recurse ned i:
  "C:\\dir\adir"
Avatar billede bumle90 Nybegynder
09. januar 2004 - 13:18 #16
Forskellen på
"C:\\dir\\*"
og
"C:\\dir\\*.*"
er så helt præcis hvad?
At i "C:\\dir\\*.*" søger den på alle filnavne og alle endelser, og i "C:\\dir\\*" søger den kun på dir's ?

Bare fordi du i går skrev "C:\\*.*"
Avatar billede arne_v Ekspert
09. januar 2004 - 13:22 #17
Jeg kom lidt i tvivl om hvorvidt *.* matcher et filnavn uden punktum i (typisk
for dirs).

Men så vidt jeg kan se gør det det, så det er ligegyldigt om det er * eller *.* !

Det var bare en strø tanke.
Avatar billede bumle90 Nybegynder
09. januar 2004 - 13:52 #18
Jeg kan ikke lige gennemskue hvorfor dette ikke virker....
Måske du lige lynhurtigt kan se :D hehe

// Filscan_sys.cpp : Defines the entry point for the console application.
//
#define WIN32_LEAN_AND_MEAN
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>

void scanDir(char path[])
{
  char samletsti[2000]={0};//nulstil strengen
  char level[1];
  char wildcard[3];
  strcpy (level,"\\");
  strcpy (wildcard,"*");
  int i;


  WIN32_FIND_DATA data;
  HANDLE h = FindFirstFile(path,&data);

  if(h!=INVALID_HANDLE_VALUE) {

    while(FindNextFile(h,&data)) {
   
        strncat (samletsti,path,strlen(path)-1);//kopier absolutte sti og fjern *

        if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            if (strcmp(data.cFileName,".") ==0 || strcmp(data.cFileName,"..") ==0)
                continue;
           
            strcat (samletsti,data.cFileName);//sæt mappenavn i ende
            strcat (samletsti,level);//sæt \ i ende
            strcat (samletsti,wildcard);//sæt * i ende
            scanDir(samletsti);//rekursivt kald
        }
        else
        {
            strcat (samletsti,data.cFileName);//sæt filnavn i ende
            for(i=0;i<strlen(samletsti);i++);
                printf("%s",samletsti[i]);
        /*Her skal sammenlignes med de filtyper der skal scannes*/
        }
       
   
    }
  }
  FindClose(h);
}


int main(int argc, char* argv[])
{
    char startsti[1000]={0};//Skal være stort array. Da denne skal sættes til argv.
    int i;
    strcpy (startsti,"c:\\test\\*");
      for(i=0;i<strlen(startsti);i++)
      printf("%c",startsti[i]);
    scanDir(startsti);
    return 0;
}
Avatar billede bumle90 Nybegynder
09. januar 2004 - 13:54 #19
Skal være

  printf("%s",samletsti);

istedet for
for(i=0;i<strlen(samletsti);i++);
                printf("%s",samletsti[i]);
Avatar billede bumle90 Nybegynder
09. januar 2004 - 14:28 #20
Jeg fandt ud af det :)
Avatar billede arne_v Ekspert
09. januar 2004 - 14:57 #21
ok
Avatar billede bumle90 Nybegynder
09. januar 2004 - 15:33 #22
Jeg håber ikke jeg ulejliger dig for meget Arne, og du skal nok få dine point her.
Men det her gzip, kan det komprimere data der ligger i hukommelsen og lægge det i en fil, eller er det meningen man først skal ligge data ned i en fx. txt fil, som derefter komprimeres?
(Det første ville klart være mest optimalt hvis det kunne lade sig gøre).
Avatar billede arne_v Ekspert
09. januar 2004 - 15:43 #23
zlib laver så vidt jeg ved komprimering fra char array til char array, så det
bør du sagtens kunne.

Jeg har dog aldrig brugt det. Det er sjovere at skrive sine egne
implementeringer af LZ77.
Avatar billede bumle90 Nybegynder
09. januar 2004 - 15:46 #24
Sine egne implementeringer?
Du laver simpelthen et program der implementerer algortimen?
Avatar billede arne_v Ekspert
09. januar 2004 - 15:54 #25
Et stykke kode der implemeneter LZ77 elelr LZ78 (=LZW) eller
noget helt tredie.

Det er ganske underholdende.

Hvis jeg skulel bruge det i professionel henssende ville
jeg nok vælge ZLIB.
Avatar billede bumle90 Nybegynder
09. januar 2004 - 15:57 #26
Mmm det er måske lige langhåret nok for mig.
Jeg skal meget groft sagt bare kunne importere nogle filer, og kalde
compress, lægge i fil. Læse fil og kalde decompress så jeg har information.
Er det muligt?
Avatar billede arne_v Ekspert
09. januar 2004 - 16:05 #27
Det tror jeg ZLIB er perfekt til.
Avatar billede bumle90 Nybegynder
09. januar 2004 - 16:16 #28
oki...kanon...Nu har jeg jo downloadet zlib, og der er 1000 filer....Er det muligt du lige kan skubbe mig igang med at bruge det :)
Bare et kort eksempel?
Avatar billede arne_v Ekspert
09. januar 2004 - 16:26 #29
Det bliver først i aften.
Avatar billede bumle90 Nybegynder
09. januar 2004 - 16:27 #30
oki, det er finno :)
Du skal nok få flere pts. hvis det er
tak skal du ha...
Avatar billede soreno Praktikant
09. januar 2004 - 16:35 #31
Hvis du pakker filen ud og kigger i contrib\
så ligger der et hav af eksempler.
Avatar billede bumle90 Nybegynder
09. januar 2004 - 16:59 #32
mmm der ligger ca kun 1 gør der ikke ?
Avatar billede arne_v Ekspert
09. januar 2004 - 21:02 #33
Du downloader:
  http://www.gzip.org/zlib/zlib121-dll.zip

Du udpakker.

Du vælger at bruge det nemme interface som i dette eksempel:

#include <stdio.h>
#include <string.h>

#include "zlib.h"

int main()
{
  int l1,l2,l3;
  char s1[200] = "Dette er en lille test med en masse e'er som gerne skulle give en god compress:\n"
                  "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
  char s2[200];
  char s3[200];
  l1 = strlen(s1);
  compress(s2,&l2,s1,l1);
  uncompress(s3,&l3,s2,l2);
  s3[l3] = '\0';
  printf("%s\n",s1);
  printf("%d -> %d -> %d\n",l1,l2,l3);
  printf("%s\n",s3);
  return 0;
}

Du builder. Her er for MS VC++ (med ovenstående program som usezlib.c):

cl /I\zlib\include usezlib.c \zlib\lib\zdll.lib
PATH=\zlib;%PATH%
usezlib
Avatar billede arne_v Ekspert
09. januar 2004 - 21:02 #34
usage.txt forklarer for andre compilere
Avatar billede arne_v Ekspert
09. januar 2004 - 21:02 #35
OK ?
Avatar billede bumle90 Nybegynder
10. januar 2004 - 14:42 #36
yepper :)
Det er kanon. Lige hvad jeg skulle bruge Arne.
Undskyld jeg ikke har svaret, men der gik lige druk i den i går aftes.
Har du tid til lige at kigge på et stykke kode for mig...meget lille...kan simelthen ikke finde ud af hvad der er galt nemlig
Avatar billede arne_v Ekspert
10. januar 2004 - 14:44 #37
OK
Avatar billede bumle90 Nybegynder
10. januar 2004 - 14:53 #38
Det er læsning af en ini-fil. inifilen hedder scanner.ini og ligger i roden af c: og indeholder følgende

[generel]
<filetypes>mp3;avi;jpg;bmp;

Problemet er at intet bliver lagt op i mit fileextarray, hvor der burde ligge de 4 forskellige filtyper skrevet i inifilen...Jeg kan ikke gennemskue hvorfor...Måske du har mere held :)

int main(int argc, char* argv[])
{
    FILE *fp;
    bool important;//indikerer om opsætning er aktuel jf.[comp] i .ini fil
    fp=fopen("c:\\scanner.ini","r");
    int c,i=0,readAction=0,fileExtCtr=0;
    char tempstreng[40]={0},startsti[MAX_arraystr]={0};//Skal være stort array. Da denne skal sættes til argv.;
    char* fileExt[500];

    while((c = getc(fp)) != EOF){
        tempstreng[i++]=(char)c;
       

        if (c == (int)'[')
        {
            i=0;//klar til indlæse ny streng
            tempstreng[0]='\0';
            readAction=0;
        }
        if (c == (int)']')
        {
            tempstreng[--i]='\0';//end str
                       
            if (strcmp(strToLower(tempstreng),"generel")==0) //|| hvis tmpstr = computernavn
                important = TRUE;
            else
                important = FALSE;
           
            i=0;
            tempstreng[0]='\0';
            readAction=0;
        }

        if (c == (int)'<')
        {
            i=0;
            tempstreng[0]='\0';
            readAction=0;
        }
        if (c == (int)'>')
        {
            tempstreng[--i]='\0';//end str
            if (strcmp(strToLower(tempstreng),"filetypes")==0)
                    readAction=1;
            //Her skal andre evt. actions identificeres
            i=0;
            tempstreng[0]='\0';
        }
        if (c == (int)';')
        {
            tempstreng[--i]='\0';//end str           
            if(important)
            {           
                if(readAction==1)
                {
           
                                        /*Det er herinde noget går galt*/
                    fileExt[fileExtCtr++]=tempstreng;
                }
                //Her skal andre evt. actions udføres
            }
            i=0;
            tempstreng[0]='\0';
        }
    }
   
    strcpy (startsti,"C:\\*");//Til test
   
    printf("%s\n",fileExt[1]);
    return 0;
}
Avatar billede arne_v Ekspert
10. januar 2004 - 14:58 #39
Prøv:

char* fileExt[500];

->

char* fileExt[50][50];

og:

fileExt[fileExtCtr++]=tempstreng;

->

strcpy(fileExt[fileExtCtr++],tempstreng);
Avatar billede bumle90 Nybegynder
10. januar 2004 - 15:04 #40
strcpy(fileExt[fileExtCtr++],tempstreng); --->

'strcpy' : cannot convert parameter 1 from 'char *[50]' to 'char *'
Avatar billede arne_v Ekspert
10. januar 2004 - 15:06 #41
Har du lavet begge ændringerne ?
Avatar billede arne_v Ekspert
10. januar 2004 - 15:07 #42
Hov !

char* fileExt[500];

->

char fileExt[50][50];

(uden * !)
Avatar billede bumle90 Nybegynder
10. januar 2004 - 15:07 #43
Ja, jeg har lagt begge ændringer ind. Du får ikke den fejlmedd. eller hvad ?
Avatar billede bumle90 Nybegynder
10. januar 2004 - 15:07 #44
ahhh hæhæ :)
Så gir det også mere mening
Avatar billede bumle90 Nybegynder
10. januar 2004 - 15:09 #45
Jeps så virker det.
Men jeg forstår altså ikke hvorfor det andet ikke virkede...Jeg ved godt jeg prøvede at lægge et chararray ind på en char pointers plads. Men er de i princippet ikke det samme?
Og jeg lavede et andet testprm hvor det godt kunne lade sig gøre...
Måske du kunne oplyse mig hæhæ :)
Avatar billede arne_v Ekspert
10. januar 2004 - 15:13 #46
tempstring er et stykke memory

du fylder nogle data ind i det stykke memory

så lader du en pointer pege på det stykke memory

og så putter du noget andet ind i det memory

og så peger pointeren på noget andet
Avatar billede bumle90 Nybegynder
12. januar 2004 - 23:04 #47
Har du tid et øjeblik Arne?
Avatar billede arne_v Ekspert
12. januar 2004 - 23:06 #48
Jo...
Avatar billede bumle90 Nybegynder
12. januar 2004 - 23:15 #49
lækkert :)
Det er mht. den komprimeringskode du skrev tidligere.
Den vil ik ritti køre.
Jeg har været inde i miljøvariabler og sætte path op til der hvor zlib ligger
c:\zlib\include
Men den kan ikke finde den
Avatar billede arne_v Ekspert
12. januar 2004 - 23:17 #50
Hvilken compiler bruger du ?
Avatar billede bumle90 Nybegynder
12. januar 2004 - 23:21 #51
Jeg bruger VS C++
Avatar billede arne_v Ekspert
12. januar 2004 - 23:23 #52
Så bør du kune oversætte command line med:

cl /I\zlib\include ditprogram.cpp \zlib\lib\zdll.lib
PATH=\zlib;%PATH%
Avatar billede arne_v Ekspert
12. januar 2004 - 23:23 #53
GUI skal du ind i options og tilføje \zlib\include til include dirs
og \zlib\lib\zdll.lib til link libraries
Avatar billede bumle90 Nybegynder
12. januar 2004 - 23:25 #54
Kan det ikke sættes op inde i builderen?
Avatar billede bumle90 Nybegynder
12. januar 2004 - 23:26 #55
oki 2 sec
Avatar billede bumle90 Nybegynder
12. januar 2004 - 23:29 #56
Mener du inde i project>settings ?
Avatar billede arne_v Ekspert
12. januar 2004 - 23:31 #57
Ja
Avatar billede bumle90 Nybegynder
12. januar 2004 - 23:43 #58
hmmmm jeg har sat det op i
project>settings>link valgt input og skrevet "zlib\lib\zdll.lib" i additional library path og i Resources zlib\include i Addtional resource include directories.
Filer ligger placeret i c:\zlib
Samme har jeg tilføjet til PATH.
Har prøvet at fjerne zlib så der bare står \include og har også prøvet at skrive absolutte sti....
Avatar billede arne_v Ekspert
12. januar 2004 - 23:46 #59
Hvilken fejl får du helt præcist ?
Avatar billede bumle90 Nybegynder
12. januar 2004 - 23:46 #60
fatal error C1083: Cannot open include file: 'zlib.h': No such file or directory
Avatar billede bumle90 Nybegynder
12. januar 2004 - 23:47 #61
Det er fordi den ikke kan finde den i sin path går jeg stærkt ud fra...Jeg må have sat det forkert op på en eller anden måde
Avatar billede bumle90 Nybegynder
12. januar 2004 - 23:50 #62
Præcis hvor skal jeg skrive hvad hvis jeg har lagt zlib i c:\zlib
?
Avatar billede arne_v Ekspert
12. januar 2004 - 23:50 #63
Prøv lige at sæt de 2 op med fuld sti i.s.f. relativ sti !
Avatar billede arne_v Ekspert
12. januar 2004 - 23:50 #64
C:\zlib\include

og

C:\zlib\lib\zdll.lib
Avatar billede bumle90 Nybegynder
12. januar 2004 - 23:53 #65
hmmm den siger det samme selvom jeg har skrevet den absolutte sti
Avatar billede bumle90 Nybegynder
12. januar 2004 - 23:54 #66
project>settings>link valgt input og skrevet "zlib\lib\zdll.lib" i additional library path og i Resources zlib\include i Addtional resource include directories.

Er det ikke det korrekte sted?
Avatar billede arne_v Ekspert
12. januar 2004 - 23:57 #67
Du kan se command line options i vinduet nedenunder.

De skal indeholde:

/IC:\zlib\include

ellers er det forkert !
Avatar billede bumle90 Nybegynder
13. januar 2004 - 00:01 #68
Compiling...
main.c
E:\rodeDir\appelhelp\sent\Exercise 03\main.c(5) : fatal error C1083: Cannot open include file: 'zlib.h': No such file or directory
Error executing cl.exe.

main.obj - 1 error(s), 0 warning(s)
Avatar billede arne_v Ekspert
13. januar 2004 - 00:06 #69
Hvis du bruger:

#include "zlib.h"

Og du har sat settings så den giver:

/IC:\zlib\include

i firkanten nedenunder.

Og du har:

C:\zlib\include\zlib.h

så skal det virke !
Avatar billede bumle90 Nybegynder
13. januar 2004 - 00:12 #70
Du mener der skal stå /IC:\zlib\include i build vinduet? Det gør der ikke...Der står kun det her

--------------------Configuration: exercise 03 - Win32 Debug--------------------
Compiling...
main.c
E:\rodeDir\appelhelp\sent\Exercise 03\main.c(5) : fatal error C1083: Cannot open include file: 'zlib.h': No such file or directory
Error executing cl.exe.

main.obj - 1 error(s), 0 warning(s)
Avatar billede arne_v Ekspert
13. januar 2004 - 00:15 #71
Ikke i compile output vinduet.

Men i den lille firkant når du er inde og ændre settings.
Avatar billede bumle90 Nybegynder
13. januar 2004 - 00:18 #72
Under link har jeg i det lille firkantede vindue :
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:yes /pdb:"Debug/exercise 03.pdb" /debug /machine:I386 /out:"Debug/exercise 03.exe" /pdbtype:sept /libpath:"c:\zlib\lib\zdll.lib"

Under Resources har jeg i det lille firkantede vindue :
/l 0x406 /i "c:\zlib\include" /d "_DEBUG"

BTW. Tak for din tålmodighed.
Avatar billede arne_v Ekspert
13. januar 2004 - 00:22 #73
Så burde den også kunne finde zlib.h !

Det er C: ?

Og du bruger "" og ikke <> i include ?
Avatar billede bumle90 Nybegynder
13. januar 2004 - 00:25 #74
Ja.
Stien kopieret fra addresselinien :
C:\zlib\include
Kode kopieret fra kodevindue :

#include <stdio.h>
#include <windows.h>
#include <string.h>

#include "zlib.h"

int main()
{
  int l1,l2,l3;
  char s1[200] = "Dette er en lille test med en masse e'er som gerne skulle give en god compress:\n"
                  "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
  char s2[200];
  char s3[200];
  l1 = strlen(s1);
  compress(s2,&l2,s1,l1);
  uncompress(s3,&l3,s2,l2);
  s3[l3] = '\0';
  printf("%s\n",s1);
  printf("%d -> %d -> %d\n",l1,l2,l3);
  printf("%s\n",s3);
  return 0;
}
Avatar billede bumle90 Nybegynder
13. januar 2004 - 00:28 #75
Hvad hvis jeg compilerer fra prompten som du skrev i starten og sender stien med som paratmer. Hvad skriver jeg så?
Avatar billede arne_v Ekspert
13. januar 2004 - 00:31 #76
cl /IC:\zlib\include ditprogram.c C:\zlib\lib\zdll.lib
Avatar billede bumle90 Nybegynder
13. januar 2004 - 00:33 #77
hm...Der kommer samme fejl der
Avatar billede bumle90 Nybegynder
13. januar 2004 - 00:34 #78
Jeg har også kopieret zlib1.dll ind i system32 som der står i usage...
Hvad kan jeg have gjort galt
Avatar billede arne_v Ekspert
13. januar 2004 - 00:39 #79
Det forstå jeg ikke.

.h filen er der men compileren vil ikke finde den.

¤"¤!%¤/%!%&
Avatar billede arne_v Ekspert
13. januar 2004 - 00:40 #80
Prøv lige med den rigtigt stygge løsning:

#include "C:\zlib\include\zlib.h"
Avatar billede bumle90 Nybegynder
13. januar 2004 - 00:41 #81
Lige mine ord. Det gir absolut ingen mening.
Jeg har sat min path op i miljøvariabler også. Selvom det jo er ligemeget når jeg skriver den absolutte sti.
Avatar billede bumle90 Nybegynder
13. januar 2004 - 00:54 #82
Jeg blir nødt til at smutte i seng. Tak for din hjælp arne. Hvis du finder et svar må du meget gerne skrive det her.
Vi snakkes.
Her er dine point :)
Avatar billede bumle90 Nybegynder
13. januar 2004 - 16:46 #83
Hej Arne.
Jeg har fået det til at virke nu. så jeg kan godt compile når jeg inkluderer zlib.h
Der er dog noget i koden der ikke virker helt logisk. har du tid et øjeblik?
Avatar billede arne_v Ekspert
13. januar 2004 - 17:21 #84
ja
Avatar billede bumle90 Nybegynder
13. januar 2004 - 17:32 #85
Jeg får følgende fejl nr jeg vil compile : (Har kopieret koden direkte)

arrtest.cpp
arrtest.cpp(12) : error C2440: 'initializing' : cannot convert from 'char [81]'
to 'unsigned char *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-
style cast or function-style cast
arrtest.cpp(12) : error C2144: syntax error : missing ';' before type 'unsigned
char'
arrtest.cpp(14) : error C2664: 'strlen' : cannot convert parameter 1 from 'unsig
ned char *' to 'const char *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-
style cast or function-style cast
arrtest.cpp(15) : error C2664: 'compress' : cannot convert parameter 2 from 'int
*' to 'unsigned long *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-
style cast or function-style cast
arrtest.cpp(16) : error C2664: 'uncompress' : cannot convert parameter 2 from 'i
nt *' to 'unsigned long *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-
style cast or function-style cast
Avatar billede bumle90 Nybegynder
13. januar 2004 - 17:33 #86
Fik reduceret lidt

arrtest.cpp
arrtest.cpp(14) : error C2664: 'compress' : cannot convert parameter 1 from 'cha
r [200]' to 'unsigned char *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-
style cast or function-style cast
arrtest.cpp(15) : error C2664: 'uncompress' : cannot convert parameter 1 from 'c
har [200]' to 'unsigned char *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-
style cast or function-style cast
Avatar billede arne_v Ekspert
13. januar 2004 - 17:36 #87
Prøv og ændre de 3 strenge til:

unsigned char s1[200] = "Dette er en lille test med en masse e'er som gerne skulle give en god compress:\n"
                  "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
unsigned char s2[200];
unsigned char s3[200];
Avatar billede bumle90 Nybegynder
13. januar 2004 - 17:38 #88
Det gav mig følgende : P.S. Får du ikke de her fejl når du compiler?

arrtest.cpp
arrtest.cpp(13) : error C2664: 'strlen' : cannot convert parameter 1 from 'unsig
ned char [200]' to 'const char *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-
style cast or function-style cast
arrtest.cpp(14) : error C2664: 'compress' : cannot convert parameter 2 from 'int
*' to 'unsigned long *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-
style cast or function-style cast
arrtest.cpp(15) : error C2664: 'uncompress' : cannot convert parameter 2 from 'i
nt *' to 'unsigned long *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-
style cast or function-style cast
Avatar billede arne_v Ekspert
13. januar 2004 - 17:41 #89
Nej - jeg får ikke fejl. Men jeg compiler med et lavt warning niveau.
Avatar billede bumle90 Nybegynder
13. januar 2004 - 17:45 #90
Hmmm oki.
Kan du overskue hvad fejlen er ?
Avatar billede arne_v Ekspert
13. januar 2004 - 17:48 #91
Prøv den her:

#include <stdio.h>
#include <windows.h>
#include <string.h>

#include "zlib.h"

int main()
{
  long l1,l2,l3;
  char s1[200] = "Dette er en lille test med en masse e'er som gerne skulle give en god compress:\n"
                  "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
  char s2[200];
  char s3[200];
  l1 = strlen(s1);
  compress((unsigned char *)s2,(unsigned long *)&l2,(unsigned char *)s1,l1);
  uncompress((unsigned char *)s3,(unsigned long *)&l3,(unsigned char *)s2,l2);
  s3[l3] = '\0';
  printf("%s\n",s1);
  printf("%d -> %d -> %d\n",l1,l2,l3);
  printf("%s\n",s3);
  return 0;
}
Avatar billede bumle90 Nybegynder
13. januar 2004 - 17:56 #92
Oki, nu kunne jeg compile og køre den :)
Meget fornemt Hr. Arne. Jeg er imponeret.

Så 160 karakterer blir komprimeret til 77 ik sandt ?
Det er jo bare kanon.
Så hvis jeg ville gemme den komprimerede streng i en fil, skulle jeg efter compress gemme hvilken streng?
Og hvad skulle jeg putte i uncompress()når jeg hentede den ud af filen igen.
Avatar billede arne_v Ekspert
13. januar 2004 - 17:59 #93
Jo.

compress: finder s1, compresser til s2, skriver s2

uncompress: læser s2, decompresser til s3, bruger s3
Avatar billede bumle90 Nybegynder
13. januar 2004 - 18:14 #94
Hmmmm ville prøve noget ala det her, men den læser lidt forkerte tegn ud på skærmen hæhæ :)

#include <stdio.h>
#include <windows.h>
#include <string.h>

#include "zlib.h"

int main()
{
  FILE* fp;
  fp=fopen("comp.usr","w");
  long l1,l2,l3,lFil;
  char s1[200] = "Dette er en lille test med en masse e'er som gerne skulle give en god compress:\n"
                  "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
  char s2[200];
  char s3[200];
  char FraFil[200];
  l1 = strlen(s1);
  compress((unsigned char *)s2,(unsigned long *)&l2,(unsigned char *)s1,l1);
 
  fprintf(fp,"%s",s2);
  fclose(fp);
 
  fp=fopen("comp.usr","r");
  fscanf(fp,FraFil);
  fclose(fp);

  uncompress((unsigned char *)s3,(unsigned long *)&l3,(unsigned char *)FraFil,lFil);
  //s3[l3] = '\0';
  //printf("%s\n",s1);
  //printf("%d -> %d -> %d\n",l1,l2,l3);
  //printf("%s\n",s3);
 
  printf("%s",s3);
  return 0;
}
Avatar billede arne_v Ekspert
13. januar 2004 - 18:27 #95
fprintf/fscanf skriver/læser læsbar tekst

brug fwrite/fread til at skrive/læse binære data

ukomprimeret er læsbar tekst, men komprimeret er binært
Avatar billede bumle90 Nybegynder
13. januar 2004 - 21:20 #96
Når man laver en fread/write her, hvor stor skal størrelsen af hver element så være?
Er det 8 eller hvad? Måske 1 for 1 bit??
Avatar billede arne_v Ekspert
13. januar 2004 - 21:22 #97
Kald med 1 (det er sizeof char) og antal chars !
Avatar billede bumle90 Nybegynder
13. januar 2004 - 21:47 #98
Jeg ser man skal bruge længden l2 til at sende med når de skal dekomprimeres.
Den kan jo bare godt være lidt svær at få fat i når det er 2 forskellige applikationer der skal compresse og decompresse. Er der en smart måde at omgå dette på andet end at gemme det i en fil ?
Avatar billede arne_v Ekspert
13. januar 2004 - 21:49 #99
Nej.

Lav et format f.eks.:
  2 byte med længden
  N bytes med data
Avatar billede bumle90 Nybegynder
13. januar 2004 - 21:50 #100
hmmm mine filer varierer jo i størrelse. I nogle filer ligger der mere data end i andre....Det kan ikke lade sig gøre så eller hvad?
Avatar billede arne_v Ekspert
13. januar 2004 - 21:58 #101
Jo.

Hvis filen indeholder flere "records", så prefixer du data med en længde som
beskrevet ovenfor.

Hvis det hele bare er en chunk, så kan du bruge filens størrelse (altså uden
at gemme længde).
Avatar billede bumle90 Nybegynder
14. januar 2004 - 00:31 #102
Arne..Håber du ikke har mistet al din tålmodighed med mig snart :)
Skal siges at du har været en meget stor hjælp.
Tusind tak.
Jeg håbede jeg kunne få lov til at spørge om noget mere.
Da min fil jo kan blive pænt stor, måske 10-20 mb alt afhængig af hvor meget der ligger på computeren er det jo ret meget at fylde op i hukommelsen hvis jeg skal lægge det hele ned i en datafil i en stor chunk. Jeg har siddet og eksperimenteret lidt og har fundet ud af at man ikke kan oprette et chararray der er større end 1 mb. Jeg ved godt det ikke er så smart at svine med hukommelsen på den måde, men jeg kan ikke se hvordan man kan løse mit problem anderledes nemlig.
Mit problem er jo at der kan være ufattelig mange filer på en computer, og ikke så mange på en anden.
Jeg ved desuden ikke hvad mapperne hedder på de forskellige computere, så det er svært at fastsætte en "recordsize" hvis jeg skulle skrive en "record" ad gangen.
Så jeg er sådan lidt drønet ind i en blindgyde. Jeg tænkte om du evt. havde et forslag eller en lille tanke måske?
Avatar billede bumle90 Nybegynder
14. januar 2004 - 00:40 #103
hmmmm strange. Det er kun lokalt i funktioner man ikke kan lave chararrays på over 1 Mb. Globalt er det muligt..
Avatar billede arne_v Ekspert
14. januar 2004 - 07:42 #104
globalt = heap
lokalt = stack

der er en forskel !
Avatar billede arne_v Ekspert
14. januar 2004 - 07:43 #105
Men ellers chunker du det.

Læs 1 MB, skrive en 4 byte længde + data, læse 1 MB mere, skriv en 4 byte
længde + data,..., læs resten, skriv en 4 byte header + data.

Omvendt den anden vej.
Avatar billede bumle90 Nybegynder
14. januar 2004 - 20:09 #106
Hmm strange. Jeg har en funktion der komprimerer. Denne komprimering er baseret (i testøjemed) på et chararray på 200 pladeser.
Komprimeringen duer fint nok hvis jeg kun kalder denne funktion. Kalder jeg en anden funktion tidligere i programmet der i øvrigt har intet med komprimeringsfunktionen at gøre virker komprimering slet ikke. Der bliver ikke komprimeret og 0 byte bliver skrevet i filen.
Den prævise linie i den anden funktion der forudsager at komprimeringsfunktionen ikke duer er helt præcis
char tempstreng[400]={0},startsti[MAX_arraystr]={0}; //MAX_arraystr=2000
Jeg synes simpelthen der er strange. Kan det have noget at gøre med at arraysne lapper ind over hinanden i hukommelsen/Stakken laver noget mystisk/jeg ikke rydder op i hukommelsen eller sådan noget....Jeg er lidt lost :)
Så atter en gang må jeg spørge dig til råds Arne hehe, og andre selvfølgelig også der måtte have et svar :)
Avatar billede arne_v Ekspert
14. januar 2004 - 20:13 #107
Det lyder som en eller anden overskrivings fejl.

Det er bare svært at sige uden at se lidt kode.
Avatar billede bumle90 Nybegynder
14. januar 2004 - 20:17 #108
Hmmm ja...jeg kan jeg ikke sende dig koden pr. mail?
Vil helst ikke fyre hele kildekoden af her på eksperten selvom den ikke er det helt vilde...Håber du forstår?
Kan det lade sig gøre?
Avatar billede arne_v Ekspert
14. januar 2004 - 20:19 #109
arne_v@mail.danbbs.dk
Avatar billede bumle90 Nybegynder
14. januar 2004 - 20:34 #110
Oki Arne. 1 stk. cpp fil er på vej :)
Avatar billede arne_v Ekspert
15. januar 2004 - 20:19 #111
Lidt eksperimenteres viste at min kode vist burde have været:

#include <stdio.h>
#include <string.h>

#include "zlib.h"

int main()
{
  int l1,l2,l3;
  char s1[200] = "Dette er en lille test med en masse e'er som gerne skulle give en god compress:\n"
                  "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
  char s2[200];
  char s3[200];
  l1 = strlen(s1);
  l2 = sizeof(s2);
  l3 = sizeof(s3);
  compress(s2,&l2,s1,l1);
  uncompress(s3,&l3,s2,l2);
  s3[l3] = '\0';
  printf("%s\n",s1);
  printf("%d -> %d -> %d\n",l1,l2,l3);
  printf("%s\n",s3);
  return 0;
}
Avatar billede bumle90 Nybegynder
15. januar 2004 - 20:36 #112
Her er lidt til godtposen hæhæ
http://www.eksperten.dk/spm/452189
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester