[C++] Typedef

Steven11
Ciao a tutti, scrivo per una domanda su questa funzionalità, fatta per comodità, per dare un nome appropriato ad un oggetto.

Se scrivo nel prototipo

typedef float vettore[30];


sto imponendo a priori che l'array (che chiamo vettore) non debba avere più di 30 elementi.
Questo fatto è stato ottimo fin quando gli esercizi mi chiedono cose tipo "crea il codice che fa questa cosa ad un vettore con massimo 30 coordinate..".

Ma se io volessi deciderlo a POSTERIORI quanti elementi mettere nell'array, cioè se non ho vincoli "max 30 elementi"?
Scrivere una cifra enorme, che mi mette al riparo, sarebbe pratico ma immagino ci sia un modo più umano.

Avevo pensato ad una cosa tipo

typedef float vettore[];


ma mi sfugge come poter dopo informare circa la dimensione del vettore.
Metterci un "N" non ha senso nel prototipo (chi è N?)

Ho impressione che la risposta sia abbastanza immediata, quindi mi scuso per la solita banalità delle domande.
Ringrazio anticipatamente chi volesse rispondere.
A presto! :wink:

Risposte
Fravilla1
Se devi darla dopo la dimensione del vettore puoi scrivere così direttamente nel main():

int n;

printf("quante componenti ha il vettore x? n=");
scanf("%d, &n");

float x[n];[/code]

e poi continui con il programma. dichiarando il typedef all'inizio non puoi metterci N perchè non esiste quella variabile.

apatriarca
@Fravilla: nonostante ci siano dei compilatori che non hanno problemi con il codice che hai scritto, il tuo codice non è corretto, almeno per lo standard C++ (e C). Alcuni compilatori (come quello della Microsoft) si rifiutano infatti di compilarlo. Esistono ovviamente diverse soluzioni più corrette al problema. Le più comuni sono:
1. usare l'allocazione dinamica della memoria;
2. usare la classe std::vector (<- consigliato!!!);

Steven11
Perdonatemi, ma avevo temporaneamente lasciato questa questione.
Un amico (informatico) ieri mi ha descritto il modo di procedere (il primo dei due modi di apatriarca?) come segue

*vettore
**matrice

Nel caso della matrice poi, se pure volessi rimanere con le due parentesi quadre, mi par di ricordare che almeno una delle due dimensioni devi dargliela in anticipo (quella maggiore?).

Il fatto singolare è il seguente: il seguente codice non ha errori perché mi compila bene, ma all'atto dell'avvio del programma si blocca presentando un avviso di errore: si è verificato un errore e l'applicazione verrà chiusa..
Quindi sarei grato se qualcuno provasse a far avviare il seguente semplice codice (la parte iniziale di un altro ovviamente più eleborato, però già alla costruizione della matrice non vuole saperne di lavorare). E' questione di un minuto.

#include<iostream>
#include<math.h>
using namespace std;
typedef float **matrice;
void constrMatr(matrice, int);

main()
{
      int n=3;
      matrice A;
      constrMatr(A,n);
      
      system("PAUSE");
      return 0;
}

       void constrMatr(matrice M, int n)
       {
            int h,k;
            {
            for (h=0; h<n; h++)
            {
                for (k=0; k<n; k++)
                {printf("M[%i][%i]", k+1, h+1);
                 scanf("%i",M[h][k]);}
                }
               cout <<"\n\n";
            }
       return;
       }


Grazie anticipatamente. A presto! :wink:

apatriarca
Non ho bisogno di far girare l'applicazione per sapere perché non funziona. Un puntatore NON è un array con dimensione che scegli a piacere. È solo una variabile che contiene l'indirizzo di un blocco di memoria. Nel tuo codice matrice è un puntatore ad un puntatore. È molto diverso quindi da un array bidimensionale e cioè un blocco di memoria di dimensione M*N*sizeof(T) dove T è il tipo degli elementi e M e N sono il numero di righe e colonne.

La soluzione migliore è normalmente quella di utilizzare un singolo array (allocato con new float[N];) per rappresentare la matrice e fare qualche calcolo per determinare l'elemento a partire dagli indici. Usando una classe si può nascondere tutto dietro ad una comoda interfaccia e usarla con grande semplicità. Che cosa vuoi fare esattamente?

vict85
Se vuoi usare printf e scanf inserisci la libreria cstdio (o stdio.h). Se usi gli stream del C++ allora metti iostream... Personalmente trovo insensato chi insegna l'IO C se la sua intenzione è insegnare il C++ anche perché printf e scanf sono più difficili da usare di cout e cin...

Steven11
Grazie per le risposte.
"apatriarca":
Che cosa vuoi fare esattamente?

Il programma che volevo fare era un semplice esercizio (mi pare stabilire se una matrice è simmetrica o meno), il punto non era quello; mi premeva risolvere questa questione delle dimensioni non prestabilite, che sebbene aggirabile (nessuno mi obbliga a usare il typedef chiamando "matrice") volevo chiarire perché pensavo di aver saltato pezzi di programma (una volta saltai due lezioni consecutive).
Oggi parlando con la prof ho saputo che puntatori e operazioni con essi non sono stati fatti (e andavo quindi alla cieca), e che fino al corso di "Informatica generale" posso cavarmela mettendo nel typedef una matrice con dimensioni grandi sufficientemente, o mettendo dopo il typedef (cioè dopo l'immissione delle dimensioni da tastiera).

Tuttavia, apatriarca, approfondisco volentieri questo aspetto:
La soluzione migliore è normalmente quella di utilizzare un singolo array (allocato con new float[N];) per rappresentare la matrice e fare qualche calcolo per determinare l'elemento a partire dagli indici.


Un solo vettore?
Nel senso che posso pensare una matrice, che so, $m*n$ come un vettore unidimensionale con $m*n$ componenti (eventualmente se mi serve di stampare la matrice, stampo il vettore andando a capo sapientemente per avere la forma di matrice)?

Grazie mille per la solita disponibilità. :wink:
Buono studio.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.