Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Label dopo if

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Label dopo if

Messaggioda Foto UtenteEcoTan » 2 dic 2022, 8:55

Prendiamo per esempio questo pezzo di codice:
Codice: Seleziona tutto
if (a==5) goto pure;
if(b==4)
pure: c=18;

Lo so che si può fare diversamente, che è contorto eccetera. Una cosa simile mi serve, pare che funzioni ma mi lascia dei dubbi. Si può saltare dentro una if?
Avatar utente
Foto UtenteEcoTan
7.432 4 12 13
Expert EY
Expert EY
 
Messaggi: 5210
Iscritto il: 29 gen 2014, 8:54

0
voti

[2] Re: Label dopo if

Messaggioda Foto Utentestefanopc » 2 dic 2022, 9:28

Di che ambiente di sviluppo stiamo parlando?
Potresti dare qualche informazione aggiuntiva.
In ogni caso
https://www.okpedia.it/goto-salti-incon ... nguaggio-c

Riguardo ad if io preferisco delimitare con le parentesi {} ciò che segue per non avere dubbi .
Naturalmente io sono un autodidatta aspetta i consigli di un esperto.
Ciao
600 Elettra
Avatar utente
Foto Utentestefanopc
11,9k 5 9 13
Master EY
Master EY
 
Messaggi: 4933
Iscritto il: 4 ago 2020, 9:11

0
voti

[3] Re: Label dopo if

Messaggioda Foto Utentepusillus » 2 dic 2022, 10:03

se è in C il "goto" è altamente sconsigliato come buona pratica di programmazione.
Avatar utente
Foto Utentepusillus
3.147 3 6 11
Expert EY
Expert EY
 
Messaggi: 1010
Iscritto il: 5 mar 2016, 15:19
Località: Latina

0
voti

[4] Re: Label dopo if

Messaggioda Foto UtenteWALTERmwp » 2 dic 2022, 10:29

EcoTan ha scritto:(...) Si può saltare dentro una if?
intendi se "dall'interno" di un if senza graffe può essere eseguito il salto?
Direi di si; poi, come osservato, non si può escludere che un compilatore rispetto ad un altro interpreti lo statement come una eccezione perché assenti le parentesi graffe.
Ad alto livello è solo una istruzione e l'indirizzo un parametro; ovvio che nello specifico basta provare.
L'eventuale incompatibilità per il banco di memoria di destinazione, ammesso ci sia, dovrebbe essere sempre verificata, penso.
Per il resto non rilevo controindicazioni, brutalità a parte.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
29,7k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8820
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[5] Re: Label dopo if

Messaggioda Foto Utentedjnz » 2 dic 2022, 12:03

stefanopc ha scritto:Riguardo ad if io preferisco delimitare con le parentesi {} ciò che segue per non avere dubbi

Infatti è una delle regole di buona codifica: https://barrgroup.com/embedded-systems/books/embedded-c-coding-standard (General Rules → Braces)

EcoTan ha scritto:Si può saltare dentro una if?

Il goto in qualsiasi linguaggio è incondizionato e condizionato. Non poter effettuare un salto condizionato da if, ma solo incondizionato, sarebbe assurdo perfino per lo spaghetti-code, e in linguaggi più arcaici o in assembly, dopo una condizione ci può andare appunto solo un salto. Però bisogna fare attenzione a saltare solo in punti interni alla stessa funzione per garantire l'integrità dello stack (in teoria il compilatore dovrebbe lamentarsi se si prova a fare altrimenti).
Una domanda ben posta è già mezza risposta.
Avatar utente
Foto Utentedjnz
1.315 1 4 5
Expert
Expert
 
Messaggi: 668
Iscritto il: 26 lug 2020, 14:52

1
voti

[6] Re: Label dopo if

Messaggioda Foto UtenteGioArca67 » 2 dic 2022, 14:00

EcoTan ha scritto:Prendiamo per esempio questo pezzo di codice:
Codice: Seleziona tutto
if (a==5) goto pure;
if(b==4)
pure: c=18;

[...] ma mi lascia dei dubbi.

Meno male

EcoTan ha scritto:Si può saltare dentro una if?



Ma per il codice presentato è del tutto inutile il goto... basta fare
Codice: Seleziona tutto
if(a==5 || b==4) c=18;

Se entri nell'if b==4 anche da altre parti può avere un senso (forse). Comunque, ovviamente, l'eventuale statement false non viene eseguito se si entra nello statement true con un goto.
Avatar utente
Foto UtenteGioArca67
3.917 4 6 9
Master
Master
 
Messaggi: 3893
Iscritto il: 12 mar 2021, 9:36

0
voti

[7] Re: Label dopo if

Messaggioda Foto UtenteEcoTan » 2 dic 2022, 16:08

WALTERmwp ha scritto:intendi se "dall'interno" di un if senza graffe può essere eseguito il salto?

"verso l'interno", non "dall'interno". Le graffe possono esserci, anzi ci saranno sicuramente se le istruzioni dentro la if sono più di una. Anche dalle altre risposte, ricavo la conclusione che il salto si può fare, al più sarà da verificare, ma se funziona una volta funzionerà sempre nel senso che non ci sono mine sotterrate tipo stack overflow. L'ambiente è il C di MPLABX.
Avatar utente
Foto UtenteEcoTan
7.432 4 12 13
Expert EY
Expert EY
 
Messaggi: 5210
Iscritto il: 29 gen 2014, 8:54

0
voti

[8] Re: Label dopo if

Messaggioda Foto UtenteThEnGi » 2 dic 2022, 16:38

Al C non piace il GOTO, non sai mai dove va a finire. Con un linguaggio basso sai di preciso cosa compie il prgoramma invece con il C (e a salire) non sai cosa ci sta nel mezzo.
Perciò lascialo al assembly dove sta di casa.
Questo non vuol dire che non può funzionare ma semplicemente che è buona norma non usarlo

La soluzione di Foto UtenteGioArca67 è la più facile

O_/
Avatar utente
Foto UtenteThEnGi
2.215 3 6 9
Expert EY
Expert EY
 
Messaggi: 2228
Iscritto il: 6 ott 2022, 18:43

0
voti

[9] Re: Label dopo if

Messaggioda Foto UtenteGioArca67 » 2 dic 2022, 18:10

Inoltre in C99 sono stati introdotti i VLA (Variable Length Array) e col goto non puoi "volare", in avanti sopra una VLA, es.:
Codice: Seleziona tutto
goto lab1; // OK: going into the scope of a regular variable
    int n = 5;
lab1:; // Note, now n is uninitialized, as if declared by int n;

     goto lab2;   // Throws Error: going into the scope of VM types
     double a[n]; // a VLA

lab2:;


Invece in questo non si arrabbia:
Codice: Seleziona tutto
{
   int n = 1;
label:;
   int a[n]; // re-allocated 10 times, each with a different size
   if (n++ < 10) goto label; // leaving the scope of a VM
}

ed ogni volta che esce dallo scope della VLA essa viene deallocata automaticamente e quindi, quando trova di nuovo int a[n]; la rialloca a runtime (solo C99)
Avatar utente
Foto UtenteGioArca67
3.917 4 6 9
Master
Master
 
Messaggi: 3893
Iscritto il: 12 mar 2021, 9:36

0
voti

[10] Re: Label dopo if

Messaggioda Foto UtenteEtemenanki » 2 dic 2022, 18:15

pusillus ha scritto:se è in C il "goto" è altamente sconsigliato come buona pratica di programmazione.

Ma come ... "10 GOTO 10" non era il comando piu utile inventato dai programmatori ? :mrgreen: :mrgreen: :mrgreen:
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.
Avatar utente
Foto UtenteEtemenanki
7.909 3 6 10
Master
Master
 
Messaggi: 5016
Iscritto il: 2 apr 2021, 23:42
Località: Dalle parti di un grande lago ... :)

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti