Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

ne uspeva kompilacija originalnog koda ?

[es] :: C/C++ programiranje :: ne uspeva kompilacija originalnog koda ?

[ Pregleda: 3740 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Pretender

Član broj: 12407
Poruke: 100
*.beotel.net



Profil

icon ne uspeva kompilacija originalnog koda ?04.12.2003. u 15:08 - pre 247 meseci
Help needed !

Zasto kompilacija ovog koda ne uspeva ?
Code:
     #include <iostream.h>
     #include <conio.h>

      const int DefaultSize = 10;

     // declare a simple Animal class so that we can
     // create an array of animals

     class Animal
     {
    public:
       Animal(int);
       Animal();
       ~Animal() {}
       int GetWeight() const { return itsWeight; }
       void Display() const { cout << itsWeight; }
    private:
       int itsWeight;
    };

    Animal::Animal(int weight):
    itsWeight(weight)
    {}

    Animal::Animal():
    itsWeight(0)
    {}


    template <class T>  // declare the template and the parameter
    class Array            // the class being parameterized
    {
    public:
       // constructors
       Array(int itsSize = DefaultSize);
       Array(const Array &rhs);
       ~Array() { delete [] pType; }

       // operators
       Array& operator=(const Array&);
       T& operator[](int offSet) { return pType[offSet]; }
       const T& operator[](int offSet) const
           { return pType[offSet]; }
       // accessors
       int GetSize() const { return itsSize; }

    private:
       T *pType;
       int  itsSize;
    };

    // implementations follow...

    // implement the Constructor
    template <class T>
    Array<T>::Array(int size = DefaultSize):
    itsSize(size)
    {
       pType = new T[size];
       for (int i = 0; i<size; i++)
          pType[i] = 0;
    }

    // copy constructor
    template <class T>
    Array<T>::Array(const Array &rhs)
    {
       itsSize = rhs.GetSize();
      pType = new T[itsSize];
       for (int i = 0; i<itsSize; i++)
          pType[i] = rhs[i];
    }

    // operator=
    template <class T>
    Array<T>& Array<T>::operator=(const Array &rhs)
    {
       if (this == &rhs)
          return *this;
       delete [] pType;
       itsSize = rhs.GetSize();
       pType = new T[itsSize];
       for (int i = 0; i<itsSize; i++)
          pType[i] = rhs[i];
       return *this;
   }

    // driver program
    int main()
    {
       Array<int> theArray;      // an array of integers
       Array<Animal> theZoo;     // an array of Animals
      Animal *pAnimal;

       // fill the arrays
       for (int i = 0; i < theArray.GetSize(); i++)
       {
          theArray[i] = i*2;
          pAnimal = new Animal(i*3);
          theZoo[i] = *pAnimal;
            delete pAnimal;
      }
      // print the contents of the arrays
      for (int j = 0; j < theArray.GetSize(); j++)
      {
         cout << "theArray[" << j << "]:\t";
         cout << theArray[j] << "\t\t";
         cout << "theZoo[" << j << "]:\t";
         theZoo[j].Display();
         cout << endl;
      }
      int j;
      for (int k = 0; k < theArray.GetSize(); k++)
         delete &theZoo[j];
     getch();
     return 0;
 }

Poruka kompajlera:
Citat:
E2148 Default argument value redeclared for parameter 'parameter' Compiler error
When a parameter of a C++ function is declared to have a default value, this value can't be changed, redeclared, or omitted in any other declaration for the same function.

Ovde je, cini mi se, greska u deklaraciji Array konstruktora, gde umesto itsSize, valjda treba da stoji size, ali ni ta promena ne pomaze (ide ista poruka).
I jos nesto.
Autor kaze:
Citat:
The Array class has two constructors as shown, the first of which takes a size and defaults to the constant integer DefaultSize.
ali, ja ne vidim 2. konstruktor klase Array.


Hvala^6
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.in-addr.btopenworld.com



+4 Profil

icon Re: ne uspeva kompilacija originalnog koda ?04.12.2003. u 15:59 - pre 247 meseci
Konstruktori su ti jedan ispod drugog ;)
"Donji" je copy-constructor, a gornji je sa int argumentom koji je default-ovan.
I tu ti je greska - default parametar se navodi u definiciji, a u implementaciji se ne ponavlja! Dakla Array(int itsSize = DefaultSize); u definiciji klase, a Array(int itsSize ); u implementaciji!
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: ne uspeva kompilacija originalnog koda ?04.12.2003. u 16:04 - pre 247 meseci
1. Na mom kompajleru (VC 7.1) ovo prolazi, uz jedno upozorenje vezano za upotrebu j. Probaj da umesto

Array<T>::Array(int size = DefaultSize):

staviš

Array<T>::Array(int size):

