Kedves Fórumozók!
Egy példaprogramot kellene irnom c++ban, de sajnos nem tudom mi lehet, a gond és miért nem fordul le és hogy hogyan tudnám megjavitani. A lényeg az lenne, hogy warning nélkül forduljon -Wall-al, és még működjön is. Ez amúgy egy ilyen kis DFA természetes szám felismerő példaprogram lenne.
Ezt a hibaüzenetet kapom:
janos@janos_mobil:~/Desktop/botondos/01$ make
gcc -c exception.cpp -Wall -O2 -o exception.o
gcc -c dfa.cpp -Wall -O2 -o dfa.o
In file included from dfa.cpp:2:
dfa.hpp:15: error: parse error before `&' token
dfa.hpp:17: error: parse error before `&' token
dfa.hpp:32: error: parse error before `&' token
dfa.cpp:48: error: prototype for `bool basicDFA::checkIfAccepted(const
std::string&) const' does not match any in class `basicDFA'
dfa.hpp:17: error: candidate is: bool basicDFA::checkIfAccepted(...) const
dfa.cpp:85: error: prototype for `bool cardinalNumbersDFA::acceptedByDFA(const
std::string&) const' does not match any in class `cardinalNumbersDFA'
dfa.hpp:32: error: candidate is: virtual bool
cardinalNumbersDFA::acceptedByDFA(...) const
make: *** [dfa] Error 1
janos@janos_mobil:~/Desktop/botondos/01$
A fájlok pedig innen elérhetők/letölthetők: http://chaosrider.uw.hu/stuff/janos_01.tgz
Ha valaki tudna valami jó ötlete, annak nagyon tudnék örülni.
Üdv:
János
Illetve a fájlokat berakom ide is, tehát:
dfa.cpp:
#include
#include "dfa.hpp"
#include "exception.hpp"
basicDFA::basicDFA() {
numberOfStates = 0;
initialState = 0;
finalStates = 0;
transitionMap = 0;
}
basicDFA::~basicDFA() {
cout << "Called!" << endl;
if (finalStates != 0) delete finalStates;
if ((transitionMap != 0) && (numberOfStates != 0)) {
for (int i=0;i
delete transitionMap[i];
}
delete transitionMap;
}
}
void basicDFA::initializeTransitionMap() {
if ((transitionMap != 0) || (numberOfStates == 0)) return;
transitionMap = new int*[numberOfStates];
if (transitionMap == 0) throw new outOfMemoryException();
for (int i=0;i
transitionMap[i] = new int[CHARSET_SIZE];
if (transitionMap[i] == 0) throw new outOfMemoryException();
memset(transitionMap[i], -1, CHARSET_SIZE);
}
}
void basicDFA::initializeFinalStates() {
if ((finalStates != 0) || (numberOfStates == 0)) return;
finalStates = new int[numberOfStates];
if (finalStates == 0) throw new outOfMemoryException();
memset(transitionMap, false, numberOfStates);
}
bool basicDFA::checkIfAccepted(const string & input) const {
int currentState = initialState;
if (currentState >= numberOfStates) throw invalidInitialStateException();
if ((numberOfStates == 0) || (initialState == 0) || (finalStates == 0) || (transitionMap == 0)) return false;
size_t inputLength = input.length();
for (size_t i=0;i
currentState = transitionMap[currentState][ (unsigned) input[i]];
if (currentState == -1) throw uninitializedTransitionException();
if ((currentState < 0) || (currentState >= numberOfStates)) throw invalidTransitionException();
}
if (finalStates[currentState] == true) return true;
else return false;
}
/*-------------------- Cardinal Numbers --------------------*/
cardinalNumbersDFA::cardinalNumbersDFA() {
numberOfStates = 3;
initialState = 0;
initializeFinalStates();
finalStates[1] = true;
initializeTransitionMap();
for (unsigned i=0;i
for (unsigned i=0;i<9;i++) transitionMap[0][(unsigned) ('1'+i)] = 1;
for (unsigned i=0;i
for (unsigned i=0;i<10;i++) transitionMap[1][(unsigned) ('0'+i)] = 1;
for (unsigned i=0;i
}
cardinalNumbersDFA::~cardinalNumbersDFA() {
//basicDFA::~basicDFA();
}
bool cardinalNumbersDFA::acceptedByDFA(const string &input) const {
return basicDFA::checkIfAccepted(input);
}
//-------------------------------------------------------------------------
dfa.hpp:
#ifndef __DFA_HPP__
#define __DFA_HPP__
#include
using namespace std;
const unsigned int CHARSET_SIZE = 256; //Let's assume ANSI
class basicDFA {
public:
basicDFA();
virtual ~basicDFA();
virtual bool acceptedByDFA(const string &) const = 0;
protected:
bool checkIfAccepted(const string &) const;
void initializeTransitionMap();
void initializeFinalStates();
int numberOfStates;
int initialState;
int *finalStates;
int **transitionMap;
};
class cardinalNumbersDFA: public basicDFA {
public:
cardinalNumbersDFA();
~cardinalNumbersDFA();
bool acceptedByDFA(const string &) const;
};
#endif //__DFA_HPP__
//-------------------------------------------------------------------------
exception.cpp:
#include "exception.hpp"
basicException::basicException() {
}
basicException::~basicException() {
}
void basicException::printMessage() const {
cerr << msg;
}
outOfMemoryException::outOfMemoryException() : basicException::basicException() {
msg = "\nOut of memory...\nThe program will now terminate...\n";
}
outOfMemoryException::~outOfMemoryException() {
}
void outOfMemoryException::dumpInfo() const {
basicException::printMessage();
}
invalidInitialStateException::invalidInitialStateException() : basicException::basicException() {
msg = "\nInvalid initial state...\nThe program will now terminate...\n";
}
invalidInitialStateException::~invalidInitialStateException() {
}
void invalidInitialStateException::dumpInfo() const {
basicException::printMessage();
}
uninitializedTransitionException::uninitializedTransitionException() : basicException::basicException() {
msg = "\nAn uninitialized transition was encountered...\nThe program will now terminate...\n";
}
uninitializedTransitionException::~uninitializedTransitionException() {
}
void uninitializedTransitionException::dumpInfo() const {
basicException::printMessage();
}
invalidTransitionException::invalidTransitionException() : basicException::basicException() {
msg = "\nAn invalid transition was encountered...\nThe program will now terminate...\n";
}
invalidTransitionException::~invalidTransitionException() {
}
void invalidTransitionException::dumpInfo() const {
basicException::printMessage();
}
//-------------------------------------------------------------------------
exception.hpp:
#ifndef __EXCEPTION_HPP__
#define __EXCEPTION_HPP__
#include
#include
using namespace std;
class basicException {
public:
basicException();
virtual ~basicException();
virtual void dumpInfo() const = 0;
protected:
void printMessage() const;
string msg;
};
class outOfMemoryException: public basicException {
public:
outOfMemoryException();
~outOfMemoryException();
void dumpInfo() const;
};
class invalidInitialStateException: public basicException {
public:
invalidInitialStateException();
~invalidInitialStateException();
void dumpInfo() const;
};
class uninitializedTransitionException: public basicException {
public:
uninitializedTransitionException();
~uninitializedTransitionException();
void dumpInfo() const;
};
class invalidTransitionException: public basicException {
public:
invalidTransitionException();
~invalidTransitionException();
void dumpInfo() const;
};
#endif //__EXCEPTION_HPP__
//-------------------------------------------------------------------------
main.cpp:
#include
#include
#include "dfa.hpp"
#include "exception.hpp"
using namespace std;
int main() {
cout << "Hello World!" << endl;
try {
basicDFA *a = new cardinalNumbersDFA();
if ( a->acceptedByDFA("1234567890") == true) cout << "OK." << endl;
else cout << "Failed!" << endl;
}
catch (basicException *e) {
e->dumpInfo();
delete e;
return -1;
}
return 0;
}
//-------------------------------------------------------------------------
Makefile:
# Copyright (c) János Szigetvári, 2006.
# 2006-07-08
#
# OPTIONS
CC = gcc
WARNINGS = -Wall
OPTIMIZATION = -O2
OUTFILESPEC = -o
COMPILEONLY = -c
LINKONY =
REMOVE = rm -f
# COMMANDS
binary: main
$(CC) $(LINKONLY) main.o dfa.o exception.o $(WARNINGS) $(OPTIMIZATION) $(OUTFILESPEC) botondos01.bin
$(REMOVE) *.o
main: dfa exception
$(CC) $(COMPILEONLY) main.cpp $(WARNINGS) $(OPTIMIZATION) $(OUTFILESPEC) main.o
dfa: dfa.hpp exception
$(CC) $(COMPILEONLY) dfa.cpp $(WARNINGS) $(OPTIMIZATION) $(OUTFILESPEC) dfa.o
exception: exception.hpp
$(CC) $(COMPILEONLY) exception.cpp $(WARNINGS) $(OPTIMIZATION) $(OUTFILESPEC) exception.o
clean:
$(REMOVE) *.o
- 1907 megtekintés
Hozzászólások
include string.h helyett csak sima string kell.
Ezenkívül még van benne egypár hiba, pl a new [] párja a delete[] nem a delete.
- A hozzászóláshoz be kell jelentkezni
Igen, és még a Makefile-ben a gcc helyett a g++.
- A hozzászóláshoz be kell jelentkezni
Tiéd a megoldás: g++szal lefordul hiba nélkül!
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
- A hozzászóláshoz be kell jelentkezni
Az string az jogos, de a delete [] csak akkor kell (én legalábis ezt olvastam), ha objektumokból álló dinamikus tömböt szabaditunk fel, mert ez az összes tömbelem destruktorát meghivja, de itt az int esetén nem kell szerintem. Minden esetre köszi.
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
- A hozzászóláshoz be kell jelentkezni
Rosszul tudod. A new párja a delete , és new[] párja a delete[]. Pont. Lehet hogy bizonyos esetekben működni fog felcserélve is, de tudok mutatni olyan esetet amikor nem.
- A hozzászóláshoz be kell jelentkezni
Hmmm. Számomra ez a mérvadó, innen tanultam:
http://www.icce.rug.nl/documents/cplusplus/cplusplus07.html#l113
Persze hogy van olyan eset amikor nem működik, de egyszerű tipusokból álló dinamikus tömbök esetén felesleges a delete []. Na mindegy ezen nem veszünk össze.
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
- A hozzászóláshoz be kell jelentkezni
Számomra meg Bjarne Strousrup: The C++ Programming Language a mérvadó.
Amit belinkeltél ott meg ott a konklúzió: "The rule of thumb is: if new[] was used, also use delete[]."
- A hozzászóláshoz be kell jelentkezni
Jó, rendben, igazad van, valóban ott az ökölszabály.
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
- A hozzászóláshoz be kell jelentkezni
Igazad van a delete[] valóban ekkor kell, de a new[] párja akkor is a delete[]. Illik együtt használni.
- A hozzászóláshoz be kell jelentkezni
A dfa.cpp 45.sorában a memset(transitionMap,...) nem jó, valószínűleg memset(finalStates,...)-t akartál írni.
- A hozzászóláshoz be kell jelentkezni
Teljesen jogos. Köszi.
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
- A hozzászóláshoz be kell jelentkezni
Még egy kérdés:
Azt hogyan oldjam meg, hogy ha a basicDFA osztálynak van egy virtuális destruktora, akkor az meg is hivódjon egy leörökölt osztály destruktorából? Mert ezt nem fogadja el a g++:
cardinalNumbersDFA::~cardinalNumbersDFA() {
basicDFA::~basicDFA();
}
Ha pedig kihagyom ezt, akkor nem fut le a virtuális destruktor, nem jelenik meg a "Called!" a kimenetben, pedig a virtuális destruktorban benne van:
basicDFA::~basicDFA() {
cout << "Called!" << endl;
if (finalStates != 0) delete finalStates;
if ((transitionMap != 0) && (numberOfStates != 0)) {
for (int i=0;i
delete transitionMap[i];
}
delete transitionMap;
}
}
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
- A hozzászóláshoz be kell jelentkezni
Destruktort nem szoktunk közvetlenül meghínvi, hacsak nem vagy tényleg a topon a nyelv ismeretében, és akkor is gondold át ötször, hogy mit csinálsz.
Egyébként nem értem mi a probléma, ha berakod a main.cpp-be a "delete a"-t, akkor szépen kiírja hogy called.
- A hozzászóláshoz be kell jelentkezni
Khm, khm. A delete valóban kimaradt. De akkor is elvileg engednie kellene, hogy meghivjam igy explicite, és nem ilyet kellene mondania, hogy:
dfa.cpp: In destructor `virtual cardinalNumbersDFA::~cardinalNumbersDFA()':
dfa.cpp:82: error: 'class basicDFA' has no member named '`type_decl' not
dfa.cpp:82: sorry, unimplemented: supported by dump_expr
dfa.cpp:82: sorry, unimplemented: ~'
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
- A hozzászóláshoz be kell jelentkezni
Mert amivel próbálkozol, az azt eredményezné hogy a destruktor kétszer hívódik meg, ami biztosan bukta.
- A hozzászóláshoz be kell jelentkezni
Szóval ezt mondja ez a hibaüzenet? Mert én ezt nem tudtam kibigozni belőle.
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
- A hozzászóláshoz be kell jelentkezni
Kedves Fórumozók!
Most az STL-lel gyűlt meg a bajom. A template illesztésnél van valami gubanc, de nem tudom, hogy hogyan oldjam meg. Tudna valaki segiteni?
a hibaüzeletek:
janos@janos_mobil:~/Desktop/botondos/02$ make
g++ -c exception.cpp -Wall -O2 -o exception.o
g++ -c dfa.cpp -Wall -O2 -o dfa.o
In file included from dfa.cpp:2:
dfa.hpp:69: warning: `std::list >::iterator' is
implicitly a typename
dfa.hpp:69: warning: implicit typename is deprecated, please see the
documentation for details
dfa.cpp:67: warning: `std::list >::iterator' is
implicitly a typename
dfa.cpp:67: warning: implicit typename is deprecated, please see the
documentation for details
dfa.cpp: In function `typename std::list
>::iterator listFind(const std::list >&, type&)
':
dfa.cpp:68: warning: `std::list >::iterator' is
implicitly a typename
dfa.cpp:68: warning: implicit typename is deprecated, please see the
documentation for details
dfa.cpp: In function `typename std::list
>::iterator listFind(const std::list >&, type&)
[with type = transition]':
dfa.cpp:86: instantiated from here
dfa.cpp:68: error: conversion from `std::_List_iterator
transition&, const transition*>' to non-scalar type `
std::_List_iterator
' requested
dfa.cpp:86: instantiated from here
dfa.cpp:71: error: conversion from `std::_List_iterator
transition&, const transition*>' to non-scalar type `const
std::_List_iterator
' requested
make: *** [dfa] Error 1
janos@janos_mobil:~/Desktop/botondos/02$
A fájlok pedig:
//dfa.hpp:
#ifndef __DFA_HPP__
#define __DFA_HPP__
#include
#include
#include
using namespace std;
const unsigned int CHARSET_SIZE = 256; //Let's assume ANSI
const unsigned ID_CARDINAL_NUMBERS = 0x01;
struct inConditions {
public:
inConditions(unsigned, char );
~inConditions() {};
bool operator==(const inConditions &) const;
unsigned currentState;
char nextChar;
};
struct outState {
public:
outState(unsigned);
~outState() {};
unsigned nextState;
};
class transition {
public:
transition();
transition(unsigned, char, unsigned);
transition(const transition &);
~transition() {};
inline const transition & operator=(const transition &);
inline bool operator==(const transition &) const;
inline void setCurrentState(const unsigned);
inline void setNextChar(const char);
inline unsigned getNextState() const;
private:
inConditions in;
outState out;
};
class basicDFA {
public:
basicDFA();
virtual ~basicDFA();
virtual bool acceptedByDFA(const string &) const = 0;
protected:
bool checkIfAccepted(const string &) const;
unsigned numberOfStates;
unsigned initialState;
vector finalStates;
list
transitions;
//static const unsigned dfaId; //This can't be done, because then all dfas would have the same ids.
//So this has to be defined for each derived class.
};
template
const list::iterator listFind(const list &, type &);
class cardinalNumbersDFA: public basicDFA {
public:
cardinalNumbersDFA();
~cardinalNumbersDFA() {};
bool acceptedByDFA(const string &) const;
inline unsigned getId() const;
private:
static const unsigned dfaId;
};
const unsigned cardinalNumbersDFA::dfaId = ID_CARDINAL_NUMBERS;
#endif //__DFA_HPP__
//-------------------------------------------------------------------------------
//dfa.cpp:
#include
#include "dfa.hpp"
#include "exception.hpp"
/*-------------------- Transition --------------------*/
inConditions::inConditions(unsigned ins, char inc) :
currentState(ins), nextChar(inc) {
}
bool inConditions::operator==(const inConditions &rhs) const {
if ((currentState == rhs.currentState) && (nextChar == rhs.nextChar)) return true;
else return false;
}
outState::outState(unsigned outs) :
nextState(outs) {
}
transition::transition() :
in(0, '\0'), out(0) {
}
transition::transition(unsigned ins, char inc, unsigned outs) :
in(ins, inc), out(outs) {
}
bool transition::operator==(const transition &rhs) const {
return (in == rhs.in);
}
void transition::setCurrentState(const unsigned input) {
in.currentState = input;
}
void transition::setNextChar(const char input) {
in.nextChar = input;
}
unsigned transition::getNextState() const {
return out.nextState;
}
transition::transition(const transition &input) :
in(input.in.currentState, input.in.nextChar), out(input.out.nextState) {
}
const transition & transition::operator=(const transition &rhs) {
in.currentState = rhs.in.currentState;
in.nextChar = rhs.in.nextChar;
out.nextState = rhs.out.nextState;
return *this;
}
/*-------------------- Basic DFA --------------------*/
basicDFA::basicDFA() : numberOfStates(0), initialState(0), finalStates(0), transitions(0) {
}
basicDFA::~basicDFA() {
finalStates.clear();
transitions.clear();
}
template
const list::iterator listFind(const list & haystack, type & needle) {
for (list::iterator i=haystack.begin();i!=haystack.end();i++) {
if (*i == needle) return i;
}
return haystack.end();
}
bool basicDFA::checkIfAccepted(const string & input) const {
unsigned currentState = initialState;
cout << "Starting form state " << currentState << "." << endl;
if (currentState >= numberOfStates) throw new invalidInitialStateException();
if ((numberOfStates == 0) || (finalStates.empty() == true) || (transitions.empty() == true)) return false;
size_t inputLength = input.length();
transition tmp;
list
::iterator found;
for (size_t i=0;i
cout << "Going form state " << currentState;
tmp.setCurrentState(currentState);
tmp.setNextChar(input[i]);
if ((found = listFind(transitions, tmp)) == transitions.end()) throw new invalidCharacterInParsedTextException();
currentState = found->getNextState();
cout << " to state " << currentState << " while reading \"" << input[i] << "\"." << endl;
if ((currentState < 0) || (currentState >= numberOfStates)) throw new invalidTransitionException();
}
cout << "Done." << endl;
if (finalStates[currentState] == true) return true;
else return false;
}
/*-------------------- Cardinal Numbers --------------------*/
cardinalNumbersDFA::cardinalNumbersDFA() {
numberOfStates = 3;
initialState = 0;
finalStates = vector(numberOfStates, false);
finalStates[1] = true;
for (unsigned i=0;i<9;i++) transitions.push_front(transition(0, '1'+i, 1));
transitions.push_front(transition(0, '0', 2));
for (unsigned i=0;i<10;i++) transitions.push_front(transition(1, '0'+i, 1));
for (unsigned i=0;i<10;i++) transitions.push_front(transition(2, '0'+i, 2));
}
bool cardinalNumbersDFA::acceptedByDFA(const string &input) const {
return basicDFA::checkIfAccepted(input);
}
unsigned cardinalNumbersDFA::getId() const {
return dfaId;
}
______________________________________________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
- A hozzászóláshoz be kell jelentkezni
A fórummotor megnyirbálta a forráskódot, egyes helyeken elvesztek a template-hez szükséges kacsacsőrös jelölések. :(
Itt a teljes forráskód: http://chaosrider.uw.hu/stuff/janos_02.tgz
______________________________________________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
- A hozzászóláshoz be kell jelentkezni
Valószinűleg ezekkel van gond:
template <class type>
const list<type>::iterator listFind(const list<type> &, type &);
template <class type>
const list<type>::iterator listFind(const list<type> & haystack, type & needle) {
for (list<type>::iterator i=haystack.begin();i!=haystack.end();i++) {
if (*i == needle) return i;
}
return haystack.end();
}
Illetve itt a meghivása:
bool basicDFA::checkIfAccepted(const string & input) const {
unsigned currentState = initialState;
cout << "Starting form state " << currentState << "." << endl;
if (currentState >= numberOfStates) throw new invalidInitialStateException();
if ((numberOfStates == 0) || (finalStates.empty() == true) || (transitions.empty() == true)) return false;
size_t inputLength = input.length();
transition tmp;
list<transition>::iterator found;
for (size_t i=0;i
cout << "Going form state " << currentState;
tmp.setCurrentState(currentState);
tmp.setNextChar(input[i]);
if ((found = listFind(transitions, tmp)) == transitions.end()) throw new invalidCharacterInParsedTextException();
currentState = found->getNextState();
cout << " to state " << currentState << " while reading \"" << input[i] << "\"." << endl;
if ((currentState < 0) || (currentState >= numberOfStates)) throw new invalidTransitionException();
}
cout << "Done." << endl;
if (finalStates[currentState] == true) return true;
else return false;
}
És ez a hibaüzenet:
In file included from dfa.cpp:2:
dfa.hpp:69: warning: `std::list >::iterator' is
implicitly a typename
dfa.hpp:69: warning: implicit typename is deprecated, please see the
documentation for details
dfa.cpp:67: warning: `std::list >::iterator' is
implicitly a typename
dfa.cpp:67: warning: implicit typename is deprecated, please see the
documentation for details
dfa.cpp: In function `typename std::list
>::iterator listFind(const std::list >&, type&)
':
dfa.cpp:68: warning: `std::list >::iterator' is
implicitly a typename
dfa.cpp:68: warning: implicit typename is deprecated, please see the
documentation for details
dfa.cpp: In function `typename std::list
>::iterator listFind(const std::list >&, type&)
[with type = transition]':
dfa.cpp:86: instantiated from here
dfa.cpp:68: error: conversion from `std::_List_iterator
transition&, const transition*>' to non-scalar type `
std::_List_iterator
' requested
dfa.cpp:86: instantiated from here
dfa.cpp:71: error: conversion from `std::_List_iterator
transition&, const transition*>' to non-scalar type `const
std::_List_iterator
' requested
make: *** [dfa] Error 1
______________________________________________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
- A hozzászóláshoz be kell jelentkezni
Hosszas szenvedés, vért izzadás és hajtépés után megoldódott a problémám, és immáron tisztán fordul.
______________________________________________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
- A hozzászóláshoz be kell jelentkezni
Es hogyan oldodott meg? :-)
---------------------
Ригидус а бетегадьбол
- A hozzászóláshoz be kell jelentkezni
Több gond is volt, ha jól láttam...
Először is megpróbálta feltalálni a spanyolviaszt, és írt egy saját listFind-et ahelyett, hogy a beépített find-et használta volna.
Ezen kívül a g++ hiányolt egy pár typename kulcsszót.
Tipikusan:
typename list<T>::iterator
Nomeg a const list<T>::iterator-nak nincs túl sok értelme, ami neki kellett az a list<T>::const_iterator.
Hirtelen én ezeket találtam, nálam fordul (illetve most az main száll el). Persze ez mind nem kellett volna, ha használja a find-et, ha már van. ;)
Érdekes, hogy nekem teljesen más hibaüzeneteket adott a g++, biztos más verzió. Amit neki adott abból nekem rögtön gyanus lett a typename hiány, amit nekem adott abból sose jövök rá. :)
Melyik gcc?
(Az enyém: gcc version 3.4.2 (mingw-special))
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
Nos igen. Leginkább ez a két hiba volt.
Az STL-hez még viszonylag új vagyok, másfél hete használgatom, de gondolom ez látszik is. Meg kell hagyni ez a typename dolog sincsen túlhangsúlyozva, legalábbis ahol én olvasgattam ott az STL-es absztrakt adattárolók fejezetet nem ezzel kezdik :D Valamint a gcc "see the documentation" cimű warningja tőbb mint segitőkész annak az embernek aki alig tájékozott a témában. Heh' megértem, hogy a forditó rtfm-el nekem :D Most már tényleg a programozók legaljához tartozom :D
A listFind-hez meg valóban szinte mindenütt const_iterator kellett volna, és az meg is oldotta (volna) a problémát.
Továbbá a find függvényre sem sokat utalgatnak a list adattároló leirásánál, igy az mindeddig kimaradt az életemből. De legalább elmondhatom, hogy sikerült feltalálnom a spanyolviaszt, mert működik a listFind-em :) Meg legalább irtam template-ekre épülő függvényt, nem is akármilyet, mert ez azért nem a legalapabb eset talán.
A main-nél persze, hogy elszáll, mert az még nincs meg rendesen, először is a dfa.cpp-t akartam fordulásra birni.
De legalább ma is tanultam valami újat. Ha máshogy nem is, legalább úgy ahogy a buta emberek szoktak, a saját káromon.
Én 3.3.4-es gcc-t használok.
______________________________________________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
- A hozzászóláshoz be kell jelentkezni
A list-nél azért nincs a find hangsúlyozva, mert csak az O(n)-es általános find használható, ami viszont már meg van egyszer írva az <algorithm>
-ban.
Én ezt a referenciát szeretem használni.
- A hozzászóláshoz be kell jelentkezni
Ezt az oldalt nem is ismertem.
Tetszik is meg nem is.
Tetszik, mert szépen meg lehet találni benne a dolgokat. (Gyorsabb mint a Stroustrup könyvet nyálazni.)
Viszont pl a list/pop_back-nél van ugyan "Syntax":
#include <list>
void pop_back();
De ebből nekem nem látszik első ránézésre, hogy ez egy member fv.
push_back()-nél van példa, és ott látszik, itt meg nincs.
De arra mindenképp jó, hogy gyorsan megkeress egy fv-t, max ha épp nem akar működni, akkor ráguglizel.
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
jaja, inkább olyan puskaféle.. meg ami még hasznos benne, hogy (többnyire?) meg vannak adva a műveleti komplexitások is.
- A hozzászóláshoz be kell jelentkezni
A listnél azért nincs kihangsúlyozva a find, mert az az algorithmnál van, éspedig azért, mert a findet egyformán használhatod vectorra, listre, stb.
Általában ha valami alapvető dolgot akarsz (konkatenáció, keresés, stb.) érdemes először megnézni az algortihmban.
A hibaüzenet valóban elég lol, ilyet még nem is láttam.
Számomra azért volt mégis árulkodóbb, mert benne volt a typename kulcsszó, és ebbe a problémába egyszer már belefutottam. :)
Legközelebb már neked sem fog gondot okozni.
(Mint ahogy a const_iterator sem).
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni