Jazyk C - Pole, ktorého veľkosť určuje konštanta.

Programovacie jazyky, rady, poradňa...
X-Pa3k
Medium Expert
Medium Expert
Používateľov profilový obrázok
Príspevky: 139
Registrovaný: 08 mar 2011, 14:50

Jazyk C - Pole, ktorého veľkosť určuje konštanta.

Príspevok od používateľa X-Pa3k »

Ahojte, potreboval by som poradiť.

Neviem si dať radi s takýmto zadaním :
"Vytvorte pole, ktorého veľkosť určuje konštanta. Pole naplňte náhodnými číslami
z intervalu <-50, 50>a pole vypíšte. Nájdite maximum a minimum daného poľa."

Program bez Vytvorte pole, ktorého veľkosť určuje konštanta som spravil do pár minút.

Kód: Vybrať všetko

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    int i;
    int R = 5;
    int p[R];
    int max,min;


    srand(time(NULL));
    for (i=0;i<R;i++)
    {
        p[i]=rand()%(50+50)-50;
        printf("%d ",p[i]);
    }

    max=p[0];
    min=p[0];
    for (i=0;i<R;i++)
    {
        if (max<p[i])
            max=p[i];
        if (min>p[i])
            min=p[i];
    }
    printf("\n");
    printf("Maximum pola je :%d \n",max);
    printf("Minimum pola je :%d ",min);
}
Budem rád ak mi s tým poradíte , alebo kde nájdem odpoveď ako nato. Nechcem od Vás kód, o to mi fakt nejde.

ďakujem moc.
skjerp-deg
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 383
Registrovaný: 24 aug 2015, 15:17

Re: Jazyk C - Pole, ktorého veľkosť určuje konštanta.

Príspevok od používateľa skjerp-deg »

const int R = 5; a máš vybavené. Zvyšok programu spĺňa zadanie.
X-Pa3k
Medium Expert
Medium Expert
Používateľov profilový obrázok
Príspevky: 139
Registrovaný: 08 mar 2011, 14:50

Re: Jazyk C - Pole, ktorého veľkosť určuje konštanta.

Príspevok od používateľa X-Pa3k »

skjerp-deg napísal:const int R = 5; a máš vybavené. Zvyšok programu spĺňa zadanie.
určite ? mňa asi trafí , a viete mi povedať nejaký rozdiel medzi tým čo som spravil a potom čo som zmenil int R = 5; na const int R = 5;

Ako technicky som premennú zmenil na konštantu, ale nieje to jedno ?

Ako určite kde človek nechce aby sa mu menila "hodnota" ale aký to má význam v takomto programe ? :O
skjerp-deg
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 383
Registrovaný: 24 aug 2015, 15:17

Re: Jazyk C - Pole, ktorého veľkosť určuje konštanta.

Príspevok od používateľa skjerp-deg »

Ono technicky vzaté aj bez toho const to pole bolo nemennej veľkosti, teda de-facto jeho veľkosť určovala konštanta. Keďže je to ale zadanie a niekto by mohol chytať za slovíčka, že hodnota R ide neskôr zmeniť (aj keď už nemá vplyv na veľkosť poľa), tak by som to tam const určite hodil. Kebyže ti to zadanie opravujem ja, tak to uznám bez aj s const.

Praktický význam const v takomto krátkom programe nie je, ako mnoho iných vecí. ktoré zadania vyžadujú, aby si dodržal.

Ináč, taký koment - dobré programátorské zvyky hovoria, aby si premenné deklaroval tesne pred tým, než ich potrebuješ, ani o riadok skôr (nie sme predsa v Pascale). Takže žiadne int i; na začiatku programu, ale až int i = 0; v hlavičke cyklu. To isté platí pre min a max premenné.
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8216
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Jazyk C - Pole, ktorého veľkosť určuje konštanta.

Príspevok od používateľa harrison314 »

skjerp-deg napísal:Ináč, taký koment - dobré programátorské zvyky hovoria, aby si premenné deklaroval tesne pred tým, než ich potrebuješ, ani o riadok skôr (nie sme predsa v Pascale). Takže žiadne int i; na začiatku programu, ale až int i = 0; v hlavičke cyklu. To isté platí pre min a max premenné.
V C nedefinujes premnnu v hlavicke cyklu, takisto ani velkost pola pomocou premennej aj ked je const. To zvlada C++.
Premenne na zaciatku funkcie su pozostatok tutorialov z davanjsich dob, ked to gcc tak vyzadovalo.
skjerp-deg
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 383
Registrovaný: 24 aug 2015, 15:17

Re: Jazyk C - Pole, ktorého veľkosť určuje konštanta.

Príspevok od používateľa skjerp-deg »

Síce som sa nikdy C poriadne neučil a veľmi skoro som presedlal na C++, takže tieto nuancy až tak nepoznám, ale podľa všetkého moderné gcc to všetko žere (neviem ale, čo na to štandard): https://ideone.com/9YIseZ
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8216
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Jazyk C - Pole, ktorého veľkosť určuje konštanta.

Príspevok od používateľa harrison314 »

Podla tohto to ide od standardu C99, ktory sa pravdepdobne od doby co som vystudoval stal defaultnym.
ado130
Expert
Expert
Používateľov profilový obrázok
Príspevky: 163
Registrovaný: 01 aug 2012, 12:36

Re: Jazyk C - Pole, ktorého veľkosť určuje konštanta.

Príspevok od používateľa ado130 »

Šlo ti to skompilovať bez toho const? Pokiaľ viem v čistom C nešlo definovať pole iba štýlom int a = 5; array[a]; Muselo tam byť to const, z dôvodu aby sa už počas kompilácie vedelo akú veľkosť bude mať pole (tzn. mohlo zabrať určitú veľkosť pamäte), nie je možné vytvárať pole[x] real-time. Ak by si chcel real-time, myslím, že inak než cez malloc to nejde.
94jakub
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2037
Registrovaný: 15 dec 2006, 13:18
Bydlisko: Martin/BA
Kontaktovať používateľa:

Re: Jazyk C - Pole, ktorého veľkosť určuje konštanta.

Príspevok od používateľa 94jakub »

Neviem, čo si predstavuješ pod "čistým C," no od štandardu C99 to je podporované.
Môžeš si to vyskúšať skompilovať pod C99 a C89. V tom staršom ti to nepôjde.

Predpokladám, že niekde na školách zo zvyku používajú C89 a aj úlohy sú tomu postavené, čo asi bude aj prípad tejto témy. Tiež som to zažil.
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8216
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Jazyk C - Pole, ktorého veľkosť určuje konštanta.

Príspevok od používateľa harrison314 »

Ohladom "dynamickej" alokacie pola na staku som natrafil na par zaujimavosti.
Aj v C99 aj C++ gcc s prepinacom -pedantic hadze varningy na:

Kód: Vybrať všetko

void foo(int len)
{
    int array[len];
....
}
a MSVC (kompiler pre Visual Studio), takisto GCC v mode pre niektore jednocipy (u mna Ardiuno IDE a ESP8266) vobec nedovoluju tento zapis. Je povazovany za nezpecny, kvoli preteceniu stacku.

Namiesto toho by sa malo pouzivat makro alloca, ktore alokuje pamet na stacku a je podporovane na vsetkych kompilatoroch.

Kód: Vybrať všetko

void foo(int len)
{
    int* arra = (int*) alloca(len*sizeof(int));
....
}
Na druhej strane som cital, ze alloca sa povazuje za zastaralu.
tuti
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 740
Registrovaný: 01 okt 2006, 19:23
Bydlisko: Prievidza

Re: Jazyk C - Pole, ktorého veľkosť určuje konštanta.

Príspevok od používateľa tuti »

ohladne alloca by som sa bal tohto:
The alloca() function returns a pointer to the beginning of the allocated space.
If the allocation causes stack overflow, program behavior is undefined.
takze by som sa v pripade C radsej drzal malloc a free
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8216
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Jazyk C - Pole, ktorého veľkosť určuje konštanta.

Príspevok od používateľa harrison314 »

tuti napísal:ohladne alloca by som sa bal tohto:


takze by som sa v pripade C radsej drzal malloc a free
Len alloca riesi iny problem ako malloc. Je o niekolko radov richlejsi a viem si predstavit pouzitie v kritickych castiach aplikacie (samozrejme treba mysliet na to, ze sa alokuje na stacku).
(PS: nieco podobne som riesil v C#, alokaciu polí na stacku sa mi podarilo zrichlit funkciu pre vypocet Levenstainovej vzdialenosti trojnasobne).
tuti
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 740
Registrovaný: 01 okt 2006, 19:23
Bydlisko: Prievidza

Re: Jazyk C - Pole, ktorého veľkosť určuje konštanta.

Príspevok od používateľa tuti »

ja si to tiez viem predstavit :) ale principialne: si myslim, ze aplikacia ma najskor fungovat a potom sa ma optimalizovat rychlost. Na to aby aplikacia fungovala je malloc bezpecnejsi. Potom skumam, ze alokujem len male mnozstvo pamate a preto to mozem robit na zasobniku a pouzit alloca a urychlit to. (alebo optimalne to alokovat staticky, ze ;) - zas za podmienky ze sa to da)

A kedze tu sa vacsinou riesie zakladne problemy tak moje odporucanie plati.
Napísať odpoveď