Zakaj je ukaz "goto" grd?

Vse o programiranju na in za PC

Moderatorji: Kroko, tilz0R

Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a Protoncek » 25 Sep 2016, 19:29

Ker ravno poteka mala šola C, je bil tam omenjen tudi goto oz. kako je "grd". Ker tam ni lepo niti primerno, da bi smetili o tem bom raje sprožil posebej debato.
Rabim pa nek tehten razlog, v čem je tole:
Koda: Izberi vse
while(1)
{
  SET_PIN_ON(4, 2);
  SET_PIN_OFF(4, 2);
}

Lepše in preglednejše od tegale:
Koda: Izberi vse
LOOP:
  SET_PIN_ON(4, 2);
  SET_PIN_OFF(4, 2);
goto LOOP;


Namreč, dejstvo je, da če si pravi programer, potem pljuvaš čez goto, če pa ga uporabljaš, pač nisi programer ampak amater.
Zakaj?
In odgovor "ker je grdo" ni niti odgovor niti razlog. Namreč, nekaj je lahko tebi grdo, meni pa ne in obratno, tako da to ne drži vode. Iz istega razloga je tudi več stilov pisanja in postavitve oklepajev.
Rabim bolj resen razlog.

Ne vem... goto je tam zato, da se ga uporablja, ne zato, da se pljuva po njem... :_waiting :_dunno

Pa še eno vprašanje: kako se "strokovno" reši takle pogojni stavek tako, da izgleda "lepo" in razumljivo:

Koda: Izberi vse
if a>15 then goto juhuhu else goto japajade

Namreč, v stavku sta celo dva goto, tako,da to ni samo grdo, ampak strašansko grozovito... :lol:
Uporabniški avatar
Protoncek
 
Prispevkov: 3868
Pridružen: 17 Jan 2015, 21:41
Kraj: Mengeš
Zahvalil se je: 377 krat
Prejel zahvalo: 465 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 97

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a Kroko » 25 Sep 2016, 19:39

Slabo čitljivi kodi pravimo da je grda.
Koda: Izberi vse
LOOP:
  SET_PIN_ON(4, 2);
  SET_PIN_OFF(4, 2);
goto LOOP;

V tem primeru, ko pridemo do labele LOOP še nič ne vemo zakaj je tam. "LOOP:" ne pove prav dosti, "while (1)" pa je povsem jasen.
Pri treh vrsticah je res vseeno, kaj pa če je vrstic več?

Takole:
Koda: Izberi vse
if (a>15)
{
  //juhuhu
}
else
{
  //japajade
};
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4774
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 681 krat
Prejel zahvalo: 1653 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a tilz0R » 25 Sep 2016, 19:40

LOOP: kot takšen na prvi pogled ni jasno, da bo to while 1 zanka.
Medtem, ko je while (1) {} zanka takoj jasna, da ko pride enkrat notri bo težko šel ven, razen če ni break ali return stavka.

Je pa absolutno grše uporabljati GOTO, kot pa WHILE (1) v C jeziku.
Ne me narobe razumet, GOTO je lahko super uporaben, samo ni velikokrat uporabljen, ker se da z bolj preglednimi ukazi ponavadi dobro narediti. Ni pa to vedno res.

Koda: Izberi vse
LOOP:
   Ukaz1;
   Ukaz2;
goto LOOP;


bi lahko inačili z:

Koda: Izberi vse
do {
  Ukaz1;
  Ukaz2;
} while (1);


Pri obeh ni takoj jasno, kaj te čaka, ko prideš tja.

Edit: Kroko me je prehitel za dobor minuto :)
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1815
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 229 krat
Prejel zahvalo: 509 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a Kroko » 25 Sep 2016, 19:46

Goto ni vedno grd. Povsod kadar je koda zaradi goto preglednejša ni grd.
Na primer error handling:
Koda: Izberi vse
{
  bla
  bla
  if (error)
    goto ERROR;
  bla
  if (error)
    goto ERROR;
  bla
  return true;
ERROR:
  //cleanup
  return false;
}
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4774
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 681 krat
Prejel zahvalo: 1653 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a Protoncek » 25 Sep 2016, 20:00

Ok, tole pojasnilo mi je veliko bolj všeč kot največkrat samo klasični "grdo". Razumem.

Ni pa mi čisto jasno tale del odgovor tilz0rja:
Koda: Izberi vse
While(1)
{
...
}


Ter
Koda: Izberi vse
Do
...
...
Loop

Namreč, ravno toliko pri prvem veš, da ne boš šel ven drugače kot z goto, exit... kot pri drugem. Do..loop je ravno tako neskončna zanka.

EDIT: mislim, da mi je tudi to jasno... do..loop je lahko loop UNTIL... :_think
Zadnjič spremenil Protoncek, dne 25 Sep 2016, 20:03, skupaj popravljeno 1 krat.
Uporabniški avatar
Protoncek
 
Prispevkov: 3868
Pridružen: 17 Jan 2015, 21:41
Kraj: Mengeš
Zahvalil se je: 377 krat
Prejel zahvalo: 465 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 97

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a tilz0R » 25 Sep 2016, 20:02

Težko je razložiti na podlagi 2 ukazov.
Naj ima program 1000 vrstic med katerimi neskončno loop-aš. Takrat se po moje pokaže razlika med while (1) ter goto stavkom.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1815
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 229 krat
Prejel zahvalo: 509 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a Protoncek » 25 Sep 2016, 20:04

Ja, sem prehitro napisal.
Torej poanta je predvsem v tem, da takoj neizpodbitno vidiš, da je to neskončna zanka.

Hvala za razlago. Odkar berem, da je goto grd je tole prva prava razlaga.
Uporabniški avatar
Protoncek
 
Prispevkov: 3868
Pridružen: 17 Jan 2015, 21:41
Kraj: Mengeš
Zahvalil se je: 377 krat
Prejel zahvalo: 465 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 97

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a gumby » 25 Sep 2016, 20:06

Pri do-while zanki lahko določiš pogoj, kdaj se konča. Neskončna je samo, če tako hočeš...
Razlika med do-while in "navadno" while zanko je samo v tem, da se tukaj preverja pogoj na koncu zanke.

do-loop pa nima nič s C :mrgreen:
my brain hurts
Uporabniški avatar
gumby
 
