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

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

Δημοσ.

οποιoς μπορει ας τρεξει το προγραμμα να δει τι κανει(πειραξτε το define N), δεν πρεπει ομως στην main να καλω τις συναρτησεις με &    ftia(&p);   emf(&p); kai void ftia(int *p[][N]){.... οπως θα καναμε και για μεταβλητη int  αντι για πινακα?
 

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include  <string.h>
#define N 18


/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void ftia(int p[][N]){
    int i,j,k;
    for(k=0;k<(N/2);k++){
        for(i=k;i<(N-k);i++){
            for(j=k;j<(N-k);j++){
                p[j]=(k+1);
            }
        }
        }
    return ;
}    

void emf(int p[][N]){
    int i,j;
    for(i=0;i<N;i++){
        for(j=0;j<N;j++){
            printf("%d",p[j]);
        }
        printf("\n");
    }
    return ;
}

int main(int argc, char *argv[]) {
    int p[N][N];
    ftia(p);
    emf(p);
return 0;    
}
 

Δημοσ.

οποιoς μπορει ας τρεξει το προγραμμα να δει τι κανει(πειραξτε το define N), δεν πρεπει ομως στην main να καλω τις συναρτησεις με &    ftia(&p);   emf(&p); kai void ftia(int *p[][N]){.... οπως θα καναμε και για μεταβλητη int  αντι για πινακα?

 

Είναι το ίδιο πράγμα. Το όνομα ενός πίνακα είναι και η διεύθυνση του πρώτου στοιχείου του, άρα:

#include <stdio.h>

int main(void)
{
	int a[5];

	printf(" a    = %p\n",  a);
	printf("&a    = %p\n", &a);
	printf("&a[0] = %p\n", &a[0]);

	return 0;
}

βγάζει:

 a    = 0xbfd1cedc
&a    = 0xbfd1cedc
&a[0] = 0xbfd1cedc
Δημοσ.

αμα κανω τις αλλαγες(αφου θελω να μου επιστρεφει ολες τις αλλαγες που κανω) που ειπα παραπανω το προγραμμα δεν τρεχει ....

 

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include  <string.h>
#define N 18


/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void ftia(int *p[][N]){
    int i,j,k;
    for(k=0;k<(N/2);k++){
        for(i=k;i<(N-k);i++){
            for(j=k;j<(N-k);j++){
                *p[j]=(k+1);
            }
        }
        }
    return ;
}    

void emf(int *p[][N]){
    int i,j;
    for(i=0;i<N;i++){
        for(j=0;j<N;j++){
            printf("%d",p[j]);
        }
        printf("\n");
    }
    return ;
}

int main(int argc, char *argv[]) {
    int p[N][N];
    ftia(&p);
    emf(&p);
return 0;    
}
 

Δημοσ.

1] Τι αλλαγές θέλεις να κάνεις δεν κατάλαβα.

2] Να βάζεις τον κώδικα σε code tags κι αν είναι μεγάλος σε spoiler.

Δημοσ.

για int για να δωσει στην μαιν το i  αλλαγμενο θελέι διεύθυνση, στον δυσδιαστατο πινακα γιατι δεν γινεται το ιδιο?

 

main{

int i=0;

sin(&i);

printf("%d",i);

return 0;

}

 

void sin(int *i){

i=1; return;

;

Δημοσ.

void ftia(int p[][N]){

                p[j]=(k+1);

 

void ftia(int *p[][N]){

                *p[j]=(k+1);

 

για int για να δωσει στην μαιν το i  αλλαγμενο θελέι διεύθυνση, στον δυσδιαστατο πινακα γιατι δεν γινεται το ιδιο?

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

 

Πολλές φορές έβλεπα φοιτητές στο εργαστήριο όταν κάτι δεν τους έβγαινε να πετάνε ακόμη ένα στάδιο indirection. Δεν παίζει με i ? Το κάνουμε *i να γίνει δείκτης. Δεν παίζει ούτε έτσι ? Θα παίξει ως **i. Φυσικά ποτέ δεν έπαιζε γιατί δεν κατάλαβαν τι έπρεπε να κάνουν.

 

Προσπάθησε να καταλάβεις τι είναι ο δείκτης και πώς δουλεύει ώστε να ξέρεις τι πρέπει να μπει. Όλα αυτά φυσικά με το σκεπτικό ότι θέλεις να συνεχίσεις με C.

 

Όπως σου είπε ο gon, όταν ορίζουμε ένα πίνακα ως όρισμα μιας συνάρτησης, τότε δεν αντιγράφεται ο πίνακας όπως σε μια απλή μεταβλητή αλλά περνιέται ένας δείκτης στο πρώτο του στοιχείο. Έτσι οποιαδήποτε αλλαγή κάνεις μέσα στην συνάρτηση θα αντικατοπτρίζεται παντού χωρίς να χρειάζεσαι κάτι.

Δημοσ.

Ευχαριστω, κατι ειχα καταλαβει.Το βιβλιο που εχω ( Brian W. kai Dennis M.) ειναι για πεταμα και στο google δυσκολα  βρισκεις τετοια λεπτα θεματα.

Δημοσ.

Ευχαριστω, κατι ειχα καταλαβει.Το βιβλιο που εχω ( Brian W. kai Dennis M.) ειναι για πεταμα και στο google δυσκολα  βρισκεις τετοια λεπτα θεματα.

Δες κάνα βιντεακι στο γιουτιουμπ. Οι δείκτες γίνονται εύκολα κατανοητή με γραφική αναπαράσταση.

  • Like 1
Δημοσ.

 Όπως σου είπε ο gon, όταν ορίζουμε ένα πίνακα ως όρισμα μιας συνάρτησης, τότε δεν αντιγράφεται ο πίνακας όπως σε μια απλή μεταβλητή αλλά περνιέται ένας δείκτης στο πρώτο του στοιχείο. Έτσι οποιαδήποτε αλλαγή κάνεις μέσα στην συνάρτηση θα αντικατοπτρίζεται παντού χωρίς να χρειάζεσαι κάτι.

 

 

Για την ακρίβεια, αντιγράφεται η τιμή της μεταβλητής από το "call space" στο "function space"... αλλά αυτή η τιμή είναι δείκτης οπότε βολεύει. 

 

Δηλαδή, το pass by reference και το pass by value είναι στην ουσία τι επιλέγεις να αντιγραφτεί στο "function scope/space". 

Δημοσ.

 

 

Για την ακρίβεια, αντιγράφεται η τιμή της μεταβλητής από το "call space" στο "function space"... αλλά αυτή η τιμή είναι δείκτης οπότε βολεύει. 

 

Δηλαδή, το pass by reference και το pass by value είναι στην ουσία τι επιλέγεις να αντιγραφτεί στο "function scope/space". 

Σωστά. Και κάπως έτσι βλέπουμε πως η C είναι η πιο απλή γλώσσα ever και ό,τι "μαγικό" φαίνεται να κάνει από κάτω δεν είναι παρά μόνο κουρτίνες από συμβάσεις και σύμβολα για υποβοήθηση.

 

 

Κακό

 

 

Πχ μπορώ αντί για pointers να χρησιμοποιώ unsigned int's χωρίς να γεμίζω τον κώδικα με ******.

 

 

 

 

 

 

Δημοσ.

Για την ακρίβεια, αντιγράφεται η τιμή της μεταβλητής από το "call space" στο "function space"... αλλά αυτή η τιμή είναι δείκτης οπότε βολεύει. 

 

Δηλαδή, το pass by reference και το pass by value είναι στην ουσία τι επιλέγεις να αντιγραφτεί στο "function scope/space". 

 

Για την ακρίβεια, στη συνάρτηση περνιέται by value ο δείκτης του 1ου στοιχείου του πίνακα, που είναι σαν να πέρασε στη συνάρτηση by reference το 1ο στοιχείο του πίνακα.

 

Από τη στιγμή δηλαδή που το πρότυπο της συνάρτησης παραμένει σταθερό, δεν τίθεται δηλαδή θέμα επιλογής.

Και κάπως έτσι βλέπουμε πως η C είναι η πιο απλή γλώσσα ever και ό,τι "μαγικό" φαίνεται να κάνει από κάτω δεν είναι παρά μόνο κουρτίνες από συμβάσεις και σύμβολα για υποβοήθηση.

+1

Από τη στιγμή που εξοικειωθεί κανείς με τους δείκτες, τα υπόλοιπα γίνονται βατά.

 

 

Κακό

 

 

Πχ μπορώ αντί για pointers να χρησιμοποιώ unsigned int's χωρίς να γεμίζω τον κώδικα με ******.

 

 

 

 

Όντως κακό, do-able πάραυτα :)

  • Like 2

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

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

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

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

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

Σύνδεση

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

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