Προς το περιεχόμενο

για c


stefxam

Προτεινόμενες αναρτήσεις

Καλησπέρα..έχω να υλοποιησω σε γλωσσα c το παιχνιδι της ναυμαχιας και εχω κολλησει σε ενα σημειο

Αρχικα γεμιζω τους 2 πινακες με 0 (ενας πινακας για καθε παικτη) και στην συνέχεια δινω συντεταγμενες για τα πλοια. ενω δινω συντεταγμένες αντι να μου τα βαζει στην σωστη θεση μου γεμιζει ολοκληρες τις στηλες!!

#include <stdio.h>
int main(){
    int N,i,k,c1,c2;
     int  BF1[N][N],BF2[N][N];
     printf("Kalosirthate sthn naumaxia \n");
     printf("dwse vathmos duskolias(7-10)\n");
     scanf("%d",&N);
     for(i=0;i<N;i++){
       for(k=0;k<N;k++){
         BF1[k]=0;
         BF2[k]=0;
     }}
     printf("Player 1. Dose suntetagmenes gia to proto ploio (5 theseis)");
     for(i=1;i<=5;i++){
     scanf("%d,%d",&c1,&c2);
     BF1[c1][c2] =1;
     }
     printf("Player 1. Dose suntetagmenes gia to deutero ploio (3theseis)");
     for(i=1;i<=3;i++){
     scanf("%d,%d",&c1,&c2);
     BF1[c1][c2]=2;
     }
     for(i=0;i<N;i++){
        for(k=0;k<N;k++)
             printf("%d ", BF1[k]);
             puts("");
        }
       printf("Player 2. Dose suntetagmenes gia to proto ploio (5 theseis)");
     for(i=0;i<5;i++){
     scanf("%d,%d",&c1,&c2);
     BF2[c1][c2]=1;
     }
     printf("Player 2. Dose suntetagmenes gia to deutero ploio (3theseis)");
     for(i=0;i<3;i++){
     scanf("%d,%d",&c1,&c2);
     BF2[c1][c2]=2;
     }
     for(i=0;i<N;i++){
        for(k=0;k<N;k++)
             printf("%d ", BF2[k]);
             puts("");
        }
 }
 
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καταρχήν ο κωδικας που ποσταρες εχει undefined behavior. Στην αρχη αρχη δηλωνεις μια μεταβλητη N χωρις να την αρχικοποιεις και μετα φτιαχνεις δυο VLAs που εχουν διαστασεις ΝxN. Αφου εισαι στην C η N ειναι αυτοματη μεταβλητη και αρα δεν εχει καμια αρχικη τιμη απο μονη της επομενως καταληγεις σε UB. Κατι τετοιο θα ηταν προτιμοτερο

#define N 100

...

int BF1[N][N], BF2[N][N];

Απο εκει και περα το μονο προβλημα που μπορει να εχεις παιζει να ειναι στην scanf αν και δεν μου φαινεται να εχεις κανενα λαθος στην χρηση της.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Βαλε τις συντεταγμενες πάνω απο τον "πινακα" που εμφανιζεις και μετα απο καθε scanf κανε printf τον πινακα για να μην δώσεις καταλαθος ακυρες συντεταγμενες αν βαριεσαι να βαλεις ελεγχους για αυτο.καλυτερα να το κανεισ με συναρτησεις , λογικα αυτος ειναι ο σκοπος της ασκησεις

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καταρχήν ο κωδικας που ποσταρες εχει undefined behavior. Στην αρχη αρχη δηλωνεις μια μεταβλητη N χωρις να την αρχικοποιεις και μετα φτιαχνεις δυο VLAs που εχουν διαστασεις ΝxN. Αφου εισαι στην C η N ειναι αυτοματη μεταβλητη και αρα δεν εχει καμια αρχικη τιμη απο μονη της επομενως καταληγεις σε UB. Κατι τετοιο θα ηταν προτιμοτερο

#define N 100

...

int BF1[N][N], BF2[N][N];

Απο εκει και περα το μονο προβλημα που μπορει να εχεις παιζει να ειναι στην scanf αν και δεν μου φαινεται να εχεις κανενα λαθος στην χρηση της.

Ευχαριστω πολυ....εκει ηταν το προβλημα

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Κατάλαβες γιατί ήταν εκεί το πρόβλημα ?

 

Όταν δηλώνεις ένα πίνακα, πρέπει πάντα οι διαστάσεις του να είναι σταθερές και ποτέ μεταβλητές.

 

% cc -Wall -std=c89 -pedantic tmp.c 
tmp.c: In function ‘main’:
tmp.c:5:5: προειδοποίηση: ISO C90 forbids variable length array ‘BF1’ [-Wvla]
     int BF1[N][N], BF2[N][N];
     ^
Όπως βλέπεις και από το παραπάνω μήνυμα λάθους, η έκδοση C89 (αυτή που καταχρηστικά θα δεις να αναφέρεται ως "ansi") του προτύπου δεν επέτρεπε να έχεις μεταβλητές στις διαστάσεις.

 

Όταν έχεις μία δήλωση που ξεκινά με # όπως η #define N 100 που σου πρότεινε ο Gikoskos, αυτή είναι εντολή του preprocessor ο οποίος τρέχει πριν τον compiler και κάνει λεκτική αντικατάσταση του N σε 100. Έτσι αυτό που βλέπει ο compiler είναι "int BF1[100][100], BF2[100][100]" και το πρόγραμμά σου τρέχει σωστά.

 

Όταν ήθελες να ορίσεις ένα πίνακα δυναμικά, έπρεπε να μπλέξεις με δείκτες και malloc. Επειδή όμως αυτό είναι πολύ συχνό σενάριο, πολλοί compilers υποστήριζαν δυναμική δήλωση πινάκων (συνήθως στην στοίβα) και αυτό μπήκε επίσημα στην έκδοση C99 του προτύπου με τον επίσημο τίτλο "Variable Length Array (VLA)".

 

Όταν εσύ λοιπόν έγραψες την δήλωση "int BF1[N][N];" όρισες ένα τέτοιο πίνακα. Αυτό που έχει σημασία να θυμάσαι είναι ότι η εκχώρηση μνήμης γίνεται την στιγμή της δήλωσης. Τι τιμή όμως έχει τότε το N ? Δεν του έχεις δώσει τιμή οπότε κάθε φορά που τρέχεις το πρόγραμμα, μπορεί να έχει όποιο σκουπίδι υπάρχει σε εκείνη την διεύθυνση μνήμης.

 

    int N,i,k,c1,c2;
    printf("Kalosirthate sthn naumaxia \n");
    printf("dwse vathmos duskolias(7-10)\n");
    scanf("%d",&N);
    int  BF1[N][N],BF2[N][N];
Αν μετακινούσες την δήλωση των πινάκων μετά την scanf, τότε η εκχώρηση μνήμης θα γινόταν με τις σωστές διαστάσεις (αν φυσικά χωρούσαν στην στην στοίβα γιατί μπορεί ο χρήστης να έδινε τιμή 1000000 στο N) και θα έπαιζε σωστά το πρόγραμμα.
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...