Velkost pola – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Velkost pola – C / C++ – Fórum – Programujte.comVelkost pola – C / C++ – Fórum – Programujte.com

 

Martin
~ Anonymní uživatel
1602 příspěvků
3. 7. 2013   #1
-
0
-

int x = 5;

int pole[x];

Potrebujem vytvorit pole o dlzke x znakov . V Code::blocks mi to funguje ale vo Visual C++ nie  .Prečo ?

dik

Nahlásit jako SPAM
IP: 188.167.184.–
KIIV
~ Moderátor
+43
God of flame
3. 7. 2013   #2
-
0
-

protoze todle funguje v novejsich kompilatorech...  x musi byt konstanta...  nebo pouzit dynamicky pole ci treba kontejner vector, kdyz uz to nefunguje

Nahlásit jako SPAM
IP: 62.216.147.–
Program vždy dělá to co naprogramujete, ne to co chcete...
vitamin
~ Anonymní uživatel
1092 příspěvků
3. 7. 2013   #3
-
0
-

Dynamicke polia nie su v  c++ standarte (v c su), ale niektore kompilatory ich podporuju (napr gcc). Pouzi radsej vektor alebo si pockaj na c++14 kde bude mozno dynarray.

Nahlásit jako SPAM
IP: 195.28.77.–
3. 7. 2013   #4
-
0
-

Mezi překladači jsou rozdíly. Některé jsou způsobeny tím, že novější verze implementují novější standard, jiné závisí na vůli jejich tvůrců.

K té konstantě: musí to být číslo nebo makro při jehož rozvoji je dosazeno číslo:

#define MAKRO  5

int pole[10];
int neco[MAKRO];

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Martin
~ Anonymní uživatel
1602 příspěvků
3. 7. 2013   #5
-
0
-

Ale mne sa dlžka pola bude menit . Potrebujem previest cisla zo stringu na pole. Každe cislo je oddelene znakom "," takže najprv si zistim ake velke pole budem potrebovat.

string s = "1,123,1234,2,-123,2345";  // dlzka stringu sa moze menit

int t = 0;
    for (int h=0; h < s.size(); h++)
    {
        if (w[h] == ',')
            t++;
        else
            continue;
    }

    int pole[t];              // toto nefunguje :(

....                           // potom idem parsovat string do pola

...

Nahlásit jako SPAM
IP: 188.167.184.–
Martin
~ Anonymní uživatel
1602 příspěvků
3. 7. 2013   #6
-
0
-

#5 Martin
....este samozrejme tam je

s.replace(s.find(")"), 1, ",");  // doplnenie ","   za posledne cislo

Nahlásit jako SPAM
IP: 188.167.184.–
vitamin+8
Grafoman
3. 7. 2013   #7
-
0
-

#5 Martin 

//miesto thoto:
int pole[t];              // toto nefunguje :(

//pouzi:
std::vector<int> pole(t);
Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Martin
~ Anonymní uživatel
1602 příspěvků
3. 7. 2013   #8
-
0
-

OK.   C++ sa v podstate este len ucim a k STL som sa dostal len okrajovo. Aspon sa zase niečo naucim. Idem skusit.

Nahlásit jako SPAM
IP: 188.167.184.–
3. 7. 2013   #9
-
0
-

potřebuješ buď dynamické pole, které alokuješ pomocí malloc nebo, myslím že vhodnější, vector - ten sám zvětší svou velikost při přidání dalšího prvku, dá se procházet stejně jako pole (má přetížený operátor[])...

Jak to dělátš, že odpovíte vždy rychleji?

hu

Nahlásit jako SPAM
IP: 195.178.67.–
KIIV
~ Moderátor
+43
God of flame
3. 7. 2013   #10
-
0
-

mimochodem v kodu pocitas spatne pocet cisel...

jinak se na to daleko vic hodi ten vector... staci rezervovat (pokud nutno) nejake misto na treba 10 polozek a kdyz jich bude 11 tak se rezervace automaticky zvetsi... (v gcc na dvojnasobek) - ale to se dela samo i tak.. jen tech zvetsovani bude vic

muzes pak cisla zpracovat primo v tom prvnim cyklu a ne si pocitat (a jeste k tomu tam mas o 1 mene nez cisel skutecne je)

s.size() v podmince cyklu sice pro string nevadi, ale pro jine veci (obzvlaste ty, ktere musi tendle pocet nejprve spocitat) uz vyrabis umocneni komplexicity.

kdyz nepotrebujes predchozi hodnotu tak vzdy  ++h  (co kdyz budes delat operaci nad nejakym objektem? pak se musi udelat kopie toho puvodniho, aby se pak nepouzila)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Martin
~ Anonymní uživatel
1602 příspěvků
3. 7. 2013   #11
-
0
-

hm ? A da sa vector použit aj pre pole struktur ? Lebo kazde z tých cisel je iny typ . (int, double, short) .

Nahlásit jako SPAM
IP: 188.167.184.–
vitamin+8
Grafoman
3. 7. 2013   #12
-
0
-

#11 Martin
Ak si zaciatocnik tak sa zatial vyhni heterogennym kontainerom, da sa to sice riesit cez napr:

//treba mat kniznicu boost.org

std::vector<boost::variant<int, double, short>> v1;

//alebo:
std::vector<boost::any> v2;


Pri triedach to mozes riesit vektorom pointrov/referencii na bazovu triedu a potom dynamic_cast-om a virtualnymi metodami.

Ak budes mat v tom stringu ciarkami oddelene rozne typy (integer/double pripadne aj +- pre kladne/zaporne cisla) tak sa ti to bude blbo nacitavat. Tam uz si treba spravyt taky malicky parser, pripadne pouzit napr boost::spirit::qi.

Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Martin
~ Anonymní uživatel
1602 příspěvků
3. 7. 2013   #13
-
0
-

Robim presne toto : mam nejaky retazec načítaný zo serial portu vyzera nejak takto :

string a = "move(1,123,1234,2,-234,1234,..........,6,123,2133)"  

Obsahuje 18 cisel ktore su (int, double, unsigned short) a potrebujem ich odtial dostat. Vyriesil som to cez pole struktur funguje to. Len sa teraz znazim vyriesit aby ten retazec nemusel mat rovnaku velkost. Tu je kod ktory mi funguje:

string w;
w.assign(a, a.find("(")+1, a.find(")") - a.find("("));
w.replace(w.find(")"),0, ",");

int pole[18];
string pom="";

    int i = 0;
    int p = 0;

while (w[i] != ')')
    {
  if ( w[i] != ',')
        {
            pom += w[i];
        }
        else
        {
            istringstream is(pom);
            is >> pole[p];
            ++p;
            pom = "";
        }
        ++i;
    }

struct Rob
    {
      int mod;
      double pos;
      unsigned short cas;
    };

Rob rob[6];

int x = 0;
for (int y = 0; y < 6; y++)
{
  rob[y].mod = pole[x];
  x++;
  rob[y].pos = pole[x];
  x++;
  rob[y].cas = pole[x];
  x++;
}

Nahlásit jako SPAM
IP: 188.167.184.–
vitamin+8
Grafoman
3. 7. 2013   #14
-
0
-

Mozne riesenie ukladania do vektora:

#include <iostream>
#include <vector>

struct Rob{
    enum type_e{
        MOD,
        POS,
        CAS
    }type;

    union{
        int mod;
        double pos;
        unsigned short cas;
    };

    Rob(int mod):type(MOD), mod(mod){}
    Rob(double pos):type(POS), pos(pos){}
    Rob(unsigned short cas):type(CAS), cas(cas){}

    //Edit:
    friend std::ostream& operator<<(std::ostream& out, const Rob& i){
        switch(i.type){
            case Rob::MOD:
                out << "mod: " << i.mod;
                break;
            case Rob::POS:
                out << "pos: " << i.pos;
                break;
            case Rob::CAS:
                out << "cas: " << i.cas;
                break;

        }
        return out;
    }
};


int main()
{
    std::vector<Rob> v;

    v.push_back((int)73);
    v.push_back((double)3.14);
    v.push_back((unsigned short)14);

    /*
     * Bez pouzitia pretazeneho operatora <<
     */
    for(auto i : v){
        switch(i.type){
            case Rob::MOD:
                std::cout << "mod: " << i.mod << std::endl;
                break;
            case Rob::POS:
                std::cout << "pos: " << i.pos << std::endl;
                break;
            case Rob::CAS:
                std::cout << "cas: " << i.cas << std::endl;
                break;

        }

    }

    std::cout << "---------------------------------------\n";
    /*
     * Pouzitie pretazeneho operatora <<
     */
    for(auto i : v)
        std::cout << i << std::endl;

    return 0;
}
Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Sefiros0
Návštěvník
3. 7. 2013   #15
-
0
-

Asi to už nemá smysl sem psát, ale nač používat kontejner vector když nebyla pochopena dynamická alokace prostého pole...

int len;
cin >> len;
int *arr = new int [len];
/*
	...
*/
delete [] arr;
cout << "konec" << endl;
Nahlásit jako SPAM
IP: 80.188.252.–
3. 7. 2013   #16
-
0
-

