PDA

View Full Version : Problema in C


Pettinato
04-02-2002, 20:20
Ciao a tutti
sto risolvendo il seguente esercizio:

Si scriva un programma che legge una sequenza di almeno 1000 interi
distinti, ciascuno seguito immediatamente da una lettera. Il carattere
# indica la fine della sequenza. In seguito si legge un altro intero e,
sulla base della sequenza introdotta, si determini se esiste una
lettera associata a quell'intero.

Ho risolto così:

#include <stdio.h>
#include <ctype.h>

typedef struct scat {
int n;
char c;
}SCATOLA;

SCATOLA *A;


void CREA (int f){

SCATOLA B[f];
A=&B[0];}

int main()
{
int l,f,e,i;
char d;
printf("\n");

printf("\n");
printf(" Immettere valore della lunghezza del vettore delle scatole\n");
scanf("%5d",&l);

CREA(l);
for(i=0;i<l;i++)
{
printf("Immettere lettera\n");
scanf("%c",&A[i].c);
printf("\n");
if(A[i].c=='#')
{
printf("Se si ha intenzione di cercare la lettera associata ad un numero \n");
printf(" premere A, per uscire premere E\n");
scanf("%c",&d);
if(d==97)
{
printf("Immettere numero associato alla lettera\n");
scanf(" 5%d ",&e);
for(f=0;f!=i;f++)
if (A[f].n==e)
printf("La lettera associata 5%d ",A[f].c);
else
printf("Errore numero non esistente");
return 0;
}
else
return 0;
}
printf("Immettere cifra\n");
scanf(" %5d",&A[i].n);
printf("\n");

}
return 0;}


Dopo aver compilato il tutto senza alcun problema faccio girare il programma ma succede questo:

Immettere valore della lunghezza del vettore delle scatole
2
Immettere lettera

Immettere cifra
a

Immettere lettera

Immettere cifra
4

Praticamente mi fa solo una richiesta non capisco, dovrebbe chiedermi anche il numero .

Bo non saprei.

Confido nel vostro aiuto.

Ciao e grazie

cionci
05-02-2002, 10:51
Quello che mi stupisce è che ti abbia compilato !!! :)

void CREA (int f){

SCATOLA B[f];
A=&B[0];}

Non è possibile mettere una variabile nell dimensione del vettore...

L'intero immesso deve essere prestabilito...se vuoi creare un vettore non non abbia dimensioni prestabilite devi usare malloc e per liberare la memoria free...

ilsensine
05-02-2002, 10:56
Non è possibile mettere una variabile nell dimensione del vettore...

Invece è ammissibile, in quanto B viene allocata dinamicamente sullo stack. L'errore è dovuto al fatto che B[f], essendo locale, viene distrutta all'uscita di CREA, quindi in ogni caso deve essere allocata con malloc. Ne ho già discusso con Pettinato su icq.

cionci
05-02-2002, 11:00
E' ammissibile ? Azz...non lo sapevo...

ilsensine
05-02-2002, 11:10
Guarda questa funzione:
void foo(int x) {
int a[x];
a[1] = 2;
a[2] = 1;
}

gcc la compila così:

pushl %ebp
movl %esp, %ebp
pushl %eax
pushl %eax
movl %esp, %edx

// In %ebp+8 c'è x e viene messo in %eax
movl 8(%ebp), %eax
// Le 3 ricghe che seguono calcolano (x*4+15)&0xfffffff0
// (arrotondamento al frame superiore, per motivi di velocità)
decl %eax
leal 19(,%eax,4), %eax
andl $-16, %eax

// Allocazione dinamica!
subl %eax, %esp
// Ora %esp punta ad a[0], %esp+4 ad a[1] ecc.
movl $2, 4(%esp)
movl $1, 8(%esp)

movl %edx, %esp
movl %ebp, %esp
popl %ebp
ret

cionci
05-02-2002, 11:37
Ganzo...non lo sapevo...

cionci
05-02-2002, 11:39
In Visual C++ :

(145) : error C2057: expected constant expression
(145) : error C2466: cannot allocate an array of constant size 0
(145) : error C2133: 'a' : unknown size

Ovviamente la riga 145 è quella di int a[x]

ilsensine
05-02-2002, 12:32
Il gcc non è il Visual C++
(per fortuna)

Puoi provare col Borland?

cionci
05-02-2002, 13:55
Originariamente inviato da ilsensine
[B]Puoi provare col Borland?
Con il Turbo C per DOS mi sembra che non si possa fare...
Con il Borland purtroppo non posso provare...

51078
05-02-2002, 15:28
Con il Borlnad C++ Builder non è possibile fare quello che dite
SCATOLA B[f];
Mentre con altri compilatri (ad esempio Dev C++)si, come è possibile, anche se su entrambi è settata come modalita ANSI C?

Pettinato
05-02-2002, 20:38
Scusate me non si è risolto praticamente niente mi fa solo una richiesta di scanf e basta.

Ciao e grazie