Obsah fóra
PravidláRegistrovaťPrihlásenie




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

Užívateľ
Užívateľ
C volanie funkcii

Registrovaný: 15.10.11
Prihlásený: 07.03.12
Príspevky: 13
Témy: 6
Príspevok NapísalOffline : 15.10.2011 22:23

Prosim niekoho o radu... Jedna vec mi nefunguje a neviem ako na nu... Davam tu taku zjednodusenu verziu :
Kód:
int nacitanie()
{
  int i = 5;
  return i;
}

int sekundy(int argc, char *argv[])
{
  if (argc == 2) if (strcmp("-s", argv[1]) == 0)
  {
  int sek;
  nacitanie();
  sek = nacitanie ();
  return 0;
}
}


No, toto je vlastne prvy problem, mozem to sek = nacitanie(); spravit? Asi nie, lebo to nefunguje... Potom teda ako do premennej dostanem to co funkcia nacitanie vyreturnovala? :( Dakujem pekne


Offline

Užívateľ
Užívateľ
C volanie funkcii

Registrovaný: 27.12.08
Prihlásený: 13.12.22
Príspevky: 1874
Témy: 96
Bydlisko: Bratislava,...
Príspevok NapísalOffline : 15.10.2011 23:43

1. medzi nacitanie a (); mas medzeru, preto ti to nejde
2. riadok nacitanie() je zbytocny, takto sa ti funkcia nacitanie(); zavola dvakrat
3. môžeš spraviť aj niečo ako "int sek = nacitanie();" a skrátiť si program
4. keď už skracuješ program, keďže funkcia sekundy nič nevracia (resp. vracia za každých okolností 0), kľudne môže byť typu void a nemusíš tam mať riadok "return 0;"







_________________
~Listen to your brain, not your heart~
NB1: Lenovo Y500: CPU: Intel Core i7-3630QM; GPU: nVidia GT650M 2GB SLi; RAM: 16GB DDR3; HDD: 1TB + 256GB SSD (m4); LCD: 15,6" 1920x1080; OS: Win8.1 64-bit + Arch Linux 64-bit (UEFI Powered DualBoot)
NB2: Asus K53SJ-SX093: CPU: Intel Core i3-2310M; GPU: Intel HD3000 / nVidia GT520M 1GB Optimus; RAM: 8GB DDR3; SSD: 128GB 840Evo; LCD: 15,6" 1366x768; OS: Win 8.1 Pro 64-bit (UEFI)
Offline

Užívateľ
Užívateľ
C volanie funkcii

Registrovaný: 09.04.11
Prihlásený: 11.01.14
Príspevky: 257
Témy: 26
Bydlisko: Kesa
Príspevok NapísalOffline : 16.10.2011 1:11

Takže to že za nacitanie a () nemá byť medzera je blbosť. Práveže sa doporučuje, aby tam vždy bola medzera za priehľadnosť programu. Funckia načítanie je ti úplne zbytočná, keďže v nej len priradíš jednu hodnotu, čo môže kľudne urobiť v hlavnej funkcii (neni to zle čo si napísal, ale je to úplne zbytočné ). Ale čo je problém, voláš dva krát if za sebou. Ono by to ani nebol ani taký problém, ale ten druhý if je zahrnutý v tom prvom, takže za ten prvý if musíš dať zátvorku {. To načo si sa pýtal (na to sek = nacitanie (); ), tak funkcia musí mať parametre, ktoré do nej dávaš. Takže v tvojem prípade, tvoja funkcia nevie, čo je to to nacitanie ()
A nBXXL má pravdu, že si tú funkciu zavoláš 2 krát, takže to prvé nacitanie () vyhodz.







_________________
NB - HP Pavilion DV7 3190 -- Windows® 7 Home Premium 64-bit -- Intel® Core™ i7-720QM 1,6 GHz az 2,8 Ghz Turbo Boost, 6 MB pamäte cache úrovne 2 -- 4 GB DDR3 -- disk 640 GB SATA 5400 ot/min -- rozlíšenie 1600 x 900 -- NVIDIA® GeForce® GT 230M -- 2 815 MB grafickej pamäte s vyhradenou pamäťou 1 GB DDR3 -- pripojenie 802.11 a/b/g/n
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 13.11.07
Prihlásený: 20.08.16
Príspevky: 1702
Témy: 0
Príspevok NapísalOffline : 16.10.2011 10:20

street_punk píše:
Takže to že za nacitanie a () nemá byť medzera je blbosť. Práveže sa doporučuje, aby tam vždy bola medzera za priehľadnosť programu.
Kto to doporučuje? Napr. v K&R "štýle" sa nič také neodporúča a podľa mňa je to extrémne neprehľadné. :)


Offline

Užívateľ
Užívateľ
C volanie funkcii

Registrovaný: 27.12.08
Prihlásený: 13.12.22
Príspevky: 1874
Témy: 96
Bydlisko: Bratislava,...
Príspevok NapísalOffline : 16.10.2011 11:27

@street_punk: tak to sorry, som nevedel, že tam tá medzera môže byť, mňa tak učili že to musí byť bez medzery.. (a chrono má pravdu že je to prehľadnejšie, keď tam tá medzera nie je...)
ale zase to, čo ty píšeš sú tiež blbosti:
1. pokiaľ v ife máš len jeden príkaz (v tomto prípade ďalší if) tak tam zátvorky byť nemusia.. (predpokladám, že autorovým cieľom bolo to, aby sa príkazy spĺňali iba vtedy, pokiaľ sú splnené obe podmienky, a aby sa netestovalo na druhú, pokiaľ nie je splnená prvá)..
2. žiadna funkcia nemusí mať parametre, táto ani nemá, takže funkcia vie, čo je to nacitanie()....

teda program ako tento:

Kód:
#include <cstdio>

int blbost()
{
    int i = 5;
    return i;
}

int main()
{
    if (true)
        if (true)
        {
            int sek = blbost ();
            printf("%d\n",sek);
            return 0;
        }
}

skutočne vypíše 5...







_________________
~Listen to your brain, not your heart~
NB1: Lenovo Y500: CPU: Intel Core i7-3630QM; GPU: nVidia GT650M 2GB SLi; RAM: 16GB DDR3; HDD: 1TB + 256GB SSD (m4); LCD: 15,6" 1920x1080; OS: Win8.1 64-bit + Arch Linux 64-bit (UEFI Powered DualBoot)
NB2: Asus K53SJ-SX093: CPU: Intel Core i3-2310M; GPU: Intel HD3000 / nVidia GT520M 1GB Optimus; RAM: 8GB DDR3; SSD: 128GB 840Evo; LCD: 15,6" 1366x768; OS: Win 8.1 Pro 64-bit (UEFI)
Offline

Užívateľ
Užívateľ
C volanie funkcii

Registrovaný: 15.10.11
Prihlásený: 07.03.12
Príspevky: 13
Témy: 6
Príspevok Napísal autor témyOffline : 16.10.2011 11:30

Tu medzeru som do programu nenapisala, to sa mi nejako tu az podarilo.. V tej funkcii nacitanie nie je iba to priradenie, len som to chcela zjednodusit nech tu nevypisujem milion riadkov, princip je ten ale ten isty- funkcia returnuje nejaky int (ziadne parametre nema). Dakujem vam za rady, dnes vecer budem s programom pokracovat, keby mi nieco nejde, urcite sa zasa ozvem :D
nBXXL, ano presne tak je mysleny ten if a aj funguje :)


Offline

Užívateľ
Užívateľ
C volanie funkcii

Registrovaný: 09.04.11
Prihlásený: 11.01.14
Príspevky: 257
Témy: 26
Bydlisko: Kesa
Príspevok NapísalOffline : 16.10.2011 15:34

Tak k tým medzerám, napríklad Pavol Herout uvádza, že je lepšie nechávať medzery. Tak isto aj v škole nás tak učia. A je to aj môj osobný názor, že je tak kód priehľadnejší. Ale to že či tam tú medzeru dá, alebo nedá, programu nijak neublíži.
A stým if, je lepšie tam dať tie zátvorky hneď po napísaní if (urobiť si šablónu) a potom mať istotu, že sa nepomýli.







_________________
NB - HP Pavilion DV7 3190 -- Windows® 7 Home Premium 64-bit -- Intel® Core™ i7-720QM 1,6 GHz az 2,8 Ghz Turbo Boost, 6 MB pamäte cache úrovne 2 -- 4 GB DDR3 -- disk 640 GB SATA 5400 ot/min -- rozlíšenie 1600 x 900 -- NVIDIA® GeForce® GT 230M -- 2 815 MB grafickej pamäte s vyhradenou pamäťou 1 GB DDR3 -- pripojenie 802.11 a/b/g/n
Offline

Užívateľ
Užívateľ
C volanie funkcii

Registrovaný: 15.10.11
Prihlásený: 07.03.12
Príspevky: 13
Témy: 6
Príspevok Napísal autor témyOffline : 17.10.2011 15:16

Tie veci, co mi nesli som uz vyriesila, ale zase je nieco dalsie... Nechcem tu zbytocne zakladat niekolko tem, tak to dam sem. Toto nacitanie zatial robi to, ze pokial clovek zada nieco ine ako cislo (napriklad "dfsahfdas" alebo "53153fdsfds13") tak program vypise to "musis zadat kladne cislo".
Problem je, ze do toho neviem zakomponovat 2 veci, vcera a dneska sa o to pokusam a vzdy mi to niekde zlyhalo :roll: V pripade prazdneho vstupu musi byt vystup tiez vygeneruje prazdny vystup. Teraz mi tam pri zadani enteru vypise 0 sekund. Druhy problem je, ze neviem, ako zistit, ci je cislo vacsie ako ULONG_MAX...lebo samotna ta podmienka je blbost, cislo nemoze byt vacsie.. No proste neviem sa pohnut dalej... Keby mi niekto vedel s tymto poradit, bola by som moc vdacna..
Kód:
long int nacitanie()
{
  long int cislo=0;
  char c;
  while ((c = getchar()) != '\n')
    {
      if (c >= ascii0 && c <= ascii9)
      {
      cislo = cislo * 10;
      cislo = cislo + (c-ascii0);
      }
      else if (c != '\n')
      {
   cislo = -1;
   break;
      }
  }
  if (cislo == -1) { printf("musis zadat kladne cislo\n");}
  return cislo;
}


Offline

Skúsený užívateľ
Skúsený užívateľ
C volanie funkcii

Registrovaný: 11.01.09
Prihlásený: 27.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 17.10.2011 16:47

K prvej otazke, cize osetrenie prazdneho vstupu, si mozes pridat pomocnu premennu uchovavajucu stav, ci bolo nieco zadane alebo nie (dalo by sa to aj elegantnejsie, ale to by si musela prerabat asi celu funkciu):
Kód:
long int nacitanie()
{
 
  long int cislo=0;
  int vstup = 0;    /* v tejto premennej bude nula pokial sa nezada cokolvek okrem enteru */
  char c;
  while ((c = getchar()) != '\n') {
      vstup = 1;        /* getchar() nenacital enter, takze zmenime premennu na jednotku */
      if ( c >= 0x30 && c <= 0x39 ) {     
          cislo = cislo * 10;   
          cislo = cislo + ( c - 0x30 );
      } else if (c != '\n') {
          cislo = -1;
          break;
      }
  }
  if (cislo == -1)
      printf("musis zadat kladne cislo\n");
  if (vstup == 0)      /* a tu uz iba staci porovnat, ci je vstup nula */
      printf("prazdny vstup\n");

  return cislo;

}


A druha otazka sa riesila prednedavnom tu --> http://www.pcforum.sk/zistenie-ci-je-cislo-vacsie-ako-ulong-max-vt122291.html
Cize mozes to vyriesit ako tam, ze bud pouzijes pretypovanie s pouzitim vacsieho datoveho typu:
Kód:
if ( (double)( cislo * 10 )  > ULONG_MAX )

alebo vydelenim ULONG_MAX desiatimi:
Kód:
if ( cislo > ( ULONG_MAX / 10 ) )


Offline

Užívateľ
Užívateľ
C volanie funkcii

Registrovaný: 15.10.11
Prihlásený: 07.03.12
Príspevky: 13
Témy: 6
Príspevok Napísal autor témyOffline : 22.10.2011 13:08

Dakujem, viem, ze moje riesenie asi nebude extra elegantne, bohuzial som zaciatocnicka :oops: Preto mam aj dalsiu otazku... Nejako mi to nefunguje s tym ULONG_MAX. Ked zadam ozaj prilis velke cislo, tak mi to normalne vypise chybovu hlasku, ale ked zadam napriklad tu hodnotu ULONG_MAX alebo o nieco mensiu, tak mi to nevypise vobec nic :(
Kód:
long int nacitanie()
{
 
  long int cislo=0;
  int vstup = 0;    /* v tejto premennej bude nula pokial sa nezada cokolvek okrem enteru */
  char c;
  while ((c = getchar()) != '\n') {
      vstup = 1;        /* getchar() nenacital enter, takze zmenime premennu na jednotku */
      if ( c >= 0x30 && c <= 0x39 ) {   
          if ( cislo > ( ULONG_MAX / 10 ) ) {  pom = -2; break;}
          cislo = cislo * 10;   
          cislo = cislo + ( c - 0x30 );
      } else if (c != '\n') {
          cislo = -1;
          break;
      }
  }
  if (cislo == -1)
      printf("musis zadat kladne cislo\n");
  if (vstup == 0)      /* a tu uz iba staci porovnat, ci je vstup nula */
      printf("prazdny vstup\n");

  return cislo;

}


Asi mam tu podmienku na zlom mieste? alebo kde je chyba?


Offline

Užívateľ
Užívateľ
C volanie funkcii

Registrovaný: 27.12.08
Prihlásený: 13.12.22
Príspevky: 1874
Témy: 96
Bydlisko: Bratislava,...
Príspevok NapísalOffline : 22.10.2011 14:35

ta podmienka by mala byt medzi
Kód:
cislo = cislo * 10;
a
Kód:
cislo = cislo + (c - 0x30)







_________________
~Listen to your brain, not your heart~
NB1: Lenovo Y500: CPU: Intel Core i7-3630QM; GPU: nVidia GT650M 2GB SLi; RAM: 16GB DDR3; HDD: 1TB + 256GB SSD (m4); LCD: 15,6" 1920x1080; OS: Win8.1 64-bit + Arch Linux 64-bit (UEFI Powered DualBoot)
NB2: Asus K53SJ-SX093: CPU: Intel Core i3-2310M; GPU: Intel HD3000 / nVidia GT520M 1GB Optimus; RAM: 8GB DDR3; SSD: 128GB 840Evo; LCD: 15,6" 1366x768; OS: Win 8.1 Pro 64-bit (UEFI)
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 13.11.07
Prihlásený: 20.08.16
Príspevky: 1702
Témy: 0
Príspevok NapísalOffline : 22.10.2011 14:45

Inak pomocou tak jednoduchej podmienky sa, pravdepodobne (nechce sa mi to skúšať), nepodarí dať do tej premennej presne ULONG_MAX, pretože je tam zaokrúhľovanie pri delení (takže teoreticky by asi bolo možné najskôr tú novú cifru odpočítať od ULONG_MAX a až potom to deliť, prípadne pri cislo == ULONG_MAX/10 kontrolovať, či je c <= ULONG_MAX % 10).


Offline

Užívateľ
Užívateľ
C volanie funkcii

Registrovaný: 27.12.08
Prihlásený: 13.12.22
Príspevky: 1874
Témy: 96
Bydlisko: Bratislava,...
Príspevok NapísalOffline : 22.10.2011 15:43

ignoruj môj predchádzajúci príspevok, zle som pochopil ten kód :D tú podmienku máš na dobrom mieste.. chrono dobre vysvetlil, prečo ti tam nejde zadať číslo ULONG_MAX alebo trocha menšie/väčšie čísla, pokiaľ je ULONG_MAX napr. 9005 a chceš tam zadať 9000-9009, tak v tvojej podmienke vyjde 900 == 900, čo podmienku spĺňa (lebo tam máš iba >), teda ošetri ešte prípad, že cislo == ULONG_MAX/10, pridaním podmienky, či (c-0x30) <= (ULONG_MAX % 10)







_________________
~Listen to your brain, not your heart~
NB1: Lenovo Y500: CPU: Intel Core i7-3630QM; GPU: nVidia GT650M 2GB SLi; RAM: 16GB DDR3; HDD: 1TB + 256GB SSD (m4); LCD: 15,6" 1920x1080; OS: Win8.1 64-bit + Arch Linux 64-bit (UEFI Powered DualBoot)
NB2: Asus K53SJ-SX093: CPU: Intel Core i3-2310M; GPU: Intel HD3000 / nVidia GT520M 1GB Optimus; RAM: 8GB DDR3; SSD: 128GB 840Evo; LCD: 15,6" 1366x768; OS: Win 8.1 Pro 64-bit (UEFI)
Odpovedať na tému [ Príspevkov: 13 ] 


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. Volanie

v Audio programy

3

420

30.07.2012 22:57

p4tooo Zobrazenie posledných príspevkov

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

v Audio programy

1

2168

03.06.2007 20:59

fuco Zobrazenie posledných príspevkov

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

v Kultúra, umenie, filmy, hudba, história, média

0

307

24.11.2019 9:11

fixa Zobrazenie posledných príspevkov

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

v PHP, ASP

2

454

13.02.2009 13:50

beginner Zobrazenie posledných príspevkov

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

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

4

348

06.12.2014 19:57

chrono Zobrazenie posledných príspevkov

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

v JavaScript, VBScript, Ajax

2

629

31.01.2009 15:27

Flety Zobrazenie posledných príspevkov

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

v Ovládače

0

1057

05.10.2008 17:19

konig Zobrazenie posledných príspevkov

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

v JavaScript, VBScript, Ajax

3

409

20.05.2013 0:05

shaggy Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Volanie na pevnú linku - zadara

v Krčma

7

2131

24.10.2009 20:45

InVader Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Telefóny pre volanie cez Skype

v Ostatné

3

366

28.12.2012 20:24

JanoF Zobrazenie posledných príspevkov

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

v Grafické programy

2

4993

23.03.2008 20:35

pepek.namornik Zobrazenie posledných príspevkov

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

v Perl, Python, Ruby, CGI

1

2107

18.07.2010 16:14

ado21 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Android volanie php scriptu z backgroundu

v Android, iOS, Windows Phone (Mobile)

13

548

23.03.2014 14:57

emkej8 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. [OOP] - volanie objektu pomocou zadefinovanej premmennej

v PHP, ASP

2

496

28.09.2008 20:55

javo Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. volanie vb kodu z kompilovaneho suboru

v Delphi, Visual Basic

0

762

01.07.2019 11:06

teddy3005 Zobrazenie posledných príspevkov

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

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

6

378

26.11.2012 16:42

silentasflash 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