Δείκτες - γενικά

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: Super-Moderators, WebDev Moderators

Απάντηση
Άβαταρ μέλους
bxenos
Δημοσιεύσεις: 53
Εγγραφή: 18 Αύγ 2008 19:56

Δείκτες - γενικά

Δημοσίευση από bxenos » 27 Οκτ 2008 18:07

chief έγραψε:

Κώδικας: Επιλογή όλων

int main (int argc, char *argv[]){
	FILE *file_1, *file_2;

	char c[120];
***το c[] δεν χρειαζεται να δηλωθει στο μπλοκ αυτο (που είναι πολυ γενικο), αλλα σε εκεινο που χρειάζεται να χρησιμοποιηθεί.
	if&#40;argc<0 || argc>6&#41;&#123;
***το argc ειναι πάντα >0 &#40;εκτός αν έχεις bit arithmetic overflow, π.χ. 32768 arguments με ακεραίους 16bitους&#41;
		printf&#40;"Usage&#58; fcompare &#91;options&#93; file1 file2, options&#58; /nc, /s, /ln.\n"&#41;
	&#125;
	else if &#123;
		if &#40;&#40;file_1 = fopen&#40;argv&#91;1&#93;,"r"&#41;&#41;!=NULL&#41;&#123;
			if&#40;&#40;file_2 = fopen&#40;argv&#91;2&#93;, "r"&#41;&#41;!=NULL&#41;
&#91;color=darkred&#93;
                                             ***πολυ ωραία, αλλα΄δεν έχεις βάλει κωδικα
                                             να ελέγχει για τις παραμέτρους...
                                             ***οπως πάντως σωστα εχεις καταλαβει, ειναι
                                             ενα τμημα κωδικα η ανάγνωριση των παραμέττρων
                                             που θα δωσει ο χρηστης και θα έρθουν στα ragc,argv 
                                             και αλλο η συγκριση των αρχειων.
                                             ***εδω θα χρειαζοταν το c&#91;&#93; να δηλωθει και μετα
                                             να αρχισει η συγκριση των αρχειων 
&#91;/color&#93;
		&#125;
	&#125;


fclose&#40;file_1&#41;;
fclose&#40;file_2&#41;;
&#91;color=darkred&#93;
***δεν επιτρεπετε να κλεισεις αρχειο που δεν έχει ανοίξει, αν δηλαδή
π.χ. το file_2 είναι NULL και πας να το κλείσεις, το πρόγραμμα μπορεί να
έχει ανεξέλενκτη συμπεριφορά. 
Αρα πρέπει να ελένξεις πρώτα αν δεν είναι NULL και μετά να το κλείσεις
&#91;/color&#93;
return 0;
Μια ιδέα για την αναγνώριση των παραμέτρων θα ήταν να έχεις μια δομή με
τα σημαιάκια (flags) και να τα ενημερώνεις.
π.χ.

Κώδικας: Επιλογή όλων

struct &#123;
        char nc;
        char ln;
        char s;
        char *fname1;
        char *fname2;
&#125; params;

void get_params&#40;struct params *p,int argc,char **argv&#41;&#123;
      int i;
       //βαλε αρχικες τιμες
       memset&#40;p,0,sizeof&#40;struct params&#41;&#41;;//μηδενίζει όλα τα περιεχόμενα της δομης p τυπου params
       for&#40;i=1;i<argc;i++&#41;&#123;
             if&#40;argv&#91;i&#93;&#91;0&#93; == '/'&#41;&#123;
                  //είναι παράμετρος...
                  κάνε κάτι...
             &#125; else &#123;
                   //είναι όνομα αρχείου...
                   κάνε κάτι
             &#125;
       &#125;
&#125;

int fcompare&#40;struct param *p&#41;&#123;
       //άνοιξε τα αρχεία και κάνε συγκρίσεις
       ...
       //επέστρεψε 0 αν όλα πήγαν καλά &#40;άνοιξαν τα αρχεία και έγινε σύγκριση&#41; ή -1
      //αν υπάρχει σφάλμα παραμέτρων ή δεν υπάρχουν αρχεία ή ...
&#125;

int main&#40;int argc,char **argv&#41;&#123;
        struct params p;
        get_params&#40;&p,argc,argv&#41;;
        if&#40;fcompare&#40;&p&#41;<0&#41;
            return 1;//σφάλμα κατα την εκτέλεση
        return 0;//όλα καλά, όλα ανθηρά
&#125;

όπως είπα έχουμε δυο ανεξάρτητες εργασίες να κάνουμε, άρα ας ξεκινήσουμε με δυο κύριες συναρτήσεις (fcompare,get_params).
Τελευταία επεξεργασία από το μέλος bxenos την 05 Νοέμ 2008 01:02, έχει επεξεργασθεί 1 φορά συνολικά.

chief
Δημοσιεύσεις: 49
Εγγραφή: 14 Οκτ 2008 13:37
Επικοινωνία:

Δείκτες - γενικά

Δημοσίευση από chief » 30 Οκτ 2008 16:35

ΘΑ σου ήταν εύκολο να μου πεις δυο πράγματα παραπάνω για το παρακάτω(να μου εξηγήσεις τι ακριβός κάνει);
if(argv[0] == '/'));

