|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Sep 2001
Città: Salerno
Messaggi: 649
|
Un piccolo aiuto per un piccolo problema in C
il codice è questo:
#include <stdio.h> #define size 10 main() { int i=0; int n[size]; for (i=0; i<=9;i++) n[i]=i+2; printf("%s%13s\n", "Element", "Value"); for(i=0; i<=9;i++) printf("%7d%13d\n", i,n[i]); return 0; } Vorrei poter inserire la dimensione dell'array attraverso il prompt con l'utente. Ho provato con una scanf prima della dichiarazione del vettore, ma il compilatore mi segnala errori. Cortesemente sapreste aiutarmi?? Grazie
__________________
![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19148
|
mi spiace, ma non puoi dichiarare un vettore di dimensione variabile in c.
se metti la dichiarazione dopo lo scanf non tutti i compilatori te la prendono per buona intanto (prima di tutto le dichiarazioni, poi le istruzioni) e di certo nessun compilatore accetterà un array la cui dimensione è specificata da una variabile. se ti fa proprio comodo l'array ti consiglio di crearlo dinamicamente attraverso la malloc, allora si che potrai averlo della grandezza specificata dall'utente. se non sai usare la malloc chiedi :-) |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2001
Messaggi: 1205
|
Esatto. Bisogna usare i puntatori, altrimenti nisba.
In pratica le dichiarazioni che dovrai fare saranno: int N, *vettore; /* Poi: */ printf("\n Inserire la dimensione dell'array: N="); scanf("%d", &N); vettore=(int *) malloc(N*sizeof(int)); La funzione malloc è supportata dalla libreria stdlib.h, cioè dovrai aggiungere in cima al file: #include <stdlib.h> Comunque ti consiglio di capire come funzionano i puntatori prima di addentrarti in queste istruzioni ![]() |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Codice:
void f(int N) { int v[N]; } main() { f(10); f(15); } |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19148
|
hai ragione tu, strano ma vero, gcc accetta un array di dimensioni variabili!
non ci avevo pensato ma in una funzione si può fare, cmq come dici giustamente anche tu non è molto corretto ed è in ogni caso preferibile usare la malloc (io la uso senza il cast esplicito ma ne abbiamo già parlato qualche settimana fa...) |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Sep 2001
Città: Salerno
Messaggi: 649
|
Grazie a voi ho risolto
W i puntatori !! ![]()
__________________
![]() |
![]() |
![]() |
![]() |
#7 | |
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#8 | |
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
void myfunc(int dim) { int myarray[dim]; ... ... return; } Quindi la situazione sopra è perfettamente corretta. |
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Nov 2001
Messaggi: 1205
|
Interessante...
![]() Però mi sa che i compilatori compatibili con quelle specifiche non faranno altro che utilizzare malloc, senza che il programmatore se ne accorga... ![]() |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Sep 2001
Città: Salerno
Messaggi: 649
|
Quote:
![]()
__________________
![]() |
|
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Quindi quello è a tutti gli effetti un vettore statico... |
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Nov 2001
Messaggi: 1205
|
Se è così, allora converrà continuare ad usare malloc (per fortuna...nel senso che ci sono affezionato...come molti, credo).
A proposito di dimensione di vettori "statici". Una dichiarazione come questa, con un vettore nemmeno tanto grande: int vettore[270000]; /* meno di 1 Mb */ manda in crash il programma non appena termina la compilazione... ![]() Forse dipende dal compilatore che uso (Borland c/c++ 5.02)... Oppure, non è che per caso c'è un limite di dimensione nei vettori statici? Attendo lumi ![]() |
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ma il compilatore genera codici a 32 bit ?
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Nov 2001
Messaggi: 1205
|
Certamente
![]() Ho notato altri difetti che riguardano sopratutto la deallocazione dinamica della memoria quando si lavora su liste concatenate molto grandi: relativamente a questo problema metterò fra una o due settimana un post apposito...penso che sia interessante. Tornando agli array, cionci, tu, col tuo compilatore, riesci a dichiarare staticamente un vettore grande a piacere (nel limite dei 32 bit, si intende)? |
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Lo sai che è vero ?!?!?!
Il max che mi fa dichiarare in VC++ è : int vect[258572]; Comunque tutto deriva da qualche settaggio del compilatore... Ad esempio la grandezza dello heap... Infatti rinominando il file in .c ed utilizzando così il compilatore C mi permette di dichiarare anche oltre il milione... Inoltre mettendo la variabile come globale (non dovrebbe venire allocata nello heap)...funziona oltre il milione anche in C++... |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Nov 2001
Messaggi: 1205
|
Ho cambiato l'estensione, da .cpp a .c...niente, non compila...
![]() Ho controllato se ci fosse qualche parametro da configurare, ma nulla. Comunque mi sembra di capire che il comportamento è normale. Grazie delle info ![]() |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19148
|
io ho provato a fare questa cosa degli array in visual c++.
se lo creo come variabile globale (estensione del file cpp) posso mettere la dimensione che voglio, ma non mi accetta assolutamente un array di dimensioni specificate da una variabile, forse perché è un po' troppo vecchio (è il VC++ 4, con il compilatore della gnu non ci sono problemi). cmq, non si finisce mai di imparare ![]() |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Nov 2001
Messaggi: 1205
|
Mi ero dimenticato di provare un array globale
![]() In effetti con un array globale le cose migliorano, si arriva oltre il milione di elementi, come diceva cionci. Comunque, quando si rifiuta di compilare, questa volta il compilatore dà delle indicazioni. Fatal: Fatal: Assertion failed: !"How can you expand a vapor heap?" at "LMEM.C", line 1014 Fatal: Fatal: Assertion failed: prev->size <= vHeap->maxSize at "LMEM.C", line 1630 Fatal: Fatal: Assertion failed: free->size <= vHeap->maxSize at "LMEM.C", line 1221 Fatal: Fatal: Assertion failed: memHndl->size <= vHeap->maxSize at "LMEM.C", line 1156 Error: Error: Internal failure -- retrying link... Fatal: Fatal: Assertion failed: !"How can you expand a vapor heap?" at "LMEM.C", line 1014 Fatal: Fatal: Assertion failed: prev->size <= vHeap->maxSize at "LMEM.C", line 1630 Fatal: Fatal: Assertion failed: free->size <= vHeap->maxSize at "LMEM.C", line 1221 Fatal: Fatal: Assertion failed: memHndl->size <= vHeap->maxSize at "LMEM.C", line 1156 Sembrerebbe che nel file LMEM.C si possano modificare i valori di alcune costanti... Ma questo file, nel mio hard disk, non esiste, sempre che di file si tratti... |
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Comunque vedi...il problema è lo heap...
Probabilmente LMEM.C è già compilato nelle librerie runtime del Borland e le asserzioni vengono intercettate (con i relativi) messaggi dal compialtore... |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:25.