View Full Version : [C]Eccezione non gestita... almeno credo
agente mm8
27-12-2008, 15:04
Ciao a tutti, sto facendo degli esercizi in C presi da un sito, e uno diceva che dato un numero in input devo trovare il più vicino numero palindromo.
Io ho usato un ciclo while che controlla se la stringa contenente l'input è uguale alla stessa stringa inversa, che viene 'calcolata' dalla funzione reverse.
Ora quando compilo (uso Visual C++), mi dà questi errori:
Eccezione first-chance a 0x1026f671 in The next palindrome.exe: 0xC0000005: Violazione di accesso nella lettura del percorso 0x00000331.
Eccezione non gestita a 0x1026f671 in The next palindrome.exe: 0xC0000005: Violazione di accesso nella lettura del percorso 0x00000331.
Che faccio?
wizard1993
27-12-2008, 15:10
in c le eccezzioni non possono essere gestite perchè sono una caratteristica propria del c++, comunque cìè qualcosa che non va nel codice che hai scritto
agente mm8
27-12-2008, 15:38
Ok, grazie, ora controllo, se continua a non andare vi posto il codice
Vincenzo1968
27-12-2008, 15:58
Puoi dare un'occhiata al Contest 10 (http://www.hwupgrade.it/forum/showthread.php?t=1883750) ;)
agente mm8
27-12-2008, 16:37
Ho dato giusto un'occhiata veloce al codice che c'è nella prima pagina, quello scritto in C, ma è esageratamente più lungo del mio (sarà che sono io ad aver fatto maree di errori).
Questo è quell che ho scritto:
#include <stdio.h>
#include <string.h>
char* reverse(char *s)
{
int i, j;
char *t;
strcpy(t,s);
for(i = 0 , j = strlen(s) - 1 ; j >= 0 ; i++, j--)
*(s + i) = *(t + j);
return s;
}
int palindrome(char *n){
int num = (int)n;
while(n != reverse(n)){
num++;
n = (char*)num;
}
return num;
}
int main(int argc, char *argv[])
{
int input;
printf("Inserisci un numero: ");
scanf("%d", &input);
char *in = (char*)input;
int pal = palindrome(in);
printf("%d è un numero palindromo", pal);
return 0;
}
in c le eccezzioni non possono essere gestite perchè sono una caratteristica propria del c++, in quel caso non si tratta di un'eccezione (con una sola Z) C++, ma di un'eccezione SEH e si puó gestire anche in C usando __try/__except.
prima che arrivi l'obiezione: __try/__except é un'estensione Microsoft al C e non é presente su tutti i compilatori; ad esempio manca al MinGW, uno dei motivi percui il MinGW non é molto consigliato per programmare su Windows. il team di ReactOS, che é costretto ad usare il MinGW, ha dovuto scrivere da zero una mini-libreria per la gestione manuale delle eccezioni SEH.
agente mm8
27-12-2008, 18:21
Grazie per la spiegazione, ma quali istruzioni dovrei mettere nel blocco try/except?
Te lo chiedo perché non conoscevo quest'istruzione.
Grazie per la spiegazione, ma quali istruzioni dovrei mettere nel blocco try/except?
Te lo chiedo perché non conoscevo quest'istruzione. le parole chiave non sono "try" ed "except", ma precisamente "__try" ed "__except": hanno il prefisso del doppio underscore perché é convenzione metterlo nelle keyword che non fanno parte del C ma sono estensioni al linguaggio.
in un blocco __try/__except devi mettere l'istruzione che potrebbe potenzialmente causare l'eccezione SEH, ma nel tuo caso mi sembra che piu che catturare l'eccezione devi semplicemente correggere un bug :D
intanto se ti interessa qui c'é la guida su __try/__except:
http://msdn.microsoft.com/en-us/library/ms680657(VS.85).aspx
http://msdn.microsoft.com/en-us/library/zazxh1a9.aspx
http://msdn.microsoft.com/en-us/library/s58ftw19.aspx
PS: quando usi lo Structured Exception Handling (SEH) evita di usare anche le eccezioni C++: alcuni compilatori implementano queste ultime sulla base delle prime, e quindi i due meccanismi interferiscono; ad esempio potresti ritrovarti a catturare un'eccezione SEH in un blocco catch collocato in uno stack frame che viene prima del blocco __except che avrebbe invece dovuto catturare l'eccezione.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.