Newsgroup: it.comp.lang.c
Titolo: Variabili usate senza essere dichiarate (programma di esempio showip.c tratto dal libro Guide to Network programming

Ciao a tutti.
 
Stavo guardando il testo citato del subject per cercare di capire qualcosa nella realizzazione di programmi c in grado di effettuare connessioni di rete.
 
mi sono stupito nel vedere le seguenti espressioni:
struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
oppure
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;
dove ipv4 ed ipv6 sono usate per la prima volta qui e non sono state dichiarate.
L'intero codice lo trovate qui 
http://beej.us/guide/bgnet/examples/showip.c
 
(si tratta di una quarantine di righe).
Come mai tutto ciò è possibile?
Grazie in anticipo.

 dove ipv4 ed ipv6 sono usate per la prima volta qui e non sono state dichiarate.
 
Leggi attentamente il codice, in realta' si tratta di una *dichiarazione*
di variabile con annessa *assegnazione*.
 
Concettualmente non e' diverso da trovare:
int x = 42;
 
ciao
Giacomo
 
 
 
 

 struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
 
� una dichiarazione di variabile e contestualmente, la sua definizione, 
come se fosse:
 
struct sockaddr_in *ipv4;
ipv4 = (struct sockaddr_in *)p->ai_addr;
 
Riccardo
 


Ho risolto l'arcano.
Sono vittima, purtroppo, delle abitudini.
A differenza del C++ in cui le dichiarazioni di possono fare ovunque nel sorgente, in C ho sempre dichiarato le variabili in testa alla subroutine.
 
Una mia ignoranza invece era quella che è possibile dichiarare variabili 
all'interno di un blocco (fino ad oggi non avevo mai visto una cosa del genere).
Dentro il blocco if contenuto nel blocco for sono allora state dichiarate delle variabili "locali al blocco".
 
Ho imparato un'altra cosa.
 
E sempre nel medesimo codice c'è un utilizzo di sizeof relativo a delle variabili che non avevo mai visto ossia
 
int n;
struct StructType data;
 
n = sizeof data;
 
 
Ciao e grazie 
 

 Ho imparato un'altra cosa.
 
Se non ricordo male, nel C99 è possibile dichiarare le variabili anche 
all'interno di un blocco e non solo all'inizio. Qualcuno conferma?
 


confermo.
AA
 
 

 AA
 
<OT>
Domanda per cortexA15 che, a giudicare dal nome, sono sicuro saprà la risposta..
Per quale motivo con i nomi sono passati dallo A9 allo A15? :D
</OT>
Ciao!

 n = sizeof data;
 
Si, sizeof si puo' applicare a tipi e anche a variabili.
 
Altra cosa molto sorprendente: puoi usare un puntatore
dereferenziato anche senza averlo inizializzato, questo
viene usato da qualche "virtuoso" per scrivere codice
come questo:
 
TIPO *p;
...
p = malloc( sizeof *p ); // corrisponde a malloc(sizeof TIPO)
 
Ha come vantaggio che puoi comodamente capiaincollare
questo codice senza modificare l'argomento di malloc
perche "lo deduce da solo" ma francamente lo trovo
poco intuitivo e quindi tendo a non usarlo mai! :)
 
ciao
Giacomo
 
 
 
 
 
 
 

 Ciao!
Perche' e' circa 15 volte piu' performante dell' ARM11?
 

 Perche&#39; e&#39; circa 15 volte piu&#39; performante dell&#39; ARM11?
 
Sicuramente è una cosa di marketing, solo che mi sembrava strano ;) Ancora non mi sono guardato le specifiche se è per questo, sono ancora fermo al Cortex-A9.
Ciao!


Oppure perche' ha una pipeline di istruzioni a 15 stadi?
..pero' l' A8 ha una pipeline a 13 elementi :-(
non torna nemmeno questa !
Per l'A15 non mi pare ci sia ancora una tiratura di massa,
ci penseranno i prossimi Smart-Phone ad accellerare lo
sviluppo!
Tra l'altro, il prossimo salto e' l' architettura V8 a 64bit
con gli A32 e A64...
la vedo dura per gli Intel & simili....
ciao!

 ciao!
 
Visto che siamo OT ormai rispondo :)
Fino a qualche anno fa sarei stato contento di veder sparire gli x86 in favore degli ARM: molto più semplici e meno "sputtanati".
Ultimamente però ho avuto più di una volta modo di ricredermi: ok, non hanno la segmentazione di memoria ma hanno cinque modalita principali al posto di tre (in media senza andare a vedere i processori dove sono attivi/disattivi jatzelle/thumb2/3/etc, per non contare in "secure", dove cambia il behaviour di _tutte le altre_). Non esiste *nessun* chipset standard per il retrieve del mapping dell'IO (ovviamente, sennò come maschererebbero l'interno degli SoC proprietari?), e quando andiamo sullo SMP arriviamo alle lacrime (almeno sugli x86 ci sono i lapic/apic su tutte le piattaforme).
Per adesso vado avando usando un po' entrambi, e sono sicuro che gli ARM soppianteranno gli x86, ma non so noi programmatori quanto andremo a guadagnarci...
Ciao!

 Ciao!
 
Scusate l'OT, ma sono proprio curioso.
 
Immagino usiate i Cortex-A per lavoro e sembra anche abbastanza a basso 
livello (non vi limitate a scrivere una classica applicazione per un 
Linux portato su ARM che, magari, � gi� bello e pronto sulla piattaforma 
hw).
 
Mi chiedo, esiste in Italia qualcuno che lavora su questi processori? 
Che tipo di applicazioni? Mi piacerebbe entrare in questo mondo.

 Che tipo di applicazioni? Mi piacerebbe entrare in questo mondo.
 
Ci sono vari livelli.. In generale la maggior parte degli sviluppatori sì, hanno sotto linux e scrivono come se fossero su un normale PC. Altri utilizzano OS diversi (solitamente per non usare linux è per qualcosa di realtime, anche se ho visto che negli ultimi anni cominciano a usare linux anche per questo), ma in ogni caso molto pochi hanno necessità di conoscere i dettagli dell'hardware ad un livello basso, se non per capire cosa può essere più o meno performante (ma questo, anche se in misura ridotta, si fa anche a livello di PC) o, forse soprattutto, per scegliere il processore o la scheda adatta (di micro ce ne sono un'infinità, specializzati in questo o in quell'altro compito).
In ogni caso normalmente quando hai sotto una scheda che monta quel tipo di processore sei abbastanza ad alto livello, mentre se usi un ARM meno potente non hai tante caratteristiche di cui preoccuparti e, come quando utilizzi altri micro, magari vai di assembly a scrivere diretto sulle porte di I/O :)
Nel mio caso è un hobby, nel tempo libero (e ce n'è poco) scrivo il mio OS (essì, e sono quasi 10 anni ora...) e ultimamente stavo facendo il porting su ARM (perché non posso avere il mio sistema operativo sul mio smartphone? :D); quindi mi interesso anche a dettagli di basso livello che normalmente interessano solo a chi fa elettronica o programmazione kernel. Non è utile a nessuno, ma a me rilassa e credo che dia quella conoscenza globale in più che aiuta nel programmare anche ad altissimo livello.
Tendenzialmente ti direi che in Italia a livello hobbistico ci sono tantissimi programmatori come me; nel mondo lavorativo invece ho visto che si tende a trovare la soluzione già pronta, per cui di smanettoni low-level ne vedo sempre meno. Questa è una mia impressione personale, magari altri hanno esperienze diverse!
Ciao!
 
P.S. Ovviamente con "dettagli" intendevo non le specifiche di bus, porte, clock o qualsiasi altra caratteristica necessaria ad interfacciare al processore un "pezzo esterno": questo per gli elettronici è pane quotidiano. Intendevo cose come la gestione della pipeline, le politiche di caching, la gestione della memoria virtuale e altre amenità solitamente utili solo appunto a chi programma bare-metal.

 Che tipo di applicazioni? Mi piacerebbe entrare in questo mondo.
Per quello che mi riguada, dove lavoro si usano dai ppc (MPC52xx)
freescale ai micro a 16/32 bit: PIC AVR e simili.. ora sostituiti
in toto da ARM7,M0,M3 NPX.
I cortex Ax li usiamo per CPU un poco piu' corpose e ci facciamo
girare sopra Linux o QNX per applicazioni real-time piu� critiche.
Si applicano a controlli industriali, movimentazione assi , controllo
di processo o applicazioni custom di ogni tipo :-)
...purtroppo il mercato in Italia in questo settori sta'
calando di brutto ;-(
AA.