dynamiczne statyki

0

chodzi mi o kwestie dynamicznego rozmiarowania tablic statycznych przy ich tworzeniu...

1113-32 < rolnikov> mam takie cos:
1113-56 < rolnikov> float fPunkty[nLiczbaPunktow]
1114-15 < dust_puppy> #define nLiczbaPunktow 20
1114-23 < rolnikov> printf("przedzial dzielimy na %d punktow", nLiczbaPunkotw);
1114-31 < dust_puppy> inaczej bedzie problem
1115-08 < rolnikov> i problem polega na tym ze wyswietla dobra wartosc nLiczbyPunktow, a tworzy tablice zawze 2elementowa, zamiast np5, 7 itd ..
1115-57 < dust_puppy> a skad to wiesz ? :>
1116-05 < rolnikov> z debugera
1116-09 < dienet> dust_puppy: nie bedzie - juz od dawna nie ma z tym problemu
1116-22 < rolnikov> nLIczbaPunktow to zmienna ofkoz
1116-22 < dienet> rolnikov: a pokaz skad dostajesz to nliczbapunktow
1116-41 < rolnikov> np z przekazania argumentu
1116-44 < dust_puppy> dienet #  czyli mozna statyczna zmienna tworzyc niejako dynamicznie ?
1116-53 < dust_puppy> troche bez sensu :>
1117-29 < rolnikov> dust_puppy no ale co jelsi nLiczbaPunktow jest zalezna od uzytkownika
1117-38 < rolnikov> to on wpisuje jej wartosc
1117-46 < rolnikov> i chce zeby taka tablice mi zrobil
1118-15 < dust_puppy> to zrob dynamiczna
1118-48 < rolnikov> tablice dynamiczna ?
1119-04 < dust_puppy> float* fPunkty=(float*)malloc(sizeof(float)*nLiczbaPunktow);
1119-19 < rolnikov> :o
1119-19 < dust_puppy> float* fPunkty=new floatnLiczbaPunktow];
1119-45 < rolnikov> to wybiega juz poza zakres mojej wiedzy :F
1119-46 < dienet> int foo(int size)
1119-46 < dienet> {
1119-46 < dienet> char a[size];
1119-46 < dienet> strcpy(a, "123456789");
1119-46 < dienet> printf ("%s\n", a);
1119-48 < dienet> return 0;
1119-50 < dienet> }
1119-53 < dienet> int main()
1119-55 < dienet> {
1119-58 < dienet> foo(10);
1120-00 < dienet> return 0;
1120-03 < dienet> }
1120-05 < dienet> rolnikov: nie 3a tak
1120-08 < dienet> nowy standard pozwala na takie cos ^^^^^
1120-35 < dust_puppy> ale to kurwa bez sensu
1120-48 < rolnikov> :|

... no i oczywiscie podtrzymuje swoje zdanie, ze to bez sensu :)

Dyskusja bedzie pewnie krotka, ale chodzi mi o 'za i przeciw'

  1. przeciw: stos nigdy nie jest tak pojemny jak sterta.
0

int n = 5;
int a[n];
Takie coś działa jedynie na gcc. Podejrzałem debuggerem co tak naprawdę się dzieje i
GCC poprostuje alokuje to dynamicznie. Przy okazji takie postępowanie jest bezsensu bo nijak sprawdzić czy tablica dobrze się zaalokowała. Do tego na końcu nie było żadnej instrukcji, która by tą pamięć zwolniła.
Gość pisze, że na to pozwala jakiś nowy standard. Szczerze mówiąc o takowym nie słyszałem, nowy standard ma wyjść dopiero za parę lat, no ale niech mu będzie. Być może jest to robione, że gdy wartość jest znana podczas kompilacji kompilator nie czepia się braku słówka const. Jeżeli natomiast nie jest znana to jedyne co mi przychodzi do głowy to alokacja dynamiczna.

Wyjątki są w C++ a program był kompilowany w gcc.
Tak to było alloca - na funkcjach api się nie znam więc pewnie błędny wniosek wyciągnąłem.

0

No jeżeli alloca to pamięci nie trzeba zwalniać - przydziela ze stosu.

0

Wyjasniam wszem i wobec ze:

  1. Ja tylko proponowalem nie narzucalem.
  2. "Nowy standart" - tak troche to zle napisalem chodzi o to: http://c-faq.com/aryptr/dynlocarys.html
  3. Nie rozumiem tej dyskusji - ktos proboje sie dowartosciować? Raczej powinnien przeczytac dobra ksiazke.

Pozdr0
dienet

// chodzilo mi o za i przeciw z merytorycznej strony, ponieważ i tak cała dyskusja nie bedzie miala jakiegokolwiek wplywu na gcc i inne kompilatory, a poza tym przypilnuje aby dyskusja toczyla sie dokladnie na ten temat [mf]

0

[green] dziwne , a moze obiektowo , jeśli można wykręcić w klasie tablicę statyczną
to może i da się dynamicznie ? nie sprawdzałem ale Ranides podał ciekawy kod :
http://4programmers.net/Forum/363908?h=#id363908

//dienet
Nie rozumiem tej dyskusji - ktos proboje sie dowartosciować? Raczej powinnien przeczytac dobra ksiazke.

Trochę pokory misiaczku .
Na świecie są dziwy o których się fizjologom nieśniło :-D .
"Ferdynand Kiepski - dzieła wybrane "

0

ciekawa rzecz! dobrze wiedziec ze ktos o tym pomyslal.. idea sama w sobei prosta jak drut.. jak sie tworzylo char tab[10]; to generowalo to kod zdejmujacy 10B ze stosu, wiec czemu ta 10tka nie mialabybyc runtimeowo odczytywana, przeciez i tak ESP sprzed wywolania jest zachowany

