Close
Duke shfaqur rezultatin -9 deri 0 prej 5
  1. #1
    3rror21 Maska e 3rror21
    Anėtarėsuar
    02-02-2004
    Vendndodhja
    itali
    Postime
    20
    Pershendetje te gjitheve!
    Me qe ra fjala cuna se me eshte bere truri lemsh me (malloc-calloc) ,
    spo e gjej as me nje vend qe ta sqaroje ashtu si duhet,
    nqs se keni kohe me dhene nje pergj
    faleminderit te gjitheve
    Ai qe di me se shumti flet me se paku

  2. #2
    Programues Softueresh Maska e edspace
    Anėtarėsuar
    04-04-2002
    Vendndodhja
    Filadelfia, SHBA
    Postime
    2,565
    Ketu ke nje faqe qe shpjegon perdorimin e memories ne C
    http://www.gnu.org/software/libc/man...tion%20and%20C


    Ketu ke faqen e MSDN per MALLOC
    http://msdn.microsoft.com/library/de...crt_malloc.asp

    Ketu ke faqen e MSDN per CALLOC
    http://msdn.microsoft.com/library/de...crt_calloc.asp


    C ka dy menyra per perdorimin e memories.
    1. Statike - Perdoret per variablat globale dhe te pandryshueshme
    2. Automatike - Perdoret per argumentat e funksioneve dhe variablat lokale qe krijohen dhe fshihen brenda territorit (scope) ku jane perdorur.

    Ndonjehere kur je duke programuar nuk e di se sa memorie eshte e nevojshme prandaj te duhet te kerkosh memorien ne menyre Dinamike. Kjo behet duke thirur malloc( size_t x) ku x eshte nje numer i plote pozitiv qe cakton sa byte duhet te rezervoje malloc. Nqs kompjuteri gjen memorien e mjaftueshme, malloc do ktheje nje tregues (pointer) me adresen e rezerves. Nqs nuk ka memorie te mjaftueshme, malloc do ktheje NULL.

    psh: Kemi krijuar nje strukture me emrin "postim" dhe sa here qe dikush poston dicka ne forum, programi duhet te gjeje memorien e nevojshme, para se ta hedhe postimin ne database.

    Kodi:
    struct postim{
       char titulli[50]; 
       char shkrimi[50];
       integer pergjigje;
       integer lexime;
    }
    
    // krijojme nje tregues (pointer) per strukturen "postim"
    struct postim * p;
    
    // llogarisim memorjen e nevojshme per nje postim
    // dhe e kerkojme memorien me malloc
    p = (struct postim *)malloc( sizeof(struct postim) );
    
    if ( p == null ){
        printf("Nuk ka memorje te mjaftueshme per postimin");
    }
    else{
        printf("Postimi u hodh ne memorje" );
    
        hidh_ne_database(p);
    
        //lirojme memorien qe perdorem
        free(p);
        printf("\nMemorja u lirua"); 
    }
    calloc() eshte e ngjashme me malloc() por rezervon hapesiren e nevojshme per nje liste elementesh/objektesh pernjeheresh.
    Psh:
    p = (struct postim *)calloc(10, sizeof(struct postim) );

    Rreshti me lart do rezervoje memorje per 10 postime.
    Ndryshuar pėr herė tė fundit nga edspace : 08-04-2004 mė 16:45
    Edi

  3. #3
    Texas Ranger Maska e Clauss
    Anėtarėsuar
    19-06-2003
    Vendndodhja
    Athens
    Postime
    1,483
    plus calloc e ben edhe initialise ( zero) space qe rezervon.
    kur ngaterrohesh/sje i sigurt me free etc shiko edhe alloca.
    You were meant for me. Perhaps as a punishment.

  4. #4
    Larguar Maska e cunimartum
    Anėtarėsuar
    07-06-2002
    Vendndodhja
    Canada
    Postime
    678
    Edi nuk i ke vajtur deri ne fund
    Do ishte mire qe te silleshin problemet me te hasura me keto metoda, sepse problemet ne memory allocation po nuk i dite jane tragjike.

    Ja nje shembull skandaloz
    Bug klasik :

    Kodi:
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    #define BLOCK_SIZE 65530
    
    int recordlength = 0;
    char format_string[10];
    
    static int numcompare(const void *p1, const void *p2) {
    	double i,j;
    	sscanf(*(char **)p1,format_string,&i);
    	sscanf(*(char **)p2,format_string,&j);
    
    	if (i > j) return (1);
    	if (i < j) return (-1);
    	return(0);
    	}
    
    static int numrcompare(const void *p1, const void *p2) {
    	double i,j;
    	sscanf(*(char **)p1,format_string,&i);
    	sscanf(*(char **)p2,format_string,&j);
    
    	if (i < j) return (1);
    	if (i > j) return (-1);
    	return(0);
    	}
    
    static int strcompare(const void *p1, const void *p2) {
    	return (strncmp(*(char **)p1,*(char **)p2,recordlength));
    	}
    
    static int strrcompare(const void *p1, const void *p2) {
    	
    	return (-1 * strncmp(*(char **)p1,*(char **)p2,recordlength));		
    	}
    
    static int stricompare(const void *p1, const void *p2) {
    	return (strncasecmp(*(char **)p1,*(char **)p2,recordlength));
    	}
    
    static int strricompare(const void *p1, const void *p2) {
    	return (-1 * strncasecmp(*(char **)p1,*(char **)p2,recordlength));
    	}
    
    void cleanup(char ***bl,int b,char ***rl) {
    	int i;
    
    	free(*rl);
    	for (i = 0; i < b; i++)
    		free(*bl[i]);		
    	free(*bl);
    	}
    
    int main(int argc, char *argv[]) {
    	int i;
    	int fd;
    	int maxrec;
    	int read_bytes;
    	int read_records;
    	int blocks = 0;
    	int records = 0;
    	int numeric = 0;
    	int reverse = 0;
    	int ignorecase = 0;
    	char **blocklist = NULL;
    	char **recordlist = NULL;
    	char *block;
    	int (*compare)(const void *, const void *);
    
    	/* handle arguments */
    	if (argc < 3) {
    		fprintf(stderr, "usage: sort   [options]");
    		exit(1);
    		}
    	recordlength = strtol(argv[1],NULL,10);
    	fd = open(argv[2],O_RDONLY);
    	if (recordlength <= 0 || recordlength > BLOCK_SIZE || fd < 0)
    		exit(1);
    	if (argc >= 4) {			
    		
    		if (strchr(argv[3], 'r')) 
    			reverse = 1;
    		if (strchr(argv[3], 'n'))
    			numeric = 1;
    		if (strchr(argv[3], 'i'))
    			ignorecase = 1;
    		}
    	if (numeric) {
    		if (reverse) compare = numrcompare;		
    		else compare = numcompare;
    		}
    	else if (ignorecase) {
    		if (reverse) compare = strricompare;
    		else compare = stricompare;
    		}
    	else {
    		if (reverse) compare = strrcompare;
    		else compare = strcompare;
    		}
    	sprintf(format_string,"%%%dlf",recordlength);
    
    	
    	do {
    		block = (char *) malloc(BLOCK_SIZE);
    		blocklist = (char **) realloc(blocklist, sizeof(char *) * (blocks + 1));
    		if (block == NULL || blocklist == NULL)
    			exit(1);
    		blocklist[blocks++] = block;
    		maxrec = BLOCK_SIZE / recordlength;	/* max # of records in block */
    		read_bytes = read(fd,block,recordlength * maxrec);
    		if (read_bytes <= 0)
    			break;
    		read_records = read_bytes / recordlength;	/* # records really read */
    		recordlist = (char **) realloc(recordlist, sizeof(char *) *
    												(records + read_records));
    		if (recordlist == NULL)			
    			exit(1);
    		for (i = 0; i < read_records; i++)
    			recordlist[records++] = block + recordlength * i;
    		} while (read_bytes == recordlength * maxrec);
    	close(fd);
    
        if (records) {					/* if there is something to do */
    		/* now sort the data */
    		qsort(recordlist,records,sizeof(char *),compare);
    
    		/* output data to stdout */
    		for (i = 0; i < records; i++)		
    			write(1,recordlist[i],recordlength);
    		}
    	cleanup(&blocklist,blocks,&recordlist);
    	exit(0);
    	}

    Programi simulon nje sort routine me tre opsione te mundshme -r ( per reverse se prapthi) -n(per numrat) dhe -i(per ignore case ) dhe nje mangesi "te vogel" duhet te kete rreshta te njejte ne filen qe do sortohet dhe duhet te dihet numri i karaktereve per rresht. ( Programi eshte pjese e nje skripti ne bash qe i rregullon thjeshte fare keto veti)

    kompilimi ne Unix ose Linux:
    cc -go mysort mysort.c
    egzekutimi me file-in e dhene ( i pershtatshem per te nxjerre ne pah bugun) :
    mysort 75 large.in

    Normalisht duhet te kompilohet pa problem ne Windows, por nuk e di sa efikas do jete ambjenti aty per te gjetur bugun

    behet renditja-sortimi i filit dhe ne fund hasim nje seg.Fault
    Rast tipik qe DUHET ditur.


    ps. dbx (ose-gdb) mysort core
    bcheck -all mysort 75 large.in
    mysort.errs created.
    Fen e ke krejt personale. MEMEDHEUN E KEMI TE PERBASHKET.

  5. #5
    Larguar Maska e cunimartum
    Anėtarėsuar
    07-06-2002
    Vendndodhja
    Canada
    Postime
    678
    Ja dhe fili large.in
    Skedarėt e Bashkėngjitur Skedarėt e Bashkėngjitur
    Fen e ke krejt personale. MEMEDHEUN E KEMI TE PERBASHKET.

Regullat e Postimit

  • Ju nuk mund tė hapni tema tė reja.
  • Ju nuk mund tė postoni nė tema.
  • Ju nuk mund tė bashkėngjitni skedarė.
  • Ju nuk mund tė ndryshoni postimet tuaja.
  •