nač používat vector? Aby dynamická alokace pole nemusela být pochopena   

hu

Nahlásit jako SPAM
IP: 195.178.67.–
vitamin+8
Grafoman
3. 7. 2013   #17
-
0
-

#15 Sefiros
Vektor sa moze dynamicky zvecsovat. Dalej vector je sucast standartu, takze ho implementuje tvorca kompilatoru ktory moze vyuzit optimalizacie ktore su implementacne zavysle. A nakoniec vektor mozes pouzit vo foreach   

Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
3. 7. 2013   #18
-
0
-

#17 vitamin
dopřesnění: dynamicky alokované pole lze dynamicky zvětšovat také, pokud bylo alokováno pomocí malloc. Slouží k tomu funkce realloc. Jak je to při použití operátoru new nevím - pro obyčejná pole ho nepoužívám.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
vitamin+8
Grafoman
3. 7. 2013   #19
-
0
-

#18 hlucheucho
Samozrejme to ide, problem je ze je to otravne u uz musis manualne volat constructory a destructory

Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
3. 7. 2013   #20
-
0
-

#19 vitamin
je to otravné a je to hromada práce, kterou už někdo udělal, když vytvořil vektor.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Sefiros0
Návštěvník
3. 7. 2013   #21
-
0
-

Samozřejmě vaše důvody chápu...ale z důvodu výuky jazyka je to nevhodné...neb si myslím že by programátor měl pochopit i v rámci možností co se děje v pozadí...ale samozřejmě vše závisí na pojetí výuky (a poté kvality programátorů). 

nač používat vector? Aby dynamická alokace pole nemusela být pochopena  

nevím, ale přílišná abstrakce při výuce končí pak špatně...třeba tak že si myslí nějaký nebožák to, že vykreslování GUI aplikace je činnost závislá na jazyce a nikoli na OS ... pak to vše zabije zdělením že aplikace v jazyce C++ neumí vykreslovat GUI a proto je jazyk C++ na nic ... :(  

Nahlásit jako SPAM
IP: 80.188.252.–
3. 7. 2013   #22
-
0
-

Co je z důvodu výuky vhodné bych nechal na učitelích. Pravda je, že ti, co se o to zajímají, si zjistí více o tom jak to funguje. A ti ostatní? Tam je to jako házet perly sviním. Ne všichni mají ve škole nějaký programovací jazyk proto, že z nich bude programátor. Někdy i málo bývá více. Při takovém detailním pitvání, jak je co implementováno, bysme nakonec skončili na úrovni instrukční sady procesoru a strojového kódu nebo snad i co který tranzistor na čipu dělá. Příliš mnoho detailů ze "zákulisí" by mohlo začínajícího programátora spíš odradit. Důležitější může být zaujmout a pak sám začne pátrat po podrobnostech.

Odpověď na otázku nač vektor byl jen pokus o ftip.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Martin
~ Anonymní uživatel
1602 příspěvků
3. 7. 2013   #23
-
0
-

OK, dik , prejdem si vsetky návrhy. Viem co je dynamická pridelovanie pamäte len jednoducho nemam žiadne skusenosti zatial, Toto je prvá vacsia vec co robim a venujem sa C++ tak 3mesiace (popri práci a škole ).

Nahlásit jako SPAM
IP: 188.167.184.–
Martin
~ Anonymní uživatel
1602 příspěvků
3. 7. 2013   #24
-
0
-

Požil som : 

int t = 18;
int *pole = new int [t];
...
int k = t/3;
Rob *rob = new Rob[k];
...
...
delete [] pole;

Funguje to aj pre struct ale neviem to zrusit. Viem že to nie je uplne správne. Ale tak skusam.

Nahlásit jako SPAM
IP: 188.167.184.–
KIIV
~ Moderátor
+43
God of flame
3. 7. 2013   #25
-
0
-

uvolnis stejne jako pole

Nahlásit jako SPAM
IP: 86.49.86.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Martin
~ Anonymní uživatel
1602 příspěvků
3. 7. 2013   #26
-
0
-

#25 KIIV
jasne, uz som na to dosiel. Ked ja nemam este taku prax.Viem o tom , len musim obcas nieco vyhladat ako sa to presne zapisuje. 

Nahlásit jako SPAM
IP: 188.167.184.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 84 hostů

Podobná vlákna

Velkost pola — založil amd64

Nekonecna velkost — založil Tayson

Veľkosť súboru... — založil Péťa

MovieClip velkost — založil dalaman

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý