Forum: C++, En övn med funktionsobjekt

Forum huvudsida -> Programmering -> C++, En övn med funktionsobjekt

Sidor: 1

Till botten

olle 19:51 - 30:e Juli 2006 | Post #1
Medlem
Inlägg: 57


Skicka PM
Hej igen!

Har en övning där det står:

"Definera ett predikat (dvs boolesk funktion) som avgör om ett tecken är en vokal. Definiera även predikatet som ett funktionsobjekt."

Har skrivit koden:

  1.  
  2. #include "vector.h"
  3. #include <iostream>
  4. #include <ctype.h>
  5. #include <stdlib.h>
  6. using namespace std;
  7.  
  8. class IsVokal { // funktionsobjekt
  9. public:
  10. // return true if c is a vocal
  11. bool operator() ( char c ) {
  12. // vill ta med ä å ö. Men får en varning
  13. // varning: flerteckens teckenkonstant
  14. if ( c == ('a' || 'e' || 'i' || 'o' || 'u' || 'y') )
  15. return true;
  16. return false;
  17. }
  18. };
  19.  
  20.  
  21. template <class A,class B,class Condition>
  22. void vokal(Vector<A> &src,Vector<B> &dest,Condition cond) {
  23.  
  24. dest.resize( src.size() );
  25. for ( int i = 0; i < src.size();i++ ){
  26. if ( cond( src[i] ) )
  27. dest.push_back( src[i] );
  28. }
  29. }
  30.  
  31.  
  32. int main(){
  33.  
  34. Vector<char> v1,v2;
  35.  
  36. v1.push_back('f');
  37. v1.push_back('t');
  38. v1.push_back('a');
  39. v1.push_back('s');
  40. v1.push_back('e');
  41. v1.push_back('g');
  42.  
  43.  
  44. vokal(v1,v2,IsVokal());
  45.  
  46. for ( int i=0; i < v2.size();i++)
  47. cout << v2[i] << endl;
  48.  
  49. return 0;
  50. }


Den skriver ut inget. Vet ej vad som är fel?

Var tvungen och använda min egen vector.h fil.
Annars om jag kör med "#include <vector>"
så kan jag ej kompilera vet ej varför.





-------------------------
Ingen signatur!



Nissebosselasse 21:10 - 30:e Juli 2006 | Post #2
Medlem
Inlägg: 490


Skicka PM
Ta först en titt på rad 14; är det verkligen en korrekt formaterad if-sats? Eller har du skrivit in det precis som om du hade läst upp det högt...?

-------------------------
http://pushingcows.se
Gula Nallen



olle 00:14 - 31:a Juli 2006 | Post #3
Medlem
Inlägg: 57


Skicka PM
hehe snacka om att jag är lite dum. Nu när du nämner det så ser jag felet i if-satsen. Tror jag var lite för snabb med fingrarna på tangentbordet som vanligt Smiley

  1. if ( c =='a'||c == 'e'||c=='i'||c=='o'||c=='u'||c=='y')
  2. return true;
  3. return false;
  4. }
  5. };


Nu fick jag rätt utskrift..

Hade jag besvarat frågan fullständigt om jag hade bara gjort denna del. tänker på att det står definiera en predikat och även som funktionsobjekt?

  1.  
  2. class IsVokal {
  3.  
  4. public:
  5.  
  6. // return true if c is a vocal
  7.  
  8. bool operator() ( char c ) {
  9. if ( c =='a'||c == 'e'||c=='i'||c=='o'||c=='u'||c=='y')
  10. return true;
  11. return false;
  12. }
  13. };


För det finns ju redan en funktionsobjekt som man kan använda copy_if.


ps: Hur fixar man ö,ä,å utan att få
"varning: flerteckens teckenkonstant"





-------------------------
Ingen signatur!

Senast redigerad 00:51 - 31:a Juli 2006


olle 00:53 - 31:a Juli 2006 | Post #4
Medlem
Inlägg: 57


