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

Błąd krytyczny aplikacji

Ostatnio zmodyfikowano 2013-12-06 05:22
Autor Wiadomość
Sevet
Temat założony przez niniejszego użytkownika
Błąd krytyczny aplikacji
» 2013-12-01 20:28:20
@edit problem do rozwiązania jest w ostatnim poście bo nie chciałem tworzyć nowego tematu skoro problem jest podobnej natury.



Witam,
Po raz kolejny nie umiem sobie poradzić z pewnym problemem.
Teraz przerabiam dział 2 temat losowanie bez powtórzeń.
Jestem ambitny więc sam chciałem spróbować napisać taki program, wszystko chyba ok,
ale wywala mi błąd krytyczny. Domyślam się, że jakimś cudem wychodzę poza zakres którejś z tablic i pewnie jest to tablica funkcji sprawdz. Od pół godziny próbuję poradzić sobie z tym błędem, ale cały czas to samo. Wg tego co sprawdziłem - wpisując cout<<"check"; w poszczególne miejsca kodu, błąd występuje przy
C/C++
if( arg == tab[ v - 1 ] )
{
    check = false;
}
Niestety nie umiem tego naprawić, pomimo wielu prób.
 Może ktoś z Was mi podpowie?

C/C++
#include <cstdlib>
#include <iostream>
#include <ctime>
using namespace std;

bool sprawdz( int nrarg, int arg, int tab[] )
{
    bool check = true;
    int v = nrarg;
    if( v > 0 )
    {
        do
        {
            if( arg == tab[ v - 1 ] )
            {
                check = false;
            }
            v--;
        } while( v > 0 );
       
    }
    return check;
}

int main()
{
    srand( time( NULL ) );
    int wylosowane[ 10 ];
    int x, y;
    do
    {
        do
        {
            y =( rand() % 20 ) + 1;
            sprawdz( x, y, wylosowane );
        } while( sprawdz( x, y, wylosowane ) == false );
       
        y = wylosowane[ x ];
        x++;
    } while( x < 10 );
   
    cout << "Teraz program wypisze wylosowane liczby";
    do
    {
        cout << wylosowane[ x - 1 ] << " dla arg nr " << x << "\n";
        x--;
    } while( x > 0 );
   
}
P-98054
pekfos
» 2013-12-01 20:35:46
Do sprawdz() podajesz wartość niezainicjalizowanej zmiennej.
P-98055
kubawal
» 2013-12-01 20:36:48
Wg tego co sprawdziłem - wpisując cout<<"check";
To bardzo prymitywna technika - skorzystaj z debuggera.

C/C++
int x, y;
Nie inicjujesz x.
P-98056
Sevet
Temat założony przez niniejszego użytkownika
» 2013-12-01 20:39:04
Ach, dzięki i przepraszam za ten trywialny dla was problem ;].
P-98058
Sevet
Temat założony przez niniejszego użytkownika
» 2013-12-05 15:15:58
Witam,
Znów mam ten sam problem i nie umiem znaleźć błędu.
Jedyne co mi przychodzi do głowy, to fakt że nie zainicjowałem żadnego elementu tablicy, ale to chyba nie jest konieczne, prawda? Wychodzić poza zakres tablicy bez określonej ilości elementów chyba się nie da, więc w czym tkwi problem?
Wiem że to trochę żałosne, ale staram się jak mogę i ciężko mi to idzie ;D.

Kod:
C/C++
#include <iostream>
#include <string>
using namespace std;

void wczytajTekst( string & tekst )
{
    getline( cin, tekst );
}

int znajdzFraze( string & tekst, string szukane, int znalezione[] )
{
    if( tekst.find( szukane ) == string::npos )
    {
        cout << "Nie znaleziono frazy\"" << szukane << "\".";
        return 0;
    }
    znalezione[ 0 ] = tekst.find( szukane );
    int x;
    if( tekst.find( szukane, znalezione[ 0 ] + szukane.size() ) != string::npos )
    for( x = 1; tekst.find( szukane, znalezione[ x ] + szukane.size() != string::npos ); x++ )
    {
        znalezione[ x ] = tekst.find( szukane, znalezione[ x - 1 ] + szukane.size() );
    };
    return x;
}

string zmienTekst( string tekst, int ilosc, int znalezione[], string szukane, string zmiennik )
{
    for(; ilosc >= 0; ilosc-- )
    {
        tekst.erase( znalezione[ ilosc ], szukane.size() );
        tekst.insert( znalezione[ ilosc ], zmiennik );
    }
    return tekst;
}

int main()
{
    string tekst, szukane, zmiennik;
    cout << "Witamy, podaj tekst do przeksztalcenia!\n";
    wczytajTekst( tekst );
    szukane = "  ";
    zmiennik = " ";
    int znalezione[] = { };
    int znalezionych = znajdzFraze( tekst, szukane, znalezione );
    if( znalezionych > 0 )
    {
        tekst = zmienTekst( tekst, znalezionych, znalezione, szukane, zmiennik );
    }
    cout << "Zmieniony tekst to:\n" << tekst;
}
P-98408
Monika90
» 2013-12-05 15:57:21
int znalezione[] = { };

Tablica w C++ nie może mieć rozmiaru zero, a nawet jakby mogła, to wtedy każdy dostęp do tej tablicy byłby poza zakresem.
P-98414
Sevet
Temat założony przez niniejszego użytkownika
» 2013-12-05 16:03:09
Przeczytałem gdzieś że w ten sposób mogę zadeklarować tablicę o nieokreślonej liczbie elementów. W takim razie skoro nie tak, to czy da się to zrobić inaczej?
PS. Program wysypuje się dopiero przy wywołaniu
C/C++
tekst = zmienTekst( tekst, znalezionych, znalezione, szukane, zmiennik );
Więc tablica jednak zostaje użyta przez funkcję
znajdzFraze( tekst, szukane, znalezione )
Jeśli się mylę to mnie popraw, bo zaczynam się gubić
P-98416
Monika90
» 2013-12-05 16:24:13
W takim razie skoro nie tak, to czy da się to zrobić inaczej?
Możesz użyć std::vector<std::size_t>, przekazywać go do funkcji przez referencję i dodawać elementy za pomocą push_back.
P-98420
« 1 » 2
  Strona 1 z 2 Następna strona