21 / 38
May 2017
1 year later

Hej, nie mogę znaleźć błędu. SPOJ informuje mnie o (SIGABRT) ale nie wiem gdzie to mogę to poprawić.

KOD c++:

#include <iostream>

using namespace std;
int n, m, liczba;
int main()
{
    cin >> m >> n;
    int tab[m + 1][n+1];
    for(int j=1; j<=m; j++)
    {
        for(int i=1; i<=n; i++)
        {
            cin>>liczba;
            tab[i][j]=liczba;
        }
    }
    for(int j=1; j<=n; j++)
    {
 
        for(int i=1; i<=m; i++)
        {
            if(i<m)
            {
                cout<<tab[j][i]<<" ";
            }
            else
            {
                cout<<tab[j][i];
            }
 
        }
        if(j<n) cout<<endl;
    }
 
    for (int i = 0; i<m; i++)
    {
        delete[] tab[i];
    }
    delete[] tab;
 
 
    return 0;
}

A pamiętasz że n może być różne od m? Wydaje mi się że wychodzisz poza tablicę. Może się mylę, jest późno i jestem na tel, nie mogę sprawdzić

Cześć,
zawsze jak piszesz posta to możesz zaznaczyć kod i zobaczyć co robią te guziczki u góry, np </> sformatuje Ci kod.

To:

int tab[m + 1][n+1];

nie jest prawidłowa deklaracja tablicy o wielkości nie znanej podczas kompilacji. Powinieneś uzyć new[] lub vektora. Ale w gcc zazwyczaj działa mimo, że ta składnia nie jest częścią jezyka

Za to jak wykonasz delete na czymś czego nie tworzyłeś za pomocą słowa new to wtedy zazwyczaj dostaniesz bład i to właśnie prawdopodobnie SIGABRT.

A tak w ogóle to delete Ci się raczej na spoju nie przyda, ale w bardzo małym odsetku zadań. A niech sobie sędzia sam z pamięcią radzi :wink:

  1. Czytamy komunikaty błędów i warningi. Drugie można zignorować (podobnie jak errory - w końcu jesteś wolnym człowiekiem i nie musisz ograniczać się do kompilujących, działających kodów :wink: ), ale na ogół sugerują jakiś błąd, który wyjdzie przy wykonywaniu kodu.

    main.cpp: In function ‘int main()’:
    main.cpp:37:23: warning: deleting array 'tab[i]'
    delete[] tab[i];
    ^
    main.cpp:39:14: warning: deleting array 'tab’
    delete[] tab;
    ^

  2. Co do:

    Nie, nie powinieneś użyć vector - najpierw naucz się tablic a potem vector :slight_smile:

  3. Jak słusznie zauważył @j4rooo:

    Skoro już wiesz, że gcc/g++ to jedno, a C/C++ to drugie, możesz się zastanawiać, jak to ze sobą połączyć :wink: Użycie --pedantic od razu daje dodatkowe ostrzeżenia :wink:

    main.cpp:8:23: warning: ISO C++ forbids variable length array ‘tab’ [-Wvla]
    int tab[m + 1][n+1];
    ^
    main.cpp:8:23: warning: ISO C++ forbids variable length array ‘tab’ [-Wvla]
    main.cpp:37:23: warning: deleting array 'tab[i]'
    delete[] tab[i];
    ^
    main.cpp:39:14: warning: deleting array 'tab’
    delete[] tab;
    ^

    Oczywiście w praktyce cwane sztuczki z użyciem komplikatorów życia mogą mieć uzasadnienie, natomiast na SPOJu radzę traktować kodzenie jak sztukę - pisać kody zgodne z powszechnie obowiązującymi standardami.

  4. A na koniec:

    Prawda, dotyczy to także destruktorów, natomiast na razie niech Ci się to przydaje - jak będziesz umiał tego użyć to potem świadomie, w pełni rozumiejąc konsekwencje swoich poczynań, możesz kombinować :wink:

Udało się :slight_smile: dziękuję.

Zastosowałem:

int **tab= new int *[n];
for (int i=0; i<n; i++)
{
tab[i]= new int[m];
}

i parę drobnych zmian.

Jeszcze dużo nauki przede mną :slight_smile:

8 months later

Niby odpowiedzi wychodzą git, ale sędzia mówi, że naruszenie pamięci. Ktoś ma pomysł gdzie to może być?

#include <iostream>
#include <vector>

using namespace std;

void wpisz(vector<vector<int> > & tab)
{
    for(int n=0 ; n<tab.size() ; n++)
    {
        for(int m=0 ; m<tab[n].size() ; m++)
        {
            int a;
            cin>>a;
            tab[m][n]=a;
        }
        ;
    }
}
void pokaz(vector<vector<int> >& tab)
{
    for(int m=0 ; m<tab[m].size() ; m++)
    {
        for(int n=0 ; n<tab.size() ; n++)
        {
            cout<<tab[m][n];
        }
        cout<<endl;
    }

}
int main()
{
    int m,n;
    cin>>m>>n;
    vector<vector<int> >tab (n,vector<int>(m));
    wpisz(tab);
    pokaz(tab);

    return 0;
}

tab[m][n]=a;

Co zrobi ta linijka, gdy wymiary macierzy będą wynosiły np. 5 na 8 (czyli n=5, m=8)?

Ta zmienna a chyba nawet nie jest potrzebna. Chodzi mi tam tylko o wypełnienie tablicy.

Nie chodzi o zmienną a. Pomyśl: ilość wektorów to 5, a rozmiar pojedynczego wektora to 8. Czy w takim wypadku odwołanie się do 5 wartości w 8 wektorze jest prawidłowe?

Zrobiłem od nowa ten kodzik i fajnie, bo nie ma błędu pamięci. W zamian błąd odpowiedzi. Na ideone.com5 odpowiedź się zgadza. Może problem w tych spacjach albo endlach? W sumie sam już nw.

  #include <iostream>
#include <vector>

using namespace std;

void wpisz(vector<vector<int> > & tab)
{
    for(int m=0 ; m<tab.size() ; m++)
    {
        for(int n=0 ; n<tab[m].size() ; n++)
        {

            cin>>tab[m][n];
        }
        cout<<endl;
    }
}

void poka(vector<vector<int> >& tab)
{
    for(int m=0 ; m<tab[m].size() ; m++)
    {
        for(int n=0; n<tab.size(); n++)
        {
            cout<<tab[n][m]<<" ";
        }
        cout<<endl;
    }

}
int main()
{
    int m,n;
    cin>>m>>n;
    cout<<endl;
    vector<vector<int> >tab (m,vector<int>(n));
    if(m>0 and n>0 and m<201 and n<201)
    {
        wpisz(tab);
        poka(tab);
    }
    return 0;
}
2 5
1 2 3 4 5
6 7 8 9 10

Wskazówka: błąd jest w warunku zakończenia jednej z pętli.

4 years later

Ciekawostka, albo i nie,
próbowałem, napisałem w Javie i ciągle wyskakuje mi błąd błędna odpowiedź
to mój kod

skopiowałem od kogoś z innego wątku kod który tej osobie dawał przekroczony limit czasu.
( według mnie u mnie dla kilku testów te sasme wyniki)
wleiłem kod tego Pana licząc na przekroczony limit czasu, ale jednak wyrobił się w czasie i jest zielone! kod tego Pana,

Pytanie czy ktoś widzi czemu ja mogę mieć błedną odpowiedź?

#edit kody usunąłem, podpowiedź Użytkownika narbej bardzo mi pomogła.

Kod tego Pana, ok 40 linijek. Mój poniżej 30, ale pewnie można i w 20.
Twój kod, … nie zdołałem doliczyć, a co dopiero znaleźć w nim błąd.
Długi kod - dużo miejsc na błędy i dużo miejsc do sprawdzania.

wystarczy pominąć klasę Reader która odpowiada za szybsze zczytywanie, reszta to co najważniejsze zajmuje 20 linijek kodu

Ha, skoro tak :wink:

9 9
1 2 3 4 5 6 7 8 9
1 22 3 4 5 6 7 8 9
1 2 333 4 5 6 7 8 9
1 2 3 4444 5 6 7 8 9
1 2 3 4 55555 6 7 8 9
1 2 3 4 5 666666 7 8 9
1 2 3 4 5 6 7777777 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9

jesteś najlepszy, !
Generalnie fajnie jest Was poprosić o pomoc bo zawsze wymyślicie test który mega psuje. ! : ) dziękuje.
kurdeee… robiłem bez StringBuildera na sout-ach i nie przechodziło
zbudowałem StringBuildera tylko go przekombinowałem ale dobra na zwykłych sout-ach jednak przeszło :slight_smile:
dziękuje narbej,

Oj tam oj. Z wrodzonej skromności,nie będę się o to kłócił :wink:

PS

  1. Ewentualnie skasuj linki w swoim pytaniu.
  2. W swoim kodzie, przy kasowaniu możesz użyć metody length lub wcale nie kasować, a budować całą tablicę, wstawiając w odpowiednich miejscach ‘\n’.