#include <iostream>
#include <string>
int main()
{
std::string line;
while (std::getline(std::cin, line))
{
// Tady se zpracuje radek ulozeny v line
// ...
std::cout << '"' << line << "\"\n";
}
}
Příspěvky odeslané z IP adresy 194.138.12.–
Já bych u std::string zkusil i přímo metodu std::string::erase. Někdy je příjemnější možnost přístupu přes indexy (než přes iterátory), přičemž varianta s iterátory zůstává pořád k dispozici.
Jadně, že trim je v C++. Stačí, když si ho člověk dopíše... :-)
Úplně na konci je help = h2 + help3; Ale nikde není definován operátor+, který má na levé straně int a na druhé EArray.
> V konzolovém programu je cesta k programu pod nultym parametrem, tudiz neco takoveho:
Ne, to je rozšířený omyl. Je tam cesta tak, jak byl program spuštěn. Takže když byl spuštěn s plnou cestou, tak tam bude plná cesta. Když byl spuštěn z adresáře, kde se nachází bez uvedení cesty, bude tam jenom jméno binárky. Také může být spuštěn s relativní cestou.
Pokud by se měla cesta ke skutečné binárce získat z argv[0], tak jedině tak, že se na hodnotu argv[0] aplikuje stejný postup, jakým se prohledává aktuální proměnná path, když se hledá program ke spuštění.
Stáhni si mingw z http://tdragon.net/recentgcc/
Funkce
double funkce(double(*f)(double), double a, double b, int N)
bere jako první parametr ukazatel na funkci, která má jeden parametr typu double a vrací double. Proměnná, která reprezentuje ten první parametr, se jmenuje f. Tu funkci je možné z funkce "funkce" normálně volat jako f(1.2345). To zonda : Pokud tam jenom přidáváš řetězce, tak std::string má metodu append. Na ostatní typy si můžeš napsat třeba toto:
#include <sstream>
#include <string>
template<typename T, typename CH, typename TRAITS, typename ALLOCATOR>
std::basic_string<CH, TRAITS, ALLOCATOR>& operator +=(
std::basic_string<CH, TRAITS, ALLOCATOR>& s,
const T& value
)
{
std::basic_ostringstream<CH, TRAITS> oss;
oss << value;
return s.append(oss.str());
}
a rázem to funguje pro všechny typy, které mají definován operátor<<.Jo, to výše uvedené funguje, pokud je zdroják v kódování cp1250.
To pidgin : Vzhledem k tomu, že se jedná o C++ zdroják, tak je třeba to překládat pomocí g++. gcc defaultně překládá C zdroják.
> A otázka je, jestli někoho z vás nenapadá nějaké jiné (lepší, elegantnější, méně pracné, hotové smajlik ) řešení?
Jednodušší je otevřít to rovnou v jakémkoliv webovém prohlížeči.
Prostě se jenom musíš přesvědčit, že nesaháš někam mimo ten vektor. A pak tam vlezeš rovnou přes index prvku metodou at. Iterátorem by to asi bylo zbytečně hodně komplikované.
Nevím, jestli to podporuje všechna požadovaná rozložení, ale něco je v http://www.boost.org/doc/libs/1_40_0/libs/random/index.html (vkládám počtvrté)
To KIIV : Firefox 3.5.3 nebo IE 6.x. Je to jedno, prohlížečem to asi není. Psal jsem adminům, dělá mi to jenom tady. A asi to nedělá nikomu jinému. IP adresa by se měnit neměla.
Tak jsem sem 5 minut psal odpověď i s příkladem. Bohužel se to tu neobjevilo, protože když jsem to psal, byl jsem přihlášený, ale po odeslání se tento systém asi rozhodl, že zrovna přihlášený nejsem. A tudíž jsem nevyplnil ten kvíz s dotazy, jestli spamuji apod. A proto se ten příspěvek asi nepřidal. Náhled samozřejmě nefunguje (pokud tedy požadovaná funkcionalita není smazání toho, co jsem napsal).
O kvalitě svědčí i ta záhadná preference dotazu Probel se zapisem do souboru http://programujte.com/index.php?akce=diskuze&kam=vlakno&tema=12896-probel-se-zapisem-do-souboru , do kterého už tři měsíce nikdo nic nenapsal, ale pořád je nejnovější.
Kvízy vyplňovat nebudu, proto jsem přihlášen. O mé odpovědi systém nestojí, takže nezbývá, než zůstat u diskusí na http://forum.builder.cz/list.php?123 , které fungují.
Pokus číslo 3 o vložení příspěvku.
Toto fórum má opravdu debilní rozhraní. Zase jsem vložil odpověď a ta odpověď tam není. Pominu to, že jsem chvilku přihlášený a chvilku ne, na tuto otravnost jsem si už zvykl. Ale proč se skoro nikdy nepodaří tu odpověď vložit? Náhkled samozřejmě nezkouším, při něm se to ztratí vždycky.
Takže ještě jednou: zkus nslookup localhost. Původní odpověď byla delší, ale už se mi to opravdu nechce psát znovu.
Oprava metody PorovnejCislo.
#include <iostream>
#include <list>
#include <algorithm>
// tady si nastav jednu z variant 1 az 4
#define VARIANTA 2
#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(
unsigned c
) const
{
return cislo == c;
}
#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';
}
Jestli jsem pochopil správně, že se má jednat o chování stejné jako při psaní hesla, tak to bude chtít jiný přístup než přes std::cin. Bude nutné to udělat systémově závislé.
std::cin nemá (bohužel) přímo žádné prostředky, kterými by bylo možné zjistit, odkud to vlastně ve skutečnosti čte. Může to být klávesnice, std::cout jiného programu po přesměrování (tedy roura), pojmenovaná roura, socket, přímo soubor, textový terminál, grafický terminál.
Bude nutné využít funkcionality závislé na konkrétním os nebo najít nějakou multiplatformní knihovnu, která umí odchytávat klávesy.
A nezkouseli jste nekdo pouzit Code::Blocks misto Eclipse ? Eclipse se mi ekluje (nebo ecluje ?) protoze je v Jave. Videl jsem to monstrum startovat jen jednou, pak jsem jej smazal.
CB by melo taky umet vsechno vcetne debuggingu a propojenim s GDB (at uz AVR nebo ARMu)...
Nezalamoval bych se posíláním přímo z programu. Stačí to spustit jako
program | mail -s "vysledky" adresa@email.com
Pokud to má jet na platformě, kde program mail není (např. Windows, DOS apod.), tak se dá něco odobnémho stáhnout (např. nějaký bmail).Buď víš, že se jedná o text ukončený znakem nula - typické C-řetězce a zpracovávat to až po ten ukončovací znak. Nebo si přidat tu délku:
void najdi_zmaz(char *s, size_t delka, char *s1, int u)
{
...
Zkus si pohrát s tímto příkladem a bude to jasné:
#include <iostream>
#include <iomanip>
int main()
{
const double d = 123456.789;
std::cout << std::fixed << std::setw(20) << std::setprecision(12) << d << '\n';
std::cout << std::scientific << std::setw(20) << std::setprecision(12) << d << '\n';
}
Osobně mi to připadá, že program byl slinkován s nějakou jinou verzí dll, než s jakou se to spouští. Zkus ty správné dll nakopírovat do stejného adresáře, kde máš exe.
V C např. takto:
#include <stdio.h>
#include <stdint.h>
enum YesNo
{
NO = 0x0,
YES = 0xF
};
struct Xyz
{
unsigned data_:4;
unsigned yes_no_:4;
};
union Int4
{
struct Xyz xyz_;
uint8_t integer_;
};
int main(void)
{
union Int4 i4;
i4.xyz_.yes_no_ = YES;
i4.xyz_.data_ = 5;
printf("0x%x\n", i4.integer_);
for (int i = 0; i < 20; ++i)
{
i4.xyz_.data_++;
printf("0x%x\n", i4.integer_);
}
return 0;
}
Pokud by to dělalo problémy s little a big endian, tak lze pořadí v té struktuře změnit na základě nějakého #ifdefu. Obecně je možné nadělat si nějaké přístupové funkce pro jednodušší přístup.
V C++ bych to řešil podobně, jenom by se to dalo ještě zabalit do nějaké třídy a dodefinovat inline přístupové metody nebo nějaké operátory, např. ++ a -- by měnily jenom tu integerovou část, apod. Podle libosti a potřeby.
Jinak v tomto programu vidím několik problémů:
1. Nejde přeložit. Vypadá to (minimálně podle koncovky souboru a podle void ve funkcích bez parametrů) jako C, ale např. na řádku 27 je delete, což je C++
2. Ve funkci main se volá opět funkce main. To je chyba. Jednak se to vůbec nemá dělat a za druhé je tam zbytečná rekurze.
Celý switch by měl jít do nějakého cyklu, klidně nekonečného (např. for(;;) ) a na nějakou volbu z menu vyskočit ven (buď break nebo rovnou return 0).
3. Řádky 13, 43, 60, 100: parametr funkce je pole s proměnnou délkou. To sice projde v gcc, ale není to standardní a není to přenositelné. Pokud je potřeba předat pole proměnlivé délky, předává se obvykle ukazatel na první prvek a v nějakém dalším parametru délka.
4. Zbytečně se tam používají globální proměnné i, j, k. Cykly ve funkcích nepoužívají lokální proměnné.
Pro začátek bych zkusil udělat ta pole s fixní velikostí, zrušit globální proměnné a rozchodit to v této verzi.
Až to bude fungovat, tak udělat ta pole dynamická. To znamená, že se na začátku zjistí, jak to pole má být dlouhé a pak se dynamicky naalokuje potřebná paměť funkcí malloc.
To kterosuom :
OK, tak se musí udělat druhý iterátor a ten zmenšit, když už zapomněli na operator-:
const TestDataList::iterator end = l.end();
for (TestDataList::iterator it = l.begin(); it != end; ++it)
{
if (it != l.begin())
{
TestDataList::iterator prev = it;
--prev;
int x = (*prev)->idata_;
}
}
Na kontrolu, jestli je něco NaN by mohlo stačit
if (x != x) { /* je NaN */ }
> Jakou vezrzi Dev-C++ mám používat?
Žádnou. Používejte např. Code::Blocks.