Domande Homework 4 - Formula1 - (uso di record allocati dinamicamente)
Qualche domanda.. (tanto per cambiare^^)
La difficoltà che ho riscontrato negli homework non è tanto FARE il programma funzionante..ma farlo nel modo ESATTO (come logica, input/output) che lei ci chiede. E quando la dimensione/complessità dell'esercizio aumenta..son problemi

Poichè da quando verrà pubblicato il testo completo dell'esercizio avremo solo una settimana per farlo, volevo chiederle se poteva magari perdere qualche carattere in più sulla descrizione dei passaggi più ostici del programma e sull'idea generale, in modo da farci capire bene come vuole che il programma si comporti..almeno quando il testo verrà pubblicato avremo già le idee chiare su cosa il programma deve fare e come deve comportarsi.
Ad es leggendo quel che ha scritto..panico

mi son venuti alcuni dubbi:
- record allocati dinamicamente: non avendo fatto le liste con Silvestri..si è costretti a dichiarare via codice 'n' puntatori per ogni struttura che si usa, al di la che poi vengano allocate dinamicamente...il numero delle macchine verrà quindi chiesto in input?
- il movimenti delle macchine avverrà in riferimento a cosa? Immagino alla pista, se la vediamo come una matrice, e quindi in base alle caselle..oppure dobbiamo vedercela con le gotoxy?:)
- Ma la pista si vede a schermo? Sarà un po' come Forza4 che ad ogni mossa si stampa la situazione aggiornata o vuole un'implementazione in real time?
- Non ho ben capito se ad ogni 'step' dobbiamo inserire le istruzioni (direzione/velocità) per ogni macchina prima di continuare con lo step successivo del ciclo..oppure se avviene tutto in tempo reale..da come ha scritto si capisce che con il tastierino si controllano le macchine ma non si capisce il modo, ovviamente non tutte assieme.
Lo so che il testo è provvisorio quindi è normale che non sia spiegato tutto perfettamente..ma siccome dal 20 al 26 non è che ci sia poi tantissimo tempo, se si avessero le idee chiare sul programma uno potrebbe iniziare già a farsi un idea di come progettare la cosa, anche se in linee generali..piuttosto che arrivare al 23 senza aver ancora capito bene cosa fare
Grazie per la pazienza prof.
(Se sono l'unico a non aver capito esattamente come deve comportarsi il programma..non posto più, giuro :))
-- Comment added by
DaniloRossi on 17 Nov 2003
Re: record
Chi ti dice di fare le liste, non va bene un array di puntatori o un array di record?
Re: gotoxy?
Non servono le gotoxy ... le coordinate delle macchine sono rispetto all'angolo inferiore sinistro della tabella di caratteri che rappresenta la pista.
(dammi il tempo di costruire un esempio!)
Re: la pista si vede a schermo?
La pista viene ristampata ogni volta, come col Forza4.
Re: ad ogni step
Ad ogni 'turno' si inserisce una stringa di R caratteri compresi tra 1-9 (con R pari al numero di macchine ancora in gara. Il numero 1-9 indica (prendendo il 5 del tastierino numerico come 0,0) in che direzione aumentare/diminuire le velocità.
Re: l' unico?
Piuttosto devi essere l'unico che si è letto l'esercizio (e che ho postato 4 ore fa)
-- Comment added by
AndreaSterbini on 17 Nov 2003
No...
Non è l'unico...piu ke altro nn avevo visto il link delle
DomandeHomework4 
Boh a me la prima domanda ke sorge spontanea è...che è un record?

L'esercizio dice ke la makkina va implementata con un record dove ci metti varie cose..ma sinceramente nn ho ancora capito cos'è.
Capito va, m'aspetta una bella sfida
-- Comment added by
DavidVulpetti on 18 Nov 2003
Re: record
record = struct
-- Comment added by
AndreaSterbini on 18 Nov 2003
ah ok thx
-- Comment added by
DavidVulpetti on 18 Nov 2003
Diagonali
Riscrivo le seguenti frasi sul controllo delle diagonali:
per controllare le diagonali esistono due casi, a seconda che sia maggiore l'incremento deltax (oppure deltay)
...per tutte le colonne (righe) corrispondenti all'incremento maggiore
Sarebbe: in tutte le colonne in cui la macchina si sposterebbe nella direzione con velocita' maggiore?
si calcoli l'ascissa y (ordinata x) della retta, arrotondando all'intero inferiore
non ho capito cosa devo calcolare, ad ogni modo l'ascissa mi sembra un intero...
-- Comment added by
LivioDellaCorte on 18 Nov 2003
Puntatori
Scusate l'off topic ma non sapevo dove fare questa domanda al prof.
Allora stavo guardando il mio codice di forza 4 e volevo provare a mettere al posto delle 2 variavili globali x e y due puntatori. Mi sono accorto che alla prima mossa del gioc 1 la pedina veniva inserita in 5 0 poi se il gioc 2 dava come colonna 0 la pedina veniva inserita in 0 0 invece di 4 0. Smanettando un po sul codice ho provato a mettere invece di *x-- x=-1 e è tornato tutto normale. Ho provato anke a fare una funzione con i puntatori dove vengono decrementati o incrementati con il---++ e il -- e da sempre lo stesso problema. E' una cosa normale?
Grazie e scusate ancora l'OT!
-- Comment added by
DaniloDauria on 18 Nov 2003
Re: Diagonali
Sì, si considera l'incremento della x (y) maggiore e si calcola la y (x) corrispondente, arrotondata all'intero inferiore.
-- Comment added by
AndreaSterbini on 18 Nov 2003
Re:
Grazie per le risposte prof, ora mi è più chiaro, attenderò la pubblicazione degli esempi prima di iniziare.
-- Comment added by
DaniloRossi on 18 Nov 2003
Siete nascosti?
Professore non so se dipende solo da me, ma nella Main web di programmazione il link "DomandeHomework4" non compare
-- Comment added by
MatteoLaBella on 18 Nov 2003
Macchinine..
Professore, noi nn sappiamo quante makkinine giocano quando scriviamo il programma, ma lo prendiamo in input da una scanf all'inizio. Volevo chiederle..possiamo (o dobbiamo) usare un vettore di struct a dimenzione variabile? ovvero lo "inizializziamo" dopo aver saputo quante makkine giocano con un puntatore alla struct macchina e una malloc?
-- Comment added by
DavidVulpetti on 19 Nov 2003
Re: Macchinine
potete ... potete ...
-- Comment added by
AndreaSterbini on 19 Nov 2003
Altra cosa sulle macchinine..
Nn avendo ancora l'input e output del programma nn mi è kiara una cosa. Le macchinine hanno un "nome" ke può essere una lettera A-Z, a-z o 0-9 oppure il loro nome è un "codice" di tutte e 3 queste soluzioni insieme, del tipo
Macchina 1 = Av7
Macchina 2 = Fs2
ecc..?
-- Comment added by
DavidVulpetti on 19 Nov 2003
Re: Altra cosa sulle macchinine..
E' un solo carattere.
-- Comment added by
AndreaSterbini on 19 Nov 2003
Prima scanf
"segue nell'input una successione di N caratteri che corrispondono a ciascuna macchinina"
Questo vuol dire ke N e il nome delle makkinine vanno presi sulla stessa scanf o una dopo? Domanda un po' stupida ma volevo saperlo di preciso
-- Comment added by
DavidVulpetti on 19 Nov 2003
Riguardo pacman
Quando lancio pacman mi da un errore windows.
Ho fatto il debug e mi dice:
Program received signal SIGSEV, Segmentation fault
alla riga 99
maze[HEIGHT-y-1][x] = ' '; // cancello la casella in cui si trovava Pacman
non so se può dipendere da quello che il prof ha detto di scrivere quando si compila il programma. Siccome sto usando il Dev C---++ non so come devo fare per scrivere quella riga.
-- Comment added by
DaniloDauria on 19 Nov 2003
Proposta
Immagino che la proposta che sto per fare non le piacerà molto, ma la propongo cmq tanto per condividere l'idea.
Per quando riguarda la consegna dei programmi, potremmo consegnare inizialmente una versione beta,
lei la testa e dopo ci lascia un paio di giorni per consegnare una versione corretta in base ai test da lei fatti.
Infine vengono fatti i test definitivi, assegnando un punteggio maggiore a chi ha consegnato direttamente
una versione beta corretta e minore agli altri a seconda dei risultati raggiunti nel test definitivo.
-- Comment added by
EmanueleQuattrini on 19 Nov 2003
Re: Prima scanf
Diciamo che il primo numero N è seguito da accapo ad esempio:
5
ABCDE
Re: Riguardo pacman
Il problema è che le stringhe che definiscono il labirinto sono in una area protetta e senza l'opzione che ho scritto non ci si può scrivere sopra.
Non so quale sia l'opzione per Devc---++. Potresti creare un secondo array e copiarvi le stringhe con strdup. Queste stringhe sarebbero nella memoria modificabile.
Ho aggiornato il codice.
Re: Proposta
Capisco che ci teniate assai a fare bella figura

ma se facciamo così gli esercizi si accavallano ancora di più e invece di fare l'esercizio seguente vi mettete a correggere l'esercizio precedente.
Con lo schema di adesso voi imparate:
- facendo l'esercizio
- aiutandovi a vicenda
- scoprendo quali errori avete fatto
- vedendo la mia implementazione
- ammirando? l'implementazione dei colleghi che hanno passato i test
- esaminando la implementazione dei colleghi che non hanno passato i test
Lo scopo di questi giochi non è prendere punti, ma imparare divertendoci.
Se volete vi dò la soddisfazione di fare l'upload della versione "corretta", ma non chiedetemi di ri-testarla ... e se la nuova versione non passa i test che facciamo? andiamo in loop?
-- Comment added by
AndreaSterbini on 19 Nov 2003
Tutto apposto
Adesso funziona Grazie
P.S. Che è strdup?
-- Comment added by
DaniloDauria on 19 Nov 2003
Codice Pacman
Nn è il titolo di un film

Professore ho provato a comapilare il Pacman su cygwin e il gcc mi ha fatto notare ke mancano i ':' dopo il default alla fine della switch (credo mankino quelli, almeno nn mi da più l'errore dopo ke li ho aggiunti) e poi mi da una cosa del tipo
warning: assignment makes pointer from integer without a cast
a queste righe di codice:
for (i=0 ; i<HEIGHT ; i---++)
maze[i] = strdup(themaze[i]);
cos'è?
-- Comment added by
DavidVulpetti on 20 Nov 2003
Buongiorno!
Prof. lo pubblica sul sito Pacman?
-- Comment added by
ClaudiaCorsaletti on 20 Nov 2003
Re: Buongiorno
Vedi
PacMan
Re: Tutto apposto
strdup = string duplicate
Fai 'man strdup' in linux
-- Comment added by
AndreaSterbini on 20 Nov 2003
Re: Codice Pacman
Stasera me lo riguardo
-- Comment added by
AndreaSterbini on 20 Nov 2003
Re: Codice Pacman
Io l'ho compilato su Dev-C---++ su windows e funziona.
-- Comment added by
BeniaminoLarocca on 20 Nov 2003
Ma il canale A-D è considerato???
Allora più andiamo avanti con gli esercizi,più mi accorgo che noi del canale A-D siamo completamente fuori con il programma,oppure Lei Prof si basa solo sul programma del suo canale...Mi riferisco a questo:l'obiettivo dichiarato di questo esercizio è l'uso di Struct;bene,Piperno ha accennato le Struct il giorno dei funerali dei Militari di Nassiryia, e ripeto,accennato.Mi spiega Lei come facciamo noi ad usare in modo corretto le strutture e simili con 7 giorni a disposizione,visto che la versione con input e output dell'Homework 4 esce solo oggi(senza considerare che oggi c'è anche l'esonero di Algebra)???Io penso che la parte---+ difficile del corso di Prog1 sia dai puntatori in poi...e per usare in modo corretto gli argomenti di questa parte(spiegati una volta sola nel canale A-D,se non fosse che fortunatamente oggi il Prof Salvo ha provato ad aiutarci a capire l'uso delle Struct)7 giorni sono una barzelletta. Lo stesso Prof Salvo,viste le nostre condizioni,ha affermato che la consegna di Mercoledì prossimo è troppo ravvicinata.Che si fà?
-- Comment added by
DavidCordella on 20 Nov 2003
Re: Ma il canale A-D è considerato???
Si allunga un pochino la consegna per darvi il tempo di prendere il libro, aprirlo al capitolo delle struct e studiarlo

. Basta mezz'ora?

.
A parte le ca**ate ... allungo la consegna.
-- Comment added by
AndreaSterbini on 20 Nov 2003
Mi chiede
LucaAlesini:
Array allocati dinamicamente
Io so che non posso definire un array dandogli un N in inpu
perchè il
programma gli array li alloca all'avvio dello stesso quindi: o c'è un modo
per farlo che il professor Piperno non ha spiegato, oppure bisogna fare
una lista dinamica con puntatori. Non ho idea inoltre, di come fare delle
liste di record allocati dinamicamente (come lei dice giustamente in una
delle sue risposte su twiki) ma presumo che si tratti di una lista dinamica
fatta con i record delle macchinine...
Cosa intende per velocità?
Delta x e delta y sono le variabili dove dico D
QUANTE caselle si sposta
la macchinine ogni turno? lei dice che la velocità varia tra -1,0 e 1..
quindi piu che parlare di velocità si tratta semplicemente della direzione
presa dalla macchinina secondo le nostre scelte.. inoltre c'è una cosa
che
è oscura... qui si parla di N macchinine, ma noi le controlliamo tutte?ne
controlliamo una? se una: quale?
Stesso carattere
In che senso le macchinine possono occupare lo stesso carattere? nel
senso che si possono trovare sulle stesse coordinate X,Y? non sarebbe
meglio che se succedesse si eliminassero tutte e due le macchinine dal gioco?
controllo delle diagonali
non mi è chiara la funzione di controllo delle diagonali... piu che controllare
le diagonali dobbiamo controllare tutti gli spazi adiacenti alla macchinina
per vedere
e al turno successivo va a sbattere contro il muro.
Anzi piu precisamente bisogna controllare la casella adiacente a quella
occupata dalla macchinina nella direzione in cui la suddetta si dirige.
quindi se io nelle variabili deltaX ho -1 e deltaY ho
0 al momento del movimento
vado a controllare la coordinata X-1,Y e controllo che non sia un muro (o
che lo sia) e quando vado a ristampare la pista devo eliminare quella macchinina
e ne devo aggiornare il record in maniera che segnalo che questa ha
sbattuto.
E io rispondo...
Re: Array allocati dinamicamente
E' possibile definire una struttura dati (anche un array) di dimensioni dinamiche usando la funzione malloc.
Re: Cosa intende per velocità?
deltax e deltay sono le componenti della velocità di una macchinina. Deltax e deltax possono variare
di*---+1,0,-1 e quindi possono essere *incrementate o decrementate di 1 (o lasciate invariate) a seconda del numero in input. Ad esempio il numero 8 corrisponde ad
incrementare deltay di 1 e lasciare invariata deltax. Le nuove coordinate x e y della macchinina si ottengono aggiungendo rispettivamente deltax e deltay.
Re: Stesso carattere
Più macchinine possono occupare le stesse coordinate x,y ... e si ignorano, non voglio farvi gestire anche le collisioni tra macchinine. Il carattere mostrato è quello dell'ultima macchinina che occupa la posizione x,y.
Re: controllo delle diagonali
Dato che ad ogni turno una macchinina si sposta di deltax e deltay bisogna controllare tutto il percorso fatto dalla macchinina per evitare che urti su uno spigolo di un muro.
-- Comment added by
AndreaSterbini on 20 Nov 2003
Grazie, ma mi manca un dettaglio
Continuo a non comprendere il fatto se le macchinine le controlliamo tutte o una...
Oppure tutte quante una per volta mi sembra piu plausibile

deltaX e deltaY sono dunque cumulativi se io mi sposto per tre turni sempre verso---+1,0 alla fine del terzo turno avro in deltaX +3 e in deltaY 0 giusto?
Oppure ad ogni turno posso pigiare piu volte i tasti del tastierino numerico in modo da decidere la velocità esatta?
abbiamo un tempo limite per decidere la velocità e la direzione?
Se io vado in un turno a---+1, 0 e al turno successivo vado a +1, +1 mi sposterò alle coordinate X+2, Y+1?
Chiaro tutto il resto
-- Comment added by
LucaAlesini on 20 Nov 2003
Re: Grazie, ma mi manca un dettaglio
Ad ogni turno:
- si leggono tanti caratteri quante sono le macchinine "in gara"
- ciascuna velocità viene aggiornata di conseguenza
- ciascuna macchinina viene aggiornata di conseguenza
Esempio: ci sono ancora 3 macchinine in gara:
- input: 689
- La prima macchinina aggiorna la sua deltax=deltax---+1
- La seconda aggiorna aggiorna la sua deltay=deltay---+1
- La terza macchinina aggiorna le sue deltax=deltax---+1 e deltay=deltay+1
Si ricalcolano le posizioni delle 3 macchinine e si controllano le diagonali
-- Comment added by
AndreaSterbini on 20 Nov 2003
Info
La macchina che usa lei per le correzioni ha installato il file header stdlib.h? altrimenti risulta impossibile utlizzare malloc()
I caratteri da introdurre possono essere acquisiti con la funzione getch() ho vanno inputati con scanf()? Se si può usare getch() nel mio compilatore questa funzione si trova nel file conio.h che so lei non ha installato sulla sua macchina ma compilando con dev-c---++ anche senza includere conio.h il programma viene compilato con successo. La sua macchina richiede questa libreria o come dev-c++ non ne ha bisogno?
Grazie
-- Comment added by
AlessioDiMauro on 20 Nov 2003
Obiettivo del gioco
Dovrete implementare una corsa di Formula1.
....Sarà utile vedere in classe l'implementazione di un rozzo Pacman ...
domanda: noi ragazzi del corso a-d come facciamo che non ci è mai stato spiegato nulla riguardo l'implementazione del programma Pacman? quando ciò avverà?
spero che la data non sia spostata solo di un giorno...
grazie dell'attenzione!
-- Comment added by
LorenzoCiapetti on 20 Nov 2003
scusi prof per lo spostamento della data intendevo dire il giorno della consegna.
-- Comment added by
LorenzoCiapetti on 20 Nov 2003
Quando escono gli esempi del gioco F1(2003)
Quando uscirà l'esempio?
-- Comment added by
DarioFiorenza on 20 Nov 2003
Grazie mille...
...professore, adesso che ho tutte le informazioni necessarie, posso incominciare a realizzare il programma
-- Comment added by
LucaAlesini on 20 Nov 2003
Scusi prof.
Mi sono rimasti solo un paio di dubbi:
- Le macchine, all'inizio, dove vanno posizionate e come?
- Il controllo della diagonale: la macchinina si muove con una componente orizzontale ed una verticale. Di conseguenza dobbiamo considerare la diagonale risultante e gestirne eventuali collisioni: non ho capito però come vuole che la calcoliamo (nel senso, come prendere quelle 'caselle' del quadrato delimitato dallo spostamento verticale e orizzontale che contengono la diagonale).
-- Comment added by
DaniloRossi on 20 Nov 2003
Re: Info
Sulla mia macchina stdlib.h c'e'. Usate getchar che sta in stdio.h
Re: Obiettivo del gioco
PacMan è in linea da diversi giorni. Chiedi a
IvanoSalvo.
Re: Quando escono gli esempi del gioco F1(2003)
Scusatemi, dato che sono sovraccarico, vi scrivo un esempio a mano stasera (stanotte) e vi faccio gli esempi entro domenica.
Intanto cominciate a svolgere l'esercizio, la scadenza è prorogata fino a lunedì 1 Dicembre notte.
Re: Scusi prof.
Grazie, mi ero dimenticato di farvi leggere in input questo dato importante.
Le coordinate x e y del punto di partenza di tutte le macchinine (tutte assieme) vengono lette subito dopo il numero N di macchinine e prima dei caratteri ch le rappresentano.
Aggiungo questa nota all'esercizio.
-- Comment added by
AndreaSterbini on 20 Nov 2003
Re:Re:
Tnx prof. Ma dobbiamo fare un controllo nel caso le coordinate di partenza corrispondano ad un carattere diverso da ' ' (spazio), ovvero piazziamo le macchinine sul muro:)?
Se ha tempo può magari mettere un es sulla diagonale? Non riesco a capire in che modo la calcola lei.
-- Comment added by
DaniloRossi on 20 Nov 2003
La Retromarcia
E' possibile andare indietro e vincere o dobbiamo escludere questa possibilità gestendo questa cosa nel programma ?
-- Comment added by
AlessandroSpinelli on 21 Nov 2003
Uso di pista.h
Professore ma noi in pratica cosa dobbiamo farci con pista.h? Io l'ho messo nella cartella delle librerie di Cygwin, l'ho caricata nel programma con un include e con la funzione display() presa da Pacman l'ho stampata, solo ke ovviamente ho definito all'inizio le variabili di altezza e larghezza in relazione alla sua pista (ho contato "a mano"). Solo ke ora ho letto ke lei lo proverà anke con altre piste...come si fa allora? Usa piste con gli stessi valori di altezza e larghezza?
-- Comment added by
DavidVulpetti on 21 Nov 2003
Divisione?
quando si dovrà calcolare l'ascissa y (ordinata x) della retta, arrotondando all'intero inferiore (come scritto nel testo dell'esercizio), bisognerà usare una divisione?
Altrimenti non capisco cosa bisogna arrotondare...
-- Comment added by
LivioDellaCorte on 21 Nov 2003
Copiatura delle stringhe in memoria modificabile
Professore ho provato a fare come ha fatto lei con il Pacman, ovvero a creare un char *race[HEIGHT] = { 0 }; e poi a fare la copiatura delle stringhe in memoria modificabile così:
for (i=0 ; i<HEIGHT ; i---++) {
race[i]=strdup(therace[i]); }
solo ke compilando il cygwin mi da questo errore:
warning: assigment makes pointer an integer without a cast
dove ho sbagliato?
-- Comment added by
DavidVulpetti on 21 Nov 2003
precisazione...l'errore me lo da proprio nella riga
race[i]=strdup(therace[i]);
-- Comment added by
DavidVulpetti on 21 Nov 2003
Retromarcia
Dando per scontato che se una macchinina supera il traguardo in retro non vince, mi chiedo: se poi ricomincia ad andare dritta e risupera il traguardo non dovrebbe vincere lo stesso perchè è come se fosse indietro di un giro. Come gestiamo questa eventualità?
free()
Penso che per tenere al minimo lo stress da homework userò un vettore dinamico di struct per le macchinine.
Volevo sapere, però, se questo ragionamento con le liste è corretto:
Allocata in memoria una lista di n macchinine, se una va a sbattere, posso liberare la memoria che
conteneva i dati di quella macchinina con free(), e fare in modo che il puntatore che puntava
la struct della macchinina incidententata punti la struct della macchinina successiva.
Se il ragionamento è giusto con un numero elevato di macchinine si risparmia parecchia memoria.
Immagino che con un vettore dinamico una cosa del genere non sia possibile, o no?
-- Comment added by
EmanueleQuattrini on 21 Nov 2003
Re: (controllo sulle coordinate di partenza)
Non ce n'e' bisogno, se le macchinine sono nel muro "sbattono" tutte e si esce dal gioco.
Re: La Retromarcia
E' chiaro che questo e' un modo di vincere. Non va gestito in nessun modo particolare.
Re: Uso di pista.h
Dovete scrivere nel vostro programma
#include "pista.h".
Questo mi permette di usare nei miei test piste diverse da quella data come esempio.
Re: Divisione?
Se ti ricordi come si fa a calcolare le coordinate di un punto lungo una retta che passa per due punti ti accorgerai che c'e' una divisione da fare.
Re: Copiatura delle stringhe in memoria modificabile
Non hai incluso string.h
Re: Retromarcia
Lasciate stare.
Re: free()
Potete usare malloc per allocare sia vettori che struct (sia vettori di struct, sia vettori di puntatori a struct .....) .
Usate free per liberare la memoria che non serve.
-- Comment added by
AndreaSterbini on 21 Nov 2003
includere pista.h
scusi prof. ma per includere il file pista.h,visto che non dobbiamo consegnarlo insieme al programma,basta mettere al posto di #include<stdio.h> #include"pista.h"???
-- Comment added by
DiegoCammarano on 21 Nov 2003
Includere pista.h
scusi prof. ma per includere il file pista.h,visto che non dobbiamo consegnarlo insieme al programma,basta mettere al posto di #include<stdio.h> #include"pista.h"???
-- Comment added by
DiegoCammarano on 21 Nov 2003
-- Comment added by
DiegoCammarano on 21 Nov 2003
Re: Re: free()
Ho notato che il compilatore non si lamenta per una cosa di questo tipo:
/* Uso calloc in modo da avere il vettore inizializzato a 0 */
Pippo *pippo = calloc(n_pippi, sizeof(Pippo));
// Libero (come credo che non si debba fare) la memoria del primo e del terzo
// elemento del vettore che per qualche motivo non mi servono più
free(pippo---+1);
free(pippo---+3);
/* Confronto il vettore con una condizione */
for(i=0; i<n_pippi; i---++)
if(pippo[i].datiPippo==3) return 0;
In questo modo il ciclo controlla anche le zone di memoria liberate, con risultati imprevedibili.
Come faccio allora a liberare la memoria occupata dagli elementi del vettore che non mi servono più, mantendo però il
vettore compatto?
Io avevo pensato di farlo nel modo seguente:
1 - ordino il vettore lasciando alla fine gli elementi che non servono più
2 - uso la funzione realloc con le nuove dimensioni del vettore senza gli elementi
che non servono in modo che questi ultimi vengano troncati
Esiste un metodo più semplice?
-- Comment added by
EmanueleQuattrini on 21 Nov 2003
Posione iniziale macchine
Prof nn ho capito se le macchine in partenza si trovano tutte sullo stesso punto,
quindi una sull'altra visualizzando solo il simbolo dell'ultima, oppure ad esempio affiancate.
-- Comment added by
MaurizioTrano on 21 Nov 2003
Re: Includere pista.h
Basta tenere i due file nella stessa directory e inserire in testa al vostro programma la riga:
#include "pista.h"
RE: Re: Re: free()
Certo, puoi fare cosi' ma ti complichi veramente tanto la vita. Non ne vale la pena.
Se usi un vettore di struct libera tutto il vettore alla fine del programma.
Se vuoi liberare le macchinine una alla volta le devi allocare separatamente.
Ma in questo caso o ne fai una lista linkata oppure usi un vettore di puntatori per riferirle.
ATTENZIONE: ho apportato delle modifiche semplificando l'esercizio
-- Comment added by
AndreaSterbini on 21 Nov 2003
Re: Posione iniziale macchine
La prima che hai detto (tutte assieme)
-- Comment added by
AndreaSterbini on 21 Nov 2003
strdup?
Nel testo dell'Homework 4 c'è un errore lei dice di per sapere il numero di colonne contate il numero di caratteri di una riga (con strdup) a lezione non ha detto di contare il il numero di colonne con (strlen)? Mi dica se sbaglio....
-- Comment added by
DarioFiorenza on 21 Nov 2003
L'ho corretto
--
AndreaSterbini
Come funzionano la sizeof e la strdup?
Se non ho capito male queste due istruzioni ci consentono di individuare le dimensioni della pista ma a cosa serve?
-- Comment added by
JacopoBusso on 21 Nov 2003
se ho capito bene il potenziale numero di macchine in gara e' illimitato. ho ragione?.
adios..
ocram
-- Comment added by
MarcoValerioBarbera on 21 Nov 2003
Re: dimensioni della pista?
Se permetti ti rispondo con una serie di domande:
- Come fai a stampare la pista?
- come fai a controllare se la macchinina è all'interno della matrice?
Re: numero giocatori
Esatto
-- Comment added by
AndreaSterbini on 22 Nov 2003
Problemi con le dimensioni
Professore ho seri problemi nel ricercare le dimensioni della pista
con sizeof e strlen. Potrebbe almeno accenare qualcosina per cortesia?
Ho provato a cercare sul libro come poter fare, ma purtroppo mi sembra
di non aver trovato nulla.
-- Comment added by
MaurizioTrano on 22 Nov 2003
Problemi con le dimensioni 2
Con strlen ho risolto ma con sizeof purtroppo no.
-- Comment added by
MaurizioTrano on 22 Nov 2003
Dimensioni della pista?
Noi del primo corso non abbiamo ancora esaminato le due funzioni con attenzione (abbiamo usato sizeof solo all'interno della malloc per definire il quantitativo di memoria da allocare)forse è per questo che le due mi risultano sconosciute per determinare una pos all'interno della pista (conosco la gotoxy ma non si puo usare,giusto?).
Inoltre ho un'altra domanda. Quando prelevo i caratteri che indicano le auto (di tipo char) credo mi rimanga nel buffer della tastiera l'invio di conferma perciò mi salta la successiva immissione dati. c'è qualcosa che mi consente di evitare ciò?
-- Comment added by
JacopoBusso on 22 Nov 2003
Problemi con le dimensioni 3
Tutto ok

ho fatto tremila prove alla fine ho trovato il modo giusto.
P.s.
Potrebbe sembrare ma nn è spam.
-- Comment added by
MaurizioTrano on 22 Nov 2003
Sul getchar
Per prendere in input i caratteri ke determinano lo spostamento della makkina, utilizzo questo pezzo di codice
input[0]=getchar();
for (i=0;i<nmacchine;i---++) {
input[i]=getchar();
dove input è un vettore di caratteri ke mi sono allocato prima...se nn metto questa parte prima del for
input[0]=getchar();
nn funziona...ovvero ho 3 makkine e mi legge solo i primi due caratteri ke metto...come mai?
-- Comment added by
DavidVulpetti on 22 Nov 2003
ho capito cos'è...prima di questo, faccio la scanf per il numero delle makkine e le coordinate...quindi il getchar dentro il for legge come primo carattere l'accapo della scanf precedente...senza scanf, funziona bene senza la riga input[0]=getchar();
Perkè?
-- Comment added by
DavidVulpetti on 22 Nov 2003
Problemi col Getchar
Niente, ho problemi col getchar...in pratica legge sempre gli ultimi caratteri dell'input precedente..per esempio...se ci sono 3 makkine se scrivo ABCD lui giustamente mi prende solo i caratteri ABC...solo ke D me lo legge al successivo getchar, come primo carattere...
-- Comment added by
DavidVulpetti on 22 Nov 2003
Re: Problemi col Getchar
Anche io ho questi problemi col getchar e sto perdendo un sacco di tempo e non riesco a
trovare una soluzione.
-- Comment added by
MaurizioTrano on 22 Nov 2003
Gestione degli "errori"
Professore noi dobbiamo considerare sempre esatti il numero di input ke lei mette nei test? Voglio dire...se le makkine ke giocano sono 3, lei mette solamente 3 caratteri per le makkine e 3 per la direzione? Se poi resta solo una makkina in gioco, lei mette 1 carattere e basta per la direzione? Oppure ne mette anke 100 e noi dobbiamo considerare solo il primo o i primi 3 se giocano 3 makkine? Ho capito come far funzionare bene la getchar...ma in questo secondo caso andrebbe tutto farsi benedire..spero ke lei consideri sempre il numero esatto
-- Comment added by
DavidVulpetti on 22 Nov 2003
Strdup
Non ho trovato riferimenti a questa fuzione ne tramite 'man' ne tramite libri..visto che sono curioso

cosa fa di preciso? Se copia e basta perchè non usare una strcpy, ad es?
Per la diagonale, che non ho capito come calcolare, immagino di aver trovato qual è il mio problema...non mi ricordo come si fa a "calcolare le coordinate di un punto lunga una retat che passa per due punti"..ehm :/
-- Comment added by
DaniloRossi on 22 Nov 2003
hihihi
Se facciamo questo andiamo a lavorare alla Clementoni...:)
-- Comment added by
StefanoColasanti on 22 Nov 2003
Altra cosa:
Mi sono messo ora a dare un occhiata a come fare il programma...stavo guardando il file pista.h, e precisamente la funzione leggiMossa...notando anche come è stato definito l'array dei delta...se si inserisce 'q' la funzione ritorna 0, ok. Ma se dal tastierino si preme 0 (lo zero) la funzione non ritorna lo stesso 0, provocando la stessa reazione di come se avessimo premuto 'q'? Se così non fosse (ho dato un'occhiata non approfondita) a che serve nell'array delta gestire il carattere 'zero' del tastierino se tanto è escluso dall'input..
-- Comment added by
DaniloRossi on 22 Nov 2003
X Danilo Rossi
La strdup nel man esiste una documentazione guarda bene

.
Che distribuzione hai? Io una Red Hat 9.0
-- Comment added by
DarioFiorenza on 22 Nov 2003
Re:
Tnx Dario, ci ho provato ma non mi ha dato risultato, ora non ricordo di preciso il messaggio, comunque non mi ha dato nulla...io ho la Mandrake 9.0..
-- Comment added by
DaniloRossi on 22 Nov 2003
X tutti quelli che sono in crisi con la getchar().
Ricordatevi come si comportano i caratteri e cosa li differenzia dagli interi.
Ricordato ciò..... passate da così

a
-- Comment added by
DarioFiorenza on 22 Nov 2003
Re: strdup
Sulla mia pagina personale su twiki ho messo l'output da me ricevuto con il comando "man strdup".
Visto che si nominano distribuzioni linux un
W slackware mi pare necessario.
-- Comment added by
EmanueleQuattrini on 22 Nov 2003
Strdup
Seguendo il codice di pacman definisco l'array che deve contenere la copia di dell'array therace
ma definendolo prima del main non me lo fa inizializzare. Così sono costretto a definirlo nel main. Quindi faccio come ha fatto il professore per pacman faccio un ciclo e assegno race[i]=strdup(therace[i]); il programma mi va in segmentation fault x quale motivo?
-- Comment added by
DarioFiorenza on 22 Nov 2003
Getchar o Scanf
Se volete potete anche utilizzare la scanf in questo modo:
scanf("%s",&input)
è solo che c'è un problema: la scanf considera lo spazio come delimitatore
tra due input cioè se inserisco:
m (spazio) n
è come che avessimo inserito
m
n
mentre con la getchar avremmo una stringa del tipo m (spazio) n
-- Comment added by
MatteoLaBella on 22 Nov 2003
Re: Problemi con le dimensioni
strlen torna il numero di caratteri della stringa che gli viene passata per argomento (senza contare lo 0 finale).
sizeof torna il numero di bytes della struttura che gli viene passata. Per trovare il numero di elementi di un array bisogna sapere le dimensioni dell'array e di un elemento.
Re: Sul getchar (caratteri spuri)
Leggete un carattere per volta e ignorate i caratteri che non vi servono.
Re: Gestione degli "errori"
Se fate come è scritto nell'esercizio (buttando i caratteri che non servono) non potete sbagliare.
Re: Strdup
Strdup alloca anche la stringa, strcpy la copia in una stringa già allocata.
Re: Altra cosa (carattere 0 in delta)
Serve a tenere gli indici uguali ai numeri (per es. indice 4 per il tasto '4').
Re: strdup
il prototipo di strdup (contenuta in
string.h ) è:
char * strdup(char *);
Re: segmentation fault
Hai allocato l'array dei puntatori a stringhe? (ricorda che ora il numero di righe te lo devi calcolare a runtime)
Re: Getchar o Scanf
c = getchar() è equivalente a usare scanf("%c",&c).
-- Comment added by
AndreaSterbini on 23 Nov 2003
Quando le macchine sbattono...
...nn vanno più visualizzate. Mi sono trovato un metodo mio per fare questo, solo ke pare ke funzioni solo per 4 makkine...da 5 in su sfasa e nn capisco perkè. In pratica faccio un controllo su tutte le posizioni del vettore di struct allocato all'inizio. Se la posizione contiene una makkina ke ha sbattuto, la cambio con quella successiva e così via, in modo tale ke risultano, alla fine del ciclo, tutte le makkine in gioco nelle prime posizioni, e quelle ke hanno sbattuto nelle ultime...ke verranno poi escluse al ciclo successivo perkè decremento una variabile ecc...nn capisco perkè funziona solo da 1 a 4 makkine...
-- Comment added by
DavidVulpetti on 23 Nov 2003
l'ho riguardato 300 volte è impossibile ke nn funziona...teoricamente fa tutti gli spostamenti giusti, ho fatto i calcoli anke per 6-7 makkine su un foglio di carta e teoricamente all'inizio del ciclo successivo dovrebbe leggere il numero esatto di makkine e il nome esatto di makkine rimaste...ma nn capisco perkè nn funziona con più di 4 makkine
-- Comment added by
DavidVulpetti on 23 Nov 2003
Ancora sulla Strdup e Pacman
Prima di fare l'esercizio vorrei capire alcune cose su Pacman che mi sono ancora oscure.
1) ancora non ho capito a cosa serve copiare (con una strdup) l'array di stringhe char * theMaze[]. Non posso lavorare solo su questo? Non mi complicherei la vita poi a dover fare maze[HEIGHT-y-1][x].
2) char * maze[HEIGHT] = { 0 }; perchè inizializzo la prima stringa a zero? Tanto poi ci metto theMaze[]...
-- Comment added by
LivioDellaCorte on 23 Nov 2003
Ancora sulla Strdup e Pacman
leggi su.
-- Comment added by
LivioDellaCorte on 23 Nov 2003
Re: Ancora sulla Strdup e Pacman
Le stringhe usate nell'inizializzatore di themaze sono inserite dal compilatore in un'area costante, non modificabile, quindi non è possibile aggiungerci il carattere della macchina.
Ci sono due modi per curare questo comportamento:
- compilare usando l'opzione -fwritable-strings
- oppure copiare le stringhe in memoria modificabile
in automatico
-- Comment added by
AndreaSterbini on 23 Nov 2003
Re:Quando le macchine sbattono...
Io uso una variabile "int crash" come flag (definita nella struct macchine) che indica se una macchina a sbattuto o meno, quando questa flag e' attivata, semplicemente ignoro nella stampa la macchina e vado avanti... pero' ancora nn ho fatto una fase abbastanza approfondita di testing percio' potrebbe non funzionare in alcuni casi :-P
-- Comment added by
AntonioVillani on 23 Nov 2003
Risolto problema del segmantation fault
Ho trovato il modo di utilizzare il sizeof.... se qualcuno non riesce ancora a calcolare il sizeof si legga le risposte del prof il modo per calcolare il numero di righe è presente nelle sue risposte(io questo problema lo avevo risolto anche senza leggere le sue risposte perche la soluzione e molto semplice) ma se qualcuno si è intrippato e meglio che non perda tanto tempo
sulla sizeof....il programma è molto più complicato di quanto pensassi in partenza ci vorranno almeno due giorni di lavoro per renderlo efficiente al 100%.
Un altro consiglio che do a tutti di guardarsi bene packman perchè il codice potrebbe essere molto utile per l'implementazione dell'homework 4 questa è una mia opinione poi ognuno fa come vuole. Bella
-- Comment added by
DarioFiorenza on 23 Nov 2003
Quando le machine Sbattono
Ti dico solamente che utilizzare un flag e sempre un ottima cosa però stai attento con gli indici perchè sembra strano ma ci vuole poco a sbagliare l'indice e fleggare a (0) "macchina che non gioca più" con un altra che sta giocando.
Se non commetti questo errore allora usare un flag dentro una matrice è un modo per evitare che ti venga ristampata la macchina anche se distrutta
-- Comment added by
DarioFiorenza on 23 Nov 2003
RE: Problemi col Getchar
Quando utilizzate la getchar() sarebbe igienico un ciclo di svuotamento del buffer: while (getchar() = '\n'); o più rozzamente (per un input solo) basta mettere due getchar() una di seguito all'altra.
-- Comment added by
MarcoAmmirata on 23 Nov 2003
Re: strdup
Non è meglio utilizzare qualcosa di più portabile? Ad esempio allocare lo spazio in memoria con malloc e poi copiare le stringhe con strcpy o strncpy (se si tiene anche alla sicurezza).
-- Comment added by
MarcoAmmirata on 23 Nov 2003
Re: Re: strdup
Portabile ? Su che sistema operativo lo vuoi portare? il Palm OS?
Usate quello che vi pare (strdup = malloc---+ strcpy)
Sicurezza? guarda che siamo a Prog 1!

(comunque hai ragione)
-- Comment added by
AndreaSterbini on 23 Nov 2003
Altre domande:
- Anche a me da un segmentation fault, perchè dichiaro la matrice ( char *boh[] = {0}; ) come fa lei in pacman, solo lo faccio nel main, e poi uso la STRDUP. Il problema è l'allocazione a quanto ho capito, ed infatti ho provato ad allocarla ma mi da errore..che tipo di cast va messo prima di chiamare la malloc/calloc che sia, quando alloco un vettore di puntatori a char?
- Nell'esempio che ha pubblicato da come coordinate iniziali 37 e 8..che sulla pista corrisponderebbero, rispettivamente, alla colonna 37 e alla riga 8...io per mettere un'auto li invece devo posizionarla in 16, 37..siccome mi ci sto impicciando

da che dipende l'orientamento della matrice, a questo punto: solo da come uso io gli indici o anche da come ho trovato il numero delle righe e delle colonne con le sizeof e strlen?
- Se all'inizio inserisco 0, come numero dell macchine, il programma che fa, visualizza la pista vuota ed esce? Idem se posiziono le macchine su un muro? E nel caso posiziono la macchina sui caratteri '@' o '|'? Quando una macchina vince, ad ogni modo, si esce e basta?
-- Comment added by
DaniloRossi on 23 Nov 2003
Controllo sulle diagonali
Nel testo dell'esercizio lei dice:"per controllare le diagonali esistono due casi, a seconda che sia maggiore l'incremento deltax (oppure deltay)"...Ma nel caso in cui deltax e deltay sono uguali che dobbiamo fare?
-- Comment added by
MarcoGrechi on 23 Nov 2003
Re: Seg Fault
Se ho capito che vuoi dire, allora il cast va fatto con (char *)malloc(ecc...ecc). Senò non ho capito proprio la domanda...
-- Comment added by
MarcoAmmirata on 23 Nov 2003
Re:Strdup and security
>
Portabile ? Su che sistema operativo lo vuoi portare? il Palm OS?
>
Sicurezza? guarda che siamo a Prog 1!
L'importante è imparare, no?

