Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

własne funkcje w c++ builder 6

Ostatnio zmodyfikowano 2020-01-01 18:20
Autor Wiadomość
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
C/C++
#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 ); // a
    if( pozycja != string::npos )
    {
        zmienna.erase( pozycja, 1 );
        zmienna.insert( pozycja, "\\\'b9" );
    }
    pozycja = zmienna.find( - 122 ); // c
    if( pozycja != string::npos )
    {
        zmienna.erase( pozycja, 1 );
        zmienna.insert( pozycja, "\\\'e6" );
    }
    pozycja = zmienna.find( - 87 ); // e
    if( pozycja != string::npos )
    {
        zmienna.erase( pozycja, 1 );
        zmienna.insert( pozycja, "\\\'ea" );
    }
    pozycja = zmienna.find( - 120 ); // l
    if( pozycja != string::npos )
    {
        zmienna.erase( pozycja, 1 );
        zmienna.insert( pozycja, "\\\'b3" );
    }
    pozycja = zmienna.find( - 28 ); // n
    if( pozycja != string::npos )
    {
        zmienna.erase( pozycja, 1 );
        zmienna.insert( pozycja, "\\\'f1" );
    }
    pozycja = zmienna.find( - 94 ); // o
    if( pozycja != string::npos )
    {
        zmienna.erase( pozycja, 1 );
        zmienna.insert( pozycja, "\\\'f3" );
    }
    pozycja = zmienna.find( - 104 ); // s
    if( pozycja != string::npos )
    {
        zmienna.erase( pozycja, 1 );
        zmienna.insert( pozycja, "\\\'9c" );
    }
    pozycja = zmienna.find( - 85 ); // x
    if( pozycja != string::npos )
    {
        zmienna.erase( pozycja, 1 );
        zmienna.insert( pozycja, "\\\'9f" );
    }
    pozycja = zmienna.find( - 66 ); // z
    if( pozycja != string::npos )
    {
        zmienna.erase( pozycja, 1 );
        zmienna.insert( pozycja, "\\\'bf" );
    }
   
    pozycja = zmienna.find( - 92 ); // A
    if( pozycja != string::npos )
    {
        zmienna.erase( pozycja, 1 );
        zmienna.insert( pozycja, "\\\'a5" );
    }
    pozycja = zmienna.find( - 113 ); // C
    if( pozycja != string::npos )
    {
        zmienna.erase( pozycja, 1 );
        zmienna.insert( pozycja, "\\\'c6" );
    }
    pozycja = zmienna.find( - 88 ); // E
    if( pozycja != string::npos )
    {
        zmienna.erase( pozycja, 1 );
        zmienna.insert( pozycja, "\\\'ca" );
    }
    pozycja = zmienna.find( - 99 ); // L
    if( pozycja != string::npos )
    {
        zmienna.erase( pozycja, 1 );
        zmienna.insert( pozycja, "\\\'a3" );
    }
    pozycja = zmienna.find( - 29 ); // N
    if( pozycja != string::npos )
    {
        zmienna.erase( pozycja, 1 );
        zmienna.insert( pozycja, "\\\'d1" );
    }
    pozycja = zmienna.find( - 32 ); // O
    if( pozycja != string::npos )
    {
        zmienna.erase( pozycja, 1 );
        zmienna.insert( pozycja, "\\\'d3" );
    }
    pozycja = zmienna.find( - 105 ); // S
    if( pozycja != string::npos )
    {
        zmienna.erase( pozycja, 1 );
        zmienna.insert( pozycja, "\\\'8c" );
    }
    pozycja = zmienna.find( - 115 ); // X
    if( pozycja != string::npos )
    {
        zmienna.erase( pozycja, 1 );
        zmienna.insert( pozycja, "\\\'8f" );
    }
    pozycja = zmienna.find( - 67 ); // Z
    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
P-175908
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.
C/C++
pozycja = zmienna.find( - 91 ); // a
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(n2). 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).
P-175913
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
P-175914
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++.
P-175915
nanoant20
» 2020-01-01 18:20:25
przejrzyj sobie stary nieaktualizowany materiał do BC++6 odszukaj link Łańcuchy znaków
P-175916
« 1 »
  Strona 1 z 1