View Full Version : C++ valore di ritorno di una funzione e ricerca testo
Abdujaparov
14-10-2006, 16:34
Salve a tutti, i miei problemi con il c++ non finiscono mai, effettivamente sono a dir poco scarso.
Data la mia ignoranza vorrei chiedervi questo. Io in java tranquillamente definivo una classe ed una funzione di un altra classe che mi ritornava un array della classe precedente cioè:
Definisco la classe PrimoPiatto
e potevo definire una funzione di un'altra classe del tipo:
PrimoPiatto[] menuPrimi(String nome){....}
In C++ ho provato a fare una cosa simile e mi sono preso una marea di insulti io però ho la necessità di tornare un array o qualcosa di simile, come posso fare?
Un'altra domanda, io dovrei cercare all'interno di una stringa di testo una frase, cioè:
string testo_vario="Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura che la dritta via era smarrita ....."
devo cercare
string daCercare="di nostra vita". Cercare un token lo so fare ed è una fesseria, per cercare tutta la frase devo implementare io di sana pianta una cosa simile controllando i token a gruppi a gruppi con cicli e controcicli o c'è qualche speranza per semplificarmi la vita?
Grazie, ciao ciao.
Io in java tranquillamente definivo una classe ed una funzione di un altra classe che mi ritornava un array della classe precedente cioè:
Definisco la classe PrimoPiatto
e potevo definire una funzione di un'altra classe del tipo:
PrimoPiatto[] menuPrimi(String nome){....}
In C++ ho provato a fare una cosa simile e mi sono preso una marea di insulti io però ho la necessità di tornare un array o qualcosa di simile, come posso fare?
devi ritornare l'indirizzo del primo elemento: non PrimoPiatto[] ma PrimoPiatto*
Un'altra domanda, io dovrei cercare all'interno di una stringa di testo una frase, cioè:
string testo_vario="Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura che la dritta via era smarrita ....."
devo cercare
string daCercare="di nostra vita".
se vuoi puoi crearti la funzione da solo ma credo sia abbastanza difficile, quindi ti conviene usare le regular expression.
ci sono decine di librerie che aggiungono le regular expression al c++ su google, purtroppo non so consigliarti la migliore.
Abdujaparov
14-10-2006, 18:02
Grazie mille, tornando PrimoPiatto* però perdo l'indicazione della dimensione dell'array. Per avere anche la dimensione dovrei creare un nuovo oggetto contenente il puntatore al primo elemento e la dimensione dell'array?
Oppure potrei passare un vettore o una lista? Con vettore e lista dovrei ritornare il puntatore o posso direttamente ritornare lista o vettore?
Grazie, ciao ciao.
Grazie mille, tornando PrimoPiatto* però perdo l'indicazione della dimensione dell'array. Per avere anche la dimensione dovrei creare un nuovo oggetto contenente il puntatore al primo elemento e la dimensione dell'array?
Oppure potrei passare un vettore o una lista? Con vettore e lista dovrei ritornare il puntatore o posso direttamente ritornare lista o vettore?
Grazie, ciao ciao.
nono non perdi l'indicazione della dimensione: il valore di return della funzione è un array (anche se non sembra), quindi puoi tranquillamente mettere il valore di ritorno della funzione in una variabile e poi accedere agli elementi tramite [] : variabile[0], variabile[1] ...
Abdujaparov
15-10-2006, 07:52
Cioè ricapitolando:
io potrei dichiarare una funzione così:
PrimoPiatto* menuPrimi(....){
return menu[0];
}
e poi cont
PrimoPiatto* menu=menuPrimi(....);
for(int i=0; i<menu.lenght();i++)
......
Quindi potrei fare in questo modo senza problemi?
Grazie, ciao ciao.
tomminno
15-10-2006, 11:20
Cioè ricapitolando:
io potrei dichiarare una funzione così:
PrimoPiatto* menuPrimi(....){
return menu[0];
}
e poi cont
PrimoPiatto* menu=menuPrimi(....);
for(int i=0; i<menu.lenght();i++)
......
Quindi potrei fare in questo modo senza problemi?
Grazie, ciao ciao.
In C++ gli array non sono classi. Non hai il metodo lenght che ti indica quanti elementi sono presenti!
A seconda di quello che ci devi fare potresti usare vector, list, queue, map, hash_map...
Io farei così:
vector<PrimoPiatto>& menuPrimi(....){
return menu;//Con menu dichiarato come "vector<PrimoPiatto> menu;"
}
vector<PrimoPiatto> & menu=menuPrimi(....);
for(int i=0; i<menu.size();i++)
......
//Oppure, meglio, con gli iteratori
vector<PrimoPiatto>::iterator it;
for(it = menu.begin(); it != menu.end(); it++)
...
Cioè ricapitolando:
io potrei dichiarare una funzione così:
PrimoPiatto* menuPrimi(....){
return menu[0];
}
e poi cont
PrimoPiatto* menu=menuPrimi(....);
for(int i=0; i<menu.lenght();i++)
......
Quindi potrei fare in questo modo senza problemi?
Grazie, ciao ciao.
no ;)
se la funzione menuPrimi ritorna un array di qualcosa, devi mettere come valore di ritorno il tipo dell'array piu' "*" (ad esempio int* nomefunzione...): se menu è un array di int devi scrivere int* menuPrimi, non PrimoPiatto* menuPrimi, che non c'entra niente.
ritornando menu[0] ritorni solo quell'elemento e non lintero array: devi fare return menu;
non puoi scrivere PrimoPiatto menu=menuPrimi() perchè menuPrimi restituisce un array, non un oggetto primopiatto; se invece menu (qello restituito da menuPrimi) è una variabile contenuta nella classe PrimoPiatto, devi scrivere PrimoPiatto menu;
menu.primi=menuPrimi();
come già detto da tomminno, gli array in c++ non hanno la funzione lenght, ma se vuoi puoi farla tu:
//considerando menu come un array di int:
int lenght(int* array_di_int)
{
for(int i=0;array_di_int[i]!=0;i++){}
return i;//ritorna la lunghezza di array
}
//per usarla, pero' non dovrai scrivere nomearray.lenght, ma lenght(nomearray)
se vuoi che ti aiuti piu precisamente dovresti spiegarmi +o- cosa vorresti fare perchè non si capisce bene :mbe:
Abdujaparov
15-10-2006, 18:05
Spero di essere chiaro e lineare.
Voglio tornare un array di oggetti PrimoPiatto.
La funzione prende determinati parametri e ritorna un array di oggetti PrimoPiatto.
L'oggetto PrimoPiatto l'ho definito io per gli affari miei.
E' una cosa piuttosto semplice, spero.
Grazie per la pazienza, ciao ciao.
Spero di essere chiaro e lineare.
Voglio tornare un array di oggetti PrimoPiatto.
La funzione prende determinati parametri e ritorna un array di oggetti PrimoPiatto.
L'oggetto PrimoPiatto l'ho definito io per gli affari miei.
E' una cosa piuttosto semplice, spero.
Grazie per la pazienza, ciao ciao.
questo dovrebbe funzionare:
PrimoPiatto* funzione(/*argomenti*/)
{
PrimoPiatto array[10];
//fai cio' che vuoi
return array;
}
prova e fammi sapere ;)
Ma la libreria standard il C++ che ce l'ha a fare ? :D
Esistono i vector...
vector <PrimiPiatti> menuPrimi(...)
In alternativa puoi comunque usare l'allocazione dinamica:
void menuPrimi(/*parametri*/, PrimiPiatti *&menu, int *dimensione)
{
.....
dimensione = XXXX;
vettore = new PrimiPiatti[dimensione];
.....
}
La richiami così:
PrimiPiatti *primi, dimensione;
menuPrimi(primi, dimensione);
Ovviamente poi dovrà essere deallocata:
delete[] primi;
questo dovrebbe funzionare:
Quello che viene ritornato è un puntatore a dello spazio non allocato...lo spazio riservato per array viene deallocato automaticamente all fine del metodo... E' un grave errore ;)
Abdujaparov
16-10-2006, 06:28
Grazie a tutti, più tardi provo ma credo che alla fine mi orienterò su un array o su una lista, dopo aver rivisto attentamente la funzione che sto scrivendo.
Grazie a tutti, ciao ciao.
per cercare tutta la frase devo implementare io di sana pianta una cosa simile controllando i token a gruppi a gruppi con cicli e controcicli o c'è qualche speranza per semplificarmi la vita?
string testo(".........");
string s("stringa da cercare");
string::size_type pos = 0;
while((pos = testo.find(s, pos)) != string::npos)
{
//fai qualcosa sapendo che all'indice pos c'è una stringa valida
...
pos++; //per non ritrovare la stringa nella stessa posizione
}
Abdujaparov
17-10-2006, 17:55
Salve a tutti ho applicato i vostri consigli però non sono riuscito a risolvere nulla cioè:
list<Pizzino>& PizzinoCtrl::allPizzini(){
return provenzano;
}
La richiamo così:
list<Pizzino> &eccoli=motore.allPizzini();
ed il risultato è questo:
c:\documents and settings\angelo\documenti\visual studio 2005\projects\quarto\postit\postit.cpp(184) : error C2361: initialization of 'eccoli' is skipped by 'default' label
c:\documents and settings\angelo\documenti\visual studio 2005\projects\quarto\postit\postit.cpp(175) : see declaration of 'eccoli'
Come posso risolvere?
Grazie, ciao ciao.
Abdujaparov
17-10-2006, 18:53
Cionci non capisco come funziona il pezzo che mi hai scritto.
Io devo settare a true un booleano se la la stringa da cercare è nel testo.
Non capisco cosa fa quel ciclo, puoi spiegarmelo?
Grazie, ciao ciao.
ed il risultato è questo:
c:\documents and settings\angelo\documenti\visual studio 2005\projects\quarto\postit\postit.cpp(184) : error C2361: initialization of 'eccoli' is skipped by 'default' label
c:\documents and settings\angelo\documenti\visual studio 2005\projects\quarto\postit\postit.cpp(175) : see declaration of 'eccoli'
Posta il codice dentro cui hai dichiarato eccoli...sembra che tu l'abbia dichiarato in un ramo di uno switch e non si può...
Per il mio codice: semplicemente cerca una stringa fino a quando il valore ritornato da testo.find è diverso da string::npos (che è il valore ritornato quando non trova più sottostringhe uguali a quella cercata)...
Se devi semplicemente settare un booleano se la stringa trovata è nel testo allora fai così:
boolean trovato = (testo.find(s, 0) != string::npos);
Abdujaparov
18-10-2006, 08:17
Grazie mille, c'era uno switch in mezzo e non me ne rendevo conto.
Ho fatto in questo modo:
vector<Pizzino> PizzinoCtrl::pizziniConTesto(string testo){
vector<Pizzino> speriamo;
//FA QUALCOSA CON LA RICERCA TESTO CHE STO PROVANDO GRAZIE ATE
return speriamo;
}
Dentro un'altra classe:
vector<Pizzino> trovati;//dichiarato fuori dallo switch
//invoco il metodo in questo modo
trovati=motore.pizziniConTesto("ehehe");
Ho tolto il riferimento perchè ritorno un vettore che è una variabile locale, ho fatto bene?
Ora provo il metodo per la ricerca del testo grazie infinite.
Ciao ciao.
Hai fatto bene, in questo modo usa l'operatore di assegnazione e dovrebbe andare bene...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.