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

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 smile Boh a me la prima domanda ke sorge spontanea è...che è un record? smile 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 smile

-- Comment added by DavidVulpetti on 18 Nov 2003


Re: record

record = struct

-- Comment added by AndreaSterbini on 18 Nov 2003


ah ok thx smile

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

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

-- Comment added by AndreaSterbini on 19 Nov 2003


Tutto apposto

Adesso funziona Grazie smile

P.S. Che è strdup?

-- Comment added by DaniloDauria on 19 Nov 2003


Codice Pacman

Nn è il titolo di un film smile 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 smile . Basta mezz'ora? smile .

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

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

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

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


NumeroGiocatori

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

-- 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 smile 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 smile . 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ì frown a smile

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

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

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

-- 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? smile

Usate quello che vi pare (strdup = malloc---+ strcpy)

Sicurezza? guarda che siamo a Prog 1! smile (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 smile 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... smile

-- 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? wink (e poi il PalmOS è un ottimo os... smile )

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

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

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

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! smile

-- 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... frown 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? smile

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

-- 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? smile

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

  1. dx e dx partono da 0
  2. nessun messaggio quando una macchina sbatte (l'ho tolto)
  3. se una macchina sbatte al prossimo turno si legge un input (1-9 e q) di meno

Re: Dimensioni e Posizioni

  1. le dimensioni saranno variabili
  2. 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
  3. 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? smile

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
7   9
     
1   3
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 smile

-- 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? frown

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

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

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

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 smile .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!!! big grin 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... smile

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 smile

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

-- 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 smile ) 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 smile

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

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

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

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

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 smile

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

  1. i caratteri nel file 100.in NON sono tutti giusti, infatti il file contiene righe di numeri (giusti) separate da accapo (da filtrare).
  2. 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??? big grin

-- 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 smile )

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 "@" smile

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 smile

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

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

  1. a me non lo da
  2. non faccio in tempo
  3. 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):

xSorted ascending 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) frown

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

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 frown

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

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

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}

<tre spazi>---+++<spazio>Titolo della domanda   "non dovete mettere <>" 
Testo della domanda


This topic: Programmazione1/AA0506/PZ > 
HomeWork4 > DomandeHomework4
Topic revision: r246 - 2003-12-15 - AndreaSterbini
 
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2024 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback