|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Aug 2004
Città: Palermo
Messaggi: 1079
|
C++ inizializzazione stringa dentro uno switch, problemi!
Ho scritto questo pezzo di codice che devo completare a poco a poco però ci sono dei problemi che io non riesco a comprendere.
switch(sel){ case 1: string uno=""; string due=""; break; case 2: break; case 3: break; case 4: break; default: return 0; } } Se provo a compilare con questo pezzo di codice mi vengono dati degli errori nella dichiarazione delle due stringhe (include <string> c'è) e non riesco a capire il perchè, so che è una cosa scema ma non capisco cosa ci possa essere di sbagliato. Questi sono gli errori che mi vengono dati in fase di compilazione: rimo.cpp c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(46) : error C2360: initialization of 'due' is skipped by 'case' label c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(38) : see declaration of 'due' c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(46) : error C2360: initialization of 'uno' is skipped by 'case' label c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(37) : see declaration of 'uno' c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(48) : error C2360: initialization of 'due' is skipped by 'case' label c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(38) : see declaration of 'due' c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(48) : error C2360: initialization of 'uno' is skipped by 'case' label c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(37) : see declaration of 'uno' c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(50) : error C2360: initialization of 'due' is skipped by 'case' label c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(38) : see declaration of 'due' c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(50) : error C2360: initialization of 'uno' is skipped by 'case' label c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(37) : see declaration of 'uno' c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(52) : error C2360: initialization of 'due' is skipped by 'case' label c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(38) : see declaration of 'due' c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(52) : error C2360: initialization of 'uno' is skipped by 'case' label c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(37) : see declaration of 'uno' c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(54) : error C2360: initialization of 'due' is skipped by 'case' label c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(38) : see declaration of 'due' c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(54) : error C2360: initialization of 'uno' is skipped by 'case' label c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(37) : see declaration of 'uno' c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(56) : error C2360: initialization of 'due' is skipped by 'case' label c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(38) : see declaration of 'due' c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(56) : error C2360: initialization of 'uno' is skipped by 'case' label c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(37) : see declaration of 'uno' c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(58) : error C2360: initialization of 'due' is skipped by 'case' label c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(38) : see declaration of 'due' c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(58) : error C2360: initialization of 'uno' is skipped by 'case' label c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(37) : see declaration of 'uno' c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(60) : error C2361: initialization of 'due' is skipped by 'default' label c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(38) : see declaration of 'due' c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(60) : error C2361: initialization of 'uno' is skipped by 'default' label c:\documents and settings\angelo\documenti\visual studio 2005\projects\primo\primo\primo.cpp(37) : see declaration of 'uno' Build log was saved at "file://c:\Documents and Settings\angelo\Documenti\Visual Studio 2005\Projects\Primo\Primo\Debug\BuildLog.htm" Primo - 16 error(s), 0 warning(s) Che cosa vogliono dire? Cosa diamine posso fare per risolvere? Posso passare una string ad un metodo che vuole char*? Se non posso farlo come converto una string in un char*? Grazie, ciao ciao. Grazie, ciao ciao. Ultima modifica di Abdujaparov : 24-09-2006 alle 22:06. |
|
|
|
|
|
#2 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
eh caro Angelo :P il problema è che non puoi dichiarare variabili all'interno di uno switch, a prescindere da che le inizializzi o no; vanno dichiarate per forza fuori oppure in un blocco di codice interno al case racchiuso da parentesi graffe:
Codice:
switch (asd) {
case lol:
{
int rofl = 0;
.
.
.
}
break;
}
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Aug 2004
Città: Palermo
Messaggi: 1079
|
Grazie mille e per quanto riguarda string e char *?
Grazie, ciao ciao |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Per convertire una string in char * usi il metodo c_str() che però ritorna un const char *, attenzione...quindi non la puoi passare a funzioni che manipolano il buffer della stringa...o che comunque che non hanno const char * nel prototipo...
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Aug 2004
Città: Palermo
Messaggi: 1079
|
Grazie mille, poi ho risolto in questo modo:
string nome; quando una funzione accetta char* io passo: &nome[0]. Ora ho un altro problema, devo prendere da linea di comando due stringhe formate da più parole solo che se appena digito la prima stringa e do invio, in automatico come stringhe mi vengono prese le due parole che ho digitato e non mi viene neanche chiesto di inserire la seconda stringa. Allego il codice ed un esempio per farmi capire. Codice: cout<<"Inserisci prima stringa"; cin>>nome; cout<<"\n"<<"Seconda stringa"; cin>>pollo; Mi viene posta la prima domanda ed inserisco: "ciao mimmo". La seconda richiesta non mi viene posta e pollo assume valore "mimmo", mentre nome assume valore "ciao". Io invece voglio che nome contenga tutto "ciao mimmo" e che poi mi venga fatta la seconda richiesta. Cosa devo modificare? Grazie,ciao ciao. |
|
|
|
|
|
#6 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Se ti serve un char * allora fai così: char *tmp = new char[s.length()+1]; strcpy(tmp, s.c_str()); funzione(tmp); delete[] tmp; In ogni caso sei sei te a scrivere "funzione" non vedo perchè non metterti a passare const char * invece di char *... Quote:
getline(cin, s); |
||
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Quote:
|
|
|
|
|
|
|
#8 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() si, la accendiamo |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Sep 2006
Città: Pescara
Messaggi: 28
|
posso importunare ognuno di voi? Avrei bisogno di una dritta per poter entrare in maniera autodidattica nella programmazione...
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Il blocco dell'enunciato (io uso questo termine per "statement") switch può contenere altri enunciati e la dichiarazione in C++ è un enunciato (declaration-statement). Ergo la norma è che lo switch possa contenere anche la dichiarazione di variabili, con o senza inizializzazione. Si può fare:
Codice:
Caso 1
switch(a) {
int x = a;
case 0:
//blabla
case 1:
//blibli
}
Codice:
Caso 2
switch(b) {
case 0:
//blibli
case 1:
int x = 10;
break;
}
Codice:
Caso 3
switch(c) {
case 0:
int x;
break;
case 1:
int y;
break;
}
Codice:
Caso 4
switch(c) {
case 0:
int x = 0;
case 1:
break;
}
No. Non si può fare per via di un'eccezione alla regola dei salti dentro a un enunciato composto: Codice:
void pippo(int x) {
if(x == 2) goto jump;
int y = x + 1;
jump: //blabla;
}
|
|
|
|
|
|
#13 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
boh, fa' come ti pare, ma intanto col gcc va
![]() è solo il Visual Studio che fa problemi (e probabilmente ha ragione) |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Quote:
. D'altronde non è che io lo sappia per intervento divino 6.4.2 (Switch) 6.7 (Declaration Statement), paragrafo 3 3.9 Tipi POD e vedrai che si può. Se il compilatore che usi non te lo consente allora o è un compilatore per il C++ de noantri oppure c'è qualche altra eccezione all'eccezione della norma (eventuale) che mi sono perso. |
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Codice:
#include <stdio.h>
int main()
{
int x = 1;
switch(x)
{
case 1:
int y; // riga 10
int z = 2;
break;
}
return 0;
}
Codice:
gcc prova.c -o p Codice:
prova.c: In function `main': prova.c:10: syntax error before "int"
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Quote:
|
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Anche in C l'enunciato switch accetta degli enunciati. A differenza di C++, però, la dichiarazione in C non è un enunciato. Quindi uno switch C non può contenere la dichiarazione di una variabile. Quello che hai incollato è codice C e lì si, non si può fare. |
|
|
|
|
|
#20 | ||
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Quote:
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
||
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:17.



















