OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 25.04.2024, 15:33

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 34 ]  Přejít na stránku 1, 2, 3  Další
Autor Zpráva
PříspěvekNapsal: 03.12.2015, 08:32 
Online
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3674
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
Ja mam jednu hlupu otazku ohladom problemu na ktory som nedavno narazil: Preco cecko nepodporuje takuto syntax ?

static int variable += 8;

:?: :?: :?:


Nahoru
 Profil  
 
PříspěvekNapsal: 03.12.2015, 15:44 
Offline
Radil

Registrován: 27.09.2014, 23:56
Příspěvky: 446
Has thanked: 436 times
Been thanked: 230 times
Možná protože následující řádek znamená to samé a je o znak kratší ?

static int variable = 8;

_________________
ZX Spectrum DELTA, D80, Melodik, XY4150, Aritma 0512
PGP: A6EA 1F93 EF6B D8D1 35AD B6D7 1E79 73E5 1B28 17F9


Nahoru
 Profil  
 
PříspěvekNapsal: 03.12.2015, 16:06 
Online
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3674
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
berk píše:
Možná protože následující řádek znamená to samé a je o znak kratší ?
static int variable = 8;
Nie, toto robi nieco ine, ja potrebujem funkcionalitu toho predchadzajuceho (aj s tym plusom).


Nahoru
 Profil  
 
PříspěvekNapsal: 03.12.2015, 16:47 
Offline
Radil

Registrován: 14.10.2013, 23:12
Příspěvky: 342
Has thanked: 261 times
Been thanked: 25 times
Busy píše:
berk píše:
Možná protože následující řádek znamená to samé a je o znak kratší ?
static int variable = 8;
Nie, toto robi nieco ine, ja potrebujem funkcionalitu toho predchadzajuceho (aj s tym plusom).


staticka promenna int v c je defaultne inicializovana na 0. tvuj zapis je deklarace spojena s inicializaci. jelikoz je predtim tedy hodnota 0, pak zvetsena o 8 bude zase jenom 8, takze kolega pise spravne, ze pokud by tvuj pripad sel zkompilovat, byl by skutecne vysledek 8. zkompilovat to ale nejde, protoze v deklaraci staticke promenne muzes promennou pouze inicializovat a nikoliv pouzit vyraz +=. tedy paklize si myslis nebo ocekavas, ze by v te promenne mohla byt jina hodnota nez 0, pak asi spise chces pouzit zapis:

static int variable; /* pripadne static int variable = <nejaka hodnota int>; je zrejmejsi */
variable += 8;


Nahoru
 Profil  
 
PříspěvekNapsal: 03.12.2015, 22:40 
Offline
Radil

Registrován: 11.12.2013, 17:35
Příspěvky: 322
Has thanked: 31 times
Been thanked: 24 times
Busy píše:
berk píše:
Možná protože následující řádek znamená to samé a je o znak kratší ?
static int variable = 8;
Nie, toto robi nieco ine, ja potrebujem funkcionalitu toho predchadzajuceho (aj s tym plusom).


A kdo nám, soudruzi, řekne, k čemu to je?

_________________
Cesta k osvícení: Commodore 64 / Atari 800XE / Atari XEGS / Amiga 500 / Amiga 1200 / PMD 85


Nahoru
 Profil  
 
PříspěvekNapsal: 04.12.2015, 09:31 
Online
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3674
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
SC1 píše:
Busy píše:
berk píše:
Možná protože následující řádek znamená to samé a je o znak kratší ?
static int variable = 8;
Nie, toto robi nieco ine, ja potrebujem funkcionalitu toho predchadzajuceho (aj s tym plusom).
A kdo nám, soudruzi, řekne, k čemu to je?
No samozrejme ja :)
Potrebujem nejake pocitadielko, ktore sa pri kazdom zavolani funkcie zvecsi o 8 a z ktoreho nasledne beriem nejaky pocet spodnych bitov podla ktorych sa modifikuje dalsia cinnost (aby sa stale nerobilo to iste). Dolezite je, aby sa jeho hodnota zachovala medzi jednotlivymi volaniami funkcie (preto static) a na jeho inicializacnej hodnote nezalezi (tie spodne bity sa aj tak krutia stale dokola).
JohnBlbec píše:
zkompilovat to ale nejde, protoze v deklaraci staticke promenne muzes promennou pouze inicializovat a nikoliv pouzit vyraz +=.
Presne toto mojou otazkou kritizujem. Ak sa moze v ramci prikazu deklaracie vykonat aj dalsi prikaz (priradenie hodnoty daneho lubovolnym vyrazom), preco by to nemohol byt hned aj nejaky vypocet tohto typu ?
JohnBlbec píše:
tedy paklize si myslis nebo ocekavas, ze by v te promenne mohla byt jina hodnota nez 0, pak asi spise chces pouzit zapis:
static int variable; /* pripadne static int variable = <nejaka hodnota int>; je zrejmejsi */
variable += 8;
Praveze nechcem ! Viem ze sa to takto (zlozito na dva prikazy) zapisat da (a asi sa tomu nevyhnem), ale ja by som to mal radsej zapisane vsetko v jednom prikaze. Zdrojak by tak bol kratsi a prehladnejsi. Alebo inak napisane, nejde mi o funkcnost (aj tak by sa to skompilovalo na ten isty kod) ale o taku tu programatorsku krasu zdrojaku ...


Nahoru
 Profil  
 
PříspěvekNapsal: 04.12.2015, 10:16 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 08.07.2013, 00:28
Příspěvky: 1565
Has thanked: 487 times
Been thanked: 642 times
Napiš Stroustrupovi ať to další verze C++ přidá.
Mě zas na C/C++ štve, že kompilátor ze dvou konstantních řetězců nevygeneruje třetí konstantu (taková praktická fajnovost v Delphi).
Příklad:
#define URL _T("http://www...")
LPCTSTR K=_T("Klikni na ")+URL;

EDIT: No vida, můj 128.příspěvek a symbolicky je o programování... :-)

_________________
より良い競争相手からソフトウェアを購入する (。◕‿‿◕。)
Ďábel se skrývá v detailu (staré technické rčení)


Nahoru
 Profil  
 
PříspěvekNapsal: 04.12.2015, 11:41 
Offline
Radil

Registrován: 14.10.2013, 23:12
Příspěvky: 342
Has thanked: 261 times
Been thanked: 25 times
Busy píše:
Praveze nechcem ! Viem ze sa to takto (zlozito na dva prikazy) zapisat da (a asi sa tomu nevyhnem), ale ja by som to mal radsej zapisane vsetko v jednom prikaze. Zdrojak by tak bol kratsi a prehladnejsi. Alebo inak napisane, nejde mi o funkcnost (aj tak by sa to skompilovalo na ten isty kod) ale o taku tu programatorsku krasu zdrojaku ...


pro krasu src a syntax perlicky si asi budes muset vybrat jiny jazyk. zkus treba ruby :-)


Nahoru
 Profil  
 
PříspěvekNapsal: 04.12.2015, 11:46 
Offline
Kecka

Registrován: 30.01.2015, 21:23
Příspěvky: 40
Has thanked: 1 time
Been thanked: 8 times
Citace:
JohnBlbec píše:
zkompilovat to ale nejde, protoze v deklaraci staticke promenne muzes promennou pouze inicializovat a nikoliv pouzit vyraz +=.
Presne toto mojou otazkou kritizujem. Ak sa moze v ramci prikazu deklaracie vykonat aj dalsi prikaz (priradenie hodnoty daneho lubovolnym vyrazom), preco by to nemohol byt hned aj nejaky vypocet tohto typu ?

