Stránka: 1 z 1
| [ Príspevkov: 7 ] | |
Autor | Správa |
---|
Registrovaný: 26.03.09 Prihlásený: 01.08.09 Príspevky: 6 Témy: 1 | 1 |
Aj ked som trosicka v C robil, bolo to uz velmi davno a preto nepamatam, ako sa presne pracuje so statickym polom smernikov(predstavuje zaznam), pricom polozky zaznamu maju dynamicku velkost. Nieco som na webe nasiel, no stale som si nie isty, ci som spravne pochopil. Mam napr. nieco take:
Kód: #define MAX_POCET 100 #define MAX_MENO 30 #define MAX_PRIEZV 30
typedef struct { char *meno; char *priezvisko; int vek; }CLOVEK;
/* deklaracia statickeho pola smernikov */ CLOVEK *clovek[MAX_POCET];
void main() { int i = 0;
for(i = 0; i< MAX_POCET; i++) { /* vyhradenie pamate pre strukturu */ clovek[i] = (CLOVEK *) malloc(sizeof(CLOVEK));
/* vyhradenie pamate pre jednotlive dyn. polozky struktury */ /* ratam, ze namiesto vopred def. hodnot mozem pouzit dynamicky ziskanu velkost napr. pri zadani mena cez strlen() - je to tak ? */ clovek[i]->meno = (char *)malloc(MAX_MENO * sizeof(char *)); clovek[i]->priezvisko = (char *)malloc(MAX_PRIEZVISKO * sizeof(char *));
//naplnenie poloziek datami... ....
//praca s polozkami .... }
/* uvolnenie pamate pred ukoncenim */ for(i = 0; i< MAX_POCET; i++) { free(clovek[i]); }
}
Takze je to spravny postup alebo to nie je v poriadku? Viete mi s tym pomoct? Vdaka
|
|
Registrovaný: 16.05.07 Prihlásený: 01.08.17 Príspevky: 837 Témy: 6 | 6 |
no a ked si to skusil tak ti to dalo nejaky warning ci nie?
Kód: #include <malloc.h> #include <stdio.h> #include <stdlib.h>
void main(void) { int *a; int i=1000;
if ( ( a = (int *)malloc(i*sizeof(int)) ) == NULL ) { printf("\nError, memory not allocated.\n"); exit(1); }
for ( i=0; i<1000; i++ ) a[i] = i;
// ...
free(a); }
C++ Kód: int* a = NULL; // Pointer to int, initialize to nothing. int n; // Size needed for array cin >> n; // Read in the size a = new int[n]; // Allocate n ints and save ptr in a. for (int i=0; i<n; i++) { a[i] = 0; // Initialize all elements to zero. } . . . // Use a as a normal array delete [] a; // When done, free memory pointed to by a. a = NULL; // Clear a to prevent using invalid memory reference.
_________________ getch();?{readkey;?} na konci? !A naco! Riesenie je (Alt+F5)
99% pochopí a shaggy je druhá kategória |
|
Registrovaný: 30.04.08 Prihlásený: 15.05.15 Príspevky: 884 Témy: 3 | 3 |
ramonez píše: Takze je to spravny postup alebo to nie je v poriadku? Viete mi s tym pomoct? Vdaka
Nevidim na tom nic nespravne, cize to tak podla mna moze byt. Alebo ti tam nieco nefunguje?
_________________ Empty your memory, with a free()… like a pointer! If you cast a pointer to an integer, it becomes the integer, if you cast a pointer to a struct, it becomes the struct… The pointer can crash…, and can overflow… Be a pointer my friend… |
|
Registrovaný: 26.03.09 Prihlásený: 01.08.09 Príspevky: 6 Témy: 1 | 1 |
V pohode skompilovane, aj to bezi, ale akosi som nemal resp. nemam istotu, ci to je spravne pouzite, preto ten dotaz. Skusim sa opytat este inac:
1) ako si zistim, kolko pamate (ci aj spravne) som si naalokoval ci uz pre strukturu alebo pre jednotlive polozky
2) zatial som neskusal, ale ak by som nealokoval pamat pre dyn. polozky, je mozne ze po spusteni a snahe naplnit niektoru z dyn. poloziek dostanem hlasku s ukoncenim programu, ze pristupujem na nealokovane miesto v pamati ?
|
|
Registrovaný: 02.09.05 Prihlásený: 17.11.10 Príspevky: 154 Témy: 1 | 1 |
Myslim ze alokacie prvkov v strukture nie su celkom v poriadku:
Kód: clovek[i]->meno = (char *)malloc(MAX_MENO * sizeof(char *)); alokujes MAX_MENO*sizeof(char *) Byte, t.z MAX_MENO*4 B, pretoze ukazatel zabera v pamati 4 Byte (2 byte pre segment, 2 byte pre offset). Znak zabera v pamati prave 1 B. Cize nasledovne je spravne: Kód: clovek[i]->meno = (char *)malloc(MAX_MENO * sizeof(char)); Este si neodpusim pripomienku : pokial by si mal pernamentne alokovat pre polozky struktury MAX_MENO * sizeof(char) Byte (analogicky aj s priezviskom), oplati sa strukturu prepisat nasledovne: Kód: typedef struct { char meno[MAX_MENO]; char priezvisko[MAX_PRIEZV]; int vek; }CLOVEK; Pri uvolnovani pamate by si mal najprv uvolnit alokovanu pamat pre prvky struktury (pokial ich samozrejme alokujes ako si uviedol, ale ak by si to riesil vyssie uvedenym sposobom, staci to co si napisal) pom. fcie free, cize: Kód: /* uvolnenie pamate pred ukoncenim */ for(i = 0; i< MAX_POCET; i++) { free(clovek[i]->meno); free(clovek[i]->priezvisko); free(clovek[i]); } Neber to prosim ako kritiku, ale ako pomoc (samozrejme pokial som sa aj ja nepomylil) !
_________________ Múdry nie je ten, čo veľa vie, ale ten, kto vie, čo je treba. (Thomas Alva Edison) |
|
Registrovaný: 26.03.09 Prihlásený: 01.08.09 Príspevky: 6 Témy: 1 | 1 |
Super, ako kritiku to neberiem, prave naopak. Stretol som sa v roznych forach s roznymi odpovedami, bohuzial vela z nich je takych, kde namiesto spravnej pomoci sa kritizuje, hlavne ak dotaz polozi nejaky zaciatocnik-laik a "odbornici" ho potom zavalia kritikou, akokeby spachal neviem co. Ale k veci:
1) Alokacia prvkov - samozrejme, mas pravdu, spravne ma byt ... MAX_MENO * sizeof(char), chybicka sa vloudila
2)Uvolnenie pamate - znova mas pravdu - uvolnenie pamate jednotlivych poloziek + uvolnenie pamate struktury
3) K tvojej pripomienke, ak by som pouzil "konstantu" pri alokacii pamate pre dyn. polozky tak ako som uviedol, lepsie by bolo definovat strukturu ako si napisal. Vo svojom priklade som ale spominal,ze velkost mozem ziskat dynamicky. napr. ak sa meno zadava uzivatelom potom by mohlo platit:
Kód: clovek[i]->meno = (char *)malloc(strlen(pomocna_premenna) * sizeof(char));
Alebo sa mylim? Resp. rozmyslam, ako vynechat tu pomocnu premennu, ale akosi mi nic nenapada.
4)Napadla mi este dalsia otazka, ako to je potom s uvolnovanim pamate po odstraneni len nejakeho zaznamu(nie vsetkych) resp. s pridanim pamate, ak chcem pridat novy zaznam/zaznamy ?
|
|
Registrovaný: 02.09.05 Prihlásený: 17.11.10 Príspevky: 154 Témy: 1 | 1 |
Odpovede
3. Samozrejme moze sa to riesit aj tvojim uvedenym sposobom, ale myslim ze je to zbytocne, radsej sa treba zamerat prave na 4.bod
4. Pokial je algoritmus rieseny s polom typu struktura, je s tym problem. Preco ? Pretoze pokial mame udany pocet prvkov a chceme pridat dalsi musia sa vykonat taketo kroky:
- alokacia noveho pola o novej velkosti
- skopirovanie vsetkych prvkov zo stareho do noveho pola
- dealokacia stareho pola
Co v praxi znamena neustale premiestnovanie a alokaciu dalsich pamatovych blokov. Taketo problemy sa riesia pomocou dynamickych struktur, teda napr. linearnym zoznamom. Deklaracia takejto dyn. struktury by sa velmi nelisila od tvojej: Kód: typedef CLOVEK *pclovek; typedef struct { char meno[MAX_MENO]; char priezvisko[MAX_PRIEZV]; int vek; pclovek dalsi; } CLOVEK; Obsahuje naviac typovy pointer na dalsiu strukturu, pomocou kt. je mozne dynamicky alokovat (a samozrejme aj neskor prechadzat) dalsie struktury rovnakeho typu. Viac info si mozer precitat napr. na http://cec.truni.sk/stoffov/dynamicke-u ... _uvod.html alebo http://people.tuke.sk/igor.podlubny/C/Kap10.htm
Pokial budes chciet nejaky skelet na ovladanie lin. zoznamu, mozem poskytnut
_________________ Múdry nie je ten, čo veľa vie, ale ten, kto vie, čo je treba. (Thomas Alva Edison) |
|
Stránka: 1 z 1
| [ Príspevkov: 7 ] | |
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| v Assembler, C, C++, Pascal, Java | 6 | 2090 | 11.05.2009 8:48 sangokoko | | v Assembler, C, C++, Pascal, Java | 9 | 860 | 12.05.2011 16:42 johny29 | | v Assembler, C, C++, Pascal, Java | 4 | 539 | 02.05.2017 20:47 BX | | v Assembler, C, C++, Pascal, Java | 10 | 8263 | 09.10.2014 8:24 BX | | v Assembler, C, C++, Pascal, Java | 6 | 501 | 10.05.2010 17:37 jahoda09 | | v Assembler, C, C++, Pascal, Java | 1 | 1187 | 28.03.2009 10:05 neutronmind | | v HTML, XHTML, XML, CSS | 5 | 1065 | 02.11.2008 17:00 chrono | | v Siete | 1 | 777 | 12.10.2012 10:55 majky358 | | v HTML, XHTML, XML, CSS | 6 | 577 | 13.03.2008 15:10 ove | | v HTML, XHTML, XML, CSS | 1 | 398 | 30.05.2010 13:35 shaggy | | v Ostatné | 4 | 1215 | 30.01.2009 15:17 Berny | | v Assembler, C, C++, Pascal, Java | 4 | 810 | 02.08.2009 13:35 Loko11 | | v Zvuk | 0 | 398 | 21.09.2011 18:35 rhythmic | | v Databázy | 2 | 618 | 12.12.2010 8:56 emer | | v PHP, ASP | 1 | 736 | 28.12.2010 18:47 Forty- | | v PHP, ASP | 1 | 444 | 06.05.2009 22:02 rooobertek |
|