Torna indietro   Hardware Upgrade Forum > Software > Programmazione

PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu
Il modello "build to order" di PCSpecialist permette di selezionare una struttura base per un sistema, personalizzandolo in base alle specifiche esigenze con una notevole flessibilità di scelta tra i componenti. Il modello Lafité 14 AI AMD è un classico notebook clamshell compatto e potente, capace di assicurare una elevata autonomia di funzionamento anche lontano dalla presa di corrente
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Nothing con il suo nuovo Phone 4(a) conferma la sua identità visiva puntando su una costruzione che nobilita il policarbonato. La trasparenza resta l'elemento cardine, arricchita da una simmetria interna curata nei minimi dettagli. Il sistema Glyph si evolve, riducendosi nelle dimensioni ma aumentando l'utilità quotidiana grazie a nuove funzioni software integrate e notifiche visive. Ecco tutti i dettagli nella recensione completa
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Nelle ultime settimane abbiamo provato la Corsair Vanguard Air 99 Wireless, una tastiera tecnicamente da gaming, ma che in realtà offre un ampio ventaglio di possibilità anche al di fuori delle sessioni di gioco. Flessibilità e funzionalità sono le parole d'ordine di una periferica che si rivolge a chi cerca un prodotto capace di adattarsi a ogni esigenza e ogni piattaforma
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 27-01-2009, 12:40   #1
Gica78R
Senior Member
 
L'Avatar di Gica78R
 
Iscritto dal: Mar 2005
Messaggi: 1653
[C] Dimensione array definita dinamicamente

Salve ragazzi!

Sto riprendendo il linguaggio C a distanza di oltre un anno, ed improvvisamente mi è crollata una certezza
Per quanto ne so, quando si definisce un array la sua dimensione deve essere nota in fase di compilazione, ed in particolare essa deve essere una costante. Ora, facendo un po' di prove, mi accorgo che compilando ed eseguendo un programma del genere:

Codice:
#include <stdio.h>

int main(void)
{
   int c;
   int DIM;
   printf("Inserisci dimensione array: ");
   scanf("%d", &DIM);
   int stringa[DIM];
   for (c = 0; c < DIM; c++)
     stringa[c] = c;
   printf("\nFine\n");
   return 0;
}
non solo non ottengo errori in compilazione (gcc dovrebbe come minimo sputarmi in faccia), ma non avviene nemmeno un segmentation fault in fase di esecuzione.

Qualcuno saprebbe spiegarmi come mai?

Preciso che uso gcc versione 4.2.4 su Linux 2.6.24 64 bit
__________________
gica78r@ncc-1701:~$ tar -c
tar: Codardamente mi rifiuto di creare un archivio vuoto
Gica78R è offline   Rispondi citando il messaggio o parte di esso
Old 27-01-2009, 12:47   #2
wizard1993
Senior Member
 
L'Avatar di wizard1993
 
Iscritto dal: Apr 2006
Messaggi: 22462
per il c99 si può fare, è il c++ che non lo supporta
__________________
amd a64x2 4400+ sk939;asus a8n-sli; 2x1gb ddr400; x850 crossfire; 2 x western digital abys 320gb|| asus g1
Se striscia fulmina, se svolazza l'ammazza
wizard1993 è offline   Rispondi citando il messaggio o parte di esso
Old 27-01-2009, 15:00   #3
Gica78R
Senior Member
 
L'Avatar di Gica78R
 
Iscritto dal: Mar 2005
Messaggi: 1653
Ho provato anche a compilare questo con g++, e non ricevo errori nemmeno a runtime...

Codice:
#include <iostream>

using namespace std;

int main(void)
{
   int d;
   
   cout << "Inserisci dimensione array: ";
   cin >> d;
   
   int vettore[d];
   
   for (int i = 0; i < d-1; i++)
     vettore[i] = i;
   
   cout << "Fatto!"<<endl;
   
   return 0;
}


EDIT: solo se compilo passando a gcc l'opzione -pedantic ricevo il warning sulla dimensione variabile dell'array, ma non un errore...
Quote:
Originariamente inviato da gcc
warning: ISO C90 forbids variable-size array ‘stringa’
__________________
gica78r@ncc-1701:~$ tar -c
tar: Codardamente mi rifiuto di creare un archivio vuoto

