Torna indietro   Hardware Upgrade Forum > Software > Programmazione

realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole!
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole!
Hogwarts arriva in fascia media grazie a realme, con una special edition che unisce la Quadra Light-Sensing Color-changing Tech, un baule in stile Hogwarts Express pieno di collezionabili e una scheda tecnica sostanzialmente identica al 16 Pro di partenza: ecco cosa cambia davvero, come si comporta nell'uso quotidiano e quanto vale in base al prezzo di 699,99 euro
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
REDMI Note 17 Pro porta in fascia media una batteria da 8.340 mAh con ricarica HyperCharge a 67W, un display AMOLED da 6,83 pollici capace di picchi di luminosità molto elevati e una struttura certificata TÜV SÜD contro cadute e infiltrazioni d'acqua, il tutto racchiuso in una scocca da 223 grammi. Lo abbiamo provato per diversi giorni tra fotocamera, prestazioni, autonomia e prezzo sul mercato italiano
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 08-05-2009, 15:04   #1
tookie
Member
 
L'Avatar di tookie
 
Iscritto dal: Apr 2009
Messaggi: 50
[C]chiarimenti su costrutto switch

ciao a tutti,

volevo sapere se qualcuno può indicarmi un modo per usare il costrutto switch-case, con stringhe o char

Codice:
#include <stdio.h>

int main(int argc,char** argv[]){

switch ( argv[1]) {
case 'r':

    printf("reverse!\n");
   break;
case 'l':

    printf("limited!\n");
   break;
default:

    printf("normal!\n");
   break;
} 


}
in questo semplice programma ho provato a farlo andare passandogli da riga di comando argv[1](il main devo lasciarlo cosi perchè devo unire questo segmento di codice ad un altro programma che necessita di quei parametri), e da quel che so argv è un array di argomenti lungo argc, letti come char, perciò dato che switch dovrebbe funzionare con quasi tutti i tipi numerici e char non capisco perchè mi ritorni

Codice HTML:
prgramma_semplice.c:5: error: switch quantity not an integer
ho cercato un pò in rete ma nessuna soluzione ha funzionato, e in alcuni casi queste hanno creato maggiori guai...ho provato anche ad assegnare ad una variabile char x il valore di argv[1] ma niente
tookie è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2009, 15:53   #2
british
Member
 
L'Avatar di british
 
Iscritto dal: Sep 2008
Città: Milano
Messaggi: 126
intanto i parametri del main che hai postato sono scorretti:
argc va bene di tipo int
argv invece è un array di stringhe, che puoi vedere:
o come un array di array di caratteri e in tal caso lo indichi come *argv[]
o come un puntatore a un puntatore a carattere e in tal caso lo indichi come **argv
le due versioni sono sostanzialmente equivalenti proprio per l'equivalenza, in C, tra puntatori e array
premesso ciò, argv[1] non è un char, bensì è il secondo elemento di argv e per quanto detto sopra è un array di caratteri.

tornando a bomba:

se vuoi effettuare lo switch su argv[1] e ( argv[1] è lungo un solo carattere oppure vuoi prenderne solo il primo carattere ) allora puoi fare:

switch ( argv[1][0] )

( prendendo esplicitamente il primo elemento di argv[1] )
oppure

switch ( *argv[1] )

( dereferenziando il puntatore )

così accedi al primo carattere della seconda stringa contenuta in argv.

se invece vuoi switchare su delle stringhe di lunghezza arbitraria... beh non puoi, in quanto lo puoi fare solo su valori interi ( o promuovibili a intero, come un char )

l'alternativa è andare di if - strcmp - else, oppure usare qualche tipo di hash

spero di non essere stato troppo incomprensibile

ciao!

british

P.S.

prima di accedere a qualsiasi titolo a elementi di argv ricordati di controllare che esistano attraverso argc, altrimenti il crash del programma è garantito
british è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2009, 16:32   #3
tookie
Member
 
L'Avatar di tookie
 
Iscritto dal: Apr 2009
Messaggi: 50
grazie ma questa era una soluzione che mi aveva generato un ulteriore problema, infatti adesso con questa sintassi

Codice:
.....
int main(int argc,char *argv[]){

switch (*argv[1]) {
case 'r':

    printf("reverse!\n");
   break;
.....

mi genera un segmentation fault, che dovrei riuscire a risolvere utilizzando il comando malloc, ma questo è utilizzabile su argv?
o è meglio che crei un altro array su cui salvo tutti gli argomenti passati sulla riga di comando e applico malloc e switch sull'array appena creato?
oppure se hai qualche altra soluzione migliore son tutto orecchie
tookie è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2009, 16:59   #4
british
Member
 
L'Avatar di british
 
Iscritto dal: Sep 2008
Città: Milano
Messaggi: 126
a me funziona... sei sicuro che argv[1] esista? ( ovverosia che argc > 1 ovverosia che effettivamente gli passi l'argomento sulla linea di comando )

ciao!

british
british è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2009, 17:17   #5
tookie
Member
 
L'Avatar di tookie
 
Iscritto dal: Apr 2009
Messaggi: 50
ah si scusa son proprio fuso oggi, mi ero dimenticato di passargli l'argomento

Grazie mille per avermi aiutato
tookie è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole! realme 16 Pro Harry Potter Edition: il nuovo mid...
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce Recensione REDMI Note 17 Pro: il midrange con ba...
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Amazon Haul, sconto del 15% su almeno 2 ...
Quasi il 90% degli sviluppatori di video...
Future Studies di Luca Locatelli in most...
ASUS ha lanciato il suo primo Mini PC co...
HillMiles MileCity1 torna disponibile a ...
Nel 2028 sarà lanciata la mission...
Un materiale rigido come pochi, ma isola...
Intel: fine delle ricompense fino a 100....
Un problema alle turbopompe potrebbe ral...
Jensen Huang, NVIDIA: 'Nel 2030 non fini...
PC rincondizionato Lenovo ThinkStation a...
Il Neural Rendering di DLSS 5 gira (male...
AMD Radeon RX 9050 4GB, ecco quanto perd...
Factorio è certificato Steam Frame: la b...
TECLAST ArtPad è attualmente il m...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 09:53.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v