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

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

Δημοσ.

Λέγοντας ότι θέλει να επεξεργαστεί τον πίνακα σημαίνει ότι μπορεί να θέλει να προσθέσει στοιχεία στις "γραμμές" ή ό,τι άλλο που να επηρεάζει τον "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 σε 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 εναν πινακα σε μονο δεικτη ειναι λαθος? δεν το εχω ψαξει πολυ

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

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