/ 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
Kludder i include
Fra : Lisbet Kaas Petersen


Dato : 01-05-01 18:01

Jeg kan ikke få include til at fungere rigtigt i nedstående filer. Der
kommer fejl med, at nogle variabler allerede findes i andre objekter, når de
skal linkes sammen.
Jeg har rodet med problemet i flere timer nu, og er ved at være desperat.
Jeg får enten fejl om at der er ukendte variabler, eller også støder jeg ind
i først nævnte problem, hvis jeg laver de includes, der skal til for at
funktionerne kan se de variabler, der skal til.

Jeg modtager med glæde ændringsforslag til nedstående source-kode:

test.hpp:

#ifndef test_hpp
#define test_hpp

//#include "dummy.hpp"
#include "DataProcessing.hpp"

char mailAdress[64];
double dataInterval;
int mailInterval;
float maxData =(float) 5.9;
float dataValue;
long Date;
bool status;

void main();
float getAD();
void sendMail();
void testInit();
void testToFil();



#endif

DataProcessing.hpp:

#ifndef DataProcessing_hpp
#define DataProcessing_hpp

#include <iostream.h>
#include <time.h>
#include <string.h>
#include <math.h>
#include <fstream.h>
//#include "dummy.hpp"
//#include "test.hpp"

class DataUnit
{
public:
DataUnit();
void getData(); //henter data fra AD og gemmer dem i data
void initMail(); //Nulstiller mailNoInSerie

private:
void getTime(); //henter tid i sekunder siden 1970
void prepareStringToFile(); //formaterer datoen
void storeData (); //Gemmer tid og data i fil
void checkData(); // Sætter status, dataHysterese, mailNoInSerie og
sendEmail

long timeForLastMail;
int mailNoInSerie;
bool dataHysterese;
char dataToFile[23];
float lastData;

};

#endif

test.cpp:

//#include "DataProcessing.hpp"
//#include "dummy.hpp"
#include "test.hpp"
//#include "vars.hpp"



void main(){
DataUnit test;
test.getData();
testInit();
testToFil();

}

float getAD(){
float dummy= (float) 9.9;
return dummy;
}

void sendMail()
{
}

void testInit()
{
ofstream testOut("test.txt", ios::app);


testOut << "Tid Status " << endl;

}

void testToFil()
{
ofstream testOut("test.txt", ios::app);

testOut << dataValue << " " << status << endl;
}

DataProcessing.cpp:

#include "DataProcessing.hpp"
//#include "dummy.hpp"
//#include "vars.hpp"
//#include "test.hpp"


DataUnit::DataUnit(){
mailNoInSerie = 0;
dataValue = 0;
dataHysterese = false;

}

void DataUnit::getData(){
lastData = dataValue;
dataValue = getAD();
getTime();
}

void DataUnit::initMail()
{
mailNoInSerie = 0;
dataValue = 0;
dataHysterese = false;
}

void DataUnit::getTime(){
time( &Date );
prepareStringToFile();
}

void DataUnit::prepareStringToFile(){
//TT:MM:SS DD/MM-ÅÅÅÅ : xx.x v
char *tempTime1={0};
char *tempTime2={0};

tempTime1 = ctime(&Date); //XXX MMM DD HH:MM:SS YYYY
tempTime2 = _strtime(tempTime1);

for (int i = 0; i < 8; i++) //Brug stringcopy i stedet
dataToFile[i] = tempTime2[i];

tempTime2= _strdate(tempTime1);

dataToFile[i] = ' ';
i++;

for (i; i < 14; i++) //Brug stringcat i stedet
dataToFile[i] = tempTime2[i-9];

dataToFile[i] = '-';
i++;
dataToFile[i] = '2';
i++;
dataToFile[i] = '0';
i++;

for (i; i < 19; i++)
dataToFile[i] = tempTime2[i - 11];

dataToFile[i]= ' ';
i++;
dataToFile[i]= ':';
i++;
dataToFile[i]= ' ';

i++;
dataToFile[i]='\0';

storeData();

}

void DataUnit::storeData(){

ofstream dataOut("adlog.txt", ios::app);

ostream &operator<<(ostream &out, const DataUnit &dataToFile);


dataOut << dataToFile << dataValue <<endl;


checkData();
}

void DataUnit::checkData(){

if (dataValue > maxData)
status = false;
else
status = true;

if (((!dataHysterese && (dataValue == (maxData - 0.1)) && (lastData >=
maxData)) ||
(dataHysterese && ((dataValue == lastData) && (dataValue ==
(float)(maxData -0.1))))) ||
((!dataHysterese && (dataValue == maxData) && (lastData >= maxData)) ||
(dataHysterese && ((dataValue == lastData) && (dataValue == maxData)))))
dataHysterese = true;
else
dataHysterese = false;

if (((!status || dataHysterese) && (mailNoInSerie == 0)) ||
((!status || dataHysterese) && (mailInterval > ((Date - timeForLastMail) /
60)) &&
(mailNoInSerie < 10)))
{
sendMail();
mailNoInSerie +=1;
timeForLastMail = Date;


}

}

--
Bye
ICQ 113181477



 
 
Lisbet Kaas Petersen (01-05-2001)
Kommentar
Fra : Lisbet Kaas Petersen


Dato : 01-05-01 21:11

Hej

Jeg har nu forsøgt at rette fejlen fra tidligere mail ved at dele løsningen
op i flere filer, men det hjalp ikke meget.

Nedenfor er compiler-fejlene og source-koden.

Jeg er stadig desperat. Når jeg har fået løst det aktuelle problem, mangler
jeg stadig at tilføje en del kode, der skal være klar til toradag morgen.

Compilerfejl (fra MS Visual C++ 6.0):

Deleting intermediate files and output files for project 'DataProcessing -
Win32 Debug'.
--------------------Configuration: DataProcessing - Win32
Debug--------------------
Compiling...
DataProcessing.cpp
test.cpp
dummy.cpp
dummy2.cpp
Linking...
test.obj : error LNK2005: "float maxData" (?maxData@@3MA) already defined
in DataProcessing.obj
test.obj : error LNK2005: "bool status" (?status@@3_NA) already defined in
DataProcessing.obj
test.obj : error LNK2005: "char * mailAdress" (?mailAdress@@3PADA) already
defined in DataProcessing.obj
test.obj : error LNK2005: "long Date" (?Date@@3JA) already defined in
DataProcessing.obj
test.obj : error LNK2005: "double dataInterval" (?dataInterval@@3NA)
already defined in DataProcessing.obj
test.obj : error LNK2005: "int mailInterval" (?mailInterval@@3HA) already
defined in DataProcessing.obj
test.obj : error LNK2005: "float dataValue" (?dataValue@@3MA) already
defined in DataProcessing.obj
dummy2.obj : error LNK2005: "float maxData" (?maxData@@3MA) already defined
in DataProcessing.obj
dummy2.obj : error LNK2005: "bool status" (?status@@3_NA) already defined
in DataProcessing.obj
dummy2.obj : error LNK2005: "char * mailAdress" (?mailAdress@@3PADA)
already defined in DataProcessing.obj
dummy2.obj : error LNK2005: "long Date" (?Date@@3JA) already defined in
DataProcessing.obj
dummy2.obj : error LNK2005: "double dataInterval" (?dataInterval@@3NA)
already defined in DataProcessing.obj
dummy2.obj : error LNK2005: "int mailInterval" (?mailInterval@@3HA) already
defined in DataProcessing.obj
dummy2.obj : error LNK2005: "float dataValue" (?dataValue@@3MA) already
defined in DataProcessing.obj
Debug/DataProcessing.exe : fatal error LNK1169: one or more multiply defined
symbols found
Error executing link.exe.

DataProcessing.exe - 15 error(s), 0 warning(s)


DataProcessing.hpp:

#ifndef DataProcessing_hpp
#define DataProcessing_hpp

#include <iostream.h>
#include <time.h>
#include <string.h>
#include <math.h>
#include <fstream.h>
#include "dummy.hpp"
//#include "test.hpp"
#include "vars.hpp"

class DataUnit
{
public:
DataUnit();
void getData(); //henter data fra AD og gemmer dem i data
void initMail(); //Nulstiller mailNoInSerie

private:
void getTime(); //henter tid i sekunder siden 1970
void prepareStringToFile(); //formaterer datoen
void storeData (); //Gemmer tid og data i fil
void checkData(); // Sætter status, dataHysterese, mailNoInSerie og
sendEmail

long timeForLastMail;
int mailNoInSerie;
bool dataHysterese;
char dataToFile[23];
float lastData;

};

#endif

test.hpp:

#ifndef test_hpp
#define test_hpp

#include "dummy2.h"
//#include "DataProcessing.hpp"

void main();



#endif

dummy.hpp:

#ifndef dummy_hpp
#define dummy_hpp

//#include "DataProcessing.hpp"
//#include "test.hpp"

float getAD();
void sendMail();


#endif

dummy2.h:

#ifndef dummy2_h
#define dummy2_h

#include <iostream.h>
#include <string.h>
#include <fstream.h>

//#include "vars.hpp"
#include "DataProcessing.hpp"

void testInit();
void testToFil();


#endif

test.cpp:

//#include "DataProcessing.hpp"
//#include "dummy.hpp"
#include "test.hpp"
//#include "vars.hpp"

void main(){
DataUnit test;
test.getData();
testInit();
testToFil();

}

DataProcessing.cpp:

#include "DataProcessing.hpp"
//#include "dummy.hpp"
//#include "vars.hpp"
//#include "test.hpp"


DataUnit::DataUnit(){
mailNoInSerie = 0;
dataValue = 0;
dataHysterese = false;

}

void DataUnit::getData(){
lastData = dataValue;
dataValue = getAD();
getTime();
}

void DataUnit::initMail()
{
mailNoInSerie = 0;
dataValue = 0;
dataHysterese = false;
}

void DataUnit::getTime(){
time( &Date );
prepareStringToFile();
}

void DataUnit::prepareStringToFile(){
//TT:MM:SS DD/MM-ÅÅÅÅ : xx.x v
char *tempTime1={0};
char *tempTime2={0};

tempTime1 = ctime(&Date); //XXX MMM DD HH:MM:SS YYYY
tempTime2 = _strtime(tempTime1);

for (int i = 0; i < 8; i++) //Brug stringcopy i stedet
dataToFile[i] = tempTime2[i];

tempTime2= _strdate(tempTime1);

dataToFile[i] = ' ';
i++;

for (i; i < 14; i++) //Brug stringcat i stedet
dataToFile[i] = tempTime2[i-9];

dataToFile[i] = '-';
i++;
dataToFile[i] = '2';
i++;
dataToFile[i] = '0';
i++;

for (i; i < 19; i++)
dataToFile[i] = tempTime2[i - 11];

dataToFile[i]= ' ';
i++;
dataToFile[i]= ':';
i++;
dataToFile[i]= ' ';

i++;
dataToFile[i]='\0';

storeData();

}

void DataUnit::storeData(){

ofstream dataOut("adlog.txt", ios::app);

ostream &operator<<(ostream &out, const DataUnit &dataToFile);


dataOut << dataToFile << dataValue <<endl;


checkData();
}

void DataUnit::checkData(){

if (dataValue > maxData)
status = false;
else
status = true;

if (((!dataHysterese && (dataValue == (maxData - 0.1)) && (lastData >=
maxData)) ||
(dataHysterese && ((dataValue == lastData) && (dataValue ==
(float)(maxData -0.1))))) ||
((!dataHysterese && (dataValue == maxData) && (lastData >= maxData)) ||
(dataHysterese && ((dataValue == lastData) && (dataValue == maxData)))))
dataHysterese = true;
else
dataHysterese = false;

if (((!status || dataHysterese) && (mailNoInSerie == 0)) ||
((!status || dataHysterese) && (mailInterval > ((Date - timeForLastMail) /
60)) &&
(mailNoInSerie < 10)))
{
sendMail();
mailNoInSerie +=1;
timeForLastMail = Date;


}

}

dummy.cpp:

//#include "Dataprocessing.hpp"

#include "dummy.hpp"

#include <iostream.h>
#include <string.h>
#include <fstream.h>

float getAD(){
float dummy= (float) 9.9;
return dummy;
}

void sendMail()
{
}

dummy2.cpp:

#include "dummy2.h"
//#include "vars.hpp"

void testInit()
{
ofstream testOut("test.txt", ios::app);


testOut << "Tid Status " << endl;

}

void testToFil()
{
ofstream testOut("test.txt", ios::app);

testOut << dataValue << " " << status << endl;
}



Henrik (01-05-2001)
Kommentar
Fra : Henrik


Dato : 01-05-01 22:39

Du har følgende i test.hpp :
//...
char mailAdress[64];
double dataInterval;
int mailInterval;
float maxData =(float) 5.9;
float dataValue;
long Date;
bool status;
//...

Den fil inkludere du så i flere forskellige .cpp filer. Hver af disse
bliver kompileret og resulterer i en .obj fil med definition af
symbolerne.

lav ovenstående blok fra test.hpp om til
//...
extern char mailAdress[64];
extern double dataInterval;
extern int mailInterval;
extern float maxData =(float) 5.9;
extern float dataValue;
extern long Date;
extern bool status;
//...

og flyt den oprindelige blok til en .cpp fil - f.eks. test.cpp, på den
måde bliver dine symboler defineret netop en gang - og linkeren bliver
glad.

m.v.h.

Henrik Sloth

In article <9cn508$p1j$1@sunsite.dk>, you say...
> Hej
>
> Jeg har nu forsøgt at rette fejlen fra tidligere mail ved at dele løsningen
> op i flere filer, men det hjalp ikke meget.
>
> Nedenfor er compiler-fejlene og source-koden.
>
> Jeg er stadig desperat. Når jeg har fået løst det aktuelle problem, mangler
> jeg stadig at tilføje en del kode, der skal være klar til toradag morgen.
>
> Compilerfejl (fra MS Visual C++ 6.0):

snip - kedelig fejl klippet ud - snap

Richard Flamsholt (01-05-2001)
Kommentar
Fra : Richard Flamsholt


Dato : 01-05-01 23:32

"Lisbet Kaas Petersen" <lisbet.kaas@mail.tele.dk> skrev:
>Jeg kan ikke få include til at fungere rigtigt i nedstående filer. Der
>kommer fejl med, at nogle variabler allerede findes i andre objekter, når de
>skal linkes sammen.

Regel #1 for et sådant indlæg: Inkludér den faktiske fejlbesked. Jeg så
først (straks) hvad der var galt da jeg læste dit andet indlæg hvor der
var fejlmeldingerne med.

Uden at have afprøvet det er jeg sikker på, at problemet er brugen af
variabel-definitioner i header-filer, i stedet for deklarationer:

>test.hpp:
>char mailAdress[64];
[etc]

Header-filer bør kun deklarere ting, ikke definere dem. At deklarere X
fortæller compileren, hvad X er. At definere X er at bede compileren om
direkte at oprette en X-ting her og nu. I praksis skriver man således:

extern char mailAddress[64]; /* deklaration */
char mailAddress[64]; /* definition */

Du må hjertens gerne fortælle utallige gange hvad X er (deklaration).
Men du kan kun have én ting i hele dit program ved navn X (definition).

Dit problem er sikkert, at du definerer mailAddress osv i test.hpp og
inkluderer den header-fil i flere C-filer. Dermed vil de compilerede
objekt-filer jo hver indeholde en variabel ved navn mailAddress. Når alt
til slut skal klistres sammen af linkeren har vi balladen, for der er
pludselig mere end én variabel, der hedder mailAddress. Det må man ikke.

Løsningen er kun at deklarere mailAddress (osv) i test.hpp. Altså at
skrive

extern char mailAddress[64];

i stedet for. Dermed fortæller du alle, der inkluderer test.hpp, hvad
mailAddress er for en størrelse og det er alt, hvad de har brug for at
vide. Selve definitionen, altså den egentlige variabel, putter du så i
en passende C-fil. Det kunne fx være test.cpp. (Rådet gælder naturligvis
for alle dine header-filer.)

Dermed ved alle dele af dit program vide hvad mailAddress er, men der
vil kun optræde én egentlig variabel med det navn. Og det er løsningen.

--
Richard Flamsholt
richard@flamsholt.dk - www.richard.flamsholt.dk

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

Månedens bedste
Årets bedste
Sidste års bedste