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;
}
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
-
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
), 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;
^ -
Co do:
Nie, nie powinieneś użyć vector - najpierw naucz się tablic a potem vector
-
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ć
Użycie --pedantic od razu daje dodatkowe ostrzeżenia
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.
-
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ć
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;
}
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;
}
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.
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
dziękuje narbej,
Suggested Topics
Topic | Category | Replies | Views | Activity |
---|---|---|---|---|
PP0504B - StringMerge - w języku C | Zbiór zadań | 5 | 180 | Jun '24 |
FR_08_11 - Gra w bańki | Zbiór zadań | 1 | 148 | Jun '24 |
MBPROB01 - History version in plaintext pl.spoj.com | Zbiór zadań | 6 | 148 | Jul '24 |
TOPSORTL - Porządek leksykograficzny w grafie | Zbiór zadań | 3 | 123 | Jul '24 |
TFRACAL - Kalkulator ułamków | Zbiór zadań | 2 | 124 | Feb 1 |