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
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
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
...
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
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)
#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.
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++;
}
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;
}
nač používat vector? Aby dynamická alokace pole nemusela být pochopena
hu
#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
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 ... :(
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
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 ).
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.
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku