 | |
Il progetto dsy.it è l'unofficial support site dei corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto del nostro forum |
e C (salute!) Clicca QUI per vedere il messaggio nel forum |
AlphaGamma |
Sto cercando di capire questo cavolo di C per l'esame di algoritmi.
Ho provato a fare un esercizio di mescolamento mazzi che c'e' sul Deitel&Deitel, ma mi da un errore -1 in fase di esecuzione, e non so proprio cosa ho sbagliato nel programma. Sicuro che qua ci siano persone che sanno programmare in C, vi pongo il listato.
C'e' qualcuno che mi puo' aiutare a capire dove sta l'inghippo?
Io lo so che ho sbagliato qualcosa sui puntatori, ma non so cosa!!!! :(
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void mescola (int [][13], const char *[], const char *[]);
int main()
{
char *semi[4]= {"quadri", "cuori", "fiori", "picche"};
char *numeri[13] = {"asso", "due", "tre", "quattro", "cinque", "sei", "sette", "otto", "nove", "dieci", "fante", "donna", "re"};
int mazzo[4][13]={0};
srand (time(NULL));
mescola (mazzo, semi, numeri);
return 0;
}
void mescola (int mazzo [][13], const char *s[], const char *n[])
{
int i, j, seme, numero;
void swap (int *, int *);
printf ("Sto mescolando il mazzo\n");
for (i=1; i<=52; i++) {
mazzo[(i-1)/13][(i-1)%13] = i;
};
for (j=1; j<=4; j++) {
for (i=1; i<=52; i++) {
int valore;
valore = rand () % 52;
swap (&mazzo[(i-1)/13][(i-1)%13], &mazzo[(valore)/13][(valore)%13]);
};
};
printf ("%8s di %-7s%c", n[numero], s[seme], i % 3 == 0 ? '\n' : '\t');
};
void swap (int *a, int *b)
{
int c;
c = *a;
*a = *b;
*b = c;
};
/* rutt */
Grazie!!!! |
Fatur |
Il gdb ti potrebbe essere utile... cmq appena vado su linux provo... |
AlphaGamma |
Sto usando lcc per windows. Compila ansi c. |
Fatur |
Allora usa il suo debug! E' abbastanza facile ed efficente(un po' meno la videoscrittura). |
Fatur |
Originally posted by AlphaGamma
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void mescola (int [][13], const char *[], const char *[]);
int main()
{
char *semi[4]= {"quadri", "cuori", "fiori", "picche"};
char *numeri[13] = {"asso", "due", "tre", "quattro", "cinque", "sei", "sette", "otto", "nove", "dieci", "fante", "donna", "re"};
int mazzo[4][13]={0};
srand (time(NULL));
mescola (mazzo, semi, numeri);
return 0;
}
void mescola (int mazzo [][13], const char *s[], const char *n[])
{
int i, j, seme, numero;
void swap (int *, int *);
printf ("Sto mescolando il mazzo\n");
for (i=1; i<=52; i++) {
mazzo[(i-1)/13][(i-1)%13] = i;
};
for (j=1; j<=4; j++) {
for (i=1; i<=52; i++) {
int valore;
valore = rand () % 52;
swap (&mazzo[(i-1)/13][(i-1)%13], &mazzo[(valore)/13][(valore)%13]);
};
};
printf ("%8s di %-7s%c", n[numero], s[seme], i % 3 == 0 ? '\n' : '\t');
};
void swap (int *a, int *b)
{
int c;
c = *a;
*a = *b;
*b = c;
};
/* rutt */
questo è il primo errore che ho visto. hai ridichiarato la funzione invece di usarla. |
lorenzo |
Originally posted by AlphaGamma
printf ("%8s di %-7s%c", n[numero], s[seme], i % 3 ==
Sostituisci i e j a numero e seme. |
lorenzo |
Originally posted by Fatur
questo è il primo errore che ho visto. hai ridichiarato la funzione invece di usarla.
No, non è un errore.
Io però l'avrei dichiarata fuori lo stesso. |
Fatur |
Originally posted by lorenzo
No, non è un errore.
Io però l'avrei dichiarata fuori lo stesso.
non è un errore?? boh.. però così non ho mai visto fare... |
Autovelox |
Originally posted by AlphaGamma
[...]
void mescola (int mazzo [][13], const char *s[], const char *n[])
{
int i, j, seme, numero;
void swap (int *, int *);
[...]
Qui usi la funzione swap senza averla dichiarata prima. Secondo me è un errore.
Originally posted by AlphaGamma
[...]
void swap (int *a, int *b)
{
int c;
c = *a;
*a = *b;
*b = c;
};
/* rutt */
Grazie!!!!
I due parametri della funzione sono puntatori ad int. Te per invertirli usi una variabile d'appoggio, ma tale variabile deve essere puntetore ad int e non variabile int. Quindi dovrebbe essere cosi:
void swap (int *a, int *b)
{
int *c;
c = a;
a = b;
b = c;
};
O almeno cosi avrei fatto io! |
AlphaGamma |
Originally posted by Fatur
questo è il primo errore che ho visto. hai ridichiarato la funzione invece di usarla.
Quello era il prototipo. Sul libro c'e' scritto che lo puoi dichiarare locale (a me strippano queste storie!). |
AlphaGamma |
Originally posted by lorenzo
Sostituisci i e j a numero e seme.
Perche'? |
AlphaGamma |
Originally posted by Autovelox
Qui usi la funzione swap senza averla dichiarata prima. Secondo me è un errore.
I due parametri della funzione sono puntatori ad int. Te per invertirli usi una variabile d'appoggio, ma tale variabile deve essere puntetore ad int e non variabile int. Quindi dovrebbe essere cosi:
void swap (int *a, int *b)
{
int *c;
c = a;
a = b;
b = c;
};
O almeno cosi avrei fatto io!
No, non e' un errore: quello e' il prototipo. Si usa per utilizzare una funzione PRIMA di averla dichiarata. L'ho messo dentro per vedere se compilava come diceva il libro.
Anche sulla variabile di appoggio ti sbagli, per quanto poco conosca il C. Come l'hai scritta tu, scambi i puntatori anziche' i valori.
Prova a scriverla con questa definizione:
void swap (int *a const, int *b const);
... ed il compilatore ti da errore. |
Sephirot |
Alpha quando hai intenzione di dare l'esame? devi fare lo scritto o solo il progetto? |
AlphaGamma |
Devo fare il progetto e l'orale (sono con Torelli). |
lorenzo |
code: printf ("%8s di %-7s%c", n[numero], s[seme], i % 3 == 0 ? '\n' : '\t');
Scusa, prima non mi sono spiegato bene.
Qui tu usi le variabili numero e seme come indice di vettore senza averle inizializzate prima. Quindi non hanno alcun valore sensato, e il programma ti va a cercare delle posizioni del vettore che non esistono!!
Leggendo il codice ho supposto che tali variabili debbano essere sostituite da di i (che puo' assumere valori da 1 a 13, quindi il numero della carta) e j (che va da 1 a 4, come i semi).
Inoltre tale istruzione deve esser inserita all'interno del primo ciclo for (quello con indice j), altrimenti non avrebbe senso.
Ti consiglio anche di modificare i cilci for in questo modo:
code:
for (j=0; j<4; j++)
e
for (i=0; i<52; i++)
e usare semplicemente "i" al posto di "i-1" all'interno dei cicli.
Per ulteriori delucidazioni chidi pure di persona, che forse facciamo prima. |
lorenzo |
Per quanto riguarda la il prototipo di swap (ragazzi, ma non sapete distinguere una chiamata da un prototipo!?!) è perfettamente legale, anche se in questo caso era piuttosto inutile (ma comunque logico) dichiararlo localmente. |
nous |
Originally posted by lorenzo
Per quanto riguarda la il prototipo di swap (ragazzi, ma non sapete distinguere una chiamata da un prototipo!?!) è perfettamente legale, anche se in questo caso era piuttosto inutile (ma comunque logico) dichiararlo localmente.
Ti adoro quando sei preso dal sacro fuoco della programmazione :D:D:D
Cmq...Alpha,secondo me conviene che chiedi dal vivo,a correggere il codice così non si risolve il problema alla radice.
Mi spiego meglio : se parlando ci si accorge che magari i puntatori non ti sono simpatici,si cerca di renderteli simpatici invece di limitarsi a correggere il codice e basta.
Lorenzo in queste cose è un grande,appoggiati a lui senza timore alcuno. |
lorenzo |
Difenderò il C e i puntatori fino alla fine dei miei giorni. |
AlphaGamma |
Originally posted by lorenzo
code: printf ("%8s di %-7s%c", n[numero], s[seme], i % 3 == 0 ? '\n' : '\t');
Scusa, prima non mi sono spiegato bene.
Qui tu usi le variabili numero e seme come indice di vettore senza averle inizializzate prima. Quindi non hanno alcun valore sensato, e il programma ti va a cercare delle posizioni del vettore che non esistono!!
Leggendo il codice ho supposto che tali variabili debbano essere sostituite da di i (che puo' assumere valori da 1 a 13, quindi il numero della carta) e j (che va da 1 a 4, come i semi).
Inoltre tale istruzione deve esser inserita all'interno del primo ciclo for (quello con indice j), altrimenti non avrebbe senso.
Ti consiglio anche di modificare i cilci for in questo modo:
code:
for (j=0; j<4; j++)
e
for (i=0; i<52; i++)
e usare semplicemente "i" al posto di "i-1" all'interno dei cicli.
Per ulteriori delucidazioni chidi pure di persona, che forse facciamo prima.
Debuggando stamattina con te Lorenzo, ho capito finalmente dove stava l'errore. Semplicemente seme e numero erano state dichiarate, ma non definite. Avevo "dimenticato" un ciclo for che stampava i risultati. Ora modificando soltanto la riga che dici tu, tutto funziona perfettamente.
Per quanto riguarda l'obiezione che dici tu sui cicli for, condivido il tuo ragionamento, e senza dubbio faro' cosi'. Era solo per fare un esercizio di bella scrittura. :D
Per quanto riguarda invece il prototipo all'interno della funzione, credo che in questo modo si rispetti il principio del minimo privilegio. Solo mescola usa swap, quindi swap va dichiarato solo sotto mescola. E' la stessa storia delle variabili globali. |
Autovelox |
Allora complimenti a Lorenzo! |
|
|
|
|