PDA

View Full Version : [C] Panico: URGENTE


iPoster
19-09-2006, 15:48
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!!!

wisher
19-09-2006, 17:09
sembrerebbe non trovare la exit(), prova a includere anche stdlib.h

iPoster
19-09-2006, 18:18
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...

iPoster
20-09-2006, 14:33
...
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:

iPoster
20-09-2006, 14:45
...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 ...

iPoster
20-09-2006, 16:16
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?