2. I copy konstruktor je konstruktor, tako da ipak imaš dva konstruktora:

Array(int itsSize = DefaultSize);
Array(const Array &rhs);

 
Odgovor na temu

Pretender

Član broj: 12407
Poruke: 100
*.beotel.net



Profil

icon Re: ne uspeva kompilacija originalnog koda ?04.12.2003. u 19:09 - pre 247 meseci
Posle predlozene izmene, kompilacija je uspela.

Javlja se, medjutim, neki izuzetak:
Debugger Exception Notification:
Project Project1.exe raised exception class EAccessViolation ...

Pre nekih pet-sest program run-ova, ovo (ili nesto slicno) se pojavilo prvi put (kada sam u jedan program uneo neke experimentalne izmene), i od tada se desava skoro redovno.
Da li bi mogao da bude problem sa memorijom (128M) ili nesto drugo ?
Da li da reinstaliram Builder ?

B)
Pretpostavio sam da se misli na copy konstruktor, ali on za parametar uzima const Array referencu, a u citiranom textu se kaze da 1. konstruktor uzima parametar size, a drugi (defaults), konstantni integer- DefaultSize.
Zato mi nista nije jasno.


Hvala
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.lsil.com



+1001 Profil

icon Re: ne uspeva kompilacija originalnog koda ?04.12.2003. u 19:37 - pre 247 meseci
AccessViolation - pokusavas da nesto upises u memorijsku lokaciju u koju
ne bi trebalo da imas pristupa.

Moguci razlozi:
1) pokusavas da modifikujes const varijablu
2) pokusavas da pises po protected ili private clanicama klase
3) u radu sa array-om izlazis izvan okvira array-a

Startuj debugger, stavi breakPoint na razna mesta u kodu, i reci nam tacno
na kom mestu u kodu se taj EAccessViolation javlja.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: ne uspeva kompilacija originalnog koda ?04.12.2003. u 20:36 - pre 247 meseci
Ma jok. To je zbog ovoga:

int j; // Koja je vrednost j ovde???????
for (int k = 0; k < theArray.GetSize(); k++)
delete &theZoo[j]; // sta brises ovde?????

 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: ne uspeva kompilacija originalnog koda ?04.12.2003. u 20:41 - pre 247 meseci
Hehehe, tek sad videh ovaj detaljčić. Ti pokušavaš delete objekata koji su na steku.

Nije valjda opet primer iz knjige?
 
Odgovor na temu

Pretender

Član broj: 12407
Poruke: 100
*.beotel.net



Profil

icon Re: ne uspeva kompilacija originalnog koda ?04.12.2003. u 21:27 - pre 247 meseci
Uh , jeste primer iz one knjige, a ono `int j` sam dodao ja, jer se bez toga kompajler bunio da mu [j] nije definisano(??).
E sad, postavio sam breakpointe na vecinu linija u main-u, ali sam u Debug Windows/Event log dobio poruke:

Thread Start: Thread ID: 0x00000790. Process Project1.exe (0x1F8)
Process Start: C:\Program Files\Borland\CBuilder6\Projects\Project1.exe. Base Address: 0x00400000. Process Project1.exe (0x1F8)
Module Load: Project1.exe. Has Debug Info. Base Address: 0x00400000. Process Project1.exe (0x1F8)
Module Load: ntdll.dll. No Debug Info. Base Address: 0x77F50000. Process Project1.exe (0x1F8)
Module Load: KERNEL32.dll. No Debug Info. Base Address: 0x77E60000. Process Project1.exe (0x1F8)
Module Load: cc3260mt.dll. No Debug Info. Base Address: 0x32600000. Process Project1.exe (0x1F8)

itd. sto verovatno znaci da ne umem da startujem debuger.

Medjutim, sad ce biti velikih problema, jer posle svog tog petljanja sa mnostvom Debug opcija, vise ne mogu da startujem ni jedan od vec kompajliranih programa.

Obzirom da mi ovaj Builder 6, radi sve gore, razmisljam da ga zamenim nekim jednostavnijim. Imam na raspolaganju Borland Turbo C++ Builder 4.5 .
Da li da probam ?

Uzgred, koje bi bilo objasnjenje za onaj 2. konstruktor ?

 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: ne uspeva kompilacija originalnog koda ?04.12.2003. u 22:28 - pre 247 meseci
Ama prijatelju, samo makni celu delete petlju i ima sve da proradi.

A što se tiče kompajlera, moj savet ti je VC++ 7.1.
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.in-addr.btopenworld.com



+4 Profil

icon Re: ne uspeva kompilacija originalnog koda ?05.12.2003. u 13:56 - pre 247 meseci
MS.DEV je najbolje integrisano resenje, ali kao suvi kompajler definitivno nije.
Iako ga koristim svakodnevno nekompatibilnost u nekim delovima me zesce nervira!
Ma jos template-ove nisu sredili kako valja!

Razmotri sve opcije, ali moj ti je savet da ne menjas Borland tako lako, kompajler je odlican i donekle brzi nego MS. I STL implementacija je odlicna (STLport), sto se ne bi reklo za MS-ovo standardno resenje. Naravno da ima svojih bubica, ali to sto je IDE ponekad nestabilan nije toliko strasno. Evo meni jutros Visual Studio 2003 ubi Windows ko od sale cim sam pokrenuo 2 instance sa 2 razlicita (velika) projekta.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
..ndg-pm4-2.dialup.nethere.net



+6 Profil

icon Re: ne uspeva kompilacija originalnog koda ?06.12.2003. u 22:32 - pre 247 meseci
Citat:
NastyBoy:
MS.DEV je najbolje integrisano resenje, ali kao suvi kompajler definitivno nije.
Iako ga koristim svakodnevno nekompatibilnost u nekim delovima me zesce nervira!
Ma jos template-ove nisu sredili kako valja!


Ako pod "MS.DEV" podrazumevaš Visual C++, očigledno nisi radio sa najnovijom verzijom (7.1), koja je 98% kompatibilna sa standardom (samo EDGov kompajler je bolji u tom pogledu, a Borland zaostaje).
 
Odgovor na temu

Pretender

Član broj: 12407
Poruke: 100
*.beotel.net



Profil

icon Re: ne uspeva kompilacija originalnog koda ?07.12.2003. u 23:33 - pre 247 meseci
Dragi Tata,
ja sam dobro koje i tebi zelim.

Posle brisanja delete petlje (i naravno zamene kompajlera) sve radi just fine.

Medjutim, sada me zanima zasto (?)
1) theZoo(i) se inicijalizuju objektima koji jesu na heap-u (pAnimal = new Animal(i*3); zasto su oni onda na steku i njihovo brisanje je zabranjeno ?
2) Da li je operator `=` iz theZoo(i) = *pAnimal, onaj overloadovani iz klase Array. Ako jeste, onda nije jasno sta radi petlja u njegovoj definiciji (pType(i) = rhs(i)) sa Animal objektima (?)

Pored toga, jos jednom, molim za objasnjenje onog 2. konstruktora (precizirao sam pitanje u svom 2. postu), jer ako je tu sve u redu onda sam ja u nekoj debeloj zabludi.
Rekao bih da je autor tu mozda pomesao Animal sa Array konstruktorima (?)

Inace, nisam mogao da nadjem predlozene kompajlere, pa sam metnuo Borland TurboC++ 4.5 koji je mnogo jednostavniji od 6-ice, i samim tim mnogo bolji za mene. Za sada sam vrlo zadovoljan.


Hvala*10^8
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: ne uspeva kompilacija originalnog koda ?08.12.2003. u 23:56 - pre 247 meseci
OK. Bio sam malo zauzet, pa se nisam javio ranije.

1) theZoo objekti su naravno na heap-u, a ne na steku kako sam brzopleto zaključio ne gledajući implementaciju, ali ne zbog pAnimal = new Animal(i*3); već zbog pType = new T[itsSize]; Oni moraju da se obrišu sa delete [] pType; baš kao što se radi u destruktoru, a ne da brišeš svaki element pojedinačno kako si pokušao u onoj petlji. Pravilo je da kad koristiš operator new[], moraš da brišeš sa delete[].

2) Nije. To je operator za klasu Animal, koji je po defaultu napravio kompajler.

3) Što se konstruktora tiče, sve je logično, nego mi se čini da imaš problem sa prevodom. Prvi konstruktor ima argument size koji ima podrazumevanu vrednost DefaultSize. Drugi konstruktor je copy konstruktor.

4) Turbo C++ 4.5 je poslednji Borlandov kompajler koji sam koristio - cca 1995. C++ standard je usvojen krajem 1998, pa vidi sam koliko je TC4.5 dobar za učenje C++a. Kao što rekoh, probaj da nađeš MSVC 7.1, ili ako ne možeš ili nećeš, pogledaj poslednju verziju mingw-a. Sa stanovišta usklađenosti sa standardom, najbolji je najnoviji Comeau, ali ne znam koliko je rasprostranjen u tvom komšiluku.
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: ne uspeva kompilacija originalnog koda ?10.12.2003. u 15:17 - pre 247 meseci
Aj' (ne bilo ti zapovedjeno) zalepi taj kod (zip-ovan recimo) ovde negde, pa da pogledam kad odem kuci.
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

[es] :: C/C++ programiranje :: ne uspeva kompilacija originalnog koda ?

[ Pregleda: 3740 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.