|
| jump to case crosses initialization of ite~ Fra : Skovge |
Dato : 17-02-04 22:05 |
|
Hej NG
Jeg har lavet nedenstående kode som compiler fint i min borland, men når
jeg flytter den over i en linux og prøver med g++ får jeg en fejlkode
der siger noget med:
62: jump to case label
53: crosses initialization of `
__gnu_cxx::__normal_iterator<SYMBOL**, std::vector<SYMBOL*,
std::allocator<SYMBOL*> > > iter`
.......og det samme bare for linie 83 og 84.
Så vidt jeg kan regne ud, så brokker den sig over, at der bliver
erklæret en iterator i case 1, der ikke bliver brugt hvis man tager case
2-3-4???
Nogen der har nogle forslag?
#include<iostream>
#include<iomanip.h>
#include <string>
#include <vector>
using namespace std;
class SYMBOL
{
public :
string Name;
string Token;
string Type;
};
int main()
{
string name, token, type;
vector<SYMBOL*> Symbols;
SYMBOL *newTable;
int choise = 0;
while(choise != 4)
{
cout<<"What would you like to do?\n";
cout<<endl;
cout<<"Add values to tabel: "<<setw(20)<<"1\n";
cout<<"Write list of current values: "<<setw(11)<<"2\n";
cout<<"Search for name: "<<setw(24)<<"3\n";
cout<<"End program: "<<setw(28)<<"4\n";
cout<<endl;
cout<<"Choise: ";
cin>>choise;
switch(choise)
{
case 1: newTable = new SYMBOL();
cout<<"Name: ";
cin>>name;
cout<<"Token: ";
cin>>token;
cout<<"type: ";
cin>>type;
cout<<endl;
cout<<endl;
newTable->Name = name;
newTable->Token = token;
newTable->Type = type;
Symbols.push_back(newTable);
break;
case 2: vector<SYMBOL*>::iterator iter;
for(iter=Symbols.begin();iter != Symbols.end(); iter++)
{
cout<<(*iter)->Name;
cout<<setw(15)<<(*iter)->Token;
cout<<setw(15)<<(*iter)->Type;
cout<<endl;
}
break;
case 3: {
cout<<"Name: ";
cin>>name;
cout<<endl;
cout<<endl;
vector<SYMBOL*>::iterator iter2;
bool found = false;
for(iter2=Symbols.begin();iter2 != Symbols.end();
iter2++)
{
SYMBOL* s = *iter2;
if(s->Name == name)
{
cout<<name<<" is a "<<s->Token<<" of the type "<<s->Type<<" in the
symbol table\n";
found = true;
}
}
if(!found)
cout<<name<<" is not in the symbol table!\n";
}
case 4: break;
default:cout<<"The selected option must be between 1-4!\n";
break;
}
}
return 0;
};
| |
Kent Friis (17-02-2004)
| Kommentar Fra : Kent Friis |
Dato : 17-02-04 22:26 |
|
Den Tue, 17 Feb 2004 22:05:02 +0100 skrev Skovge:
>Hej NG
>
>Jeg har lavet nedenstående kode som compiler fint i min borland, men når
>jeg flytter den over i en linux og prøver med g++ får jeg en fejlkode
>der siger noget med:
>62: jump to case label
>53: crosses initialization of `
>__gnu_cxx::__normal_iterator<SYMBOL**, std::vector<SYMBOL*,
>std::allocator<SYMBOL*> > > iter`
Min g++ compiler det uden warnings med -Wall
kfr:c++$ gcc --version
2.95.3
kfr:c++$ ll /lib/libc*
-rwxr-xr-x 1 root root 18187081 sep 7 14:44 /lib/libc-2.3.2.so
....
kfr:c++$ uname -a
Linux gandalf 2.4.24 #4 Mon Jan 12 17:54:26 CET 2004 i686 unknown
Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/
| |
Bertel Brander (17-02-2004)
| Kommentar Fra : Bertel Brander |
Dato : 17-02-04 22:37 |
|
Skovge wrote:
> Hej NG
>
> Jeg har lavet nedenstående kode som compiler fint i min borland, men når
> jeg flytter den over i en linux og prøver med g++ får jeg en fejlkode
> der siger noget med:
> 62: jump to case label
> 53: crosses initialization of `
> __gnu_cxx::__normal_iterator<SYMBOL**, std::vector<SYMBOL*,
> std::allocator<SYMBOL*> > > iter`
>
> ......og det samme bare for linie 83 og 84.
> Så vidt jeg kan regne ud, så brokker den sig over, at der bliver
> erklæret en iterator i case 1, der ikke bliver brugt hvis man tager case
> 2-3-4???
>
> Nogen der har nogle forslag?
Se nedefor
>
> #include<iostream>
> #include<iomanip.h>
> #include <string>
> #include <vector>
>
> using namespace std;
>
> class SYMBOL
> {
> public :
> string Name;
> string Token;
> string Type;
> };
>
> int main()
> {
> string name, token, type;
> vector<SYMBOL*> Symbols;
>
> SYMBOL *newTable;
>
> int choise = 0;
>
> while(choise != 4)
> {
> cout<<"What would you like to do?\n";
> cout<<endl;
> cout<<"Add values to tabel: "<<setw(20)<<"1\n";
> cout<<"Write list of current values: "<<setw(11)<<"2\n";
> cout<<"Search for name: "<<setw(24)<<"3\n";
> cout<<"End program: "<<setw(28)<<"4\n";
> cout<<endl;
> cout<<"Choise: ";
> cin>>choise;
>
> switch(choise)
> {
Prøv at sætte {} omkring:
> case 1:
{
newTable = new SYMBOL();
> cout<<"Name: ";
> cin>>name;
> cout<<"Token: ";
> cin>>token;
> cout<<"type: ";
> cin>>type;
> cout<<endl;
> cout<<endl;
> newTable->Name = name;
> newTable->Token = token;
> newTable->Type = type;
> Symbols.push_back(newTable);
}
> break;
> case 2:
{
vector<SYMBOL*>::iterator iter;
> for(iter=Symbols.begin();iter != Symbols.end(); iter++)
> {
> cout<<(*iter)->Name;
> cout<<setw(15)<<(*iter)->Token;
> cout<<setw(15)<<(*iter)->Type;
> cout<<endl;
> }
}
> break;
/b
| |
Mogens Hansen (17-02-2004)
| Kommentar Fra : Mogens Hansen |
Dato : 17-02-04 23:17 |
|
"Skovge" <skovge@lite.dk> wrote in message
news:403281f8$0$167$edfadb0f@dread11.news.tele.dk...
[8<8<8<]
> #include<iomanip.h>
Det hedder
#include<iomanip>
Det kan ikke oversætte med den compiler jeg lige prøvede
[8<8<8<]
> class SYMBOL
Det er atypisk at navngive en klasse kun med store bogstaver - det bruger
man typisk til konstanter.
[8<8<8<]
> int main()
> {
> string name, token, type;
Måske er det en ide at begrænse scope af disse variable, til der hvor de er
nødvendige ?
> vector<SYMBOL*> Symbols;
Hvor for pointer til objekter i stedet for objekter ?
[8<8<8<]
> case 1: newTable = new SYMBOL();
Hvor frigives dette objekt ?
[8<8<8<]
> case 3: {
Her er "iter" i scope, selvom den ikke er blevet konstrueret
Gør hver case til et selvstændigt scope - som Bertel Brander nævnte.
[8<8<8<]
> return 0;
> };
Hvem rydder op i det der er allokeret med new ?
Du vil formodentlig være bedre tjent med at lade "Symbols" indeholde
objekter i stedet for pointere til objekter:
vector<Symbol> Symbols;
Hvis du så også lige laver et par constructorer til Symbol:
class Symbol
{
public :
Symbol() {}
Symbol(const string& NameArg, const string& TokenArg, const string&
TypeArg) :
Name(NameArg), Token(TokenArg), Type(TypeArg) {}
string Name;
string Token;
string Type;
};
så vil du se at koden bliver simplere.
Du slipper af med "new", og indsætter direkte i symboltabellen med
Symbols.push_back(Symbol(name, token, type));
og du opretter ikke Symbol objektet før der er brug for det.
Venlig hilsen
Mogens Hansen
| |
Skovge (18-02-2004)
| Kommentar Fra : Skovge |
Dato : 18-02-04 14:50 |
|
Tak for hjælpen - {} løste problemet!
...og til Mogens, tak for dine input - altid rart med gode råd og ideer!
| |
|
|