Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: petr_bures 23. 02. 2020, 20:48:27

Název: Objasnění chyb v C++
Přispěvatel: petr_bures 23. 02. 2020, 20:48:27
Tento kód mě vypisuje 6 chyb, proč? Dělal jsem to podle tutoriálu a výsledek tohle  >:(
Kód: [Vybrat]
#include <iostream>
#include <vector>
#include <string>

using namespace std;

string filesPath = "\\Users\\Petr\\Documents\\Temp";

vector<string> txt;

int i = 0;

void delfile(const string file){
          if (remove(file)) {
                    cout << "Error!";
          }
          else {
                    cout << "Success!";
          }
}

void addtxt() {
          txt.push_back("aaaaaaaaaaaaaa");
          txt.push_back("bbbbbbbbbbbbbb");
}

int main(){
          addtxt();
          delfile(filesPath + "\\" + txt[i]);
}



Kód: [Vybrat]
Chyba (aktivní) E0413 Neexistuje žádná vhodná funkce pro převod z "const std::string" na "const char *". program C:\program.cpp 14
Chyba C2664 int remove(const char *): Nejde převést argument 1 z: std::string na: const char *. program C:\program.cpp 14
Chyba C2146 Chyba syntaxe: Chybí ; před identifikátorem cout. program C:\program.cpp 14
Chyba C2429 vlastnost jazyka příkazy init-statement v if/switch vyžaduje příznak kompilátoru /std:c++17 program C:\program.cpp 14
Chyba C2059 chyba syntaxe: << program C:\program.cpp 14
Chyba C2181 neplatné else bez odpovídajícího if program C:\program
Název: Re:Objasnění chyb v C++
Přispěvatel: Cikáda 23. 02. 2020, 22:04:50
Protože jsi to udělal špatně nebo jde o nějaký vadný tutoriál.

Pravděpodobně to první, když je z první chyby jasné, že ti to nesedí typově...

Ten const char* je klasické céčkové pole, string je trošku složitější kontejner. Můžeš z něj to pole dostat metodou c_str(), ale to moc nechceš. Ono když už máš C++, tak používej C++ a ne C.
Název: Re:Objasnění chyb v C++
Přispěvatel: petr_bures 23. 02. 2020, 22:12:53
No to jsi mě nikam neposunul..  :)
Název: Re:Objasnění chyb v C++
Přispěvatel: Cikáda 23. 02. 2020, 22:33:03
Ono se těžko posouvá, když vždycky dostaneme jiný kód, než se kterým pracuješ. K té typové chybě jsem se vyjádřil poměrně jasně, nemáš-li další dotazy, tak nevím, jak chceš posunout..
Název: Re:Objasnění chyb v C++
Přispěvatel: alex6bbc 23. 02. 2020, 22:53:23
pravidla, ktera je vhodna dodrzovat.

* nedelej globalni promenne
* predavej promenne do metod hodnotou, referenci nebo pointerem
* zkus nemichat C a C++

Název: Re:Objasnění chyb v C++
Přispěvatel: mudrlant 23. 02. 2020, 23:25:33
V C++ můžete s řetězci pracovat v zásadě dvojím způsobem - buď nízkoúrovňově, což se jedná o buffer se sekvencí bytů ukončený nulovým bytem (neuvažuji teď UTF16 kódování) - pokud tento buffer někam chcete předat, často předáváte jen adresu jeho pořátku (pointer typu char *).
Nebo můžete používat nějaký wrapper nad bufferem, který poskytuje obvyklé řetězcové funkce. Dřív si mnohé knihovny definovaly svůj warpper (QString, wxString, atd.), teď už jeto naštěstí standardizováno v std::string apod. třídách.

V kódu používáte funkci remove(char*), která očekává adresu nízkoúrovňového bufferu, ale vy jí předávat zaobalovací typ.
Musíte tedy v tomto případě předat adresu bufferu, který je zaobalen. std::string na to má metodu c_str(), takže v kódu použijete výraz remove(file.c_str()).
Název: Re:Objasnění chyb v C++
Přispěvatel: petr_bures 23. 02. 2020, 23:41:50
A jak poznám, že je to kód pro C a ne pro C++?
Název: Re:Objasnění chyb v C++
Přispěvatel: petr_bures 23. 02. 2020, 23:45:01
V C++ můžete s řetězci pracovat v zásadě dvojím způsobem - buď nízkoúrovňově, což se jedná o buffer se sekvencí bytů ukončený nulovým bytem (neuvažuji teď UTF16 kódování) - pokud tento buffer někam chcete předat, často předáváte jen adresu jeho pořátku (pointer typu char *).
Nebo můžete používat nějaký wrapper nad bufferem, který poskytuje obvyklé řetězcové funkce. Dřív si mnohé knihovny definovaly svůj warpper (QString, wxString, atd.), teď už jeto naštěstí standardizováno v std::string apod. třídách.

V kódu používáte funkci remove(char*), která očekává adresu nízkoúrovňového bufferu, ale vy jí předávat zaobalovací typ.
Musíte tedy v tomto případě předat adresu bufferu, který je zaobalen. std::string na to má metodu c_str(), takže v kódu použijete výraz remove(file.c_str()).
Díky a to je řešní, aby se vlk nažral, nebo je to správně?
Název: Re:Objasnění chyb v C++
Přispěvatel: mudrlant 23. 02. 2020, 23:55:21
Je to správné řešení, byť není tak hezké, jak bychom v C++ chtěli.
Od novější verze C++17 už existují způsoby mazání souborů, kam se nemusí předávat adresa bufferu (std::filesystem::remove()), ale s tím bych počkal, takový moderní kompilátor nemusíte mít všude, kromě toho byste se musel učit další typy.
Název: Re:Objasnění chyb v C++
Přispěvatel: mudrlant 23. 02. 2020, 23:57:59
V C++ nejednou narazíte na to, že ne každá funkcionalita je napsána s ohledem na C++, a tudíž si tu a tam budete muset vypomoci s funkcí, která je pro C a tam pak musíte zkonvertovat typy. Základní knihovna C++ se postupně doplňuje s každou verzí, nicméně není to dokonalé a ve starších verzích kompilátoru se bez C-verzí funkcí neobejdete.
Název: Re:Objasnění chyb v C++
Přispěvatel: alex6bbc 24. 02. 2020, 06:23:19
nebo pokud jste zacatecnik tak zkuste nejprve Go.

ja delam hlavne v C a C++ a Go se mi zalibilo, je to navrat ke korenum.
Název: Re:Objasnění chyb v C++
Přispěvatel: honzik1111 24. 02. 2020, 09:26:14
Citace
Dělal jsem to podle tutoriálu

teky není na škodu poskytnout odkaz na ten tutoriál, ať máme srovnání

Název: Re:Objasnění chyb v C++
Přispěvatel: nikto4e 24. 02. 2020, 15:42:12
Kód: [Vybrat]
#include <iostream>
#include <vector>
#include <string>

using namespace std;

string filesPath = "\\Users\\Petr\\Documents\\Temp";

vector<string> txt;

int i = 0;

void delfile(const string file){
          if (remove(file.c_str())) {
                    cout << "Error!";
          }
          else {
                    cout << "Success!";
          }
}

void addtxt() {
          txt.push_back("aaaaaaaaaaaaaa");
          txt.push_back("bbbbbbbbbbbbbb");
}

int main(){
          addtxt();
          delfile(filesPath + string("\\") + txt[i]);
}

na string bolo treba zavolať c_str(). (riadok 14)