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

C++ [SFML], zmienna 'sama się zmienia' z np. 4 na 138492323

Object Storage Arubacloud
0 głosów
173 wizyt
pytanie zadane 31 maja 2018 w C i C++ przez Maciek123233 Gaduła (3,400 p.)
edycja 31 maja 2018 przez Maciek123233

Witam, moja zmienna 'tory_ekwipunek[i].punkty_toru[pod_tory-1].y' gdzie 'tory_ekwipunek[]' jest tablicą zmiennych klasy 'Tory',a  'punkty_toru[]' to tablica dynamiczna zmiennej Vector2i (SFML) która należy oczywiście do klasy Tory.

Oto cały kod, chociaż kluczowe w tym problemie linie to 82 - 88:

#include <SFML/Graphics.hpp>
#include <iostream>
#include <math.h>
#include <fstream>

using namespace std;
using namespace sf;

class Tor
{
public:
    int ile_torow;
    Vector2i *punkty_toru;///punkty wierzcholka
    string *polaczenia_punkty_toru;
    RectangleShape *R_pod_tor;
};


string intToStr(int n)
{
     string tmp, ret;
     if(n < 0) {
      ret = "-";
      n = -n;
     }
     do {
      tmp += n % 10 + 48;
      n -= n % 10;
     }
     while(n /= 10);
     for(int i = tmp.size()-1; i >= 0; i--)
      ret += tmp[i];
     return ret;
}

int ile_fraz(string tekst, string fraza)
{
    int wsk=0;
    int ile_fraz=0;
    while(tekst.find(fraza,wsk) != string::npos)
    {
        wsk = tekst.find(fraza,wsk)+1;
        ile_fraz++;
    }
    return ile_fraz;
}

