OldComp.cz

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


Právě je 28.03.2024, 16:56

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




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 39 ]  Přejít na stránku Předchozí  1, 2, 3
Autor Zpráva
PříspěvekNapsal: 06.08.2020, 23:58 
Offline
Pan Štábní

Registrován: 11.11.2013, 10:29
Příspěvky: 1198
Has thanked: 359 times
Been thanked: 304 times
Aha, tak to je super :-)

Pozn.: Bez alokace to spadne na poruseni pameti, takze ten malloc tam byt musi.

_________________
Sharp MZ-800++, MZ-1500++, MZ-2500++, SM-B-80T, MK-14_replica, HP-85, ZX-80+replica, ZX81, ZX-Spectrum+replica++, PMI-80+replica, SAM coupe++, PMD-85-2A+3, Didaktik-M, SORD-M5, TI-57, TI-59+PC-100, TI99/4A, ZetaV2+ppp, ZX-uno, Petr


Nahoru
 Profil  
 
PříspěvekNapsal: 07.08.2020, 08:41 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
Mikes21 píše:
Pozn.: Bez alokace to spadne na poruseni pameti, takze ten malloc tam byt musi.
Mylis sa, nemusi ! (ako uz pisal UB880D).
Pozri tento priklad. Ziadny malloc tam nie je a aj napriek tomu to funguje a nespadne na porusenie pameti:
Kód:
#include <stdio.h>

void main()
{
   int x, y;
   scanf("%d%d", &x, &y);
   int a[x][y];

   for (int i = 0; i < x; i++)
      for (int j = 0; j < y; j++)
         a[i][j]=i*y+j;
         
   for (int i = 0; i < x; i++)
      for (int j = 0; j < y; j++)
         printf("a[%d][%d]: %p, val=%d\n", i, j, &a[i][j], a[i][j]);
}


Nahoru
 Profil  
 
PříspěvekNapsal: 07.08.2020, 14:24 
Offline
Pan Štábní

Registrován: 11.11.2013, 10:29
Příspěvky: 1198
Has thanked: 359 times
Been thanked: 304 times
Asi takto?
Citace:
Severity Code Description Project File Line Suppression State
Error C2133 'a': unknown size pole main.c 7
Error (active) E0028 expression must have a constant value pole main.c 7
Error (active) E0028 expression must have a constant value pole main.c 7
Error C2057 expected constant expression pole main.c 7
Error C2466 cannot allocate an array of constant size 0 pole main.c 7
Error C2057 expected constant expression pole main.c 7
Error C2466 cannot allocate an array of constant size 0 pole main.c 7
Error C2087 'a': missing subscript pole main.c 7
Error C4996 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. pole main.c 6

Super
A pri behu "Segmentation fault", ale nekdy do nespadne, to je pravda.

_________________
Sharp MZ-800++, MZ-1500++, MZ-2500++, SM-B-80T, MK-14_replica, HP-85, ZX-80+replica, ZX81, ZX-Spectrum+replica++, PMI-80+replica, SAM coupe++, PMD-85-2A+3, Didaktik-M, SORD-M5, TI-57, TI-59+PC-100, TI99/4A, ZetaV2+ppp, ZX-uno, Petr


Nahoru
 Profil  
 
PříspěvekNapsal: 07.08.2020, 14:31 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
Nesmies pouzivat zastarale prekladace :)
Napriklad klasicke gcc to krasne skompiluje
(akurat to teda pozaduje aby main bol typu int ale to je detail).

Skusal som uz hooodne stare MinGW 4.4.0 a aj tam to slo.
Priklad vystupu pre zadane hodnoty 2 a 3:
Kód:
2
3
a[0][0]: 0060FEA0, val=0
a[0][1]: 0060FEA4, val=1
a[0][2]: 0060FEA8, val=2
a[1][0]: 0060FEAC, val=3
a[1][1]: 0060FEB0, val=4
a[1][2]: 0060FEB4, val=5


Nahoru
 Profil  
 
PříspěvekNapsal: 07.08.2020, 14:49 
Offline
Kecálek

Registrován: 08.11.2019, 17:24
Příspěvky: 130
Bydliště: Beroun
Has thanked: 32 times
Been thanked: 8 times
Predpokladem je, ze to prekladas C prekladacem, ktery podporuje variable length arrays z C99, coz, jak tak koukam, VS nepodporuje:

https://docs.microsoft.com/en-us/cpp/c- ... ew=vs-2019
https://stackoverflow.com/questions/524 ... s-visual-c

GCC s tim zadnej problem nema a program nepada. Samozrejme taky zalezi na tom, jak velky to pole udelas, kdyz to prezenes, tak spadne i ta GCC verze.

C++ je taky jinej pripad a VLA nepodporuje vubec.

