Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: tutg++

Sivun loppuun

Gaxx [20.01.2008 16:47:54]

#

Ongelma on tavallaan kääntäjäkohtainen, mutta joku osaava taitanee silti vastata.

Teen harjoitustyötä(koulutyö, kieli c++) ja yksi sen kriteereistä on, että ohjelma kääntyy koulumme omalla g++:n versiolla: tutg++:lla.

Ohjelmoidessani harkkatyötä, käytin mingw:tä, koska muuten olisi joutunut koodaamaan melko ankeassa ympäristössä. Saatuani ohjelman valmiiksi, koitin kääntää sen tuolla tutg++:lla. Muutaman muutoksen jouduin tekemään, jotta ohjelmani kääntyi varoituksitta — tutg++ on kovin tarkka kaikenlaisista asioista.

Ohjelma kääntyy muuten varoituksitta, mutta kääntäjä ei tunnu sulattavan seuraavanlaista tietorakennetta, vaikka mingw syö sen mukisematta.

struct Koordinaatti {
   int x;
   int y;
};

struct Siirto {
   Koordinaatti lahto;
   Koordinaatti kohde;
};

*** ai.hh(included in file ataxx.cc:6)
08: struct RekursioSiirto {
09:    Siirto siirto;
10:    int painoarvo;
11:    vector<RekursioSiirto> rekursioSiirrot;
12: };

Onko tuossa rakenteessa jotain standardien vastaista? Mikä neuvoksi?

Tässä vielä kääntäjän kommentit, jos niistä on jollekin apua.

In file included from ataxx.cc:6:
.../boost_concept_check.h: In instantiation of '__gnu_cxx::_SGIAssignableConcept<RekursioSiirto>':
.../stl_vector.h:163:   instantiated from 'std::__norm::vector<RekursioSiirto>'
.../vector:52:   instantiated from 'std::vector<RekursioSiirto>'
.../vector:15:   instantiated from 'std::vector<RekursioSiirto>'
ai.hh:11:   instantiated from here
.../boost_concept_check.h:217: error: '__gnu_cxx::_SGIAssignableConcept<_Tp>::__a' has incomplete type
ai.hh:8: error: forward declaration of 'struct RekursioSiirto'
.../boost_concept_check.h: In member function 'void __gnu_cxx::_SGIAssignableConcept<_Tp>::__constraints() [with _Tp = RekursioSiirto]':
.../stl_vector.h:163:   instantiated from 'std::__norm::vector<RekursioSiirto>'
.../vector:52:   instantiated from 'std::vector<RekursioSiirto>'
.../vector:15:   instantiated from 'std::vector<RekursioSiirto>'
ai.hh:11:   instantiated from here
.../boost_concept_check.h:209: error: using invalid field '__gnu_cxx::_SGIAssignableConcept<_Tp>::__a'
.../stl_vector.h:163:   instantiated from 'std::__norm::vector<RekursioSiirto>'
.../vector:52:   instantiated from 'std::vector<RekursioSiirto>'
.../vector:15:   instantiated from 'std::vector<RekursioSiirto>'
ai.hh:11:   instantiated from here
.../boost_concept_check.h:210: error: using invalid field '__gnu_cxx::_SGIAssignableConcept<_Tp>::__a'
.../boost_concept_check.h:210: error: using invalid field '__gnu_cxx::_SGIAssignableConcept<_Tp>::__a'
.../stl_vector.h:163:   instantiated from 'std::__norm::vector<RekursioSiirto>'
.../vector:52:   instantiated from 'std::vector<RekursioSiirto>'
.../vector:15:   instantiated from 'std::vector<RekursioSiirto>'
ai.hh:11:   instantiated from here
.../boost_concept_check.h:211: error: using invalid field '__gnu_cxx::_SGIAssignableConcept<_Tp>::__a'
.../boost_concept_check.h: In member function 'void __gnu_cxx::_SGIAssignableConcept<_Tp>::__const_constraints(const _Tp&) [with _Tp = RekursioSiirto]':
.../boost_concept_check.h:211:   instantiated from 'void __gnu_cxx::_SGIAssignableConcept<_Tp>::__constraints() [with _Tp = RekursioSiirto]'
.../stl_vector.h:163:   instantiated from 'std::__norm::vector<RekursioSiirto>'
.../vector:52:   instantiated from 'std::vector<RekursioSiirto>'
.../vector:15:   instantiated from 'std::vector<RekursioSiirto>'
ai.hh:11:   instantiated from here
.../boost_concept_check.h:215: error: using invalid field '__gnu_cxx::_SGIAssignableConcept<_Tp>::__a'
In file included from ai.cc:16:
.../boost_concept_check.h: In instantiation of '__gnu_cxx::_SGIAssignableConcept<RekursioSiirto>':
.../stl_vector.h:163:   instantiated from 'std::__norm::vector<RekursioSiirto>'
.../vector:52:   instantiated from 'std::vector<RekursioSiirto>'
.../vector:15:   instantiated from 'std::vector<RekursioSiirto>'
ai.hh:11:   instantiated from here
.../boost_concept_check.h:217: error: '__gnu_cxx::_SGIAssignableConcept<_Tp>::__a' has incomplete type
ai.hh:8: error: forward declaration of 'struct RekursioSiirto'
.../boost_concept_check.h: In member function 'void __gnu_cxx::_SGIAssignableConcept<_Tp>::__constraints() [with _Tp = RekursioSiirto]':
.../stl_vector.h:163:   instantiated from 'std::__norm::vector<RekursioSiirto>'
.../vector:52:   instantiated from 'std::vector<RekursioSiirto>'
.../vector:15:   instantiated from 'std::vector<RekursioSiirto>'
ai.hh:11:   instantiated from here
.../boost_concept_check.h:209: error: using invalid field '__gnu_cxx::_SGIAssignableConcept<_Tp>::__a'
.../boost_concept_check.h:210: error: using invalid field '__gnu_cxx::_SGIAssignableConcept<_Tp>::__a'
.../boost_concept_check.h:210: error: using invalid field '__gnu_cxx::_SGIAssignableConcept<_Tp>::__a'
.../stl_vector.h:163:   instantiated from 'std::__norm::vector<RekursioSiirto>'
.../vector:52:   instantiated from 'std::vector<RekursioSiirto>'
.../vector:15:   instantiated from 'std::vector<RekursioSiirto>'
ai.hh:11:   instantiated from here
.../boost_concept_check.h:211: error: using invalid field '__gnu_cxx::_SGIAssignableConcept<_Tp>::__a'
.../boost_concept_check.h: In member function 'void __gnu_cxx::_SGIAssignableConcept<_Tp>::__const_constraints(const _Tp&) [with _Tp = RekursioSiirto]':
.../boost_concept_check.h:211:   instantiated from 'void __gnu_cxx::_SGIAssignableConcept<_Tp>::__constraints() [with _Tp = RekursioSiirto]'
.../stl_vector.h:163:   instantiated from 'std::__norm::vector<RekursioSiirto>'
.../vector:52:   instantiated from 'std::vector<RekursioSiirto>'
.../vector:15:   instantiated from 'std::vector<RekursioSiirto>'
ai.hh:11:   instantiated from here
.../boost_concept_check.h:215: error: using invalid field '__gnu_cxx::_SGIAssignableConcept<_Tp>::__a'

Sharph [20.01.2008 16:54:37]

#

Gaxx kirjoitti:

*** ataxx.hh(included in file ataxx.cc:6)
08: struct Tietue {
09:    Oma muuttuja
10:    int muuttuja2;
11:    vector<Tietue> vektori;
12: };

Tuossa minun silmääni ainakin sattuu että kahden ensimmäisen määrittelyn välissä ei ole mitään erotinta, siinä pitäisi kai olla ;. Mitenköhän minigw suostuu tuollaisen syömään :o En kyllä tiedä tutg++:sta mitään, mutta kielenhän ei pitäisi erota?

Gaxx [20.01.2008 17:02:25]

#

No pitikin lipsahtaa viestiin tuollainenkin virhe :/. Korjasin alkuperäiseen viestiin.

Ongelma siis ei ole tuo erottimen puuttuminen(koodista erotin löytyi).

Edit: tutg++ tosiaan tuntuu vaativan puhdasta c++:aa. Mitkään c-viritykset eivät sille kelpaa.

Sharph [20.01.2008 17:14:35]

#

Noita käääntäjäherjoja lukiessa aloin hieman epäilemään että liittyykö tuo koodipätkä jotenkin tähän virheeseen, kun tästä Tietue-structista ei mainita kääntäjän herjauksissa sanallakaan. Käykö siis niin, että koodi ei suostu kääntymään siitä lähtien kun tuo lisätään ataxx.hh:n? Kaikki noista ilmoituksista viittaavat STL:n headereihin, eli jotain ristiriitaa vaikuttaisi olevan niiden kanssa. Ehkä hieman lisätietoa voisi valaista asiaa: miten tuota Tietuetta käytetään, mitä tekee luokka Oma..?

Metabolix [20.01.2008 17:21:53]

#

Periaatteessahan kääntäjä joutuu tuossa määrittelyssä ikuiseen silmukkaan, kun tietueen sisällä on rakenne, jossa on tietue, jossa on rakenne, jossa on tietue, jossa... En ole varma, mitä standardi aiheesta sanoo, mutta ottamatta kantaa siihen, onko vika koodissa vai kääntäjässä, kyseessä on varmaan sama virhe kuin tässä:

struct STRUCT {
  int i;
  STRUCT jasen[2];
};

Ainakin tämä aiheuttaa virheen "field 'jasen' has incomplete type", ja en oikein keksi syytä, miksei vektorinkin kanssa voisi tulla aivan samaa virhettä. Tai sitten näin:

struct STRUCT;
int i = sizeof(STRUCT);
struct STRUCT {
  int i;
  STRUCT jasen[2];
};

Virheenä nyt "invalid application of 'sizeof' to incomplete type 'STRUCT'".

Toisin sanoen mitään sellaista ei voi tehdä, mihin vaadittaisiin tietyn tyypin koon tuntemista ennen määrittelyn päättymistä tai rakenteen tuntemista ennen kyseisten rakenteiden määrittelyä.

Tällaista tajunnanvirtaa tällä kertaa. :)

Gaxx [20.01.2008 17:24:36]

#

No voi kökkö! Onnistuin säheltään oikein kunnolla. Nyt kaiken PITÄISI olla kunnossa.

Pyydän lukemaan ekan viestin uudelleen :)

Edit: Metabolix: Lähinnä itseäni ihmetyttää se, että mingw ei inahda mitään ja ohjelma toimii kuten pitääkin.

Metabolix [20.01.2008 17:53:58]

#

Lukaisin nyt pikaisesti speksiä, ja siellä lukee näin:

lainaus:

In particular, the effects are undefined in the following cases: — — if an incomplete type is used as a template argument when instantiating a template component.

Kohdasta "Point of instantiation" tulkitsin, että se tapahtuisi tuossa tapauksessa juuri kyseisellä rivillä.

Eli nähtävästi toiminta riippuu implementaatiosta, ja tuossa se ei toimi.

Gaxx [21.01.2008 19:39:05]

#

Kysäsin asiasta tänään luennoitsijalta, mutta hän ei osannut yhtäkkiä sanoa mitään varmanpäälle. Ja koska minulla oli jo nukkumaanmennessä kehkeytynyt vaihtoehtoinen toteutustapa, en viitsinyt vaivata häntä enempää.

Muutin siis ohjelman toteutusta karvan verran. Nyt se ei ole aivan yhtä loogisen selkeä, mutta ymmärrettävä kuitenkin. Ja mikä tärkeintä sain tutg++:n kin syömään sen :)

Kiitos vastanneilla.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta