Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Polestar 3 Performance, test drive: comodità e potenza possono convivere
Polestar 3 Performance, test drive: comodità e potenza possono convivere
Abbiamo passato diversi giorni alla guida di Polestar 3, usata in tutti i contesti. Come auto di tutti i giorni è comodissima, ma se si libera tutta la potenza è stupefacente
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 30-10-2005, 11:24   #1
negator136
Senior Member
 
L'Avatar di negator136
 
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
[C] menu + switch

ciao a tutti

sto facendo un programma in grado di calcolare le soluzioni di equazioni di secondo grado.

il programma l'ho fatto tranquillamente ma ora vorrei (su consiglio del prof...) complicarlo un po', giusto per sperimentare qualche nuova funzione che ho imparato.

in pratica voglio mettere il menu, che chiede quale dipo di equazionie risolvere, in una funzione esterna al main.

sto lavorando con tre file distinti: 1. il programma, 2. la mia libreria di funzioni, 3. il file con le intestazioni.

questo è il codice del programma:

Codice:
#include <stdio.h>
#include <math.h>
#include "funzioni.c"


int main() 
{
	
	cleanScreen();	
	
while(grade_menu==grade_menu){

	menu();
		
	switch (grade_menu){
	case '1': /*Risoluzione equazione di primo grado*/

		eq1grado();
		break;

	case '2': /*Risoluzione equazione di secondo grado*/

		eq2gradoCompl();
		break;

	case '0': /*Uscita*/
		printf("\n");
		return 0;
	}
}
return 0;
}
questa è la funzione del menu:

Codice:
void menu(void)
{
	printf("\n*** RISOLUTORE DI EQUAZIONI ***\n"); 
	printf("\nSelezionare il tipo di equazione che si desidera risolvere:\n"); 
	printf("\n\t1) Primo grado\n");
	printf("\n\t2) Secondo grado\n");
	printf("\n\t0) Esci\n\n");
	
	grade_menu=getchar();
}
questa è parte del file delle intestazioni:
Codice:
int grade_menu;
void menu(void);
a me il codice sembra corretto... eppure l'esecuzione da dei problemi... in particolare questa è una prova di esecuzione:
Codice:
*** RISOLUTORE DI EQUAZIONI ***

Selezionare il tipo di equazione che si desidera risolvere:

        1) Primo grado

        2) Secondo grado

        0) Esci

2

Si vuole risolvere l'equazione di secondo grado del tipo: AX^2 + BX + C = 0

Inserire A: 2

Inserire B: -4

Inserire C: 2

Le  soluzioni sono coincidenti e valgono 1.00


*** RISOLUTORE DI EQUAZIONI ***

Selezionare il tipo di equazione che si desidera risolvere:

        1) Primo grado

        2) Secondo grado

        0) Esci


*** RISOLUTORE DI EQUAZIONI ***

Selezionare il tipo di equazione che si desidera risolvere:

        1) Primo grado

        2) Secondo grado

        0) Esci

1

Si vuole risolvere l'equazione di primo grado del tipo: AX + B = 0

Inserire A: 3

Inserire B: -6

La soluzione e'2.00


*** RISOLUTORE DI EQUAZIONI ***

Selezionare il tipo di equazione che si desidera risolvere:

        1) Primo grado

        2) Secondo grado

        0) Esci


*** RISOLUTORE DI EQUAZIONI ***

Selezionare il tipo di equazione che si desidera risolvere:

        1) Primo grado

        2) Secondo grado

        0) Esci

0

ale@debian:~/Programmi C/bo$
1. perchè ogni volta che finisce una risoluzione mi fa comparire DUE volte il menu anzichè UNA?!?

2. la condizione del "while" è un po' stupida... avete consigli a riguardo? magari anche sostituire il while con un'altra funzione elementare equivalente...

lo so, visto così sembra un lavoro in utile, visto che avrei potuto semplicemente lasciare come condizione del while un grade=getchar() e il menu all'interno della funzione, ma vorrei capire perchè non funziona...

grazie in anticipo a chi mi risponderà
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel
negator136 è offline   Rispondi citando il messaggio o parte di esso
Old 30-10-2005, 12:50   #2
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da negator136
1. perchè ogni volta che finisce una risoluzione mi fa comparire DUE volte il menu anzichè UNA?!?
Credo sia dovuto al fatto che quel getchar() in menu(), la prima volta, ritorna con un valore che a te non serve, rimasto dall'ultima pressione di un tasto (ASCII: 10+13).
Metti un bel: "while (getchar() != 0);" prima di "grade_menu=getchar();" in menu().
Quote:
Originariamente inviato da negator136
2. la condizione del "while" è un po' stupida... avete consigli a riguardo? magari anche sostituire il while con un'altra funzione elementare equivalente...

while (1) {
}
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 30-10-2005, 12:59   #3
leadergl
Senior Member
 
Iscritto dal: May 2003
Messaggi: 1113
Il tuo problema sta qui:
Codice:
void menu(void)
{
	printf("\n*** RISOLUTORE DI EQUAZIONI ***\n"); 
	printf("\nSelezionare il tipo di equazione che si desidera risolvere:\n"); 
	printf("\n\t1) Primo grado\n");
	printf("\n\t2) Secondo grado\n");
	printf("\n\t0) Esci\n\n");
	
	grade_menu=getchar();
}
o meglio qui:
Codice:
grade_menu=getchar();
perchè quando tu vai ad inserire "1" ad esempio lui nel buffer dello "stdin" rimane "1\n" ovvero anche il tuo enter e quindi ti carica due volte la schermata perchè analizza anche gli altri caratteri...
puoi:
1) usare:
Codice:
char c;

scanf("%s",&c); /*so che dovrebbe essere "%c" ma poi da lo stesso errore*/
                    /* che invece non si presenta mettendo "%s"*/
2) usare "fflush(stdin);" per svuotare il buffer di "stdin" (devi inserire la funzione prima di grade_menu=getchar();
3) usare:
Codice:
while (getchar()!='\n');
sempre prima del tuo getchar();

altro non so...è da poco che uso il C.
cmq usa la soluzione 1
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC
leadergl è offline   Rispondi citando il messaggio o parte di esso
Old 30-10-2005, 16:51   #4
negator136
Senior Member
 
L'Avatar di negator136
 
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
grazie per le risposte grazie a voi sono riuscito a risolvere qualcosa...

anche se ho ancora molti problemi...

aggiorno il file principale:
Codice:
#include <stdio.h>
#include <math.h>
#include "funzioni.c"


int main() 
{
	
	cleanScreen();	
	
	while(1){

		menu3opzioni('t','s','A','B','C');
		
		switch (grade_menu){
	
			case '1': /*Risoluzione equazione di primo grado*/
	
				eq1grado();
				break;
	
			case '2': /*Risoluzione equazione di secondo grado*/
	
				eq2gradoCompl();
				break;
	
			case '0': /*Uscita*/
				printf("\n");
				return 0;
		}
	}

return 0;
}
ecco quello delle funzioni:
Codice:
void menu3opzioni(char titolo, char sottotitolo, char opzioneA, char opzioneB, char opzioneC)
{
	printf("\n%c", titolo); 
	printf("\n%c", sottotitolo); 
	printf("\n%c", opzioneA);
	printf("\n%c", opzioneB);
	printf("\n%c", opzioneC);
	printf("\n\n");

	do {	
		scanf("%s", &grade_menu);
		check('3', grade_menu);
	} while (grade_menu != grade_check);
	
}

void check(char numero_opzioni, char valore_immesso){

	if ((valore_immesso >= 0) && (valore_immesso < numero_opzioni)) {
		grade_check = valore_immesso;
	}
	else {
		printf("Scelta non valida. Inserire un nuovo valore.\n");
		grade_check = -1;
	}
}
ed infine l'intestazione:
Codice:
char grade_menu;
char grade_check;

void eq1grado(void);
void eq2grado(void);
float delta(float e,float f,float g);
void eq2gradoCompl(void);
void menu3opzioni(char titolo, char sottotitolo, char opzione1, char opzione2, char opzione0);
void check(char numero_opzioni, char valore_immesso);
come vedete ho creato una funzione menù generica, i cui parametri d'ingresso dovrebbero essere i testi del titolo e delle opzioni... il fatto è che mi viene solo con dei caratteri e non con delle stringhe... idee?

io pensavo di mettere al posto di "char" l'equivalente per le stringhe ma poi ho pensato che probabilmente non esiste...

il secondo problema, più grave, è il fatto che impostando grade_menu e grade_check come char, nella funzione che controlla se il valore appartiene all'intervallo non riesco a fare in modo che mi escluda i valori negativi... anche qui, avete idee?

grazie mille
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel
negator136 è offline   Rispondi citando il messaggio o parte di esso
Old 30-10-2005, 17:30   #5
leadergl
Senior Member
 
Iscritto dal: May 2003
Messaggi: 1113
il problema sta qua:
Codice:
void menu3opzioni(char titolo, char sottotitolo, char opzione1, char opzione2, char opzione0);
se sono dichiarate come "char" perche ti dovrebbe visualizzare delle stringhe!?
in C:
Codice:
char carattere;   /* dichiarazione carattere */
char stringa[10]; /* dichiarazione per stringhe (da 0 a 9) */
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC
leadergl è offline   Rispondi citando il messaggio o parte di esso
Old 30-10-2005, 18:37   #6
negator136
Senior Member
 
L'Avatar di negator136
 
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
Quote:
Originariamente inviato da leadergl
il problema sta qua:
Codice:
void menu3opzioni(char titolo, char sottotitolo, char opzione1, char opzione2, char opzione0);
se sono dichiarate come "char" perche ti dovrebbe visualizzare delle stringhe!?
in C:
Codice:
char carattere;   /* dichiarazione carattere */
char stringa[10]; /* dichiarazione per stringhe (da 0 a 9) */
Codice:
void menu3opzioni(char titolo[30], char sottotitolo[30], char opzione1[30], char opzione2[30], char opzione0[30]);
quindi così dovrei risolvere, giusto?

ero convinto di averci già provato... vabbè... avrò sbagliato qualcosa grazie



per l'altro problema?
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel

Ultima modifica di negator136 : 30-10-2005 alle 18:40.
negator136 è offline   Rispondi citando il messaggio o parte di esso
Old 31-10-2005, 10:29   #7
negator136
Senior Member
 
L'Avatar di negator136
 
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
HELP vi prego!!

intanto ho avuto un idea...
come posso fare in modo che il programma acquisisca un solo carattere e poi proceda da solo senza dover premere invio?

in questo modo risolverei due problemi:

- eviterei di dover controllare che i numeri immessi siano positivi, visto che non potrei più immettere "-" e "numero"...

- potrei controllare nella stessa funzione tutti i caratteri ascii... lettere e simboli compresi, dal momento che ho impostato le variabili in ingresso come char.

dai che ci siamo quasi

grazie
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel
negator136 è offline   Rispondi citando il messaggio o parte di esso
Old 31-10-2005, 13:48   #8
17Qwerty71
Senior Member
 
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 309
Quote:
Originariamente inviato da negator136
HELP vi prego!!

intanto ho avuto un idea...
come posso fare in modo che il programma acquisisca un solo carattere e poi proceda da solo senza dover premere invio?

in questo modo risolverei due problemi:

- eviterei di dover controllare che i numeri immessi siano positivi, visto che non potrei più immettere "-" e "numero"...

- potrei controllare nella stessa funzione tutti i caratteri ascii... lettere e simboli compresi, dal momento che ho impostato le variabili in ingresso come char.

dai che ci siamo quasi

grazie
Utilizzi la funzione getch e la putch.

Se vuoi far stampare solo i numeri da 0 a 1 fai in questo modo
Codice PHP:
for(i=0cgetch() && 1i++)
     if(
>= '0' && <= '1'){
          
putch(c);
          
numero '0';
     }
     else
          
i--;

Così facendo l'utente è costretto ad immettere un solo carattere (i < 1), il quale deve essere compreso tra 0 e 1. Se così fosse il carattere viene stampato e immesso nella variabile intera "numero" (con c - '0' la converti praticamente).
Nel caso digitasse altri caratteri il contatore (i) va indietro di uno e il ciclo viene rieseguito.
__________________
17Qwerty71 è offline   Rispondi citando il messaggio o parte di esso
Old 31-10-2005, 17:18   #9
negator136
Senior Member
 
L'Avatar di negator136
 
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
Quote:
Originariamente inviato da 17Qwerty71
(con c - '0' la converti praticamente)
ti ringrazio per la risposta. ora provo a metterla in pratica...

potresti spiegarmi meglio la frase che ho quotato?
non capisco perchè in qual modo dovrebbe convertirmi la variabile da char a int

thanks
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel
negator136 è offline   Rispondi citando il messaggio o parte di esso
Old 31-10-2005, 17:58   #10
17Qwerty71
Senior Member
 
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 309
Quote:
Originariamente inviato da negator136
ti ringrazio per la risposta. ora provo a metterla in pratica...

potresti spiegarmi meglio la frase che ho quotato?
non capisco perchè in qual modo dovrebbe convertirmi la variabile da char a int

thanks
No, vabbe tu poi potresti non convertirla (quindi assegnare numero = c), ma poi nel controllo successivo, quello per la scelta del menù in pratica, metti come condizione (numero == 'uno_dei_tre_possibili numeri')
Essendo un carattere (ricevuto da tastiera) con getch tu vai a memorizzare nella variabile c il codice ascii del corispettivo tasto premuto. In questo modo quando tu per esempio premi 1, la variabile c assumerà il valore del codice ascii del nuemero 0 incrementato di 1 (ovvero 49 se non erro).
Così facendo nell'esempio che ti avevo fatto la variabile intera numero verra a trovarsi non il codice ascii, ma il numero convertito.
Quindi al controllo che occorre fare successivamente invece di confrontare la variabile numero al corispettivo ascii, la confronti con l'ascii convertito.

Non so' se si capisce come ho scritto
__________________
17Qwerty71 è offline   Rispondi citando il messaggio o parte di esso
Old 31-10-2005, 18:40   #11
negator136
Senior Member
 
L'Avatar di negator136
 
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
Quote:
Originariamente inviato da 17Qwerty71
No, vabbe tu poi potresti non convertirla (quindi assegnare numero = c), ma poi nel controllo successivo, quello per la scelta del menù in pratica, metti come condizione (numero == 'uno_dei_tre_possibili numeri')
Essendo un carattere (ricevuto da tastiera) con getch tu vai a memorizzare nella variabile c il codice ascii del corispettivo tasto premuto. In questo modo quando tu per esempio premi 1, la variabile c assumerà il valore del codice ascii del nuemero 0 incrementato di 1 (ovvero 49 se non erro).
Così facendo nell'esempio che ti avevo fatto la variabile intera numero verra a trovarsi non il codice ascii, ma il numero convertito.
Quindi al controllo che occorre fare successivamente invece di confrontare la variabile numero al corispettivo ascii, la confronti con l'ascii convertito.

Non so' se si capisce come ho scritto
ho capito quello che hai detto e ti ringrazio per la spèiegazione

purtroppo però sono troppo imbranato e non sono riuscito a mettere in pratica ciò che mi hai detto di fare...

resta il problema che se inserisco un numero negativo, o una coppia di caratteri, la funzione "check" non da il risultato sperato (frase di errore), bensì mi rimanda all'inizio della funzione menu...

queste sono le due funzioni allo stato attuale... come dovrei modificarle esattamente?

preferirei lasciare le funzioni divise, in modo da poter riutilizzare la "check" anche per menu più grandi...

Codice:
void menu3opzioni(char titolo[60], char sottotitolo[60], char opzioneA[60], char opzioneB[60], char opzioneC[60]) {
	printf("\n%s", titolo); 
	printf("\n%s", sottotitolo); 
	printf("\n%s", opzioneA);
	printf("\n%s", opzioneB);
	printf("\n%s", opzioneC);
	printf("\n\n");

	do {	
		scanf("%s", &grade_menu);
		check('3', grade_menu);
	} while (grade_menu != grade_check);
	
}



void check(char numero_opzioni, char valore_immesso) {

	if ((valore_immesso >= 0) && (valore_immesso < numero_opzioni)) {
		grade_check = valore_immesso;
	}
	else {
		printf("Scelta non valida. Inserire un nuovo valore.\n");
		grade_check = -1;
	}
}

nel frattempo, vi pongo un altro quesito: come faccio a creare una funzione che mi stampi "Premere INVIO per proseguire" e che faccia proprio quello che dice?

io ho scritto questa ma, giustamente, prima dell'invio si aspetta l'immissione di un carattere...

Codice:
void wait(void){
	int invio;
	
	printf("Premere INVIO per proseguire");
	scanf("%d", &invio);
}

perdonate la mia ignoranza... ma sono proprio niubbo...

grazie mille di nuovo
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel
negator136 è offline   Rispondi citando il messaggio o parte di esso
Old 31-10-2005, 19:23   #12
17Qwerty71
Senior Member
 
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 309
Quote:
Originariamente inviato da negator136
nel frattempo, vi pongo un altro quesito: come faccio a creare una funzione che mi stampi "Premere INVIO per proseguire" e che faccia proprio quello che dice?

io ho scritto questa ma, giustamente, prima dell'invio si aspetta l'immissione di un carattere...

Codice:
void wait(void){
	int invio;
	
	printf("Premere INVIO per proseguire");
	scanf("%d", &invio);
}

perdonate la mia ignoranza... ma sono proprio niubbo...

grazie mille di nuovo
Praticamente fai la stessa cosa che hai fatto con getch per ricevere i numeri del menù

while(getch() != '\r') ;

In pratica questo ciclo continua ad eseguire il ciclo (e quindi a chiederti un carattere) fino a che tu non premi invio (che nell'ascii corrisponde al numero 13 o semplicemente '\r').
Forse ti chiederai, il carattere di andare a capo non era '\n'?
Si anche quello, ma quando si va a capo linea (e quidni si preme invio) la tastiera invia due caratteri, il '\r' che va all'inizio della riga e subito dopo il '\n' che va nella riga sotto. Fatto stà quindi che occorre controllare se viene ad esserci il carattere '\r' e non '\n'.
__________________
17Qwerty71 è offline   Rispondi citando il messaggio o parte di esso
Old 01-11-2005, 10:05   #13
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da negator136
[code]do {
scanf("%s", &grade_menu);
check('3', grade_menu);
} while (grade_menu != grade_check);
Non usare "%s" con tanta leggerezza. È il metodo più veloce, ma anche quello più sbagliato. In questo modo il tuo programma non aspetterà la sola pressione dii un tasto, leggerà un'intera stringa. Stringa che potrebbe anche essere molto grande e causare buffer overflow. Spiego meglio: una stringa viene salvata in memoria in un indirizzo ed è costituita da una serie di caratteri terminata dal carattere nullo (con valore ASCII zero). Potresti scrivere una stringa anche così:
Codice:
char stringa[5] = {'h', 'e', 'l', 'l', 'o', 0};
Insomma, quando tu chiami scanf in quel modo, scanf riempirà un numero di caratteri corrispondente alla lunghezza della stringa immessa nella memoria che ha come inizio l'indirizzo della variabile grade_menu (che però conterrà solo un carattere quando la leggerai, perché la dimensione è char). In questo modo, se hai altre variabili con un indirizzo vicino, rischi di modificare anche quelle. Per il tuo programma potrebbe non essere una cosa molto importante, ma per cose più complesse sarebbe un rischio serio per la stabilità.

ciao
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!

Ultima modifica di DanieleC88 : 01-11-2005 alle 10:19.
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 01-11-2005, 15:01   #14
17Qwerty71
Senior Member
 
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 309
Quote:
Originariamente inviato da DanieleC88
Non usare "%s" con tanta leggerezza. È il metodo più veloce, ma anche quello più sbagliato. In questo modo il tuo programma non aspetterà la sola pressione dii un tasto, leggerà un'intera stringa. Stringa che potrebbe anche essere molto grande e causare buffer overflow. Spiego meglio: una stringa viene salvata in memoria in un indirizzo ed è costituita da una serie di caratteri terminata dal carattere nullo (con valore ASCII zero). Potresti scrivere una stringa anche così:
Codice:
char stringa[5] = {'h', 'e', 'l', 'l', 'o', 0};
Insomma, quando tu chiami scanf in quel modo, scanf riempirà un numero di caratteri corrispondente alla lunghezza della stringa immessa nella memoria che ha come inizio l'indirizzo della variabile grade_menu (che però conterrà solo un carattere quando la leggerai, perché la dimensione è char). In questo modo, se hai altre variabili con un indirizzo vicino, rischi di modificare anche quelle. Per il tuo programma potrebbe non essere una cosa molto importante, ma per cose più complesse sarebbe un rischio serio per la stabilità.

ciao
Una cosa da chiederti. Ma quindi se io dichiaro un'array di 10 char e l'utente ne immette più di tale numero i rimanenti quindi (quelli dopo la 11esima posizione) vengono scritti ugualmente in memoria?
Pensavo che non venivano presi in considerazione
__________________
17Qwerty71 è offline   Rispondi citando il messaggio o parte di esso
Old 01-11-2005, 16:13   #15
negator136
Senior Member
 
L'Avatar di negator136
 
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
dal momento che, durante la compilazione, non mi riconosce il comando getch(), ho creato questa funzione...

Codice:
void wait(void){
	printf("Premere INVIO per proseguire");
	while(getchar() != '\r');
}
perchè non va? posso premere invio o qualsiasi altro carattere quante volte voglio, ma non esce dal ciclo e non passa alla funzione successiva

funzione invece in questo modo:

Codice:
void wait(void){
	printf("Premere A e INVIO per proseguire");
	while(getchar() != 'a');
}
ma non mi piace perchè non è quello che avevo in mente...


idee?
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel

Ultima modifica di negator136 : 01-11-2005 alle 16:15.
negator136 è offline   Rispondi citando il messaggio o parte di esso
Old 01-11-2005, 17:36   #16
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da 17Qwerty71
Una cosa da chiederti. Ma quindi se io dichiaro un'array di 10 char e l'utente ne immette più di tale numero i rimanenti quindi (quelli dopo la 11esima posizione) vengono scritti ugualmente in memoria?
Pensavo che non venivano presi in considerazione
Prova tu stesso.
Codice:
#include <string.h>
#include <stdio.h>

int main(int argc, char * argv[])
{
  char prova = '-';
  char provetta = '-';

  strcpy(&prova, "01");
  printf("prova: %c, provetta: %c\n", prova, provetta);
  return 0;
}
Come vedi, i due caratteri vengono dichiarati uno di seguito all'altro e vengono inizializzati al carattere '-'. Quando strcpy prova a copiare la stringa "01" nell'indirizzo di "prova" (&prova), il secondo carattere finirà in "provetta".
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 01-11-2005, 21:38   #17
negator136
Senior Member
 
L'Avatar di negator136
 
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
Quote:
Originariamente inviato da negator136
dal momento che, durante la compilazione, non mi riconosce il comando getch(), ho creato questa funzione...

Codice:
void wait(void){
	printf("Premere INVIO per proseguire");
	while(getchar() != '\r');
}
perchè non va? posso premere invio o qualsiasi altro carattere quante volte voglio, ma non esce dal ciclo e non passa alla funzione successiva

funzione invece in questo modo:

Codice:
void wait(void){
	printf("Premere A e INVIO per proseguire");
	while(getchar() != 'a');
}
ma non mi piace perchè non è quello che avevo in mente...


idee?
nessuno sa come risolvere questo problema?
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel
negator136 è offline   Rispondi citando il messaggio o parte di esso
Old 02-11-2005, 20:26   #18
negator136
Senior Member
 
L'Avatar di negator136
 
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
up
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel
negator136 è offline   Rispondi citando il messaggio o parte di esso
Old 03-11-2005, 15:34   #19
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da negator136
nessuno sa come risolvere questo problema?
Semplice: non riceve mai quel carattere, perciò il ciclo non potrà mai terminare. Quando premi "invio", il carattere inviato è '\n', non '\r'. '\n', infatti, significa proprio "new line", indica che il cursore deve scendere di una linea, ed è il carattere generato dalla pressione di "invio". '\r', invece, è il "carriage return", che fa tornare il cursore all'inizio della riga.
Modifica così:
Codice:
printf("Premere INVIO per continuare...");
while (getchar() != '\n');
ciao
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
Grazie a VLT è stata misurata dir...
Blue Origin annuncia un aerofreno ripieg...
Blue Origin annuncia una nuova versione ...
LG UltraFine evo 6K: il primo monitor al...
DJI cambia direzione: investe in Elegoo ...
Black Friday Narwal 2025: risparmi da ca...
Phishing evoluto contro Apple ID: caso f...
Prestazioni in discesa nei giochi? NVIDI...
Addio ai banner dei cookie? L'UE spinge ...
Le offerte Black Friday per gli smartpho...
Il controllo qualità degli iPhone...
Qualcomm Snapdragon X Elite vola con il ...
A2RL Season 2: storia, innovazione e sor...
Core Ultra Series 3: Intel conferma l'ev...
Black Friday Amazon: la GeForce RTX 5070...
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: 07:09.


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