Objasnění chyb v C++

Objasnění chyb v C++
« kdy: 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
« Poslední změna: 23. 02. 2020, 21:22:31 od Petr Krčmář »


Re:Objasnění chyb v C++
« Odpověď #1 kdy: 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.

Re:Objasnění chyb v C++
« Odpověď #2 kdy: 23. 02. 2020, 22:12:53 »
No to jsi mě nikam neposunul..  :)

Re:Objasnění chyb v C++
« Odpověď #3 kdy: 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..

alex6bbc

  • *****
  • 1 544
    • Zobrazit profil
    • E-mail
Re:Objasnění chyb v C++
« Odpověď #4 kdy: 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++



Re:Objasnění chyb v C++
« Odpověď #5 kdy: 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()).

Re:Objasnění chyb v C++
« Odpověď #6 kdy: 23. 02. 2020, 23:41:50 »
A jak poznám, že je to kód pro C a ne pro C++?

Re:Objasnění chyb v C++
« Odpověď #7 kdy: 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ě?

Re:Objasnění chyb v C++
« Odpověď #8 kdy: 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.

Re:Objasnění chyb v C++
« Odpověď #9 kdy: 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.

alex6bbc

  • *****
  • 1 544
    • Zobrazit profil
    • E-mail
Re:Objasnění chyb v C++
« Odpověď #10 kdy: 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.

Re:Objasnění chyb v C++
« Odpověď #11 kdy: 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í


Re:Objasnění chyb v C++
« Odpověď #12 kdy: 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)