Skicka PM
godnatt Smiley

-------------------------
Ingen signatur!



Nissebosselasse 18:34 - 31:a Juli 2006 | Post #5
Medlem
Inlägg: 490


Skicka PM

ps: Hur fixar man ö,ä,å utan att få
"varning: flerteckens teckenkonstant"

Det ska inte vara några krångligheter, bara använda enkla citationstecken som vanligt:
  1.  
  2. if ( c =='a'||c == 'e'||c=='i'||c=='o'||c=='u'||c=='y' || c == 'å' || c == 'ä' || c == 'ö')

Vilken kompilator kör du? Du har kanske bara använt fel skrivsätt?

-------------------------
http://pushingcows.se
Gula Nallen

Senast redigerad 18:35 - 31:a Juli 2006


olle 18:44 - 31:a Juli 2006 | Post #6
Medlem
Inlägg: 57


Skicka PM
Jag kör Linux och där använder jag en kompilator som har version "g++ (GCC) 4.0.3 ".

Tar jag med tex c=='ö' och kompilerar så får jag detta varning:

1.cpp:13:69: varning: flerteckens teckenkonstant
1.cpp: In member function "bool IsVokal::operator()(char)":
1.cpp:13: varning: jämförelsen är alltid falsk på grund av begränsat intervall för datatypen

Lite skumt är det.

Sen om jag använder include<vector> i min kod så får jag yttligare mer varning: även om jag kör utan c=='ö'

1.cpp: In function "int main()":
1.cpp:48: varning: comparison between signed and unsigned integer expressions
1.cpp: In function "void copy_if(const std::vector<A, std::allocator<_CharT> >&, std::vector<A, std::allocator<_CharT> >&, Condition) [with A = char, Condition = IsVokal]":
1.cpp:46: instantiated from here
1.cpp:25: varning: comparison between signed and unsigned integer expressions

Detta får jag inte om jag kör min egen vector.h fil




-------------------------
Ingen signatur!



Nissebosselasse 18:52 - 31:a Juli 2006 | Post #7
Medlem
Inlägg: 490


Skicka PM
Hmm, testa att använda unsigned char i deklarationen. Det är det enda jag kommer på nu.

-------------------------
http://pushingcows.se
Gula Nallen



olle 18:56 - 31:a Juli 2006 | Post #8
Medlem
Inlägg: 57


Skicka PM
testade med unsigned char och får samma utskrift när jag kör med include<vector> och utan c=='ö'.

1.cpp: In function "int main()":
1.cpp:48: varning: comparison between signed and unsigned integer expressions
1.cpp: In function "void copy_if(const std::vector<A, std::allocator<_CharT> >&, std::vector<A, std::allocator<_CharT> >&, Condition) [with A = char, Condition = IsVokal]":
1.cpp:46: instantiated from here
1.cpp:25: varning: comparison between signed and unsigned integer expressions

Tror det är ej så viktigt när jag andå har gjort klar övningen.
Tack för hjälpen igen. uppskattas

-------------------------
Ingen signatur!



Nissebosselasse 19:09 - 31:a Juli 2006 | Post #9
Medlem
Inlägg: 490


Skicka PM
Kan det ha att göra med multibyte-inställning? Tycker det är konstigt... Jag skrev in programmet i Visual Studio och det kompilerade felfritt, utan varningar (vissa smärre ändringar dock).

EDIT: testade att kompilera det i Borlands gratiskompilator nu (v. 5.5), utan fel.
Min variant av din kod ser ut så här, d.v.s., i princip likadan:
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. using namespace std;
  5. class isVocal {
  6. public:
  7. isVocal () {}
  8. ~isVocal () {}
  9. bool operator() (char c) {
  10. switch (c) {
  11. case 'a':
  12. case 'e':
  13. case 'i':
  14. case 'o':
  15. case 'u':
  16. case 'y':
  17. case 'å':
  18. case 'ä':
  19. case 'ö':
  20. return true;
  21. default:
  22. return false;
  23. };
  24. }
  25. };
  26. template<class T1, class T2, class Condition>
  27. void pickVocals (vector<T1> &A, vector<T2> &B, Condition cond)
  28. {
  29. B.resize (A.size());
  30. vector<T1>::iterator it = A.begin ();
  31. for (; it != A.end(); ++it) {
  32. if (cond(*it))
  33. B.push_back (*it);
  34. }
  35. }
  36. template<class T1>
  37. void printVector (vector<T1> &v)
  38. {
  39. vector<T1>::iterator it = v.begin ();
  40. for (; it != v.end(); ++it) {
  41. cout << *it << endl;
  42. }
  43. }
  44. int main(int argc, char *argv)
  45. {
  46. vector<char> v1, v2;
  47. std::string sText = "Ich bin ein textstringen!";
  48. std::string::iterator it = sText.begin ();
  49. for (; it != sText.end(); ++it) {
  50. v1.push_back (*it);
  51. }
  52. pickVocals (v1, v2, isVocal());
  53. printVector (v2);
  54. return 0;
  55. }


-------------------------
http://pushingcows.se
Gula Nallen

Senast redigerad 19:14 - 31:a Juli 2006


olle 19:46 - 31:a Juli 2006 | Post #10
Medlem
Inlägg: 57


Skicka PM
Verkar som det är min kompilator som är boven. Vet dock inte vad exakt.
Testade din kod rakt av, då fick jag massa varning och fel.
Snacka om mycket hehe

1.annan.cpp:19:7: varning: flerteckens teckenkonstant
1.annan.cpp:20:7: varning: flerteckens teckenkonstant
1.annan.cpp:21:7: varning: flerteckens teckenkonstant
1.annan.cpp: In member function "bool isVocal::operator()(char)":
1.annan.cpp:19: varning: spill i implicit constant konvertering
1.annan.cpp:20: varning: spill i implicit constant konvertering
1.annan.cpp:21: varning: spill i implicit constant konvertering
1.annan.cpp: In function "void pickVocals(std::vector<T1, std::allocator<_CharT> >&, std::vector<T2, std::allocator<_T2> >&, Condition)":
1.annan.cpp:35: error: expected `;' before "it"
1.annan.cpp:37: error: "it" was not declared in this scope
1.annan.cpp: In function "void printVector(std::vector<T1, std::allocator<_CharT> >&)":
1.annan.cpp:45: error: expected `;' before "it"
1.annan.cpp:46: error: "it" was not declared in this scope
1.annan.cpp: In function "void pickVocals(std::vector<T1, std::allocator<_CharT> >&, std::vector<T2, std::allocator<_T2> >&, Condition) [with T1 = char, T2 = char, Condition = isVocal]":
1.annan.cpp:60: instantiated from here
1.annan.cpp:35: error: dependent-name "std::vector<T1,std::allocator<_CharT> >::iterator" is parsed as a non-type, but instantiation yields a type
1.annan.cpp:35: anm: say "typename std::vector<T1,std::allocator<_CharT> >::iterator" if a type is meant
1.annan.cpp: In function "void printVector(std::vector<T1, std::allocator<_CharT> >&) [with T1 = char]":
1.annan.cpp:61: instantiated from here
1.annan.cpp:45: error: dependent-name "std::vector<T1,std::allocator<_CharT> >::iterator" is parsed as a non-type, but instantiation yields a type
1.annan.cpp:45: anm: say "typename std::vector<T1,std::allocator<_CharT> >::iterator" if a type
is meant

Ska försöka fixa min kompilator. Men nu vet jag iallfall att det inte är koden som är fel. Tack för hjälpen


ps: lite skumt är det när den klagar på iterator när jag andå har använt det innan utan fel.

-------------------------
Ingen signatur!



Sidor: 1

Forum huvudsida -> Programmering -> C++, En övn med funktionsobjekt
Atom feed

Du får inte posta i den här tråden | Till toppen