Newsgroup: it.comp.lang.c++
Titolo: array & string

Buondi' a tutti, pongo alcuni dubbi 
Le funzioni C++ non possono assolutamente restituire array?
Altra domanda.
Se io definisco 
typedef string stringarray[]; definisco un array di stringhe.
Poi come posso usarlo per definire una precisa dimensione?
Se scrivo 
stringarray MioArray[10];
e' sbagliato, infatti mi dice
error: declaration of `MioArray' as multidimensional array must have
bounds for all dimensions except the first
So che potrei fare per esempio
stringarray MioArray= { "ciao", "mamma", "papa", ... };
ma non voglio essere costretto a usare l'inizializzazione,
come posso fare?

 Le funzioni C++ non possono assolutamente restituire array?
Ma mannaggia il mondo, con tutte le strutture dati offerte dalla STL ancora
ad usare gli array?
Usa un vector, usa una deque o una list.
-- 
USB Priests for only 10$

 ad usare gli array?
Mmmm. Se questa e' una risposta, com'e' che io ho ancora gli stessi dubbi?
Ma mannaggia il mondo, chi ti dice che io abbia scelta?
Simpaticamente, dico. Pero'...
Mannaggia il mondo (poveraccio), se ti prendi la briga di rispondere al
post, rispondi alla domanda, senno' che rispondi a fare?
Sempre simpaticamente, IO ;)
Hai mai considerato la possibilita' che uno debba mettere mano 
a software vecchio che ha gia' le sue strutture dati ben definite?
Se scrivo io, col cavolo che uso gli array.
Ma ci son gia'.

 Se scrivo io, col cavolo che uso gli array.
Io posso rispondere solo a quello che leggo. Il consiglio migliore nella
maggior parte dei casi è quello che ti ho dato nel primo post. Se non puoi
farlo, allora prova a fare come ho detto sopra.


 typedef string stringarray[]; definisco un array di stringhe.
 > Poi come posso usarlo per definire una precisa dimensione?
Non credo si possa.
Che io sappia, puoi usarlo solo in uno dei due seguenti modi:
stringarray a = { "123", "asdfg", "" };
int f(stringarray b) { return b[2].size(); }
-- 
     Carlo Milanesi
 
http://digilander.libero.it/carlmila

 come posso fare?
ti rimando alle altre risposte che vedo hai ricevuto.

 Io posso rispondere solo a quello che leggo. [SNIP]
Appunto, ma non hai risposto a quello che hai letto, perche' mica ho
chiesto "Cosa mi consigliate invece della Panda?"
Scusa, ma sono pignolo, grazie comunque dell'interessamento ;)

 
Ecco, questo e' il punto. Se volessi definire proprio uno string[4], ma
SENZA inizializzarlo? 
Il modo piu' indolore sarebbe quello di inizializzarlo a caso e poi al
limite modificarne i contenuti, ma possibile che non ci sia il modo 
di dire: "ok, sapendo che stringarray e' un array generico di
stringhe, creamene uno di 4 elementi".
Diciamo che in qualche modo speravo che essendo stringarray un tipo
incompleto, si potesse specificare a posteriori la dimensione.
Comunque grazie.

 incompleto, si potesse specificare a posteriori la dimensione.
No. Appunto. E' incompleto, ma completamente specificato. Un array con 
una diversa dimensione è semplicemente un altro tipo. Negli array la 
dimensione non è un parametro. Fa parte del tipo.
In un certo senso è come con gli interi: short, int, long. Tre tipi 
diversi. Si può considerarli diversi per dimensione, ma questo è un 
dettaglio: sono diversi e basta. La dimensione non è un parametro. E' 
intrinseca nel tipo.
Negli array è lo stesso. Con la confusione dovuta al fatto che la 
dimensione è specificata con un numero, il che la fa sembrare un parametro.
Ma a questo punto tu mi chiederai: ho capito che la cosa funziona in 
modo diverso da quello che volevo, ma a livello pratico come risolvo il 
mio problema?
Come spesso avviene in informatica la risposta migliore che posso darti 
è la seguente:
Non ho abbastanza dati perché mi hai detto cosa cercavi di fare (e ti 
posso dire che è sbagliato) ma non mi hai detto perchè cercavi di farlo.
Come spesso in informatica l'analisi del problema è incompleta (o 
meglio: non mi hai fornito le specifiche complete).
E in ogni caso (come spesso accade in inf... ok, scusa) ci sono molte 
soluzioni al problema. Ciascuna con qualche vantaggio e qualche svantaggio.
Verniciatura della panda a parte ...
la soluzione più "completa" è std::vector. Valuta bene se non ti vale la 
pena usarla. E' l'unica veramente corretta, facile da usare e non troppo 
pericolosa.
Ma altre soluzioni esistono:
typedef string strarr[];
typedef string strarr4[4];
oppure:
template <typename T, unsigned siz>
struct Type {
   typedef T array[siz];
};
che puoi usare in questo modo:
Type<string,4>::array arr;
oppure anche:
// nota: pessimo codice, molto pericoloso.
// ma funziona
template <typename T, unsigned siz>
struct myArray {
   T value[siz];
   T& operator[]( unsigned i ) { return value[i]; }
   const T& operator[]( unsigned i ) const { return value[i]; }
};
Tutto, in realtà, dipende da cosa vuoi fare!

 pericolosa.
Aho', de coccio! Ma chi ha mai messo in dubbio che non ne valga la
pena??? Io ho solo detto che non ce l'ho, il vector, non e' un mio
problema, io devo gestire un array di string.
Per cortesia, smettete di consigliarmi vector e list :) Io li uso sempre,
ripeto, li uso, ma e' difficile capire che in questo caso DEVO usare quel
dannato array di stringhe? Insomma, sta Smart io ce l'ho e la uso sempre,
il problema e' che adesso devo verniciare una Panda, smettete di citarmi
la Smart, la conosco! A me non sembra difficile.
PS.: Nel caso non fosse chiaro, io CONOSCO E USO vector e list.


 PS.: Nel caso non fosse chiaro, io CONOSCO E USO vector e list.
Questo è chiaro. Non è chiaro perchè non lo usi IN QUESTO CASO.

 string MioArray[][10];
Naturalmente intendevo
string MioArray[10][];

 StrArr matr[6]; // string matr[4][6];
E daglie. Intendevo:
StrArr matr[6]; // string matr[6][4];



L'ho detto un bel po' di volte, e cioe':
Ce l'ho, viene usato in mille parti di codice, non posso cambiare quella
definizione ne' le altre mille parti di codice.
L'esistenza di quell'array siffatto e' un requisito.
 
Mi spiace se ti ho fatto arrabbiare, io usavo un tono simpatico, so che
magari in mail e' difficile spiegarsi. Tu sei stato gentilissimo, pure
troppo, e io te ne sono grato, giusto per chiarire che i miei toni sono
molto scherzosi quando insisto sulla Panda. A proposito, non sono io de
coccio, tu continui a volermi consigliare la Smart, quando io per primo so
che e' meglio, ma se il mio lavoro in questo caso e' verniciare la Panda,
ti ripeto ancora :"de coccio". 
Non e' che devi conoscere in dettaglio tutto il progetto e i vari
perche' delle cose per accettare il fatto che io quell'array me lo devo
tenere, punto. 
Tu fai il carrozziere, viene un cliente che vuole riverniciare la Panda,
chiedi consiglio su come fare e ti senti dire mille volte che la Smart e'
meglio, perche' TUTTI quelli che viaggiano in citta' sanno che la Smart e'
meglio. Frustrante, anche perche' lo sai gia' anche tu.
Comunque grazie mille e poi mille :)

 typedef string stringarray[]; definisco un array di stringhe.
Ti rispondo qui anche se ho letto buona parte del thread, per non
impelagarmi in altre discussioni. Prima di tutto, come ti e' gia' stato
detto la definizione:
typedef int array[];
definisce un tipo incompleto, dove per incompleto non si intende
parametrico, ma proprio che non ci sono informazioni sufficienti per
usarlo. Cio' che manca ovviamente e' la dimensione. Puoi specificare la
dimensione di un array in due modi, esplicitamente:
int a[2];
O implicitamente, specificando per esteso il valore iniziale degli
elementi:
int b[] = { 1, 2 };
Questo ti permette di utilizzare il typedef:
array c = { 1, 2, 3 };
Nota che b e c sono di tipo diverso non tanto per l'uso del typedef,
che non introduce un nuovo tipo bensi' un sinonimo di un tipo
esistente, ma per il diverso numero di elementi. Infatti se definisci
una funzione che prenda come argomento un reference ad un array puoi
chiamarla solo su array con lo stesso numero di argomenti. Il reference
serve per evitare che l'argomento sia implicitamente convertito a
puntatore al primo elemento. In pratica
void f(int (&p)[2]) {
}
int main() {
  f(b);  // OK
  f(c); // Errore
}
Ciao,
Nicola

 ti ripeto ancora :"de coccio". 
No. La diatriba della Panda l'hai avuta con Mc Osten in un altro 
sottothread. Io ho semplicemente, ad un certo punto, detto: "panda a 
parte ...".
E tu sei uscito dicendo che ero de coccio.
Dato che la tua domanda era come generare tipi vettoriali di varie 
dimensioni partendo da un tipo generico, la risposta č quella che ti č 
stata data. Tutti gli altri metodi (alcuni te li ho accennati) sono 
ancora piů invasivi.