(e poi il
PalmOS è un ottimo os...

)
-- Comment added by
MarcoAmmirata on 23 Nov 2003
Re:Re: Seg Fault
Esatto...il punto è che il segmentation fault credo si manifesti proprio perchè devo allocare quella matrice prima di fare la strdup (il programma funziona lo stesso, solo che quando esce poi mi da Segmentation Fault).
Io lo allocavo così:
nomeVettoreDiPointerAchar = (-cast-) calloc(numero righe, sizeof(riga));
mi pare..solo che mi dava errore in questa riga per via del cast, non riuscivo a capire quale mettere, li ho provati tutti anche chiaramente (char*), ma nada :/
-- Comment added by
DaniloRossi on 23 Nov 2003
Errore in delta[][] di pista.h???
ho completato la versione base del gioco solo che ho dei problemi con gli spostamenti della matrice delta... e' come se il tastierino numerico dovesse essere girato di 90 gradi in senso orario, nella direzione della pista. Potrebbe anche adar bene ma poi le macchine nn si commportano come nell' esempio proposto da Lei prof. errore nella matrice delta o nel mio programma?
-- Comment added by
AntonioVillani on 23 Nov 2003
Gestione dell'errore iniziale del programma
Il primo "errore" ke si può fare è quello di mettere come coordinate iniziali delle makkine o un muro, o un carattere ke decreta la vittoria oppure una coordinata ke si trova fuori dalla matrice. Professore la gestione di questo errore va messa subito dopo la prima scanf? Ovvero subito dopo le coordinate e quindi prima delle lettere delle makkine? Io l'ho messo lì...
-- Comment added by
DavidVulpetti on 23 Nov 2003
Gestione degli errori
Ho finito l'esercizio, ma ho avuto dei casini con la getchar (da quello ke ho visto nn solo io) e ho trovato il modo per evitare ke prenda l'accapo della scanf o del getchar precedente. Se lei professore ai test mette sempre più macchine (e numeri per la velocità) di quelle giocanti, credo che il mio programma nn passerà nessun test
-- Comment added by
DavidVulpetti on 23 Nov 2003
Segmentation Fault
Adesso il segmentation fault me lo da se inserisco provo ad inserire la prima macchina
ho visto il programma del pacman come variale globale viene definito la matrice di puntatori char *maze[HEIGHT]={0}; e dopo molto più avanti definisce una matrice bidimensionale maze[HEIGHT][WIDTH]='C'; io all'incirca faccio la stessa cosa ma mi va in segmentation fault quando provo ad inserire le machine nella matrice.
Devo x forza allocare la matrice bidimensionale? La strdup non fa una copia della locazione di memoria di therace solo che modificabile... qualcuno sa dirmi il perchè?
-- Comment added by
DarioFiorenza on 23 Nov 2003
Io i problemi con la getchar()....
Ho risolto facilmente i problemi con getchar(); sono a disposto a spiegare come risolvere i problemi degli spazi presi dalla scanf(); certo se qualcuno mi spiega come risolvere il problema spiegato prima ci aiutiamo a vicenda tipo p2p(senza codice please).
-- Comment added by
DarioFiorenza on 23 Nov 2003
Re: Altre domande: allocazione vettore
Ti da errore perchè non dai il numero di elementi al vettore. In
PacMan era una costante.
Hai incluso stdlib.h?
Re: Altre domande: coordinate
Come vi avevo avvertito, la riga in fondo in basso (indice N-1) corrisponde alla coordinate y=0, mentre la prima riga (indice 0) corrisponde alla y=N-1. Dovete fare una sottrazione.
Re: Altre domande: N=0
Ci penso.
Re: Controllo sulle diagonali
Se deltax=deltay allora scegliete quella che preferite.
NOTA l'esempio 100.in 100.out non controlla le diagonali.
Re: Strdup and security
Certo, ma devo dare retta più a chi non ha idea di cosa parli che a chi lo ha capito
Re: Errore in delta[][] di pista.h???
Controlla la direzione della tua y (vedi sopra).
Re:Re: Seg Fault
Sei sicuro che sia sizeof(riga)? Pensa a qual'e' il tipo dell'elemento del vettore che stai allocando .... mi dici che cosa è 'riga'?
Togli il cast e includi stdlib.h
Re: Gestione dell'errore iniziale del programma
Fa lo stesso, sia che i caratteri maiuscoli li leggi sia che non li leggi l'output è il medesimo.
Re: Gestione degli errori
Invece di gestire lo \n prova a ignorare tutti i caratteri che non sono maiuscole.
Nei test io userò input corretti (vedi esempio 100.in).
Re: Segmentation Fault
Per essere precisi char *maze[HEIGHT]={0}; definisce un vettore di puntatori a vettori di caratteri. Quindi gli elementi del vettore sono puntatori a stringhe. Per accedere ad un carattere la notazione maze[y][x] sembra esattamente quella di una matrice, ma in realtà maze[y] seleziona il puntatore alla stringa della riga e poi [x] seleziona il carattere.
Re: Io i problemi con la getchar()....
Ma se vi ho dato io il codice di leggiMossa ... non ti vorrai mica prendere il merito!
-- Comment added by
AndreaSterbini on 23 Nov 2003
X David Vulpetti
Basta che usi un semplice flag e tutto è risolto....non ti preoccupare.
Visto che lo hai finito sai dirmi come risolvere questo problema che mi blocca perchè altriment lo avrei anche io finito...

Io faccio la stessa cosa che il prof fa dentro pacman lui non usa malloc. per creare l'array bid. Poi x magia ha un array bid.
entra nel labirinto e modificare la matrice.... come ?????????????????????????????????????????????????????????????????????????
faccio?????????????????????????????????????????
-- Comment added by
DarioFiorenza on 23 Nov 2003
Re:X David Vulpetti
Io il flag lo uso, ma mi vale per l'accapo...se uno mette un'altro carattere in più nella scanf o getchar precedente va in palla.
Io del
PacMan ho preso solo la funziona display(), per il resto nn so come fa...cmq uso malloc.
-- Comment added by
DavidVulpetti on 23 Nov 2003
Passo ugualmente i test?
se implemento il mio programma con la modalità Cambio Manuale....... passo ugualmente i test?
-- Comment added by
SimoneSabbatini on 23 Nov 2003
lol
-- Comment added by
DavidVulpetti on 23 Nov 2003
Re:
L'ho incluso stdlib.h prof, il problema è appunto che dichiaro quella matrice senza mettere nella dichiarazione il numero degli elementi..e non posso farlo, visto che calcolo le dimensioni della matrice in run-time..allora devo allocarla...proverò a togliere il cast, per sizeof(riga) intendo sizeof(stringa)..
-- Comment added by
DaniloRossi on 23 Nov 2003
Re: allocazione a runtime
Appunto, l'allocazione la devi fare a runtime, e quindi prima definire una variabile puntatore ad un array e poi allocare l'array.
forse è meglio se usi sizof(char*) che è più chiaro.
-- Comment added by
AndreaSterbini on 24 Nov 2003
Domanda
Qualcuno saprebbe dirimi con precisione qual'e` il programma del corso (PROGRAMMAZIONE I) di Piperno e come si svolgera` l`esame? Grazie mille!!! Claudia
-- Comment added by
ClaudiaCorsaletti on 24 Nov 2003
Volevo sapere per la precisione dx e dy
Dx e Dy partono tutte e due da zero?
Controllo degli errori: quando una macchina sbatte non bisogna scrivere niente come
prompt anche se nel testo dell'esercizio c'erà scritto "se la macchina ha urtato viene stampata una scritta (che devo definire)e ..... ?
E x finire Esempio abbiamo 4 macchine una sbatte nella prossima immissione dovremo immettere 3 numeri (macchine rimaste) e non 4(1 ha sbattuto)??? Vorrei una conferma da lei Prof.
-- Comment added by
DarioFiorenza on 24 Nov 2003
Dimensioni e Posizioni
Volevo sapere se le dimensioni delle piste contenute negli altri file che lei userà per la correzione sono uguali a quelle di questa pista? Suppongo di no se dice di usare sizeof() e strlen() per calcolarne la grandezza. Poi vorrei sapere se è possibile posizionare le macchine in prima posizione su '|' o su '@' se questo avviene come ci dobbiamo comportare. Ultimo quesito se viene letto il carattere 'q' il programma deve uscire istantanemanete o deve proporre prima qualcosa come lo stato finale della pista?
Grazie
-- Comment added by
AlessioDiMauro on 24 Nov 2003
Quante Macchine posso partecipare alla corse? Illimitate?
Spero vivamente che il numero sia limitato a 256....
-- Comment added by
LivioDellaCorte on 24 Nov 2003
Attraversare il traguardo in diagonale.
Dato che è possibile attraversare il traguardo in diagonale, per la versione base del programma come si fa?
Per quanto riguarda invece il caso in cui vengano immesse coordinate iniziali, collocando le macchine su un muro, la pista viene comunque stampata vuota, o si esce direttamente dal programma?
E' possibile ricevere qualche aiutino in più sul controllo diagonale?
-- Comment added by
MaurizioTrano on 24 Nov 2003
Questione da principiante???
caro prof.
potreste effettuare un ulteriore (magari leggermente approfondita) lezione sull'uso delle struct, malloc e sizeof?
p.s. non ditemi di rileggermi il libro... non si capisce molto!!!
non ditemi di venire alle lezioni....per ora non ne ho saltata una!!!
dovete tenere presente che è la prima volta che metto mani su un linguaggio di prog e mi ci vuole un po' per farlo mio, magari se potessimo vedere a lezione più programmi che riguardano ciò che stiamo facendo...
la ringrazio e mi raccomando ci pensi
-- Comment added by
MicheleFacecchia on 24 Nov 2003
getchar e allocazione dinamica
salve prof.,seguendo il suo esempio dell'uso del getchar ho pensato di usarlo per prendere in input le N lettere corrispondenti alle N macchinine. Nel modo in cui l'ho fatto non funziona, però mi sono incartato e non capisco qual'è l'errore/orrore.
nomi = (int *)malloc(4*N); //nomi è un int *...
for(i=0;i<N;i---++)
nomi[i] = getchar();
-- Comment added by
BeniaminoLarocca on 25 Nov 2003
getchar
sono fermo al getchar, cacchio...forse dovrei fare while(getchar() = '\n')...nomi[i]=getchar(); No???? Ho bisogno di un piccolo input per sbloccarmi, please.
-- Comment added by
BeniaminoLarocca on 25 Nov 2003
Re: Volevo sapere per la precisione dx e dy
- dx e dx partono da 0
- nessun messaggio quando una macchina sbatte (l'ho tolto)
- se una macchina sbatte al prossimo turno si legge un input (1-9 e q) di meno
Re: Dimensioni e Posizioni
- le dimensioni saranno variabili
- quando all'inizio si posizionano le macchinine si fanno gli stessi controlli che si fanno in seguito dopo le mosse:
- se si è fuori o su '#' tutte sbattono
- se si è su '|' o '@' la prima vince (vincono tutte ma vale la prima)
- se si è su ' ' si va avanti
- quando si legge 'q' si esce immediatamente
Re: Quante Macchine posso partecipare alla corse? Illimitate?
Quante ne entrano in un intero. (2 alla 31) - 1
Re: Attraversare il traguardo in diagonale. (versione normale)
Se il traguardo viene 'saltato' si continua a girare
Il controllo in diagonale si fa così:
- si sceglie la deltax o deltay maggiore (ad esempio deltax)
- per ogni intero tra x e x---+deltax
- si calcola la coordinata intera y corrispondente arrotondata all'intero inferiore
- per far questo vi dovete ricordare l'equazione di una retta (y=mx---+c) e fare due conti tenendo conto che il coefficiente angolare m=deltay/deltax (potete considerare c=0 e poi usare il risultato come incremento della y corrente)
- si controlla la casella corrispondente
Re: malloc, sizeof, struct
Con malloc puoi allocare un pezzo di memoria delle dimensioni desiderate. Malloc torna come risultato un puntatore al blocco allocato. Cioè l'indirizzo di memoria del blocco.
Una struct è una struttura dati formata da una successione di campi, che possono essere esaminati/scritti usando ad esempio la notazione macchina->x (in cui macchina è una variabile che contiene un puntatore ad una struct che ha il campo 'x').
Ad esempio una struct che ha i due campi interi
a e
b può essere definita come:
struct boh {
int a;
int b;
};
Per definire una variabile 'cheneso' che contiene un puntatore ad una struct 'boh' si scrive:
struct boh * cheneso;
Per allocare una struct di tipo 'boh' e metterne il puntatore in 'cheneso' scrivo:
cheneso = malloc(sizeof(boh));
Per scrivere il valore 5 nel campo 'a' della struct puntata da 'cheneso' scrivo:
cheneso->a = 5;
Come hai visto ho usato la funzione 'sizeof' per dire a malloc di quanti bytes ho bisogno per la struct di tipo 'boh'.
Pensi che basti?
Re: getchar e allocazione dinamica
Se non mi dici che cosa non funziona coma faccio ad aiutarti? A me sembra corretto.
Re: getchar
Ma se la funzione per i valori 1-9 e q ve l'ho data! guarda leggiMossa in pista.h
-- Comment added by
AndreaSterbini on 25 Nov 2003
Re: getchar e allocazione dinamica
Dunque, l'errore è che al primo carattere inserito (il nome della prima macchina) termina il programma. Non capisco se l'errore riguarda l'uso della getchar() oppure l'allocazione dell'array di int.
-- Comment added by
BeniaminoLarocca on 25 Nov 2003
Ancora sul calcolo della diagonale
Notate che i conti diventano molto più facili se si fa finta che il punto di partenza per la mossa sia nell'origine.
In questo caso la retta è di equazione y=mx con m=deltay/deltax. (sto considerando il caso di deltax>deltay).
Una volta calcolata l'altezza y per ciascuna x da 0 a deltax basta sommarle agli x e y correnti e si sa dove guardare il carattere.
-- Comment added by
AndreaSterbini on 25 Nov 2003
domandona
c'è un modo,in win, per recuperare un file sovrascritto??? Ho praticamente cancellato tutto quello che avevo fatto questa mattina sull'esercizio.
-- Comment added by
BeniaminoLarocca on 25 Nov 2003
Copiare la pista
Essendo la dimensione della pista come ha detto lei variabile ed essendo definita in una libreria (quindi non modificabile) la pista va copiata in un vettore d'appoggio come per altro fa anche lei in pacman. per eseguire questa operazione sto avendo dei problemi. una volta calcolate le dimensioni di una riga e il numero di elementi del vettore (ossia le colonne) ho problemi a copiare la matrice originale in quella allocata dinamicamente che dichiaro come
char* copia[]={0}. per effettuare la copia ho provato sia con strdup che con strcpy anche usando puntatori d'appoggio. effettivamente riesco a copiare la pista ma alla fine del programma avviene un errore che termina il processo. lo stesso programma in cui però il vettore copia viene dichiarato come char* copia[DimensionePista] funziona correttamente. Cosa sbaglio?
Grazie
-- Comment added by
AlessioDiMauro on 25 Nov 2003
Copiare Pista
Hai inizializzato la matrice a zero?
-- Comment added by
DarioFiorenza on 25 Nov 2003
Re: Copiare la pista
Devi allocare con malloc il vettore di puntatori di dimensioni (N*dimensione di un puntatore).
Poi potrai inserire in ciascun elemento del vettore il puntatore alla copia della corrispondente riga.
-- Comment added by
AndreaSterbini on 25 Nov 2003
Volevo sapere sulle diagonali e su altre cosine(X Il Prof)
Sembrerà stupida come domanda ma io devo valcolarle solamente quando premo i tasti
e negli altri casi non serve?
Un altra cosa nella versione più difficile si deve considerare sia la @ che il | o solo
il pipe(|)?
E infine la strategia da implementare migliore da far fare alla macchina come dobbiamo comportarci dobbiamo far controllare alla macchina il percorso migliore ma cioò vuol dire che fa tutto in automatico (una rozza inteliggenza artificiale)? bisogna creare un opzione nel programma che consenta di potervi giocare in automatico?
So che ho fatto molte domande ma vorrei pure della risposte. La Ringrazio x la sua disponibilità Prof
-- Comment added by
DarioFiorenza on 25 Nov 2003
risolto
risolto il problema dichiarando la destinazione come char **destinazione anzichè char *destinazione[]={0}
Altra domanda però. L'esempio con 100.in e 100.out ha anche il controllo delle diagonali? perchè ala seconda mossa ho una macchina in posizione diversa. E anche in caso di vittoria o di tutte macchine distrutte l'uscita è istantanea o va stampata la pista?
-- Comment added by
AlessioDiMauro on 25 Nov 2003
Re:Domandona
Ci sono dei programmi che ti permettono di recuperare i file eliminati, uno mi pare si chiami "Undelite", infatti se non sbaglio quando in win si cancella un file, in realtà si eliminano le info riguardanti il puntamento.Comunque per limitare al minimo la possibilità di sovrascrivere lo spazio disco dove è allocato fisicamente il file dovresti usare il PC il meno possibile fino a che non recuperi ciò che ti serve.
-- Comment added by
LucaMarozzini on 25 Nov 2003
Si parte
per la posizione iniziale faccio fare tutti i controlli necessari (sbatte vince etc.)
ma c'è un modo per posizionare le macchinine subito dopo i simboli "|" . dato che non sono a conoscenza della pista per come ho fatto il prg le mie macchinine potrebbero partire a metà della pista, per loro è importante trovare uno spazio vuoto. spero di essermi spiegato ciao a tutti
p.s. grazie per la spiegazione su malloc,sizeof e struct
-- Comment added by
MicheleFacecchia on 25 Nov 2003
OT
Stavo pensando... il mio compito Forza4 è risultato identico a quello di altri 2 compagni... servirebbe a qulcosa dire che io avevo rilasciato il codice sotto licenza GPL? :-PPPPP
-- Comment added by
AntonioVillani on 25 Nov 2003
Delta?
Scusate la domanda sciocca ma la coordinata di [0,0] di delta è x e l'altra [0,1] è y?
-- Comment added by
DarioFiorenza on 25 Nov 2003
X Alessio di Mauro
X Destinazione
Cosa intendi la matrice che contiene la pista?
Basta definire
char * destinazione[ALTEZZA DELLA MATRICE]={0}; e come il pacman non cambia niente non ti comlicare la vita.
Poi il mio è un cosiglio fai come tu ritieni più giusto.
-- Comment added by
DarioFiorenza on 25 Nov 2003
Re:
Il professore ha detto che userà altre piste per la ocrrezione di dimensioni diverse per cui la dichiarazione char* destinazione[ALTEZZA] non va bene perchè ALTEZZA varia da circuito a circuito

occhio
-- Comment added by
AlessioDiMauro on 25 Nov 2003
CERTO LO SAPEVO
ALTEZZA DELLA MATRICE E' UNA VARIABILE DI TIPO DINAMICO , LO SAPEVO E PER QUESTO CHE TI HO DETTO
UN NOME DI UNA VARIABILE E NON IL VALORE ES(25).FORSE NON CI SIAMO KAPITI GRAZIE PER LA TUA PRECISAZIONE.
-- Comment added by
DarioFiorenza on 25 Nov 2003
100.in e 100.out
1) Professore, sbaglio o in 100.in lei ha continuato a inserire coordinate anke per le macchine fuori gioco? Noi non dobbiamo fare cosi vero?
2) Professore, il carattere q implica l'uscita dal gioco o solo "l'abbandono" di una macchina?
Grazie
-- Comment added by
EmanuelePaterna on 25 Nov 2003
100.in
Non ho controllato 100.in ma in una delle risposte qui su il professore mi ha detto ke lui inseriva sempre input corretti...se mette coordinate anke per makkine fuori gioco il mio programma nn passa i test, problemi con la getchar
-- Comment added by
DavidVulpetti on 25 Nov 2003
ALTEZZA VARIABILE?!?!??
Io ho definito l' altezza della pista con
#define HEIGHT 24
immagino che nn vada bene... devo rifare un bel po' di cosette allora...
grrrrr
Non pensavo che anche la pista potesse variare... sul testo dell' esercizio nn c'e' scritto
o sbaglio?
-- Comment added by
AntonioVillani on 25 Nov 2003
Mi sbagliavo
Ho riletto meglio il testo e ho appurato che mi sbagliavo.
Cmq ho risolto ^_^
-- Comment added by
AntonioVillani on 25 Nov 2003
Sul 100out
Stamattina mi ci son messo sul serio (na buona volta :)) e l'ho finito, mi resta solo qualche piccolo dubbio...ed uno un po più serio.
Quelli marginali riguardano l'output del programma:
-All'inizio, se inserisco '0' come numero macchine, o coordinate sbagliate (un muro o fuori dalla matrice) dopo quali input devo terminare il programma (e devo stampare la matrice o meno)?
-Alla fine, quando l'ultima macchina sbatte (ipotesi) esco subito dal programma o stampo prima la pista vuota?
-Sempre alla fine, se resta una macchina sola, e dopo l'ultimo input vince (diciamo ke ha uno spostamento che la porta da un punto libero della pista ad un punto 'vincente'), devo stampare la pista con la macchina nella posizione finale o esco direttamente come quando si sbatte?
Ora la cosa seria
Ho provato con 100.in...quando confronto il mio 100.out col suo, professore..fino ad un certo punto sono uguali..dopo di che le macchine iniziano ad andare per fatti loro..e la cosa è alquanto inquietante

