dynam.alok+random gener. do pola

C,C++,C#

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
lubbo7
Pokročilý člen
Pokročilý člen
Príspevky: 628
Dátum registrácie: 06 Mar 2010, 00:00
Bydlisko: TN
Vek: 34

dynam.alok+random gener. do pola

Príspevok od používateľa lubbo7 » 13 Dec 2013, 13:43

zdravim,chcel by som sa opytat co je na tomto zle:

Kód: Vybrať všetko

int *pole1;                
     float *pole2,*pole3; 
int main(){
if ((pole1 = (int *) malloc(sizeof(int))) == NULL)  
        {                
        printf("Nedostatok pamete!\n");
        return 0;
        }
if ((pole2 = (float *) malloc(sizeof(float))) == NULL)     
        {
        printf("Nedostatok pamete!\n");
        return 0;
        }
printf("Zadajte pocet cisel: ");
scanf("%d",pole1);
printf("Nezoradene pole: "); 
     for (i = 0; i <*pole1; i++) 
         {
         pole2[i]=rand()%100+1;       
         }
     for (i = 0; i <*pole1; i++) 
         {
         printf("\n%0.1f ",pole2[i]);
         } 
}   
  
je to vystrihnuta len cast kodu v c-cku,malo by to generovat nahodne cisla do dynamicky alokovaneho pola a potom ich vypisat,problem je ze mi to funguje len ak je prvkov <17,ak zadam vygenerovat 17 a viac cisiel tak sa nic nestane a vypne sa to
nechcelo sa mi to sem hadzat cele,ale malo by to tie cisla aj triedit pomocou algoritmov,ale triedilo to len ak som zadal maximalne 9 cisiel.
vedel by niekto pomoct cim to je?
dakujem
0

anonymousCoward
Stály člen
Stály člen
Príspevky: 150
Dátum registrácie: 12 Máj 2013, 11:09
Bydlisko: KE

Re: dynam.alok+random gener. do pola

Príspevok od používateľa anonymousCoward » 13 Dec 2013, 14:06

Kód: Vybrať všetko

if ((pole1 = (int *) malloc(sizeof(int))) == NULL)
po tomoto bude v pole1 ukazatel na alokovanu pamat velkosti aspon sizeof(int) t.j. jeden jediny int. To ze to ide pre 16, alebo 9, ci iny pocet je nepodstatne - uz pri zapise do pole1[1] si niekde 'nahodne' prepisujes pamat. To je velmi zle :)

Namiesto toho skus:

Kód: Vybrať všetko

   int velkost = 1;
   int *pole1;               
   float *pole2,*pole3;

   int main(){
      printf("Zadajte pocet cisel: ");
      scanf("%d", &velkost); // nerecykluj premenne - velkost je velkost, pole1 je pole1
      // aj navratovu hodnotu scanf by sa zislo overit ...

      if ((pole1 = (int *) malloc(velkost*sizeof(int))) == 0) { // namiesto NULL pokojne pri ukazateloch pouzi 0
         printf("Nedostatok pamete!\n");
         return 1; // navratovy kod 0 je OK; nie 0 je chyba
      }
      if ((pole2 = (float *) malloc(velkost*sizeof(float))) == 0) {
         printf("Nedostatok pamete float*!\n");
         return 1;
      }
Okrem toho, pri iterovani pola cez index i vo for-e nema zmysel pouzit ako podmienku *pole1 - je predsa nezavisle od i; skus:

Kód: Vybrať všetko

     printf("Nezoradene pole: ");
     for (i = 0; i < velkost; ++i) {
         pole2[i]= (rand()%100) + 1; // zatvorky zvysuju citatelnost ;)
     }
     for (i = 0; i < velkost; ++i) {
         printf("\n%0.1f ",pole2[i]);
     }
     return 0; // vsetko OK
   }
0
War is peace. Freedom is slavery. Ignorance is strength.
There is no such thing as a well-adjusted slave.

Používateľov profilový obrázok
lubbo7
Pokročilý člen
Pokročilý člen
Príspevky: 628
Dátum registrácie: 06 Mar 2010, 00:00
Bydlisko: TN
Vek: 34

Re: dynam.alok+random gener. do pola

Príspevok od používateľa lubbo7 » 13 Dec 2013, 14:21

