Tablica wskaźników do struktur, niejasne przypisanie obiektu


(Kornicameister) #1

main.cpp

#include "strukt.h"


using namespace std;


double str2double(std::string sstring)

{

    double wynik;

    stringstream ss;

    ss<
    ss>>wynik;

    return wynik;

}


int main()

{

    std::string line,data,temp;

    unsigned int i=0,j=0,licznik=1,rozmiar=0,rozmiar2=0;

    Stud *tablicaStudentow=0;

    cout<<"Program - zadanie 10"<
    fstream dane;

    /*------------------------*/

    dane.open("dane.txt");

    while(!dane.eof()) //przegladam raz plik

    { //pozwoli mi to poznac

        getline(dane,line); //ilosc linii w pliku

        rozmiar++; //potrzebne do dynamicznej

    } //alokacji tablicy

    rozmiar2=rozmiar;

    dane.close();

    dane.clear();

    tablicaStudentow=new Stud[rozmiar];

    rozmiar=0; //zerowanie tej zmiennej

                                //przyda sie do pozniejszego wpisywania do tablicy danych ze struktury

    /*------------------------*/

    dane.open("dane.txt");

    while(!dane.eof())

    {

        getline(dane,line);

        j=licznik=0;

        for(i=0;i
        {

            if(line[i]==';')

            {

                if(licznik==0)

                {

                    temp=line.substr(j,i-j);

                    for(unsigned int a=0;a
                    {

                        tablicaStudentow[rozmiar].Imie[a]=temp[a];

                    }

                    licznik++;

                    j=i+1;

                }

                else if(licznik==1)

                {

                    temp=line.substr(j,i-j);

                    for(unsigned int a=0;a
                    {

                        tablicaStudentow[rozmiar].Nazwisko[a]=temp[a];

                    }

                    licznik++;

                    j=i+1;

                }

                else if(licznik==2)

                {

                    tablicaStudentow[rozmiar].DataUr.data=line.substr(j,i-j);

                    licznik++;

                    j=i+1;

                }

                else if(licznik==3)

                {

                    temp=line.substr(j,i-j);

                    tablicaStudentow[rozmiar].Srednia=str2double(temp);

                }

            }

        }

        //zwiekszenie zmiennej sterujacej indeksem w tablicaStudentow//

        rozmiar++;

        //-+-+-+-+-+-+-+-+-+//

    }

    dane.clear();

    dane.close();

    //KONIEC BLOKU WCZYTYWANIA DANYCH Z PLIKU

    //DEKLERACJA TRZECH TABLIC WSKAZNIKOW

    Stud *tablica1[rozmiar2];

    Stud *tablica2[rozmiar2];

    Stud *tablica3[rozmiar2];

    //KONIEC DEKLARACJI TRZECH TABLIC WSKAZNIKOW

    tablica1[0]=&tablicaStudentow[0];

    cout<Imie<
    tablica1[0]->Imie[2]='K'; //DZIALANIE NIEPOZADANE POJAWIA SIE TUTAJ

    cout<
    return 0;

}

strukt.h

#ifndef STRUKT_H

#define STRUKT_H

#include 

#include 

#include 

#include 


struct Data

{

    std::string data;

};

struct Stud

{

    char Imie[14];

    char Nazwisko[28];

    Data DataUr;

    float Srednia;

    Stud();

    ~Stud();

};


#endif // STRUKT_H

cześć polecenie, gdzie mam problem

Dane grupy studenckiej

powinny być wczytywane z pliku dyskowego (tekstowego lub binarnego) do dynamicznie

zaalokowanej tablicy struktur. Utworzyć trzy tablice wskaźników do tych struktur.

nawiązując do tego co wyczytałem na http://www.mif.pg.gda.pl/homepages/sylas/students/alg/c/7.htm, same tablice wskaźników utworzyłem dobrze, wcześniej miałem alokować dynamicznie tablicę na obiekty tej struktury

wczytywane z pliku dyskowego (tekstowego lub binarnego) do dynamicznie

zaalokowanej tablicy struktur.

co zrobiłem jak poznałem ile mam linii w pliku, tj. ilu studentów :slight_smile: no ale pojawił się problem... bo jak utworzyłem te tablice wskaźników, to muszę przypisać do każdej komórki tablica1, adres odpowiedniej struktury z tablicaStudentow, czy mam rację ? jeśli tak to ten kawałek kodu

tablica1[0]=&tablicaStudentow[0];

powinien zrobić to dla pierwszych elementów

no tylko potem jak widać te dwie linijki, co mnie dziwi zmiana w tablica1, powoduje zmianę w tablicaStudentow... i teraz potem mam w poleceniu sortowania tych tablic wskaźników, no to jak posertuję tablica1, to wpłynie to na tablicaStudentow a tym samym na tablica2 i tablica3, tak ?

no i to jest mój problem, chyba że źle rozumiem polecenie i faktycznie tak ma być


([alex]) #2

Jeżeli masz wskaźnik na obiekt to zmiana zawartości wskaźnika wpłynie na ten obiekt, na przykład:

struct Punkt { double x,y; };Punkt P={1,2},*w=P;w-x=10;coutP.xendl; [/code]Czy w tym przypadku też się zdziwisz że P.x się zmienił?



Przy sortowaniu wskaźników (o [u]posertowaniu[/u] nic nie wiem) oryginalna tablica nie zmienia ani zawartości ani kolejności.

(Kornicameister) #3

powinno być 'nie dziwi', za co przepraszam bo wyszło, że pytam o co innego niż zamierzałem, a za literówkę również przepraszam, bo chodziło mi oczywiście o sortowanie tablicy względem jakiegoś przyjętego kryterium

tj. jeśli mam tablica1, która trzyma wskaźniki do obiektów struktury Stud, to muszę posortować te obiekty względem średniej od najmniejszej do największej