Aerys II Inviato 25 Settembre 2008 Autore Segnala Inviato 25 Settembre 2008 vedo una mezza dozzina di bachi. Cioè le tre volte che ho usato char* per due? e non hai fatto calcolatori? Ho fatto un esame chiamato Calcolatori Elettronici, ma lo seguivo solo per corteggiare una francese in Erasmus. Era inutile e terribilmente distante da questioni di reale utilità: tenuto da uno che aveva come unico pregio quello di somigliare a Ivo il Tardivo, parlava in modo vago e svogliato di pipeline e registri. Nessuna nozione reale. Un esame del nuovo ordinamento in pratica. Sono serissimo. perche` i char pointer sono una fabbrica di bachi e sono impossibili da gestire. usa le string, che sono la peggiore implentazione esistente di una stringa, ma almeno non sono mortali come i char pointer. Però ti dirò, considerando che li uso per quello scopo a inizio del programma e poi solo per finire in pasto a un Reader di immagini finora non han dato problemi. Domani in ogni caso mi ristudierò le stringhe, benché da manuale loro non si sbilancino a sconsigliare i char*.
Dusdan Inviato 25 Settembre 2008 Segnala Inviato 25 Settembre 2008 Però ti dirò, considerando che li uso per quello scopo a inizio del programma e poi solo per finire in pasto a un Reader di immagini finora non han dato problemi. Domani in ogni caso mi ristudierò le stringhe, benché da manuale loro non si sbilancino a sconsigliare i char*.guarda, in quello che hai scritto tu basta che uno ti dia 5 caratteri e si schianta. O peggio.
Aerys II Inviato 25 Settembre 2008 Autore Segnala Inviato 25 Settembre 2008 Touché: come diceva Nelson Mandela "Allocazione dinamica della memoria is the answer", dunque. In realtà contavo che il concetto di "ID di quattro lettere" fosse chiaro, ma tu mi insegni che avendo a che fare con utenti non qualificati (anzi) sarà il casodi eliminare subito il rischio. In realtà è una versione "da battaglia" che mi serve per elaborare dei dati senza ricompilare il tutto ogni volta scommentando e commentando di qua e di là per cambiare i file in ingresso, ma non vedo perché non seguire il tuo consiglio. Danke!
Dusdan Inviato 25 Settembre 2008 Segnala Inviato 25 Settembre 2008 Touché: come diceva Nelson Mandela "Allocazione dinamica della memoria is the answer", dunque. In realtà contavo che il concetto di "ID di quattro lettere" fosse chiaro, ma tu mi insegni che avendo a che fare con utenti non qualificati (anzi) sarà il casodi eliminare subito il rischio. In realtà è una versione "da battaglia" che mi serve per elaborare dei dati senza ricompilare il tutto ogni volta scommentando e commentando di qua e di là per cambiare i file in ingresso, ma non vedo perché non seguire il tuo consiglio. Danke! Indipendentemente dalla qualifica di chi lo usa, un programma non deve schiantarsi per una cosa del genere, soprattutto tenendo conto che potrebbe fare cose piu` subdole, tipo cambiare la memoria in cui hai altri dati.
Aerys II Inviato 26 Settembre 2008 Autore Segnala Inviato 26 Settembre 2008 Ok, mi sono dato una ripassata rapida, eliminato le cose ridondanti, adesso appare così: string id; cin>>id; string intest="Percorso_solito"; string SurfName1= intest+ id+ "nome_file"; Bene. Ho il problema, ora, di dover passare le stringhe così ottenute come variabili in ingresso a funzioni che vogliono normalmente ingressi del tipo const char*, come la utile (per me) funzione strlwr();, che permette di convertire in lower case tutti i caratteri di una stringa (almeno, con gli array di caratteri funzionava). Cosa ben più importante, è la funzione SetFileName(); della classe reader che devo utilizzare in modo massiccio a volere in ingresso un const char*;, ma anche con ofstream output(NOMEFILE); non ottengo risultati. Allora, da bravo bipede con pollice opponibile, leggo la documentazione e passo ai felloni che mi richiedevano un const char* un bel nome_stringa.data(); et voila. Unico problema, non certo indifferente per esigenze di case sensitivity, non so come far digerire le mie stringhe alla funzione strlwr(); che mi era proprio utile. Se per caso mi voleste mandare una mail a riguardo vi sarei lieto, domani non leggerò il forum se non tardi.
Dusdan Inviato 26 Settembre 2008 Segnala Inviato 26 Settembre 2008 per convertire una string in char pointer usa c_str() per convertire una string a lower case usa std::transform(stringa.begin(), stringa.end(), stringa.begin(),::tolower); la documentazione STL ti e` amica
Aerys II Inviato 26 Settembre 2008 Autore Segnala Inviato 26 Settembre 2008 Non ho fatto in tempo a leggere ieri notte, grazie per la dritta. Posso "passare" per char pointer dunque senza incorrere nella tua ira? Ok, fatto. Ora nasce una nuova questione: dovendo ripetere la stessa procedura per diversi file diversi, ho definito naturalmente una funzione da chiamare n volte (5 per ora) con i file di cui sopra come argomento. Due cose: 1) Come posso far sì che una funzione invii al file stream in uscita una stringa? Inizialisso lo stream nel main (es. ofstream output(nome_file);) ), poi lo passo come parametro alla funzione, e all'interno della stessa do il solito output>>stringa;? Così facendo non funge. E' la via giusta e sbaglio qualche dettaglio oppure devo aprire lo stream all'interno della funzione? Non è sconveniente aprire e chiudere un file n volte (tante quante sono le chiamate della funzione)? 2) Argomento su cui sono davvero totalmente digiuno, ovvero le eccezioni. Al momento io devo leggere i file relativi a cinque parti del cervello di x pazienti diversi (quelli identificati con l'id di quattro lettere di cui sopra). Tanto per non compilare e ricompilare di continuo mi sono inventato il barbarico metodo di cui sopra: ho creato per ciascun paziente una directory all'interno di quella principale, e in ciascuna directory ci sono i file relativi al paziente stesso, identificati non più con la caotica stringa con cui mi sono stati inviati ma con il nome della parte del cervello ivi contenuta sotto forma di vtkPolyData. In ogni cartella in pratica dovrei avere un file caudato.vtk, un pallido.vtk, un putamen.vtk, un calloso.vtk e un nbase.vtk. Il problema è che al momento non ho ancora tutti i dati di ciascun paziente: tre pazienti sono "completi", mentre gli altri hanno chi i dati di una sola parte, chi quelli di due, chi di tre... prima di creare la funzione di cui sopra (che mi da in output una valore di tipo "struttura_da_me_definita" che comprende un campo numerico e un campo attore da inviare al rendering) partiva un messaggio di errore, ma il programma lavorava solo sui dati in suo possesso ignorando i mancanti. Poi io provvedevo in uscita a dire "Se il valore è nullo si vede che mancava il dato e scrivi che il dato manca, altrimenti scrivi il valore". Ora con i pazienti "completi" va tutto bene, con gli altri il programma viene terminato nella vergogna. Ho realizzato che l'errore si presenta non nel momento di caricare il file, ma all'interno della funzione, errore del tipo "Qualche puntatore fa il gaglioffo..." (quello sulla memoria che non poteva essere "read"). Mi chiedevo a questo punto come gestire la cosa in modo da evitare questo problema molto fastidioso (che al momento mi costringe a compilare la primitiva versione da 700 righe anziché quella da 500, e soprattutto mi irrita alquanto), e credo che la risposta sia nelle eccezioni. Come dicevo però, si tratta di un argomento a me nuovo. Si trattasse di gestire un'eccezione tipo l'utente pistola che mi da cinque caratteri invece che quattro, come dicevamo, saprei cavarmela semplicemente con quel poco che ho appreso su try, throw, catch, mentre così... boh!!! Devo cercare nella documentazione delle classi che uso il codice d'errore, e dire che se catch riceve un'eccezione di quel genere deve restituire un errore e skippare l'istanza (termine improprio ma ci siamo capiti ) della funzione? Forse dovrei agire prima ancora, nel main, dicendo "Se il reader non trova il file allora lancia questa eccezione e salta "l'istanza"(nuovamente termine improprio)"? O forse niente eccezioni ma un semplice if(il_file_può_essere_aperto_dall'ifstream){fai il tuo dovere} else {skippa la parte del cervello che manca}; ? EDIT: Ho adottato il metodo di cui sopra, con if/else. Per verificare l'esistenza uso una funzione trovata online leggermente modificata da me: bool doesExist(string filepath) { bool exists = false; fstream fin; fin.open(filepath.data() ,ios::in); if( fin.is_open() ) exists=true; fin.close(); return exists; }; Sono soddisfatto così, ora devo capire come gestire la faccenda dell'output da interno funzione, ma non è proprio così necessario. Qualcuno qui ha esperienza nell'uso di FLTK?
Dusdan Inviato 13 Novembre 2008 Segnala Inviato 13 Novembre 2008 Qualcuno qui ha esperienza nell'uso di FLTK?Ma hai deciso di passarti tutti i toolkit del caspio che sono stati creati dall'uomo? Qt, santoddio, Qt
Aerys II Inviato 13 Novembre 2008 Autore Segnala Inviato 13 Novembre 2008 Non l'ho deciso io, sto modificando un programma di terzi con interfaccia FLTK. Avrei bisogno di un metodo in C++ per verificare se un array (ma più in generale una variabile) è stato dichiarato o meno, una cosa tipo if (variabile non esiste già) { tipovariabile variabile = blablabla; //Dichiaro la variabile e assegno un valore } L'idea è assegnare un set di valori a un array quando arriva l'evento PUSH del mouse (ovvero quando clicco), e poi mantenere l'array in questione fino all'evento RELEASE (quando smetto di tenere premuto il tasto sinistro). Come posso uscirne? Esiste un modo per testare l'esistenza di una variabile?
Dusdan Inviato 20 Novembre 2008 Segnala Inviato 20 Novembre 2008 Esiste un modo per testare l'esistenza di una variabile?? Se una variabile non e`stata definita e tu la usi ti da` un errore il compilatore.
Aerys II Inviato 20 Novembre 2008 Autore Segnala Inviato 20 Novembre 2008 Sì, lo so. In realtà mi sono espresso come il cafone che sono. La pongo diversamente: mi serve un metodo per far sì che se all'interno di un ciclo gli elementi di un array sono già stati inizializzati, le successive iterazioni utilizzino l'array senza modificarne gli elementi. Può funzionare il fatto di inizializzarlo con un for (int i=0; i<numeroelementi; i++){ array=NULL; } e poi fare un if/then del tipo "se tutti gli elementi sono NULL allora assegna questi valori"?
Dusdan Inviato 20 Novembre 2008 Segnala Inviato 20 Novembre 2008 Sì, lo so. In realtà mi sono espresso come il cafone che sono. La pongo diversamente: mi serve un metodo per far sì che se all'interno di un ciclo gli elementi di un array sono già stati inizializzati, le successive iterazioni utilizzino l'array senza modificarne gli elementi. Può funzionare il fatto di inizializzarlo con un for (int i=0; i<numeroelementi; i++){ array=NULL; } e poi fare un if/then del tipo "se tutti gli elementi sono NULL allora assegna questi valori"? usa i vector.
Aerys II Inviato 8 Gennaio 2009 Autore Segnala Inviato 8 Gennaio 2009 Mi tengo volontariamente sul vago per mantenere la discussione più "aperta" possibile: se un metodo di classe (ma più in generale la feat di un programma) funziona bene su un sistema Windows e meno bene su un sistema GNU/Linux (o viceversa), è logico pensare che la cosa dipenda da una qualche libreria di sistema che differisce tra le due macchine? Quali altri elementi potrebbero portare a un malfunzionamento? Ripeto: sto sul vago per non viziare le vostre possibili risposte. Se a voi capitasse di scrivere un programma che funziona alla grande su un sistema operativo e mostrasse strani comportamenti su un altro, a cosa sareste propensi ad addossare la colpa? Nessun warning particolare dal compilatore, nulla di affidato al precompilatore: a parità di algoritmo, additerei le librerie... o no?
DarKnight Inviato 8 Gennaio 2009 Segnala Inviato 8 Gennaio 2009 Se fosse Java, direi che la colpa se la può prendere la JVM, mi è capitato diverse volte di avere risultati diversi sui due SO con lo stesso programma. Ma non sapendone di più (in generale, non sono espertissimo in programmazione) non saprei dire di più.
Dusdan Inviato 8 Gennaio 2009 Segnala Inviato 8 Gennaio 2009 - librerie - virtual machine o interprete - caratteristiche del sistema operativo (multithreading, networking) - compilatore che ottimizza il codice diversamente
Aerys II Inviato 8 Gennaio 2009 Autore Segnala Inviato 8 Gennaio 2009 Spero sia un problema di compilatore: in teoria poi potrò ricavare in qualche modo un pacchetto precompilato per Lino. Mi spiacerebbe, ma scendo volentieri a compromessi, anche considerando che il programma non l'ho scritto io e a mio avviso la rogna è insita in quello e non nella mia patch (che fa meno "giri" possibile e si limita all'essenziale)... Mi servirebbe consiglio da qualcuno che abbia esperienza nell'uso delle OpenGL, nella fattispecie a partire da un buffer di pixel vorrei una procedura per ottenerne il contorno.
Aerys II Inviato 9 Marzo 2009 Autore Segnala Inviato 9 Marzo 2009 Domanda un po' da Help Desk ma nemmeno troppo. Sto scrivendo un programma per la conversione di certi formati a JPEG, è una cosetta proprio piccina che dovrà funzionare da riga di comando. E' possibile con Visual Studio (sì, lo odio anche io ma devo usarlo) ottenere un debug "ragionato" fatto passando all'eseguibile i parametri che poi l'utente dovrà passare nell'uso del programma? Sarà triviale come domanda, ma non so come fare a comunicare al dannato IDE di casa Microzozz di iniziare il debug usando l'eseguibile XYZ.exe nella forma XYZ.exe -a -b -cBLABLA -oOutput FILEDAPROCESSARE Considerando che la conversione in questione è di durata piuttosto consistente (oltre che per motivi di buona metodologia, naturalmente) non posso andare avanti a run e ri-run cambiando il sorgente in cerca di problemi. Ideas? Suggerimentos? Grazies.
liadon87 Inviato 19 Marzo 2009 Segnala Inviato 19 Marzo 2009 E' purtroppo da parecchio tempo che non mettevo mano a questo linguaggio (il C, anzi ANSI C) e non ricodo più come si fa ad acquisire i parametri da riga di comando... dopo aver dichiarato void main(int argc, char argv[]){ /*segue codice*/ } provo ad estrarre gli argomenti passati in questo modo ./prog 12 4 5 con semplicemente variabile = argv[x] con x compreso tra 1 e argc-1 ma ottengo sempre numeri che non c'entrano nulla, ho provato anche a fare i vari cast a int, a int* ma nulla.... un aiutino?^^
Dusdan Inviato 19 Marzo 2009 Segnala Inviato 19 Marzo 2009 Non devi fare il cast, ma devi convertire: int par1 = atoi(argv[1]); 1
Ren! Inviato 16 Novembre 2009 Segnala Inviato 16 Novembre 2009 Buonsalve a tutti! Uppo questo vecchio topic per chiedere aiuto su un problema di programmazione! Prima di esporvi il problema vi dico che è da più di 2 anni che non programmo e che ricordo poco o niente, poi sto usando Visual Basic 6.0 Pro, ma questo è indifferente, il mio problema è questo: Ho creato un pulsante che quando viene premuto dall'utente si apre una box di input e chiede di inserire una frase/parola, e se nella frase c'è la parola "Paracadute" allora esce un messaggio (chiamiamolo M1), altrimenti ne esce un altro (M2)... Il problema è che se inserisco "ciao paracadute" mi da M2, perchè non so come si fa a inserire nella condizione anche altre parole che non centrano nulla con le altre, in pratica mi serve che il programma consideri solo la parola chiave, cioè "paracadute" (sia maiusola che minuscola). Spero che abbiate capito! Chi può darmi una mano a risolvere questo dilemma??? Grazie infinite! Bye byez
Messaggio consigliato
Crea un account o accedi per commentare
Devi essere un utente registrato per poter lasciare un commento
Crea un account
Crea un nuovo account e registrati nella nostra comunità. È facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora