Newsgroup: it.comp.lang.c++
Titolo: [NEWBIE] Problema.

Salve a tutti del gruppo, questa è la prima volta che scrivo.
Ho deciso di imparare a programmare in C++, ma sono mooooolto inesperto e
newbie. Ho programmato un po' in java all'università, ma mi ritengo
praticamente "vergine" nel campo.
Sto leggendo un libro di Schildt e attualmente sto arrabattandomi coi
puntatori.
Ho scritto questo sorgente, che dovrebbe implementare la funzione
strcat().
#include <iostream>
using namespace std;
void strcat(char *s1, char *s2);
int main(){
  char s1[], s2[];
  cout << "Inserisci le due stringhe da concatenare: \n";
  cout << "Digita la prima: ";
  cin >> s1;
  cout << "\nDigita la seconda: ";
  cin >> s2;
  strcat(s1, s2);
  cout << "\nLe stringhe concatenate risultano così: " << s1 << "\n\n";
  return 0;
}
void strcat(char *s1, char *s2){
 
  int i = 0;
  for(; s1[i]; i++);
 
  for(int z=0; s2[z]; z++)
    s1[i++] = s2[z];
}
Il g++ si lamenta della mancata assegnazione della grandezza dell'array
nell'inizializzazione in main() di s1 e s2.
Ma non si possono inizializzare array senza limiti? Avevo letto che si
poteva.
Mi rivolgo a voi per una illuminazione.
Grazie mille.
Ciao!

 
No. Hai 2 opzioni:
1) char s1[1000],s2[1000];
in questo modo dichiari 2 array di dimensioni fisse
2) char *s1,*s2;
   s1 = new char[1000];
   s2 = new char[1000];
In questo modo dichiari 2 puntatori a char e poi allochi dello spazio in 
maniera dinamica. In questo caso invece che new[1000] puoi usare anche una 
cosa del tipo:
int i = 100;
s1 = new char[i];
Alla fine devi ricordarti di liberare la memoria allocata con la new usando 
delete
delete [] s1;
delete [] s2;

 poteva.
No. Per definizione, in C/C++ un array è una sequenza di lunghezza definita
di elementi addiacenti.
Un array allocato dinamicamente può avere dimensioni definite in fase di
esecuzione, mentre un array con lifetime automatico o statico ha dimensioni
stabilite in fase fase di compilazione (si veda thread "Array in C++ vs
array in C").
Bel tuo caso, ti consiglio di usare std::string e dimenticarti completamente
di 'strcat' et similia.
Max

Grazie delle risposte.
Ma allora anche un'inizializzazione del tipo
array[][1000] non è valida?
Nel libro è usata.
Ciao!


Penso che ti sei confuso con i vector del C++, quelli sono estensibili 
dinamicamente
es:
std::vector<int> vet;
vet.push_back(1);
vet.push_back(2);
vet.push_back(10);
vet.push_back(11);
vet.push_back(15);
cout << vet.size() << endl;
cout << vet[3] << endl;
OUTPUT:
5
11
----------------
per maggiori dettagli e relativi metodi dai una occhiata qui:
 
http://wwwasd.web.cern.ch/wwwasd/lhc++/RW/stdlibcr/vec_0251.htm
ciao,
Checco.

 array[][1000] non č valida?
Come inizializzazione di un array, no, a meno che non sia seguita da un
"inizializzatore" ('{ }'), nel qual caso la dimensione dell'array viene
implicitamente determinata dal numero dei valori specificati. Ad esempio:
 char var[][2] = { { 'a','b' }, {'c','d'}, {'e','f'} }; // 'var' č di tipo
'char ()[3][2]'
Si tratta invece di un'espressione valida nella dichiarazione degli
argomenti di una funzione.
  void func( char arg[][2] );
In questo caso č del tutto equivalente a 'T (*arg)[100]'. Una dichiarazione
di questo tipo puň essere usata per passare un parametro di tipo
'T()[X][100]', in virtů della proprietŕ degli array di "decadere" nel
puntatore al loro primo elemento quando vengono passati come argomento.
Nota, per inciso, che all'interno della funzione non vi sarŕ alcun modo per
ricavare la dimensione dell'array soggiacente, se questa non vien passata
come parametro aggiuntivo.
Max

 come parametro aggiuntivo.
di solito o si passa il parametro di lunghezza dell campo non specificato o
si fornisce un'implementazione null terminated ... ma questo solo per
matrici, per i vettori non potresti usare il null terminator finche non
definisci che tipo e quale range di dato andranno al suo interno ...
ah scusa le matrici che dico prima non cono quelle dichiarate come var[][]
... ma come *var[] ... quindi un vettore di puntatori che puntano le righe
della tua matrice, cosi' facendo puoi usare il puntatore lungo per la
chiusura di tale matrice sulle righe cosi' da rendere poi le ridimensioni e
le riallocazioni molto piu' veloci e senza richiedere grosse copie di
memoria.
ciao

Grazie di tutto!
Mi avete illuminato!
:)