aha,dakujem za rady,skusim sa s tym pohrat, tieto dynamicke alokacie/pointre su (aspon pre mna) zlozitejsie na pochopenie takze to musim "vstrebat" :D
0

Používateľov profilový obrázok
lubbo7
Pokročilý člen
Pokročilý člen
Príspevky: 628
Dátum registrácie: 06 Mar 2010, 00:00
Bydlisko: TN
Vek: 34

Re: dynam.alok+random gener. do pola

Príspevok od používateľa lubbo7 » 13 Dec 2013, 20:14

takze toto je ten kod,malo by to nahodne vygenerovat cisla,zoradit ich,vypisat a ulozit do externeho binarneho suboru
problem je ze ak zadam 10+cisiel,tak ich sice vypise,ale uz nezoradi a program sa skonci(pri 9- vsetko funguje ako ma)
ukladanie do binarneho suboru si nemam ako overit...problem bude pravdepodobne niekde v tych alokaciach
za vsetky rady a tipy vopred dakujem

*edit: tak stacilo zmazat tento riadok: fwrite(pole2, sizeof(float), velkost, subor); ktory mal povodne slusit pre ulozenie do binarneho suboru a zda sa ze to funguje,len este musim nejak inak domysliet to ukladanie do binarnych suborov

Kód: Vybrať všetko

void bubblesort(unsigned int dlzka, float pole[])
{
unsigned int i, j;
int pocet=0;
float pom;
if (dlzka <= 1)
         return;
     for (j = 0; j < dlzka - 1; j++) {
         i = 0;
         do {
             if (pole[i] > pole[i + 1]) {
                pom = pole[i];
                 pole[i] = pole[i + 1];
                 pole[i + 1] = pom;
                 pocet++;
            }
            i++;
         } while (i < dlzka - 1);
    }
    printf("\vykonalo sa : %d porovnani.\n",pocet);
}

int main(){
     int i;
     int *pole1;                
     float *pole2,*pole3;  
     float nahod; 
     int velkost=1;                     


FILE *subor;
subor=fopen("binarny.bin","wb+");
if (!subor){
   printf("Nepodarilo sa otvorit subor");
   return 1;           
   }
srand(time(0));
if ((pole1 = (int *) malloc(velkost*sizeof(int))) == NULL)  
        {                
        printf("Nedostatok pamete!\n");
        return 0;
        }
if ((pole2 = (float *) malloc(velkost*sizeof(float))) == NULL)     
        {
        printf("Nedostatok pamete!\n");
        return 0;
        }


printf("Zadajte pocet cisel: ");
scanf("%d",&velkost);
printf("Nezoradene pole: "); 
     for (i = 0; i <velkost; i++) 
         {
         pole2[i]=(rand()%100)+1;       
         }
     for (i = 0; i <velkost; i++) 
         {
         printf("\n%0.1f ",pole2[i]);
         }    
              
bubble(velkost,pole2);
printf("Zoradene prvky pomocou Bubble sort-vzostupne: ");
for (i = 0; i < velkost; i++)
    {
    printf("\n%2.1f ",pole2[i]);
    fwrite(pole2, sizeof(float), velkost, subor);    
    }


getch();
return 0;
system("PAUSE");

free(pole1);
pole1=NULL;
free(pole2);
pole2=NULL;
free(pole3);
pole3=NULL;
fclose(subor);
}
0
Naposledy upravil/-a lubbo7 v 13 Dec 2013, 20:28, upravené celkom 1 krát.

Používateľov profilový obrázok
boban
Stály člen
Stály člen
Príspevky: 137
Dátum registrácie: 03 Jún 2010, 00:00
Bydlisko: po

Re: dynam.alok+random gener. do pola

Príspevok od používateľa boban » 13 Dec 2013, 20:27

najskor zase ta ista chyba, nemozes alokovat pamat pre 1 prvok a vkladat don n-prvkov. nacitanie premennej velkost musi byt pred mallocom, parametrom funkcie malloc je aky velky blok pamate ma zaalokovat. Teraz vzdy alokujes priestor pre jeden prvok, co znaci ze sahas mimo pamat. Nejakych par prvkov to vydrzi (najskor preto to funguje do 9) az sa dostanes na inu stranku potom ti to hadi segfault.
0

anonymousCoward
Stály člen
Stály člen
Príspevky: 150
Dátum registrácie: 12 Máj 2013, 11:09
Bydlisko: KE

Re: dynam.alok+random gener. do pola

Príspevok od používateľa anonymousCoward » 13 Dec 2013, 20:35

Tak ako pise Boban .. a navyse nejake ine veci, v komentaroch. Enjoy:

Kód: Vybrať všetko

void bubblesort(unsigned int dlzka, float pole[]) {
   unsigned int i, j;
   int pocet=0;
   float pom;

   if (dlzka <= 1)
      return;

   for (j = 0; j < dlzka - 1; j++) {
      i = 0;
      do {
         if (pole[i] > pole[i + 1]) {
            pom = pole[i];
            pole[i] = pole[i + 1];
            pole[i + 1] = pom;
            pocet++;
         }
      i++;
      } while (i < dlzka - 1);
   }
   printf("Vykonalo sa %d porovnani.\n", pocet);
}

int main() {
   int i;
   float *pole2;
   int velkost=1;

   FILE *subor =fopen("binarny.bin","wb+");
   if (!subor){
      printf("Nepodarilo sa otvorit subor");
      return 1;           
   }

   srand(time(0));

   printf("Zadajte pocet cisel: ");
   scanf("%d",&velkost); // najprv inicializuj velkost

   if ((pole2 = (float *) malloc(velkost*sizeof(float))) == 0) {
      printf("Nedostatok pamete!\n");
      return 0;
   }

   printf("Nezoradene pole:\n");
   for (i = 0; i <velkost; i++) {
      pole2[i]=(rand()%100)+1;
      printf("%0.1f\n",pole2[i]);
   }

   bubblesort(velkost, pole2);
   printf("\nZoradene prvky pomocou Bubble sort-vzostupne:\n");
   for (i = 0; i < velkost; i++) {
      printf("%2.1f\n",pole2[i]);
   }

   fwrite(pole2, sizeof(float), velkost, subor);    // staci zapisat raz, mimo cyklu

   free(pole2);
   fclose(subor);

   return 0; // navratova hodnota z main !
}
To, ci subor obsahuje floaty overis pod Linuxom pomerne jednoducho: od -t f4 binarny.bin
Pod Windows mozes pouzit nejaky hexadecimalny editor ... alebo si nainstaluj cygwin :)
0
War is peace. Freedom is slavery. Ignorance is strength.
There is no such thing as a well-adjusted slave.

Používateľov profilový obrázok
lubbo7
Pokročilý člen
Pokročilý člen
Príspevky: 628
Dátum registrácie: 06 Mar 2010, 00:00
Bydlisko: TN
Vek: 34

Re: dynam.alok+random gener. do pola

Príspevok od používateľa lubbo7 » 13 Dec 2013, 20:39

no linux bohuzial nemam ani som ho nikdy nepouzival :(
inak vo wine sa to nejak neda zistit ci sa mi tam ulozilo to co som chcel?
a este jedna vec, je nejaka modifikacia prikazu rand ktory mi bude generovat realne cisla? napr desatinne? pretoze rand nech robim co robim mi vzdy generuje len cele cisla
0

anonymousCoward
Stály člen
Stály člen
Príspevky: 150
Dátum registrácie: 12 Máj 2013, 11:09
Bydlisko: KE

Re: dynam.alok+random gener. do pola

Príspevok od používateľa anonymousCoward » 13 Dec 2013, 20:57

Pod Windows nepoznam editor, v ktorom sa da pozriet pole floatov inak ako po bajtoch. Ale da sa to v Matlabe :)

Nainstaluj si cygwin - ziskas kopu nastrojov zdarma (napriklad ten 'od', alebo aj gcc, diff, nc ...), a popri tom sa cosi naucis o Linuxe. Ak to myslis s C vazne, skor ci neskor sa tomu nevyhnes.
0
War is peace. Freedom is slavery. Ignorance is strength.
There is no such thing as a well-adjusted slave.

Používateľov profilový obrázok
BFX
Ultimate člen
Ultimate člen
Príspevky: 2506
Dátum registrácie: 04 Sep 2013, 19:41
Bydlisko: Košice
Vek: 50

Re: dynam.alok+random gener. do pola

Príspevok od používateľa BFX » 13 Dec 2013, 21:00

Pod Windows nepoznam editor, v ktorom sa da pozriet pole floatov inak ako po bajtoch
nuz da sa to aj vo visual studiu a aj v eclipse :)
0
“Nice looking” circuit construction doesn't always equate to good circuit performance.
http://www.arrl.org/files/file/Product% ... pter_1.pdf
Na predaj: p-bfx-predava-kto-zavaha-prerobi-t41148.html

Používateľov profilový obrázok
lubbo7
Pokročilý člen
Pokročilý člen
Príspevky: 628
Dátum registrácie: 06 Mar 2010, 00:00
Bydlisko: TN
Vek: 34

Re: dynam.alok+random gener. do pola

Príspevok od používateľa lubbo7 » 13 Dec 2013, 21:11

ziskas kopu nastrojov zdarma (napriklad ten 'od', alebo aj gcc, diff, nc ...)-vobec netusim k tomu to sluzi,ale mrknem nato
a co to generovanie real cisiel?
0

anonymousCoward
Stály člen
Stály člen
Príspevky: 150
Dátum registrácie: 12 Máj 2013, 11:09
Bydlisko: KE

Re: dynam.alok+random gener. do pola

Príspevok od používateľa anonymousCoward » 14 Dec 2013, 10:26

Fcia rand() generuje cele cisla od 0 do RAND_MAX, kde RAND_MAX je aspon 32767 (tak vravi standard - u Teba to moze byt viac).
Z rand() sa da ziskat realne cislo s nejakym rozdelenim z intervalu <zaciatok; koniec> napriklad takto:

Kód: Vybrať všetko

float nahodneCislo(unsigned int zaciatok, unsigned int koniec) {
   const unsigned int REAL_EXPONENT = 1000; // pow(10, 3) ~ 3 desatinne miesta
   zaciatok *= REAL_EXPONENT;
   koniec *= REAL_EXPONENT;
   unsigned int celeNahodneCislo = zaciatok + ( rand() % (koniec - zaciatok + 1));
   printf("cele pseudonahodne cislo medzi <%d, %d>: %d\n", zaciatok, koniec, celeNahodneCislo);
   return celeNahodneCislo/((float)REAL_EXPONENT);
}

int main() {
   unsigned int i, j;

   srand(0); // ja mam semienko, kam si ho len zasadim ? :)

   // test
   for (i = 0; i < 11; i += 3)
      for (j = i; j < i + 4; ++j)
         printf("\tnahodneCislo(%d, %d) == %f\n", i, j, nahodneCislo(i, j));

   return 0;
}
Fcia nahodneCislo() berie dva parametre - zaciatok a koniec intervalu, z ktoreho sa ma generovat realne cislo. Pocet desatinnych miest vysledneho realneho cisla zavisi od hodnoty premennej REAL_EXPONENT.

Na riadku s vypoctom hodnoty celeNahodneCislo sa pomocou rand() ziska cele cislo z intervalu <zaciatok; koniec>. Hranice intervalu sa este predtym nasobia REAL_EXPONENT; preto bude v celeNahodneCislo nejake nahodne cislo z intervalu <zaciatok*REAL_EXPONENT; koniec*REAL_EXPONENT>. Napriklad, pre interval <1; 10> bude v celeNahodneCislo nejaka pseudonahodna hodnota z <1000; 10000>.
Nakoniec sa celeNahodneCislo predeli hodnotou REAL_EXPONENT, pretypovanou na typ float. Tak sa z celeNahodneCislo typu int, napriklad z rozsahu <1000; 10000> stane realne cislo z povodneho intervalu <1.0; 10.0>.

Tento sposob je extremne jednoduchy, a jeho vhodnost zavisi od toho, na co chces pouzivat takto vygenerovane cisla. Ak je to cosi vaznejsie (statistika, kryptografia), pozri na existujuce kniznice: boost, GMP, GSL, R ...

Okrem toho, hodnoty zaciatok a koniec, pri ktorych vracia funkcia nahodneCislo() spravne vysledky su obmedzene, a zavisia od limitov pouzitych typov.

BTW V SK som k zakladom C narychlo nasiel celkom dobre vyzerajuci dokument - su tam popisane typy, konverzie, a tiez praca s polami.
0
War is peace. Freedom is slavery. Ignorance is strength.
There is no such thing as a well-adjusted slave.

Používateľov profilový obrázok
lubbo7
Pokročilý člen
Pokročilý člen
Príspevky: 628
Dátum registrácie: 06 Mar 2010, 00:00
Bydlisko: TN
Vek: 34

Re: dynam.alok+random gener. do pola

Príspevok od používateľa lubbo7 » 14 Dec 2013, 11:04

tak uz mi to je jasne,dakujem za podrobny popis :)
0

Používateľov profilový obrázok
lubbo7
Pokročilý člen
Pokročilý člen
Príspevky: 628
Dátum registrácie: 06 Mar 2010, 00:00
Bydlisko: TN
Vek: 34

Re: dynam.alok+random gener. do pola

Príspevok od používateľa lubbo7 » 22 Dec 2013, 18:20

ahoj,chcel by som poprosit este o 1 radu.
ak mam vygenerovat prvky do pola velkosti ktoru predtym zadam,nasledne toto pole zapisat do binarneho suboru, a nasledne toto zapísané pole použit do triediacich algoritmov
jedine co ma napadlo je,ze prve pole ktore si nahodne vygenerujem pomenuj napr pole1, nasledne ho zapisem do bin suboru,pri prvom triediacom algoritme este problem nebude pretoze toto pole este nebolo utriedovane,ale keby som ho chcel dalej pouzit v inom triediasom algoritme tak by mi to uz nezoradovalo neutriedene,ale utriedene a to nechcem, takze musim si do pole1 vzdy pred vykonanim algoritmu nacitat to neusporiadane pole z bin suboru?
ak ano tak nejak takto?:
*pole=fread(pole, sizeof(float), velkostpola, subor);

alebo to musim prehnat cyklom? skratka neviem ci ak nacitavam pomocou toho prikazu do pola tak sa mi tie cisla z binarneho suboru ulozia spravne tak ako by mali do jednotl indexov pola alebo to bude prepisovat stale 1 index kedze nepouzijem cyklus
0

anonymousCoward
Stály člen
Stály člen
Príspevky: 150
Dátum registrácie: 12 Máj 2013, 11:09
Bydlisko: KE

Re: dynam.alok+random gener. do pola

Príspevok od používateľa anonymousCoward » 22 Dec 2013, 19:03

Mas viacero moznosti - mozes po prvom utriedeni pole1 znovu nacitat zo suboru; alebo mozes triedit kopie daneho pola.
Druhy sposob je praktickejsi, vyzeral by asi takto:

Kód: Vybrať všetko

triedPrvymSposobom(float *pole, size_t dlzka) {
  // tu sa usporiadaju prvky pola 'pole', nejakym sposobom #1
}
triedDruhymSposobom(float *pole, size_t dlzka) {
  // tu sa usporiadaju prvky pola 'pole', nejakym sposobom #2
}

int main() {
   float *pole, utriedenePole;
   size_t velkost;
   // tu sa nejak ziska 'velkost' a prvky 'pole'
   // trebars sa aj ulozi na disk

   float *pole1 = malloc(sizeof(float)*velkost);  // pre prehladnost to pisem tu; v C to samozrejme patri na zaciatok main()
   if (!pole1) {
      // chyba
   }
   memcpy(pole1, pole, sizeof(float)*velkost); // skopiruje dany pocet byteov z pole do pole1

   triedPrvymSposobom(pole1, velkost);
   // trebars vypis utriedene pole1

   float *pole2 = malloc ...
   if (!pole2) ...
   memcpy(pole2, pole, ...);

   triedDruhymSposobom(pole2, velkost);
   // trebars vypis utriedene pole2

   free(pole1);
   free(pole2);
   free(pole);
   return 0;
}
Respektive, ak Ti uz prvky v pole1 netreba, tak ho mozes pouzit namiesto pole2 t.j. pole2 mozes odstranit a pred druhym (a dalsim) triedenim len zavolat memcpy.

Ak by si predsa len chcel nacitavat pole1 zo suboru, nemusis pri fread pouzit cyklus - Tvoj priklad by velkostpola krat nacital sizeof(float) byteov. Pozri dokumentaciu, trebars tu.
Navyse, priradenie navratovej hodnoty fread do *pole asi nespravi to co chces - fread vracia pocet nacitanych byteov, a Tvoj prikaz by do prveho prvku pola ulozil tuto hodnotu (dokonca ako size_t do pola float-ov). Navratovu hodnotu je dobre overovat kvoli moznej chybe:

Kód: Vybrať všetko

   size_t nacitanychByteov = fread(pole, sizeof(float), velkostpola, subor);
   if (nacitanychByteov != sizeof(float)*velkostpola) {
      if (ferror(subor)) {
         perror("I/O chyba pri nacitavani suboru");
         return 1;
      }
     fprintf(stderr, "subor je mensi, nez je potrebne na vyplnenie pola");
     return 1;
   }
0
War is peace. Freedom is slavery. Ignorance is strength.
There is no such thing as a well-adjusted slave.

Používateľov profilový obrázok
lubbo7
Pokročilý člen
Pokročilý člen
Príspevky: 628
Dátum registrácie: 06 Mar 2010, 00:00
Bydlisko: TN
Vek: 34

Re: dynam.alok+random gener. do pola

Príspevok od používateľa lubbo7 » 27 Dec 2013, 13:36

dakujem,mohol by som ta poprosit este aj o ten prvy sposob?
0

anonymousCoward
Stály člen
Stály člen
Príspevky: 150
Dátum registrácie: 12 Máj 2013, 11:09
Bydlisko: KE

Re: dynam.alok+random gener. do pola

Príspevok od používateľa anonymousCoward » 27 Dec 2013, 16:37

Na quote to uz je asi privela, toz v prilohe.

Nezlakni sa ukazatelov na fcie - su tam len kvoli dalsiemu (demonstracnemu) algoritmu na triedenie; na zapis a nacitavanie zo suboru ich nepotrebujes.
Ked Ti nieco nebude jasne, hod sem otazky - predpokladam ze rovnako dolezite ako mat funkcny program je rozumiet mu.
Prílohy
bubble.c
Zdrojak, v1.
(3.81 KiB) 43 stiahnutí
0
War is peace. Freedom is slavery. Ignorance is strength.
There is no such thing as a well-adjusted slave.

Používateľov profilový obrázok
lubbo7
Pokročilý člen
Pokročilý člen
Príspevky: 628
Dátum registrácie: 06 Mar 2010, 00:00
Bydlisko: TN
Vek: 34

Re: dynam.alok+random gener. do pola

Príspevok od používateľa lubbo7 » 27 Dec 2013, 18:37

uf, nemyslel som ze to bude az tak zlozite a dlhe,prinajhorsom pouzijem tu prvu verziu, kazdopadne ti moc dakujem za pomoc a za tvoj cas, ak by som potreboval s niecim helfnut tak sa ozvem
dakujem :)
0

anonymousCoward
Stály člen
Stály člen
Príspevky: 150
Dátum registrácie: 12 Máj 2013, 11:09
Bydlisko: KE

Re: dynam.alok+random gener. do pola

Príspevok od používateľa anonymousCoward » 27 Dec 2013, 22:34

Zo SS:
lubbo7 napísal:tak otazok bude viac,zoberiem to postupne:

Kód: Vybrať všetko