Protoze rychlost? Kolik takovych vypoctu bude potreba udelat u slozitejsiho programu nez se vubec spusti main? Prijde mi rozumne stavajici reseni a to spocitat pri kompilaci a udelat z toho pole konstant k vhodne seraznym promennym za sebou. Coz u vaseho vyrazu: static int variable += 8; nejde. Pak startup kod, pred zavolani mainu provede jenom kopirovani jednoho bloku a tim nastavi promenne na definovane hodnoty. Kouknete co se deje pred volanim main().
Pro me osobne:
Kód:
static int variable += 8;
postrada i eleganci (individualni), protoze par lidi vlastne nevedelo vcetne me co ma za ucel ta konstrukce. Jako mozkove cviceni a duvod k zamysleni je ale docela fajn, ja jsem treba nevedel, ze static podle normy je vzdy nula ).
Kulich

_________________
Amiga 600 + 2MB Handmade Chip Ram a Gotek


Nahoru
 Profil  
 
PříspěvekNapsal: 04.12.2015, 12:26 
Online
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3674
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
tomascz píše:
Mě zas na C/C++ štve, že kompilátor ze dvou konstantních řetězců nevygeneruje třetí konstantu (taková praktická fajnovost v Delphi).
Příklad:
#define URL _T("http://www...")
LPCTSTR K=_T("Klikni na ")+URL;
Skus to takto:
#define URL "http://www..."
LPCTSTR K=_T("Klikni na " URL);

tomascz píše:
EDIT: No vida, můj 128.příspěvek a symbolicky je o programování... :-)
:thumbup:


Nahoru
 Profil  
 
PříspěvekNapsal: 04.12.2015, 12:47 
Online
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3674
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
kulich.bulich píše:
Citace:
JohnBlbec píše:
zkompilovat to ale nejde, protoze v deklaraci staticke promenne muzes promennou pouze inicializovat a nikoliv pouzit vyraz +=.
Presne toto mojou otazkou kritizujem. Ak sa moze v ramci prikazu deklaracie vykonat aj dalsi prikaz (priradenie hodnoty daneho lubovolnym vyrazom), preco by to nemohol byt hned aj nejaky vypocet tohto typu ?
Protoze rychlost? Kolik takovych vypoctu bude potreba udelat u slozitejsiho programu nez se vubec spusti main? Prijde mi rozumne stavajici reseni a to spocitat pri kompilaci a udelat z toho pole konstant k vhodne seraznym promennym za sebou. Coz u vaseho vyrazu: static int variable += 8; nejde. Pak startup kod, pred zavolani mainu provede jenom kopirovani jednoho bloku a tim nastavi promenne na definovane hodnoty. Kouknete co se deje pred volanim main().
Ziadny startup kod nepotrebujem - ako som uz vyssie napisal, na inicializacnej hodnote premennej nezalezi. To "static" je tam len preto lebo je to lokalna premenna vo funkcii a potrebujem aby si zapametala hodnotu aj po vyskoku z funkcie. Pre nic ine.
kulich.bulich píše:
Pro me osobne:
Kód:
static int variable += 8;
postrada i eleganci (individualni), protoze par lidi vlastne nevedelo vcetne me co ma za ucel ta konstrukce. Jako mozkove cviceni a duvod k zamysleni je ale docela fajn, ja jsem treba nevedel, ze static podle normy je vzdy nula ).
Kulich
Mozno je to urcity sposob, ako odlisit programatorov, ktori len mechanicky pouzivaju programovaci jazyk vopred naucenymi sposobmi, od programatorov, ktori maju nadhlad a vedia s jazykom pracovat kreativne ;) :D :poke:
Ale k veci. Mne osobne zase pride zapis
static int variable += 8;
ovela elegantnejsi ako zapis
static int variable; variable += 8;
A myslim si ze na tom nie je nic nepochopitelneho. Prva cast zapisu static int variable deklaruje premennu, a druha cast variable += 8 zvysi jej hodnotu o 8. Presne tak isto ako pri zapise int premenna = <vyraz>; prva cast zapisu int premenna deklaruje premennu a druha cast zapisu premenna = <vyraz> jej priradi hodnotu.


Nahoru
 Profil  
 
PříspěvekNapsal: 04.12.2015, 13:56 
Offline
Kecálek

Registrován: 07.05.2014, 12:10
Příspěvky: 197
Bydliště: Jbc
Has thanked: 0 time
Been thanked: 39 times
Busy píše:
kulich.bulich píše:
Pro me osobne:
Kód:
static int variable += 8;
postrada i eleganci (individualni), protoze par lidi vlastne nevedelo vcetne me co ma za ucel ta konstrukce. Jako mozkove cviceni a duvod k zamysleni je ale docela fajn, ja jsem treba nevedel, ze static podle normy je vzdy nula ).
Kulich
Mozno je to urcity sposob, ako odlisit programatorov, ktori len mechanicky pouzivaju programovaci jazyk vopred naucenymi sposobmi, od programatorov, ktori maju nadhlad a vedia s jazykom pracovat kreativne ;) :D :poke:
Ale k veci. Mne osobne zase pride zapis
static int variable += 8;
ovela elegantnejsi ako zapis
static int variable; variable += 8;
A myslim si ze na tom nie je nic nepochopitelneho. Prva cast zapisu static int variable deklaruje premennu, a druha cast variable += 8 zvysi jej hodnotu o 8. Presne tak isto ako pri zapise int premenna = <vyraz>; prva cast zapisu int premenna deklaruje premennu a druha cast zapisu premenna = <vyraz> jej priradi hodnotu.


Prijde mi, ze to je nepochopeni inicializace promennych...
Kód:
int funkce (void) {
static int variable = HODNOTA;
int var2 = rand ();
  variable += 8;
  return variable + var2;
}

Promenna variable je staticka, tj. ma svoji pevnou adresu jen pro sebe. Inicializuje se jen jednou po spusteni programu - ale takto je mozne ji inicializovat pouze konstantou, jejiz hodnota je znama behem prekladu/linkovani programu. Inicializace statickych promennych je provadena zpravidla hromadne z dat ulozenych jako soucast programoveho kodu.
Promenna var2 je v registru nebo na stacku a jeji inicializace se provede pri kazdem volani funkce. Proto je mozne ji inicializovat pomoci funkce, takze by bylo mozne take napsat napr. int var2 = variable += 8; Inicializace se v tomto pripade zpravidla provadi jako sled instrukci procesoru, proto je mozne pouzit funkci nebo matematicky vyraz. Jeho hodnota bude vzdy vypocitana z aktualnich hodnot operandu.
Dokonce jde pouzit treba konstrukce int var2 = var2 + 8; Hodnota var2 ale bude zalezet na tom, jaky kod se provadel pred volanim teto funkce.
Nikdy se vsak inicializace promenne neda napsat pomoci operatoru += *= apod. protoze to neni inicializace. Je to zmena hodnoty s vyuzitim puvodni hodnoty...

Jeste doplneni:
Pokud se pricita hodnota 8, bity 0..2 se nemeni. Pokud se ma hodnota pouzivat pro generovani "pseudonahody", pak by bylo dobre pouzit liche cislo.


Naposledy upravil hynek dne 04.12.2015, 14:53, celkově upraveno 1

Nahoru
 Profil  
 
PříspěvekNapsal: 04.12.2015, 14:36 
Offline
Kecka

Registrován: 30.01.2015, 21:23
Příspěvky: 40
Has thanked: 1 time
Been thanked: 8 times
Citace:
Ziadny startup kod nepotrebujem - ako som uz vyssie napisal, na inicializacnej hodnote premennej nezalezi. To "static" je tam len preto lebo je to lokalna premenna vo funkcii a potrebujem aby si zapametala hodnotu aj po vyskoku z funkcie. Pre nic ine.

Ale ano potrebujete ). Pred mainem se chystaji i jine veci.
Citace:
Mozno je to urcity sposob, ako odlisit programatorov, ktori len mechanicky pouzivaju programovaci jazyk vopred naucenymi sposobmi, od programatorov, ktori maju nadhlad a vedia s jazykom pracovat kreativne ;) :D :poke:

Jasne Werich a jeho slovickareni, coz beru jako podobnost s static int variable += 8;, je fajn. Kreativita se da smerovat i jinam. Myslim, ze je dobry kdyz udelate neco co vas prezije a nestane se to, ze kdyz nekdo chce treba vasi myslenku rozvinout, tak prvni vec co udela tak smaze kod a zacne znovu ).
Citace:
Ale k veci. Mne osobne zase pride zapis
static int variable += 8;
ovela elegantnejsi ako zapis
static int variable; variable += 8;
A myslim si ze na tom nie je nic nepochopitelneho. Prva cast zapisu static int variable deklaruje premennu, a druha cast variable += 8 zvysi jej hodnotu o 8. Presne tak isto ako pri zapise int premenna = <vyraz>; prva cast zapisu int premenna deklaruje premennu a druha cast zapisu premenna = <vyraz> jej priradi hodnotu.

Inicializace se provadi jednou za zivot promenne a vy chcete tu hodnotu zvetsovat o 8, vicekrat (podle pouziti). A snazite se zvetsovat cislo o kterem nevite jakou ma vychozi hodnotu (nastesti vam static zajisti jeji nulovani). Vlastne si rikam, kdyby to kompiler prece jenom povolil tak se nam otevira nove moznosti mit v programu chyby, ale rikam si, kde je nejaka vyhoda?

_________________
Amiga 600 + 2MB Handmade Chip Ram a Gotek


Nahoru
 Profil  
 
PříspěvekNapsal: 04.12.2015, 14:50 
Online
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3674
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
hynek píše:
Prijde mi, ze to je nepochopeni inicializace promennych...
...
Nikdy se vsak inicializace promenne neda napsat pomoci operatoru += *= apod. protoze to neni inicializace. Je to zmena hodnoty s vyuzitim puvodni hodnoty...
Znovu opakujem, ja nechcem inicializaciu premennej. Chcem, aby premenna mala svoju pevnu adresu (t.j. nebola ani v registri a ani na stacku) a chcem aby sa jej hodnota pri kazdom zavolani funkcie zmenila (zvysila o konstantu).


Nahoru
 Profil  
 
PříspěvekNapsal: 04.12.2015, 14:56 
Online
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3674
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
kulich.bulich píše:
Citace:
Ziadny startup kod nepotrebujem - ako som uz vyssie napisal, na inicializacnej hodnote premennej nezalezi. To "static" je tam len preto lebo je to lokalna premenna vo funkcii a potrebujem aby si zapametala hodnotu aj po vyskoku z funkcie. Pre nic ine.
Ale ano potrebujete ). Pred mainem se chystaji i jine veci.
A ze kto tu slovickari ;) No ale dobre, mne nevadi ked som chytany za slovicka, tak to radsej napisem znovu a presnejsie: Ziadny startup kod, tykajuci sa konkretne inicializacie tejto premennej, nepotrebujem.
kulich.bulich píše:
... snazite se zvetsovat cislo o kterem nevite jakou ma vychozi hodnotu (nastesti vam static zajisti jeji nulovani). Vlastne si rikam, kdyby to kompiler prece jenom povolil tak se nam otevira nove moznosti mit v programu chyby, ale rikam si, kde je nejaka vyhoda?
Vid tento moj post o kusok vyssie:
Busy píše:
Potrebujem nejake pocitadielko, ktore sa pri kazdom zavolani funkcie zvecsi o 8 a z ktoreho nasledne beriem nejaky pocet spodnych bitov podla ktorych sa modifikuje dalsia cinnost (aby sa stale nerobilo to iste). Dolezite je, aby sa jeho hodnota zachovala medzi jednotlivymi volaniami funkcie (preto static) a na jeho inicializacnej hodnote nezalezi (tie spodne bity sa aj tak krutia stale dokola).
PS: Kompiler kludne moze vypisat warning, ze premenna nie je inicializovana. Nemam s tym problem ;)


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 34 ]  Přejít na stránku 1, 2, 3  Další

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 18 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz