Oppure

Loading
19/10/20 18:47
AldoBaldo
In effetti devo ammettere che anche quando uso ALCUNE della caratteristiche del C++ lo faccio alla maniera di uno che ha in mente il C, per cui hai visto giusto. E' per sentirmi su un terreno più famigliare che (ad esempio) anche all'interno delle classi del C++ uso spesso malloc/calloc/realloc invece di new. Per la stessa ragione evito di usare string e prediligo gli array di char. Avrai anche notato che preferisco non ricorrere al mettanismo throw/catch se non in casi in cui è impossibile fare diversamente. Tollerabile, ma non credo siano buone pratiche.

Per chi è pratico del C++, usare oggetti di tipo string non dovrebbe essere un problema, anche perché se non erro così facendo eviti tutte le problematiche legate alla necessità di conoscere in anticipo le dimensioni della stringa risultante (avrai notato che ho dovuto fare due "scannate" della cartella, la prima delle quale ha la sola funzione di conoscere le dimensioni della memoria da allocare per "ospitare" l'array di stringhe C).

Le tre funzioni di ricerca dei file possono essere usate sia in C, sia in C++. Cambia solo il modo in cui "estrai" dalla struttura WIN32_FIND_DATA i dati che ti interessano (essenzialmente il campo cFileName).

Per avere informazioni sulle funzioni di ricerca che ho usato la fonte di informazioni più appropriata è msdn:

docs.microsoft.com/en-us/windows/win32/api/fileapi/
docs.microsoft.com/en-us/windows/win32/fileio/…

Effettivamente è tutto un po' complesso (per il mio livello).
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
23/06/21 14:38
musical wrighter
Buon giorno a tutti, eccomi nuovamente quì. Dal momento che quì su questo forum è stata da poco lanciata un'altra discussione molto simile per l'argomento a questa mia dell'anno scorso come scrivo anche li ho colto l'occasione per riprendere anch'io in mano il progetto di cui parlo quì dell'audio player parlante per provare a riscriverlo in maniera un po diversa seguendo anche i suggerimenti arrivati nell'altra discussione. usando tanto per cominciare i metodi FindFirstFile e FindNextFile per ricercare nella cartella invece di system(dir) per creare un file di testo da rileggere. Dunque il codice diventa così
#include <iostream>
#include <string>
#include <Windows.h>
#include <sapi.h>
#include <vector>
using namespace std;
#pragma comment(lib,"winmm.lib")
ISpVoice* pVoice;
HRESULT hr;
// una funzione per far comunicare l'applicazione con lutente sia tramite video sia col riscontro vocale 
void output(wstring esempio)
{
	wcout << esempio; hr = pVoice->Speak(esempio.c_str(), 0, NULL);
}
int main()
{
//in caso ci fossero file audio con caratteri accentati nei nomi, perché siano riconosciuti correttamente
system("chcp.com 1252");
wstring nome;
vector<wstring>audio;
	pVoice = NULL;
	if (FAILED(::CoInitialize(NULL)))
	{
		cout << "Non è stato possibile attivare lo speaker su questo computer. Per tanto l'applicazione non è in grado di proseguire. Prego, verifica sull'hard disk la disponibilità del motore di sintesi vocale Sapi prima di avviare nuovamente l'eseguibile" << endl;
system("set /p asd=Premi nuovamente invio per uscire");
		return FALSE;
	}
	hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void**)&pVoice);
	if (SUCCEEDED(hr))
	{
		WIN32_FIND_DATA FindFileData;
		HANDLE hFind;
		hFind = FindFirstFile(L"\*.*", &FindFileData);
		while (FindNextFile(hFind, &FindFileData))
{
//dovrebbe servire a scorrere i nomi di tutti i file presenti, ma memorizzare solo gli audio wav
nome = FindFileData.cFileName;
			if (nome.substr(nome.size() - 4, nome.size()) == L".wav") { audio.push_back(nome);}
		}
FindClose(hFind);
output(L"Ben venuto! Abbiamo trovato " + to_wstring(audio.size()) + L" brani! Buon ascolto");
cout << endl;
		for (wstring brano : audio)
{
output(brano.substr(0, brano.size() - 4));
PlaySound(brano.c_str(), NULL, SND_FILENAME);
cout << endl;
}
output(L"Arrivederci");
	}
	pVoice->Release();
	pVoice = NULL;
	::CoUninitialize();
}

Quello che intendevo far fare all'eseguibile era dare il benvenuto all'utente e comunicare quanti audio erano presenti, dopo di che procedere direttamente ad intrattenere con un po di musica. Annunciando ogni volta il nome dell'audio e riproducendolo fino al termine. Arrivato all'ultimo wav presente in fine salutare e chiudersi. In Visualstudio dalla versione 2019 nel main è già inserito di default return 0 anche senza che si legga nel codice c++ credo. Quello che però fa quando provo ad avviare il file.exe è aprirsi, darmi conferma a video d'aver cambiato la codifica per riconoscere gli accenti e richiudersi immediatamente dopo. In pratica la prima riga nel main sembra la sola istruzione che interpreta ed esegue correttamente. Ma non è quella a bloccare tutto il resto perché ho anche provato a commentarla e a premurarmi d'inserire nella cartella wav senza accentate. In quel caso l'eseguibile rimane aperto per un paio di secondi, non fa assolutamente nulla e si richiude. Qualcuno ha idea di dove sto sbagliando? grazie e buona giornata a tutti
Ultima modifica effettuata da musical wrighter 23/06/21 17:35
aaa
30/06/21 10:29
La ricerca che hai fatto (prendendo tutti i file e controllando, male fra l'altro, l'estensione) non ha senso.

Fai selezionare al sistema operativo direttamente i file che ti servono

		hFind = FindFirstFile(L"\*.wav", &FindFileData);
		while (FindNextFile(hFind, &FindFileData))
		{
			nome = FindFileData.cFileName;
			audio.push_back(nome); 
		}


E dopo controlla di aver ottenuto almeno un file prima di continuare con il "benvenuto"