int main()
{
    string linia_plik;
    int ile_linii = 0;
    fstream plik;
    plik.open("tory.txt", ios::in);
    if(plik.good())
    {
        while(getline(plik, linia_plik))
            ++ile_linii;
        plik.close();
    }
    plik.open("tory.txt", ios::in);
    string tory[ile_linii];
    Tor tory_ekwipunek[ile_linii];
    if(plik.good())
    {
        for(int i=0;getline(plik,linia_plik);i++)///i = <licznik> ile_jest_wszystkich_linii_w_notatniku?
        {
            cout<<"i = >"<<i<<"<"<<endl;
            tory[i] = linia_plik;
            int pod_tory = ile_fraz(linia_plik,"(");
            tory_ekwipunek[i].ile_torow = pod_tory-1;
            tory_ekwipunek[i].punkty_toru = new Vector2i[pod_tory-1];
            for(int j=0;j<pod_tory;j++) ///j = <licznik> ile_jest_wierzchlkow?
            {///w tej petli sa wpisywane punkty z nawiasow (_,_) do tory_ekwipunek[].punkty_toru[]
                cout<<"j = >"<<j<<"<"<<endl;
                tory_ekwipunek[i].punkty_toru[j].x = atoi(linia_plik.substr(linia_plik.find('(')+1,linia_plik.find(',')-linia_plik.find('(')-1).c_str());
                tory_ekwipunek[i].punkty_toru[j].y = atoi(linia_plik.substr(linia_plik.find(',')+1,linia_plik.find(')')-linia_plik.find(',')-1).c_str());

                cout<<"Wpisano do tory_eq[i].pkt_toru[j] (x)"<<tory_ekwipunek[i].punkty_toru[j].x<<", (y)"<<tory_ekwipunek[i].punkty_toru[j].y<<"<"<<endl;
                linia_plik.erase(0,linia_plik.find(')')+1);
            }
            cout<<"<kontrola zmiennej tory_ekwipunek[i].punkty_toru[j].y gdzie y="<<pod_tory-1<<endl;
            cout<<"kontrola nr. 1. >"<<tory_ekwipunek[i].punkty_toru[pod_tory-1].y<<"<"<<endl;
            int polaczenia_torow = ile_fraz(linia_plik,"-")+1;
            string polaczenia_torow_nawiasy = linia_plik.substr(linia_plik.find('[')+1,linia_plik.find(']')-linia_plik.find('[')-1);
            tory_ekwipunek[i].polaczenia_punkty_toru = new string[polaczenia_torow];
            cout<<"Polaczen torow jest "<<polaczenia_torow<<endl;
            tory_ekwipunek[i].R_pod_tor = new RectangleShape[polaczenia_torow];
            cout<<"kontrola nr. 2. >"<<tory_ekwipunek[i].punkty_toru[pod_tory-1].y<<"<"<<endl;
            for(int j=0;j<polaczenia_torow;j++) ///ile_polaczen_miedzy_punktami
            {
                cout<<"j = >"<<j<<"<"<<endl;
                cout<<"kontrola nr. 3. >"<<tory_ekwipunek[i].punkty_toru[pod_tory-1].y<<"<"<<endl;

                cout<<"wpisano do p_t_n: "<<polaczenia_torow_nawiasy.substr(j*3,2)<<endl;

                tory_ekwipunek[i].polaczenia_punkty_toru[j] = polaczenia_torow_nawiasy.substr(j*3,2);
                for(int z=0;z<2;z++)
                {
                    if(tory_ekwipunek[i].polaczenia_punkty_toru[j][z] == 'A')
                        tory_ekwipunek[i].polaczenia_punkty_toru[j][z] = '0';
                    if(tory_ekwipunek[i].polaczenia_punkty_toru[j][z] == 'B')
                        tory_ekwipunek[i].polaczenia_punkty_toru[j][z] = '1';
                    if(tory_ekwipunek[i].polaczenia_punkty_toru[j][z] == 'C')
                        tory_ekwipunek[i].polaczenia_punkty_toru[j][z] = '2';
                    if(tory_ekwipunek[i].polaczenia_punkty_toru[j][z] == 'D')
                        tory_ekwipunek[i].polaczenia_punkty_toru[j][z] = '3';
                }
                Vector2i punkty_do_toru[2];
                cout<<"szukam dla: "<<tory_ekwipunek[i].polaczenia_punkty_toru[j].substr(0,1)<<" i "<<
                        tory_ekwipunek[i].polaczenia_punkty_toru[j].substr(1,1)<<"<"<<endl;
                cout<<tory_ekwipunek[i].punkty_toru[atoi(tory_ekwipunek[i].polaczenia_punkty_toru[j].substr(0,1).c_str())].x<<","<<
                      tory_ekwipunek[i].punkty_toru[atoi(tory_ekwipunek[i].polaczenia_punkty_toru[j].substr(0,1).c_str())].y<<","<<
                      tory_ekwipunek[i].punkty_toru[atoi(tory_ekwipunek[i].polaczenia_punkty_toru[j].substr(1,1).c_str())].x<<","<<
                      tory_ekwipunek[i].punkty_toru[atoi(tory_ekwipunek[i].polaczenia_punkty_toru[j].substr(1,1).c_str())].y<<"."<<endl;

                    punkty_do_toru[0].x = tory_ekwipunek[i].punkty_toru[atoi(tory_ekwipunek[i].polaczenia_punkty_toru[j].substr(0,1).c_str())].x;
                    punkty_do_toru[0].y = tory_ekwipunek[i].punkty_toru[atoi(tory_ekwipunek[i].polaczenia_punkty_toru[j].substr(0,1).c_str())].y;
                    punkty_do_toru[1].x = tory_ekwipunek[i].punkty_toru[atoi(tory_ekwipunek[i].polaczenia_punkty_toru[j].substr(1,1).c_str())].x;
                    punkty_do_toru[1].y = tory_ekwipunek[i].punkty_toru[atoi(tory_ekwipunek[i].polaczenia_punkty_toru[j].substr(1,1).c_str())].y;

                    cout<<"Punkty do toru: i="<<i<<"/j="<<j<<" "<<punkty_do_toru[0].x<<"/"<<punkty_do_toru[0].y<<" i "<<punkty_do_toru[1].x<<"/"<<(int)punkty_do_toru[1].y<<"<"<<endl;
                }
                cout<<endl<<"----------------------"<<endl;
        }
        plik.close();
    }
    return 0;
}

(kod specjalnie uprościłem do tego stopnia, żeby jak najlepiej było widać ten błąd)

Z tego kodu, w konsoli pokazuje się coś takiego:

Miejsce gdzie kod wypisuje to na ekranie jest tutaj:

I tutaj chciałem się zapytać, czy ktoś jest mi w stanie powiedzieć co się dzieje z moją zmienną zaznaczoną na zdjęciach między linią kodu 82 a 88? Co dziwne, w głównej pętli for (czyli int=1;i<.... ) ta zmienna tak się resetuje co ileś iteracji, a nie w każdej, chociaż pobranie informacji z pliku i kod jest taki sam.

W folderze projektu jest tory.txt, zawartość:

