Torna indietro   Hardware Upgrade Forum > Software > Programmazione

BOOX Note Air4 C è uno spettacolo: il tablet E Ink con Android per lettura e scrittura
BOOX Note Air4 C è uno spettacolo: il tablet E Ink con Android per lettura e scrittura
BOOX Note Air4 C rappresenta l'ultima incarnazione della categoria dei tablet E Ink a colori di Onyx, e combina le prestazioni di un dispositivo Android con l'ottima tecnologia Kaleido 3 per il display. Con schermo da 10,3 pollici, un processore Qualcomm Snapdragon 750G e 6 GB di RAM, promette un'esperienza completa per lettura, scrittura e produttività. Il prezzo lo posiziona nel segmento premium, ma questo dispositivo è un vero spettacolo!
Recensione Sony Xperia 1 VII: lo smartphone per gli appassionati di fotografia
Recensione Sony Xperia 1 VII: lo smartphone per gli appassionati di fotografia
Sony Xperia 1 VII propone un design sobrio e funzionale, con un comparto fotografico di ottimo livello caratterizzato da uno zoom continuo e prestazioni generali da top di gamma puro. Viene proposto con una personalizzazione software sobria e affidabile, ma presenta qualche criticità sul fronte ricarica rapida. Il dispositivo punta su continuità stilistica e miglioramenti mirati, rivolgendosi al solito pubblico specifico del brand giapponese.
Attenti a Poco F7: può essere il best buy del 2025. Recensione
Attenti a Poco F7: può essere il best buy del 2025. Recensione
Poco F7 5G, smartphone che punta molto sulle prestazioni grazie al processore Snapdragon 8s Gen 4 e a un display AMOLED da ben 6,83 pollici. La casa cinese mantiene la tradizione della serie F offrendo specifiche tecniche di alto livello a un prezzo competitivo, con una batteria generosissima da 6500 mAh e ricarica rapida a 90W che possono fare la differenza per gli utenti più esigenti.
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


BOOX Note Air4 C è uno spettacolo: il tablet E Ink con Android per lettura e scrittura BOOX Note Air4 C è uno spettacolo: il tab...
Recensione Sony Xperia 1 VII: lo smartphone per gli appassionati di fotografia Recensione Sony Xperia 1 VII: lo smartphone per ...
Attenti a Poco F7: può essere il best buy del 2025. Recensione Attenti a Poco F7: può essere il best buy...
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale Recensione Samsung Galaxy Z Fold7: un grande sal...
The Edge of Fate è Destiny 2.5. E questo è un problema The Edge of Fate è Destiny 2.5. E questo ...
Auto nuove? Per il 65% degli italiani so...
Droni solari Airbus volano nella stratos...
Colpo da 15 milioni di dollari: chi ha r...
Elon Musk lancia l'allarme su GPT-5: 'Op...
iPhone 17 Pro sarà più cos...
Leapmotor spinge sull'acceleratore: nuov...
Toyota vuole battere i produttori cinesi...
Colpo grosso di Musk: 14 ricercatori Met...
Lip-Bu Tan a testa alta: il CEO di Intel...
GPT5 disponibile per tutti e puoi gi&agr...
Nasce l'alternativa a Worldcoin: Humanit...
ASUSTOR presenta i nuovi NAS da rack Loc...
iPhone 18, sensori Samsung realizzati in...
Xiaomi conquista il terzo posto nel merc...
Pulizia millimetrica senza muovere un di...
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: 04:29.


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