Ultima modifica di Gica78R : 27-01-2009 alle 15:05.
Gica78R è offline   Rispondi citando il messaggio o parte di esso
Old 27-01-2009, 15:21   #4
wizard1993
Senior Member
 
L'Avatar di wizard1993
 
Iscritto dal: Apr 2006
Messaggi: 22462
Quote:
Originariamente inviato da Gica78R Guarda i messaggi
Ho provato anche a compilare questo con g++, e non ricevo errori nemmeno a runtime...

Codice:
#include <iostream>

using namespace std;

int main(void)
{
   int d;
   
   cout << "Inserisci dimensione array: ";
   cin >> d;
   
   int vettore[d];
   
   for (int i = 0; i < d-1; i++)
     vettore[i] = i;
   
   cout << "Fatto!"<<endl;
   
   return 0;
}


EDIT: solo se compilo passando a gcc l'opzione -pedantic ricevo il warning sulla dimensione variabile dell'array, ma non un errore...
proprio perchè lo vieta il c90 ma non il c99 e visto che il gcc è un compilatore c99 quella stringa viene accettata, e la sua validità "importata" in c++
__________________
amd a64x2 4400+ sk939;asus a8n-sli; 2x1gb ddr400; x850 crossfire; 2 x western digital abys 320gb|| asus g1
Se striscia fulmina, se svolazza l'ammazza
wizard1993 è offline   Rispondi citando il messaggio o parte di esso
Old 27-01-2009, 16:03   #5
Dr. Cox
Member
 
L'Avatar di Dr. Cox
 
Iscritto dal: Jan 2009
Messaggi: 30
Quote:
Originariamente inviato da Gica78R Guarda i messaggi
Codice:
#include <stdio.h>

int main(void)
{
   int c;
   int DIM;
   printf("Inserisci dimensione array: ");
   scanf("%d", &DIM);
   int stringa[DIM];
   for (c = 0; c < DIM; c++)
     stringa[c] = c;
   printf("\nFine\n");
   return 0;
}
anche io lavoro con il gcc, in ambiente Cygwin.
se vuoi inizializzare un array puoi ovviamente farlo durante il programma, ma la dimensione (la dimensione MASSIMA) deve essere definita in modo statico, magari con un #define

il tuo frammento di codice io lo farei cosi:

Codice:
#include <stdio.h>
#include <stdlib.h>

#define MAXDIM 128

int main(void)
{
   int c, dim;
   int stringa[MAXDIM];

   printf("Inserisci dimensione array: ");
   scanf("%d", &dim);
   
   for (c = 0; c < dim; c++)
     stringa[c] = c;

   printf("\nFine\n");

   return EXIT_SUCCESS;
}
Dr. Cox è offline   Rispondi citando il messaggio o parte di esso
Old 27-01-2009, 17:14   #6
Gica78R
Senior Member
 
L'Avatar di Gica78R
 
Iscritto dal: Mar 2005
Messaggi: 1653
Quote:
Originariamente inviato da Dr. Cox Guarda i messaggi
il tuo frammento di codice io lo farei cosi:
Anch'io lo farei così, e l'ho sempre fatto così!
Però la mia era una curiosità, scaturita dopo aver letto questa frase su un libro di Kernighan e Pike del 1999 (The practice of programming) a proposito delle differenze tra C e C++:

Quote:
Anche C ha valori di tipo const, ma non possono essere usati come limite di un array, così l'istruzione enum rimane il metodo migliore in C.
Quindi ho provato a istanziare un array usando per la sua dimensione un intero costante al posto di una macro o un enum, verificando che non ottenevo alcun errore né in compilazione né a runtime; a quel punto ho provato ad istanziarlo usando addirittura una variabile, ed il non ricevere errori mi ha un po' disorientato.

Ora mi chiedo: il fatto che lo standard C99 permetta una cosa del genere, implica anche che sia corretto? Ovvero, posso istanziare array usando per dimensione una variabile senza preoccuparmi delle conseguenze a runtime o, pur essendo consentito dallo standard, la cosa rimane sbagliata?

Grazie
__________________
gica78r@ncc-1701:~$ tar -c
tar: Codardamente mi rifiuto di creare un archivio vuoto
Gica78R è offline   Rispondi citando il messaggio o parte di esso
Old 27-01-2009, 20:24   #7
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Dipende tutto da chi deve guardare quel codice...se è un professore, mediamente poco informato sugli standard "nuovi", usa l'allocazione dinamica. Altrimenti puoi fare quello che vuoi...quello è C standard
In C++ ad esempio non lo farei.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 27-01-2009, 20:57   #8
wizard1993
Senior Member
 
L'Avatar di wizard1993
 
Iscritto dal: Apr 2006
Messaggi: 22462
Quote:
Originariamente inviato da cionci Guarda i messaggi
mediamente poco informato sugli standard "nuovi"
hai detto bene, mediamente. i professori che conosco io sono sempre stati i primi ad aggiornarsi ai nuovi standard
__________________
amd a64x2 4400+ sk939;asus a8n-sli; 2x1gb ddr400; x850 crossfire; 2 x western digital abys 320gb|| asus g1
Se striscia fulmina, se svolazza l'ammazza
wizard1993 è offline   Rispondi citando il messaggio o parte di esso
Old 27-01-2009, 21:03   #9
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da wizard1993 Guarda i messaggi
hai detto bene, mediamente. i professori che conosco io sono sempre stati i primi ad aggiornarsi ai nuovi standard
Fra tutti quelli che ho avuto, un dettaglio del genere lo conoscerebbero in due o tre
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 27-01-2009, 21:43   #10
Gica78R
Senior Member
 
L'Avatar di Gica78R
 
Iscritto dal: Mar 2005
Messaggi: 1653
Quote:
Originariamente inviato da cionci Guarda i messaggi
Dipende tutto da chi deve guardare quel codice...se è un professore, mediamente poco informato sugli standard "nuovi", usa l'allocazione dinamica. Altrimenti puoi fare quello che vuoi...quello è C standard
In C++ ad esempio non lo farei.
Non lo deve guardare nessuno, però deve essere corretto

A questo punto credo che usare lo standard C90 può essere utile solo per compatibilità con compilatori più vecchi, no?
__________________
gica78r@ncc-1701:~$ tar -c
tar: Codardamente mi rifiuto di creare un archivio vuoto

Ultima modifica di Gica78R : 27-01-2009 alle 21:45.
Gica78R è offline   Rispondi citando il messaggio o parte di esso
Old 27-01-2009, 22:08   #11
wizard1993
Senior Member
 
L'Avatar di wizard1993
 
Iscritto dal: Apr 2006
Messaggi: 22462
Quote:
Originariamente inviato da Gica78R Guarda i messaggi
Non lo deve guardare nessuno, però deve essere corretto

A questo punto credo che usare lo standard C90 può essere utile solo per compatibilità con compilatori più vecchi, no?
visto che la borland si ostina a distribuire un compilatore che non supporta nemmeno le costanti nelle classi, figurati questi "dettagli"
__________________
amd a64x2 4400+ sk939;asus a8n-sli; 2x1gb ddr400; x850 crossfire; 2 x western digital abys 320gb|| asus g1
Se striscia fulmina, se svolazza l'ammazza
wizard1993 è offline   Rispondi citando il messaggio o parte di esso
Old 28-01-2009, 02:01   #12
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da Gica78R Guarda i messaggi
A questo punto credo che usare lo standard C90 può essere utile solo per compatibilità con compilatori più vecchi, no?
Sì, tipo Microsoft e Borland che non supportano il C99.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 28-01-2009, 09:03   #13
Gica78R
Senior Member
 
L'Avatar di Gica78R
 
Iscritto dal: Mar 2005
Messaggi: 1653
Quote:
Originariamente inviato da cionci Guarda i messaggi
Sì, tipo Microsoft e Borland che non supportano il C99.
Beh, non dovrei aver bisogno di compilatori (o sistemi operativi, o applicazioni) Microsoft, almeno per i prossimi 150 anni
__________________
gica78r@ncc-1701:~$ tar -c
tar: Codardamente mi rifiuto di creare un archivio vuoto
Gica78R è offline   Rispondi citando il messaggio o parte di esso
Old 28-01-2009, 11:09   #14
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
Quote:
Originariamente inviato da Gica78R Guarda i messaggi
Qualcuno saprebbe spiegarmi come mai?
bah, banalissimo: l'allocazione di un vettore in memoria automatica avviene sottraendo una determinata quantitá allo stack pointer; la semantica che tu riporti (dichiarazione di un array con una variabile come dimensione anziché una costante) fa si' che il codice generato dal compilatore sottragga allo stack pointer il valore contenuto in una certa variabile anziché un valore costante. si ha segmentation fault solo quando si accede ad un array per la cui dichiarazione é stato sottratto un valore che ha fatto andare lo stack pointer oltre il limite dello stack.
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 28-01-2009, 12:35   #15
Gica78R
Senior Member
 
L'Avatar di Gica78R
 
Iscritto dal: Mar 2005
Messaggi: 1653
Ah, ok! Grazie della spiegazione
__________________
gica78r@ncc-1701:~$ tar -c
tar: Codardamente mi rifiuto di creare un archivio vuoto
Gica78R è offline   Rispondi citando il messaggio o parte di esso
Old 28-01-2009, 12:37   #16
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da fero86 Guarda i messaggi
bah, banalissimo: l'allocazione di un vettore in memoria automatica avviene sottraendo una determinata quantitá allo stack pointer; la semantica che tu riporti (dichiarazione di un array con una variabile come dimensione anziché una costante) fa si' che il codice generato dal compilatore sottragga allo stack pointer il valore contenuto in una certa variabile anziché un valore costante. si ha segmentation fault solo quando si accede ad un array per la cui dichiarazione é stato sottratto un valore che ha fatto andare lo stack pointer oltre il limite dello stack.
Secondo la tua spiegazione questo sarebbe un errore. In C95 è come dici, in C99 invece non è un errore, è perfettamente lecito.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 28-01-2009, 13:07   #17
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
Quote:
Originariamente inviato da cionci Guarda i messaggi
Secondo la tua spiegazione questo sarebbe un errore. In C95 è come dici, in C99 invece non è un errore, è perfettamente lecito.
a cosa ti riferisci, alla situazione che provoca il segmentation fault?

penso che ci siano solo due modi di allocare dati dinamicamente: nello stack e nell'heap; il primo ha un limite (ad esempio impostato dal linker su Windows, non so su Linux), il secondo invece non ha virtualmente limite poiché é limitato solo dalla disponibilitá di indirizzi virtuali e di risorse di sistema; peró mentre per allocare nel primo é sufficiente una sottrazione, per allocare nel secondo é necessaria una chiamata di sistema con eventuale switch in kernel mode, quindi é inefficiente.

se sta scritto da qualche parte che in C99 gli array la cui dimensione é espressa da una variabile devono essere allocati nell'heap allora é un motivo in piu per non usare il C99
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 28-01-2009, 13:23   #18
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
No, intendevo una cosa diversa, tu l'hai trattato come se fosse un errore, ma in realtà non lo è.
Che finisca lo stack può succedere, ma al pari dell'allocazione classica se io utilizzo un intero troppo grande
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 28-01-2009, 13:37   #19
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Ecco l'implementazione di questo codice:
Codice:
void f()
{
   int n;
   scanf("%d", &n);
   int v[n];
   while(n--);
}
Codice:
f:
.LFB2:
	pushq	%rbp
.LCFI0:
	movq	%rsp, %rbp
.LCFI1:
	subq	$48, %rsp
