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

Wskażnik na strukturę.

0 głosów
460 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 564 wizyt
pytanie zadane 1 marca 2019 w C i C++ przez LubieNalesniki Użytkownik (610 p.)
0 głosów
2 odpowiedzi 1,523 wizyt
pytanie zadane 11 kwietnia 2018 w C i C++ przez antek782 Początkujący (490 p.)
0 głosów
1 odpowiedź 822 wizyt
pytanie zadane 26 stycznia 2019 w C i C++ przez Pawli Początkujący (250 p.)

93,778 zapytań

142,737 odpowiedzi

323,388 komentarzy

63,382 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...