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

Wskażnik na strukturę.

Object Storage Arubacloud
0 głosów
177 wizyt
pytanie zadane 9 stycznia 2018 w C i C++ przez lambdag Obywatel (1,310 p.)

Witam mam pewien problem, program działa tylko dla 1 obiegu pętli, potem gdy wpisuje dane już przerywa działanie. Oto kod, myślę że zle alokuje pamieć..

#include <iostream>

using namespace std;
struct point{
    int x;
    int y;
};
int isline(struct point *tab)
{
    int a,b = 0;
     a = (tab[0].y - tab[1].y)/(tab[0].x -tab[1].x);
     b =  tab[0].y - a * tab[0].x;
    if(a*tab[2].x + b == tab[2].y){
    return 1;
    }
    else
    {
        return 0;
    }
}
int main() {

	int n;
    cin >> n;
	for(int i = 0; i < n; i++)
	{
		struct point *tab;
		tab = (point*) malloc(sizeof(point) * 3);
        for(int k = 0; k < 3; k++)
        {
            cin >> tab[k].x >> tab[k].y;
        }
        if(isline(tab) == 1)
        {
            cout << "TAK" << endl;
        }
        else
        {
            cout << "NIE" << endl;
        }
		free(tab);
	}


	return 0;
}

 

2 odpowiedzi

+2 głosów
odpowiedź 9 stycznia 2018 przez monika90 Pasjonat (22,940 p.)
edycja 9 stycznia 2018 przez monika90

Co rozumiesz przez "przerywa działanie"? W twoim programie może wystąpić dzielne przez zero, może dlatego?

 

myślę że zle alokuje pamieć..

Masz rację, bo używasz malloc w C++. Malloc alokuje surową pamięć i nie tworzy w niej obiektów, więc trzeba je potem utworzyć samemu za pomocą placement-new. Ale w twoim przypadku dynamiczna alokacja w ogóle nie ma sensu, po prostu zrób tablicę automatyczną o rozmiarze 3.

1
komentarz 9 stycznia 2018 przez Marcin_N_97 Stary wyjadacz (10,290 p.)
1. Przeanalizuj jego kod.

2. Malloc też można uywać w C++, ale do taich rzeczy ile warto.

3. Warto dynamicznie, bo jest bardziej otwarte na rozszerzenia.
komentarz 9 stycznia 2018 przez lambdag Obywatel (1,310 p.)

Nie użyłem statycznej tablicy, ponieważ ja chciałem zrobić kilka testów. Program ma wskazać czy 3 punkty współliniowe, ja sprowadziłem to do tego żeby wyznaczyć równanie prostej i sprawdzić 3 punkt należy do tej prostej. Okey i dlatego użyłem tablicy dynamicznej bo chciałem po prostu usunąć tablice i stworzyć nową, ale program ten działa bo potwierdził mi wynik dla(tzn, dobrze wskazuję czy są te punkty współliniowe)

1	2	3	4	5	6

i gdy wprowadzam kolejne punkty

w wściskuję enter to przestaje działać..

komentarz 9 stycznia 2018 przez lambdag Obywatel (1,310 p.)

OKEY, wiem gdzie błąd, błąd jest w funkcji ponieważ nie sprawdzam że może być np. x = 1;

chodzi np o taki punkty

0	0	0	0	0 	0

sorry za zamieszanie...

1
komentarz 9 stycznia 2018 przez monika90 Pasjonat (22,940 p.)

Nie ma powodu by używać tablicy dynamicznej, możesz zwyczajnie wewnątrz pętli napisać

point tab[3];

 

Użyj innego sposobu do sprawdzanie czy punkty o współrzędnych całkowitych są współliniowe. Może coś z algorytmem Euklidesa?

 

 

komentarz 9 stycznia 2018 przez lambdag Obywatel (1,310 p.)

Zrobiłem tak:

if(tab[0].x == tab[1].x && tab[1].x == tab[0].x)
     {
            return 1;
     }
     else{
     a = (tab[0].y - tab[1].y)/(tab[0].x -tab[1].x);
     b =  tab[0].y - a * tab[0].x;
    if((a*tab[2].x + b) == tab[2].y){
        return 1;
    }
    else
    {
        return 0;
    }
     }

Ale dzięki bardzo za polecenie algorytmu ;)

 

0 głosów
odpowiedź 9 stycznia 2018 przez Marcin_N_97 Stary wyjadacz (10,290 p.)
Masz if...else poza pętlą więc tylko jeden obiekt ci sprawdza ;)

 

Musisz dać go w pętli oraz po (tab) w ifie też się iterować.
komentarz 9 stycznia 2018 przez lambdag Obywatel (1,310 p.)
Ale mam w głównej pętli, bo mi chodziło o to że 3 punkty ma sprawdzić... i chodzi mi o powtórki że kilka razy sprawdzać..

To zle przesyłam tablicę? Mam te warunki dać w tę pętle, gdzie nadaje wartości?
komentarz 9 stycznia 2018 przez Marcin_N_97 Stary wyjadacz (10,290 p.)
No to nie iterujesz się dobrze po tej tablicy w ifie.

Podobne pytania

+1 głos
3 odpowiedzi 353 wizyt
pytanie zadane 1 marca 2019 w C i C++ przez LubieNalesniki Użytkownik (610 p.)
0 głosów
2 odpowiedzi 1,098 wizyt
pytanie zadane 11 kwietnia 2018 w C i C++ przez antek782 Początkujący (490 p.)
0 głosów
1 odpowiedź 459 wizyt
pytanie zadane 26 stycznia 2019 w C i C++ przez Pawli Początkujący (250 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

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

...