/ 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
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!



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

Månedens bedste
Årets bedste
Sidste års bedste