Anonymní profil ondra.holub – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil ondra.holub – Programujte.comAnonymní profil ondra.holub – Programujte.com

 

Příspěvky odeslané z IP adresy 194.138.12.–

ondra.holub
C / C++ › Vysvětlení backtrace
25. 5. 2010   #129384

Ne, to obvykle nestačí. delete x nenastaví x na 0. A stejně by se tím neošetřil případ typu:

int* p1 = new int(10);

int* p2 = p1;

// ...

delete p1;
p1 = 0;

// ...

// A tady zkusím použít *p2, což vede k chybě, protože p2 odkazuje na uvolněnou paměť.
*p2 = 12345;
V programu je nutné si hlídat to, aby byl vždy jenom jeden vlastník dynamicky alokovaných dat. Tento vlastník se může změnit, ale nemůžou být zároveň dva vlastníci. Tento vlastník je pak jediný, kdo může data uvolnit.

Pokud je řešení vlastnictví obtížné, lze využít i nějakých "chytrých" ukazatelů s reference countingem, které si počítají, kolikrát je daný ukazatel odkazován. V případě, že už ten ukazatel nikdo nereferencuje, paměť je uvolněna. Není to všelék (např. pro cyklické odkazy to dělá problémy), ale je to poměrně snadno a efektivně použitelná věc.

ondra.holub
C / C++ › parsování stringu v C++
26. 3. 2010   #125796

#include <sstream>


std::istringstream iss("ahoj jak se mas?");
std::string token;

while (iss >> token)
{
std::cout << '"' << token << '"';
}

C / C++ › Problém v C++
10. 11. 2009   #118835

undefined reference to `UnionFind::UnionFind(int) znamená, že se nelinkuje nikde definice konstruktoru s jedním parametrem. Takže možná si to přeložíte, ale nelinkujete dohromady všechno.

> set_union a upper_bound je funkce z algoritmu,ne?
Ano, to je pravda. Jenom tím, že tam není #include <algorithm>, tak není zrovna zřejmé, že se jedná o tyto funkce.

Ta metoda make_set nefunguje, protože dostane jako parametr jednu hodnotu typu int, vytvoří si lokální proměnnou mnoziny, do ní něco vloží a metoda končí. To znamená, že se všechny její lokální proměnné zruší. A protože ta metoda nic nevrací, tak to nemá žádný vnější efekt, jenom se vykoná několik zbytečných instrukcí.

C / C++ › Problém v C++
10. 11. 2009   #118827

Pokud je ten výpis kódu obsah zmiňovaného headeru Union_find.h, tak bych k tomu měl tyto připomínky:
- chybí tam #include <set>
- nikde není deklarovaná funkce upper_bound
- nikde není deklarovaná funkce set_union
- v headeru nemá co dělat using namespace na globální úrovni

Všechny body (kromě toho using namespace) zaručují, že se to nemůže přeložit.

Dále:
- metoda make_set něco vloží do nějaké lokální proměnné množiny, ale ta proměnná přestane po opuštění metody existovat. Takže vlastně ta metoda nedělá nic (respektive nic užitečného).

Ale proč to nefunguje je obtížné říct. Lepší by bylo napsat sem ty chybové hlášky.

C / C++ › prevod stringu na cislo
23. 10. 2009   #117702
ondra.holub
C / C++ › IOSTREAM download
20. 10. 2009   #117565

iostream je součástí standardní knihovny C++. Možná by se to dalo najít v STL portu, ale nevím, jestli je tam i iostream. A rozhodně to jenom tak bez úpravy nepojede (a ta úprava určitě nebude triviální). Zkus http://www.stlport.org

Anonymní uživatel
C / C++ › Třídy, dědičnost ?
14. 10. 2009   #117223

Pokud nechceš, aby ta data byla vidět headeru, tak to můžeš udělat takto:

// Soubor trida.hpp

class Trida
{
public:
Trida();
Trida(const Trida& src);
~Trida();

Trida& operator=(const Trida& src);

private:
struct PrivateData;
Private Data* p_;
};

// soubor trida.cpp

struct Trida::PrivateData
{
PrivateData()
{
}

// Spravny copy constructor je nutny pro spravnou funkci
// copy construktoru a operatoru = ve tride Trida
// Jinak neni potreba
PrivateData(const PrivateData& src)
{
}
};

Trida::Trida()
: p_(new PrivateData())
{
}

Trida::Trida(const Trida& src)
: p_(new PrivateData(*src.p_))
{
}

Trida::~Trida()
{
delete p_;
}

Trida& Trida::operator=(const Trida& src)
{
if (this != &src)
{
delete p_;
p_ = new PrivateData(*src.p_);
}

return *this;
}

C / C++ › Pomoc s programom
7. 10. 2009   #116838

Mně to načítá. Je potřeba na vstupu odentrovat, aby se vyprázdnil buffer.

PS: Pokud chceš parsovat matematické výrazy, tak na to budeš muset jít trošku jinak.

C / C++ › Hledání v listu
25. 9. 2009   #116389

#include <iostream>


#include <list>
#include <algorithm>

// tady si nastav jednu z variant 1 az 4
#define VARIANTA 1

#if VARIANTA==3 || VARIANTA==4
#include <boost/lambda/lambda.hpp>
#include <boost/bind.hpp>
#endif

struct struktura
{
struktura(unsigned cislo, int data)
: cislo(cislo),
data(data)
{
}

#if VARIANTA==1
operator unsigned() const
{
return cislo;
}
#endif

#if VARIANTA==2
bool PorovnejCislo(
const struktura& s
) const
{
return cislo == s.cislo;
}
#endif

#if VARIANTA==4
unsigned GetCislo() const { return cislo; }
#endif

unsigned int cislo;
int data;
};

typedef
std::list<struktura> L;

int main()
{
L l;
l.push_back(struktura(4, 1));
l.push_back(struktura(5, 2));
l.push_back(struktura(1, 3));
l.push_back(struktura(12, 4));
l.push_back(struktura(100, 5));
l.push_back(struktura(3, 6));

#if VARIANTA==1
L::const_iterator it = std::find_if(
l.begin(), // Odkud
l.end(), // Pokud
std::bind2nd(std::equal_to<unsigned>(), 12U) // Vyuziti moznosti pretypovani struktury na unsigned
);
#elif VARIANTA==2
L::const_iterator it = std::find_if(
l.begin(), // Odkud
l.end(), // Pokud
std::bind2nd(std::mem_fun_ref(&struktura::PorovnejCislo), 12U)
);
#elif VARIANTA==3
L::const_iterator it = std::find_if(
l.begin(), // Odkud
l.end(), // Pokud
boost::bind(&struktura::cislo, _1) == 12U
);
#elif VARIANTA==4
L::const_iterator it = std::find_if(
l.begin(), // Odkud
l.end(), // Pokud
boost::bind(&struktura::GetCislo, _1) == 12U
);
#endif

if (it == l.end())
std::cout << "Nenalezeno\n";
else
std::cout << "Nalezeno " << it->cislo << ", " << it->data << '\n';
}

C / C++ › Prepisovani radku v C
31. 8. 2009   #115259

Dej si za ten radek s "Ahoj Honzo" jeste

fflush(stdout);
Výstup do stdout se flushuje při odřádkování. Když to chceš dřív, musíš to vynutit.

C / C++ › Problem s C++
21. 8. 2009   #114733

Ano a většina lidí si bohužel z naprosto neznámých důvodů oblíbila DevCpp, přestože např. Code::Blocks to řeší samo bez nějakých super vychytávek v programu.

Anonymní uživatel
C / C++ › velkost pola
23. 7. 2009   #113595

To nezjistíš. Musíš si to předat v dalším parametru. Nebo jak jsem psal výše, můžeš mít to pole ukončené speciálním znakem a pak můžeš délku lehce zjistit dohledáním toho znaku.

ondra.holub
C / C++ › velkost pola
23. 7. 2009   #113589

Offtopic: Je zajímavé, že při psaní předešlé odpovědi jsem byl přihlášený. Za tu cca 1 minutu mně to snad neodhlásilo. A výsledek? Vložil to anonym. Nyní nejsem přihlášený, tak uvidíme, jestli to zase vloží anonym.

Anonymní uživatel
C / C++ › velkost pola
23. 7. 2009   #113588

Vrátí to 4, protože to vrátí velikost ukazatele (v tomto případě ukazatele na char). Pokud je to pole pokaždé jinak dlouhé, tak je potřeba si předat ještě další parametr, ve kterém je délka. sizeof se totiž vyhodnocuje už během překladu a za běhu programu už je tam jenom číslo "natvrdo" vygenerované překladačem.

ondra.holub
C / C++ › Prečo mi nefunguje tento cyk…
23. 7. 2009   #113575

To Bald3rr :
No to já vím, jaký je v tom rozdíl. Měl jsem na mysli právě ten for cyklus:
> for (int i = 0;i<pocetpoloziek;++i) //TUTO MI TO ROBÍ PROBLÉMY!!!
> for (int i = 0;i<pocetpoloziek;i++) //v sumare je to to iste ale radsej si zvykni pouzivat toto
Tam je to (jak jsem psal) pro základní typy (jako int apod.) jedno, ale pokud se jedná např. o iterátor, tak je právě chyba preferovat postinkrementaci (jak někdo psal ve výše citovaném doporučení).

Takže abych shrnul co jsem tím myslel: pokud je významově jedno, která varianta se použije, je lepší si zvyknout na prefixovou variantu, protože někdy může být efektivnější a nikdy není horší.

ondra.holub
C / C++ › Prečo mi nefunguje tento cyk…
23. 7. 2009   #113557

To milan_m :
> for (int i = 0;i<pocetpoloziek;++i) //TUTO MI TO ROBÍ PROBLÉMY!!!
> for (int i = 0;i<pocetpoloziek;i++) //v sumare je to to iste ale radsej si zvykni pouzivat toto

V čem je i++ lepší než ++i? U základních typů je to jedno a u iterátorů je právě naopak lepší ++i, protože se nemusí dělat kopie objektu.

ondra
C / C++ › Odebrání prvku pole v C,prob…
11. 11. 2008   #89508

Prvek z pole se odstraní tak, že všechny prvky za ním se přesunou o jedno místo k začátku a zmenší se nějaké počítadlo počtu volných prvků.

Alternativně je možné někde zvlášť udržovat nějaká data popisující, které prvky jsou platné a které ne. Nebo do neplatného prvku přiřadit speciální hodnotu.

ondra
C / C++ › if vs. else if
5. 11. 2008   #89139

Myslím, že např. v následujícím případě bude vyšší rychlost druhé varianty málo platná, když bude fungovat jinak:

void fn(int a, int b)

{
if (a > 5)
{
a();
}
else if (b < 8)
{
b();
}
}
nebo
void fn(int a, int b)

{
if (a > 5)
{
a();
}
if (b < 8)
{
b();
}
}

ondra
C / C++ › Převod do soustavy
21. 10. 2008   #87996

V C++ lze vyhodit výjimku.

V C i C++ lze vracet speciální hodnotu, která indikuje chybu a nemůže být jinak vrácena. V tomto případě se nabízí třeba nějaké záporné číslo. Nebo třeba 1234.

ondra
C / C++ › v4l2 tutoriály
22. 8. 2008   #83379

Na www.root.cz kdysi vycházel nějaký krátký seriál. Ale už nevím, jestli to bylo o v4l nebo v4l2.

ondra
C / C++ › Code blocks problém
14. 7. 2008   #79421

Jestli je to ve Windows, tak prohledej Documents and Settings\uzivatel\Application Data\codeblocks Nevím, jestli se to na lokalizovaných winech nejmenuje jinak. Tento adresář buď smaž celý nebo v tom najdi to, co chceš změnit. Kdyby to nepomohlo, tak to asi bude ještě někde jinde, tak zkus prohledat registry, ale takto by to snad mohlo stačit.

V Linuxu to bude asi v home adresář .codeblocks. Taky to smaž a je vystaráno.

ondra
C / C++ › standardne hlavicky (linuxu)
10. 7. 2008   #79154

To Tom@sQo : To by mě zajímalo, odkud pochází informace, že v Linuxu se nepoužívá C++.

 

 

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