Skocz do zawartości

Problem z pewną funkcją.


Rekomendowane odpowiedzi

Opublikowano

Mam problem, mianowicie:

 

 

std::string translateLC(std::string a, std::string code)
{
    // Przygotowanie klucza.
    std::string bufor;
    std::string I[(code.size())/2];
    std::string II[(code.size())/2];
    for (int i = 0; i <= code.size()/2; i += 2)
    {
        I[i] = a[i];
        II[i+1] = a[i+1];
    }
    // Zamiana znak po znaku.
    for (int i=0; i <= a.size(); i+=1)
    {
        bufor = a[i];
        for (int l=0; l <= code.size()/2; i++)
        {
            if (bufor == I[l])
            {
                a.erase(l, 1);
                a.insert(l, II[l]);
                break;
            }
            else if (bufor == II[l])
            {
                a.erase(l, 1);
                a.insert(l, I[l]);
                break;
            }
        }
        return a;
            
            


}

 

 

 

 

Oto kod mojej funkcji która ma tłumaczyć napis(a) według podanego kodu(code). Niestety kompilator zasypuje mnie błędami:

 

 

1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(10) : error C2061: syntax error : identifier 'std'

1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(22) : error C2057: expected constant expression

1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(22) : error C2466: cannot allocate an array of constant size 0

1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(22) : error C2133: 'I' : unknown size

1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(23) : error C2057: expected constant expression

1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(23) : error C2466: cannot allocate an array of constant size 0

1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(23) : error C2133: 'II' : unknown size

1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(24) : warning C4018: '<=' : signed/unsigned mismatch

1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(30) : warning C4018: '<=' : signed/unsigned mismatch

1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(33) : warning C4018: '<=' : signed/unsigned mismatch

1>c:\users\rafał\documents\visual studio 2008\projects\j\j\main.cpp(8) : error C2601: 'main' : local function definitions are illegal

1> c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(19): this line contains a '{' which has not yet been matched

1>c:\users\rafał\documents\visual studio 2008\projects\j\j\main.cpp(16) : fatal error C1075: end of file found before the left brace '{' at 'c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(19)' was matched

 

 

Tak dla ścisłości to kod wygląda tak:

 std::string GDstd = "GADERYPOLUKIÓŁgaderypolukiół";

 

Mam nadzieję, że ktoś mi pomoże, Z góry wielkie dzięki! :thumbsup:

Opublikowano

1. #include <string>

2. niedynamiczne tablice muszą mieć rozmiar znany kompilatorowi. nie możesz tam dac zmiennej, która nie byłaby z modyfikatorem const.

Opublikowano
Użyć dynamicznej alokacji, czyli new.
Heh... jakiś przykładzik?? New mi się obiło u uszy, ale nie miałem okazji skorzystać. :rolleyes:
Opublikowano
int c = 10;
int* a = new int[c];
a[0] = 5;
delete[] a;
a = nullptr;

Opublikowano
a w moim przypadku to by wyglądało: ...

kolejny niemyślący logicznie "programista"?

googluj w takim razie tutorial jak używać tablic dynamicznych - nijak się to nie różni od statycznych, jedynie alokacją i dealokacją.

Opublikowano

Dzięki, to zlikwidowało troche błędów ale jeszcze zostały:

1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(10) : error C2061: syntax error : identifier 'std'

1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(24) : warning C4018: '<=' : signed/unsigned mismatch

1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(30) : warning C4018: '<=' : signed/unsigned mismatch

1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(33) : warning C4018: '<=' : signed/unsigned mismatch

1>c:\users\rafał\documents\visual studio 2008\projects\j\j\main.cpp(6) : error C2601: 'main' : local function definitions are illegal

1> c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(19): this line contains a '{' which has not yet been matched

1>c:\users\rafał\documents\visual studio 2008\projects\j\j\main.cpp(12) : fatal error C1075: end of file found before the left brace '{' at 'c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(19)' was matched

Pokażę może jeszcze main:

#include <iostream>
#include <conio.h>
#include "LC.h"

int main()
{
    std::string napis;
    std::cin>>napis;
    std::cout<<translateLC(napis, GDstd)<<std::endl;
    getch();
}

Opublikowano

Main powinno być void jeśli nie zwraca funkcji, brakuje jednej klamry zamykającej w lc.h, nadal nie widzę include string, na razie tyle bo czytam to na małym ekraniku od fona.

EDIT te <= to zapewne i jest signed a a.size unsigned, zamień i na unsigned i po problemie, jak byś nie wiedział jak to przed int dajesz unsigned.

Opublikowano

Teraz wszystko wygląda tak.

LC.h

 

#include <string>

const std::string GDstd = "GADERYPOLUKIÓŁgaderypolukiół";






std::string translateLC(std::string a, std::string code);







std::string translateLC(std::string a, std::string code)
{
    // Przygotowanie klucza.
    std::string bufor;
    std::string * I = new std::string[(code.size())/2];
    std::string * II = new std::string[(code.size())/2];
    for (unsigned int i = 0; i <= code.size()/2; i += 2)
    {
        I[i] = code[i];
        II[i+1] = code[i+1];
    }
    // Zamiana znak po znaku.
    for (unsigned int i=0; i <= a.size(); i+=1)
    {
        bufor = a[i];
        for (unsigned int l=0; l <= code.size()/2; i++)
        {
            if (bufor == I[l])
            {
                a.erase(l, 1);
                a.insert(l, II[l]);
                break;
            }
            else if (bufor == II[l])
            {
                a.erase(l, 1);
                a.insert(l, I[l]);
                break;
            }
        }
    }
        return a;
            
            


}

 

 

main.cpp

 

#include <iostream>
#include <conio.h>
#include "LC.h"

int main()
{
    std::string napis;
    std::cin>>napis;
    std::cout<<translateLC(napis, GDstd)<<std::endl;
    getch();
    return 0;
}

Opublikowano
Po pierwszę nie ma tego w kodzie, po drugie jaki błąd?

Podałem jak teraz wygląda.

 

a błąd to taki w messagebox'ie po wpisani słowa do przetłumaczenia róne napisy i dziwne liczby coś unhandled exception

Opublikowano
for (unsigned int i=0; i <= a.size(); i+=1)

na

 for (unsigned int i=0; i < a.size(); i+=1)

 

edit: w przypadku drugiej wewnętrznej pętli to samo + zwolnij pamięć ze sterty.

Opublikowano

Właśnie tak zrobiłem dalej ten błąd. A i dla jasności to nie błąd który pojawia się w kompilatorze tylko podczas działania programu. Dokładniej kiedy wpiszę to co ma przetłumaczyć czyli praktycznie w momencie uruchomienia funkcji. Zatrzymuje się na

I[i] = code[i];

Opublikowano

Zasadniczo to przy użyciu wbudowanego typu std::string nie powinno się korzystać z alokacji na stercie jako, że klasa stringa sama zajmuje się pamięcią.

 

użycie klasy string:

 

string str;

 

str.resize(x);

 

str[x]='a';

 

itd...

 

 

W twoim przypadku jeśli chcesz zostać przy swoim rozwiązaniu zwolnij pamięć przed słowem kluczowym 'return'.

 

Kolejna sprawa to parametry. Obiekty powinno przesyłać się jako referencje '&' lub wskaźniki. Inaczej leci nam mila i kosztowna operacja kopiowania.

 

edit:

Zatrzymuje się ponieważ znowu maziasz po pamięci:

for (unsigned int i = 0; i <= code.size()/2; i += 2)

na

for (unsigned int i = 0; i < code.size()/2; i += 2)

 

string.size() daje wielkość tablicy ale przecież indeksujesz od zera a nie od jedynki czyli < a nie <=.

Opublikowano

Kod trzeba sprawdzić:

for (int l=0; l <= code.size()/2; i++)

 

bawisz się l a inkrementujesz i? logiczne, że będzie "latać" w nieskończoność. Trochę skupienia i chwila poświęcona na sprawdzenie kodu zawsze jest wymagana.

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...