Torna indietro   Hardware Upgrade Forum > Software > Programmazione

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
ASUS Expertbook PM3: il notebook robusto per le aziende
ASUS Expertbook PM3: il notebook robusto per le aziende
Pensato per le necessità del pubblico d'azienda, ASUS Expertbook PM3 abbina uno chassis particolrmente robusto ad un pannello da 16 pollici di diagonale che avantaggia la produttività personale. Sotto la scocca troviamo un processore AMD Ryzen AI 7 350, che grazie alla certificazione Copilot+ PC permette di sfruttare al meglio l'accelerazione degli ambiti di intelligenza artificiale
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 02-09-2014, 16:42   #1
mister bianchi
Junior Member
 
Iscritto dal: Sep 2014
Messaggi: 4
Array e dimensione MAX

Ciao a tutti,

sto imparando le basi del C, ho fatto questo piccolo programmino per imparare gli array.

Codice:
#include<stdio.h>

int main()

{
	int intero[5], i;
	
	for (i=0; i<10; i++)
		{
			intero[i]=i;
		}
       for (i=0; i<10; i++)
                {
			printf("intero[i]: %d\n", intero[i]);
		}
		
	return 0;
}
Come mai anche se ho dichiarato l'array con dimensione 5 riesco comunque a scrivere oltre questa dimensione? Non dovrei ottenere un errore?
mister bianchi è offline   Rispondi citando il messaggio o parte di esso
Old 02-09-2014, 16:58   #2
Silvia2003
Member
 
Iscritto dal: Dec 2003
Messaggi: 70
"Crocedelizia" del c/c++... lui te lo lascia fare ma il risultato è imprevedibile (probabile crash completo!).

Se vuoi che il compilatore si "accorga" dell'errore cambia linguaggio.
Silvia2003 è offline   Rispondi citando il messaggio o parte di esso
Old 02-09-2014, 17:04   #3
mister bianchi
Junior Member
 
Iscritto dal: Sep 2014
Messaggi: 4
Non voglio cambiare linguaggio (almeno per ora! ), voglio capire perchè me lo fa fare senza darmi nè errori nè warnings. In pratica cosa succede? Vado a scrivere fuori dall'array? Eseguendo il programma tutto fila liscio senza crash come se avessi realmente dichiarato un array di 10 elementi.
mister bianchi è offline   Rispondi citando il messaggio o parte di esso
Old 02-09-2014, 17:20   #4
Silvia2003
Member
 
Iscritto dal: Dec 2003
Messaggi: 70
Quote:
Non voglio cambiare linguaggio
e allora bisogna accettarlo per com'è, apprezzandone le caratteristiche (è parte della "potenza" di C e C++) e studiandolo per evitare di incappare in errori.

Te lo fa fare semplicemente perché non è previsto alcun controllo. Il fatto che il programma possa girare senza produrre alcun errore è del tutto casuale (e insidioso in fase di debug).
Silvia2003 è offline   Rispondi citando il messaggio o parte di esso
Old 02-09-2014, 17:23   #5
mister bianchi
Junior Member
 
Iscritto dal: Sep 2014
Messaggi: 4
Quote:
Originariamente inviato da Silvia2003 Guarda i messaggi
(e insidioso in fase di debug).
Cioè? Scusa ma sono un neofita...
mister bianchi è offline   Rispondi citando il messaggio o parte di esso
Old 02-09-2014, 17:52   #6
Silvia2003
Member
 
Iscritto dal: Dec 2003
Messaggi: 70
Significa che quando il tuo programma andrà in errore (e scrivendo oltre i limiti del dimensionamento dell'array primo o poi accadrà) sarà più ostico trovare l'origine di tale errore: l'insidia sta proprio nel fatto che eseguendo più volte il programma non sempre si ottiene l'errore (è un errore ottenibile a run-time).

Fai qualche test ad esempio dichiarando qualche altro array o scrivendo qualche elemento in più dei 5 aggiuntivi proposti nell'esempio...
Silvia2003 è offline   Rispondi citando il messaggio o parte di esso
Old 02-09-2014, 17:55   #7
Silvia2003
Member
 
Iscritto dal: Dec 2003
Messaggi: 70
Prova questo esempio...

Codice:
#include <stdio.h>

int main()
{
    int ar1[5], ar2[10], i;
    for(i = 0; i < 20; ++i) {ar1[i] = i;}
    for(i = 0; i < 10; ++i) {ar2[i] = i;}
    for(i = 0; i < 10; ++i) {
        printf("%d - %d\n",ar1[i], ar2[i]);
    }
    return 0;
}
Silvia2003 è offline   Rispondi citando il messaggio o parte di esso
Old 02-09-2014, 18:11   #8
mister bianchi
Junior Member
 
Iscritto dal: Sep 2014
Messaggi: 4
Ottengo questo

Codice:
0 - 0
1 - 1
2 - 2
3 - 3
4 - 4
5 - 5
6 - 6
7 - 7
8 - 8
9 - 9
Errore di segmentazione
mister bianchi è offline   Rispondi citando il messaggio o parte di esso
Old 02-09-2014, 18:26   #9
Silvia2003
Member
 
Iscritto dal: Dec 2003
Messaggi: 70
si è solo "stressato" maggiormente l'esempio (aggiunto un array, scritto qualche elemento in più...) e, improvvisamente, ciò che prima sembrava funzionare ora non funziona più.

In un esempio così semplice è molto semplice capire l'origine del problema ma, prova a pensare cosa accadrebbe in codice molto più corposo e frazionato.
Silvia2003 è offline   Rispondi citando il messaggio o parte di esso
Old 02-09-2014, 21:00   #10
Silvia2003
Member
 
Iscritto dal: Dec 2003
Messaggi: 70
Io ho compilato con GCC abilitando tutti i possibili warnings senza alcun avviso.

Non ho provato con VC.
Silvia2003 è offline   Rispondi citando il messaggio o parte di esso
Old 02-09-2014, 21:22   #11
Silvia2003
Member
 
Iscritto dal: Dec 2003
Messaggi: 70
... anche VC 2013 compila senza problemi

Codice:
Impostazioni compilatore C/C++
Livello avvisi : Abilita tutti gli avvisi (/Wall)
Considera gli avvisi come errori : Si (/WX)
In ogni caso, a prescindere dal possibile specifico supporto eventualmente offerto dal compilatore (quale?) rimane il fatto che il linguaggio consente di farlo: C e C++ lasciano al programmatore la responsabilità di gestire questo e altri aspetti (qualsiasi testo di base utilizzato per apprendere il C o il C++ credo ponga in buona evidenza questa caratteristica).
Silvia2003 è offline   Rispondi citando il messaggio o parte di esso
Old 02-09-2014, 21:30   #12
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2780
Quote:
Originariamente inviato da Silvia2003 Guarda i messaggi
Prova questo esempio...

Codice:
#include <stdio.h>

int main()
{
    int ar1[5], ar2[10], i;
    for(i = 0; i < 20; ++i) {ar1[i] = i;}
    for(i = 0; i < 10; ++i) {ar2[i] = i;}
    for(i = 0; i < 10; ++i) {
        printf("%d - %d\n",ar1[i], ar2[i]);
    }
    return 0;
}
Una curiosità: ultimamente vedo spesso l'incremento di i nei cicli utilizzando un preincremento invece di un postincremento... c'è un motivo o è solo cambiata la moda? Immagino la seconda ma sono curioso anche dell'origine di questa moda.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 02-09-2014, 22:04   #13
Silvia2003
Member
 
Iscritto dal: Dec 2003
Messaggi: 70
Non è un moda ma una questione di performance.

il pre-incremento (++i) equivale a:
i = i +1
il post-incremento (i++) equivale a:
tmp = i; //(necessità di conservare il valore prima dell'incremento = valore ritornato)
i = i + 1;
Silvia2003 è offline   Rispondi citando il messaggio o parte di esso
Old 02-09-2014, 22:31   #14
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2780
Interessante, grazie.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 03-09-2014, 06:32   #15
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da Silvia2003 Guarda i messaggi
Non è un moda ma una questione di performance.

il pre-incremento (++i) equivale a:
i = i +1
il post-incremento (i++) equivale a:
tmp = i; //(necessità di conservare il valore prima dell'incremento = valore ritornato)
i = i + 1;
A dire il vero ci sono molti processori che hanno nativamente sia istruzioni di post sia di pre incremento/decremento, e il post incremento risulta decisamente piu' performante.
Quanto scrivi e' vero soprattutto quando si devono manipolare oggetti, in quel caso occorre sicuramente ricorrere implicitamente ad una variabile temporanea
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 03-09-2014, 07:33   #16
Silvia2003
Member
 
Iscritto dal: Dec 2003
Messaggi: 70
Può essere ma si tratta ugualmente di good-practice. I compilatori eseguono comunque una serie di ottimizzazioni più o meno "aggressive" ma una buona codifica iniziale aiuta sempre.

Premesso che la differenza in termini di tempo di esecuzione tra pre-incremento e post-incremento è praticamente trascurabile (almeno nel caso dell'esempio proposto), preferisco ricorrere ad una soluzione piuttosto che l'altra in base alla "logica" necessità.
Silvia2003 è offline   Rispondi citando il messaggio o parte di esso
Old 03-09-2014, 08:03   #17
Freaxxx
Senior Member
 
L'Avatar di Freaxxx
 
Iscritto dal: Dec 2006
Messaggi: 3808
Quote:
Originariamente inviato da mister bianchi Guarda i messaggi
Ciao a tutti,

sto imparando le basi del C, ho fatto questo piccolo programmino per imparare gli array.

Codice:
#include<stdio.h>

int main()

{
	int intero[5], i;
	
	for (i=0; i<10; i++)
		{
			intero[i]=i;
		}
       for (i=0; i<10; i++)
                {
			printf("intero[i]: %d\n", intero[i]);
		}
		
	return 0;
}
Come mai anche se ho dichiarato l'array con dimensione 5 riesco comunque a scrivere oltre questa dimensione? Non dovrei ottenere un errore?
Accedere a locazioni di memoria contenute oltre il limite espresso al momento della dichiarazione dell'array è undefined behaviour in C .

In altre parole il linguaggio non asserisce nulla di definitivo e specifico sull'argomento e il compilatore non è tenuto a fare o dire nulla; si suppone che tu in qualità di programmatore C semplicemente non dovresti mai fare nulla di simile .
Freaxxx è offline   Rispondi citando il messaggio o parte di esso
Old 03-09-2014, 08:34   #18
Silvia2003
Member
 
Iscritto dal: Dec 2003
Messaggi: 70
Quote:
... tu in qualità di programmatore C semplicemente non dovresti mai fare nulla di simile ...
L'uso del condizionale sintetizza pienamente il concetto!
Silvia2003 è offline   Rispondi citando il messaggio o parte di esso
Old 05-09-2014, 18:11   #19
das
Senior Member
 
Iscritto dal: Jan 2001
Città: Livorno
Messaggi: 1372
Quote:
Originariamente inviato da mister bianchi Guarda i messaggi
Ciao a tutti,

sto imparando le basi del C, ho fatto questo piccolo programmino per imparare gli array.

Codice:
#include<stdio.h>

int main()

{
	int intero[5], i;
	
	for (i=0; i<10; i++)
		{
			intero[i]=i;
		}
       for (i=0; i<10; i++)
                {
			printf("intero[i]: %d\n", intero[i]);
		}
		
	return 0;
}
Come mai anche se ho dichiarato l'array con dimensione 5 riesco comunque a scrivere oltre questa dimensione? Non dovrei ottenere un errore?
Non c'è modo di sapere che è sbagliato prima di eseguire il codice. Come fa il compilatore a sapere che i sarà maggiore di 5 ? Deve interpretare il significato del comando for e delle eventuali formule. Infatti nel mezzo ci potrebbe essere scritto
Quote:
i=i-3
anche questa formula dovrebbe essere valutata. In altre parole il codice dovrebbe essere eseguito.

Ma quando lo esegui non sai cosa c'è al di là della quinta locazione di memoria, magari c'è qualcosa che in quel frangente non serve più, per cui anche sovrascrivendola non si hanno errori.

Però non c'è garanzia.

Diverso è se scrivi i[7]=2; allora il compilatore sa che l'array è al massimo di 5 ma tu stai scrivendo nella 7ma locazione
das è offline   Rispondi citando il messaggio o parte di esso
Old 06-09-2014, 08:41   #20
Silvia2003
Member
 
Iscritto dal: Dec 2003
Messaggi: 70
Non credo, prova questo

Codice:
int main()
{
    int i[5];
    i[7] = 500;
    printf("%d", i[7]);
    return 0;
}
... compilazione pulita e senza alcun warning (GCC)

Codice:
x86_64-w64-mingw32-gcc.exe -Wall -pedantic -Wextra -g -Winline -Wunreachable-code -pedantic-errors -pedantic -g  -c A:\prova1\main.c -o obj\Debug\main.o
x86_64-w64-mingw32-g++.exe  -o bin\Debug\prova1.exe obj\Debug\main.o   
Output file is bin\Debug\prova1.exe with size 125.40 KB
Process terminated with status 0 (0 minute(s), 0 second(s))
0 error(s), 0 warning(s) (0 minute(s), 0 second(s))


credo di avere abilitato tutti i flag relativi ai possibili warning.
Il compilatore semplicemente non esegue alcun controllo degli indici poiché, come già stato ben evidenziato, in C (ma anche in C++) ciò non è previsto.

Ultima modifica di Silvia2003 : 06-09-2014 alle 08:43.
Silvia2003 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


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...
Recensione OnePlus 15: potenza da vendere e batteria enorme dentro un nuovo design   Recensione OnePlus 15: potenza da vendere e batt...
Col Black Friday partono anche gli scont...
I ribassi più pesanti del vero Bl...
Settimana del Black Friday: pioggia di s...
Speciale Blay Friday Dyson, sconti mai v...
I portatili più scontati del Blac...
WiFi al massimo: gli ASUS più pot...
Domotica in super sconto: tado° e Ne...
Black Friday Amazon: smartphone top a pr...
Black Friday 2025: tutte le migliori off...
Speciale Black Friday TV: 14 modelli sup...
Black Friday Amazon: le migliori offerte...
Tanti droni DJI scontati per il Black Fr...
Anche l'ISRO ha rilasciato alcune inform...
La NASA mostra le nuove immagini della c...
Superati 13.300 MT/s per DDR5: ad ASUS e...
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: 05:31.


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