z pktu widzenia C++:

przeciw: stos mozna w ten sposob latwo przepelnic! co prawda sa metody dynamicznego powiekszenia stosu, ale malo ktory system tego uzywa, wiekszosc daje jeden blok i trzeba sie zmiescic. a trzeba pameitac ze kazde wywolanie fkcji troche stosu zjada i jak nie bedzie, program sie wylozy
watpliwosc: jak nie wystarczy bloku na tablice, bo ktos mily podsunal rozmiar np. 1mln to leci wtedy jaks wyjatek?
watpliwosc: konstruktory/destruktory sa wolane na kazdym elemencie..?
za: esp-=rozmiar jest o wiele szybszy niz alokacja przez menedzera pamieci, juz nie trzeba sie bac o szybkosc przy tworzeniu chwilowej tablicy rozmiaru 1 czy 10 elementow
za: wygodniejsze i bezpieczniejsze co do nie-gubienia pamieci niz przez t*=new czy std::autoptr

0

int n = 5;
int a[n];
Takie coś działa jedynie na gcc. Podejrzałem debuggerem co tak naprawdę się dzieje i
GCC poprostuje alokuje to dynamicznie. Przy okazji takie postępowanie jest bezsensu bo nijak sprawdzić czy tablica dobrze się zaalokowała.

właśnie Dev C++ dopuszcza takie szopki , mozna alokować dynamicznie tablice
statyczne , co jest niedopuszczalne jeśli chodzi o składnie C++ skutkiem tego
początkujacy programiści mają problemy z tablicami .
Program napisany w Dev-C++ działający poprawnie jest pod względem kodu
niepoprawny i nie zgodny ze standardem oraz podstawami C++ .
I jeszcze parę rzeczy, które przemilczę ...

0
dzejo napisał(a)

(...)skutkiem tego
początkujacy programiści mają problemy z tablicami .

Można zapytać, jakie? Bo jakoś nie jestem w stanie sobie wyobrazić jakie z tego powodu mogłyby wynikać problemy (poza, oczywiście, przyzwyczajeniem do złych nawyków, no ale przecież nikt nie uczy się C++ z samego deva metodą prób i błędów. Od czegoś są jeszcze książki i tutoriale ;))

Program napisany w Dev-C++ działający poprawnie jest pod względem kodu
niepoprawny i nie zgodny ze standardem oraz podstawami C++.

Zgadzam się, że dopuszczanie takich błędów przez deva jest poważnym błędem, ale nie przesadzajmy, nie można najeżdżać na całe środowisko tylko za to, że jeden błąd dopuszcza... Przecież chyba nie istnieje żaden kompilator/środowisko w 100% zgodny ze wszystkimi standardami ;)

0

@quetzalcoatl: wątpliwości można łatwo rozwiać, przynajmniej, jeśli chodzi o Dev'a ;)

jak nie wystarczy bloku na tablice, bo ktos mily podsunal rozmiar np. 1mln to leci wtedy jaks wyjatek?

nie, program leci w kosmos (nieprawidłowa operacja) ;)

watpliwosc: konstruktory/destruktory sa wolane na kazdym elemencie..?

tak, są. w odpowiedniej, standardowej w C++ kolejności (czyli niszczenie w kolejności odwrotnej do tworzenia). w normalnych miejscach, tzn konstruktory po napotkaniu definicji, destruktory w trakcie opuszczania bloku.

@dzejo: tak, to nie jest zgodne z C++, ale z C99 jest faktycznie zgodne. Więc błąd deva polega na tym po prostu, że pozwala na tę konstrukcję w plikach .cpp (powinien pozwalać tylko w .c). To aż takie przestępstwo?

btw: dev jest zgodny ze standardami w ten sposób, że obsługuje większość ISO C++. Niestety obsługuje też sporo więcej ;] (głównie różnych rozszerzeń języka C).

0
dzejo napisał(a)

http://4programmers.net/Forum/357466?h=#id357466

A, no bo to działa w ten sposób, że pierwszej komórce 'napis'u przypisuje adres nowej tablicy charów o wielkości 20, 'chamsko' rzutowany na 'char'. Dev rzuca warninga, bo adresy powinno się rzutować co najwyżej na 'int', bo tak są one zapisywane w pamięci komputera. Ten kod to kompletny debilizm, bo nie ma potem jak tej tablicy zwolnić, ale kompilator nie ma nic do gadania jak programista ma dziwne pomysły ;) Jedyne, na co nie powinien pozwolić to zadeklarowanie statycznej tablicy o wielkości 0 (najwidoczniej zakłada, że użyszkodnikowi chodziło o tablicę wielkości 1 - nieładnie, powinien co najmniej warninga rzucić, ale nie jest to jakiś kosmicznie poważny błąd ;))

EDIT:
Ale imho za dużego offtopa tu narobiliśmy, jak dla mnie albo eot albo zakładamy nowy temat 'czy Dev jest/nie jest 'be' i dlaczego' ;)

EDIT2:
A jakby co - nie napisałem tego w tamtym temacie bo wtedy zwyczajnie nie wpadłem na to, że to tak działa - dopiero znienawidzony przez ciebie dev mi to podpowiedział warningiem cast from pointer to integer of different size ;)

0

znienawidzony przez ciebie dev mi to podpowiedział warningiem

Oj Ghostek , on mi sie podoba ,
ale np. na "forum.programuj.com" widziałem masę tematów opartych o Dev
i zawsze problem był z tablicami , jesli ktoś uczy się programować to niestety
zachowanie Dev może nieźle namieszać .

o wielkości 0

Było można , obecnie niedopuszczalne ...

1 użytkowników online, w tym zalogowanych: 0, gości: 1