• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Crash programu

VPS Starter Arubacloud
0 głosów
297 wizyt
pytanie zadane 19 kwietnia 2020 w C i C++ przez kiecam4 Nowicjusz (120 p.)

Witam, mam zadanie dotyczące programu szyfrującego kolumnowo w języku c++. Jednak gdy go odpalam, to następuje natychmiastowy crash programu. Czy ktoś wie w czym może być problem?

oto program:

#include <iostream>
#include <cstdlib>
#include <string>

using namespace std;

string szyfruj()
{
    string tekst="UCZCIWOSCZBIERAPOCHWALYIUMIERAZZIMNA";
    int dl= tekst.length();

    int n,m;
    n=4;
    int k;
    int l;
    int kol;
    string tablica[m-1][n-1];
    int klucz[n-1];

    string wynik;

    if(dl%n!=0)
    {
        m=dl/n+1;
    }
    else
    {
        m=dl/n;
    }

    for(int i=0;i<m-1;i++)
    {
        for(int j=0;j<n-1;j++)
        {
            tablica[i][j]="\0";
        }
    }

    k=0;

    for(int i=0;i<m-1;i++)
    {
        for(int j=0;j<n-1;j++)
        {
            if(k<dl)
            {
                tablica[i][j]=tekst[k];
                k=k+1;
            }
            else
            {
                tablica[i][j]="\0";
            }
        }
    }

    wynik="";

    while(kol<n-1)
    {
        kol=klucz[k];

        for(int i=0;i<m-1;i++)
        {
            if(tablica[i][kol]!="\0")
            {
                wynik+=tablica[i][kol];
            }
        }
    }

    return wynik;

}

int main() {
    szyfruj();

    return 0;
}

 

komentarz 19 kwietnia 2020 przez tkz Nałogowiec (42,020 p.)
Czytałeś błędy kompilatora?

Zwróć uwagę na rozmiar, a właściwie jego brak w kwadratowych klamrach w linii 17. Jakiego rozmiaru jest n i m?
komentarz 19 kwietnia 2020 przez kiecam4 Nowicjusz (120 p.)
n=4
wielkość m inicjuje w if{}else{} który przestawiłem przed string tablica[][]
komentarz 19 kwietnia 2020 przez tkz Nałogowiec (42,020 p.)
Kompilator czyta kod od góry, w chwili deklaracji tablicy m jest "śmieciem".

1 odpowiedź

+1 głos
odpowiedź 19 kwietnia 2020 przez LuQ232 Mądrala (7,200 p.)

Program wysypuje się bo nie wie ile wynosi "m".

string tablica[m-1][n-1];

inicjujesz m ale nie przypisujesz wartości

komentarz 19 kwietnia 2020 przez kiecam4 Nowicjusz (120 p.)

Zamieniłem miejscami

    string tablica[m-1][n-1];

z

if(dl%n!=0)
    {
        m=dl/n+1;
    }
    else
    {
        m=dl/n;
    }

teraz program się nie crashuje ale nie zwraca wartości wynik. Czy wiesz czym to może być spowodowane?

komentarz 19 kwietnia 2020 przez LuQ232 Mądrala (7,200 p.)

Dokładnie ten sam problem. Inicjujesz zmienną kol, ale nie przypisujesz jej wartości na starcie. Przez to nigdy nie wchodzisz do tej pętli:

while(kol<n-1)
    {
       //TU NIE WCHODZISZ!!!
    }

 

komentarz 19 kwietnia 2020 przez kiecam4 Nowicjusz (120 p.)

jeszcze mam jeden problem. Zmieniłem trochę kod, ale kiedy szyfruje tekst to każdą literę tekstu zmienia w ten sam znak np. eeeeeeeee lub +++++++++++ albo *********. Czy wiesz dlaczego tak się dzieje?

oto kod:

#include <iostream>
#include <cstdlib>
#include <string>
#include <algorithm>

using namespace std;

void szyfruj()
{
    int n,m,kol,k,l;
    int klucz[n];
    n=4;

    klucz[0]=3;
    klucz[1]=2;
    klucz[2]=0;
    klucz[3]=1;

    string tekst="UCZCIWOSC ZBIERA POCHWALY I UMIERA Z ZIMNA";
    string wynik;
    int dl= tekst.length();

    tekst.erase(std::remove(tekst.begin(), tekst.end(), ' '), tekst.end());

    if(dl%n!=0)
    {
        m=dl/n+1;
    }
    else
    {
        m=dl/n;
    }

    char tablica[n][m];

    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            tablica[i][j]='\0';
        }
    }

    k=0;

    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(k<dl)
            {
                tablica[i][j]=tekst[k];
                k++;
            }
            else
            {
                tablica[i][j]='\0';
            }
        }
    }

    for(kol=0;kol<n;kol++)
    {
        l=klucz[k];
        for(int i=0;i<m;i++)
        {
            if(tablica[i][l] != '\0')
            {
                wynik+=tablica[i][l];
            }
        }
    }

    cout<<"Po zaszyfrowaniu: "<<wynik<<endl;
}

int main() {
    szyfruj();

    return 0;
}

 

komentarz 19 kwietnia 2020 przez LuQ232 Mądrala (7,200 p.)
for(kol=0;kol<n;kol++)
    {
        l=klucz[kol];
        for(int i=0;i<m;i++)
        {

            if(tablica[i][l] != '\0')
            {
                wynik+=tablica[i][l];
            }
        }
    }

miałeś klucz[k] zamiast klucz[kol]

komentarz 19 kwietnia 2020 przez kiecam4 Nowicjusz (120 p.)

Dzięki, działa. Bardzo mi pomogłeś smiley

Podobne pytania

0 głosów
0 odpowiedzi 174 wizyt
pytanie zadane 16 stycznia 2019 w C i C++ przez FlameTornado Nowicjusz (120 p.)
0 głosów
1 odpowiedź 279 wizyt
pytanie zadane 24 lutego 2017 w C i C++ przez Jędrzej Dembowski Użytkownik (740 p.)
0 głosów
1 odpowiedź 244 wizyt
pytanie zadane 25 grudnia 2015 w C i C++ przez Kubax96 Nowicjusz (170 p.)

93,020 zapytań

141,985 odpowiedzi

321,284 komentarzy

62,366 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...