Prispevkov: 2573
Pridružen: 14 Jan 2015, 19:49
Kraj: Lendava
Zahvalil se je: 108 krat
Prejel zahvalo: 604 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 63

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a tilz0R » 25 Sep 2016, 20:08

Drži. Tega se bo kakšen asm programer zagotovo posluževal (VolkD), v resnici pa je GOTO v največjem številu uporabljen tako kot je Kroko napisal.
Če moraš predčasno iz funkcije, potem kličeš GOTO, da tam nekaj pobrišeš kakšne flage.

gumby je napisal/-a:Razlika med do-while in "navadno" while zanko je samo v tem, da se tukaj preverja pogoj na koncu zanke.


Drži, samo spet, če je ogromno kode verjetno ni takoj jasno kaj se dogaja.
Glede na to, da si omenil kdaj se pogoj preverja, je potrebno omenit, da se bo do-while koda znotraj bloka vsaj enkrat izvedla, medtem ko pri while ni nujno, da se bo sploh kdaj.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1815
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 229 krat
Prejel zahvalo: 509 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a Kroko » 25 Sep 2016, 20:30

do...while uporabljam samo pri kakšnih kratkih zankah. Verjetno mi je antipatična prav zaradi svoje nečitljivosti.

while se lahko zelo elegantno uporabi takole:
Koda: Izberi vse
while ((read = fread(buffer, 1, buffersize, fp)) > 0)
{
}
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4774
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 681 krat
Prejel zahvalo: 1653 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a Carko » 25 Sep 2016, 20:31

GOTO je "grd" predvsem zato, ker se ga je ponekod precej zlorabljalo in je nastala t. i. "špageti koda", kjer tok programa ne teče lepo od zgoraj navzdol, ampak skače gor in dol.

Je pa GOTO po mojem mnenju še najbolje (legitimno) uporaben, ko imaš več kot en nivo zank in hočeš skočiti ven. Brez Goto-ja rabiš nek flag, ki ga preverjaš v vseh nivojih do vrha:

Koda: Izberi vse
bool gremo_vun;
for (pogoj)
{
   for (drugi_pogoj)
   {
      if (nekaj)
      {
         gremo_vun = true;
         break;
      }
   }
   
   if (gremo_vun)
      break;
}


Ali:
Koda: Izberi vse
for (pogoj)
{
   for (drugi_pogoj)
   {
      if (nekaj)
         goto gremo_vun;
   }
}

gremo_vun:


Če je nivojev še več, je pa razlika sploh očitna ...
Carko
 
Prispevkov: 2350
Pridružen: 10 Jan 2015, 01:46
Zahvalil se je: 160 krat
Prejel zahvalo: 628 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 151

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a igo » 25 Sep 2016, 20:42

Ne vem od kod tak strah pred goto. :_dunno Pri pisanju programov v Zbirniku je treba poznati razliko med klicem podprograma in vrnitvijo iz njega (call xxx, return) ter med skokom nekam (goto). Posledično je v višjih programskih jezikih goto čisto lep ukaz, ki ga redno uporabljam samo za skoke znotraj podprogramov
void podprogram
{
...
}

Če že gremo v podrobnosti, se mi precej bolj čudna zdi uporaba while(1){ ...} .
Tega ne uporabljam nikoli, ampak vedno notri napišem nek pogoj, da lahko ob izpolnjenem pogoju program zapusti zanko
while(spremenljivka ??? nekaj), kjer je ??? operand za primerjanje ( == , != , < , ...).
Posledično uporabljam "break; " samo za prekinjanje "case" stavka ali "for" zanke, ne pa za izhod iz while(1), saj slednje ne pri meni ne obstaja.
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
igo
 
Prispevkov: 1494
Pridružen: 11 Apr 2015, 13:38
Kraj: Krško
Zahvalil se je: 174 krat
Prejel zahvalo: 364 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 35

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a Kroko » 25 Sep 2016, 20:43

Carkotov primer je tudi dober.

V bistvu nas goto "rešuje" v primerih ko C nima drugega primernega mehanizma. Na primer v C# bi za error handling raje uporabil try/catch/finally. Multi-level break pa manjka tako C-ju kot C#-u.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4774
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 681 krat
Prejel zahvalo: 1653 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a Kroko » 25 Sep 2016, 20:54

Obstajajo pa tudi standardi in priporočila.
Na primer https://www.misra.org.uk/MISRAHome/What ... fault.aspx
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4774
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 681 krat
Prejel zahvalo: 1653 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a VolkD » 25 Sep 2016, 20:55

Ni vse samo v lepoti. Včasih je rešitev z goto stavki bolj efikasna po kakem od parametrov - v mojem primeru v dolžini kode in hitrosti izvajanja.
Koda: Izberi vse
int DIV_main()
{
char Wi;

WP02:     
   if (Zppaket==1){                                // **IF01 point   
      Parse_UARTI_buff();                          // razdeli vhodni buffer na parametre.
      Zppaket=0;                                   //
      if (Error!=0) goto WP02;                     // **IF02 če je napaka - napačen paket pojdi dalje na naslednji paket
      if (ID==Pkdo) {                              // **IF03
         Opaket=0;                                 // oddani paket je obkrožil celo pot
         CntOpkt=0;                                // čas oddanega paketa na 0.
         goto WP02;                                //
      }                                            //
      if (ID!=0xff){                               // **IF04
         OddajPaket();                             // oddaj paket, ki je v izhodnem bufferju.
      }                                            //   
      if (Pall==1) {                               // **IF05
         if (Pkdo==0) goto WP03;                   // **IF06
         DIVErr(14);                               //
         goto WP02;                                //
      }                                            //
      if (ID!=Pkomu) {                             // **IF07
         Wi=1;                                     //
WP01:                                              //
         if (Wi==MaxVID) goto WP02;                // **IF08  gre ponovno v while zanko
         if (VID[Wi]!=Pkomu) {                     // **IF09  samo povečaj Wi
            Wi++;                                  //
            goto WP01;                             //
         }                                         //
      }                                            //
WP03:                                              //
      if (Ptip==0) goto WP02;                      // **IF10 
      if (Ptip==1) {                               // **IF11 
         PrirediVP('V');                           //
         goto WP02;                                //
      }                                            //
      if (Ptip==2) {                               // **IF12
         if (Pkdo==0) {                            // **IF13
            PrirediVP('P');                        //
         }                                         //
         else {                                    //
            DIVErr(8);                             // napačen Pkdo za tip 2
         }                                         //
         goto WP02;                                //
      }                                            //
      if (Ptip==3) {                               // **IF14 
         IzvediIzbranoProceduro();                 //
         goto WP02;                                //
      }                                            //
      if (Ptip==4) {                               // **IF15
         if (Pkdo==0) {                            // **IF16
            NastavitevTrigerja();                  //
         }                                         //
         else {                                    //
            DIVErr(07);                            // Napačen Pkdo za ptip 4
         }                                         //
         goto WP02;                                //
      }                                            //
      DIVErr(12);                                  // Napačen ptip 
      return(0);                                   // vrne 0, da se uporabniški del ne more izvajati
   }
   else {
      return(1);                                   // izvaja se uporabniški del programa
   }       
}

Preglednost je bila v tem primeru povsem podrejena velikosti kode.
Da bi se tak program potem sploh dalo razumeti in popravljati sem zanj naredil diagram poteka.
diagr.png


Če bi pisal klasičen C - oziroma takoimenovano struktuirano programiranje, diagram poteka nebi bil potreben.
Moja želja je bila spraviti kodo na 2K in porabo rama pod 512by ker sem hotel s programom zajeti čim več malih mikrokontrolerjev.

Načeloma pa take rešitve niso produktivne zato so slabe. Praviloma se vzame večji bolj zmogljiv mikroprocesor.
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 41694
Pridružen: 29 Dec 2014, 20:49
Kraj: Kačiče (Divača)
Zahvalil se je: 9038 krat
Prejel zahvalo: 5139 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a Protoncek » 25 Sep 2016, 21:08

Malce razmišljam...
Torej ob uporabi while(1) {...} takoj na začetku vemo, da je to neskončna zanka. Do sem vse OK.
Pa recimo, da je koda res dolga. In ob poplavi ukazov seveda lahko pozabimo, da je bil na začetku while(1). Torej, ko pridemo na konec in imamo } se nam niti sanja ne, kam pa zdaj...medtem ko pri goto vemo, da je treba iti na oznako xyz.

Torej while(1) {..} lahko povzroči enako negotovost kot do..while, samo na kontra koncu... :D
Uporabniški avatar
Protoncek
 
Prispevkov: 3868
Pridružen: 17 Jan 2015, 21:41
Kraj: Mengeš
Zahvalil se je: 377 krat
Prejel zahvalo: 465 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 97

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a Kroko » 25 Sep 2016, 21:08

Tale koda ni samo grda ampak je zelo grda. Tako se ne programira. Velikost kode ni izgovor.

@protonček
Pozabljivost je malce za lase privlečen argument. Če pa že potem lahko narediš takole:
Koda: Izberi vse
while(1)
{
  bla
  bla
} //while (1)
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4774
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 681 krat
Prejel zahvalo: 1653 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a VolkD » 25 Sep 2016, 21:14

Kroko je napisal/-a:Tale koda ni samo grda ampak je zelo grda.
True! Tako zelo grda da jo je nemogoče razumeti brez diagrama poteka. Zato sem pa bil primoran ga narediti.
Kroko je napisal/-a:Tako se ne programira.
Običajno res ne, ampak cilj posvečuje sredstvo :_silent
Kroko je napisal/-a:Velikost kode ni izgovor.
Ni izgovor ampak edina možnost. No ni čisto res. Isti algoritem je narejen v asm in je C za vsega 6by daljši.
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 41694
Pridružen: 29 Dec 2014, 20:49
Kraj: Kačiče (Divača)
Zahvalil se je: 9038 krat
Prejel zahvalo: 5139 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a radix » 25 Sep 2016, 21:16

igo je napisal/-a:Če že gremo v podrobnosti, se mi precej bolj čudna zdi uporaba while(1){ ...} .
Tega ne uporabljam nikoli, ampak vedno notri napišem nek pogoj, da lahko ob izpolnjenem pogoju program zapusti zanko
while(spremenljivka ??? nekaj), kjer je ??? operand za primerjanje ( == , != , < , ...).
Kako pa potem izgledajo neskončne zanke? Te se ravno pri mikrokrmilnikih zelo pogosto uporabljajo.

Ravno tako ni nujno, da se v pogoj while zanke vedno da nek logični izraz. Lahko je notri volatile spremenljivka, ki jo hardware spreminja. Ravno tako je lahko notri tudi spremenljivka, ki jo v sami zanki spreminjamo. Ko jo postavimo na 0, se bo izvajanje zanke končalo. Float se v takih primerih ne uporablja zaradi svoje netočnosti. Verjetno sem še kakšen primer pozabil ...

igo je napisal/-a:Posledično uporabljam "break; " samo za prekinjanje "case" stavka ali "for" zanke, ne pa za izhod iz while(1), saj slednje ne pri meni ne obstaja.
Tukaj pa spet nekaj ne štima. For zanka pa vendar ima pogoj in ne vem, zakaj bi v njej bilo potrebno uporabljati break. Seveda razen, če želimo izvajanje predčasno prekiniti. Ampak v te namene se break uporablja tudi v while zankah.
radix
 
Prispevkov: 1469
Pridružen: 04 Feb 2015, 20:19
Kraj: Ljubljana
Zahvalil se je: 226 krat
Prejel zahvalo: 350 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 25

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a peterp » 25 Sep 2016, 21:18

Ko takšna funkcija z n goto stavki v nekem trenutku oz. na določene vhodne podatke odpove, jo je verjetno pravo veselje popravljati. Sploh za nekom drugim :_clap
peterp
 
Prispevkov: 657
Pridružen: 23 Feb 2015, 14:52
Kraj: Maribor
Zahvalil se je: 165 krat
Prejel zahvalo: 112 krat
Uporabnika povabil: gumby
Število neizkoriščenih povabil: 114

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a VolkD » 25 Sep 2016, 21:27

peterp je napisal/-a:Ko takšna funkcija z n goto stavki v nekem trenutku oz. na določene vhodne podatke odpove, jo je verjetno pravo veselje popravljati. Sploh za nekom drugim :_clap
Takrat pa &$(&)%&$$#&&%##( (kolneš) tudi če imaš diagram poteka.
Da ne bo narobe razumljeno tisto kodo sem prilepil zato, da bo vsem jasno, kako je nihče ne razume, ker se je ne da razumeti, brez da bi dušo spustil na njej.
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 41694
Pridružen: 29 Dec 2014, 20:49
Kraj: Kačiče (Divača)
Zahvalil se je: 9038 krat
Prejel zahvalo: 5139 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a igo » 26 Sep 2016, 00:18

