/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Problem med at compile C++ kode med
Fra : Preben


Dato : 23-04-06 15:36

Hej gruppe,

vi har fået et kæmpe problem med noget C++ kode som bare ikke vil virke
som det skal.

Koden kan ses på www.mip.sdu.dk/~soren/robp01.tar.gz... (bliv ikke
skræmt af filstørrelse) - der er både billedbehandlingslibrary m.v. i også.

Kræver dog OpenGL for at compile.


Når der compiles med gcc fremkommer fejlen:

-----
then mv -f ".deps/Scene.Tpo" ".deps/Scene.Plo"; else rm -f
".deps/Scene.Tpo"; exit 1; fi
g++ -DHAVE_CONFIG_H -I. -I. -I../../src -g -O2 -MT Scene.lo -MD -MP
-MF .deps/Scene.Tpo -c Scene.cpp -o Scene.o
Scene.cpp:124: error: prototype for `void
Graphics::Scene::captureImage(ipl::CImage*)' does not match any in
class `
Graphics::Scene'
Scene.h:26: error: candidate is: void
Graphics::Scene::captureImage(ipl::CImage*, Graphics::Scene&)
Scene.cpp: In member function `void
Graphics::Scene::captureImage(ipl::CImage*)
':
Scene.cpp:125: error: no matching function for call to `Graphics::Camera::
captureImage(ipl::CImage*&, Graphics::Scene&)'
Camera.h:21: error: candidates are: void
Graphics::Camera::captureImage(ipl::CImage*, Scene&)
.../../src/ipl98/source/ipl98/cpp/std_image.h: At global scope:
.../../src/ipl98/source/ipl98/cpp/std_image.h:190: warning: inline function `
virtual UINT32 ipl::CStdImage::GetPixelFast(int, int) const' used
but never
defined
make[2]: *** [Scene.lo] Error 1
make[2]: Leaving directory `/home/soren/robp01/robp01/src/Graphics'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/soren/robp01/robp01/src'
make: *** [all] Error 2
(soren@hurup) ~/robp01/robp01/src > cd '/home/soren/robp01/robp01/src'
(soren@hurup) ~/robp01/robp01/src > cd
'/home/soren/robp01/robp01/src/Graphics'
(soren@hurup) ~/robp01/robp01/src/Graphics > cd
'/home/soren/robp01/robp01/src'
(soren@hurup) ~/robp01/robp01/src > cd
'/home/soren/robp01/robp01/src/Graphics'
(soren@hurup) ~/robp01/robp01/src/Graphics > make
if /bin/sh ../../libtool --mode=compile g++ -DHAVE_CONFIG_H -I. -I.
-I../../src -g -O2 -MT Scene.lo -MD -MP -MF ".deps/Scene.Tpo" -c -o
Scene.lo Scene.cpp; \
then mv -f ".deps/Scene.Tpo" ".deps/Scene.Plo"; else rm -f
".deps/Scene.Tpo"; exit 1; fi
g++ -DHAVE_CONFIG_H -I. -I. -I../../src -g -O2 -MT Scene.lo -MD -MP
-MF .deps/Scene.Tpo -c Scene.cpp -o Scene.o
Scene.cpp:124: error: prototype for `void
Graphics::Scene::captureImage(ipl::CImage*)' does not match any in
class `
Graphics::Scene'
Scene.h:26: error: candidate is: void
Graphics::Scene::captureImage(ipl::CImage*, Graphics::Scene&)
Scene.cpp: In member function `void
Graphics::Scene::captureImage(ipl::CImage*)
':
Scene.cpp:125: error: no matching function for call to `Graphics::Camera::
captureImage(ipl::CImage*&, Graphics::Scene&)'
Camera.h:21: error: candidates are: void
Graphics::Camera::captureImage(ipl::CImage*, Scene&)
.../../src/ipl98/source/ipl98/cpp/std_image.h: At global scope:
.../../src/ipl98/source/ipl98/cpp/std_image.h:190: warning: inline function `
virtual UINT32 ipl::CStdImage::GetPixelFast(int, int) const' used
but never
defined
make: *** [Scene.lo] Error 1
----

Scene afhænger af Camera og Camera afhænger af Scene, så vi har lidt
cyklisk afhængighed her.

De to klasser er såmænd ikke så store, og deres afhængighed er utrolig
lille, men hvis der er nogen som kan fortælle os hvordan vi får skidtet
til at compile, så ville det være kanon


På forhånd mange tak for hjælpen. Er helt fortabt i denne fejlmeddelelse
og forstår slet ikke hvorfor den kommer.


Med venlig hilsen

Preben Holm

 
 
Arne Vajhøj (23-04-2006)
Kommentar
Fra : Arne Vajhøj


Dato : 23-04-06 15:43

Preben wrote:
> Scene afhænger af Camera og Camera afhænger af Scene, så vi har lidt
> cyklisk afhængighed her.
>
> De to klasser er såmænd ikke så store, og deres afhængighed er utrolig
> lille, men hvis der er nogen som kan fortælle os hvordan vi får skidtet
> til at compile, så ville det være kanon

Noget i stil med:

class B; // <----

class A
{
public:
B* b;
};

class B
{
public:
A* a;
};


bør compile.

Arne

Preben (23-04-2006)
Kommentar
Fra : Preben


Dato : 23-04-06 19:55

> Noget i stil med:
>
> class B; // <----
>
> class A
> {
> public:
> B* b;
> };
>
> class B
> {
> public:
> A* a;
> };

det er afprøvet..

altså for lige at slå fast:

i Scene.h:
------
#include "Camera.h"

class Scene {
private:
Camera _camera;
};
------


i Camera.h
------
class Scene;

class Camera {
private:
Scene _parent;
};
------


Med venlig hilsen
Preben Holm

Bertel Brander (23-04-2006)
Kommentar
Fra : Bertel Brander


Dato : 23-04-06 21:11

Preben wrote:
>
> det er afprøvet..
>
> altså for lige at slå fast:
>
> i Scene.h:
> ------
> #include "Camera.h"
>
> class Scene {
> private:
> Camera _camera;
> };
> ------
>
>
> i Camera.h
> ------
> class Scene;
>
> class Camera {
> private:
> Scene _parent;
> };

Det går ikke, mindst én af dem bliver nødt til
at være en pointer eller reference til den anden.

Jeg kan ikke have en member i min class som også
har mig som member.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Preben (25-04-2006)
Kommentar
Fra : Preben


Dato : 25-04-06 20:13

Bertel Brander wrote:
> Preben wrote:
>
>>
>> det er afprøvet..
>>
>> altså for lige at slå fast:
>>
>> i Scene.h:
>> ------
>> #include "Camera.h"
>>
>> class Scene {
>> private:
>> Camera _camera;
>> };
>> ------
>>
>>
>> i Camera.h
>> ------
>> class Scene;
>>
>> class Camera {
>> private:
>> Scene _parent;
>> };
>
>
> Det går ikke, mindst én af dem bliver nødt til
> at være en pointer eller reference til den anden.
>
> Jeg kan ikke have en member i min class som også
> har mig som member.
>

Nej okay...
Problemet var såmænd at Scene i Camera-klassen såmænd var en pointer,
men i Camera var der ikke nogen "tom" constructor, så derfor kunne der
ikke oprettes en Camera uden en reference til Scene.
Men jeg gætter på at man ikke kan gøre sådan her:


i Scene.h:
------
#include "Camera.h"

class Scene {
private:
Camera _camera(this);
};
------


i Camera.h
------
class Scene;

class Camera {
public:
Camera(Scene *parent) { _parent = parent; }
private:
Scene* _parent;
};


Andre gode ideer (lige nu bruger vi bare to pointere istedet, men okay -
ikke optimalt med alle de sa**** pointere - de er godt nok roden til
meget ondt.


Mvh / Preben Holm

Mogens Hansen (25-04-2006)
Kommentar
Fra : Mogens Hansen


Dato : 25-04-06 21:00


"Preben" <64bitNoNoNoSPAM@mailme.dk> wrote in message
news:444e74a2$0$15794$14726298@news.sunsite.dk...

[8<8<8<]
> Andre gode ideer (lige nu bruger vi bare to pointere istedet, men okay -
> ikke optimalt med alle de sa**** pointere - de er godt nok roden til meget
> ondt.

Prøv at forklare med almindelige ord hvad du prøver at løse med programmet.

Hvorfor mener du pointere er roden til meget ondt ?
Man skal naturligvis forstå både problem domænet og løsnings domænet for at
kunne lave et fungerende program.

Venlig hilsen

Mogens Hansen



Preben (26-04-2006)
Kommentar
Fra : Preben


Dato : 26-04-06 14:41

Hej igen


> Prøv at forklare med almindelige ord hvad du prøver at løse med programmet.

Puha... det bliver en laaaaang historie, og den tror jeg lige jeg undlader.

Men for at holde os til den del af problemet jeg gerne vil løse, så har
en scene et kamera... hvilket er meget naturligt i sin forstand.
Scenen indeholder en robot og nogle andre emner.

Et kamera kan dog ikke eksistere uden at der er en scene som kameraet
kan optage!
Derfor vil det være mest logisk om kamera'et ikke har nogen tom
constructor, men en "Camera(Scene& parent)"

At lave en member variabel _Camera på Scene er jo så ikke muligt, med
mindre der er visse ting i C++, som jeg ikke kender til!


> Hvorfor mener du pointere er roden til meget ondt ?

Jeg haaaader pointere - lige pludselig har man en NULL pointer eller en
pointer som ikke er initialiseret og så "crash" - hvor skete den fejl så!
Jeg har alle dage være java-mand, men har på det seneste skulle bruge
C++ til denne opgave og jeg bryder mig ikke om det.


Hvad er det nu området i constructoren hedder? (HVAD):

constructor(variabel) : HVAD {}

Kunne man oprette en member variabel her, således man blot brugte en
reference istedet? Hvordan?


Med venlig hilsen
Preben Holm

Ove Kjeldgaard (26-04-2006)
Kommentar
Fra : Ove Kjeldgaard


Dato : 26-04-06 17:26

Preben <64bitNoNoNoSPAM@mailme.dk> wrote:

>Men for at holde os til den del af problemet jeg gerne vil løse, så har
>en scene et kamera... hvilket er meget naturligt i sin forstand.
>Scenen indeholder en robot og nogle andre emner.
>
>Et kamera kan dog ikke eksistere uden at der er en scene som kameraet
>kan optage!
>Derfor vil det være mest logisk om kamera'et ikke har nogen tom
>constructor, men en "Camera(Scene& parent)"

Kan du ikke forklare lidt mere ud fra ovenstående - måske falder tiøren når du
prøver at beskrive opgaven på dansk og ikke i C++?


PS.: Jeg kender ikke selv ret meget til OOP i C, skriver dog lidt Delphi så jeg
kender noget til de overordnede tanker osv.

--
Med venlig hilsen, Ove Kjeldgaard, nospam AT privat DOT dk
Natur og Friluftsliv: <http://hiker.dk>

Preben (26-04-2006)
Kommentar
Fra : Preben


Dato : 26-04-06 17:52

>>Men for at holde os til den del af problemet jeg gerne vil løse, så har
>>en scene et kamera... hvilket er meget naturligt i sin forstand.
>>Scenen indeholder en robot og nogle andre emner.
>>
>>Et kamera kan dog ikke eksistere uden at der er en scene som kameraet
>>kan optage!
>>Derfor vil det være mest logisk om kamera'et ikke har nogen tom
>>constructor, men en "Camera(Scene& parent)"
>
>
> Kan du ikke forklare lidt mere ud fra ovenstående - måske falder tiøren når du
> prøver at beskrive opgaven på dansk og ikke i C++?


Jeg tror det er et rent C++ spørgsmål det drejer sig om.

Men for at tage den i "UML" så er der her lidt



----------- ------------
| Scene | 1 har > 1 | Camera |
|---------|-------------------|----------|
| | < optager | |
----------- ------------


Men spørgsmålet er stadig om dette problem kan løses uden brug af
pointere, men muligvis referencer!

I Java ville jeg gøre:


public class Scene {
private Camera camera;

public Scene() {
camera = new Camera(this);
}
}

public class Camera {
private Scene scene;

public Camera(Scene scene) {
this.scene = scene;
}
}



Med venlig hilsen
Preben Holm

Michael Rasmussen (26-04-2006)
Kommentar
Fra : Michael Rasmussen


Dato : 26-04-06 18:16

On Wed, 26 Apr 2006 18:52:28 +0200, Preben wrote:

>
>
> ----------- ------------
> | Scene | 1 har > 1 | Camera |
> |---------|-------------------|----------|
> | | < optager | |
> ----------- ------------
>
>
> Men spørgsmålet er stadig om dette problem kan løses uden brug af
> pointere, men muligvis referencer!
>
Dit problem er, at du løser opgaven ved associering. Hvorfor ikke
benytte arv?
Optagelse
1 --> 1 kamera
1 --> 1 scene

--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917


Preben (26-04-2006)
Kommentar
Fra : Preben


Dato : 26-04-06 18:39

>> ----------- ------------
>> | Scene | 1 har > 1 | Camera |
>> |---------|-------------------|----------|
>> | | < optager | |
>> ----------- ------------
>>
>>
>>Men spørgsmålet er stadig om dette problem kan løses uden brug af
>>pointere, men muligvis referencer!
>>
>
> Dit problem er, at du løser opgaven ved associering. Hvorfor ikke
> benytte arv?
> Optagelse
> 1 --> 1 kamera
> 1 --> 1 scene

Ehh, den forstår jeg ikke lige..
Hvorfor vil du benytte arv? Det kræver jo stadig væk at Kamera optager
scenen som association til netop scenen - ellers kan jeg jo ikke tage et
billede med kamera'et af scenen som netop er noget af formålet her (ups
glemte jeg vist tidligere at fortælle).


Med venlig hilsen
Preben Holm

Mogens Hansen (26-04-2006)
Kommentar
Fra : Mogens Hansen


Dato : 26-04-06 19:32


"Michael Rasmussen" <mir@miras.org> wrote in message
news:pan.2006.04.26.17.16.00.93851@miras.org...

[8<8<8<]
> Dit problem er, at du løser opgaven ved associering. Hvorfor ikke
> benytte arv?

Det er helt rigtigt at løse problemet med associering - der er ingen arv
relation mellem Scene og Camera.
Scene er ikke "en slags" Camera, og Camera er ikke "en slags" Scene.

Venlig hilsen

Mogens Hansen



Mogens Hansen (26-04-2006)
Kommentar
Fra : Mogens Hansen


Dato : 26-04-06 19:36


"Preben" <64bitNoNoNoSPAM@mailme.dk> wrote in message
news:444fa520$0$15792$14726298@news.sunsite.dk...


[8<8<8<]
> Men spørgsmålet er stadig om dette problem kan løses uden brug af
> pointere, men muligvis referencer!

Kardinaliteten af associationen er:
Scene kan har nul eller et Camera.
Camera har eksakt een Scene.

Hvorfor vil du undgå at løse det uden brug af pointere ?
Det er C++ vi snakker om, og det er den umiddelbart naturlige måde at
modellere en 0..1 relation på.
En hård een relation modeleres umiddelbart naturligt med en reference.
Lad koden afspejle det direkte - så er det nemmere for andre C++
programmører der senere skal læse koden at forstå den.

Venlig hilsen

Mogens Hansen



Mogens Hansen (26-04-2006)
Kommentar
Fra : Mogens Hansen


Dato : 26-04-06 19:27


"Preben" <64bitNoNoNoSPAM@mailme.dk> wrote in message
news:444f784f$0$15785$14726298@news.sunsite.dk...

[8<8<8<]
> Et kamera kan dog ikke eksistere uden at der er en scene som kameraet kan
> optage!
> Derfor vil det være mest logisk om kamera'et ikke har nogen tom
> constructor,

Default constructor

> men en "Camera(Scene& parent)"

jeps

#include <cassert>

class camera;

class scene
{
public:
scene();
~scene();

void add_camera(camera& camera_arg);
void remove_camera(camera& camera_arg);

private:
camera* camera_;

private:
// disallow copy construction and assignment
scene& operator=(const scene&);
scene(const scene&);
};

class camera
{
public:
camera(scene& scene_arg);
~camera();

private:
scene& scene_;

private:
camera& operator=(const camera&);
camera(const camera&);
};

scene::scene() :
camera_(0)
{
}

scene:scene()
{
assert(0 == camera_ && "scene must not be destroyed, while a camera is
associated");
}

void scene::add_camera(camera& camera_arg)
{
assert(0 == camera_ && "attempt to add camera, while a camera is
associated");
camera_ = &camera_arg;
}

void scene::remove_camera(camera& camera_arg)
{
assert(camera_ && "attempt to remove camera, while no camera is
associated");
assert(camera_ == &camera_arg && "attempt to remove another camera than
the associated");
camera_ = 0;
}

camera::camera(scene& scene_arg) :
scene_(scene_arg)
{
scene_.add_camera(*this);
}

camera:camera()
{
scene_.remove_camera(*this);
}


int main()
{
scene landscape;
camera nikon(landscape);
}



>
> At lave en member variabel _Camera på Scene er jo så ikke muligt, med
> mindre der er visse ting i C++, som jeg ikke kender til!

Jo - det er for så vidt muligt.
Det er bare ikke hvad du har brug for.

[8<8<8<]
> Hvad er det nu området i constructoren hedder? (HVAD):

Initializer list.


Venlig hilsen

Mogens Hansen



Preben (27-04-2006)
Kommentar
Fra : Preben


Dato : 27-04-06 14:38

>>At lave en member variabel _Camera på Scene er jo så ikke muligt, med
>>mindre der er visse ting i C++, som jeg ikke kender til!
>
>
> Jo - det er for så vidt muligt.
> Det er bare ikke hvad du har brug for.
>
> [8<8<8<]
>
>>Hvad er det nu området i constructoren hedder? (HVAD):
>
>
> Initializer list.
>
>
> Venlig hilsen
>
> Mogens Hansen
>
>

Tak for din forklaring (i både den ene og anden tråd)...
Tror jeg bliver ved dit forslag..

Hvorfor har du "disallow copy construction"?

Mogens Hansen (27-04-2006)
Kommentar
Fra : Mogens Hansen


Dato : 27-04-06 15:53


"Preben" <64bitNoNoNoSPAM@mailme.dk> wrote in message
news:4450c922$0$15784$14726298@news.sunsite.dk...

[8<8<8<]
> Hvorfor har du "disallow copy construction"?

Man kan se på klassernes invarians:
Et "scene" objekt kan være associeret til nul eller eet "camera" objekt.
Et "camera" objekt er altid associeret med netop eet "scene" objekt.
Objekterne ved præcis hvad de er associeret med.

Hvis man lavede en kopi af et "camera" objekt ville der være 2 "camera"
objekter som mente de var associeret med samme "scene" objekt.
Det er en overtrædelse af kardinaliteten (nul eller een), og "scene" ville
ikke længere vide præcis hvad der er associeret.
Tilsvarende hvis man lavede en kopi af et "scene" objekt.

Ved at erklære copy-constructor og assignment operator private opnår man:
* compileren vil ikke selv prøve at generere den, hvis der skulle blive
brug for dem
* ved at erklære dem private, vil compilerens statiske typecheck sikre at
koden ikke oversætter, hvis nogen brugere af klassen kommer til at skrive
kode, som ikke giver mening (f.eks. laver en std::vector<camera>)
* ved at undlade at implermentere dem, vil linker ikke kunne linke
programmet hvis klassens implementering ved kommer til at skrive kode som
ikke giver mening

Venlig hilsen

Mogens Hansen



Niels Dybdahl (28-04-2006)
Kommentar
Fra : Niels Dybdahl


Dato : 28-04-06 10:07

> Jeg haaaader pointere - lige pludselig har man en NULL pointer eller en
> pointer som ikke er initialiseret og så "crash" - hvor skete den fejl så!
> Jeg har alle dage være java-mand, men har på det seneste skulle bruge C++
> til denne opgave og jeg bryder mig ikke om det.
>
>
> Hvad er det nu området i constructoren hedder? (HVAD):
>
> constructor(variabel) : HVAD {}
>
> Kunne man oprette en member variabel her, således man blot brugte en
> reference istedet? Hvordan?

Du kan bruge referencer istedet:

class Scene;

class Camera {
public:
Camera(Scene & parent): _parent(parent) { }
private:
Scene & _parent;
};

Niels Dybdahl



Kent Friis (23-04-2006)
Kommentar
Fra : Kent Friis


Dato : 23-04-06 21:39

Den Sun, 23 Apr 2006 20:54:55 +0200 skrev Preben:
>
> altså for lige at slå fast:
>
> i Scene.h:
> ------
> #include "Camera.h"
>
> class Scene {
> private:
> Camera _camera;
> };
> ------
>
>
> i Camera.h
> ------
> class Scene;
>
> class Camera {
> private:
> Scene _parent;
> };
> ------

Altså en Scene, der indeholder en Camera, som indeholder en Scene,
der indeholder en Camera, som indeholder en Scene, der indeholder
en Camera...

Prøv lige at overveje hvor meget RAM det kræver at oprette den
class... Og hvor lang tid constructor'ne vil tage om at køre,
for ikke at nævne antallet af niveau'er på stack'en for at
kalde constructor'ne.

Mvh
Kent
--
Hard work may pay off in the long run, but laziness pays off right now.

Arne Vajhøj (23-04-2006)
Kommentar
Fra : Arne Vajhøj


Dato : 23-04-06 21:47

Preben wrote:
> altså for lige at slå fast:
>
> i Scene.h:
> ------
> #include "Camera.h"
>
> class Scene {
> private:
> Camera _camera;
> };
> ------
>
>
> i Camera.h
> ------
> class Scene;
>
> class Camera {
> private:
> Scene _parent;
> };
> ------

Som Bertel og Kent allerede har forklaret så er det ikke
en C++ fejl.

Ovenstående giver ikke nogen mening logisk.

Du kan ikke både have at en Scene indeholder et Camera
og at et Camera indeholder en Scene.

En løsning var at bruge pointer.

Iøvrigt er det min erfaring at i 98% af tilfældene
bør en user klasse inden i en user klasse laves som
en pointer og ikke som indeholdt.

Arne

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste