[ 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 | 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


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 | 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
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 | 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…
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 | 1
Napísal autor témyOffline : 26.03.2009 21:59 | Staticke pole smernikov a jeho polozky - alokacia pamate

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 | 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)
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 | 1
Napísal autor témyOffline : 27.03.2009 15:54 | Staticke pole smernikov a jeho polozky - alokacia pamate

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 | 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)
 [ Príspevkov: 7 ] 


Staticke pole smernikov a jeho polozky - alokacia pamate



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

2095

11.05.2009 8:48

sangokoko

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

alokacia a ine

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

9

865

12.05.2011 16:42

johny29

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

544

02.05.2017 20:47

BX

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

Pochopenie smernikov v jazyku C

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

10

8280

09.10.2014 8:24

BX

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

505

10.05.2010 17:37

jahoda09

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

1196

28.03.2009 10:05

neutronmind

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

Staticke okno

v HTML, XHTML, XML, CSS

6

586

13.03.2008 15:10

ove

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

402

30.05.2010 13:35

shaggy

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

Statické stránky

v Ostatné

4

1220

30.01.2009 15:17

Berny

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

statické pozadie

v HTML, XHTML, XML, CSS

5

1072

02.11.2008 17:00

chrono

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

Staticke smerovanie

v Siete

1

783

12.10.2012 10:55

majky358

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

DevC++ a statické členske premenné

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

4

814

02.08.2009 13:35

Loko11

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

USB Headset robi roboticke/staticke zvuky

v Zvuk

0

403

21.09.2011 18:35

rhythmic

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

pozicia polozky

v Databázy

2

623

12.12.2010 8:56

emer

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

Staticke metody v OOP a kedy ich pouzit

v PHP, ASP

1

741

28.12.2010 18:47

Forty-

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

Nezname položky biosu

v Biosy a ladenie výkonu

1

690

27.07.2009 14:18

shiro



© 2005 - 2024 PCforum, edited by JanoF