voglio dire..la gestione del 'movimento' mi sembra di averlo fatto correttamente, non era particolarmente difficile..e ad ogni modo è assurdo che fino a metà gara le macchine si spostano correttamente e da un certo punto in poi iniziano a sfasarsi gli spostamenti (e parlo solo degli spostamenti, non delle collisioni ecc ecc). Com'è possibile prof? Mi son venuto solo due risposte plausibili:
1) Ho scaricato li file da Windows e l'ho usato sotto Linux...qualche problema col formato? (o qualche routine minatrice di zio Bill?)
2) Nel mio programma, prendo in input le direzioni per le N macchine rimaste..questo non toglie che se ne metto di più, me li trovo già belli pronti nella getchar successiva quando richiedo l'immissione dei comandi..potrebbe essere questo?
La cosa mi preoccupa..perchè così non passerei i test

una funzione se non va non va dall'inizio alla fine...non da metà in poi..
-- Comment added by
DaniloRossi on 25 Nov 2003
Coordinate di Partenza
Mi scusi professore, ma se metto come coordinate iniziali un x e y che danno un "#" o un "|", non gioca nessuno o hanno vinto tutti ??
-- Comment added by
MarcoBucci on 25 Nov 2003
Re: Volevo sapere sulle diagonali e su altre cosine(X Il Prof)
- Vanno gestiti tutti i 9 tasti, cha cambiano deltax e/o deltay come elencato nella matrice delta definita in pista.h
- nella versione opzionale vanno gestiti sia '|' che '@'
- strategia? le macchine seguono il movimento descritto dalle velocità deltax,deltay che vengono modificate in base ai tasti premuti in input ... dove la vedi l'AI?
Re: risolto
L'esempio 100.in/100.out segue la gestione 'normale' (no diagonali)
Re: Si parte
Sono io che decido la posizione iniziale delle macchinine a seconda del file 'pista.h'. Ad esempio in 100.in le coordinate sono tali da stare nella pista.
Re: OT
rotfl
Re: Delta?
Accidenti mi sono dimenticato di dirlo.
- delta[i][0] è la variazione di deltax per aver premuto il tasto 'i'
- delta[i][1] è la variazione di deltay per aver premuto il tasto 'i'
Re: CERTO LO SAPEVO
non c'e' bisogno di strillare.
Re: 100.in e 100.out
In 100.in ci sono 10000 input, il programma legge quelli che gli servono (prima 100, poi un tot sbattono e ne legge 100-tot poi ne sbattono altre e ne legge ancora meno ...).
Dato che gli accapi vengono ignorati da leggiMossa, non importa che io li abbia scritti come 100 righe di 100 caratteri.
Dato che le macchine sbattono tutte prima che il file sia stato consumato tutto, il programma esce ed ignora i caratteri che restano.
'q' vuol dire abbandono del gioco (leggi meglio l'esercizio).
Re: 100.in
Non ti stressare, se il tuo programma usa leggiMossa funzionerà correttamente (vedi risposta precedente).
Re: Sul 100out
Quando il programma termina ignora l'input seguente, quindi puoi terminare dove vuoi.
- non stampare la matrice se tutti muoiono
- alla fine non stampare la matrice (vedi 100.out in cui alla fine appare solo l'ultima macchina)
- quando una macchina vince si esce senza ristampare la matrice
- 100.out corrisponde alla versione che non controlla le diagonali
- anche io, quando avanzano numeri li prendo nelle getchar successive
Re: Coordinate di Partenza
Se le coordinate di partenza corrispondono ad un '#' o '|' o '@' il gioco esce subito.
-- Comment added by
AndreaSterbini on 25 Nov 2003
Ok
Allora ho finito di preoccuparmi, faccio solo qualche altro tentativo.
Grazie mille prof.
-- Comment added by
DaniloRossi on 25 Nov 2003
Piu' input delle macchine
Se a partita iniziata metto in input piu' numeri di quante sono le macchine, questi vengono considerati come input del turno successivo, e' giusto questo?
-- Comment added by
AntonioVillani on 26 Nov 2003
qualche accenno sulle struct attraverso i database...
a qualcuno puo` far comodo

.penso che tutti abbiano in mente un database..no? va bene. Vediamo di capire cosa e` un database con un esempio classico: dobbiamo gestire la nostra rubrica del telefono. Abbiamo bisogno di una tabella su cui mettere i nostri dati. Dunque mettiamo sulle colonne (che da ora in poi chiameremo `campi`) un etichetta (id di campo), in cui diciamo il contenuto di quella colonna. Nome, Cognome, Numero Casa, Numero Cellulare basteranno per questo semplice esempio.
Nome |
Cognome |
Num Casa |
Num Cell |
Una volta vista la struttura della nostra tabella dobbiamo metterci le cose dentro: aggiungiamo una riga (che da ora in poi chiameremo record) per ogni persona che dobbiamo inserire. Una riga di esempio sara`:
Simone |
Onofri |
06123456 |
349xxxxxx |
Da notare che la prima riga (quella che contiene Nome, cognome ecc..) non bisogna considerarla come un record (diremo infatti che contiene gli id di campo).
Ecco allora pronta la nostra rubrica del telefono!!!

Ora passiamo (finalmente) alle struct.
Quando si definisce una struct diciamo quali sono i nostri campi (possono essere int, puntatori...quello che ci pare).
Quado usa una struct e` come se aggiungessimo un record, possiamo gestirci macchine, item di uno stack o di unalista...
Definiremo allora una struct con itemRubrica che avra` i campi nome , cognome ecc...
ogni volta che dovremo mettere una persona nella rubrica useremo un itemRubrica.
Questo e` solo per capire in 2 minuti cosa e` una struct e bisogna stare attenti che le operazioni e le potenzialita` queste strutture dati siano diverse.
-- Comment added by
SimoneOnofri on 26 Nov 2003
Re: Piu' input delle macchine
Esatto (basta leggere cosa fa leggiMossa).
-- Comment added by
AndreaSterbini on 26 Nov 2003
Re: Non ti stressare
Io nn uso la funziona leggiMossa..uso un mio codice semplice, ovvero getchar() ke cmq prende in input come primo carattere l'ultimo della getchar precedente. Cmq se lei dice ke nei test tiene conto di questa cosa, ovvero ke se ho 3 makkine e lei mi mette 100 inpunt poi è giusto ke le mie makkine vanno dove vanno perkè la prima prende l'ultimo input ecc...allora nn mi stresso
-- Comment added by
DavidVulpetti on 26 Nov 2003
Re: Re: Non ti stressare
Nei test (ad esempio) io do' 100 input, se ci sono 3 macchinine il tuo programma deve leggere i primi 3 input validi scartando i caratteri diversi da 1-9 e q e muovere le macchinine, se rimangono tre legge i 3 caratteri (validi) seguenti, altrimenti ne legge meno ... e così via finchè non si vince o tutti sbattono o viene 'q'.
-- Comment added by
AndreaSterbini on 26 Nov 2003
Re:Re:Re:Non ti stressare
Si, teoricamente il mio fa così ma praticamente no, perkè non ho capito per quale mistico motivo anke se gli dai un ciclo ben definito, la getchar() continua a tenere conto anke dei caratteri ke hai battuto digitanto il nome del gameover del gioco a cui giocavi prima di cominciare l'esercizio...quindi, se ho 3 makkinine e metto 100 input invece ke 3, il mio programma nn funziona, perkè massimo ke riesce a fare è impedire all'accapo precedente di rompere le scatole.
La funzione leggiMossa così come è in
PacMan nn va bene, perkè legge un movimento per volta e se dovessi usare quella dovrei cambiare 300 righe di codice del mio programma, e dopo 4-5 giorni passati sopra vorrei ke funzionasse anke con un mio metodo ke mi sono trovato e nn soltanto con la funzione leggiMossa. Per cui pazienza.
-- Comment added by
DavidVulpetti on 26 Nov 2003
oltretutto dicono ke con la scanf il problema si risolve...a me nn pare...ho messo la scanf e fa lo stesso identico intoppo
tu gli dai un ciclo...e lui ti prende anke i caratteri fuori dal ciclo e te li presenta come i primi del ciclo successivo...la getchar nn l'ho inventata io
-- Comment added by
DavidVulpetti on 26 Nov 2003
Esempio di input direzionale
Facciamo conto che io ho 3 macchine restanti in gioco...
Quando lei inserirà le nuove direzioni le inserirà in modo seguente(?):
"369" (sono numeri a caso) (seguite da un ritorno a capo(?))
oppure nel seguente modo(?):
"369xxxxxx" (tante quante erano le macchine all'inizio) (seguite da un ritorno a capo(?))
Spero di essere stato chiaro
-- Comment added by
EmanuelePaterna on 26 Nov 2003
Controllo Diagonali
Il controllo della presenza del muro sulla traiettoria della macchina e non solo del punto di arrivo va fatto anche nel caso in cui lo spostamento è orzziontale o verticale o è stato chiamato apposta controllo diagonali perchè deve contemplare solo i casi in cui la direzione non sia orizziontale o verticale?
-- Comment added by
AlessioDiMauro on 26 Nov 2003
Leggi Mossa
return c - '0';
non bastava mettere return c? (qualcuno mi spieghi cosa cambia)
-- Comment added by
EmanuelePaterna on 26 Nov 2003
deltax>deltay
Nel testo dell'homework lei dice:"per controllare le diagonali esistono due casi, a seconda che sia maggiore l'incremento deltax (oppure deltay)"... Il mio dubbio è: con questo vuole dire che il valore di delta[c][0] è maggiore di quello di delta[c][1], o che il valore assoluto di delta[c][0] è maggiore di quello di delta[c][1]?Mi spiego meglio... quando metto come input 4 (delta = {-1,0}) delta[c][1] è maggiore di delta[c][1] o abs(delta[c][0]) è maggiore di abs(delta[c][1])? mi scuso in anticipo se ho fatto una domanda stupida...:D
-- Comment added by
MarcoGrechi on 26 Nov 2003
Re: Leggi Mossa
essendo c un char ed essendo leggiMossa di tipo int mettendo return c si avrebbe avuto come valore ritornato un numero da 48 a 57 (ossia la codifica ascii dei numeri da 0 a 9) mentre mettendo return c - '0' che e equivale a dire c - 48 si ha esattamente il numero
-- Comment added by
AlessioDiMauro on 26 Nov 2003
malloc
scusi prof per usare malloc includiamo la libreria alloc.h o malloc.h?a me funziona solo con malloc.h ma so che la cosa cambia da compilatore a compilatore.
-- Comment added by
ValentinoDiNunzio on 26 Nov 2003
Re: Esempio di input direzionale
Non riesco a capire perchè non leggete i caratteri che servono per il movimento delle macchinine uno per volta per ciascuna macchinina con la funzione leggiMossa che sta in pista.h ... che vi ho dato a fare
PacMan ?
Ripeto: per ogni macchinina ancora in gioco si legge un carattere valido dall'input saltando ogni carattere non valido (ovvero si usa leggiMossa).
I caratteri successivi saranno letti per la prossima macchina in gioco o per la prima macchina al prossimo turno.
Re: Controllo Diagonali
Certo, anche per linee orizzontali e verticali!
Re: Leggi Mossa
Così torno un numero da 0 a 9 che può essere usato così com'è come indice del vettore delta.
Re: deltax>deltay
Leggi meglio, si tratta dei
deltax e
deltay che sono le due componenti della velocità della macchinina e NON del valore del vettore
delta (lo so, i nomi si assomigliano, ma sono diversi).
Re: malloc
Usate #include <stdlib.h> sennò non compila. (non stai mica in windows?)
-- Comment added by
AndreaSterbini on 26 Nov 2003
Sulle diagonali..
Io per calcolarmi le diagonali non considero il delta maggiore..diciamo che considero la cosa in base alla direzione della macchina..e con una specie di debug ( qualche printf che fa somigliare il programma a snake

) che mi 'evidenzia' le diagonali così come le calcolo il risultato è sempre corretto, quantomeno 'pertinente'..è possibile farlo quindi in un altro modo, o sto sbagliando io? (nel senso..solo in quel modo si calcolano le 'caselle' esatte per cui passa la diagonale?)
La setvbuf anche stavolta non è necessaria, mi pare di aver capito, vero?
Grazie.
-- Comment added by
DaniloRossi on 26 Nov 2003
re:malloc
si sto in windows...stdlib lo uso gia xò senza malloc.h mi da un warning...lascio malloc.h?
-- Comment added by
ValentinoDiNunzio on 26 Nov 2003
Re:Re:Esempio di input direzionale
Io ho fatto un programma ke fa questo...una getchar ke prende i caratteri delle prossime mosse dentro una for...li prende INSIEME..e li ditrubuisce man mano dentro la variabile ke gestisce il nome della makkina dentro la struttura ke gestisce la makkina. Poi faccio una switch-case dentro una for, ke gestisce una per una le makkine. Non ho capito perkè devo utilizzare per forza leggiMossa. Io del
PacMan ho preso display(), strdup e altre cose ke mi sono state utili...ma perkè sono costretto a utilizzare leggiMossa e a cambiare il mio programma ke c'ho messo 3 giorni solo perkè poi nei test vengono dati input "errati". Non pensavo ke nei test Lei dasse sempre qualcosa come 100 input quando ho fatto il programma. Sono piu di 320 righe di codice lo lascio così com'è perkè a conti fatti funziona. Così com'è, ovvero...
se ho 3 macchine e metto 369...makkina A prende 3, makkina B prende 6, makkina C prende 9
se ho 3 makkine e metto 36933...makkina A prende 3, makkina B prende 6, makkina C prende 9...makkina A (turno successivo) prende 3, makkina B (turno successivo) prende "accapo", makkina C (turno successivo) nn prende niente
-- Comment added by
DavidVulpetti on 26 Nov 2003
Esempi di input/output versione opzionale
Professore, potrebbe mettere in linea degli esempi di input/output anche per la versione opzionale del programma?
-- Comment added by
DoraSpenza on 26 Nov 2003
Ancora chiarimenti input direzionale
Es di input:
32566\n
43955\n
Macchine in gioco: 3
1° turno
Macchina 1: 3; Macchina 2: 2; Macchina 3: 5
2° turno
Macchina 1: 6; Macchina 2: 6; Macchina 3: 4
e cosa via...
Giusto?
Perchè io avevo capito:
1° turno
Macchina 1: 3; Macchina 2: 2; Macchina 3: 5 (i successivi 66 venivano scartati)
2° turno
Macchina 1: 4; Macchina 2: 3; Macchina 3: 9 (i successivi 55 venivano scartati)
E così via...
Giusta la prima o la seconda?
-- Comment added by
EmanuelePaterna on 26 Nov 2003
Re: Sulle diagonali..
L'importante è che vengano le stesse caselle del calcolo che ho detto i (che sono consecutive).
Ho chiesto il setvbuf?
Re:Re:Esempio di input direzionale
Non sei costretto a usare leggiMossa, dai tuoi commenti avevo capito che il tuo programma non si somporta come nell'esempio.
Io non do 100 input, ne do 10000.
Nei test non vengono dati input "errati" ... rileggiti l'esercizio, che dice di ignorare i caratteri 'non validi' per indicare la direzione.
L' 'accapo' deve essere ignorato e alla macchina B deve andare il prossimo carattere 'valido'.
Re: Esempi di input/output versione opzionale
Non ce la faccio.
-- Comment added by
AndreaSterbini on 26 Nov 2003
Copia della lista e allocazione di memoria
Continuo ad avere problemi con la lista duplicata. Quando stampo mi tira fuori caratteri strani.
Volevo sapere se l'allocazione dinamica di memoria per la copia della lista è necessaria prima della strdup, oppure se posso usare semplicemente un puntatore appena dichiarato.
Grazie
-- Comment added by
LivioDellaCorte on 27 Nov 2003
ops ho usato lista al posto di PISTA,scusate il lapsus
-- Comment added by
LivioDellaCorte on 27 Nov 2003
Re: Copia della pista e allocazione di memoria
Le stringhe della pista sono indirizzate attraverso il vettore di puntatori
therace.
Devi copiare sia le stringhe che il vettore, e quindi allocare un vettore di puntatori e poi usare strdup.
-- Comment added by
AndreaSterbini on 27 Nov 2003
Ancora deltax>deltay
Se ci dovessimo trovare nel caso in cui deltax = -2 e deltay = 0, dobbiamo considerare deltay>deltax o abs(deltax) > abs(deltay)?
-- Comment added by
MarcoGrechi on 27 Nov 2003
Re: Ancora deltax>deltay
Accidenti, non me ne ero accorto!
Il valore assoluto! Il valore assoluto!
-- Comment added by
AndreaSterbini on 27 Nov 2003
Grosso Problema
Salve Professore, sviluppando il programma mi è sorto un curioso problema:
il programma ora sembra funzionare, purtroppo sono costretto a provarlo sotto windows e non sotto linux per motivi tecnici e presenta un fatto curioso: con una macchina da sola non mi da problemi, se metto più di una macchina il programma non fa nulla, benchè se provo il debug (uso dev-c---++) anche con più macchine non fa una grinza, se invece avvio l'eseguibile non fa nulla...
Non riesco a capire dove sia il problema visto che il debug funziona senza problemi ma leseguibile no...
grazie
-- Comment added by
StefanoNoffke on 27 Nov 2003
Stampa Pista
Dato che la pista di provaè larga 80 (ossia il numero esatto di colonne sullo schermo) stampando una stringa del vettore alla volta la pista viene visualizzata correttamente invece stampando una stringa e successivamente un accapo la pista viene visualizata sfalsata, una riga si e un riga no. Mi domandavo se bisogna mettere o no l'accpao perchè su un output di tipo file che non ha il limite di 80 colonne la pista verrebbe stampata tutta su una riga e non vorrei che questo compromettesse la buona riuscita dei test. cosa dobbiamo fare? stampare sempre l'accapo alla fine di una riga della pista, non stamparlo mai, non stamparlo solo nel caso che la larghezza sia 80?
Grazie
-- Comment added by
AlessioDiMauro on 27 Nov 2003
Re: Grosso Problema
non saprei ...
Re: Stampa Pista
L'accapo ci vuole sempre.
Ricorda che l'output io lo mando su file, e lì non c'è limite al numero di colonne.
-- Comment added by
AndreaSterbini on 27 Nov 2003
Errore anomalo
salve prof, ho un errore piuttosto strano che non so se riuscirò a spiegare bene (male che vada le mando una mail). Io dichiaro una serie di variabili di tipo int e fin qui niente di strano, poi sviluppo il codice della f1 etc.etc.; ad un certo punto, per una certa correzione, io ho eliminato una variabile int che non usavo più e a quel punto il compilatore (momentaneamente, per motivi logistici, uso dev-C---++ su win2000)mi restituisce a runtime un errore del tipo:Errore dell'applicazione, il f1.exe ha provocato errori e verrà chiuso. A me sembra strano anche perchè se poi rimetto una variabile int qualsiasi, l'errore scompare.
Mi faccia sapere.
-- Comment added by
BeniaminoLarocca on 27 Nov 2003
Chiarimento sizeof e strlen
Siccome non è che l'ho capita tanto benen sta cosa, ho provato a fare a=sizeof(Array) e b=strlen(elementoArray)
e mi vengono questi valori a = 100 e b = 80 ho fatto la divisione e le righe mi vengono 1. che ho sbagliato?
-- Comment added by
DaniloDauria on 27 Nov 2003
X Danilo Dauria
sizeof(Array)/sizeof(Array riga
-- Comment added by
DarioFiorenza on 27 Nov 2003
ah ok adesso mi viene 25, allora strlen a ke serve?
-- Comment added by
DaniloDauria on 27 Nov 2003
ah niente ho risolto, grazie
-- Comment added by
DaniloDauria on 27 Nov 2003
Un paio di domande
- Nel main uso il vettore delta del file pista.h, scrivendo delta[c][0] e delta [c][1]...Quando vado a compilare,alle righe in cui uso delta, mi dice: "subscripted value is neither array nor pointer"...Perche?
- Dobbiamo fare qualche controllo sull'input del nome della macchina o ci mettera solo maiuscole?
-- Comment added by
MarcoGrechi on 27 Nov 2003
Sulla stampa della pista
Se io ho 10 macchine e metto 30 input...prima di "fermarsi" e richiedermi un altro input per nuove coordinate...il programma stampa in successione 3 volte la pista? Se io ho 5 macchine e metto 30 input, il programma stampa in successione 6 volte la pista?
Oppure anche se io ho 3 macchine ke giocano, Lei mette nei test un milione di input...ogni volta ke inserisce l'input, il programma stampa una volta la pista e Lei rimette ancora un milione di input?
-- Comment added by
DavidVulpetti on 27 Nov 2003
Altra cosa curiosa...
non riesco a capacitarmi del fatto che la 3a macchina, e solo e sempre quella, dopo alcuni input, circa 5, inspiegabilmente si ritrova in iperspazio (la x pari a 3998112) benchè segua a ruota la a e la b.... ho provato con 10 macchine anche, ma rimane solo la terza macchina a darmi quel problema... (rimane il fatto che devo fare queste prove con il debug di dev-c---++, in quanto il file formula1.exe con più di 1 macchina non funziona...)
c'è nessuno dalle parti di Piazza Venezia che può farmi provare il mio codice sotto Linux?
grazie
-- Comment added by
StefanoNoffke on 27 Nov 2003
Iterazione vs Ricorsione
Mi conferma che l'unico parametro di scelta fra un'implementazione ricorsiva e una iterativa è la facilità di implementazione e che quindi dato un un'algoritmo implementato iterativamente è sempre possibile in teoria implementarlo ricorsivamente e viceversa con la stessa efficienza?
Nota: perfetti gli ultimi parametri per la correzione del Forza4 che premiano chi ha gestito correttamente la matrice e il controllo vittoria che in pratica rappresentavano il 99,9% del programma. Thanks
-- Comment added by
EmanueleQuattrini on 27 Nov 2003
Problemi risolti (spero)...
ho risolto i problemi di prima, me ne rimane uno solo da risolvere:
se uso il file 100.in.txt il programma si blocca dopo un po', ma se modifico il file mettendo 99 macchine invece di 100 funziona perfettamente, con file di 100 e più macchine creati da me funziona senza problemi...
-- Comment added by
StefanoNoffke on 27 Nov 2003
Re: Errore anomalo
Nonso. Lascia la variabile

.
Re: Un paio di domande
Hai incluso pista.h?
Solo maiuscole.
Re: Sulla stampa della pista
Il programma legge dall'input, che può essere la tastiera oppure un file.
Dall'input legge tanti caratteri quante sono le macchine in gioco (scartando quelli non validi). poi fa il turno poi ne legge altri e così via.
Se l'input è da tastiera il programma si ferma quando tutti i carattri inseriti sono stati consumati. Per questo tu vedi 3 stampe per 30 input dati a 10 macchine. Quando inserisci altri caratteri il programma li riceve in input e continua i turni.
Se l'input è da file il programma continua a leggere indisturbato fino a che tutte le macchine sbattono, una vince o appare il carattere 'q'.
Quindi se il mio file ha un milione di caratteri il programma ne legge quanti gliene servono finchè non esce.
Non confondere il file con le singole righe che batti in tastiera.
Re: Iterazione vs Ricorsione
Ricorda che la versione ricorsiva è sempre inefficiente (come uso di memoria) perchè alloca su stack il frame di attivazione ad ogni chiamata.
Re: Problemi risolti (spero)...
Hai filtrato gli \n che sono nel file?
-- Comment added by
AndreaSterbini on 27 Nov 2003
ATTENZIONE a come aggiornate la pista
Ricordate di seguire questi passi per aggiornare la pista prima di stamparla:
- rimuovo i caratteri di tutte le macchinine (mettendo ' ' )
- sposto tutte le macchinine (e controllo chi muore)
- inserisco i caratteri di tutte le macchinine in gioco
Se invece fate i 3 passi (rimuovi/muovi/inserisci) una macchinina alla volta potrebbe succedere che:
- sposto la macchinina A nella posizione in cui è B (inserendo il carattere A)
- POI sposto la macchinina B cancellando il carattere A
Il risultato non è quello voluto e differisce dal mio funzionamento.
-- Comment added by
AndreaSterbini on 27 Nov 2003
Bene...che bello
Ecco, volevo solo sincerarmi di questo. Lei ora ha scritto
"Se l'input è da tastiera il programma si ferma quando tutti i carattri inseriti sono stati consumati. Per questo tu vedi 3 stampe per 30 input dati a 10 macchine. Quando inserisci altri caratteri il programma li riceve in input e continua i turni."
Ma perkè una cosa del genere nn è scritta nel testo del programma? Dall'output si capiscono 2 cose ke nn sono scritte nel testo.
1-I numeri inseriti sono sempre giusti, ovvero se ho 3 makkine inserisco 3 input..se ho una makkina inserisco 1 input (vedi 369...369...6...)
2-Ogni volta ke vengono messi degli input, il programma fa UNA SOLA stampa e poi riprende altri input. Se nn le facevo questa domanda prima, io nn avrei mai saputo ke mettendo 30 input per 10 makkine, il mio programma doveva fare 3 stampe prima di riprendere un altro input. Ed io ovviamente leggendo il testo e guardando gli esempi di output..non ho impostato il mio programma in questo modo.
In definitiva...6 giorni di lavoro x qualcosa come 320 righe di codice...ke tirando le somme nn servono a nulla (leggasi...nn passerà alcun test il mio programma). Che bello
-- Comment added by
DavidVulpetti on 28 Nov 2003
Coordinate e indici
Una curiosità: c'è un motivo in particolare percui le coordinate si riferiscono ad un punto 0,0 che coincide con l'angolo inferiore sinistro invece che con l'angolo superiore sinistro in modo da combaciare con l'indicizzazione array per la pista?
Ad ogni modo il posizionamento iniziale delle macchinette deve rispettare le coordinate con lo 0,0 a SW solamente all'inizio del gioco, poi si possono usare tranquillamente gli indici dell'array, giusto?
-- Comment added by
OliverTran on 28 Nov 2003
scanf + getchar
Visto che per prendere i primi 3 input (n° macchine e coordinate iniziali) ho usato una scanf, e per prendere i nomi delle macchine un getchar, ho dovuto in qualche modo eliminare l'invio dovuto alla scanf.
Volevo sapere se ciò è corretto, e che quindi venga premuto invio dopo l'input
oppure si può scrivere l'input anche così: 3 37 8ABC
P.s: scusa se la domanda forse è stata già fatta
-- Comment added by
LivioDellaCorte on 28 Nov 2003
Bene...che bello
Capisco dalle tue domande che non hai capito nulla di come funziona l'input di un programma.
Quello che ho scritto e' semplicemente cosa succede ad un qualsiasi programma che legge dell'input ... quando l'input non c'e' la prossima getchar (o scanf) si ferma ad aspettare che il sistema operativo gli dia altro input.
Se l'input viene da tastiera altro input arrivera' quando scrivi una riga e batti accapo,
se l'input viene da file altro input e' sempre disponibile fino alla fine del file (e a quel punto la getchar/scanf si ferma).
Ricapitolando: tu hai l'impressione di dover cambiare il programma e invece non devi.
Il problema non e' nel programma ma nella tua comprensione di come funziona l'input/output.
Passiamo agli altri commenti
- i caratteri nel file 100.in NON sono tutti giusti, infatti il file contiene righe di numeri (giusti) separate da accapo (da filtrare).
- per essere piu' precisi: ogni volta che il programma legge gli M caratteri delle M macchinine in gioco stampa la nuova situazione. Poi passa a leggere i seguenti. Se sono gia' disponibili li legge e fa un'altra stampa eccetera eccetera. NON C'E' DIFFERENZA, E' ESATTAMENTE LA STESSA COSAAAA!!!
Scusate lo strillo.
Re: Coordinate e indici
Cosi' quello che appare sullo schermo e' uguale a quello che scrivo nel file pista.h
Attento che visto che la y diminuisce per indici crescenti potresti dover rovesciare il segno dei delta[i][1].
Re: scanf + getchar
Io nei file metto un accapo dopo i tre numeri interi (suggerimento: filtrate cio' che non sono maiuscole).
-- Comment added by
AndreaSterbini on 28 Nov 2003
Dubbio aggiornamento pista
Per aggiornare la pista ogni volta ricarico in memoria variabile con strdup()
la pista vuota originaria contenuta in pista.h e poi faccio le modifiche.
Prescidendo dalla non particolare efficienza di questo metodo,
c'è qualche controindicazione nel chiamare ripetutamente strdup()?
Devo liberare con free() la memoria utilizzata dalla chiamata precedente
prima di fare la chiamata successiva?
-- Comment added by
EmanueleQuattrini on 28 Nov 2003
Re: Dubbio aggiornamento pista
Se non liberi le stringhe vecchie usi tantissima memoria (e il programma potrebbe fallire i test).
Usa free per deallocare le stringhe.
-- Comment added by
AndreaSterbini on 28 Nov 2003
ANSI
Lei x testare gli homework compila usando la modalita ANSI?
-- Comment added by
MarcoGrechi on 28 Nov 2003
Re: ANSI
No.
-- Comment added by
AndreaSterbini on 28 Nov 2003
accapo da filtrare
in una risposta lei dice: "i caratteri nel file 100.in NON sono tutti giusti, infatti il file contiene righe di numeri (giusti) separate da accapo (da filtrare)."... CHe significa che i caratteri non sono tutti giusti? Mi sembrano tutti interi compresi tra 1 e 9.... Che vuol dire "filtrare"gli accapo?
-- Comment added by
MarcoGrechi on 28 Nov 2003
Ricapitolando sull'input
Allora noi dobbiamo accettare come input per il nome della macchina solo maiuscole (ma non aveva detto che metteva input corretti?) ed escludere minuscole simboli e accapo. per l'input iniziale del programma nel file ci sarà:
numeroMacchine xIniziale yIniziale\n (accapo da scartare)
ABCDEFG\n (accapo da scartare)
successivamente si stampa la pista
se leggo un numero di mosse = a numeroMacchine stampo e leggo il nuovo input
se leggo un numero di mosse = a n*numeroMacchine stampo n volte e leggo il nuovo inputo
se leggo un numero di mosse = a numeroMacchne---+ x stampo una volta tengo gli x per il prossimo input e continuo a
leggere
E' esatto?
-- Comment added by
AlessioDiMauro on 28 Nov 2003
Velocità massima
Queste macchinette hanno una velocità massima (limite max di delta) oppure sono dotate di un motore nucleare con relativa iperguida (Star Wars rulez) e spingono più di un'astronave???
-- Comment added by
OliverTran on 28 Nov 2003
Error handling
Ah, dobbiamo gestire eventuali errori in input o si presuppone che l'input sia sempre corretto?
-- Comment added by
OliverTran on 28 Nov 2003
Re: accapo da filtrare
Rileggi l'esercizio, c'e' scritto di filtrare i caratteri diversi da 1-9 e 'q'.
Re: Ricapitolando sull'input
ma vi ho dato un esempio ... non basta?
Re: Velocità massima
La seconda che hai detto. (comunque, fatti due conti e ti accorgerai che per accelerare a ipervelocità ci vuole qualche milionata di caratteri di larghezza

)
Re: Error handling
Non gestite nessun errore (ma filtrate i caratteri non validi quando leggete i movimenti).
-- Comment added by
AndreaSterbini on 28 Nov 2003
Segmentation fault
Forse è già stata fatta la domanda, però non si sa mai. In questi giorni io ho provato il codice della f1 solo su win, perchè non potevo usare linux. Stasera mi sono rimesso a compilare sul caro vecchio amico linux(devo adularlo un po' visto che l'ho abbandonato per qualche dì) e, appena faccio partire il programma, questo mi va in segmentation fault mentre su win non succedeva nulla, almeno all'inizio. Qualche idea?
-- Comment added by
BeniaminoLarocca on 28 Nov 2003
Per la versione normale...
Correggimi se sbaglio.
1) Se per esempio la macchina M si spostasse di due caselle a destra (deltax = 2)
e la 2° casella fosse buona (cioè è = ' '), la prima casella a destra potrebbe essere anche un muro, ma la macchina non sbattebbe.
2) Stesso caso precedente, ma se prima casella a destra fosse il traguardo,
la macchina non vincerebbe. Se è così capisco a che servono le gomme "@"

P.s: interessante la possibilità di usare tag html.
-- Comment added by
LivioDellaCorte on 29 Nov 2003
Vediamo se ho capito
Bisogna copiare la pista nella memoria modificabile come avete fatto per pacman. Tuttavia con pacman il campo di gioco aveva dimensione fissa mentre per la F1 le piste hanno dimensioni diverse. Quindi è necessario creare un vettore dinamico ma non riesco a copiare therace in questo. Bisogna usare la calloc (che per quanto ho capito crea un vettore dinamico)o ci sono altri modi?
-- Comment added by
JacopoBusso on 29 Nov 2003
Re: Segmentation fault
Hai copiato le stringhe di therace in memoria modificabile?
(altrimenti usa l'opzione -fwritable-strings quando compili)
Re: Per la versione normale...
Esatto.
Re: Vediamo se ho capito
Devi allocare un vettore dinamico e poi copiare ciascuna stringa e inserirne l'indirizzo (della copia) nel vettore allocato.
-- Comment added by
AndreaSterbini on 29 Nov 2003
Errore di Compilazione
Errore:
knoppix@osiris:~$ gcc -g -o homework4 homework4.c
/usr/lib/gcc-lib/i386-linux/3.2.3/../../../crt1.o(.text---+0x18): In function `_start':
: undefined reference to `main'
/tmp/ccfo24F0.o(.text---+0x4bb): In function `main':
/home/knoppix/homework4.c:119: undefined reference to `print_race'
/tmp/ccfo24F0.o(.text---+0x525):/home/knoppix/homework4.c:126: undefined reference to `leggimossa'
collect2: ld returned 1 exit status
AIUTOOOOOOOO
-- Comment added by
EmanuelePaterna on 29 Nov 2003
Errore di Compilazione 2 (Il primo è risolto)
knoppix@osiris:~$ gcc -g -o homework4 homework4.c
/usr/lib/gcc-lib/i386-linux/3.2.3/../../../crt1.o(.text---+0x18): In function `_start':
: undefined reference to `main'
collect2: ld returned 1 exit status
-- Comment added by
EmanuelePaterna on 29 Nov 2003
Domanda sulla versione opzionale
Non sono sicuro di aver capito bene una cosa sulla versione opzionale del codice:
la macchina vince anche se passa su di un @ senza attraversare il traguardo oppure vince solo se passa il traguardo?
-- Comment added by
StefanoNoffke on 29 Nov 2003
Consegna?
per quando è stata fissata la consegna?
se è stata fissata...
-- Comment added by
CarloStefani on 29 Nov 2003
Diagonali
Da qualche parte vicino all'inizio di questa pagina ho letto "basta che i quadrati della diagonale siano consecutivi" o qlc del genere.
Questo esempio qui sotto mostra una retta in diagonale consecutiva dai due punti '@'?
##########XX@#
#######XXX####
####XXX#######
#@XX##########
-- Comment added by
OliverTran on 29 Nov 2003
Re: Errore di Compilazione 2 (Il primo è risolto)
Hai mica sbagliato a scrivere il nome della funzione 'main'?
Re: Domanda sulla versione opzionale
La macchina vince sia passando su '|' che su '@'.
Re: Consegna?
Lunedì 1° novembre alle 24.
Re: Diagonali
Il metodo che ho descritto per calcolare le diagonali esamina una successione di caselle con x (se deltax>deltay) crescente a incrementi di 1 e quindi si tratta di caselle vicine tra loro (o affiancate o con coordinata 1 che differisce di 1).
-- Comment added by
AndreaSterbini on 29 Nov 2003
Re: Diagonali
Vediamo un po':
- prendo il '@' in basso come origine
- le coordinate dell'altro '@' sono quindi (11,3)
- il coefficiente angolare m della retta y=mx che passa per l'origine e (11,3) è m=3/11
- le coordinare di ciascun punto sono:
x |
y |
1 |
3/11=0 |
2 |
6/11=0 |
3 |
9/11=0 |
4 |
12/11=1 |
5 |
15/11=1 |
6 |
18/11=1 |
7 |
21/11=1 |
8 |
24/11=2 |
9 |
27/11=2 |
10 |
30/11=2 |
11 |
33/11=3 |
Quindi dovrebbe essere
############@#
#########XXX##
#####XXXX#####
#@XXX#########
-- Comment added by
AndreaSterbini on 29 Nov 2003
Macchine sovrapposte.
Mi è venuto un dubbio prof..lei ha scritto, sul testo dell'esercizio:
- se più macchinine occupano la stessa posizione si mostri solo il carattere dell'ultima che sta in quella posizione.
Le spiego il perchè di questo dubbio.
Lancio il mio programma e metto due macchine in gioco, la prima la chiamo 'A' e la seconda 'B'.
Se ad un certo punto della corsa 'A' sta ferma, non si muove, e 'B' gli si ferma esattamente sopra..si vede 'B'. Se invece è 'B' a star ferma, ed 'A' gli si ferma sopra..si vede sempre 'B', perchè dal testo ho capito l'ultima del GRUPPO di macchine che ho inserito...oppure devo far vedere l'ultima che arriva? Spero di non doverci rimettere mano..
-- Comment added by
DaniloRossi on 29 Nov 2003
Re: Macchine sovrapposte.
Devi mostrare l'ultima tra tutte le macchine in gioco che sta a quelle coordinate.
In pratica se le disponi (solo quelle in gioco) nella matrice una per volta nell'ordine dalla prima all'ultima, si otterrà esattamente questo.
-- Comment added by
AndreaSterbini on 29 Nov 2003
Si, è esattamento quello che faccio: prima di stampare la situazione dispongo le N macchine rimaste in gioco dalla prima all'ultima sulla matrice (ovvero se metto 3 macchine ABC, dispongo prima A, poi B e poi C, nel caso siano ancora tutte in gioco)..quindi il comportamento che le ho scritto sopra è corretto.
Rileggendo ora il testo, "nell'ordine dalla prima all'ultima" avevo pensato che poteva essere interpretato anche come "nell'ordine di arrivo sulla casella".
Grazie mille
-- Comment added by
DaniloRossi on 29 Nov 2003
Errore di Compilazione
Non credo di aver sbagliato...
Ho scritto: int main () {
-- Comment added by
EmanuelePaterna on 29 Nov 2003
Re:Errore di Compilazione
Forse perche hai scritto leggimossa invece di leggiMossa
-- Comment added by
AlessioDiMauro on 29 Nov 2003
si quello si... me ne sono accorto...
però inizio a pensare ke il mio gcc si sia andato a farsi benedire...
Vi faccio un esempio
Questo è il codice ke cerco di compilare:
printf("START\n");
printf("Inserisci il numero di macchine: ");
Ecco quando lo eseguo mi stampa solo "START" e poi mi da Segmentation fault
Se eseguo il gdb mi dice ke trova degli errori con la strlen()... che io nn sto usando...
Qualcuno mi aiuti....
-- Comment added by
EmanuelePaterna on 29 Nov 2003
Errori risolti tranne uno
Io per prendere il numero di righe usate (in pratica quant'è alta la matrice) ho usato ALTEZZA=sizeof(therace);
però ho scoperto che cosi mi riporta 100, cioè la larghezza....
Quindi... come devo fare per avere l'altezza?
-- Comment added by
EmanuelePaterna on 29 Nov 2003
Re: per emanuele paterna
sizeof(therace) ti da la dimensione dell'array in questo senso: se fosse un array di int sarebbe la grandezza di un int per il numero degli elementi. In questo caso viene calcolata la grandezza di un puntatore a char (non di un char!), per il numero di elementi. Ovvero sizeof(therace) = sizeof(char*) * numeroElementi. Se dividi quindi per la grandezza di un puntatore a char (che poi è 4 se non sbaglio) ti trovi il numero degli elementi del vettore, ovvero il numero delle righe, per come è impostata la matrice.
-- Comment added by
DaniloRossi on 29 Nov 2003
Ancora su segmentation fault
prima errore non me lo dava, vabbe' cmq veniamo al sodo...credo che il punto in cui si blocchi sia: *maze = (char *)malloc(sizeof(char *)); dove ho: char **maze; Dove ho sbagliato?Salut
-- Comment added by
BeniaminoLarocca on 29 Nov 2003
3 domande
1) Nel mio programma ho messo:#include "pista.h"... Ma quando compilo ,utilizzando la matrice delta di pista.h nel main, mi dice : "subscripted value is neither array nor pointer",mentre leggimossa e la matrice therace non danno errori;
2)Fara in tempo a mettere un 100.out con il controllo delle diagonali?
3)La funzione leggimossa del file pista.h scarta gia gli accapo presenti nel file 100.in o dobbiamo fare noi un controllo su questo?
-- Comment added by
RiccardoManni on 29 Nov 2003
100.in: versione con o senza diagonale?
Visto che non avrò tempo per ultimare la versione con la diagonale,volevo sapere se l'esempio 100.in è con o senza diagonale. E' importante, perchè per il momento non mi viene come il 100.out
-- Comment added by
LivioDellaCorte on 29 Nov 2003
Ehi ma dov'è il link alla pagina di consegna?!?
-- Comment added by
LivioDellaCorte on 29 Nov 2003
Mi rispondo da solo. Il link è
questo
Re: Re: Diagonali
Scusi prof, mi sembra che la diagonale da lei tracciata sia più che altro una curva.
Ho tracciato una linea con Paint da @ a @ eppure quest'ultima lascia alcune X scoperte:
Per questo caso la retta non dovrebbe essere tipo questa?
##########XX@#
#######XXX####
####XXX#######
#@XX##########
Ad ogni modo, non mi importa quale metodo seguire, l'importante è che passi i test.
Quindi, mi conferma che gli input che immetterà nei test prevedono l'uso del suo algoritmo di calcolo della diagonale?
Grazie
-- Comment added by
OliverTran on 29 Nov 2003
Domanda
Scusi prof...ma una domanda mi sorge spontanea?
Ma ha senso che lei ci sta spiegando le liste quando con Silvestri non le abbiamo ancora fatte, ma stiamo facendo ancora i file? lei i file non li fa?
-- Comment added by
SimoneSabbatini on 30 Nov 2003
Ancora sul vettore dinamico
Sono inscritto al primo canale anche se il prof ci ha detto che non era necessario fare questo prog io volevo farlo lo stesso. Potrei sapere più precisamente lei cosa intende con "vettore dinamico" non avendo avuto spiegazione a lezione. Credo si faccia con la calloc ma non riesco a copiare gli indirizzi nel vettore. Per il resto l'esercizio l'ho fatto, mi manca solo questo passaggio (invece di una struttura dinamica ho usato un vettore statico con gli indirizzi). Se si usa la calloc ho iserito tra i parametri della funzione il numero delle righe e la dimensione di una riga ma poi con la strdup mi inserisce caratteri sballati nel vettore. Che faccio? non c'è un altro modo per allocare un vettore dinamico?
-- Comment added by
JacopoBusso on 30 Nov 2003
Diagonale
Per la discesa è cosi?
#@XXX#########
#####XXXX#####
#########XXX##
############@#
Oppure è cosi?
#@############
##XXX#########
#####XXXX#####
#########XXX@#
-- Comment added by
EmanuelePaterna on 30 Nov 2003
Si era detto che quest'anno gli homework fossero più "abbordabili" ma a me non sembra affatto, poichè come nel caso della Formula1 il problema è molto ma molto difficile... Vorrei giusto capirci qualcosa... Tnx!
-- Comment added by
CesareDelVecchio on 30 Nov 2003
Setvbuf
Per quanto ho capito la setvbuf consente di prelevare i caratteri mano mano senza necessitare di return, ma non ho capito bene i parametri che la funzione necessita perchè il libro non si capisce bene. Cosa devo metterci? Una volta attivata è sufficente usare getchar per prelevare gli input?
-- Comment added by
JacopoBusso on 30 Nov 2003
Re: Ancora su segmentation fault
togli l'asterisco da davanti a maze=!
L'asterisco dereferenzia la variabile, che però contiene monnezza, per cui stai cercando di scrivere in una locazione "ad capocchiam" il valore tornato da malloc.
Re: Ancora sul vettore dinamico
Non ho capito se ti riferisci alle stringhe della pista o al vettore di macchine.
- nel primo caso puoi usare l'opzione -fwritable-strings in compilazione e scrivere in therace
- nel secondo devi allocare un vettore di N elementi chiascuno grande come una macchinina, per sapere quanto è grande la struct che hai definito per le macchinine usa sizeof
Re: 3 domande
- a me non lo da
- non faccio in tempo
- rileggi leggiMossa
Re: Diagonale
*NOTA* ho cambiato questa risposta perchè questo è il comportamento della divisione intera
Arrotondate il calcolo verso lo zero (che poi è quello che fa la divisione intera).
Direi che debba essere (facendo i conti con origine nella '@' in alto a SX):
x |
y |
1 |
-3/11=0 |
2 |
-6/11=0 |
3 |
-9/11=0 |
4 |
-12/11=-1 |
5 |
-15/11=-1 |
6 |
-18/11=-1 |
7 |
-21/11=-1 |
8 |
-24/11=-2 |
9 |
-27/11=-2 |
10 |
-30/11=-2 |
11 |
-33/11=-3 |
ovvero
#@XXX#########
#####XXXX#####
#########XXX##
############@#
Re: abbordabili?
Cominciano ad essere difficilotti perchè le strutture dati allocate dinamicamente sono difficili in se'.
Re: Domanda
Che problema c'e'? Tanto devi sapere entrambi. Farò un esercizio sui file.
Re: 100.in: versione con o senza diagonale?
Senza diagonale.
Re: Setvbuf
lascia stare setvbuf
-- Comment added by
AndreaSterbini on 30 Nov 2003
calloc, malloc, strdup
Prof, invece di allocare spazio con la malloc, è possibile utilizzare la calloc? In questo modo creo un vettore dinamico, e sinceramente mi trovo meglio con questa funzione (anche perché è l'unica che conosco "abbastanza" bene visto che prima dell'università ho programmato praticamente sempre e solo in C---++).
E un'altra cosa: perché utilizzare la strdup e non intervenire direttamente su therace? Si tratta semplicemente di non "sporcare" il percorso originale? Questo perché a me è parso possibile intervenire direttamente su therace (che non è const, quindi è modificabile). So che questa è stata una domanda un po' stupida (mi rendo conto che è conveniente usare la strdup), ma avevo implementato il programma senza l'uso della strdup.
Chiedo scusa se queste domande sono già state postate, ma purtroppo ho iniziato solo ieri a programmare perché il maltempo mi ha portato via la connessione (che mi è stata ripristinata solo oggi)
-- Comment added by
DanieleBernardi on 30 Nov 2003
Getch()
La getch() dovrebbe essere non bufferizzata quindi visto che lei non fa controlli sull'eco dei tasti posso usare quella senza complicarmi la vita col setvbuf?
-- Comment added by
JacopoBusso on 30 Nov 2003
Diagonale
Ma -3/11 fa -0.qualcosa...
Quindi se la faccio tra interi mi ritorna 0, non -1
Professore come si fa?
-- Comment added by
EmanuelePaterna on 30 Nov 2003
Re: calloc, malloc, strdup
Usa pure la calloc, fa le stesse cose della malloc e in più azzera la memoria allocata.
Non puoi modificare therace (perchè è fatta da costanti) a meno che non usi in compilazione la'opzione
-fwritable-strings. Altrimenti devi copiarla.
Re: Getch()
Non c'e' nessun problema di bufferizzazione (infatti non vi ho chiesto la setvbuf).
Re: Diagonale
In effetti ho provato a eseguire le divisioni intere con numeri negativi e in quel caso vengono arrotondate verso l'alto (verso lo zero).
Quindi (visto che va bene il risultato della divisione intera:
- i risultati vanno arrotondati verso lo zero
Spero che questo non crei fin troppi casini
NOTA: ho aggiornato la risposta precedente
-- Comment added by
AndreaSterbini on 30 Nov 2003
OFF TOPIC - Sciopero
Domani c'è lezione? Si o No? Grazie
-- Comment added by
MatteoLaBella on 30 Nov 2003
Errori di memoria: non capisco proprio
Il programma è completo (mi pare, sono stato velocissimo!) ma quando deve uscire pare che non riesca a liberarmi la memoria e va in crash. Ho provato anche ad usare free() ma niente; ho usato anche exit(0) al posto di return 0, ma ancora niente. L'unica soluzione è di lasciare tutto com'è oppure usare abort (che è la stessa cosa). Perché tutto questo? Ho dimenticato qualcosa? E succede solo quando premo 'q' oppure anche l'ultima macchinina va a sbattere.
E' stranissimo. Inoltre, quando premo Control-C per interrompere il programma, mi dice (uso XP ma non giudicatemi male, sono un fan Mac da tempi non sospetti) che ho fatto riferimento a una posizione di memoria che non potevo leggere, la 0x23232323 se può essere utile. E, ripeto, ogni volta che il programma dovrebbe terminare normalmente invece va in palla. Non faccio strani riferimenti di memoria (almeno credo :P) e per questo proprio non riesco a capire cosa capiti al mio programma. Como se spieca? :P
Come nel mio precedente post, mi scuso se ci sono post simili ma a causa di problemi con la connessione non ho avuto (e tuttora non ho) tempo per scorrermeli tutti.
-- Comment added by
DanieleBernardi on 01 Dec 2003
Ancora sull'input
Ho risolto i problemi sul vettore, l'unico dubbio che mi è rimasto è sull'output che ancora non capisco....
credo di aver capito:
prelevo N (numero auto) INVIO
prelevo X (coordinata) INVIO
prelevo Y (coordinata) INVIO
prelevo in successione tutte le direzioni delle auto una di seguito all'altra senza premere INVIO fino a che non termina il prog per una condizione.
E' giusto così? Altrimenti potrebbe spiegarmi?
-- Comment added by
JacopoBusso on 01 Dec 2003
Domanda banale...
...però non so come si fa...argh!!!Come faccio a lanciare, sotto linux con gcc, il programma assegnandoli il 100.in?
-- Comment added by
BeniaminoLarocca on 01 Dec 2003
E poi, non va la getchar
O meglio, va, ma alla fine dell'input devo per forza premere Invio se no niente. Ed anche in questo caso non so che pesci prendere.
-- Comment added by
DanieleBernardi on 01 Dec 2003
delta di pista.h
Ho incluso "pista.h"... leggimossa e la pista le prende correttamente, ma quando vado a compilare nelle righe in cui richiamo il delta del pista.h mi dice:"subscripted value is neither array nor pointer"... Da che dipende? se nel codice aggiungo un array delta2 identico a delta di pista.h passo i test?
-- Comment added by
MarcoGrechi on 01 Dec 2003
Re: Domanda banale
Una volta compilato il file col gcc, lancia il programma seguendo questa sintassi (era scritto nel testo del programma):
./nomeprogramma < 100.in
Se vuoi anche che l'output finisca in un file, scrivi:
./nomeprogramma < 100.in > 100.out
-- Comment added by
DanieleBernardi on 01 Dec 2003
Non c'entra molto con Formula1: il libro di Tronci
Scusate se faccio questa domanda che non c'entra con l'homework (ma su questa pagina dovreste leggerla), ma mi chiedevo se qualcuno sa che libri usa Tronci. Il nostro Deitel&Deitel non gliel'ho mai visto usare, piuttosto usa "linguaggio C"(Kernighan - Ritchie) ed un altro di cui non so il nome e che invece vorrei sapere se qualcuno di voi lo sa. Grazie!
-- Comment added by
CleoniceMansillo on 01 Dec 2003
Re: E poi, non va la getchar
Non avevo letto attentamente le note dell'esercizio, quindi il fatto che occorra premere Invio è ininfluente. Rimangono questi problemi di memoria
-- Comment added by
DanieleBernardi on 01 Dec 2003
Dimensioni della matrice
Volevo sapere come fare il controllo se si esce dalla matrice di stringhe so che è una cavolata ma come un fesso mi sono scordata di farla adesso e non riesco a trovare un punto logico dove farlo.
IL controllo lo devo fare sulla x e la y separate o direttamente sull'array ?
Se mi dite come fare.
-- Comment added by
DarioFiorenza on 01 Dec 2003
Re: Errori di memoria: non capisco proprio
Hai provato a usare il debugger per capire dove esplode?
Re: Ancora sull'input
Guarda l'esempio nel testo dell'esercizio e il file 100.in.
Re: delta di pista.h
A me con gcc compila correttamente. (che usi per compilare? gcc? Devc---++?)
Re: Dimensioni della matrice
All'inizio e ogni volta che sposti una macchina controlli che sia la x che la y siano positive e minori del numero di colonne (e righe).
-- Comment added by
AndreaSterbini on 01 Dec 2003
Ha vinto lui
Prof, ci rinuncio, il problema dell'errore me lo da ancora. C'è un segmentation fault, sì, ma ho debuggato (brutto termine, lo so) finora e niente, questo maledetto segmentation fault esce fuori alla fine... Sì, alla fine, quando il debugger mi segnala l'ultima parentesi graffa del main. Allora credo che il problema sia il mio sistema, non riesco a trovare altra spiegazione. Dopo un return 0 e una parentesi graffa...
Prof, nel caso non compili può dare un'occhiata al mio sorgente ed eventualmente segnalarmi qual è il problema? Non riesco a capacitarmene proprio.
-- Comment added by
DanieleBernardi on 01 Dec 2003
Consegna
la consegna è tra 2 ore? e dove stava scritto? come mai non sta da nessuna parte? l'ho dovuto chiedere io.....
io credevo che...visto che non era ancora stato riportato da nessuna parte c'erano ancora 2 o 3 giorni...e invece....bè in due ore non riuscirò sicuramente a finire.
o magari voi l'avete trovato?
Ovviamente sarà stato detto in aula, ma visto che io non frequento non lo potevo sapere.
grazie
-- Comment added by
CarloStefani on 01 Dec 2003
pagina consegna?
non la vedo...dov'è?
-- Comment added by
BeniaminoLarocca on 01 Dec 2003
Pagina consegna
http://twiki.dsi.uniroma1.it/~andrea/consegna.html
cmq il link sta nella prima pagina di prog1 su twiki
-- Comment added by
EmanueleQuattrini on 01 Dec 2003
Errore:
Scusate sapete mica perche quando faccio:
"LISTA temp;
temp=malloc(sizeof(listaNode));"
Mi da questo tipo di errore:
"ANSI C---++ forbids implicit conversion from `void *' in assignment"?
-- Comment added by
DaniloDauria on 02 Dec 2003
Re:Consegna
Guarda che sta scritto nella webhome dove c'e' "Date e scadenze"
-- Comment added by
CleoniceMansillo on 02 Dec 2003
Pero' e' anche vero che non era scritto nella pagina in cui e' descritto l'homework
-- Comment added by
CleoniceMansillo on 02 Dec 2003
Re:Consegna
me ne sono accorto solo dopo dov'era la pagina; però, in effetti, le altre volte c'era anche un link direttamente dalla pagina dell'esercizio.
-- Comment added by
BeniaminoLarocca on 02 Dec 2003
Re: Consegna
Pe un errore di battitura il frammento del testo dell'esercizio che indicava quando e dove consegnare non veniva visualizzato.
La
pagina di consegna
però lo diceva ben chiaro da sempre.
(ora l'ho aggiornata per l'esercizio 5)
-- Comment added by
AndreaSterbini on 02 Dec 2003
Ci rinuncio!
Non riesco ad implementare la corsa per più di una macchina. Prof. potrebbe fare anche qualche test con una sola macchina in gara (mi sono un po impicciato con i passaggi da una struct a quella successiva).
Almeno così forse ho qualche possibilità di passare qualche test.
grazie!
-- Comment added by
PaoloCanaletti on 03 Dec 2003
Correzione
Quando esce la correzione dell'esercizio?
-- Comment added by
PaoloCanaletti on 09 Dec 2003
Re: Correzione
Quando è pronta (questo finesettimana mi sono fatto i c***i miei e non sono stato a casa).
-- Comment added by
AndreaSterbini on 10 Dec 2003
Sulla correzione
Professore potrebbe controllare gli esercizi che non compilano facendo una lista di come sarebbero potuti andare come qualche esercizio fa?
Oppure data la difficoltà del test di questo esercizio non può farlo?
-- Comment added by
JacopoBusso on 15 Dec 2003
Re: Sulla correzione
Questa settimana non ci riesco.
Se posso lo faccio durante le vacanze di Natale (ma non ve lo prometto)
-- Comment added by
AndreaSterbini on 15 Dec 2003
No such template def TMPL:DEF{PROMPT:before}
- Ricordatevi di dare un titolo alla vostra domanda come segue:
<tre spazi>---+++<spazio>Titolo della domanda "non dovete mettere <>"
Testo della domanda