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

question-closed Błąd w alokacji tablicy dynamicznej ?

Object Storage Arubacloud
–1 głos
182 wizyt
pytanie zadane 27 sierpnia 2016 w C i C++ przez Kasztan Dyskutant (8,080 p.)
zamknięte 28 sierpnia 2016 przez Kasztan
To jest mój kod http://wklej.org/id/2798998/.

Jedno z zadań ze spoja jeśli nie wykonałeś jeszcze tego zadania nie zaglądaj. http://pl.spoj.com/problems/PP0504B/

Sędzia mi zwraca błąd SIGABRT

Pytanie czy jest to problem z miejscem alokacji tablicy na dwa łańcuchy, które się podaje po wprowadzeniu liczby testów. Czy to jakiś inny problem.

Dziękuje za rady i chęć analizy mojego kodu : )
komentarz zamknięcia: Zadanie rozwiązane
komentarz 27 sierpnia 2016 przez Kasztan Dyskutant (8,080 p.)
Ma ktoś jakiś pomysł : | ?

2 odpowiedzi

+1 głos
odpowiedź 28 sierpnia 2016 przez obl Maniak (51,280 p.)
edycja 28 sierpnia 2016 przez obl

Mam takie pytanie: kompilujesz to u siebie na kompie i nie wywala ci się program? Przecież:

cin.getline(wyraz1,100);

przyjmuje dwa argumentu, pierwszy to wskaźnik do bufora pamięci, drugi, to rozmiar bufora a ty nie dość, że żeś żadnej pamięci nie zaalokował to jeszcze próbujesz ją zwolnić za pomocą delete.

Edit. Mój błąd, jednak alokujesz.

Edit: poprawiłem trochę twój kod, bo mi się program wywalał po wprowadzeniu danych co było spowodowane tym, że nadpisywałeś pamięć, której nie powinieneś był nadpipsywać (przekroczyłeś bufor pamieci dla wskTab w funkcji stringMerge:

#include <iostream>
#include <cstring>

using namespace std;

char* stringMerge(char *a, char *b)
{
    int iloscZnakow1 = strlen(a);
    int iloscZnakow2 = strlen(b);
    int w;
    if(iloscZnakow1 >= iloscZnakow2)
    {
        w = (iloscZnakow1*2);
    }
    else
    {
        w = (iloscZnakow2*2);
    }
    char *wskTab = new char [w+1];


    int z=0;
    int x=1;
    for(int i=0;i<w/2;i++)
    {
       wskTab[z] = *a;
       wskTab[x] = *b;
       a++;
       b++;
       z+=2;
       x+=2;
    }
    wskTab[w] = '\0';

    return wskTab;

}

int main()
{

    int t;
    char wyraz1[100];
    char wyraz2[100];
    cin>>t;
    cin.ignore();
    while(t>0)
    {

        cin.getline(wyraz1,100);
		cin.getline(wyraz2,100);

		char *ps = stringMerge(wyraz1,wyraz2);
		cout<<ps<<endl;
		delete[] ps;
        t--;
	}
    return 0;
}

 

komentarz 28 sierpnia 2016 przez Kasztan Dyskutant (8,080 p.)
Doszedłem do tego wczoraj jednak dalej to nie rozwiązało mojego problemu : |
komentarz 28 sierpnia 2016 przez obl Maniak (51,280 p.)
edycja 28 sierpnia 2016 przez obl

Tam jest limit długości wyrażenia kodu źródłowego do 5000 bajtów. Może o to chodzi.

A nie powinieneś najpierw pobrać wszystkie dane a dopiero później wyświetlić wynik? W ich przykładzie są najpierw dane na wejściu a dopiero później dane na wyjściu.

0 głosów
odpowiedź 27 sierpnia 2016 przez adrian17 Ekspert (344,860 p.)

Nie zgłębiałem się, ale robisz delete[] w pętli, a powinno być poza pętlą.

Przy okazji:

while(t-->0)

Tego nie powinno się używać, chyba, że dla żartu...

komentarz 27 sierpnia 2016 przez Kasztan Dyskutant (8,080 p.)
edycja 27 sierpnia 2016 przez Kasztan
czemu niby dla żartu ?

i czemu niby nie mogę robić delete w pętli ? ^^

te dwa ostatnie delete to można zrobić poza pętlą
komentarz 28 sierpnia 2016 przez niezalogowany
Adrian weź mi powiedz co ten fragment dla żartu oznacza bo szczerze nie wiem.
komentarz 28 sierpnia 2016 przez obl Maniak (51,280 p.)
t-->0 zmniejsza t o 1 i sprawdza, czy jest większe od 0
komentarz 28 sierpnia 2016 przez niezalogowany
aaaa...  dobra, a myślałem że tam jest znak odejmowania a potem strzałka, dzięki :)

Podobne pytania

0 głosów
1 odpowiedź 1,039 wizyt
+1 głos
1 odpowiedź 651 wizyt
pytanie zadane 4 grudnia 2016 w C i C++ przez niezalogowany
0 głosów
1 odpowiedź 675 wizyt
pytanie zadane 4 grudnia 2016 w C i C++ przez niezalogowany

92,566 zapytań

141,420 odpowiedzi

319,608 komentarzy

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

...