OldComp.cz

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


Právě je 26.04.2024, 12:05

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 Předchozí  1, 2, 3  Další
Autor Zpráva
PříspěvekNapsal: 04.12.2015, 15:19 
Offline
Radil

Registrován: 08.10.2013, 18:00
Příspěvky: 297
Has thanked: 13 times
Been thanked: 228 times
Busy píše:
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 ;)

Bohužel kompilátor to takhle nikdy přeložit nesmí ! Jde s tím nesouhlasit, ale nic se s tím nedá dělat, toto chování (automatická inicializace static objektů na nulu, nemají-li v deklaraci přiřazenou hodnotu) je přímo standardizováno v ISO/IEC 9899:1999. :(


Nahoru
 Profil  
 
PříspěvekNapsal: 04.12.2015, 20:03 
Offline
Radil
Uživatelský avatar

Registrován: 12.05.2013, 20:32
Příspěvky: 457
Bydliště: Kladno
Has thanked: 46 times
Been thanked: 118 times
Static int variable +=8; nemůže fungovat, protože k něčemu co neexistuje nemůžeš nic přičítat. Int variable; (je fuk jestli static) = vždycky null. Tedy nic. Před použítím +=8 musí být hodnota variable známa. :)

_________________
>>eLeMeNt, MB03+, Amiga 1200, ZX Spectrum 128 +2A, ZX Spectrum+, Didaktik Gama, LnxSpectrum, LnxTracker, LnxAmigaImageConvertor, https://www.ilnx.cz <<


Nahoru
 Profil  
 
PříspěvekNapsal: 04.12.2015, 20:34 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3674
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
Z hrozou zistujem, ze cela moja otazka, a vlakno okolo nej, bolo vyseparovane a vlozene ako samostatna diskusia...
A preto pred tym, nez budem pokracovat, urobim take mensie verejne vyhlasenie :dcod:
Umyselne som tuto moju otazku polozil v diskusii Hloupé otázky, na které chcete znát odpověď, pretoze moju otazku povazujem za hlupu a v podstate nepodstatnu, a pokladal som ju tak trosku (uplne) s istou nadsadzkou. V ziadnom pripade to nepovazujem za nejaky vazny programatorsky problem, ale iba za taku mensiu recesiu, namierene voci (niekedy zvezujucim) pravidlam syntaxe :)


Nahoru
 Profil  
 
PříspěvekNapsal: 04.12.2015, 20:43 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3674
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
nobomi píše:
toto chování (automatická inicializace static objektů na nulu, nemají-li v deklaraci přiřazenou hodnotu) je přímo standardizováno v ISO/IEC 9899:1999. :(
Ale ved ja nic proti tomu nemam, nech si tu premennu kludne inicializuje hoci aj na nulu. Ani s tym nemam ziadny problem :)
Lanex píše:
Static int variable +=8; nemůže fungovat, protože k něčemu co neexistuje nemůžeš nic přičítat.
Rozhodne nesuhlasim. Premenna je deklarovana ako static, a uz z tohto vyplyva, ze ma priradene svoje pevne pametove miesto. Takze, premenna urcite existuje. Dalej, bez ohladu na to co robi startup kod, bajty na tomto pametovom mieste maju vzdy urcitu hodnotu, a tym padom aj premenna ma urcitu hodnotu.
Lanex píše:
Před použítím +=8 musí být hodnota variable známa. :)
Zase nesuhlasim. Lepsie si precitaj co som pisal predtym, konkretne ucel naco to vobec potrebujem. A zistis ze hodnotu premennej na zaciatku poznat nepotrebujem.


Nahoru
 Profil  
 
PříspěvekNapsal: 04.12.2015, 21:40 
Offline
Radil
Uživatelský avatar

Registrován: 12.05.2013, 20:32
Příspěvky: 457
Bydliště: Kladno
Has thanked: 46 times
Been thanked: 118 times
No jak myslíš ;-) Ten syntax JE špatně, pokud myslíš že ne, tak asi ne :D Ale každej rozumnej compiler tě s ním pošle pochopitelně doprtky... :)

_________________
>>eLeMeNt, MB03+, Amiga 1200, ZX Spectrum 128 +2A, ZX Spectrum+, Didaktik Gama, LnxSpectrum, LnxTracker, LnxAmigaImageConvertor, https://www.ilnx.cz <<


Nahoru
 Profil  
 
PříspěvekNapsal: 05.12.2015, 10:43 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3674
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
Lanex píše:
Ten syntax JE špatně
To mi je jasne, ze to nevyhovuje sucasnym pravidlam syntaxe cecka. Ja len, ze by sa to do cecka mohlo zaviest, podobne ako sa casom zaviedlo napr. for(int a=...) .


Nahoru
 Profil  
 
PříspěvekNapsal: 05.12.2015, 11:02 
Offline
Óm Nejvyšší

Registrován: 16.06.2014, 12:23
Příspěvky: 3677
Bydliště: Jesenice u Prahy
Has thanked: 28 times
Been thanked: 280 times
Nerozumím Cčku, ale jestli je správně "static int variable = 8" nebo i "static int variable" a implicitně je variable = 0, tak není důvod, aby to žralo i "static int variable += 8", operace s nedeklarovanou hodnotou není možná, proč by měl překladač bádat nad nelogickým zápisem programátora ?

Sorry, už tu bylo vše řečeno výše :)

_________________
Diagnóza: Touretteův syndrom, Koprolálie, Dyslexie, Obsedantně kompulzivní porucha.
Kalkulačky: Privileg PR56, TI51-III, TI57, TI58, TI59, TI83, TI-83 Premium CE, TI89
Počítadla: BOBO64, ZX48 plus, DG-88, Didaktik-M, C16, C64C, Amiga 500+, MZ800, MUPID C2A2


Nahoru
 Profil  
 
PříspěvekNapsal: 05.12.2015, 11:40 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3674
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
danhard píše:
Nerozumím Cčku, ale jestli je správně "static int variable = 8" nebo i "static int variable" a implicitně je variable = 0, tak není důvod, aby to žralo i "static int variable += 8", operace s nedeklarovanou hodnotou není možná, proč by měl překladač bádat nad nelogickým zápisem programátora ?
Sorry, už tu bylo vše řečeno výše :)
Dokonca uz tu bol napisany aj dovod, preco je ten zapis logicky a preco by prekladac mal nad nim badat ;)

Ale skusim to napisat znovu a polopatistickejsie.

Cecko standartne umoznuje zapis
int variable;
variable = 0;

zapisat skratene jednym prikazom
int variable = 0;

a urobi to to iste. T.j. pri kazdom vstupe do bloku, kde je toto zapisane, sa vytvori premenna 'variable' a priradi sa jej hodnota 0.

Preto ma napadlo, ze zapis
static int variable;
variable += 8;

by sa mohol dat skratit na zapis
static int variable += 8;

a robilo by to samozrejme tiez to iste, t.j. startup kod aplikacie by vyhradil v pameti pevne pametove miesto pre premennu 'variable', podla normy by toto pametove miesto inicializoval na nulu, a nasledne, pri kazdom vstupe do bloku, kde sa nachadza tento prikaz, by sa tato premenna zvysila o 8.

Co je na tom nelogicke ??? :?:


Nahoru
 Profil  
 
PříspěvekNapsal: 05.12.2015, 12:37 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1119
Has thanked: 100 times
Been thanked: 161 times
Mam pocit ze se to tu porad opakuje stale dokola.

Busy píše:
Cecko standartne umoznuje zapis
int variable;
variable = 0;

zapisat skratene jednym prikazom
int variable = 0;

a urobi to to iste. T.j. pri kazdom vstupe do bloku, kde je toto zapisane, sa vytvori premenna 'variable' a priradi sa jej hodnota 0.


int variable += 8; nedava smysl protoze tu promenou neinicialuzujeme. Chapu to dobre? Ale je to jasny vztah N:N.


Busy píše:
Preto ma napadlo, ze zapis
static int variable;
variable += 8;

by sa mohol dat skratit na zapis
static int variable += 8;


static int variable += 8; Uz inicializujeme ale je to vztah 1:N pokud to ma delat co chces ty. 1:1 pokud si to vylozis jako static int variable = 8; Udelat normou z toho hybridni vztah 1:N by tim operatorem slo, ale bude to zatemnovani jazyka podle me. Bez urazky tady tahas za kratsi provaz.

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
PříspěvekNapsal: 05.12.2015, 15:45 
Offline
Radil
Uživatelský avatar

Registrován: 12.05.2013, 20:32
Příspěvky: 457
Bydliště: Kladno
Has thanked: 46 times
Been thanked: 118 times
Static Int Variable; (udělá to, že proměnná Variable = NULL, což není žádná nula. ;-) žádná implicitní nula se nekoná, a ani se nezačne používat hodnota, která v tu chvíli ležela v paměti RAM, kde jí Int rezervoval místo)

a proto následující

Variable += 8; (vyvolá chybu. Protože NULL + 8 není možné sčítat:)

Jestli Static nebo ne je úplně fuk. Static o proměnné říká něco jiného než si pravděpodobně myslíte. A proto stejnou chybu dostaneme

Int Variable;
Variable += 8; (zase vyvolá chybu)

:)

_________________
>>eLeMeNt, MB03+, Amiga 1200, ZX Spectrum 128 +2A, ZX Spectrum+, Didaktik Gama, LnxSpectrum, LnxTracker, LnxAmigaImageConvertor, https://www.ilnx.cz <<


Nahoru
 Profil  
 
PříspěvekNapsal: 05.12.2015, 16:48 
Offline
Radil

Registrován: 12.05.2013, 19:16
Příspěvky: 280
Bydliště: Bratislava
Has thanked: 66 times
Been thanked: 46 times
Busy píše:
Preto ma napadlo, ze zapis
static int variable;
variable += 8;

by sa mohol dat skratit na zapis
static int variable += 8;

a robilo by to samozrejme tiez to iste, t.j. startup kod aplikacie by vyhradil v pameti pevne pametove miesto pre premennu 'variable', podla normy by toto pametove miesto inicializoval na nulu, a nasledne, pri kazdom vstupe do bloku, kde sa nachadza tento prikaz, by sa tato premenna zvysila o 8.

Co je na tom nelogicke ??? :?:

to, ze prve je deklaracia a priradenie, druhe je (resp. by bola) deklaracia s explicitnou inicializaciou
okrem toho mi pride logicke, ze staticka premenna sa inicializuje prave raz (ci uz implicitne alebo explicitne), takze keby si do nej aj vnutil nekonstantny vyraz, tak ocakavat, ze sa hodnota bude menit pri opakovanom vstupe do bloku je asi tiez dost prehnane (to by ta statickost trochu utrpela)


Nahoru
 Profil  
 
PříspěvekNapsal: 05.12.2015, 17:32 
Offline
Pan Generální
Uživatelský avatar

Registrován: 23.03.2014, 20:13
Příspěvky: 2788
Has thanked: 230 times
Been thanked: 608 times
Protože to Ritchie k ničemu nepotřeboval :lol:

_________________
Plesnivý sýr z Tesca, zatuchlé kuřecí řízky z Albertu, oslizlé hovězí a myší trus z Lidlu.
Nákup potravinářské inspekce v ČR, říjen 2023.


Nahoru
 Profil  
 
PříspěvekNapsal: 05.12.2015, 17:50 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3674
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
_dworkin píše:
int variable += 8; nedava smysl protoze tu promenou neinicialuzujeme. Chapu to dobre?
Tak konkretne tento zapis zmysel nedava, ale o nom sa ani nebavime.
_dworkin píše:
static int variable += 8; Uz inicializujeme ale je to vztah 1:N pokud to ma delat co chces ty.
Pokial myslis ze 1 vstup moze generovat N vystupov, tak ano, presne to chcem aby to robilo.
_dworkin píše:
1:1 pokud si to vylozis jako static int variable = 8;
Ale to sa takto vykladat nesmie, ved od toho je tam ten plus aby to odlisil.
_dworkin píše:
Udelat normou z toho hybridni vztah 1:N by tim operatorem slo, ale bude to zatemnovani jazyka podle me.
To si nemyslim. Pretoze podobnych "zatemneni" je v jazyku viac uz teraz - uplne staci napr. pouzit neinicializovanu nestaticku lokalnu premennu a hned mam vztah 1:N. Alebo uz len take obycajne rand() je rozhodne velmi daleko od vztahu 1:1.
_dworkin píše:
Bez urazky tady tahas za kratsi provaz.
Kludne aj s urazkou ;) Vzhladom na ucel, na ktory to potrebujem (a ktory som tu uz viackrat popisal), drzim (hoc aj ten kratsi) provaz v rukach dostatne pevne ;)
Lanex píše:
Static Int Variable; (udělá to, že proměnná Variable = NULL, což není žádná nula. ;-) žádná implicitní nula se nekoná, a ani se nezačne používat hodnota, která v tu chvíli ležela v paměti RAM, kde jí Int rezervoval místo)
a proto následující
Variable += 8; (vyvolá chybu. Protože NULL + 8 není možné sčítat:)
Az na to, ze premenna je typu int, cize akakolvek hodnota, ktora v nej je, sa berie ako cele cislo, takze je jedno, ci startup kod do nej na zaciatku zapise NULL alebo 0, nasledne variable += 8 bude znamenat 0 + 8 a to uz scitat mozne je :)
Lanex píše:
Jestli Static nebo ne je úplně fuk. Static o proměnné říká něco jiného než si pravděpodobně myslíte.
A podla teba si co myslime ?
Lanex píše:
A proto stejnou chybu dostaneme
Int Variable;
Variable += 8; (zase vyvolá chybu)
:)
Tak toto nevyvola chybu, ale iba warning, ze pouzivam neinicializovanu premennu. Ale je to normalne regulerne skompilovatelny zdrojak. Akurat (na rozdiel od toho s pouzitim static) nedava velky prakticky zmysel.
faraon píše:
Protože to Ritchie k ničemu nepotřeboval :lol:
To bude asi jedina spravna odpoved na moju hlupu otazku ... :shrug:


Nahoru
 Profil  
 
PříspěvekNapsal: 05.12.2015, 18:09 
Offline
Radil

Registrován: 08.10.2013, 18:00
Příspěvky: 297
Has thanked: 13 times
Been thanked: 228 times
Prostě to v syntaxi není, static proměnnou jde iniciovat pouze konstantou, předpokládám, že autory k tomu vedla jednoduchost, to že by mohly být dva způsoby jak to zapsat a každý se musí překládat jinak (s tím += to běhěm překladu rozdělit na statickou deklaraci a tu operaci), to by v už tak prasácky nakloněnému programování v céčku udělalo ještě větší guláš :)

P.S.: Lanex jsi si jistej, že píšeš o jazyku "C". Nic z toho, co jsi napsal v posledním příspěvku, totiž pro C neplatí (možná v C#, ale to není C). V C nejde přiřadit do int proměnné NULL, minimálně to hodí warning na neshodu typů. A takové "int variable = (int) NULL;" stejně přiřadí do variable 0. A "static int variable;" opravdu způsobí, že hodnota variable před startem funkce main má hodnotu 0 (chceš-li NULL, v C je to stejná hodnota). A pokud bez toho "static" následuje "variable+=8;", tak překladač může mít námitky nějakým warningem proti neinicializované hodnotě, pokud tam ale bylo "static", námitky mít nemůže, static int proměnné jsou inicializované před startem na tu 0.


Nahoru
 Profil  
 
PříspěvekNapsal: 05.12.2015, 18:23 
Offline
Radil
Uživatelský avatar

Registrován: 12.05.2013, 20:32
Příspěvky: 457
Bydliště: Kladno
Has thanked: 46 times
Been thanked: 118 times
nobomi píše:
Lanex jsi si jistej, že píšeš o jazyku "C". Nic z toho, co jsi napsal v posledním příspěvku, totiž pro C neplatí (možná v C#, ale to není C).

No konečně na to někdo přišel :D :D

_________________
>>eLeMeNt, MB03+, Amiga 1200, ZX Spectrum 128 +2A, ZX Spectrum+, Didaktik Gama, LnxSpectrum, LnxTracker, LnxAmigaImageConvertor, https://www.ilnx.cz <<


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 Předchozí  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 19 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