Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C++] String Subscript out of range

    Ciao a tutti, questo è il mio primo post su questo forum e ne approfitto subito per esporvi un mio problema.

    Sto creando per esercitazione un programma di criptazione in c++ basato sul cifrario di Vigènere eccone il codice:

    codice:
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    std::string cripta (string chiave, string tst);
    
    int main ()
    {
    	cout << "Inserisci la parola chiave: ";
    	string pChiave;
    	cin >> pChiave;
    	cout << "\nInserisci il testo:" << endl;
    	string testo;
    	cin >> testo;
    	cripta(pChiave, testo);
    	system("pause");
    }
    
    std::string cripta(string chiave, string tst)
    {
    	string criptato = "Programma non ancora terminato";
    	char tab[257][257];
    	int n = 0;
    	for(int i = 0; i < 257; i++)
    	{
    		for(int k = 0; k < 257; k++)
    		{
    			tab[i][k] = (char)n;
    			n++;
    		}
    	}
    	string tstChiave;
    	for(int a = 0; a < tst.size(); ++a) // linea 34
    	{
    		for(int b = 0; b < chiave.size(); ++b) // linea 36
    		{
    			tstChiave[a] = chiave[b];
    			a++;
    		}
    	}
    	return tst;
    }

    Il programma non è ancora completato, ma mentre provavo a vedere se il lavoro finora svolto funzionava, durante la compilazione, sono incappato in due "warnings" qui riportati:

    main.cpp(34) : warning C4018: '<': errata corrispondenza tra signed e unsigned
    main.cpp(36) : warning C4018: '<': errata corrispondenza tra signed e unsigned

    Informandomi su google ho scoperto che questo avviso viene inviato dal compilatore quando si tenta di confrontare una variabile signed con una unsigned (cosa facilmente deducibile dal messaggio di errore).

    A quanto ne so, con variabile signed si intende una variabile appunto con segno (negativo o positivo), con unsigned una senza segno.

    Ho provato quindi ha ridichiarare la variabile aggiungendole "unsigned" e, come ci si aspettava, alla compilazione non mi è giunto nessun messaggio di avviso o di errore dal compilatore.

    Il problema vero e proprio è sorto quando ho provato a eseguire il programma:

    Alla chiamata della funzione si interrompe tutto e viene visualizzato il seguente messaggio di errore:



    A quanto pare dovrebbe significare che sto tentando di accedere a un elemento di un'array di indice o troppo grande (lo escludo perchè ho utilizzato delle string) o troppo piccolo (negativo).

    Sospetto che in qualche modo le variabili a e b contengano valori negativi, in questo modo si spiegherebbero sia i due warnings che l'errore in run-time.

    Ma come è possibile?

    Può darsi che si tratti di un qualche errore idiota che non ho visto, ma proprio non ci arrivo, potreste aiutarmi voi?

    Grazie in anticipo...

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    char tab[257][257];
    Il range dei caratteri va da 0 a 255 non da 0 a 256. Non so se questo sia l'errore, ma intanto inizierei da qui.

  3. #3
    Nei due cicli for() utilizza delle variabili di tipo size_t
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  4. #4
    Originariamente inviato da shodan
    Il range dei caratteri va da 0 a 255 non da 0 a 256. Non so se questo sia l'errore, ma intanto inizierei da qui.
    lo so ma il 256 e il 257 sono uguali e sono spazi (" ") quindi l'array dovrebbe comunque arrivare a 256 per fare in modo che nell'array dopo si ripetano i valori uguali.

    Tuttavia la tabella deve essere fatta in modo che nella seconda riga si slitti di un carattare, cioè così:

    codice:
    a b c d e f g h i l m n o p q r s t u v z
    b c d e f g h i l m n o p q r s t u v z a
    c d e f g h i l m n o p q r s t u v z a b
    d e f g h i l m n o p q r s t u v z a b c
    e f g h i l m n o p q r s t u v z a b c d
    .....
    .....
    Originariamente inviato da Samuele_70
    char tab[257][257];
    Nei due cicli for() utilizza delle variabili di tipo size_t
    Ho provato, non ci sono più i warnings durante la compilazione, ma rimane l'errore in run-time.

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    I caratteri sono 256 e comunque sono compresi tra 0 e 255 ...

    Devi dimensionare a 256 e usare nei cicli < 256.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.