Meni je pa ravno diagramček od @VolkD všeč in se povsem znajdem v njemu. Tudi iz pripetega C programa bi zlahka narisal ta diagramček.

Ja, vem, ... na C sem se ponovno vrnil šele pred 2 letoma, vmes sem bil skoraj 18 let na Zbirniku. Če se kje zapletem, rešim kar z labelami in preskakovanjem (goto) preko delov podprograma, ki bi sicer potrebovali polmetrski pogoj v if stavku.

@radix:
Glede pogoja v while(pogoj) si že sam odgovoril, kaj vse je možno stlačiti vanj, namesto (1).
Obširne while zanke uporabljam za kakšne zahtevne načine delovanja, ko vrednost spremenljivke v pogoju tako zelo vpliva na zaporedje izvajanja podprogramov, da naredim kar v obliki
Koda: Izberi vse
while(xx==1)
{
Podprogram1();
Pp2();
Pp3();
Pp4();
} // while(xx==1)
while(xx==2)
{
Pp4();
Pp5();
pp1();
Pp7();
} // while(xx==2)
...



Glede for zanke pa jo prekineš z break, kadar želiš ohraniti vrednost števca, ki hkrati nastopa kot pogoj v zanki
Koda: Izberi vse
for(i=5; i<15; i++) //zanka se v primeru neizpolnjenega pogoja izvede največ 10-krat
{
  ...bla bla
 if(pogoj izpolnjen) {break;} //if
} // for

Če je pogoj predčasno izpolnjen, dobim na izhodu naprimer i=12, sicer bi moral uporabiti dodatno spremenljivko, ji pred vstopom v for (i=0; i<10; i++) določiti vrednost 5, jo sproti povečevati z i++ in z if stavkom postaviti i = 20, da se predčasno prekine izvajanje for zanke.
Pri kakšnih vratolomnih programih pride prav.

Sem malo pobrskal po spominu in iz for in while zanke še nisem nikoli niti poskušal izstopiti z goto (moram enkrat preveriti, kako bo to všeč prevajalniku). Kadar je bilo treba, sem vedno predčasno izpolnil pogoj oziroma z break prekinil for zanko. Goto pa redno uporabljam v if stavkih.
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
igo
 
Prispevkov: 1494
Pridružen: 11 Apr 2015, 13:38
Kraj: Krško
Zahvalil se je: 174 krat
Prejel zahvalo: 364 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 35

Re: break

OdgovorNapisal/-a radix » 26 Sep 2016, 01:23

igo je napisal/-a:Glede pogoja v while(pogoj) si že sam odgovoril, kaj vse je možno stlačiti vanj, namesto (1).
Še enkrat preberi vprašanje. Ga bom citiral, da ga ni treba iskati.
radix je napisal/-a:Kako pa potem izgledajo neskončne zanke? Te se ravno pri mikrokrmilnikih zelo pogosto uporabljajo.
Torej zanima me, kako ti implementiraš neskončne zanke, saj praviš:
igo je napisal/-a:... ne pa za izhod iz while(1), saj slednje ne pri meni ne obstaja.
Mogoče s for(;;)? Kako drugače?

igo je napisal/-a:Glede for zanke pa jo prekineš z break, kadar želiš ohraniti vrednost števca, ki hkrati nastopa kot pogoj v zankiČe je pogoj predčasno izpolnjen, dobim na izhodu naprimer i=12, sicer bi moral uporabiti dodatno spremenljivko, ji pred vstopom v for (i=0; i<10; i++) določiti vrednost 5, jo sproti povečevati z i++ in z if stavkom postaviti i = 20, da se predčasno prekine izvajanje for zanke.
Zato ni treba misliti, da se break ne uporablja pri while zankah. Isti efekt se lahko doseže tudi tako:
Koda: Izberi vse
i = 5;
while (i++<15) {
    blah();
    if (pogoj izpolnjen) {
        break;
    }
}
radix
 
Prispevkov: 1469
Pridružen: 04 Feb 2015, 20:19
Kraj: Ljubljana
Zahvalil se je: 226 krat
Prejel zahvalo: 350 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 25

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a smatjaz » 26 Sep 2016, 07:46

Pozdravljeni.

Uporaba "goto" po mojem ni nič napačna in ne slaba, če točno veš kaj s tem delaš. v določenih primerih celo poenostavi kodo. Je pa potrebno biti zelo previden.
Na fakulteti je profesor pri programiranju sicer rekel, da si avtomatsko padel, če si uporabil ukaz "goto". Toda v compiler-ju pa ta ukaz kljub vsemu obstaja.

Po mojem mnenju je ukaz "goto" lahko "nevaren", ker gre za brezpogojni skok, ki lahko pri napačni uporabi pomeni "stack ovferflow". Kaj to pomeni v praksi?
Compiler vse lepo prevede, naprava deluje tako, kot pričakujemo, ampak se po nekaj časa, ko se zapolni RAM, obesi. Ta čas je odvisen od napisanega programa in je lahko sekunda, minuta, ura ali celo teden.

LP.M
Uporabniški avatar
smatjaz
 
Prispevkov: 112
Pridružen: 13 Feb 2015, 09:22
Zahvalil se je: 0 krat
Prejel zahvalo: 2 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 0

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a Kroko » 26 Sep 2016, 09:25

V javi je goto je rezervirana beseda, prevajalnik pa je ne pozna :-)

Tule se lahko o goto kregamo kakorkoli želimo. Dejstvo je, da je nečitljiva koda slaba zaradi vzdrževanja, da goto (lahko) povzroči nečitljivo kodo in da zaradi goto lahko neopravimo certifikacije katera je v nekaterih branžah obvezna.

Razumem, da je igo-tu, ki je 18 let nabijal zbirnik, goto domač. Ampak nov in svež programer se mora naučiti drugače. Vsak program se da narediti brez goto. Šele ko to znaš, si se naučil dovolj, da lahko goto varno in primerno uporabljaš.

http://eli.thegreenplace.net/2009/04/27 ... dling-in-c
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4774
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 681 krat
Prejel zahvalo: 1653 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a MarkoM » 26 Sep 2016, 09:55

Sicer nisem profi programer, v C-ju programiram dobrih 10 let in nikoli nisem uporabil goto. Enkrat me je mikalo, vendar sem stvar drugače rešil. Pred tem sem nekaj let nabijal assembler in skušnjava pri prehodu v C, da bi uporabil goto je bila zelo velika.
MarkoM
 
Prispevkov: 971
Pridružen: 29 Jan 2015, 13:11
Kraj: Pohorje (Maribor)
Zahvalil se je: 127 krat
Prejel zahvalo: 218 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 18

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a jmivsek » 26 Sep 2016, 10:07

GOTO je postal 'grd' po slavnem pismu danskega znanstvenika Dijstre z naslovom Go To Statement Considered Harmful, ki ga je leta 1968 poslal uredniku revije IEEE. Tisti čas se je začelo rojevati tudi strukturirano programiranje, katerega glavno načelo je, da ima vsaka struktura v programu (if, for, case itd.) točno en vhod in točno en izhod. Izhod je vedno na koncu strukture. S tem postane izvajanje programa predvidljivo, saj vedno vemo, kdaj se nek, recimo for stavek, začne in kdaj konča. Z GOTO je pa predvidljivosti konec, kajti z njim lahko skočiš kamorkoli v programu.
Vem, da nič ne vem (Sokrat)
Uporabniški avatar
jmivsek
 
Prispevkov: 1086
Pridružen: 18 Jan 2015, 01:20
Kraj: Ajdovščina
Zahvalil se je: 1486 krat
Prejel zahvalo: 356 krat
Uporabnika povabil: S52O
Število neizkoriščenih povabil: 63

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a igo » 26 Sep 2016, 11:00

@radix:
Pardon. Pisal si v množini, verjetno pa si mislil na tisto "eno in edino" while(1) zanko.

Mi je kar malo nerodno, a moj program izgleda takole:
Koda: Izberi vse
void main()
{
  pVseNastavi();
GlavnaZ:
  ....
 klicanje podprogramov
 ....
goto GlavnaZ; // glavna zanka
//////////
void pVseNastavi(){...};
void pPodprogram1(){....};
...
void pPodprogeamN(){....};
} // main
Znotraj podprogramov je pa "marsikaj", ampak se znajdem in je pregledno.
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
igo
 
Prispevkov: 1494
Pridružen: 11 Apr 2015, 13:38
Kraj: Krško
Zahvalil se je: 174 krat
Prejel zahvalo: 364 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 35

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a tilz0R » 09 Okt 2016, 22:05

Prvič sem danes uporabil GOTO stavek, kjer lahko tudi rečem, da je uporaben.
Tako kot pri Kroko-tu, za brisanje spremenljivk pred izhodom iz funkcije ;)
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1815
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 229 krat
Prejel zahvalo: 509 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a S53MB » 09 Okt 2016, 23:54

Namesto goto je vsaj v C++/C# na voljo throw za javljanje izjem oz. napak. Napako "kasneje" uloviš v try catch bloku.
https://msdn.microsoft.com/en-us/library/6dekhbbc.aspx
https://msdn.microsoft.com/en-us/library/0yd65esw.aspx
Polmer je za nepopolne krožnice in teoretike
S53MB
 
Prispevkov: 91
Pridružen: 29 Jan 2016, 15:27
Kraj: Novo mesto JN75NS
Zahvalil se je: 56 krat
Prejel zahvalo: 12 krat
Uporabnika povabil: MadMax
Število neizkoriščenih povabil: 1

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a tilz0R » 09 Okt 2016, 23:55

To je v visokonivojskih jezikih možno. Ne pa pozabiti, da to požre ogromno resourcev po nepotrebnem.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1815
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 229 krat
Prejel zahvalo: 509 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a SamoBr » 14 Okt 2016, 18:20

Lepota je tu manj pomembna stvar. Če zadeva dela je to to.

To je kot z žensko: pravijo da je lahko lepa ali pametna. Neumne noče nihče. Ostane nam da je pametna.

Ubogi tisti, ki imajo oboje. Je dovolj zapažena, da odide z drugimi in dovolj pametna, da tega ne vemo :D
V vsakem primeru je fino, če naredi vse kar od nje pričakujemo. :_dunno
SamoBr
 
Prispevkov: 2798
Pridružen: 14 Jun 2015, 14:45
Zahvalil se je: 129 krat
Prejel zahvalo: 251 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 48

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a mujo » 14 Okt 2016, 18:55

SamoBr je napisal/-a:Lepota je tu manj pomembna stvar. Če zadeva dela je to to.

Če imaš tako mnenje potem res raje ne uporabljaj goto stavka.

V temi se je dobro obrazložilo kaj je težava goto in kje je smiselna njegova uporaba. Goto stavek lahko uporabiš tudi namesto zank, ampak ni smiselno/pametno.
Zato je mogoče tudi boljše, da velja "pravilo", ne uporabljaj goto. Če ga pa uporabiš pa pride dinozaver in te poje.
mujo
 
Prispevkov: 734
Pridružen: 21 Jan 2015, 10:50
Kraj: MB
Zahvalil se je: 1 krat
Prejel zahvalo: 150 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 18

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a oobuco » 03 Apr 2017, 15:12

Tole je sicer že prastara zadeva, ampak se bom vseeno še jaz pritaknil s svojim videnjem zadeve.

Najprej se strinjam, da je uporaba GOTO v višjih programskih jezikih res grda, no večinoma pa tako ali tako ne obstaja.

Je pa tu neka podrobnost, ki loči programerja od programerja.

Večina je tistih, ki pišejo software za neko znano napravo, pa naj bo to PC ali mikrokontroler.
Manjšina pa je tistih, ki napravo naredijo, pa potem pišejo software zanjo - v bistvu so to elektroniki ne programerji.

Prvi imajo običajno na voljo veliko spomina, pa veliko procesorsko moč ..., se najdejo tudi kakšni, ki rečejo, tale mašina je pa prešvoh, da bi se dalo tak in tak software za njo napisati.
Drugi se trudijo, da bi bila naprava čim manjša, cenejša in kar se da enostavna, jim pa v tem smislu zbirnik ni odveč, ker navsezadnje je le ta najbolj povezan s samo elektroniko.

Tako, da se s pravim software-om v bistvu ukvarjajo samo prvi.
Drugi pa se v resnici ukvarjajo z neke vrste prilagajanjem elektronike - čemur je zbirnik pravzaprav namenjen, še posebej, ko gre za lovljenje vsake mikrosekunde in vsakega byta.

Prvim je torej GOTO grd, kar je popolnoma naraven odziv.
Drugim pa je vseeno, saj ne gre za software v tipični obliki.


Hja pa, vsak prevajalnik je bil nekoč napisan v zbirniku, a ne.

In mislim, da bo evolucija prinesla mikroprocesorje, ki bodo razumeli zgolj višje programske jezike in bo zbirnik postal zgodovina - vsaj na nivojih, kjer je resursov veliko.
In vsak dan jih je več.
Sem zadnjič za hec preizkusil eno matematično zadevo v zbirniku, ki sem jo naredil še za 286 s koprocesorjem.
Na mojem ne ravno špica računalniku zadeva deluje s strašljivo hitrostjo, čeprav že na 286 ni bila ravno počasna, zato je tudi bila napisana v zbirniku.

GOTO BEER - he vseeno bolje zveni kot While
Pred EUR sem bil SIT! (sposojeno z grafita)
Uporabniški avatar
oobuco
 
Prispevkov: 56
Pridružen: 19 Jan 2015, 15:05
Kraj: Šentvid pri Stični
Zahvalil se je: 23 krat
Prejel zahvalo: 17 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 6

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a Protoncek » 03 Apr 2017, 16:12

...in potem se trudiš, da bi napisal "lep" program brez ukazov goto, na koncu, ko stisneš "compile" in pogledaš kodo, pa je kljub vsemu v njej polno ukazov JMP ali JR(jump, jump relative, enakovredno ukazu goto oz. If...then goto...) :_rolling :_banghead
Uporabniški avatar
Protoncek
 
Prispevkov: 3868
Pridružen: 17 Jan 2015, 21:41
Kraj: Mengeš
Zahvalil se je: 377 krat
Prejel zahvalo: 465 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 97

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a VolkD » 03 Apr 2017, 17:08

Protoncek je napisal/-a:...in potem se trudiš, da bi napisal "lep" program brez ukazov goto, na koncu, ko stisneš "compile" in pogledaš kodo, pa je kljub vsemu v njej polno ukazov JMP ali JR(jump, jump relative, enakovredno ukazu goto oz. If...then goto...) :_rolling :_banghead
Umetnost brez trikov ne obstaja.
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 41694
Pridružen: 29 Dec 2014, 20:49
Kraj: Kačiče (Divača)
Zahvalil se je: 9038 krat
Prejel zahvalo: 5139 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a gregoral » 03 Apr 2017, 22:57

oobuco je napisal/-a:In mislim, da bo evolucija prinesla mikroprocesorje, ki bodo razumeli zgolj višje programske jezike in bo zbirnik postal zgodovina - vsaj na nivojih, kjer je resursov veliko.
In vsak dan jih je več.

Nevem točno kako si to predstavljaš, ampak po mojem je tale izjava čisto nepremišljena ali pa naivna.

Oziroma ali lahko bolj točno pojasniš kaj naj bi to pomenilo da:
mikroprocesor razume zgolj višje programske jezike

Kot programer bi tako izjavo bolj pričakoval od kakega politika, ki je na tečaju slišal da bomo že čez nekaj let programirali samo tako da bomo zlagali kockice in jih povezovali med sabo.

Na koncu mikropocesor v vsakem primeru premetava številke zapisane z ničlami in enicami.
"Višji" programski jezik ne prinaša nobene prednosti kar se tiče izvajanja programov.

Glede na trende bo pa potrebno za mlajše programerje uvest še kakšen Cici-C#, da pa ja ne bodo naredili kakšne neumnosti.

Seveda so se in se bodo pojavljale ideje v tem smislu, ampak do sedaj so še vse imele nekaj zelo motečih lastnosti zaradi katerih so pogorele:
- "višji" programski jezik je bil implementiran "programsko" v mikrokodi
- vse kar ni x86 ( oziroma ARM ) je ( zaenkrat žal ) obsojeno na nišno uporabo

Poglejmo malo zgodovino:
- Transmeta - fail ( nevem če sploh še živi )
- Itanium - fail ( nišna uporaba )
- Motorola - fail ( nišna uporaba )
- Sun niagara - fail / ( nišna uporaba )
- IBM Power - fail / ( nišna uporaba )
- Sony Cell - fail / ( nišna uporaba )
- Atom - fail / ( nišna uporaba )
- ARM - eden od redkih, ki je uspel ( low power )

Evo takle mamo.
Ko se enkrat ena arhitektura "zasidra" je praktično ni možno zamenjat.
Ko se je uspel zasidrat ARM ( Intel ga ni jemal dovol resno ), ga Intel nikakor ne uspe izrinit iz področja telefonof in tablic.

Kdorkoli bo dal na trg karkoli kar ne izvaja x86/x64 ali ARM kode hitreje od "originala", bo imel trnovo pot, ki se bo zelo verjetno končala z neuspehom.

Poglejmo Apple, ki je zadnje čase kar dejaven pri razvoju lastnih procesorjev ( CPU in v bodoče tudi GPU).
Kaj so vzeli za osnovo? ARM.

Le zakaj niso šli v razvoj nečesa popolnoma novega?
Zato, ker obstaja na stotine orodij, programov in navsezadnje programerjev, ki tehnologijo poznajo.

Oh, skoraj sem pozabil, v razvoju je nova revolucionarna zasnova procesorja:

The Mill CPU Architecture
http://millcomputing.com/docs/pipelining

A kaj ko je že 13 let mogoče že več v procesu razvoja, patentiranja, ...
Skratka dvomim, da bo kadarkoli uspela.

Razlogov je več, glavni pa je ta, da jo bodo "ubili" glavni igralci preden bo karkoli resnega.

"realističen" pogled ( kakor jaz gledam na to je ):
Nova arhitektura lahko uspe samo če najde popolnoma novo tržno nišo.
Ta niša mora biti dovolj majhna, da se velikim ne splača vstopiti.
Mora imeti tudi potencal za rast, ki ob vstopu na trg še ne obstaja.
Plus položaj lune mora biti točno na sredini med Jupitrom in Saturnom natančno ob 15:37 GMT.
ARM-u je uspelo, nedvomno bo tudi drugim, ampak kakor je zdaj videti Luna še nekaj časa ne bo na pravem mestu.

Aja tema je o GOTO:
- goto je "grd" o tem ni dvoma
- goto je "uporaben" o tem ni dvoma
- goto ni "nujen" o tem ni dvoma ( gre tudi brez goto )

Evo, še par misli o GOTO:
Jaz osebno ga že dolgo nisem uporabil, ker se da vse napisat čisto lepo brez goto ukaza.
Seveda je pa potrebno malo bolj premisliti kako napisati kodo če nočemo uporabiti goto.
To da razmislimo o tem kako bomo napisali kodo da ne bo noter goto pa tudi ni slabo.
Dober programer mora razmišlajti o tem, kako bo programiral da ne bodo nastali "špageti".
Pa če uporabi goto ali pa ne.

lp
Zadnjič spremenil gregoral, dne 03 Apr 2017, 23:11, skupaj popravljeno 1 krat.
gregoral
 
Prispevkov: 167
Pridružen: 19 Jan 2015, 11:12
Kraj: Ljubljana
Zahvalil se je: 4 krat
Prejel zahvalo: 75 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 10

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a mujo » 03 Apr 2017, 23:09

oobuco je napisal/-a:In mislim, da bo evolucija prinesla mikroprocesorje, ki bodo razumeli zgolj višje programske jezike in bo zbirnik postal zgodovina - vsaj na nivojih, kjer je resursov veliko.

ARM Jazelle.. Tvoj komentar na to?
mujo
 
Prispevkov: 734
Pridružen: 21 Jan 2015, 10:50
Kraj: MB
Zahvalil se je: 1 krat
Prejel zahvalo: 150 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 18

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a gregoral » 03 Apr 2017, 23:33

mujo je napisal/-a:ARM Jazelle.. Tvoj komentar na to?

Če je bilo to vprašanje namenjeno meni, potem bi odgovoril takole:

1. Kje se to sploh uporablja ( gre za nišno uporabo ali se to dejansko kje uporablja? )

2. Jazelle:
the entire VM state is held within normal ARM registers,
allowing compatibility with existing operating systems and interrupt handlers unmodified
( superseeded by ThumbEE )

3. ThumbEE:
Recognised bytecodes are converted into a string of one or more native ARM instructions.
On 23 November 2011, ARM Holdings deprecated any use of the ThumbEE instruction set.
ARMv8 removes support for ThumbEE.

Torej če je bilo vprašanje namenjeno kot odgovor na moj post, potem je odogovor jasen:
Tole spada v kategorijo: demo/experimental/deprecated/fail/niche

lp
gregoral
 
Prispevkov: 167
Pridružen: 19 Jan 2015, 11:12
Kraj: Ljubljana
Zahvalil se je: 4 krat
Prejel zahvalo: 75 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 10

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a mujo » 03 Apr 2017, 23:44

gregoral je napisal/-a:Če je bilo to vprašanje namenjeno meni...

Vprašanje je bilo namenjenu oobuco (njega sem citiral).
mujo
 
Prispevkov: 734
Pridružen: 21 Jan 2015, 10:50
Kraj: MB
Zahvalil se je: 1 krat
Prejel zahvalo: 150 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 18

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a VolkD » 03 Apr 2017, 23:48

Karkoli počel, je shema taka, da ima program v mikrokontrolerju (drugod tudi) inicializacijo in glavno zanko. Ta pa se v končni fazi prevede v strojni jezik, ki nekje v vsaj eni točki spremeni Program counter na vrednost, ki je nižja od prejšnje ( to namreč GOTO je).

Program, ki bi ne imel tega, bi ne imel glavne zanke. Takega še nisem videl. Tudi programi, ki tečejo na PC-jih ali drugih velikih sistemih se lahko smatrajo le kot en task operacijskega sistema, ki pa ima prav tako zanko.

Kakorkoli se obrneš, je rit zadaj,......
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 41694
Pridružen: 29 Dec 2014, 20:49
Kraj: Kačiče (Divača)
Zahvalil se je: 9038 krat
Prejel zahvalo: 5139 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a oobuco » 04 Apr 2017, 06:10

mujo je napisal/-a:
gregoral je napisal/-a:Če je bilo to vprašanje namenjeno meni...

Vprašanje je bilo namenjenu oobuco (njega sem citiral).



No, mogoče je to samo lastovka.

Vsekakor pa sem napisal "evolucija".
Pred EUR sem bil SIT! (sposojeno z grafita)
Uporabniški avatar
oobuco
 
Prispevkov: 56
Pridružen: 19 Jan 2015, 15:05
Kraj: Šentvid pri Stični
Zahvalil se je: 23 krat
Prejel zahvalo: 17 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 6

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a igo » 04 Apr 2017, 08:40

Da boste še Arduino programerji imeli kaj od te teme:


Poiščite datoteko avr-objdump.exe .
Običajno je nekje v:
C:\Program Files\Arduino\hardware\tools\avr\bin\avr-objdump.exe
Celotno pot do nje si morate shraniti.

Nato ustvarite novo .bat datoteko (z imenom naprimer Pretvori2ASM.bat) v menuju SentTo (Pošlji).
C:\Documents and Settings\uporabnik\SendTo
To naredite tako, da .txt datoteki preimenujete končnico v .bat (kako to storiti pri novejših Oknih, naj kdo drug napiše).
V tej.bat datoteki naj piše samo:
C:\Program Files\Arduino\hardware\tools\avr\bin\avr-objdump.exe -S %1 > %1%.txt

Nato ustvarite povsem Novo mapo v Novi mapi (dve globini torej) nekje na D. Naprimer:
D:\ArduinoTemp\Zacasno\

Nato zaprite Arduino IDE in poiščite datoteko preferences.txt v mapi:
C:\Program Files\Arduino\lib
Nekje v njej piše:
build.path=build
Tisto zakomentirajte:
#build path=build
in spodaj napišite:
build.path= D:\ArduinoTemp\Zacasno
ter to seveda shranite.


Ko boste naslednjič v Arduino IDE kliknili na ikono ( v' ) Compile, se bo znotraj mape D:\ArduinoTemp\Zacasno\ pojavilo ogromno datotek.

Najbolj zanimiva ima končnico .cpp.elf (naprimer LedUtripa.cpp.elf).
Z DesnimMišGumbom kliknite na .cpp.elf in izberite:
Pošlji -> Pretvori2ASM.bat
oziroma
Send To -> Pretvori2ASM.bat

Znotraj mape D:/ArduinoTemp/Zacasno/... se bo med ostalimi datotekami pojavila nova .txt s končnico
.cpp.elf.txt (naprimer LedUtripa.cpp.elf.txt)

To datoteko potem odprite s kakšnim normalnim urejevalnikom besedila (naprimer Notepad++) in ... :_bow :_bow
UŽIVAJTE V POGLEDU NA ZBIRNIK
(in milijon ukazov rjmp :? )
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
igo
 
Prispevkov: 1494
Pridružen: 11 Apr 2015, 13:38
Kraj: Krško
Zahvalil se je: 174 krat
Prejel zahvalo: 364 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 35

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a Kroko » 04 Apr 2017, 08:48

Nehajte nakladat o jmp-jih v zbirniku. Nimajo nobene veze s to temo. Tema je o uporabi "goto" stavka v višjih jezikih.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4774
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 681 krat
Prejel zahvalo: 1653 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a tilz0R » 04 Apr 2017, 08:59

To je res nesmisel tega, kaj je v zbirniku in kaj ne.
Nas lahko lepo briga, kaj prevajalnik naredi, če se programer zgubi med vsemi temi "goto" skoki.

CPU se nebo zmedel, njega jumpi ne motijo, saj je za to narejen in tako dela (klici funkcij, if, while...). Kvečjemu se bo zmedel zaradi deljenja z 0 ali null pointer-ja (in podobno).
Človek pa težko z glavo skače po kodi gor pa dol pa gor pa dol in išče delovanje programa, zato je treba iskati načine, kako narediti flow programa linearen.

Lep primer so tukaj Protothreadi od Adam Dunkelsa. S pomočjo switch stavka, macrojev in "local continuation", naredijo skoke med kodo linearno za uporabnika.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1815
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 229 krat
Prejel zahvalo: 509 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a VolkD » 04 Apr 2017, 09:27

tilz0R je napisal/-a:Človek pa težko z glavo skače po kodi gor pa dol pa gor pa dol in išče delovanje programa.
Ja, res je - zelo težko. Ni to naravni način razmišljanja. Že če imaš za it dvakrat iz iste točke do nekega cilja, si večina ljudi izbere drugo pot, tako, da nastane neka krožna pot in ni treba razmišljati - aha ti sem že bil, pa tam nekje mora biti to,...

Ampak zato imamo pa diagram poteka. Ta reši večino teh težav, če je le dobro narejen.
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 41694
Pridružen: 29 Dec 2014, 20:49
Kraj: Kačiče (Divača)
Zahvalil se je: 9038 krat
Prejel zahvalo: 5139 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a Krampus » 04 Apr 2017, 10:36

Malo glupo vprašanje. :_waiting

Kaj so pa knjižnice, podprogrami, funkcije...
Ali to niso skoki oz GOTO s parametri?
Uporabniški avatar
Krampus
 
Prispevkov: 675
Pridružen: 18 Jan 2015, 16:32
Kraj: Središče ob Dravi
Zahvalil se je: 265 krat
Prejel zahvalo: 123 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 26

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a gregoral » 04 Apr 2017, 11:09

Krampus je napisal/-a:... Ali to niso skoki oz GOTO s parametri?

Ja če bi zavzeli tako stališče, potem je pa že kar vsak odločitveni/pogojni stavek goto.
Taki bi bili potem: if, for, repeat, while, loop, break, continue, switch, case, return, exit, ...

GOTO je "problematičen", ker omogoča narediti zares nepregledno kodo, ki je ne razume nihče razen avtorja.
Pogosto pa čez določen čas niti avtor ne ve točno kako koda deluje.

Nekako tako kakor juha:
- neslana juha večini ne odgovarja
- preslana juha večini ne odgovarja, predvsem pa ni zdrava

lp
gregoral
 
Prispevkov: 167
Pridružen: 19 Jan 2015, 11:12
Kraj: Ljubljana
Zahvalil se je: 4 krat
Prejel zahvalo: 75 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 10

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a tilz0R » 04 Apr 2017, 11:13

Nekateri bodo nasprotovali kakorkoli obrneš :)

tilz0R je napisal/-a:CPU se nebo zmedel, njega jumpi ne motijo, saj je za to narejen in tako dela (klici funkcij, if, while...). Kvečjemu se bo zmedel zaradi deljenja z 0 ali null pointer-ja (in podobno).
Človek pa težko z glavo skače po kodi gor pa dol pa gor pa dol in išče delovanje programa, zato je treba iskati načine, kako narediti flow programa linearen.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1815
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 229 krat
Prejel zahvalo: 509 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: Zakaj je ukaz "goto" grd?

OdgovorNapisal/-a Kroko » 04 Apr 2017, 11:24

Ne, niso.

goto zagovorniki dajejo za primer programe, kjer se ne zgodi kaj dosti več kot prižiga nekaj vhodov in bere nekaj izhodov.
Tudi diagram poteka ne reši nobene težave. Dokler je program tako enostaven, da je lahko diagram na papirju, ga imam lahko tudi v spominu. Takrat me tudi goto ne bo zmedel.

Ko pa je govora o več 100k vrsticah in kjer ima dokumentacija (diagrami) več 100 tiskanih strani takrat je zelo pomembno, da je sama koda že dokumentacija. Se pravi, da programiramo tako, da razen kratkih komentarjev v kodi ni potrebna nobena druga dokumentacija, pa se bo kljub temu vsak dober programer, ki kodo prvič vidi, znašel in v zelo kratkem času delo nadaljeval ali popravil. V takšnem parogramu goto nima kaj iskati.

Kar poglejte za primer kakšne arduino copy/paste knjižnice. Nekatere izgledajo preprosto, jih ni problem razumeti in uporabiti medtem ko druge izgledajo zapleteno in nihče ne ve, kaj sploh delajo.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4774
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 681 krat
Prejel zahvalo: 1653 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Naslednja

Vrni se na Programski jeziki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost