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
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
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.
calloc() eshte e ngjashme me malloc() por rezervon hapesiren e nevojshme per nje liste elementesh/objektesh pernjeheresh.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"); }
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
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.
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.
Ja dhe fili large.in
Fen e ke krejt personale. MEMEDHEUN E KEMI TE PERBASHKET.
Krijoni Kontakt