Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 7 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 26.03.09
Prihlásený: 01.08.09
Príspevky: 6
Témy: 1
Príspevok NapísalOffline : 26.03.2009 7:37

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


Offline

Užívateľ
Užívateľ
Staticke pole smernikov a jeho polozky - alokacia pamate

Registrovaný: 16.05.07
Prihlásený: 01.08.17
Príspevky: 837
Témy: 6
Príspevok NapísalOffline : 26.03.2009 9:10

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
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 30.04.08
Prihlásený: 15.05.15
Príspevky: 884
Témy: 3
Príspevok NapísalOffline : 26.03.2009 15:17

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…
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 26.03.09
Prihlásený: 01.08.09
Príspevky: 6
Témy: 1
Príspevok Napísal autor témyOffline : 26.03.2009 21:59

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 ?


Offline

Užívateľ
Užívateľ
Staticke pole smernikov a jeho polozky - alokacia pamate

Registrovaný: 02.09.05
Prihlásený: 17.11.10
Príspevky: 154
Témy: 1
Príspevok NapísalOffline : 26.03.2009 22:02

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)
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 26.03.09
Prihlásený: 01.08.09
Príspevky: 6
Témy: 1
Príspevok Napísal autor témyOffline : 27.03.2009 15:54

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 ?


Offline

Užívateľ
Užívateľ
Staticke pole smernikov a jeho polozky - alokacia pamate

Registrovaný: 02.09.05
Prihlásený: 17.11.10
Príspevky: 154
Témy: 1
Príspevok NapísalOffline : 27.03.2009 17:42

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)
Odpovedať na tému [ Príspevkov: 7 ] 


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. DYNAMICKE vs. STATICKE pole smernikov !!!SUUURNE!!!

v Assembler, C, C++, Pascal, Java

6

2047

11.05.2009 8:48

sangokoko Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. alokacia a ine

v Assembler, C, C++, Pascal, Java

9

824

12.05.2011 16:42

johny29 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. c dynamická alokácia dvojrozmerného poľa

v Assembler, C, C++, Pascal, Java

4

506

02.05.2017 20:47

BX Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Pochopenie smernikov v jazyku C

v Assembler, C, C++, Pascal, Java

10

8133

09.10.2014 8:24

BX Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Problem s hladanima mazanim u smernikov - Pascal

v Assembler, C, C++, Pascal, Java

6

473

10.05.2010 17:37

jahoda09 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Suma členov matice pomocou smerníkov ( v C-ečku )

v Assembler, C, C++, Pascal, Java

1

1143

28.03.2009 10:05

neutronmind Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. statické pozadie

v HTML, XHTML, XML, CSS

5

1033

02.11.2008 17:00

chrono Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Staticke smerovanie

v Siete

1

729

12.10.2012 10:55

majky358 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Staticke okno

v HTML, XHTML, XML, CSS

6

530

13.03.2008 15:10

ove Zobrazenie posledných príspevkov

Táto téma je zamknutá, nemôžete posielať nové príspevky alebo odpovedať na staršie. Statické stránky

v HTML, XHTML, XML, CSS

1

365

30.05.2010 13:35

shaggy Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Statické stránky

v Ostatné

4

1178

30.01.2009 15:17

Berny Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. DevC++ a statické členske premenné

v Assembler, C, C++, Pascal, Java

4

779

02.08.2009 13:35

Loko11 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. USB Headset robi roboticke/staticke zvuky

v Zvuk

0

366

21.09.2011 18:35

rhythmic Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. pozicia polozky

v Databázy

2

592

12.12.2010 8:56

emer Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Staticke metody v OOP a kedy ich pouzit

v PHP, ASP

1

695

28.12.2010 18:47

Forty- Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. zitenie najvacsej polozky

v PHP, ASP

1

424

06.05.2009 22:02

rooobertek Zobrazenie posledných príspevkov


Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra