marsel Δημοσ. 12 Απριλίου 2010 Δημοσ. 12 Απριλίου 2010 Καλησπέρα, έχω μια άσκηση για το μάθημα του προγραμματισμού. Σκοπός της άσκησης είναι να γράψουμε το παιχνίδι ColorPop σε C. Αντιμετωπίζω όμως ένα πρόβλημα με την αναδρομική συνάρτηση που σκάει τα "μπαλονάκια" (αριθμοί στον πίνακα). > void recursiveWay(int** matrix,int row,int column,int* cntr,int* ball) { int number = matrix[row][column]; if(*cntr == 0); { if (matrix[row+1][column] == number) { if(*cntr != 4) { *cntr = 1; recursiveWay(matrix, (row+1), column, cntr, ball); *cntr = 0; } } else if (matrix[row][column-1] == number) { if(*cntr != 3) { *cntr = 2; recursiveWay(matrix, row, (column-1), cntr, ball); *cntr = 0; } } else if (matrix[row][column+1] == number) { if(*cntr !=2) { *cntr=3; recursiveWay(matrix, row, (column+1), cntr, ball); *cntr=0; } } else if (matrix[row-1][column] == number) { if(*cntr != 1) { *cntr == 4; recursiveWay(matrix, (row-1), column, cntr, ball); *cntr == 0; } } } matrix[row][column]=0; ball = ball--; deleteItem(matrix, row, column); } το ball είναι ο αριθμός των μπαλονιών που υπάρχουν κάθε φορά στον πίνακα, αλλά δεν αλλάζει ποτέ, ενώ θα έπρεπε... μάλλον ούτε ο cntr που είναι βοηθητική μεταβλητή. αν κάποιος εντοπίσει το λάθος παρακαλώ ας απαντήσει. ευχαριστώ.
epersidi Δημοσ. 12 Απριλίου 2010 Δημοσ. 12 Απριλίου 2010 Το ball είναι δείκτης οπότε αντί για ball = ball-- ; πρέπει να γράψεις *ball = *ball-- ; Δηλαδή πρέπει να αλλάξεις την τιμή της μεταβλητής στην οποία δείχνει ο δείκτης και όχι το περιεχόμενο του δείκτη δηλαδή τη μεταβλητή στην οποία δείχνει.
marsel Δημοσ. 12 Απριλίου 2010 Μέλος Δημοσ. 12 Απριλίου 2010 Το ball είναι δείκτης οπότε αντί για ball = ball-- ; πρέπει να γράψεις *ball = *ball-- ; Δηλαδή πρέπει να αλλάξεις την τιμή της μεταβλητής στην οποία δείχνει ο δείκτης και όχι το περιεχόμενο του δείκτη δηλαδή τη μεταβλητή στην οποία δείχνει. Ναι έχεις δίκιο ξέχασα να το αλλάξω, όταν έγραψα το άρθρο, στον κώδικα μου το έχω διορθώσει. Από δοκιμές που έκανα το πρόγραμμα σκάει στο 4ο if, αλλά δεν βλέπω κάποιο λάθος. > void recursiveWay(int** matrix,int row,int column,int* cntr,int* ball) { int number = matrix[row][column]; int flag = *cntr; printf("flag : %d\n",flag); if (*cntr !=1) { if(matrix[row-1][column] == number) { *cntr = 4; printf("cntr : %d\n",*cntr); recursiveWay(matrix, (row-1), column, cntr, ball); *cntr = flag; printf("cntr : %d\n",*cntr); } } if (*cntr !=3) { if(matrix[row][column-1] == number) { *cntr = 2; printf("cntr : %d\n",*cntr); recursiveWay(matrix, row, (column-1), cntr, ball); *cntr = flag; printf("cntr : %d\n",*cntr); } } if (*cntr !=2) { if(matrix[row][column+1] == number) { *cntr = 3; printf("cntr : %d\n",*cntr); recursiveWay(matrix, row, (column+1), cntr, ball); *cntr = flag; printf("cntr : %d\n",*cntr); } } /*if (*cntr !=4) //edw skaei { if(matrix[row+1][column] == number) { *cntr = 1; printf("cntr : %d\n",*cntr); recursiveWay(matrix, (row+1), column, cntr, ball); *cntr = flag; printf("cntr : %d\n",*cntr); } }*/ matrix[row][column]=0; deleteItem(matrix, row, column); *ball = (*ball-1); printf("balloons: %d\n",(*ball)); } Παραθέτω και τον διορθωμένο κώδικα ως τώρα. Ως έχει δηλαδή χωρίς το 4ο if δουλεύει αλλά δεν κινείται προς τα κάτω,μόνο πάνω,δεξιά και αριστερά.
virxen75 Δημοσ. 12 Απριλίου 2010 Δημοσ. 12 Απριλίου 2010 /*if (*cntr !=4) //edw skaei { //εδώ if(matrix[row+1][column] == number) { για βάλε ένα printf("\nrow+1=%d",(row+1)); πριν το if ισως να έχει τιμή μεγαλύτερη από την διάσταση του πίνακα.
epersidi Δημοσ. 12 Απριλίου 2010 Δημοσ. 12 Απριλίου 2010 Sorry αλλά δεν ξέρω το παιχνίδι colorpop. Αν θες να μας πεις λίγα παραπάνω λόγια για το πως δουλεύει η συνάρτηση σου ευχαρίστως να βοηθήσω .... Επίσης όταν λες σκάει τί ακριβώς εννοείς? Σου βγάζει κάποιο μήνυμα λάθους ?
virxen75 Δημοσ. 12 Απριλίου 2010 Δημοσ. 12 Απριλίου 2010 Sorry αλλά δεν ξέρω το παιχνίδι colorpop. Αν θες να μας πεις λίγα παραπάνω λόγια για το πως δουλεύει η συνάρτηση σου ευχαρίστως να βοηθήσω .... Επίσης όταν λες σκάει τί ακριβώς εννοείς? Σου βγάζει κάποιο μήνυμα λάθους ? -ούτε και εγώ το έχω ξανακούσει και δεν βρήκα και κάτι σχετικό σε μια πρόχειρη αναζήτηση στο Google.Καλό θα ήταν να μας το ανάλυε λίγο καθώς και να μας έδινε και τον κώδικα που καλεί την συγκεκριμμένη συνάρτηση όπως και την δήλωση του πίνακα που χρησιμοποιεί. -όσον αφορά τώρα το <<σκάει εδώ>>,είναι κλασικό πρόβλημα αρχαρίου! δεν ξέρουν να απομονώσουν την επίμαχη εντολή που προκαλεί το πρόβλημα πόσο μάλλον να το λύσουν.Γι αυτό σου λέει σκάει εδώ κάπου μέσα στον βρόγχο του if. -Ωστόσο υποπτεύομαι όμως από τον κώδικα που έστειλε ότι πρόκειται για υπέρβαση των ορίων του πίνακα,αφού δεν τα ελέγχει κάπου.
epersidi Δημοσ. 12 Απριλίου 2010 Δημοσ. 12 Απριλίου 2010 -Ωστόσο υποπτεύομαι όμως από τον κώδικα που έστειλε ότι πρόκειται για υπέρβαση των ορίων του πίνακα,αφού δεν τα ελέγχει κάπου. Λογικά τους ελέγχους θα τους έχει στην main() αλλά ποτέ δεν ξέρεις ...
virxen75 Δημοσ. 12 Απριλίου 2010 Δημοσ. 12 Απριλίου 2010 Λογικά τους ελέγχους θα τους έχει στην main() αλλά ποτέ δεν ξέρεις ... όταν μέσα στην συνάρτηση έχει αυτό ........... if(matrix[row+1][column] == number) ............. δεν θα πρέπει πρώτα να εξασφαλίσει ότι υπάρχει? αν π.χ. ......... int matrix[10][10]; matrix[20][5]=5; //δεν θα βγάλει λάθος? ........ αυτό εννοώ.
gtroza Δημοσ. 13 Απριλίου 2010 Δημοσ. 13 Απριλίου 2010 ποιός "συμβολισμός" είναι σωστός ; *cntr=0; ή *cntr == 4; .
gtroza Δημοσ. 13 Απριλίου 2010 Δημοσ. 13 Απριλίου 2010 ποιός "συμβολισμός" είναι σωστός ; *cntr=0; ή *cntr == 4; .
Bspus Δημοσ. 13 Απριλίου 2010 Δημοσ. 13 Απριλίου 2010 Το == ειναι ελεγχος για ισοτητα Το = ειναι αναθεση τιμης
Bspus Δημοσ. 13 Απριλίου 2010 Δημοσ. 13 Απριλίου 2010 Το == ειναι ελεγχος για ισοτητα Το = ειναι αναθεση τιμης
gtroza Δημοσ. 13 Απριλίου 2010 Δημοσ. 13 Απριλίου 2010 if(*cntr !=2) { *cntr=3; recursiveWay(matrix, row, (column+1), cntr, ball); *cntr=0; } } else if (matrix[row-1][column] == number) { if(*cntr != 1) { *cntr == 4; recursiveWay(matrix, (row-1), column, cntr, ball); δεν είμαι προγραμματιστής .
gtroza Δημοσ. 13 Απριλίου 2010 Δημοσ. 13 Απριλίου 2010 if(*cntr !=2) { *cntr=3; recursiveWay(matrix, row, (column+1), cntr, ball); *cntr=0; } } else if (matrix[row-1][column] == number) { if(*cntr != 1) { *cntr == 4; recursiveWay(matrix, (row-1), column, cntr, ball); δεν είμαι προγραμματιστής .
virxen75 Δημοσ. 13 Απριλίου 2010 Δημοσ. 13 Απριλίου 2010 δεν είμαι προγραμματιστής . το *cntr == 4; είναι λάθος φυσικά.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.