[c++] błąd w kodzie, dane z nikąd?

0

mam dwie klasy

class wiersz 
    {
    
    public:
        string zawartosc_data;
        float z_max;
        float z_min;
        float z_sr_waz;
        float avg;
        float otw;
        float zak;
        
        float patin[];
        
        
        
       
        void wczytanie();
        
        
     
     }  ;      


class not
 {   
     public:
     vector <wiersz> rekordy;
     

oraz funkcje

 notowania stock;


void wczytanie() //vector<wiersz> *dane

{   

        ifstream plik("data.txt");
     
        while( plik.peek() != EOF ) 

        {     
         wiersz rekord;
                
       
         
        
           
        plik >> rekord.zawartosc_data; cout << rekord.zawartosc_data << "\t";
        plik >> rekord.z_max;          cout << rekord.z_max << "\t";
        plik >> rekord.z_min;          cout << rekord.z_min << "\t";
        plik >> rekord.z_sr_waz;       cout << rekord.z_sr_waz << "\t";
        plik >> rekord.avg;            cout << rekord.avg << "\t";
        plik >> rekord.otw;            cout << rekord.otw << "\t";
        plik >> rekord.zak;            cout << rekord.zak << "\t";
        
         cout << endl;
         stock.rekordy.push_back(rekord);
               
         }    
       
         for(int x=0; x<stock.rekordy.size(); x++)
        
          {  
              
              
               stock.rekordy[x].patin[0] = stock.rekordy[x].z_max;            // iteracja na patin musze zaczac od 2 bo inaczej sie zawiesza?!        
               stock.rekordy[x].patin[1] = stock.rekordy[x].z_min;
               stock.rekordy[x].patin[2] = stock.rekordy[x].z_sr_waz;
               stock.rekordy[x].patin[3] = stock.rekordy[x].avg;
               stock.rekordy[x].patin[4] = stock.rekordy[x].otw;
               stock.rekordy[x].patin[5] = stock.rekordy[x].zak;
               
          }  
                 

// najpierw spostrzeglem ze nie moge podstawiac pod patin 0 ani 1 bo inaczej sie zawiesza, pozniej bez inicjalizacji czegokolwiek probowalem sprawdzic co kryje sie pod patin[i] uzywajac for zdziwilem sie bo sa tam wartosci z_max; z_min ; z_sr_waz; etc. dokladnie przedzielone wartosciami z kosmosu, jakby był sam kosmos to bym sie nie zdziwil, nie moge wyzerowac, nie moge nic z tym zrobic, ani zamienic, i NAJWAZNIEJSZE PYTANIE: skad te dane biora sie w patin skoro ich tam nie wrzucam?! gdzie blad co zle przydzielam, prosze o pomoc... :|

oto czesc z tego co mi wyskakuje:

3.21366e-039 // kosmos
7.07774e-039 // kosmos
6.38 // z_max
6.22 // z_min
6.26 // z_sr_waz
6.3 // avg
6.22 // otw
6.37 // zam
3.21366e-039 // kosmos
7.07777e-039 // kosmos
6.42 // z_max
6.26 // z_min
6.33 // z_sr_waz
6.34 // avg
6.34 //otw
6.36 // zam
3.21366e-039

i tak do konca

0

Brawo geniuszu, odkryłeś jak wygląda pamięć komputera.
float patin[]; to deklaracja tablicy ZEROELEMENTOWEJ zmiennych typu float. Próba odwołania sie do jakiegokolwiek indeksu tej tablicy to jest odwoływanie sie do NIE SWOJEJ pamięci.
A że przesuwając sie po tej pamieci trafiasz na pewne dane, to akurat logiczne. Bo te dane są ustawione po sobie po prostu. Jeśli stworzysz sobie zmienne
int x = 1;
int y = 2;
int z = 3;
to masz sporą szansę że ustawiając wskaźnik na zmiennej x
int* wskaznik = &x;
i przesuwając ten wskaźnik, wypisujac dane okaże się że trafiłeś na wartości y i z

#include <iostream>
using namespace std;

int main()
{

  int x = 1;
  int y = 2;
  int z = 3;
  int* wskaznik = &x;
  cout<<*wskaznik<<" "<<*(wskaznik-1)<<" "<<*(wskaznik-2);
  return 0;
}

Efekt tego programu to z reguły 1 2 3 i obrazuje to o czym mowa.
C/C++ to języki które pozwalaja czasami na dość niskopoziomowe operacje jak zabawy z pamięcią.
To właśnie zrobiłeś coś takie, ale z tablicą.

#include <iostream>
using namespace std;

int main()
{

  int x = 1;
  int y = 2;
  int z = 3;
  int* wskaznik = &z;
  cout<<wskaznik[0]<<" "<<wskaznik[1]<<" "<<wskaznik[2];
  return 0;
}

Tutaj wynikiem pewnie będzie 3 2 1 i obrazuje to co zrobiłeś. Potraktowałeś wskaźnik jako tablicę i chciałeś się odnosić do jej elementów. Tutaj tak samo. Ustawiam wskaźnik na pojedyńczą zmienną a potem sobie przesuwam ten wskaźnik tak jakby to byla tablica i czytam z pamięci która leży obok mojej zmiennej.

(oczywiście nalezy pamiętać że stos rośnie, więc adresy kolejnych zmiennych są mniejsze, dlatego w przykładzie ustawiłem wskaźnik na zmiennej Z, bo zmienne x i y mają dalsze adresy)

0

ale jestem baran, chyba za długo nad tym siedze mały #define załatwił sprawe, dzieki wielkie!!!! :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1