PDA

Visualizza la versione completa : [C++] String Subscript out of range


Smanet
10-11-2008, 23:08
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:


#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:

http://img186.imageshack.us/img186/5074/errorvy8.jpg (http://imageshack.us)

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...

shodan
10-11-2008, 23:23
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.

Samuele_70
10-11-2008, 23:33
Nei due cicli for() utilizza delle variabili di tipo size_t

Smanet
11-11-2008, 14:40
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ì:



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.

oregon
11-11-2008, 15:06
I caratteri sono 256 e comunque sono compresi tra 0 e 255 ...

Devi dimensionare a 256 e usare nei cicli < 256.

Loading