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

Kominikat segmentation fault

Object Storage Arubacloud
0 głosów
152 wizyt
pytanie zadane 22 sierpnia 2015 w C i C++ przez 0xf Dyskutant (8,180 p.)

Witam mam problem w tym kodzie oto po uruchomieniu i podaniu 2 inicjujacych zmiennych pokazuje mi sie komunikat "Segmentation fault". Daje kod:

#include <iostream>

using namespace std;

void baza();

int main()
{
	baza();
	return 0;
	}
	
	void baza()
	{
		 int a,b; cin>>a>>b;
		int** ary = new int*[a];
for(int i = 0; i < a*b; i++)
   {
   	 cout<<i+1<<". Obrot petli"<<endl;
   	 ary[i] = new int[b];
   	 ary[0][0]=2;ary[0][1]=6;ary[1][0]=9;
   	 ary[i][i+2]=ary[0][0]*ary[0][1];
   	 ary[i+2][i]=ary[0][0]+ary[1][0];
   	 for (int j=0;j<2;j++)
   	 {cout<<"C"<<endl;}
   }
		
		}

Z gory dzieki :D

2 odpowiedzi

0 głosów
odpowiedź 22 sierpnia 2015 przez Radfler VIP (101,030 p.)
Nie usuwasz tablicy. To chyba jedyny błąd ;)
komentarz 22 sierpnia 2015 przez 0xf Dyskutant (8,180 p.)
Jestem jeszcze zielony ale o ile sie nie myle to kompilator domyslnie ja usuwa uzywam c4droid tak jestem na androidzie.
komentarz 22 sierpnia 2015 przez 0xf Dyskutant (8,180 p.)
poprawione nadal nie dziala
komentarz 22 sierpnia 2015 przez Radfler VIP (101,030 p.)

Błąd może być tu:

for(int i = 0; i < a*b; i++) {
    cout<<i+1<<". Obrot petli"<<endl;
    ary[i] = new int[b];
    // ...
}

Pętla wykonuje się dopóki i jest mniejsze od a*b? Nie powinno być przypadkiem same a? W trzeciej linijce zaczynasz się odwoływać do elementów tablicy, które nie istnieją (rozmiar tablicy arr to a)!

0 głosów
odpowiedź 22 sierpnia 2015 przez Szykem2 Nałogowiec (29,510 p.)
Błąd jest w linice 17 tablica ma długość a, a chcesz przypisywać wartości aż do indeksu a*b i wywala segfaulta bo nie ma zaalokowanej pamięci, w której ma dokonać operacji.
komentarz 22 sierpnia 2015 przez 0xf Dyskutant (8,180 p.)
faktycznie a jak zmienic jej rozmiar na [a][b] probowalem int **tablica=new int [a][b].

Ucze sie teraz tablic dynami8cznych dwuwymiarowych i mam zamiar rowniez nauczyc sie trojwymiarowych ale jako ze mam lekkie problemy ze wzkaznikami(nie rozumeim ich sa dla mnie bez sensu) to nie potrafie tego okodowac.
komentarz 22 sierpnia 2015 przez Szykem2 Nałogowiec (29,510 p.)

Wskaźniki są bardzo przydatne jak to ujął Jerzy Grębosz "bez wsaźników mozna programować ale po co" wskaźniki na prawdę mogą ułatwić życie tylko trzeba je dobrze zrozumieć. A co do tablic wielowymiarowych to spróbuję przybliżyć rozwiązanie.

Załużmy, że chcemy zrobić tablicę trójwymiarową zmiennych typu int więc potrzebujemy zmienną(wskaznik) Int*** tab; (wskaźnik na wskaźnik na wskaźnik na zmienną) i tworzymy tablicę wskaźników int** wsk(przykład)

tab = new int**[a];           (1)                  //tworzymy tablice wskaznikow do wskaznikow do int

for (int i = 0; i < a; i++)
{
    tab[i] = new int*[b];      (2)                  //dla kazdego elementu tablicy(1) tworzymy tablice wskaznikow do int
    
    for(int j = 0; j < b; j++)
    {
        tab[i][j] = new int[c];                       //dla kazdego elementu tablicy(2) tworzymy tablice intow czyli juz naszych zmiennych na ktorych bedziemy operowac
    }
}

//powstała tablica tab[a][b][c]; tylko trzeba pamietac o usunięciu

for (int i = 0; i < a; i++)
{
    for(int j = 0; j < b; j++)
    {
        delete[] tab[i][j];                              //najpierw susuwamy najbardziej "wewnetrzne tablice"
    }
    delete[] tab[i];
}
delete[] tab;

 

Podobne pytania

0 głosów
1 odpowiedź 156 wizyt
pytanie zadane 5 sierpnia 2016 w C i C++ przez Pac Plus Mądrala (5,560 p.)
+1 głos
1 odpowiedź 727 wizyt
pytanie zadane 19 maja 2016 w C i C++ przez draghan VIP (106,230 p.)
0 głosów
1 odpowiedź 194 wizyt
pytanie zadane 19 grudnia 2015 w C i C++ przez emSon Stary wyjadacz (10,480 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,962 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!

...