Skocz do zawartości

Problem z pewną funkcją.


raVVal

Rekomendowane odpowiedzi

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:

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

int c = 10;
int* a = new int[c];
a[0] = 5;
delete[] a;
a = nullptr;

Odnośnik do komentarza
Udostępnij na innych stronach

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ą.

Odnośnik do komentarza
Udostępnij na innych stronach

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();
}

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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;
}

Odnośnik do komentarza
Udostępnij na innych stronach

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];

Odnośnik do komentarza
Udostępnij na innych stronach

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 <=.

Odnośnik do komentarza
Udostępnij na innych stronach

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ę...