μήπως εννοείς ;
if(argv[0] == '/n').


Επίσης μου λες

//βαλε αρχικες τιμες


Αφού από κάτω μηδενίζεις την δομή....

chief
Δημοσιεύσεις: 49
Εγγραφή: 14 Οκτ 2008 13:37
Επικοινωνία:

Δείκτες - γενικά

Δημοσίευση από chief » 30 Οκτ 2008 23:30

Προχώρησα λίγο ακόμα, πες μου εάν έχω λάθη.

Κώδικας: Επιλογή όλων

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct &#123;
        char nc;
        char ln;
        char s;
        char *fname1;
        char *fname2;
&#125; params;

void get_params&#40;struct params *p,int argc,char **argv&#41;&#123;
      int i;
       //βαλε αρχικες τιμες
       memset&#40;p,0,sizeof&#40;struct params&#41;&#41;;//μηδενίζει όλα τα περιεχόμενα της δομης p τυπου params
       /* Start at i = 1 to skip the command name. */
       for&#40;i=1;i<argc;i++&#41;&#123;
             if&#40;argv&#91;i&#93;&#91;0&#93; == '/'&#41;&#123;
            	 switch &#40;argv&#91;i&#93;&#91;1&#93;&#41; &#123;

            	 		case 'a'&#58;	nc = argv&#91;++i&#93;;
            	 				break;

            	 		case 'b'&#58;	ln = argv&#91;++i&#93;;
            	 				break;

            	 		case 'c'&#58;	 s = argv&#91;++i&#93;;
            	 				break;
            	  //είναι παράμετρος...
                  //κάνε κάτι...
             &#125; else &#123;
                   //είναι όνομα αρχείου...
                   //κάνε κάτι
             &#125;
       &#125;
&#125;
       //άνοιξε τα αρχεία και κάνε συγκρίσεις
int fcompare&#40;struct param *p&#41;&#123;
	if&#40;&#40;fname1 = fopen&#40;argv&#91;1&#93;,"r"&#41;&#41;!=NULL&#41;&#123;
		fscanf&#40;&#40;FILE *fname1&#41;!=EOF&#41;;
			 &#125;

	if&#40;&#40;fname2 = fopen&#40;argv&#91;2&#93;, "r"&#41;&#41;!=NULL&#41;&#123;
	        	 fscanf&#40;&#40;FILE *fname2&#41;!=EOF&#41;;
	         &#125;


       return 1;

	&#125;//επέστρεψε 0 αν όλα πήγαν καλά &#40;άνοιξαν τα αρχεία και έγινε σύγκριση&#41; ή -1
	         else &#123;
	        	 return -1;
	         &#125;
      //αν υπάρχει σφάλμα παραμέτρων ή δεν υπάρχουν αρχεία ή ...
&#125;

int main&#40;int argc,char **argv&#41;&#123;
        struct params p;
        get_params&#40;&p,argc,argv&#41;;
        if&#40;fcompare&#40;&p&#41;<0&#41;
            return 1;//σφάλμα κατα την εκτέλεση
        return 0;//όλα καλά, όλα ανθηρά
&#125;

Την σύγκριση θα την κάνω με την strcmp; ή strncmp
Π.χ. fprintf(%s %s, strcmp (fnam1-fname2));

Άβαταρ μέλους
bxenos
Δημοσιεύσεις: 53
Εγγραφή: 18 Αύγ 2008 19:56

Δείκτες - γενικά

Δημοσίευση από bxenos » 31 Οκτ 2008 01:17

chief έγραψε:ΘΑ σου ήταν εύκολο να μου πεις δυο πράγματα παραπάνω για το παρακάτω(να μου εξηγήσεις τι ακριβός κάνει);
if(argv[0] == '/'));

το argv είναι ένας πίνακας χαρακτήρων με την παράμετρο i.
το argv[0] είναι ο πρώτος χαρακτηρας από την παράμετρο.
Αν π.χ. ο χρήστης έδωσε fcompare /xxx yyy
η παράμετρος argv[1] είναι "/xxx" και
o χαρακτηρας argv[1][0] είναι '/'


Επίσης μου λες

//βαλε αρχικες τιμες


Αφού από κάτω μηδενίζεις την δομή....

το //βαλε αρχικες τιμες εξηγεί τι κάνει η παρακάτω γραμμή (βάζει αρχικές μηδενικές τιμές)

Άβαταρ μέλους
bxenos
Δημοσιεύσεις: 53
Εγγραφή: 18 Αύγ 2008 19:56

Δείκτες - γενικά

Δημοσίευση από bxenos » 31 Οκτ 2008 01:30

fprintf(%s %s, strcmp (fnam1-fname2)); <<< αυτό δεν σημαίνει τίποτα

θα πρέπει να διαβάσεις μια γραμμή απο το ενα αρχείο και μια γραμμή απο το άλλο
Μπορείς να διαβάσεις με fscanf, fgets ή να φτιάξεις δικιά σου συνάρτηση.
Τους πίνακες χαρακτηρων που θα έχεις διαβάσει (μια γραμμή απο το ένα και μία απο το άλλο) θα τις συγκρίνεις με strcmp.

//ακολουθεί συμαζεμένος ο κώδικας σου με τις διορθωσεις

Κώδικας: Επιλογή όλων

void get_params&#40;struct params *p,int argc,char **argv&#41; 
 &#123; 
    	int i; 
       	//βαλε αρχικες τιμες 
       	memset&#40;p,0,sizeof&#40;struct params&#41;&#41;;//μηδενίζει όλα τα περιεχόμενα της δομης p τυπου params 
       	for&#40;i=1;i<argc;i++&#41; /* Start at i = 1 to skip the command name. */ 
       	&#123; 
   		if&#40;argv&#91;i&#93;&#91;0&#93; == '/'&#41; 
   		&#123; 
			if&#40;!stricmp&#40;argv&#91;i&#93;,"/nc"&#41;&#41;//το string argv&#91;i&#93; είναι παράμετρος 
                    				p->nc = TRUE;//ο χρηστης έδωσε /nc 
               		if&#40;!stricmp&#40;argv&#91;i&#93;,"/ln"&#41;&#41; 
				p->ln = TRUE;//έδωσε /ln 
               		if&#40;!stricmp&#40;argv&#91;i&#93;,"s"&#41;&#41; 
                      			p->s = TRUE;//έδωσε /s 
       		&#125; else &#123; 
                         	//είναι όνομα αρχείου... 
                   		//αν είναι το πρώτο όνομα είναι το πρώτο αρχείο, 
                   		//αλλιώς είναι το δεύτερο αρχειο 
                           	if&#40;p->fname1 == NULL&#41; 
                             		p->fname1 = argv&#91;i&#93;; 
                      		else if&#40;p->fname2 == NULL&#41; 
                             		p->fname2 = argv&#91;i&#93;; 
                       	           //else&#58; ο χρήστης έδωσε περισσότερα απο δύο αρχεία. 
                      	           //να του το πούμε, η να κρατήσουμε μυστικό; 
                      &#125;
             &#125; 
