-
WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infinito)
per testare un programma che ho scritto, che dovrebbe implementare la struttura dati "albero di decisioni" in C (in C++ era più facile ma mi piace farmi male) ho messo nel main un codicillo che dovrebbe, ad apprendimento completato, stampare l'uscita dell'albero per gli ingressi che gli do io.
Succede che l'uscita vale 0 per ogni scelta degli ingressi.
Ma se mi faccio stampare l'albero vedo che a volte dovrebbe essere 0, a volte 1.
Vedo per quale combinazione degli ingressi dovrebbe valere 1, ma niente.
Controllo che segua i rami giusti dell'albero a seconda dell'ingresso: lo fa.
Ma l'uscita è sbagliata.
Disperato, vado nella routine che dovrebbe ricavare l'output dell'albero in funzione dell'input e, NELLA routine, mi faccio stampare l'output.
E questo è giusto :|
:stress:
In pratica, sono nella seguente condizione (semplifico)
main(){
robba
printf("%lf",calcolaOutput(parametri));
}
double calcolaOutput(parametri){
robba
return OutputNodoGiusto(parametri);
}
double OutputNodoGiusto(parametri){
robba
printf ("%lf",Output);
return Output;
}
Dovrebbe stampare due volte la stessa cosa, no?
No.
:stress:
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
devi fare x alla meno milllllllllllllllle (cit.)
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
Non è che passi per copia e non per reference?
Per quello che ricordo di quella merda, se devi passare una struttura non passi lei ma il puntatore alla struttura.
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
Citazione:
Originariamente Scritto da
squallwii
Non è che passi per copia e non per reference?
Per quello che ricordo di quella merda, se devi passare una struttura non passi lei ma il puntatore alla struttura.
grossomodo esto
è un problema di variabile / riferimento a
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
no, i parametri son tutti puntatori, punto uno.
punto due, se passassi roba sbagliata, mi farebbe il calcolo sbagliato anche nella routine no?
invece nella routine stampa una roba giusta. E poi è una sfilza di "return valore"
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
Citazione:
Originariamente Scritto da
Lux !
:rotfl:
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
Citazione:
Originariamente Scritto da
Zhuge
:rotfl:
ma COSA ridi pe' sto OLDUME
AIUTAMI invece CAZZUOH
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
Dilbert mi fa sempre riderissimo. :tsk:
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
Citazione:
Originariamente Scritto da
Skywolf
no, i parametri son tutti puntatori, punto uno.
punto due, se passassi roba sbagliata, mi farebbe il calcolo sbagliato anche nella routine no?
invece nella routine stampa una roba giusta. E poi è una sfilza di "return valore"
E allora niente, a sto punto debug e vedi subito il problema.
Raccontato così sembra un problema di puntatori, se già li usi correttamente o metti il codice o usi debug e capisci subito quantomeno il livello dove tutto si perde
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
ma perché sembra un problema di puntatori? :uhm:
routine A dice: printeffami STOCAZZO(WHATEVVAH)
routine STOCAZZO dice: ok, ti ritorno il valore di STACEPPA
routine STACEPPA dice: ecco qua, ti ritorno il valore FOTTESEGA
sono tutte dello stesso tipo, cioè potrei capire avessi definito una routine come double o int e l'altra come char, bool, allora magari fa casino nel cast di tipo.
Ma routine A vuol stampare un double e chiama una routine double che chiama una routine double che ritorna un double. Tutto double.
PORCOZZIO!!!
- - - Aggiornato - - -
Ho appena aggiunto una stampa dell'output anche nella routine intermedia (STOCAZZO) oltre che nella finale (STACEPPA), e il valore è lo stesso identico medesimo
:stress:
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
Sembra di puntatori perché se main passa una qualche cosa sotto, e la passa per copia, allora ciò che sta sotto mette gli 1 dove vuole, stampa gli 1, finisce e main non vede una sega di tutto ciò.
Il che ovviamente è solo un'idea perché senza codice davanti, se uno mi dice che una funzione fa x, e sopra di sé nessuno vede nulla, io penso alle reference. Poi magari il problema è totalmente altrove.
E vedendo il tuo ultimo edit sembra essere altro nella funzione intermedia.
Cmq il discorso puntatori non riguarda il cast errato da double a int
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
sì ma io sto PRINTEFFANDO il RETURN VALUE delle funzioni.
Fottesega se gli ho passato puntatori o valori no?
La penultima riga di ogni funzione è OUT = qualcosa; (lo era: adesso, dopo questa istruzione ho aggiunto il printf)
l'ultima riga è return OUT;
e quello che fa il main è printeffare il valore di ritorno della funzione, precisamente così:
printf("\n Output = %lf ",calculateOutput(&model, xx, 2));
cosa c'entrano i puntatori?
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
Nulla, se ritorni allora nulla
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
Citazione:
Originariamente Scritto da
Skywolf
per testare un programma che ho scritto, che dovrebbe implementare la struttura dati "albero di decisioni" in C (in C++ era più facile ma mi piace farmi male) ho messo nel main un codicillo che dovrebbe, ad apprendimento completato, stampare l'uscita dell'albero per gli ingressi che gli do io.
Succede che l'uscita vale 0 per ogni scelta degli ingressi.
Ma se mi faccio stampare l'albero vedo che a volte dovrebbe essere 0, a volte 1.
Vedo per quale combinazione degli ingressi dovrebbe valere 1, ma niente.
Controllo che segua i rami giusti dell'albero a seconda dell'ingresso: lo fa.
Ma l'uscita è sbagliata.
Disperato, vado nella routine che dovrebbe ricavare l'output dell'albero in funzione dell'input e, NELLA routine, mi faccio stampare l'output.
E questo è giusto :|
:stress:
In pratica, sono nella seguente condizione (semplifico)
main(){
robba
printf("%lf",calcolaOutput(parametri));
}
double calcolaOutput(parametri){
robba
return OutputNodoGiusto(parametri);
}
double OutputNodoGiusto(parametri){
robba
printf ("%lf",Output);
return Output;
}
Dovrebbe stampare due volte la stessa cosa, no?
No.
:stress:
Dacci il codice con l'esatta firma delle funzioni e la loro chiamata e la dichiarazione dei parametri che passi.
Per capirci:
Codice:
int foo ( int pippo, double* pluto );
{
int cippa = ...
/* robba; */
retrurn cippa
}
void main ( void )
{
int param1;
int risultato;
double param2;
risultato = foo( param1, ¶m2 );
}
Also, c'e' una forward declaration delle funzioni prima del main? Nell'ordine in cui le hai messe in C quel codice manco compila, o se compila potrebbe generare delle chiamate con firma scazzata.
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
Questa è la punizione per usare il C :sisi:
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
sono sul cell e non ho tempo e voglia di leggere tutto approfonditamente.
ma la tua disperazione mi ricorda un episodio che mi successe tempo fa:
non sarà qualche double che fa strani scherzi?
mi ricordo che un valore che avrebbe dovuto essere 3.0 in realtà era 3.0000000000001 con tutti i casini del caso.
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
Citazione:
Originariamente Scritto da
pasquaz
sono sul cell e non ho tempo e voglia di leggere tutto approfonditamente.
ma la tua disperazione mi ricorda un episodio che mi successe tempo fa:
non sarà qualche double che fa strani scherzi?
mi ricordo che un valore che avrebbe dovuto essere 3.0 in realtà era 3.0000000000001 con tutti i casini del caso.
I casini del caso erano dovuti all'uso del == nei confronti? :asd:
Inviato dal mio iPad utilizzando Tapatalk Pro
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
Adesso non stampo più la funzione.
Creo una variabile out, le assegno il valore di ritorno della funzione.
E stampo out.
Il risultato?
Non più 0.
46.
C'è qualcosa che non va, decisamente.
Eccovi il codice:
nel main (è troppo lungo e fottesegate) (tanto il punto non è se sia corretto quello che fa, il punto è che i valori dovrebbero essere uguali)
inputType xx[2];
double out;
for(i=0;i<3;i++){
printf("\n introduci x : ");scanf("%lf",&xx[0]);
printf("\n introduci y : ");scanf("%lf",&xx[1]);
out = calculateOutput(&model, xx, 2);
printf("\n Output = %lf",out);
}
le routine:
double calculateNodeOutput(Node *thisNode, double *input, unsigned int inputSize){
unsigned int i;
double out;
printf("\nCalculating output: %d %d %d %lf %lf",(*thisNode).depth,(*thisNode).isLeaf,(*(*this Node).parent).nextCondition.index,(*(*thisNode).pa rent).nextCondition.threshold,(*thisNode).nodeOutp ut);
out = (*thisNode).nodeOutput;
return out;
}
double calculateOutput(Tree *tree, double *input, unsigned int inputSize){
unsigned int i = 0;
Node *thisNode;
double out;
thisNode = &(*tree).root;
while((*thisNode).isLeaf == false){
i = (*thisNode).nextCondition.index;
if (i<0 || i>= inputSize){
fprintf(stderr,"\n Errore nel calcolo dell'output: indice di nodo pari a %d, massimo %d",i,inputSize);
exit(1);
}
if(input[i]<(*thisNode).nextCondition.threshold){
thisNode = (*thisNode).leftSon; /*printf("\nfollowing route left");*/}
else{
thisNode = (*thisNode).rightSon; /*printf("\nfollowing route right");*/}
}
out = (*thisNode).nodeOutput = calculateNodeOutput(thisNode, input, inputSize);
printf("\nCalculating output: %d %d %d %lf %lf",(*thisNode).depth,(*thisNode).isLeaf,(*(*this Node).parent).nextCondition.index,(*(*thisNode).pa rent).nextCondition.threshold,out);
return out;
}