View Full Version : [C] Panico: URGENTE
Salve a tutti! Sto incasinato: giovedì devo consegnare la tesina di sistemi operativi e non riesco a risolvere alcuni problemi sul codice:
Quando compilo con l'opzione -Wall mi da questo warning:
battNav.c: In function `strutture':
battNav.c:24: warning: implicit declaration of function `exit'
Se immetto un carattere o una stringa come input il programma impazzisce e non restituisce il controllo al monitor....
Il professore ha chiesto di mettere le coordinate tipo A-1 e non 1-1 come ho fatto io, avete idee su come farlo? ho provato creando una spece di decoder, che prende l'input come char e lo trasforma in int ma mi da SEGMENTATION FAULT!!!
Il codice l'ho allegato, ma è quello senza il deoder, visto che non funziona. Per favore datemi una mano :help:
Grazie a tutti!!!
sembrerebbe non trovare la exit(), prova a includere anche stdlib.h
sembrerebbe non trovare la exit(), prova a includere anche stdlib.h
Ok grazie, il problema della exit è risolto! Ma gli altri? Nessuno sa aiutarmi :mc:
Ziosilvio
20-09-2006, 10:06
Se immetto un carattere o una stringa come input il programma impazzisce e non restituisce il controllo al monitor
L'input-output mediante stringhe, in C, è una cosa abbastanza fastidiosa.
L'unica, è prendere il K&R e studiare bene il capitolo 7 e l'Appendice B; ma mi sa che ormai è un po' tardino...
Il professore ha chiesto di mettere le coordinate tipo A-1 e non 1-1 come ho fatto io, avete idee su come farlo? ho provato creando una spece di decoder, che prende l'input come char e lo trasforma in int ma mi da SEGMENTATION FAULT!!!
Non ho letto il sorgente (e non sperare che lo leggerò), ma probabilmente fai una conversione del tipo i=(int)c.
Ora, questa conversione non restituisce il valore rappresentato dal carattere c (che è quello che vuoi), ma il suo codice ASCII (o EBCDIC, se sei jellato).
La cosa più portabile che mi viene in mente, è uno switch del tipo:
switch (c) {
case 'A':
case 'a':
i=0;
break;
case 'B':
case 'b':
i=1;
break;
/* simile per gli altri caratteri */
default:
fprintf(stderr,"Carattere non valido\n");
}
trallallero
20-09-2006, 10:33
Ho letto al volo ma mi sembra di aver capito:
hai messo un controllo sul ciclo mooooolto rischioso :read:
la condizione é questa:
while (controllo != 1)
poi la variabile della condizione viene cambiata solo dentro una if dentro una else ...
else
{
...
if (k == 0)
{
...
controllo = 1;
non si fa mai cosí perché crei facilmente un ciclo infinito.
se k non é mai a 0 (facile nel tuo codice) controllo non viene mai modificato e il tuo ciclo non smette mai.
altra cosa:
for (i = 0; i < 10; i++)
//Cicli for perl 'inserimento delle coordinate delle navi
for (j = 0; j < 10; j++)
matrix[i][j] = 0;
puoi farlo cosí ;)
memset(matrix, 0, sizeof(matrix));
VegetaSSJ5
20-09-2006, 13:05
per poter permettere le lettere in input e trasformarle implicitamente in numeri secondo la notazione a->1, b->2... puoi fare così
int riga= getchar();
if ((riga > 64 && riga < 90) || (riga > 96 && riga < 123)) {
if (riga > 96) riga-= 96;
else riga-= 64;
}
else carattere non vaido...
...
In effetti è un pò tardi, comunque non faccio la conversione come hai scritto tu, ma ho scritto un metodo che funge proprio da decoder, del tipo se il char è a allora num=1...
Ho letto al volo ma mi sembra di aver capito:
hai messo un controllo sul ciclo mooooolto rischioso :read:
la condizione é questa:
while (controllo != 1)
poi la variabile della condizione viene cambiata solo dentro una if dentro una else ...
else
{
...
if (k == 0)
{
...
controllo = 1;
non si fa mai cosí perché crei facilmente un ciclo infinito.
se k non é mai a 0 (facile nel tuo codice) controllo non viene mai modificato e il tuo ciclo non smette mai.
altra cosa:
for (i = 0; i < 10; i++)
//Cicli for perl 'inserimento delle coordinate delle navi
for (j = 0; j < 10; j++)
matrix[i][j] = 0;
puoi farlo cosí ;)
memset(matrix, 0, sizeof(matrix));
Quindi è il ciclo la causa del problema... ma quindi come lo risolvo? Uso un ciclo strutturato in modo diverso o... :confused:
Purtroppo sono un programmatore improvvisato... non ci capisco molto :stordita:
per poter permettere le lettere in input e trasformarle implicitamente in numeri secondo la notazione a->1, b->2... puoi fare così
int riga= getchar(); if ((riga > 64 && riga < 90) || (riga > 96 && riga < 123)) { if (riga > 96) riga-= 96; else riga-= 64; } else carattere non vaido...
Ok grazie, ora provo...
fuR3ttOlo
20-09-2006, 14:40
...Quaglia o Santoro ?! :Prrr:
...Quaglia o Santoro ?! :Prrr:
Santoro :muro:
:D
trallallero
20-09-2006, 15:24
scusa ma sto incasinatissimo, sto mandando in produzione un po di roba ...
per poter permettere le lettere in input e trasformarle implicitamente in numeri secondo la notazione a->1, b->2... puoi fare così
int riga= getchar();
if ((riga > 64 && riga < 90) || (riga > 96 && riga < 123)) {
if (riga > 96) riga-= 96;
else riga-= 64;
}
else carattere non vaido...
Alloramho provato, ma mi da un problema: la prima volta che inserisco una coordinata riga funziona bene, poi mi chiede la colonna, la disposizione, (a-1 verticale/orizzontale), ma poi quando devo andare a inserire una nuova coordinata riga per un'altra nave, lui automaticamente mi dà carattere non valido. Il bello è che inzuppando il codice di printf("%d",riga), lui fino a che non mi chiede la coordinata riga sta al valore giusto (mettiamo che inserisco d o D, riga sta sempre a 3), ma poi al momento di inserire la nuova coordinata stampa prima carattere non valido e poi stampa righa=10!!! come è possibile che prenda da solo un carattere non valido???
VegetaSSJ5
20-09-2006, 18:32
Alloramho provato, ma mi da un problema: la prima volta che inserisco una coordinata riga funziona bene, poi mi chiede la colonna, la disposizione, (a-1 verticale/orizzontale), ma poi quando devo andare a inserire una nuova coordinata riga per un'altra nave, lui automaticamente mi dà carattere non valido. Il bello è che inzuppando il codice di printf("%d",riga), lui fino a che non mi chiede la coordinata riga sta al valore giusto (mettiamo che inserisco d o D, riga sta sempre a 3), ma poi al momento di inserire la nuova coordinata stampa prima carattere non valido e poi stampa righa=10!!! come è possibile che prenda da solo un carattere non valido???
dipende da quella cacchio di getchar, provala a sostituire con una scanf
trallallero
21-09-2006, 07:24
Alloramho provato, ma mi da un problema: la prima volta che inserisco una coordinata riga funziona bene, poi mi chiede la colonna, la disposizione, (a-1 verticale/orizzontale), ma poi quando devo andare a inserire una nuova coordinata riga per un'altra nave, lui automaticamente mi dà carattere non valido. Il bello è che inzuppando il codice di printf("%d",riga), lui fino a che non mi chiede la coordinata riga sta al valore giusto (mettiamo che inserisco d o D, riga sta sempre a 3), ma poi al momento di inserire la nuova coordinata stampa prima carattere non valido e poi stampa righa=10!!! come è possibile che prenda da solo un carattere non valido???
10 corrisponde al codice ASCII del tasto invio ...
Marco Giunio Silano
21-09-2006, 09:57
10 corrisponde al codice ASCII del tasto invio ...
:uh: ma invio(CR) non è 0xd?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.