-
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;
}
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
Prova a lasciare il codice tre giorni sul balcone!
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
Hai dimenticato di castare la
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
Citazione:
Originariamente Scritto da
Skywolf
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;
}
Innanzitutto, evita di usare la sintassi (*p).x per accedere ai campi di una struttura tramite il puntatore, e' un pugno in un occhio.
Usa l'operatore freccia che e' piu' leggibile e si puo' usare in cascata senza usare ventordicimila parentesi e asterischi:
Codice:
(*thisNode).isLeaf // NO (bellamerdah)
thisNode->isLeaf // Si
(*(*thisNode).parent).nextCondition.index ... // NO!
thisNode->parent->nextCondition.index ... // Si
Torno a chiedere, calculateNodeOutput e calculateOutput sono dichiarate prima del main?
Se non e' cosi' c'e' il rischio che all'atto della chiamata nel main, per il compilatore calculateOutput abbia firma
Codice:
int calculateOutput( void )
Cosa che spiegherebbe perche' stampando direttamente il valore ritornato dalla printf senza passare dalla variabile ti stampa zero:
In pratica prende solo una parte del valore ritornato dallo stack (int e' piu' piccolo di un double) e poi lo passa alla printf.
Se ho ragione ti basta dichiarare le due routine prima del main o mettere prima il prototipo (forward declaration) es:
Codice:
double calculateNodeOutput( Node *thisNode, double *input, unsigned int inputSize );
double calculateOutput ( Tree *tree, double *input, unsigned int inputSize );
int main ( void ) {
/* robba */
}
Mi piacerebbe (se possibile) vedere tutto il codice... magari piemmami.
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
Sono dichiarate in uno header file, perché ho spezzato il progetto in più file: due contengono routine per l'allocazione dinamica di oggetti, uno per la generazione di numeri casuali (non ancora inclusa nel progetto), una col main e poca altra roba.
se vuoi ti mando tutto ma è tanta robba :asd:
a me la sintassi col punto piace :blush: il fatto di dover mettere gli * mi piace, perché ho il controllo (mi costringo ad avere il controllo) di quello che sto facendo: non posso confondere puntatori e oggetti puntati.
- - - Aggiornato - - -
Cmq c'è qualcosa che riguarda il memory managemnt, credo, perché cambiando righe di codice che in teoria centrano na sega cambia quello che stampa
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
per non saper nè leggere nè scrivere ho aggiunto in testa al file c con le procedure dell'albero anche tutti i prototipi :asd: in teoria inutile perchè sono nel .h
ma non va un cazzo lo stesso
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
formatta
oppure esci e rientra
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
Ok, ho capito il problema.
Avevo messo nel progetto (uso Pelles C) il C delle routine dell'albero, ma non l'h relativo.
il codice girava lo stesso perché come secondo errore tutte le strutture dati erano definite nel sorgente col main.
Ho spostato le typedef struct nell'header delle routine dell'albero, le ho tolte dal main, ho aggiunto il .h al progetto.
Sembra andare.
Ma che cazzo di bug signori.
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
Citazione:
Originariamente Scritto da
Skywolf
Ok, ho capito il problema.
Avevo messo nel progetto (uso Pelles C) il C delle routine dell'albero, ma non l'h relativo.
il codice girava lo stesso perché come secondo errore tutte le strutture dati erano definite nel sorgente col main.
Ho spostato le typedef struct nell'header delle routine dell'albero, le ho tolte dal main, ho aggiunto il .h al progetto.
Sembra andare.
Ma che cazzo di bug signori.
:rotfl:
- - - Aggiornato - - -
Citazione:
Originariamente Scritto da
Skywolf
a me la sintassi col punto piace :blush: il fatto di dover mettere gli * mi piace, perché ho il controllo (mi costringo ad avere il controllo) di quello che sto facendo:
Usa l'operatore frecca per l'amore di Iddio! :facepalm:
Dalla prima Pagina del capitolo su i puntatori del Kernighan & Ritchie:
Citazione:
USATE IL CAZZO DI OPERATORE FRECCIA!
Chiaro?
Citazione:
Originariamente Scritto da
Skywolf
non posso confondere puntatori e oggetti puntati.
E' esattamente quello che fai con la freccia: oltretutto e' anche piu' chiaro cosa e' un puntatore e cosa no.
-
Re: WTF (C coding inside)(sì dai lullatemi, la fitta sassaiola di STOCAZZO)(PD^infini
ecco il problema era che usavi il pellet