monkey90 Δημοσ. 22 Απριλίου 2012 Δημοσ. 22 Απριλίου 2012 (επεξεργασμένο) Καλησπέρα το συγκεκριμένο κομμάτι είναι για μία εργασία στη c και για κάποιο λόγο ενώ χρησιμοποιώ τη rand() πάντα πέρνω τα ίδια αποτελέσματα.Καμιά φορά σκαλώνει και δεν τρέχει. Το πρόβλημα βρίσκεται στη συνάρτηση DimiourgiaPinaka. Βάζω στον πίνακα σε τυχαίες θέσεις O,G,S,Μ(1 από το καθένα εκτός απο το Ο που μπορεί να είναι παραπάνω) δεν πρέπει να μπουν το ένα πάνω στο άλλο εκτός από το S που μπένει παντού εκτός πάνω στο Μ. Και επίσης το Μ μπένει μόνο σε γωνίες. Αν δείτε το λάθος θα με βοηθήσετε πολύ. Ευχαριστώ. > #include <stdio.h> #include <stdlib.h> #include <time.h> int phgadia(int, int); char **DimiourgiaPinaka(int, int, int); void EmfanishPinaka(char **, int, int); int main(int argc, char *argv[]) { int n,k,p,i,j; srand( time(NULL) ); char **T; //kathorismos diastaseis paixnidiou printf("O Megalexandros kai o kataramenos Ofis\n"); printf("Kathoriste tis diastaseis tou paixndiou(NxK)\n"); printf("To elaxisto megethos paixnidiou einai 5x5 kai to megisto 30x30\n"); do { printf("Dwste to N\n"); scanf("%d", &n); printf("Dwste to K\n"); scanf("%d", &k); if(n<5 || n>30 || k<5 || k>30) { printf("dwsate lathos diastaseis, ksanaprospathiste...\n"); } }while(n<5 || n>30 || k<5 || k>30); //kathorismos posostou phgadiwn p = phgadia(n, k); //dhmiourgia dunamikou 2d pinaka T=DimiourgiaPinaka(n, k, p); //emfanish pinaka EmfanishPinaka(T, n, k); system("PAUSE"); return 0; } char **DimiourgiaPinaka(int n, int k, int p) { int i,j,x,y; char **P; //dimiourgia pinaka P=(char **)malloc(n*sizeof(char *)); for(i=0; i<n; i++) { P[i]=(char *)malloc(k*sizeof(char)); } //gemisma me # for(i=0;i<n; i++) { for(j=0;j<k; j++) { P[i][j]='#'; } } //topothethsh phgadiwn for(i=0; i<p; i++) { do { x=rand()%n; y=rand()%k; }while(P[x][y]!='#'); P[x][y]='O'; } //topothethsh xrusou do { x=rand()%n; y=rand()%k; }while(P[x][y]!='#'); P[x][y]='G'; //topothethsh ofh x=rand()%n; y=rand()%k; P[x][y]='S'; //topothethsh Megalexandrou do { if((rand()%2)==0) { x=0; } else { x=n; } if((rand()%2)==0) { y=0; } else { y=k; } }while(P[x][y]!='#'); P[x][y]='M'; return P; } void EmfanishPinaka(char **P, int n, int k) { int i,j; printf(" "); for(i=0; i<k; i++) { printf("%s%d", " ", i+1); } printf("\n"); printf("--"); for(i=0; i<k; i++) { printf("--"); } printf("\n"); for(i=0; i<n; i++) { printf("%d%s", i+1, "|"); for(j=0; j<k; j++) { printf("%s%c", " ", P[i][j]); } printf("\n"); } } int phgadia(int n, int k) { int p,r; printf("Kathoriste to pososto twn tetragwnwn se sxesh me ta sunolika pou tha einai phgadia\n"); printf("pathste 1 gia liga(5 tis ekato) h 2 gia kamposa(10 tis ekato) h 3 gia polla(15 tis ekato)\n"); do { scanf("%d", &p); if(p<1 || p>3) { printf("dwsate lathos dedomena, pathste 1 h 2 h 3 gia na kathorisete thn epilogh sas\n"); } }while(p<1 || p>3); if(p==1) { r=n*k*5/100; } else if(p==2) { r=n*k*10/100; } else { r=n*k*15/100; } return r; } Επεξ/σία 23 Απριλίου 2012 από monkey90
migf1 Δημοσ. 22 Απριλίου 2012 Δημοσ. 22 Απριλίου 2012 Στην main() ξεκίνα με: > srand( time(NULL) ); που ενεργοποιεί την γεννήτρια ψευδοτυχαίων. Χωρίς αυτό η rand() δίνει πάντα τα ίδια αποτελέσματα.
monkey90 Δημοσ. 23 Απριλίου 2012 Μέλος Δημοσ. 23 Απριλίου 2012 Άμα βάλω την srand( time(NULL) ); τότε είναι που σχεδόν πάντα "κολλάει"..δηλαδή δίνει ο χρήστης αυτα που του ζητούνται και μετά βγάζει το στοιχείο main.exe σταμάτησε να λειτουργεί.
migf1 Δημοσ. 23 Απριλίου 2012 Δημοσ. 23 Απριλίου 2012 Έχεις κάνει: #include <time.h> ? Αν ναι, δεν φταίει η srand() ... κάτι άλλο φταίει στο πρόγραμμά σου (ή στο σύστημά σου).
monkey90 Δημοσ. 23 Απριλίου 2012 Μέλος Δημοσ. 23 Απριλίου 2012 Ναι την έχω βάλει...υπάρχει κάποιο λογικό λάθος δεν ξέρω. Σε ευχαριστώ πάντως. Εαν κάποιος εντωπίση που είναι το λάθος ,λογικά στην συνάρτηση DimiourgiaPinaka, θα του ήμουν ευγνώμων.
monkey90 Δημοσ. 23 Απριλίου 2012 Μέλος Δημοσ. 23 Απριλίου 2012 Ακόμα δεν το έχω βρει..υπάρχει περίπτωση να φταίειο υπολογιστής μου; Δε μπορώ να το εντωπίσω και επειδή κολλάει εκεί δε μπορώ να ελένξω και τα επόμενα που έχω κάνει.
Star_Light Δημοσ. 23 Απριλίου 2012 Δημοσ. 23 Απριλίου 2012 Ακόμα δεν το έχω βρει..υπάρχει περίπτωση να φταίειο υπολογιστής μου; Δε μπορώ να το εντωπίσω και επειδή κολλάει εκεί δε μπορώ να ελένξω και τα επόμενα που έχω κάνει. Σπάνια φταίει ο υπολογιστης ή η διατύπωση της άσκησης. Καποιο λογικο λάθος έχει ο κωδικας σου. Βασικα δοκιμασε να παιξεις με την εξοδο. Δηλαδη βάζε εσυ εισοδους και αναλογα με την εξοδο που παιρνεις προσπαθησε να καταλαβεις που υπάρχει το θέμα. Σε ποια ρουτίνα. Πολυ γενικο αυτο που σου λεω αλλα ελπιζω καπως να σε βοηθησει.
Directx Δημοσ. 23 Απριλίου 2012 Δημοσ. 23 Απριλίου 2012 Ακόμα δεν το έχω βρει..υπάρχει περίπτωση να φταίειο υπολογιστής μου; Δε μπορώ να το εντωπίσω και επειδή κολλάει εκεί δε μπορώ να ελένξω και τα επόμενα που έχω κάνει. Το πρόγραμμα σου κτυπάει access violation στο while(P[x][y]!='#') (στην DimiourgiaPinaka) διότι τα x, y δείχνουν μια θέση παραπάνω από το μέγεθος του πίνακα που δέσμευσες με: P=(char **)malloc(n*sizeof(char *)); for(i=0; i<n; i++) { P=(char *)malloc(k*sizeof(char)); } Θα πρέπει να αναθεωρήσεις τον κώδικα σου (διότι ορίζεις σε διάφορα σημεία τα x, y σου) ώστε να μην είναι εκτός ορίων (ή αρνητικές τιμές), πχ: > if((rand()%2)==0) { x=0; } else { x=n - 1; } if((rand()%2)==0) { y=0; } else { y=k - 1; } * Τώρα αν τα x, y πάνε < 0 ή αν υπάρξουν άλλα bugs θα το δεις εσύ κλπ. Καλή συνέχεια.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα