Bartex321 Temat założony przez niniejszego użytkownika |
własne funkcje w c++ builder 6 » 2020-01-01 11:21:37 Witam, stworzyłem niedawno kreator plków rtf w c++, teraz próbuję przeniesć to do c++ buildera i dodać frontend, niestety funkcja zmieniająca polskie znaki wczytane z klawiatury na ich kody w rtf zaczęła wywoływać błąd #include <vcl.h> #pragma hdrstop #include <fstream> #include <string> #include <vector> #include "Unit1.h" #pragma package(smart_init) #pragma resource "*.dfm"
string ZamienZnaki( string zmienna ) { size_t pozycja; pozycja = zmienna.find( - 91 ); if( pozycja != string::npos ) { zmienna.erase( pozycja, 1 ); zmienna.insert( pozycja, "\\\'b9" ); } pozycja = zmienna.find( - 122 ); if( pozycja != string::npos ) { zmienna.erase( pozycja, 1 ); zmienna.insert( pozycja, "\\\'e6" ); } pozycja = zmienna.find( - 87 ); if( pozycja != string::npos ) { zmienna.erase( pozycja, 1 ); zmienna.insert( pozycja, "\\\'ea" ); } pozycja = zmienna.find( - 120 ); if( pozycja != string::npos ) { zmienna.erase( pozycja, 1 ); zmienna.insert( pozycja, "\\\'b3" ); } pozycja = zmienna.find( - 28 ); if( pozycja != string::npos ) { zmienna.erase( pozycja, 1 ); zmienna.insert( pozycja, "\\\'f1" ); } pozycja = zmienna.find( - 94 ); if( pozycja != string::npos ) { zmienna.erase( pozycja, 1 ); zmienna.insert( pozycja, "\\\'f3" ); } pozycja = zmienna.find( - 104 ); if( pozycja != string::npos ) { zmienna.erase( pozycja, 1 ); zmienna.insert( pozycja, "\\\'9c" ); } pozycja = zmienna.find( - 85 ); if( pozycja != string::npos ) { zmienna.erase( pozycja, 1 ); zmienna.insert( pozycja, "\\\'9f" ); } pozycja = zmienna.find( - 66 ); if( pozycja != string::npos ) { zmienna.erase( pozycja, 1 ); zmienna.insert( pozycja, "\\\'bf" ); } pozycja = zmienna.find( - 92 ); if( pozycja != string::npos ) { zmienna.erase( pozycja, 1 ); zmienna.insert( pozycja, "\\\'a5" ); } pozycja = zmienna.find( - 113 ); if( pozycja != string::npos ) { zmienna.erase( pozycja, 1 ); zmienna.insert( pozycja, "\\\'c6" ); } pozycja = zmienna.find( - 88 ); if( pozycja != string::npos ) { zmienna.erase( pozycja, 1 ); zmienna.insert( pozycja, "\\\'ca" ); } pozycja = zmienna.find( - 99 ); if( pozycja != string::npos ) { zmienna.erase( pozycja, 1 ); zmienna.insert( pozycja, "\\\'a3" ); } pozycja = zmienna.find( - 29 ); if( pozycja != string::npos ) { zmienna.erase( pozycja, 1 ); zmienna.insert( pozycja, "\\\'d1" ); } pozycja = zmienna.find( - 32 ); if( pozycja != string::npos ) { zmienna.erase( pozycja, 1 ); zmienna.insert( pozycja, "\\\'d3" ); } pozycja = zmienna.find( - 105 ); if( pozycja != string::npos ) { zmienna.erase( pozycja, 1 ); zmienna.insert( pozycja, "\\\'8c" ); } pozycja = zmienna.find( - 115 ); if( pozycja != string::npos ) { zmienna.erase( pozycja, 1 ); zmienna.insert( pozycja, "\\\'8f" ); } pozycja = zmienna.find( - 67 ); if( pozycja != string::npos ) { zmienna.erase( pozycja, 1 ); zmienna.insert( pozycja, "\\\'af" ); } return zmienna; }
Powyżej oczywiście nagłówki, oraz wspomniana funkcja Błąd, który widnieje w logu kompilacji to: [C++ Error] Unit1.cpp(85): E2141 Declaration syntax error linia 85 to: string ZamienZnaki(string zmienna) - deklaracja funkcji |
|
pekfos |
» 2020-01-01 15:16:16 E2141 Declaration syntax error |
To naprawdę cały błąd? Po co w ogóle używasz programu, który mógłby już legalnie kupować alkohol? No nieważne.. strzelam że chodzi o nieznany typ string. Brakuje std::. Co do Twojej funkcji, co za straszliwie nieoptymalne spaghetti! Kopiuj-wklej to najgorszy programista. pozycja = zmienna.find( - 91 ); if( pozycja != string::npos ) { zmienna.erase( pozycja, 1 ); zmienna.insert( pozycja, "\\\'b9" ); } Ten fragment powinien być parametryzowany, żeby usunąć niepotrzebne powtórzenia w kodzie. Co do samego algorytmu - jego wydajność jest beznadziejna - w najgorszym przypadku O(n 2). Funkcje insert i erase nie nadają się do takiego zastosowania, bo zmiana 1 znaku może wymagać zmiany we wszystkich znakach napisu (np usuwanie pierwszego). Znacznie lepszym podejściem jest budowanie docelowego napisu od zera, zamiast przekształcania napisu wejściowego. Wtedy możesz zastąpić dwie operacje O(n) jedną O(1). |
|
Bartex321 Temat założony przez niniejszego użytkownika |
» 2020-01-01 15:40:35 Na początku przepraszam i obiecuję poprawę - faktycznie nie wygląda to najlepiej, oraz dziękuję zarówno za przypomnienie o przestrzeni nazw, jak i pomysł, aby budować string od zera Co do programu, szukając w internecie środowiska do okienkowego C++ znalazłem właśnie buildera, więc go pobrałem, szczerze mówiąc mnie też trochę denerwuję, więc bardzo proszę o polecenie czegoś innego EDIT: W związku z problemem teraz kompilator ma takie problemy: E2034 Cannot convert 'string' to 'const char *' , oraz E2342 Type mismatch in parameter '__s' (wanted 'const char *', got 'string') . plik.open(nazwaPliku, ios::out); próba otwarcia pliku przepraszam, że tyle razy to edytuje, ale z czasem sam znalazłem rozwiązanie kilku błędów |
|
pekfos |
» 2020-01-01 17:10:27 Błędy masz dlatego, że kod jest napisany z użyciem C++11, a kompilator masz z 2002 roku. 11 znaczy 2011. Co do programu, szukając w internecie środowiska do okienkowego C++ znalazłem właśnie buildera, więc go pobrałem, szczerze mówiąc mnie też trochę denerwuję, więc bardzo proszę o polecenie czegoś innego |
Notatnik? Okienka się biorą z używanych bibliotek. Nie ma sensu zmieniać kompilatora na inny. Środowisko może najwyżej mieć generator kodu źródłowego do jakiejś konkretnej biblioteki, tak by interfejs można było projektować klikaniem, a nie pisaniem. Visual Studio ma coś do bodajże WinAPI, QtCreator do Qt, Code::Blocks miało coś do wxWidgets (plugin wxSmith). Osobiście polecam Visuala, ale nigdy nie używałem ich generatora do C++ - polecam przede wszystkim dlatego że to bardzo dobre środowisko do programowania w C++. |
|
nanoant20 |
» 2020-01-01 18:20:25 przejrzyj sobie stary nieaktualizowany materiał do BC++6 odszukaj link Łańcuchy znaków |
|
« 1 » |