A01{A(0,0)B(0,4)[AB]}
A02{A(0,0)B(4,0)[AB]}
A03{A(0,0)B(4,-4)[AB]}
A04{A(0,0)B(4,-2)[AB]}
A05{A(0,0)B(4,2)[AB]}
A06{A(0,0)B(4,4)[AB]}
A07{A(0,0)B(-2,-4)[AB]}
A08{A(0,0)B(2,4)[AB]}
B01{A(0,0)B(4,-4)C(4,0)[AB-AC]}
B02{A(0,0)B(4,-2)C(4,0)[AB-AC]}
B03{A(0,0)B(4,2)C(4,0)[AB-AC]}
B04{A(0,0)B(4,4)C(4,0)[AB-AC]}
B05{A(0,0)B(-4,-4)C(0,-4)[AB-AC]}
B06{A(0,0)B(-2,-4)C(0,-4)[AB-AC]}
B07{A(0,0)B(2,-4)C(0,-4)[AB-AC]}
B08{A(0,0)B(4,-4)C(0,-4)[AB-AC]}
B09{A(0,0)B(-4,4)C(-4,0)[AB-AC]}
B10{A(0,0)B(-4,2)C(-4,0)[AB-AC]}
B11{A(0,0)B(-4,-2)C(-4,0)[AB-AC]}
B12{A(0,0)B(-4,-4)C(-4,0)[AB-AC]}
B13{A(0,0)B(-4,-4)C(0,-4)[AB-AC]}
B14{A(0,0)B(-2,-4)C(0,-4)[AB-AC]}
B15{A(0,0)B(2,-4)C(0,-4)[AB-AC]}
B16{A(0,0)B(2,-4)C(0,-4)[AB-AC]}
C01{A(0,0)B(4,-4)C(4,4)[AB-AC]}
C02{A(0,0)B(4,-2)C(4,2)[AB-AC]}
C03{A(0,0)B(-4,2)C(-4,-2)[AB-AC]}
C04{A(0,0)B(-4,4)C(-4,-4)[AB-AC]}
C05{A(0,0)B(-4,4)C(4,4)[AB-AC]}
C06{A(0,0)B(-2,4)C(2,4)[AB-AC]}
C07{A(0,0)B(4,-4)C(-4,-4)[AB-AC]}
D01{A(0,0)B(4,0)C(4,2)D(2,0)[AB-AC-BD-CD]}

 

1 odpowiedź

0 głosów
odpowiedź 31 maja 2018 przez RafalS VIP (122,820 p.)
wybrane 31 maja 2018 przez Maciek123233
 
Najlepsza

Po pierwsze zamiast robić funkcję intToStr możesz użyć funkcji bibliotecznej: std::to_string;

U mnie to działa dobrze. Wypisuje wszędzie 4.

Takie błędy sugerują jakieś zapis do niezaalokowanej pamięci, czyli najczęściej wyjście poza zakres tablicy. Obstawiałbym te linijki:

			tory_ekwipunek[i].punkty_toru = new Vector2i[pod_tory - 1];
			for (int j = 0; j<pod_tory; j++) ///j = <licznik> ile_jest_wierzchlkow?

alokujesz tablice wektorow na pod_tory - 1 elementów a pętla jest od 0 do pod_tory -1 czyli o 1 więcej niż zaalokowałeś.

W sumie ciekawe, bo to:

tory_ekwipunek[i].punkty_toru[pod_tory - 1].y

powinno jakiś wyjątek chyba rzucić.

komentarz 31 maja 2018 przez j23 Mędrzec (194,920 p.)
Nie zawsze. Wyjątek jest wtedy, gdy dany fragment pamięci wirtualnej nie jest zmapowany na fizyczną pamięć.
komentarz 31 maja 2018 przez RafalS VIP (122,820 p.)
Hmm a dereferencja śmieci? Bo to nie jest takie czyste wyjście poza tablice. Wychodzimy poza tablicę i poza tablicą robimy .y
1
komentarz 31 maja 2018 przez j23 Mędrzec (194,920 p.)

Vector2i to prosta klasa zawierająca tylko dwie wartości typu int. Skoro sam fragment pamięci jest dostępny, to dlaczego .x i .y miałoby nie być?

Podobne pytania

0 głosów
1 odpowiedź 279 wizyt
pytanie zadane 9 sierpnia 2017 w C# przez Stami Gaduła (3,790 p.)
0 głosów
2 odpowiedzi 507 wizyt
pytanie zadane 27 grudnia 2016 w C i C++ przez szym3ns Użytkownik (860 p.)
+1 głos
2 odpowiedzi 260 wizyt
pytanie zadane 7 stycznia 2016 w C i C++ przez X3ven Nowicjusz (180 p.)

92,568 zapytań

141,422 odpowiedzi

319,635 komentarzy

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

...