Jinak by ale melo jit nahradit staticky alokovany pole typu a[x][y] staticky alokovanym polem z toho meho prikladu, kde se volani malloc() nahradi volanim alloca(). To funguje tak, ze pamet misto na heapu alokuje na stacku.


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

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
Jakub píše:
GCC s tim zadnej problem nema a program nepada. Samozrejme taky zalezi na tom, jak velky to pole udelas, kdyz to prezenes, tak spadne i ta GCC verze.
Ano, je to lokalna premenna, ktora je na stacku. Takze staci ak ju chceme vecsiu ako volne miesto na stacku, a uz je zle. Ale kompileru by sa nejak malo dat nastavit, aby si program pri spusteni vyhradil pre stack dostatok potrebneho miesta.


Nahoru
 Profil  
 
PříspěvekNapsal: 07.08.2020, 18:08 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 24.05.2018, 22:32
Příspěvky: 1972
Bydliště: Most, Praha
Has thanked: 864 times
Been thanked: 697 times
Takove pole ve stacku je silne neprakticke (= pro prakticke vyuziti k nicemu) - existuje jen po dobu chodu funkce a nelze ridit vytvareni a ruseni poli.

_________________
i++ (INC) increment
i-- (DEC) decrement
i@@ (EXC) excrement


Nahoru
 Profil  
 
PříspěvekNapsal: 07.08.2020, 23:07 
Offline
Pan Štábní

Registrován: 11.11.2013, 10:29
Příspěvky: 1198
Has thanked: 359 times
Been thanked: 304 times
Zkus to dvakrat v jednom programu. Jak prealokujes rozmer pole? Konkretne z mensiho na vetsi.
A pak take by se nejdrive mela definovat promenna a teprve potom do ni vlozit hodnoty. Pokud prohodis ten scanf a "int a[x][y];" tak to nemuze fungovat. Ale to ti asi nevadi.

_________________
Sharp MZ-800++, MZ-1500++, MZ-2500++, SM-B-80T, MK-14_replica, HP-85, ZX-80+replica, ZX81, ZX-Spectrum+replica++, PMI-80+replica, SAM coupe++, PMD-85-2A+3, Didaktik-M, SORD-M5, TI-57, TI-59+PC-100, TI99/4A, ZetaV2+ppp, ZX-uno, Petr


Nahoru
 Profil  
 
PříspěvekNapsal: 08.08.2020, 01:52 
Offline
Kecálek

Registrován: 08.11.2019, 17:24
Příspěvky: 130
Bydliště: Beroun
Has thanked: 32 times
Been thanked: 8 times
Nejsem si jisty, zda si uplne rozumime, pripadne co se snazis ukazat.

Z pohledu prekladace neni zas az takovy rozdil mezi int a[5] a int a[x]. V prvnim pripade musi od stack pointeru odecist konstantu 5 * sizeof(int), ve druhem musi nejprve zaradit instrukci na vypocet x * sizeof(int) a vysledek potom odecist od stack pointeru. Takove pole samo zanikne se zanikem stack framu, ve kterem bylo alokovano. Muzu jich mit klidne dve a vic, muzu takovou funkci zavolat dvakrat. Realokace int[x] dava uplne stejny smysl, jako realokace int[5], a sice zadny. Samozrejme, ze nejdriv se musi promenna definovat a pak teprve pouzit. Nas priklad neni vyjimkou. Nejdriv se nadefinuji promenne x a y, potom se pomoci scanf inicializuji a nakonec se definuje pole a s tou dobou jiz znamymi rozmery x a y (rozmer pole zustane stejny, i kdybys pozdeji x a y zmenil, viz nize). Opet si muzes predstavit, ze to zhruba odpovida instrukcim pro vypocet x * y * sizeof(int) a odecteni teto hodnoty od stack pointeru. Hodnoty do pole potom vkladaji ty vnorene for cykly. Kdybys prohodil scanf a int a[x][y] tak to opravdu fungovat nebude, protoze bys definoval pole pomoci neinicializovanych promennych.

Busy na zacatku resil jiny problem a tady to uz je jen takova kuriozitka, jejimz cilem bylo ukazat, ze pole s promennou delkou (VLA) je standardni vec, ktera normalne funguje, i kdyz treba neni uplne prakticka nebo bezne pouzivana. Vlastne nechapu, proc to porad resime. Se s tim proste smir :-)

Ted me napadlo, jestli te to "VLA" nemate spis lingvisticky. Jako jestli si nahodou nepredstavujes ze by se velikost pole a neustale menila podle toho, jakou hodnotu zrovna mas v x a y. Co?


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ů: 39 ]  Přejít na stránku Předchozí  1, 2, 3

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 2 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