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