Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
WF-1000X M6 è la sesta generazione di auricolare in-ear sviluppata da Sony, un prodotto che punta a coniugare facilità di utilizzo con una elevata qualità di riproduzione dei contenuti audio e una cura nella riduzione del rumore ambientale che sia da riferimento
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake ha presentato diverse novità per la sua piattaforma legate all'intelligenza artificiale. Quella forse più eclatante è una collaborazione con OpenAI, ma non mancano diverse nuove funzionalità che rendono la piattaforma più flessibile e in grado di rispondere meglio alle esigenze in continuo cambiamento delle aziende
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Con velocità teoriche fino a 11 Gbps, gestione tramite app intelligente e protezione avanzata dei dispositivi, Roamii BE Pro porta il Wi‑Fi 7 tri‑band nelle abitazioni più esigenti. Un sistema Wi-Fi Mesh proposto da MSI allo scopo di garantire agli utenti una rete fluida e continua capace di sostenere streaming 8K, gaming competitivo e le applicazioni moderne più esigenti in termini di banda
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 29-08-2010, 21:49   #1
Andrea993
Member
 
Iscritto dal: Jun 2010
Messaggi: 35
[c#] Indice oltre i limiti della matrice.

Sto programmando un applicazione e mi sono imbattuto in questo strano errore
Indice oltre i limiti della matrice.
Il progetto viene compilato ma quando arriva a questa linea dove devo tagliare una stringa si blocca dando l'errore sopra citato.

Codice:
string pippo= files_trovati[i].Remove(0, files_trovati[i].Length - 3);
La cosa strana che se metto un breakpoint su questa riga e la eseguo manualmente non da l'errore.

Avete qualche idea? Grazie in anticipo
Andrea993 è offline   Rispondi citando il messaggio o parte di esso
Old 29-08-2010, 22:11   #2
sneeze
Senior Member
 
L'Avatar di sneeze
 
Iscritto dal: Aug 2001
Messaggi: 1049
le possibilità sono molto poche. Quella riga di codice è critica in due casi. la i che può andare fuori dalla dimensione massima del tuo indice e il comando remove dove al secondo membro dai per scontato che la string asia più lunga di 3.
Dovrei vedere più cosice per dirti dov'è l'errore. Ad ogni modo mi sembra di capire che hai un array di file e vuoi ottenere solo le estesioni giusto?
nel qual caso perchè non usare il tipo fileinfo e un pò di Linq?
Dai uno sgardo quà

Codice:
static void Main(string[] args)
        {
            string[] files = {"pippo.txt", "pluto.jpg", "paperino.pdf", "topolino.csv"};
            files = files.Select(i => new FileInfo(i).Extension).ToArray();
            foreach (var estensione in files)
            {
                Console.WriteLine(estensione);
            }
            Console.ReadLine();
        }
risultato a video:
.txt
.jpg
.pdf
.csv

Ultima modifica di sneeze : 29-08-2010 alle 22:15.
sneeze è offline   Rispondi citando il messaggio o parte di esso
Old 29-08-2010, 22:23   #3
Andrea993
Member
 
Iscritto dal: Jun 2010
Messaggi: 35
Non è nessuna delle due cose.
La i è uguale a 0

La stringa ha almeno 30 caratteri.

Ma il fatto è che funziona se si va con il debug!
Ah sì altra cosa strana è che anche se ha dato l'errore il valore di pippo è giusto!

Qui c'è un problema simile ma non ho capito la soluzoine se chi è più esperto ci da un occhiata...
Codice:
http://www.dotnethell.it/forum/messages.aspx?ThreadID=29954
Andrea993 è offline   Rispondi citando il messaggio o parte di esso
Old 29-08-2010, 22:46   #4
sneeze
Senior Member
 
L'Avatar di sneeze
 
Iscritto dal: Aug 2001
Messaggi: 1049
l'errore segnalato nell'altra pagina è un errore generato dai thread e non credo che tu stia facendo uso di thread.
forse non ci siamo capiti prima.
se vuoi che possiamo capire dove sta l'errore devi farci vedere il codice. quella riga da sola vuol dire tutto e niente.
sneeze è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2010, 16:06   #5
sneeze
Senior Member
 
L'Avatar di sneeze
 
Iscritto dal: Aug 2001
Messaggi: 1049
Ciao non ho ancora avuto tempo di analizzare bene il tuo codice.
In tanto ti posso dire che già nel primo for utilizzi una variabile int b = 0 che poi non incrementi mai....
sei sicuro di non esserti dimenticato qualcosa?
cmq appena ho tempo lo guardo bene
sneeze è offline   Rispondi citando il messaggio o parte di esso
Old 30-08-2010, 17:00   #6
sneeze
Senior Member
 
L'Avatar di sneeze
 
Iscritto dal: Aug 2001
Messaggi: 1049
Allora ho guardato con più calma... ci sono tanti errori e tanti punti inutili o mal progettati.
Per tua comodità ti riposto il tuo codice commentato da me e successivamente un esempio di come sistemarlo un pò, tieni conto che non capisco bene quello che vuoi fare e molto probabilmente anche il mio codice si potrebbe ulteriormente migliorare... e di molto sapendo quello che deve fare. Per il momento mi sono limitato a togliere errori e ridondanze strane

questo è il tuo codice commentato:

Codice:
class Program
    {
        static string[] dir_trovate;
        static string[] files_trovati;
        static int indice;
        static string strtemp;
        static void Main(string[] args)
                       
        {
            string[] arg = new string [10];
            arg[0] = @"C:\";

            files_trovati = Directory.GetFiles(arg[0], "*.*", SearchOption.AllDirectories);
            dir_trovate = Directory.GetDirectories(arg[0], "*", SearchOption.AllDirectories);

            for (var i = 0; i < files_trovati.Length; i++)
            {
                //Questa variabile b che utilizzi non viene mai incrementata da nessuna parte... che senzo ha?
                //a questo punto converrebbe la forma for (; i < 355;i++ ) N.B. ricorda che in un for tutti i parametri sono opzionali,
                //quindi se non ti servono è inutile crearli 
                
                    //Inoltre non capisco perchè utilizzi di nuovo i in questo for.... per forza che hai problemi sugli indici.... stai già utilizzando i nel for precedente....
                    for (var b = 0; i < 350; i++)
                    {
                        //Quì non capisco che controllo fai, la variabile b sarà sempre uguale a 0 perchè l'hai dichiarata così e non la 
                        //incrementi mai, quindi cosa vuol dire questo if?
                        if (b != 1 | b != 5)
                        {
                            //Uguale a prima.... vedi sopra
                            if (b < 10)
                            {
                                //string pippo= files_trovati[i].Remove(0, files_trovati[i].Length - 3);
                                //la linea sopra voglio integrarla dentro l'if come ho fatto sotto...era solo x prova

                                //Ricerdati che puoi usare il string.format per formattare un intero in modo che torni una stringa lunga 2 e quindi conun eventuale 0 davanti
                                //Vedi il mio esempio sotto per chiarimenti
                                if (files_trovati[i].Remove(0, files_trovati[i].Length - 3) == "r" + "0" + Convert.ToString(b))
                                {
                                    string pippo = files_trovati[i].Remove(0, files_trovati[i].Length - 3);
                                    File.Delete(files_trovati[i]);
                                }
                                if (files_trovati[i].Remove(0, files_trovati[i].Length - 2) == "0" + Convert.ToString(b))
                                {
                                    File.Delete(files_trovati[i]);
                                }
                                if (files_trovati[i].Remove(0, files_trovati[i].Length - 2) == "h" + "0" + Convert.ToString(b))
                                {
                                    File.Delete(files_trovati[i]);
                                }

                            }
                                //if else inutile per quello spiegato sopra.... vedi esempio sotto
                            else
                            {
                                if (files_trovati[i].Remove(0, files_trovati[i].Length - 3) == "r" + Convert.ToString(b) | files_trovati[i].Remove(0, files_trovati[i].Length - 4) == "r" + Convert.ToString(b))
                                {
                                    File.Delete(files_trovati[i]);
                                }
                                if (files_trovati[i].Remove(0, files_trovati[i].Length - 2) == Convert.ToString(b) | files_trovati[i].Remove(0, files_trovati[i].Length - 3) == Convert.ToString(b))
                                {
                                    File.Delete(files_trovati[i]);
                                }
                                if (files_trovati[i].Remove(0, files_trovati[i].Length - 2) == "h" + Convert.ToString(b) | files_trovati[i].Remove(0, files_trovati[i].Length - 3) == "h" + Convert.ToString(b))
                                {
                                    File.Delete(files_trovati[i]);
                                }
                            }
                        }
                        //Che controllo è? esiste per forza il file, te l'ha tornato la funzione getFiles...... non può non esistere
                        if (File.Exists(files_trovati[i]))
                        {
                            //variabili superflue, puoi alleggerire vedi esempio sotto
                            indice = files_trovati[i].LastIndexOf("\\");
                            strtemp = (files_trovati[i].Remove(0, indice + 1));
                            try
                            {
                                //più velocee comodo un substring perchè non calcoli tutte le volte il lenght della stringa.... vedi sotto
                                if (strtemp.Remove(9, strtemp.Length) == "PtiQwerty")
                                {
                                    //Anche quì la o è inutile in qualndo darebbe false all'if solo se strtemp == "PtiQwertyItalian.rsc" && strtemp == "PtiQwertyEnglish.rsc" cosa impossibile
                                    //Penso tu volessi mettere una E.... guarda esempio sotto
                                    if (strtemp != "PtiQwertyItalian.rsc" | strtemp != "PtiQwertyEnglish.rsc")
                                    {
                                        File.Delete(files_trovati[i]);
                                    }
                                }
                            }
                                //i catch vuoti sono abbastanza inutili, trampi le eccezioni senza neanche tracciarle...
                            catch { }
                            try
                            {
                                //Stesso discorso... meglio un substring
                                if (strtemp.Remove(3, strtemp.Length) == "Pti")
                                {
                                    //Stesso discorso volevi mettere la E
                                    if (strtemp != "PtiItalian.rsc" | strtemp != "PtiEnglish.rsc" | strtemp != "ptidecumacore.dll")
                                    {
                                        File.Delete(files_trovati[i]);
                                    }

                                }
                            }
                            catch { }
                            strtemp = null;



                        }

                    }
            }

            for (int i = 0; i < dir_trovate.Length; i++)
            {
                //Come sopra utilizzi b e poi incrementi i che per altro già la utilizzi nel for precedente.... proprio non ha senso e fa casino con gli indici perchè
                //come sopra questo ciclo ti porta i a 350 poi invece che andare alla directory successiva il prossimo giro andrà alla dir_trovate[351]..... 
                //ma che senso ha?
                for (int b = 0; i < 350; i++)
                {
                    try
                    {
                        //b non potrà mai essere < 0, tutto inutile, vedi esempio sotto
                        //se invece volevi scrivere < 10 e hai sbagliato a digitare ti riporto all'altro if sopra.... è un controllo inutile, usa lo string format
                        //per aggiungere uno 0 davanti all'intero se < 10 e non un if
                        if (b < 0)
                        {
                            if (dir_trovate[i].Remove(0, dir_trovate[i].LastIndexOf("\\") + 1) == "0" + Convert.ToString(b))
                            {
                                Directory.Delete(dir_trovate[i], true);
                            }
                        }
                    }
                    catch { }
                    try
                    {
                        //b è sempre > 0, if inutile, vedi esempio sotto
                        if (b > 0)
                        {
                            if (dir_trovate[i].Remove(0, dir_trovate[i].LastIndexOf("\\") + 1) == Convert.ToString(b))
                            {
                                Directory.Delete(dir_trovate[i], true);
                            }
                        }
                    }
                    catch { }
                    }
                }
            }
        }
Questo è l'esempio mio con un pò di accorgimenti:

Codice:
static string[] _dirTrovate;
        static string[] _filesTrovati;
        static int _indice;
        static string _strtemp;
        static void Main(string[] args)
        {
            var arg = new[]{@"C:\"};
            
            _filesTrovati = Directory.GetFiles(arg[0], "*.*", SearchOption.AllDirectories);
            _dirTrovate = Directory.GetDirectories(arg[0], "*", SearchOption.AllDirectories);

            foreach (var file in _filesTrovati)
            {
                for (var b = 0; b < 350; b++)
                {
                    if (b != 1 && b != 5) 
                    {
                            if (file.Remove(0, file.Length - 3) == string.Format("r{0:00}", b))
                            {
                                string pippo = file.Remove(0, file.Length - 3);
                                File.Delete(file);
                            }
                            if (file.Remove(0, file.Length - 2) == string.Format("{0:00}", b))
                            {
                                File.Delete(file);
                            }
                            if (file.Remove(0, file.Length - 2) == string.Format("h{0:00}", b))
                            {
                                File.Delete(file);
                            }

                    }

                    if (!File.Exists(file)) continue;
                    _strtemp = (file.Substring(0, file.LastIndexOf("\\")+ 1));
                    try
                    {
                        if (_strtemp.Substring(0,9) == "PtiQwerty")
                        {
                            if (_strtemp != "PtiQwertyItalian.rsc" && _strtemp != "PtiQwertyEnglish.rsc")
                            {
                                File.Delete(file);
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        throw;
                    }
                    try
                    {
                        if (_strtemp.Substring(0,3) == "Pti")
                        {
                            if (_strtemp != "PtiItalian.rsc" && _strtemp != "PtiEnglish.rsc" && _strtemp != "Ptidecumacore.dll")
                            {
                                File.Delete(file);
                            }

                        }
                    }
                    catch (Exception e)
                    {
                        throw; 
                    }
                    _strtemp = null;
                }
            }
            foreach (var t in _dirTrovate)
            {
                for (var b = 0; b < 350; b++)
                {
                    try
                    {
                            if (t.Remove(0, t.LastIndexOf("\\") + 1) == b.ToString())
                            {
                                Directory.Delete(t, true);
                            }
                        
                    }
                    catch { }
                }
            }
        }
sneeze è offline   Rispondi citando il messaggio o parte di esso
Old 31-08-2010, 00:19   #7
Andrea993
Member
 
Iscritto dal: Jun 2010
Messaggi: 35
Grazie mille mi hai veramente fatto un enorme piacere, ci sono poche persone disponibili come te.

Ho fatto molti errori di svista ad esempio quello che begli if scrivo int b e poi uso b.

Poi non so a cosa serve questo: ("{0:00}", b))

Non l'avevo mai visto, altra cosa iop usavo la distinzione di numeri minori di 10 e numeri maggiori di 10 a casua del fatto che le cartelle o i file da cancellare quando sono minori di 10 invece di chiamrsi 1,2,3 si chiamano 01,02,03.
E non mi sembra di aver visto tale distinzione nel tuo codice, o mi sbaglio???
Perchè non vorrei sbagliarmi.

Comunque grazie mille, davvreo gentilissimo

A sì e poi un altra cosa a cosa serve "Exception e" che metti in catch??

EDIT: Ho rivisto applicato il tuo codice è devo dire che è una meraviglia ho trovato solo un paio di banali errori di svista, ma non sapendo neanche quello che deve fare il codice averlo intuito con così tanta facilità mi sembra da geni.
Magari essere io come te.

Posto il codice finale
Codice:
static string[] _dirTrovate;
        static string[] _filesTrovati;
        static int _indice;
        static string _strtemp;



        static void Main(string[] args)            
        {
            var arg = new[] { @"C:\Users\Andrea\Desktop\pippo" };

            _filesTrovati = Directory.GetFiles(arg[0], "*.*", SearchOption.AllDirectories);
            _dirTrovate = Directory.GetDirectories(arg[0], "*", SearchOption.AllDirectories);

            foreach (var file in _filesTrovati)
            {
                for (var b = 0; b < 350; b++)
                {
                    if (b != 1 && b != 5)
                    {
                        if (file.Remove(0, file.Length - 3) == string.Format("r{0:00}", b))
                        {
                            string pippo = file.Remove(0, file.Length - 3);
                            File.Delete(file);
                        }
                        if (file.Remove(0, file.Length - 2) == string.Format("{0:00}", b))
                        {
                            File.Delete(file);
                        }
                        if (file.Remove(0, file.Length - 2) == string.Format("h{0:00}", b))
                        {
                            File.Delete(file);
                        }

                    }

                    if (!File.Exists(file)) continue;
                    _strtemp = (file.Remove (0, file.LastIndexOf("\\") + 1));
                   
                    try
                    {
                        if (_strtemp.Substring(0, 3) == "Pti")
                        {
                            if (_strtemp != "PtiItalian.rsc" && _strtemp != "PtiEnglish.rsc" && _strtemp != "Ptidecumacore.dll" && _strtemp != "PtiQwertyItalian.rsc" && _strtemp != "PtiQwertyEnglish.rsc")
                            {
                                File.Delete(file);
                            }

                        }
                    }
                    catch (Exception e)
                    {
                        throw;
                    }
                    _strtemp = null;
                }
            }
            foreach (var t in _dirTrovate)
            {
                for (var b = 0; b < 350; b++)
                {
                    try
                    {
                        if (t.Remove(0, t.LastIndexOf("\\") + 1) == string.Format("{0:00}",b)&& b!=1 && b!=5)
                        {
                            Directory.Delete(t, true);
                        }

                    }
                    catch { }
                }
            }

        }

Ultima modifica di Andrea993 : 31-08-2010 alle 00:56.
Andrea993 è offline   Rispondi citando il messaggio o parte di esso
Old 31-08-2010, 09:25   #8
sneeze
Senior Member
 
L'Avatar di sneeze
 
Iscritto dal: Aug 2001
Messaggi: 1049
Poi non so a cosa serve questo: ("{0:00}", b))

il string.format serve proprio a formattare una stringa dando volendo anche dei pattern... quel "{0:00}",b vuol dire proprio metti la variabile b in posizione 0 e formattala secondo il pattern 00, cosa vuol dire? vuol dire che se b=3 allora la stringa risultante sarà 03, se vale 8 sarà 08 e se vale 11 sarà 11....

Ecco perchè non serve più l'if di controllo quando b<10 o >10, lo 0 in più lo mette già se necessario....

Per le Exception....

quando fai un try catch nel catch puoi intercettare la eventuale eccezione che si scatena, per intercettarla devi appunto dichirarla nel catch.
Codice:
try
{
...
}
catch(Exception e)
{
Messagebox.Show(e.message);
}
Questo blocco di codice intercetta una qualsiasi eccezione generata dal blocco try e la stampa su una message box.
Ovviamente puoi intercettare specifiche tipologie di eccezzione, ogni metodo può scatenerare tipologie ben definite di eccezione, Exception e invece le intercetta tutte in quanto generico... Però puoi modificare il codice precedente in

Codice:
try
            {
                //....
            }
            catch (ArgumentNullException argomentoNullo)
            {
                    
                Console.WriteLine("eccezione di tipo Argomento nullo: " + argomentoNullo.Message);
            }
            catch (Exception eccezzioneGenerica)
            {

                Console.WriteLine("Eccezzione generica: " + eccezzioneGenerica);
            }
            finally
            {
                Console.WriteLine("istruzioni da eseguire sempre");
            }
In questo modo finirai nel primo catch solo se scateni una eccezzione di tipo argomento nullo, invece entrerai nel secondo catch se scatenerai una qualsiasi eccezzione che non rientra nel primo caso, il finally invece serve per eseguire una porzione di codice sempre anche se è stata scatenata una eccezzione (ad esempio quando lavori coi file le varie operazioni le inserisci in un try, il catch lo usi per gestire eventuali errori di IO, e in finally magari ci metti la chiusura di eventuali stream)

Ad ogni modo guardati qualche articolo sulle eccezzioni che quì non posso trattare l'argomento per esteso se no non finiamo più. Per il resto il codice è ancora scarso di controlli, e probabilmente sapendo cosa deve fare si potrebbero evitare parecchi if e qualche ciclo, prova a chiudere visual studio e ad analizzare bene la cosa sulla carta, vedrai che quando riapri visual studio lo riscrivi mooooolto meglio. eheheheh
ciao
sneeze è offline   Rispondi citando il messaggio o parte di esso
Old 31-08-2010, 10:33   #9
Andrea993
Member
 
Iscritto dal: Jun 2010
Messaggi: 35
Grazie mille sei un ottimo maestro Ho risistemato il codice devo dire che è venuto una meraviglia con la gestione degli errori e relativo codice d'uscita, ho risparmiato altri if...

Grazie ancora
Andrea993 è offline   Rispondi citando il messaggio o parte di esso
Old 31-08-2010, 11:28   #10
sneeze
Senior Member
 
L'Avatar di sneeze
 
Iscritto dal: Aug 2001
Messaggi: 1049
di nulla....
ciao a presto
sneeze è offline   Rispondi citando il messaggio o parte di esso
Old 07-09-2010, 15:00   #11
Andrea993
Member
 
Iscritto dal: Jun 2010
Messaggi: 35
Ciao, ho notato un problema nel codice, con la formattazioe della stringa "{0:00}",b cìè il problema che trova anche i file che hanno 2 zeri prima del numero, ad esempio 004 e questo non deve succedere.

Grazie in anticipo
Andrea993 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo M...
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Le tute spaziali AxEMU di Axiom Space pe...
Dongfeng sfida la NATO: navi dalla Cina ...
5G Standalone per il mondo marittimo: Er...
Nova Lake-S: configurazioni fino a 52 co...
Baxi presenta la pompa di calore Alya E ...
PC ASUS e Acer vietati in Germania: il t...
Stellantis rilancia il diesel in Europa:...
Truffa per utenti Trezor e Ledger: lette...
Wi-Fi 7 conveniente: FRITZ! lancia 4630,...
La Formula 1 dei robot tagliaerba miglio...
Il nuovo gioco del creatore di God of Wa...
Grok arriva sulle Tesla in Europa: l'int...
Assassin's Creed IV: Black Flag Remake p...
Il padre di God of War attacca Sons...
È operativo il primo computer qua...
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: 22:37.


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