.LCFI2:
	movq	%fs:40, %rax
	movq	%rax, -8(%rbp)
	xorl	%eax, %eax
	movq	%rsp, %rax
	movq	%rax, -40(%rbp)
	leaq	-12(%rbp), %rsi
	movl	$.LC0, %edi
	movl	$0, %eax
	call	scanf
	movl	-12(%rbp), %eax
	cltq
	salq	$2, %rax
	addq	$15, %rax
	addq	$15, %rax
	shrq	$4, %rax
	salq	$4, %rax
	subq	%rax, %rsp
	movq	%rsp, -48(%rbp)
	movq	-48(%rbp), %rax
	addq	$15, %rax
	shrq	$4, %rax
	salq	$4, %rax
	movq	%rax, -48(%rbp)
	movq	-48(%rbp), %rax
	movq	%rax, -24(%rbp)
.L2:
	movl	-12(%rbp), %eax
	testl	%eax, %eax
	setne	%dl
	subl	$1, %eax
	movl	%eax, -12(%rbp)
	testb	%dl, %dl
	jne	.L2
	movq	-40(%rbp), %rsp
	movq	-8(%rbp), %rax
	xorq	%fs:40, %rax
	je	.L4
	call	__stack_chk_fail
.L4:
	leave
	ret
Sinceramente mi sembra un po' contorta come operazione Non ho voglia di mettermi a leggerlo Comunque viene usato lo stack.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 28-01-2009, 14:17   #20
Braga83
Senior Member
 
L'Avatar di Braga83
 
Iscritto dal: Jul 2002
Città: Provincia Tv
Messaggi: 1208
Quote:
Originariamente inviato da fero86 Guarda i messaggi
bah, banalissimo: l'allocazione di un vettore in memoria automatica avviene sottraendo una determinata quantitá allo stack pointer; la semantica che tu riporti (dichiarazione di un array con una variabile come dimensione anziché una costante) fa si' che il codice generato dal compilatore sottragga allo stack pointer il valore contenuto in una certa variabile anziché un valore costante. si ha segmentation fault solo quando si accede ad un array per la cui dichiarazione é stato sottratto un valore che ha fatto andare lo stack pointer oltre il limite dello stack.
Quoto. L'array viene allocato nello stack. Riguardo ai motivi del perche' il compilatore permatta questa zozzeria non saprei. Credo sia una morivazione filosofica piu' che tecnica: nel C ( e in parte nel c++ ) si cercano di mettere meno vincoli possibili al programmatore per non limitare la "potenza del linguaggio". Se questo crea, o meglio facilita, gli errori pazienza.

Comunque evita come la peste questo costrutto: segmentation fault e' il migliore degli errori che possano accadere. Mi ricordo un esempio simile in c++ in cui se si usciva dalla lunghezza dell'array, si andava a modificare il valore di altre variabili automatiche presenti nello stack, senza controllo dei tipi. Poi voglio vedere a debuggare codice del genere.
__________________
Gigabyte 7n400pro, Athlon Barton 2500@3200(11x200 a), nVidia 7600 gs, 1024 ddr 3200, Maxtor 40+160 Gb 7200 rpm, Hercules Fortissimo III, Liteon 48125s, Pioneer Dvr-108,Philips 109P40
Braga83 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu PC Specialist Lafité 14 AI AMD: assemblat...
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto Recensione Nothing Phone 4(a): sempre iconico ma...
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale Corsair Vanguard Air 99 Wireless: non si era mai...
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lav...
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo Recensione Samsung Galaxy S26 Ultra: finalmente ...
CPU desktop: Intel dice addio ai socket ...
Google sta testando un'app di Gemini per...
NVIDIA GeForce RTX 5070 Laptop: in arriv...
Il Tribunale di Roma ha annullato la mul...
AppleCare One potrebbe arrivare presto i...
Amazon ci riproverà: l'azienda st...
Apple e Samsung dominano la classifica d...
Un game designer di 9 anni, due fogli a ...
Il weekend Amazon parte col botto: gross...
Amazfit Active 2 scende a 69,99€: i migl...
Smart TV No IVA su Amazon: QLED, Mini-LE...
C'è un TV OLED da 65'' a 900€, ma anche ...
Non solo smartphone: OnePlus sta per lan...
DJI Mavic 4 Pro in super offerta su Amaz...
ASUS Zenbook scende di altri 50€: l'anti...
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: 15:12.


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