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

Ερωτήσεις για C


capoelo

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

Λέγοντας ότι θέλει να επεξεργαστεί τον πίνακα σημαίνει ότι μπορεί να θέλει να προσθέσει στοιχεία στις "γραμμές" ή ό,τι άλλο που να επηρεάζει τον "rows" pointer.

 

Οπότε, *** αντί για **. 

 

 

Μία χαρά μπορείς να περάσεις και μη δυναμικά δεσμευμένο πίνακα με pointers. Από τα πιο βασικά στη C είναι πως το "όνομα" μίας μεταβλητής πίνακα είναι δείκτης στην αρχή αυτού.  

 

Π.χ.

 

 

char foo[1];

 

Το:

 

 

foo

 

Είναι ίδιο με το:

 

 

&foo[0];
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 1,6k
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Πρώτον, είπε ότι θέλει να επεξεργαστεί τα στοιχεία του πίνακα.

 

Δεύτερον, ξέρω πολύ καλά ότι οι μονοδιάστατοι πίνακες γίνονται decay σε pointer εφόσον περαστούν σε συνάρτηση δε περιμένω να μου το πεις εσύ. Οι δυσδιάστατοι πίνακες ΔΕ γίνονται decay σε διπλό pointer όμως. Μπορείς να το δοκιμάσεις. Στον gcc είναι compilation error να περάσεις στατικό δυσδιάστατο πίνακα σε διπλό pointer.

 

Ορίστε και ένα καλό link που εξηγεί για ποιό λόγο: http://stackoverflow.com/questions/7586702/is-2d-array-a-double-pointer .

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

#include <stdio.h>
int main(void)
{
for (int i = 1; i != 0; i++)
printf("%d\n", i);
return 0;
}

ξέρει κανείς γιατί αυτό εδώ το σίχαμα μετά από ώρα που έχει τρέξει αρχίζει και πετάει random νούμερα και όχι +1 που θα έπρεπε ??

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

Εφοσον τα array εχουν συγκεκριμενο layout στη μνημη, μπορουμε να τα θεωρησουμε "τυπους". Αρα αν θελουμε να περασουμε ενα int array[10][10] σε μια συναρτηση αρκει να γραψουμε τον τυπο δηλαδη void foo(int arr[10][10])

 

Εαν θελουμε εναν pointer σε αυτο το τυπο, τοτε αρκει να βαλουμε ενα αστερακι στο arr δηλαδη int (*arr)[10][10]. Εδω θελει προσοχη, η δηλωση αυτη μπορει να δεχτει εναν δισδιαστατο πινακα αλλα και εναν τρισδιαστατο, το οποιο δεν ειναι λαθος. Αυτο γινεται διοτι ενας array subscriping ειναι ενας pointer. Βεβαια, εφοσον το int (*arr)[10][10] μπορει να δεχτει εναν τρισδιαστατο αυτο σημαινει οτι το int (*arr)[10] μπορει να δεχτει ενα διστιαστατο το οποιο ειναι σωστο αλλα στην περιπτωση μας ειναι λαθος διοτι δεν θελουμε εναν pointer to array of 10 int αλλα ενα 2d array 10x10 int.

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

#include <stdio.h>

int main(void)

{

for (int i = 1; i != 0; i++)

printf("%d\n", i);   -> 10  9  8 ....  1

return 0;

}

ξέρει κανείς γιατί αυτό εδώ το σίχαμα μετά από ώρα που έχει τρέξει αρχίζει και πετάει random νούμερα και όχι +1 που θα έπρεπε ??

 

"Ατέρμων βρόχος" ειναι αυτο που έχεις φτιάξει. Το i αρχικοποιειται στο 1 και αυξάνεται μέχρι το i να μην ειναι 0....

Ισως σταματησει κάπου .... εμενα ακομη μου τρέχει και το περιμενω :P

 

Moνο έτσι υπάρχει κάποιο νοημα :

 

 

#include <stdio.h>
int main(void)
{
int i;

for (i = 10; i != 0; i--)
printf("%d\n", i);

return 0;
}

 

OUTPUT :

10

9

8

....

1

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

Απο το -INT_MAX. Ουσιαστικα θα "ανεβει" στην κορυφη και μετα θα αρχισει να κατεβαινει ωσπου να φτασει το 0

 

ΥΓ Οπως η πορνη η ΕΤΕ

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

Nαι ακριβως. Θα ξεπεράσει τα ορια λογικα του τυπου int στο συστημα σου. Και αν μετα ξαναγυρισει στο 0 θα σταματησει εκει για καμποση ωρα παντως δινει την εντυπωση ενος ατερμονα βροχου.

 

p.s Αυτες τις τιμές μπορεις να τις δεις στο limits.h

 

http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.files/doc/aixfiles/limits.h.htm

 

δες εδω... για λογους φορητοτητας οριζουν μια σταθερά INT_MAX για τον μεγιστο δυνατο ακεραιο για δεδομενη πλατφορμα για αυτο σου ειπε ο παπι οτι θα ανεβει και μετα θα κατεβαινει επειδη θα πηγαινει να αυξησει και θα εχεις αρνητικο αριθμο πχ

 

 

 
  int x =2147483647;
    
    printf("%d" , x);  // 2147483647
 

 

αλλά

 

 

int x =2147483649;
    
    printf("%d" , x);  // -2147483647

 

Για ακομα μεγαλυτερη ευκολια μπορεις να χρησιμοποιεις τους fixed-size τυπους της C99 ( stdint.h ).

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

αχά κατάλαβα ευχαριστώ πολύ παιδιά  γιατί όταν φτάσει 6-7 ψηφία αρχίζει και βγάζει άσχετα και τρελάθηκα λέω wtf? και δεν είχα ιδέα τι παίζει 

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

αχά κατάλαβα ευχαριστώ πολύ παιδιά  γιατί όταν φτάσει 6-7 ψηφία αρχίζει και βγάζει άσχετα και τρελάθηκα λέω wtf? και δεν είχα ιδέα τι παίζει 

 

 

#include <stdio.h>
#include<limits.h>

int main(void)
{
    
    printf("%d" , INT_MAX);

return 0;
}

 

Δοκιμασε αυτο στο δικο σου συστημα θα δεις οτι η εξοδος θα ειναι ο αριθμος  2147483647

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

Σχετικά με το decay των 2D πινάκων έχουμε ασχοληθεί ξανά και αναλυτικά πέριξ αυτού του ποστ . Στο συγκεκριμένο ποστ περνάω φορσέ τον 2Δ ως ** με casting.

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

Πρώτον, είπε ότι θέλει να επεξεργαστεί τα στοιχεία του πίνακα.

 

Δεύτερον, ξέρω πολύ καλά ότι οι μονοδιάστατοι πίνακες γίνονται decay σε pointer εφόσον περαστούν σε συνάρτηση δε περιμένω να μου το πεις εσύ. Οι δυσδιάστατοι πίνακες ΔΕ γίνονται decay σε διπλό pointer όμως. Μπορείς να το δοκιμάσεις. Στον gcc είναι compilation error να περάσεις στατικό δυσδιάστατο πίνακα σε διπλό pointer.

 

Ορίστε και ένα καλό link που εξηγεί για ποιό λόγο: http://stackoverflow.com/questions/7586702/is-2d-array-a-double-pointer .

 

Όταν ηρεμήσεις και είσαι έτοιμος για συζήτηση μπορούμε να τα ξαναπούμε. 

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

 

 

 

Ρε μανια αυτος ο Τιμον να τους βγαλει ολους νευρικους επειδη δεν συμφωνουν μαζι του :P

 

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

 

 

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

Όταν ηρεμήσεις και είσαι έτοιμος για συζήτηση μπορούμε να τα ξαναπούμε.

Όταν το ύφος σου είναι passive-aggressive, να περιμένεις ανάλογη απάντηση...ιδίως όταν δε ξέρεις για τι πράγμα μιλάς.

 

 

Σχετικά με το decay των 2D πινάκων έχουμε ασχοληθεί ξανά και αναλυτικά

Το casting αυτό είναι λάθος. Το έχει εξηγήσει το λινκ που έδωσα παραπάνω για ποιό λόγο. Αν δούλεψε, που αμφιβάλλω, ήταν εντελώς συγκυριακό.
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Όταν το ύφος σου είναι passive-aggressive, να περιμένεις ανάλογη απάντηση...ιδίως όταν δε ξέρεις για τι πράγμα μιλάς.

 

 Το casting αυτό είναι λάθος. Το έχει εξηγήσει το λινκ που έδωσα παραπάνω για ποιό λόγο. Αν δούλεψε, που αμφιβάλλω, ήταν εντελώς συγκυριακό.

 

Αυτο ομως δεν ειναι λαθος :

 

 

int sum_two_dimensional_array(int arr2d[][COLS] , int nrows)   
{
    int *p , sum=0 ;
    
     for( p = (int *) arr2d ; p < ( (int *) arr2d + nrows*COLS); p++)
        sum+= *p;
        
            printf(" %zu , %zu , %zu " , sizeof(arr2d) , sizeof(*p) , sizeof( *( (int * ) arr2d ) ) );
        
        return sum;
    }

o arr2d εχει εξαρχης τυπο δεικτη σε πινακα #COLS στοιχειων και δεν μπορεις να αρχικοποιησεις τον απλο p με αυτον για αυτο κανεις cast. Και εγω ειμαι υπερ της αποψης οτι καλυτερα να μην ταυτιζεις εξαρχης καθολου διπλους πινακες και διπλους δεικτες και το εχω πει αυτο στον migf1 μηνες τωρα οτι δεν συμφωνω με αυτο.

 

Αλλα το να κανεις cast εναν πινακα σε μονο δεικτη ειναι λαθος? δεν το εχω ψαξει πολυ

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

Επισκέπτης
Αυτό το θέμα είναι πλέον κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...