&#125; 
 
 int fcompare&#40;struct params *p&#41; 
&#123;
	printf&#40;"κανε συγκριση των αρχείων %s και %s\n",p->fname1,p->fname2&#41;;
	return 0;
&#125; 

Τελευταία επεξεργασία από το μέλος bxenos την 05 Νοέμ 2008 01:08, έχει επεξεργασθεί 3 φορές συνολικά.

chief
Δημοσιεύσεις: 49
Εγγραφή: 14 Οκτ 2008 13:37
Επικοινωνία:

Δείκτες - γενικά

Δημοσίευση από chief » 01 Νοέμ 2008 22:24

Λοιπόν μετά από κάμποση προσπάθεια κατάφερα να κάνω το παρακάτω, φυσικά και έχει errors αλλά πιστεύω ότι είμαι κοντά στο τέλος&#8230;

Κώδικας: Επιλογή όλων

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLINE 1000

typedef  struct &#123;
        char nc;
        char ln;
        char s;
        char *fname1;
        char *fname2;
&#125; params;

void get_params&#40;struct params *p,int argc,char **argv&#41;&#123;
      int i;
       //βαλε αρχικες τιμες
       memset&#40;p,0,sizeof&#40;struct params&#41;&#41;;//μηδενίζει όλα τα περιεχόμενα της δομης p τυπου params
       /* Start at i = 1 to skip the command name. */
       for&#40;i=1;i<argc;i++&#41;&#123;
   if&#40;argv&#91;i&#93;&#91;0&#93; == '/'&#41;&#123;
      //το string argv&#91;i&#93; είναι παράμετρος
               if&#40;!stricmp&#40;argv&#91;i&#93;,"/nc"&#41;&#41;
            		  p->nc = TRUE;//ο χρηστης έδωσε /nc
               if&#40;!stricmp&#40;argv&#91;i&#93;,"/ln"&#41;&#41;
                      p->ln = TRUE;//έδωσε /ln
               if&#40;!stricmp&#40;argv&#91;i&#93;,"s"&#41;&#41;
                      p->s = TRUE;//έδωσε /s
   &#125;else &#123;
                         //είναι όνομα αρχείου...
      //αν είναι το πρώτο όνομα είναι το πρώτο αρχείο,
               //αλλιώς είναι το δεύτερο αρχειο
                      if&#40;p->fname1&#91;0&#93; == '\0'&#41;
                             p->fname1 = argv&#91;i&#93;;
                      else if&#40;p->fname2&#91;0&#93; == '\0'&#41;
                             p->fname2 = argv&#91;i&#93;;
                      //else&#58; ο χρήστης έδωσε περισσότερα απο δύο αρχεία.
                      //να του το πούμε, η να κρατήσουμε μυστικό;
             &#125;
       &#125;

    	   void diff_line&#40; char *lineone, char *linetwo, int linenumber &#41;
    	   &#123;
         if&#40;strcmp &#40;lineone, linetwo&#41; < 0 || strcmp &#40;lineone, linetwo&#41; > 0&#41;
           printf&#40; "%d<%s\n%d>%s\n", linenumber, lineone, linenumber, linetwo&#41;;
       &#125;

       int main&#40;int argc, char *argv&#91;&#93; &#41;
       &#123;
         FILE *fname1, *fname2;
         char fname1_line&#91;MAXLINE&#93;, fname2_line&#91;MAXLINE&#93;;
         int i;

         if &#40; argc != 3 &#41;
           &#123;
             printf&#40;"differ fileone filetwo\n"&#41;;
             exit&#40;0&#41;;
           &#125;

         fname1 = fopen&#40; argv&#91;1&#93;, "r" &#41;;
         if &#40; ! fname1 &#41;
           &#123;
             printf&#40;"Error opening file %s\n", argv&#91;1&#93;&#41;;
           &#125;

         fname2 = fopen&#40; argv&#91;2&#93;, "r" &#41;;
         if &#40; ! fname2 &#41;
           &#123;
             printf&#40;"Error opening file %s\n", argv&#91;2&#93;&#41;;
           &#125;
         i = 0;
         while &#40; &#40;fgets&#40;fname1_line, MAXLINE, fname1&#41; != NULL&#41;
       	  && &#40;fgets&#40;fname2_line, MAXLINE, fname2&#41; != NULL&#41;&#41;
         &#123;
           diff_line&#40; fname1_line, fname2_line, i &#41;;
           i++;
         &#125;

         return 0;
       &#125;
&#125;


Άβαταρ μέλους
bxenos
Δημοσιεύσεις: 53
Εγγραφή: 18 Αύγ 2008 19:56

Δείκτες - γενικά

Δημοσίευση από bxenos » 01 Νοέμ 2008 23:25

Δεν θα γράψω κώδικα αυτή τη φορά, διότι δεν προσπαθείς να τον καταλάβεις, αρα τζάμπα τον γράφω.
Θα ξαναπώ ότι δεν θα ασχοληθείς πουθενα με τα argv/argc εκτος απο την
get_params(...). Τα ονοματα αρχειων εχει φροντισει να στα δωσει η get_params(...) αρκεί να της τα ζητησεις!

περιμένω απάντησεις στα παρακάτω:
1) Τι αλλο έχει φροντισει να κάνει η get_params(...);
2) Πού βρίσκονται τα ονόματα αρχείων αποθηκευμένα;
3) πώς θα καλέσεις την get_params() απο την main();
4) τι νομίζεις σημαίνει αυτο που γράφεις:

Κώδικας: Επιλογή όλων

 if&#40;strcmp &#40;lineone, linetwo&#41; < 0 || strcmp &#40;lineone, linetwo&#41; > 0&#41; 
5) τι νομίζεις θα τυπώνει αυτό:

Κώδικας: Επιλογή όλων

           printf&#40; "%d<%s\n%d>%s\n", linenumber, lineone, linenumber, linetwo&#41;;
6) σε πόσο καιρό θα ήθελες να παραδώσεις την εργασία;
7) έχεις δοκιμάσει να "τρέξεις" τον κώδικα που γράφεις στον υπολογιστη σου;

chief
Δημοσιεύσεις: 49
Εγγραφή: 14 Οκτ 2008 13:37
Επικοινωνία:

Δείκτες - γενικά

Δημοσίευση από chief » 03 Νοέμ 2008 00:33

Καταρχάς όντος κάποια σημεία του κώδικα δεν τα κατάλαβα, έλλειψη χρόνου &#8230;.και γενικά κατανοούνται δύσκολα κάποια πράγματα και μου παίρνει πολύ χρόνο.
Από την άλλη βρήκα ένα παράδειγμα στο δίκτυο και προσπάθησα, μάλλον λίγο κουτουρού, να το προσαρμόσω στην άσκησή.
Πραγματικά μπορεί να πιέζομαι από χρόνο αλλά συμφωνώ ότι χρειάζεται να κατανοήσω των κώδικα.
Η παρούσα εργασία είναι το 1/3 της παραδιδόμενης εργασίας το υπόλοιπο 2/3 είναι να φτιάξω κάτι σαν το Pagerank του Googleκαι όλα αυτά τα παραδίδω την άλλη Δευτέρα το πρωί.
Τώρα όσο αφορά τον κώδικα έχω κάποιες απορίες μια βασική και ίσως γελοία είναι η main () δεν χρειάζεται η αντικαταστάθηκε με την void get_params(struct params *p,int argc,char **argv)
Επίσης δεν καταλαβαίνω αυτών τον συμβολισμό σου p->nc. Είναι αντί του p.nc;
τώρα για τα ερωτήματα που μου έθεσες
1.έχω την εντύπωση ότι δηλώνεις και την δομή σαν pointer.
2.Τα ονόματα αρχείων char *fname1; char *fname2;
3) πώς θα καλέσεις την get_params() απο την main(); <--- αυτό θα του ρίξω μια ματιά αύριο

Άβαταρ μέλους
bxenos
Δημοσιεύσεις: 53
Εγγραφή: 18 Αύγ 2008 19:56

Δείκτες - γενικά

Δημοσίευση από bxenos » 03 Νοέμ 2008 02:36

η main() δεν αντικαθίστατε ποτέ απο άλλες συναρτήσεις.
Οταν έχεις ένα πρόγραμμα, για λόγους απλότητας-κατανόησης-ευκολίας σπας τις λειτουργίες σε συναρτήσεις (μπορούμε να τα πούμε υποπρογράμματα, αν σε δυσκολεύει ο όρος).
Οπότε αντί να βάλεις κώδικα να ψάξει να βρεί τι είναι το κάθε argv στην main το εβάλα σε μια άλλη συνάρτηση (που γούσταρα να την ονομάσω get_params). Θα μπορούσα να την πω και asximos() αλλά με βόλευε το όνομα.
Αρκεί στην main να την καλέσω για να κάνει τη δουλεία.

Τώρα απο ότι βλέπω δεν ξέρεις τι είναι συναρτησεις, τι είναι pointers και σε τι διαφέρουν απο τις struct. Έχεις μείνει πολύ πίσω στην C. Και δυστυχώς δεν είναι απλή ασκηση αυτή (με εφαρμογή ενός απλού βρόγχου...).
Προτείνω να διαβάσεις συναρτήσεις άμεσα... και όχι να κόβεις ράβεις άσχετα κομάτια που βρίσκεις στο google και χάνεις τον χρόνο σου.

Στην main() δήλωσα τη δομή σαν τοπική μεταβλητή (ορατή μόνο στην main). Οποιοδήποτε μέλος το βρίσκω με p.ονομα (π.χ. p.fname1).
Αν την περάσω στην get_params() δεν θα είναι πια δομή, αλλά θα είναι pointer σε δομή, αρα πρόσβαση σε μέλος με p->ονομα (π.χ. p->fname).
Αν είχες προσέξει την main στην έχω δώσει έτοιμη http://www.freestuff.gr/forums/viewtopi ... 556#374556 απο την αρχή - βασικά όλο το σκελετό σου είχα δώσει και έπρεπε να συμπληρώσεις τις fcompare και get_params. Παρ'ολα αυτά βλέπω οτι με την main παίζεις ακόμα (χωρίς λόγο), διότι δεν ξέρεις τι είναι συνάρτηση ακόμα αλλά και ούτε αλγοριθμικά ξέρεις τι πρέπει να κάνεις.
Την get_params() την έχεις εδώ http://www.freestuff.gr/forums/viewtopi ... 003#375003, άρα προσπάθησε να τις καταλάβεις και όχι να πετάς άχρηστες γραμμές με ανούσιο κώδικα χωρίς λόγο, τον οποίο δεν τον καταλαβαίνεις και δεν τον έχεις τρέξει να δείς τι κάνει και χάνεις τζάμπα τον χρόνο σου.

chief
Δημοσιεύσεις: 49
Εγγραφή: 14 Οκτ 2008 13:37
Επικοινωνία:

Δείκτες - γενικά

Δημοσίευση από chief » 03 Νοέμ 2008 11:39

Λοιπών, μάλλον σου έδωσα λάθος εντύπωση, για το θέμα θεωρίας έχω ρίψει αρκετό διάβασμα και γενικά στην C αφιερώνω 15-20 ώρες την εβδομάδα, αλλά επειδή στη βράση κολλάει το σίδερο η θεωρία με την πράξη σε κάποια σημεία έχουν χαοτική διαφορά, το τι είναι pointer τι είναι structure (και πως συντάσσεται) και τι είναι συνάρτηση μου είναι γνωστά, αλλά στην εφαρμογή η σκέψη μου είναι πολύ πιο απλή από τον κώδικα που γράφεις σε σημείο που μπερδεύομαι, με την main παρανόησα νομίζοντας ότι την έβγαλες από έξω βάση κάποιας συνθήκης την οποία δεν ήξερα......
Τέλος πάντων, θα προσπαθήσω να κάνω μια σούμα όλα αυτά που μου είπες και που έγραψες, θα προσπαθήσω να ξανά αναλύσω τον κώδικα και εδώ είμαστε.
Προσωρινά σε ευχαριστώ για τον χρόνο σου.

Υ.Γ. Πάντως αυτό το βελάκι στο p πραγματικά με μπέρδεψε.....
Υ.Γ. Η πρόσβαση σε μέλος δομής γίνεται με το p.x το βελάκι δεν το έχω δει πουθενά στην θεωρία.

Άβαταρ μέλους
bxenos
Δημοσιεύσεις: 53
Εγγραφή: 18 Αύγ 2008 19:56

Δείκτες - γενικά

Δημοσίευση από bxenos » 03 Νοέμ 2008 13:46

Κώδικας: Επιλογή όλων

struct kati &#123;
     int a;
     char b;
     char *s;
&#125;; //τωρα δηλωσα οτι μπορω να έχω μια δομη που περιεχει 3 στοιχεια.
//δεν εχω δεσμευσει χωρο στην μνημη γι'αυτη.
//εχω ορίσει επίσεις με την struct ποσο χωρο χρειαζεται στη μνημη.

struct kati aa;//τωρα δεσμευσα χωρο στην μνημη για τα 3 στοιχεια.

struct kati *ptr;//τωρα δεσμευσα χωρο στην μνημη για εναν ΔΕΙΚΤΗ για 3 στοιχεια. 
//προσοχη&#58;δεν δεσμευσα χωρο για την δομη &#40;με τα 3 στοιχεια&#41; αλλα μονο για &#40;ασ πουμε&#41; εναν ακέραιο που έχει τη θεση μνημης στην RAM που ξεκιναει μια δομη kati.
//αν δηλαδή μια δομή kati ξεκινά απο τη θέση μνήμης 10320 και βάλω το δείκτη
//να δείχνει στην δομή αυτη, η τιμή του δείκτη θα είναι 10320.
//Προσοχη αυτος ο δεικτης που έφτιαξα μόλις τώρα δεν δειχνει σε πραγματικη 
//θεση μνημης τωρα διοτι δεν του
//εχω δωσει αρχικη τιμή &#40;έχει λοιπον τυχαια &#40;σχεδον&#41; περιεχομενα τωρα μεσα του&#41;.

int main&#40;void&#41;&#123;
         aa.a = 3;
         aa.b =  'x';
         aa.s = "μπλα μπλα";

         ptr->a = 4;                     //η εντολή αριστερά ειναι συντακτικα σωστη.
                    // έχει όμως λογικό λάθος, διοτι δεν
                                              //εχω βαλει τιμη στην ptr. To ποιο πιθανο είναι να βγαλει
                                             //protection fault και το λειτουργικο συστημα να κλεισει 
                                             //το προγραμμα μου

         ptr = &aa;                     //θελω η ptr να δειχνει στην δεσμευμενη μνημη aa
         ptr->b = 'p';                    //τι τιμή έχει τωρα το ptr->b;
                                             //τι τιμη έχει τωρα το aa.b;

        //τι τιμή έχει το ptr->s;
&#125;
Ελπίζω το σύντομο μάθημα με τους δείκτες να βοήθησε λίγο.
Δες και το πρώτο μηνυμα στο θέμα αυτό που έχω γράψει για την χρήση των δεικτών.

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες