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

Problem z seg.fault

Object Storage Arubacloud
0 głosów
123 wizyt
pytanie zadane 21 kwietnia 2020 w C i C++ przez Toady2004 Nowicjusz (160 p.)

Dzień dobry.

Mam pewien kod i tak jak w temacie spradzaczka pokazuje mi seg.fault.

 

#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
int xd;

main()
{
    char macierz[10007][10007];
    int maks=0,n,m,a,b;
    vector <int> tab[100000];
    for(int i=0; i<10000;i++){
        for(int j=0;j<10000;j++){
            macierz[i][j]=0;}

    }
    cin>>n>>m;
    for(int z=0;z<m;z++)
    {
        cin>>a>>b;

        macierz[a-1][b-1]=1;
        macierz[b-1][a-1]=1;
        tab[a].push_back(b);
        tab[b].push_back(a);
        if(a>maks)
        {
            maks=a;
        }
        if(b>maks)
        {
            maks=b;
        }
    }
    cout << endl;
    cout<<"Macierz:"<<endl;
    for(int i=0;i<maks;i++)
    {
        for(int j=0;j<maks;j++)
        {
            cout<<static_cast<int>(macierz[i][j])<< " ";
        }
        cout<<endl;
    }

    cout<<endl;
    cout<<"Lista;"<<endl;
    for (int i=1;i<=n;i++)
    {
        sort(tab[i].begin(),tab[i].end());
        cout <<i<<":"<<" ";
        for (int x=0; x<tab[i].size(); x++)
        {
            if(tab[i][x]==tab[i][x+1])
            {
                i=i;
            }
            else
                cout<<tab[i][x]<<" ";
        }
        cout<<endl;
    }

}

Dlaczego?

 

komentarz 21 kwietnia 2020 przez tkz Nałogowiec (42,000 p.)
Gdzieś wychodzisz poza zakres tablic. Podaj treść zadania, bo wydaje mi się, że da się to zrobić czytelniej.
1
komentarz 21 kwietnia 2020 przez tangarr Mędrzec (154,860 p.)

@Toady2004,
Tworzysz na stosie tablicę o rozmiarze około 95MB!!!
Tworzysz worzysz na stosie 100 tysięcy wektorów!!!

komentarz 21 kwietnia 2020 przez Toady2004 Nowicjusz (160 p.)

@tkz,

Dany jest graf nieskierowany. Wypisz jego reprezentację macierzową i listową.

Uwaga: w grafie na wejściu mogą wystąpić pętle oraz krawędzie wielokrotne. Krawędzie wielokrotne traktujemy jako jedną krawędź.

Wejście

W pierwszym wierszu dane są dwie liczby: nm (1 ≤ n ≤ 1000, 0 ≤ m ≤ 100000), gdzie n oznacza liczbę wierzchołków zaś m – liczbę krawędzi. W następnych m wierszach podane są po dwie liczby: ab (1 ≤ ab ≤ n) oznaczające krawędź między wierzchołkami a i b.

Wyjście

Wypisz reprezentację macierzową i listową danego grafu (zob. przykład).

W pierwszym wierszu należy wypisać napis "Macierz:", a w następnych n wierszach macierz sąsiedztwa danego grafu (bez spacji). W macierzy tej jedynka na pozycji ij oznacza, że istnieje krawędź między wierzchołkami i oraz j.

Dalej należy wypisać napis "Lista:", a w następnych n wierszach listy sąsiedztwa kolejnych wierzchołków. W i-tym wierszu należy wypisać najpierw "i: ", a dalej numery wierzchołków połączonych krawędzią z i-tym wierzchołkiem. Numery wierzchołków należy podać bez powtórzeń, w porządku rosnącym, oddzielając je pojedynczą spacją.

Przykład

Dla danych wejściowych

7 12
1 2
1 4
2 3
3 4
3 2
4 5
4 6
4 7
7 7
5 6
5 7
6 7

poprawną odpowiedzią jest

Macierz:
0101000
1010000
0101000
1010111
0001011
0001101
0001111

Lista:
1: 2 4
2: 1 3
3: 2 4
4: 1 3 5 6 7
5: 4 6 7
6: 4 5 7
7: 4 5 6 7

 

komentarz 23 kwietnia 2020 przez tkz Nałogowiec (42,000 p.)
#include <iostream>
#include <cstddef>
#include <utility>
#include <map>
#include <set>
#include <ostream>
#include <algorithm>

std::map<unsigned, std::set<unsigned>> edgesBetweenVertices;
void input(const unsigned &firstVertices, const unsigned &secondVertices);
void printMatrix(std::ostream &os);
void printList(std::ostream &os);

int main(void)
{
    for (size_t edge{0}; edge < 12; ++edge)
    {
        unsigned firstVertice;
        unsigned secondVertice;
        std::cin >> firstVertice >> secondVertice;
        input(firstVertice, secondVertice);
    }
    printMatrix(std::cout);
    printList(std::cout);
    return 0;
}

void input(const unsigned &firstVertices,
             const unsigned &secondVertices)
{
    edgesBetweenVertices[firstVertices].insert(secondVertices);
    edgesBetweenVertices[secondVertices].insert(firstVertices);
}

void printMatrix(std::ostream &os)
{
    os << "Macierz: "<< '\n';
    for (const auto &[mainVertice, linksWithMainVertices] : ::edgesBetweenVertices)
    {
        for (const auto &_ : edgesBetweenVertices)
        {
            if (linksWithMainVertices.find(_.first) != linksWithMainVertices.end())
            {
                os << "1 ";
            }
            else
            {
                os << "0 ";
            }
        }
        os << '\n';
    }
}

void printList(std::ostream &os)
{
    os << "Lista: "<< '\n';
    for (const auto& [vertice, edgeWith] : edgesBetweenVertices)
    {
        os << vertice << ": ";
        for (const auto& edge : edgeWith)
            os << edge << ' ';
        os << '\n';
    }
}

Dopiero dzisiaj mogłem się tym zająć. Myślę, że jest okey, no może oprócz globalnej mapy, ale nie chciało mi się jej wysyłać do funkcji. 

Jeszcze dodam, że użyłem set'a i map'y bynajmniej nieprzypadkowo, chciałem zachować posortowane wyniki. 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 202 wizyt
0 głosów
1 odpowiedź 129 wizyt
0 głosów
0 odpowiedzi 266 wizyt
pytanie zadane 22 marca 2017 w C i C++ przez Michał Gibas Pasjonat (19,610 p.)

92,634 zapytań

141,505 odpowiedzi

319,883 komentarzy

62,015 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...