Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
L'abbonamento Ultimate di GeForce NOW ora comprende la nuova architettura Blackwell RTX con GPU RTX 5080 che garantisce prestazioni tre volte superiori alla precedente generazione. Non si tratta solo di velocità, ma di un'esperienza di gioco migliorata con nuove tecnologie di streaming e un catalogo giochi raddoppiato grazie alla funzione Install-to-Play
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Deebot X11 Omnicyclone implementa tutte le ultime tecnologie Ecovacs per l'aspirazione dei pavimenti di casa e il loro lavaggio, con una novità: nella base di ricarica non c'è più il sacchetto di raccolta dello sporco, sostituito da un aspirapolvere ciclonico che accumula tutto in un contenitore rigido
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Grazie ad un mocio rotante che viene costantemente bagnato e pulito, Narwal Flow assicura un completo e capillare lavaggio dei pavimenti di casa. La logica di intellignza artificiale integrata guida nella pulizia tra i diversi locali, sfruttando un motore di aspirazione molto potente e un sistema basculante per la spazzola molto efficace sui tappeti di casa
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 03-01-2008, 15:45   #1
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
[C++] funzione che ritorna vector<?>

Sto cominciando ad usare STL solo adesso e mi servirebbe (se possibile) creare una
funzione che ritorna un vector<tipo> dove tipo può essere
(per adesso) un int o double

si può e, se si, come si fa ?

grazie
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2008, 16:29   #2
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Fai una funzione template

template <class T>
vector<T> funzione();
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2008, 16:33   #3
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da cionci Guarda i messaggi
Fai una funzione template

template <class T>
vector<T> funzione();
così semplice ?

EDIT:
ho googlato questo:
vector "unknown type" return function c++
ed è uscito l'impossibile

grazie
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2008, 16:35   #4
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Certo

Dopo per richiamarla:

vector<int> v = funzione<int>();
vector<double> v = funzione<double>();
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2008, 16:38   #5
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da cionci Guarda i messaggi
Certo

Dopo per richiamarla:

vector<int> v = funzione<int>();
vector<double> v = funzione<double>();
infatti, già prevedevo una richiesta di aiuto per la chiamata alla funzione
vabbè grazie di nuovo.

Certo che è potente 'sto STL ... anche se in certe occasioni preferisco ancora usare funzioni C tipo strstr, strchr etc
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2008, 16:41   #6
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da trallallero Guarda i messaggi
anche se in certe occasioni preferisco ancora usare funzioni C tipo strstr, strchr etc
Male...le string funzionano alla grande per fare quelle cose
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2008, 08:28   #7
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da cionci Guarda i messaggi
Male...le string funzionano alla grande per fare quelle cose
'nsomma ... o forse sono io che non avendo molta dimestichezza con l'STL (e poca paziena ) preferisco usare le low-level ones

quello che non mi piace è che le varie find tornano sempre un indice e mai un char pointer quindi, trovato per esempio il valore, devi fare una substr illeggibile,
A sto punto meglio un return strstr(...)

è anche vero che certe volte ti semplificano la vita come per esempio in quest trim che ho fatto
Codice:
string Util::trimString( const string& s )
{
	unsigned int begin = s.find_first_not_of(' ');
	unsigned int end   = s.find_last_not_of (' ');
	
	return s.substr( begin, end-begin+1);
}
senza STL sarebbe sicuramente più illeggibile
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2008, 08:40   #8
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Appunto...basta lavorare esclusivamente con le string e sei a posto...poi se devi usare qualche libreria che ha come parametri char * basta convertire con c_str().
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2008, 09:04   #9
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da cionci Guarda i messaggi
Appunto...basta lavorare esclusivamente con le string e sei a posto...poi se devi usare qualche libreria che ha come parametri char * basta convertire con c_str().
scusa se insisto ma a questo punto vorrei sapere come faresti questa funzione senza l'uso di un rapido strchr.
È una funzione che cerca una stringa delimitata da certi caratteri in una stringa sorgente. Ho usato sia string che funzioni C

All'inizio pSrc era di tipo string& poi ho sbroccato (non ricordo perchè ma per colpa di 'ste string) ed ho messo char*

Codice:
string LLUtils::GetDelimitedString( const char* pSrc, int LeftDelimiter, int RightDelimiter )
{
	LogL.Write( LogLib::LOGLIB_DEBUG_FLOW_MSG, LOGLIB_FIX_ARGS, 0, "" );

	if (pSrc) // so the caller can avoid checking
	{
		char* start = strchr( pSrc, LeftDelimiter );
		if (start) // left delimiter was found
		{
			while(*(++start) == ' ')
				; // skip left spaces
	
			char* end = strchr( start, RightDelimiter );
			if (end) // right delimiter was found
			{
				while(*(--end) == ' ')
					; // skip right spaces

				string s(pSrc); // create the string to be returned
				s.substr( (start - pSrc) );
				return s.substr( (start - pSrc), (end - start + 1) );
			}
		}
	}
	return "";
}
////////////////////////////////////////////////////////////////////
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2008, 09:14   #10
variabilepippo
Senior Member
 
L'Avatar di variabilepippo
 
Iscritto dal: Mar 2007
Messaggi: 1792
Quote:
scusa se insisto ma a questo punto vorrei sapere come faresti questa funzione senza l'uso di un rapido strchr.
Potresti determinare gli indici da passare a tuastringa.substr con i metodi find e rfind della classe string.
variabilepippo è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2008, 09:22   #11
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Vediamo:
Codice:
string LLUtils::GetDelimitedString( const string &src, int LeftDelimiter, int RightDelimiter )
{
    LogL.Write( LogLib::LOGLIB_DEBUG_FLOW_MSG, LOGLIB_FIX_ARGS, 0, "" );

    string result = "";
    size_t left = src.find_first_of(LeftDelimiter);
    size_t right = src.find_last_of(RightDelimiter);

    if(left != str::npos && right != str::npos)
    {
        result = Util::trimString(src.substr(left, right));
    }
    return result;
}
Se ho capito bene
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2008, 09:40   #12
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da variabilepippo Guarda i messaggi
Potresti determinare gli indici da passare a tuastringa.substr con i metodi find e rfind della classe string.
Quote:
Originariamente inviato da cionci Guarda i messaggi
...
Se ho capito bene
ecco, come volevasi dimostrare ... Cionci hai capito bene anzi, benissimo

Praticamente ci ho litigato per un pò, poi ho optato per ciò che conosco benissimo per non perdere tempo prezioso e invece era fattibilissimo.

vabbè, grazie ancora
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2008, 09:57   #13
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
beh, visto che orami è una disputa (amichevole e costruttiva - per me almeno) tra STL e C functions, vorrei proporvi un'altra ... gara
(ed è quì che mi serviva una funzione che torna vector<type>)

ho una stringa di questo formato "x < y" dove x è un valore minimo e y quello massimo.
La funzione torna un vector di interi dal minimo al massimo.
Quindi se il minimo è 1 e il massimo 5, torna
1 2 3 4 5

Calcolando che il tutto deve essere il più veloce possibile (sto lavorando ad un progetto per la comunicazione tra un carro armato e vari operatori) l'ho fatta così
(io avrei fatto a meno anche del lento vector e fatto tutto con un array di int )

Codice:
vector<int> LLUtils::GetMinToMaxValues( string& s, int Separator )
{
	vector<int> v;
	
	int Min = atoi( s.c_str() ); // 1st value, atoi stops at first non digit char
	int Max = atoi( strchr(s.c_str(), Separator) + 1 );  // 2nd value, atoi from char after Separator
	
	for ( int i = Min; i <= Max; ++i )
		v.push_back(i); // creates the list
	return v;
}
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2008, 10:17   #14
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Certo che anche la tua non va male...ma quando posso tento di non mischiare C e C++.
Il codice sotto in teoria non necessita del parametro separator...sempre che il separatore fra i numeri non sia composto da diversi caratteri con spazi nel mezzo...
Quindi a seconda delle specifiche del problema la tua potrebbe andare meglio di quella che ho scritto sotto. Se il formato è sempre quello che mi hai scritto "3 > 10" però va sempre bene.
Codice:
vector<int> LLUtils::GetMinToMaxValues(const string& s)
{
	int min, max;
        string separator;
        istringstream iss(s);
        iss >> min >> separator >> min;
	
	for ( int i = Min; i <= Max; ++i )
		v.push_back(i); // creates the list
	return v;
}
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2008, 10:30   #15
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da cionci Guarda i messaggi
Certo che anche la tua non va male...ma quando posso tento di non mischiare C e C++.
Il codice sotto in teoria non necessita del parametro separator...sempre che il separatore fra i numeri non sia composto da diversi caratteri con spazi nel mezzo...
Quindi a seconda delle specifiche del problema la tua potrebbe andare meglio di quella che ho scritto sotto. Se il formato è sempre quello che mi hai scritto "3 > 10" però va sempre bene.
Codice:
vector<int> LLUtils::GetMinToMaxValues(const string& s)
{
	int min, max;
        string separator;
        istringstream iss(s);
        iss >> min >> separator >> min;
	
	for ( int i = Min; i <= Max; ++i )
		v.push_back(i); // creates the list
	return v;
}
uhm ... figata come tecnica ma non andrebbe bene nei valori multipli.

Ho Min to Max, Min & Max, e valori multipli separati da |
Però grazie, interessante
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2008, 10:34   #16
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Fammi un esempio di valori multipli...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2008, 10:41   #17
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da cionci Guarda i messaggi
Fammi un esempio di valori multipli...
non ne abbiamo ancora ma la settimana prossima arriveranno i dati di configurazione di un dispositivo radio che dovrà far parte della comunicazione.
Ma da quello che ho capito sono solo interi quindi la stringa potrebbe essere qualcosa come:
"1 | 3 | 12 | 45"

ovviamente possono essere 1 così come 10.000 ...


Pensavo di aver già fatto la funzione invece non la trovo ... mi sa che devo dormire un pò di più e lavorare un pò di meno ...

EDIT: ah ecco, avevo fatto qualcosa trovando degli esempi STL in internet:

Codice:
bool LLElementHandler::GetFields( string & text, string & separators, list<string> &words )
{
	LogL.Write( LogLib::LOGLIB_DEBUG_FLOW_MSG, LOGLIB_FIX_ARGS, 0, "" );

	int n = text.length();
	int start, stop;

	start = text.find_first_not_of(separators);
  
	while ((start >= 0) && (start < n)) 
	{
		stop = text.find_first_of(separators, start);
		if ((stop < 0) || (stop > n)) 
			stop = n;
		
		words.push_back( text.substr(start, stop - start) );
		start = text.find_first_not_of(separators, stop + 1);
	}
	return true;
}
però mi sa di lento ...
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve

Ultima modifica di trallallero : 04-01-2008 alle 10:45.
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2008, 11:13   #18
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Se sono separati da spazio e da un altro carattere:
Codice:
#include <sstream>
#include <iostream>
#include <vector>

using namespace std;


vector<int> parse(const string &s)
{
    istringstream iss(s);
    vector<int> v;
    string separator;

    while (!iss.fail())
    {
        int tmp;
        iss >> tmp;
        if (!iss.fail()) v.push_back(tmp);
        iss >> separator;
    }
    return v;
}


int main()
{
    vector<int> v = parse("1 | 3 | 5 | 5");
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
        cout << *it << " ";
    cout << endl;

    v = parse("1 < 5");
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
        cout << *it << " ";
    cout << endl;

    return 0;
}
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2008, 11:23   #19
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
in pratica se non da errore è un intero e lo copi in list, l'ultimo errore fa uscire.
Interessante ...

in C è più corto ed elegante
Codice:
	v.push_back(atoi(c));
	while( c = strchr(c, Separator) )
		v.push_back(atoi(++c));
scherzo ovviamente.
Insomma con 'sto STL se pò fà tutto ... mi devo solo abituare ad usarlo ... addio C
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2008, 12:34   #20
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
ultimissima, lo giuro

sto applicando ciò che m'hai scritto (template)
ma adesso che non so che tipo è, come faccio a estrapolare i dati ?
Ovviamente non posso più fare atoi, quindi ?

Codice:
template <class T> vector<T> LLUtils::GetMinToMaxValues( string& s, int Separator )
{
	vector<T> v;
	
	int Min = atoi( s.c_str() );
	int Max = atoi( strchr(s.c_str(), Separator) + 1 );
	
	for ( int i = Min; i <= Max; ++i )
		v.push_back(i);
	return v;
}
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre Prova GeForce NOW upgrade Blackwell: il cloud ga...
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco Ecovacs Deebot X11 Omnicyclone: niente più...
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio Narwal Flow: con il mocio orizzontale lava i pav...
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi Panasonic 55Z95BEG cala gli assi: pannello Tande...
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione HONOR Magic V5: il pieghevole ultra sottile e co...
Lo sviluppatore di MSI Afterburner svela...
Quando l'AI diventa maestro: così...
Sony WH-1000XM6 già scontate su A...
NVIDIA chiede più velocità...
Windows 11 in soli 2,8 GB: con questo sc...
Panico in casa HYTE: ritirato dal mercat...
OPPO Reno14, debutto tra rooftoop esclus...
3DAIQ, il progetto di Concept Reply e TE...
Il parlamento francese contro TikTok: '&...
Apple Watch SE 2ª gen. Cellular a soli 2...
MotoE sospesa dopo il 2025: fine tempora...
GhostRedirector: nuova campagna di attac...
AirPods Pro 3, la nuova traduzione vocal...
Dead Island 3 potrebbe essere già...
Nuova Lancia Ypsilon Rally2 HF Integrale...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 16:22.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v