int zapisPole(size_t dlzka, Element pole[], const char *cestaKSuboru) {//preco element pole? ja som pouzil float pole a islo mi to
Toto ma suvis s definiciou vyssie:

Kód: Vybrať všetko

typedef float Element; // alebo double ?
Klucove slovo typedef umoznuje nejakemu typu pridat 'alias'. V nasom pripade to znamena, ze vsade tam, kde si doteraz pisal float mozes napisat Element. Je to cosi podobne, ako keby si napisal:

Kód: Vybrať všetko

#define Element float
Az na to, ze ten typedef je cistejsi nez je #define (okrem ineho). Vyhoda je, ze keby si sa rozhodol pouzit iny typ (napriklad ten spominany double), staci Ti zmenit riadok s typedef t.j. je to na jednom mieste.

Okrem toho sa typedef pouziva na zprehladnenie deklaracii; priklad z kodu:

Kód: Vybrať všetko

typedef size_t (*Triedic)(size_t dlzka, Element pole[]);
Toto definuje novy typ Triedic ktory oznacuje ukazatel na funkciu, berucu dva parametre, a vracajucu size_t. To je uz ale mimo Tvoju povodnu otazku; tento novy typ sa navyse pouziva v kode, ktory pre Tvoje ucely nepotrebujes.

V skratke: ak vies, ze chces len floaty, tak Element nepotrebujes. Za toto sa ospravedlnujem - je to sice pomerne dolezite, ale nieje to nevyhnutne, a mal som si uvedomit ze privela novych veci zabije aj slona.

Kód: Vybrať všetko

   FILE *subor = fopen(cestaKSuboru, "wb+"); // 1. riadok
   size_t zapisanyPocetElementov; // tomuto vobec nerozumiem,co sa v tomto kroku vykona
   if (!subor){ // 3-ti riadok
      perror("Zlyhalo otvorenie suboru na zapis"); // 4.
      return 0; // 5.
   }
Toz: V prvom riadku sa zavola fcia fopen, pomocou ktorej sa otvori subor ktoreho cestu udava obsah premennej cestaKSuboru (retazec) na zapis (lebo "w").
V dalsom riadku je len deklaracia novej premennej s nazvom zapisanyPocetElementov, typu size_t. Tento typ sa pouziva pre premenne oznacujuce pocet, alebo dlzku - standard garantuje, ze sa do neho zmesti aspon take cislo, kolko byteov moze mat najvacsi objekt.

Treti riadok je ekvivalentny tomuto:

Kód: Vybrať všetko

  if (subor == 0) {
Premenna subor bude 0 (t.j. NULL) len ak zlyha volanie funkcie fopen z prveho riadku.
Stvrty a piaty riadok sa teda vykonaju len ak sa nepodari otvorit subor. Riadok s funkciou perror je +- ekvivalentny tomuto:

Kód: Vybrať všetko

  fprintf(stderr, "Zlyhalo otvorenie suboru na zapis: %s\n", strerror(errno));
Toto volanie fcie fprintf zapise do 'suboru' stderr formatovany retazec; vysledkom konstruktu strerror(errno) je retazec popisujuci chybu (kedze sa nepodarilo otvorit subor).
stderr oznacuje tzv. standardny chybovy vystup. Je to subor do ktoreho sa da zapisovat; pri spusteni programu v konzole sa vsetko zapisane do stderr vypise aj na konzolu t.j. pouzivatel uvidi chybovu hlasku. Existuje aj stdout; rozdiel medzi nimi dvoma je v tom, ze do toho prveho by sa mali zapisovat chybove hlasky, a do druheho hlasky o priebehu - ked napises:

Kód: Vybrať všetko

  printf("Hello Kitty\n");
tak v skutocnosti sa zavola:

Kód: Vybrať všetko

  fprintf(stdout, "Hello Kitty\n");

Kód: Vybrať všetko

   zapisanyPocetElementov = fwrite(pole, sizeof(Element), dlzka, subor);//preco je tento prikaz priradovany premennej a nieje to len cast napravo od =?
Funkcia fwrite vracia pocet zapisanych elementov. Riadky nizsie overia, ci je tento pocet zhodny s poctom ktory sme naozaj chceli zapisat (t.j. dlzka). Vacsi asi nebude, ale moze byt mensi, napriklad ked dojde miesto, alebo sa zapis z nejakeho dovodu prerusi atd.
Je dobrou praxou overovat taketo veci, pretoze shit happens, a cim skor ho odchytis, tym menej sa dostane k ventilatoru.

Kód: Vybrať všetko

   fclose(subor);
   if (zapisanyPocetElementov != dlzka) {
      fprintf(stderr, "Nepodarilo sa zapisat do suboru '%s'.\n", cestaKSuboru);// k comu je stderr?
      return 0;
   }
   return 1;
}
Na prvom riadku sa uzavrie subor, kedze sme do neho uz svoje zapisali. Je dobrou praxou uvolnovat prostriedky hned ako sa da (to sa tyka pamate, suborov, zamkov, .. vsetkeho). V pripade suboru by sa dokonca mohlo stat, ze sa do neho nezapisu vsetky data, kym sa nezavrie (alebo kym ho tzv. nesplachnes).

Dalsie riadky kontroluju pocet zapisanych elementov.


Tolko v jednom prispevku, zvysok si radsej necham na zajtra :)
0
War is peace. Freedom is slavery. Ignorance is strength.
There is no such thing as a well-adjusted slave.

Napísať odpoveď