freestuff.gr αρχική σελίδα
 FAQFAQ    ΑναζήτησηΑναζήτηση   Λίστα ΜελώνΛίστα Μελών   Ομάδες ΜελώνΟμάδες Μελών   <b>Εγγραφή Μέλους</b>Εγγραφή Μέλους 
 ΠροφίλΠροφίλ   Επιλογές μέλους Επιλογές   Τα bookmarks μου Τα bookmarks μου   Προσωπικά μηνύματαΠροσωπικά μηνύματα 
  διαφήμιση  

Καλώς ήρθατε στο forum μας! Για να συμμετάσχετε στις συζητήσεις θα πρέπει να είσαστε μέλος. Γίνετε μέλος τώρα!.

Aπο pascal σε C...HELP!!


 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++
Moderators:  Super-Moderators, WebDev Moderators
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [3 Μηνύματα]      Bookmarks Tags: cpascal Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
ΑποστολέαςΜήνυμα
spartakos13


Μέλος από: 29 Μαρ 2010
Μηνύματα: 1

View users profile
ΜήνυμαΣτις: 29 Μαρ 2010 01:36    Θέμα: Aπο pascal σε C...HELP!! Απάντηση με παράθεση  Mark this post and the followings unread

Γεια σας,εχω ενα μικρο προβληματακι εχω φτιαξει μια στιβα σε pascal κ 8ελω να την μετατρεψω σε C.... κ εχω ενα μικρο προβλημα σε αυτο,1ον επειδη δεν γνωριζω κ παρα πολυ καλα και δευτερον με εχουν μπερδεψει οι pointer στη c....
Oριστε λοιπον ο κωδικας σε pascal:


κώδικας:

                      Program list(input,output);
type pp= ^phit;
phit= record
   am : integer;
   gr : real;
   n : pp;
   end;

   var h , t ,aux :pp;
   c : char;





procedure delete(var x,y:pp);{ayti einai h pop}
var aux:pp;
begin

  if (x=nil) then
       writeln('H lista einai kenh')
    else if (x<>nil) then
    begin

         aux:=x;
         x:=aux^.n;
         dispose(aux);
         aux:=nil;
         writeln('Diagrafthke');
    end;
end;








    procedure insert (var x , y : pp);{ayti einai h push}
    var temp : pp;
begin
     new(temp);
     write('Poio stoixeio na proste8ei sti Stiva? a.m., vathmos?');
     readln(temp^.am, temp^.gr);

     if (x <> nil) then
        begin
             temp^.n := x;
             x := temp;
        end
     else if (x = nil) then
          begin
               x := temp;
               y := temp;
               y^.n := nil;
          end;
end;



procedure print (x:pp);
var aux :pp;
begin
   aux := x;
   if aux <> nil then
   begin
      writeln('a.m:' , aux^.am , 'vathmos:' , aux^.gr:4:1);
      aux := aux^.n;
      print(aux);
   end;
end;



begin
   c := '*';
   h := nil;
   t:=nil;
   while(c<>'q') do
   begin
      write('insert,delete,print,quit:');
      readln(c);
         case c of
      'i' : insert(h,t);
      'p' : print(h);
      'd' : delete(h,t);
      end;

      end;
   end.




Eυχαριστω εκ των προτερων...{Και αν γνωριζετε καποιο καλο βιβλιο για c που να δινει ιδιαιτερη βαρυτητα σε pointers και λιστες,αν υπαρχει στα ελληνικα ακομα καλυτερα}
alex599


Μέλος από: 17 Δεκ 2008
Βοηθήματα: 3
Μηνύματα: 66

Περιοχή: Πάτρα
View users profile Send email to user
ΜήνυμαΣτις: 30 Μαρ 2010 11:29    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Και να σου δώσουμε έτοιμο κώδικα, θα πρέπει να καταλάβεις πρώτα τι κάνουν οι δείκτες, πως ορίζονται, σε τι εξυπηρετούν κτλ. Νομίζω βέβαια ότι και η Pascal έχει δείκτες αλλά δεν ξέρω Pascal για να είμαι σίγουρος.

1)Ένας δείκτης δεν έχει κάποια αριθμητική τιμή αλλά διεύθυνση, έτσι δείχνει σε κάποια άλλη θέση μνήμης, δηλαδή σε κάποια άλλη μεταβλητή.

2)Ο τελεστή & αποδίδει την διεύθυνση μιας μεταβλητής, έτσι ένας δείκτης που μπορεί ως τιμή να πάρει μόνο την διεύθυνση κάποιας άλλης μεταβλητής ή την τιμή ΝULL θα παίρνει τιμές ως εξής: Δείκτης=&Μεταβλητή;

3)Για να αναφερθείς στο περιεχόμενο της θέσης μνήμης στην οποία δείχνει ένας δείκτης κάνεις το εξής: *Δείκτης;

4)Ένας δείκτης δηλώνεται ως εξής: Τύπος *Δείκτης; Τα * του 3 και του 4 έχουν διαφορετική σημασία που την καταλαβαίνει ο compiler και φυσικά δεν είναι πολλαπλασιασμός.

5)Μια μεταβλητή πχ int καταλαμβάνει 4 bytes στην μνήμη, δηλαδή 4 συνεχόμενες θέσεις μνήμης και 4 διευθύνσεις. Μόνο η πρώτη μπαίνει σε μια μεταβλητή δείκτη.

6)Ενας πίνακας, είναι δείκτης, το όνομα του δηλαδή. Έστω έχει έναν πίνακα ΠΙΝ[Ν] τότε το όνομα ΠΙΝ είναι και δείκτης και μπορείς να προσπελάσεις το i-οστό στοιχείο με δύο τρόπους πλέον: ΠΙΝ[i]; ή *(ΠΙΝ+i);

7)Ένας πίνακας είναι δείκτης όμως ένας δείκτης δεν είνα πίνακας, μπορεί να γίνει όμως.

8)Ειδικοί δείκτες είναι οι NULL (μηδενικός) και void(κενός) που μπορεί να μετατραπεί σε κάποιον άλλο με type cast.

9)Η Αριθμητική των δεικτών έχουν να κάνουν με τα bytes που καταλαμβάνουν οι μεταβλητές στις οποίες δείχνουν, δηλαδή αν δείχνει σε int και κάνεις Δείκτης++ τότε αυτός θα πάρει τέτοια διεύθυνση ώστε να δείχνει στον επόμενο int, δηλαδή θα αυξηθεί κατά 4.

10)Ένας δείκτης γίνεται πίνακας μέσω δυναμικής δεσμευσης μνήμης. Χρήση των malloc(), calloc(), realloc() και free() για την C και new, delete για την C++.

Aν θες να φτιάξεις έναν πίνακα ακέραιων 100 θέσεων γράφεις:
κώδικας:
int array=(int *)malloc(100*sizeof(int));
ή
int array=(int *)calloc(100,sizeof(int));


και πιο γενικά αν έχεις εγγραφή (δομές για τη C) έστω struct node θα ηταν
κώδικας:
struct node *array=(struct node *)malloc(100*sizeof(struct node));


Η αποδέσμευση μνήμης γίνεται με την free ως εξής: free(array). Απλά πράγματα.

Έτσι φτιάξεις μια δομή με όνομα node, έχεις ένα δείκτη ως κεφαλή που αρχικά είναι NULL και συνδέεις με δυναμική δέσμευση μνήμης όπως πιο πριν όλους του κόμβους σου.

Σχόλιο: Όταν έχεις έναν δείκτη σε ένα struct, τότε στα πεδία του μπορείς να κάνεις προσπέλαση με δύο τρόπους, ο ένας είναι ο κλασικός με τον τελεστή . ή με τον τελεστή βέλος ως εξής: Δείκτης->Πεδίο αφού πιο πριν έχει κάνεις Δείκτης=&Δομή.

Ελπίζω να βοήθησα.

_________________
while(!dead()) ++knowledge;
dva_dev
Script Master

Μέλος από: 16 Σεπ 2005
Μηνύματα: 256+

View users profile Visit posters website
blog deviantART facebook linkedin 
ΜήνυμαΣτις: 30 Μαρ 2010 22:50    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Φίλε spartakos13, αν ο κώδικας που έχεις στην pascal είναι δικός σου και τον έχεις φτιάξει εσύ, τότε μάλλον το πρόβλημα σου μου μοιάζει να προσδιορίζεται περισσότερο στη διαφορά της σύνταξης στη C σε σχέση με την Pascal.
Οι δείκτες όμως λειτουργούν ακριβώς με τον ίδιο τρόπο. Οτι ξέρεις για την pascal, ισχύει ακριβώς το ίδιο και για τη C. Απλώς τη C μπορείς να είσαι λίγο πιο χαλαρός με το type checking που η pascal κάποιες φορές γίνεται κάπως δυσκοίλια.

Γενικά, μην γράψω και όλη τη γραμματική εδώ, η σύνταξη της pascal με το αντίστοιχο στη C (από κάτω) είναι:
x:=value;
x=value;
---------------------------------------
if (x=value)
if (x==value)
---------------------------------------
if (x<>value)
if (x!=value)
---------------------------------------
begin
{
---------------------------------------
end
}
---------------------------------------
x : dataType;
dataType x;
---------------------------------------
x:record ... end;
struct { ... } x;
---------------------------------------
type datatype1 = ^datatape2;
typedef datatype2 *datatype1;
---------------------------------------
pX : ^datatype; pX^.y = z;
datatype* pX; pX->y = z; ή εναλλακτικά
datatype* pX; (*pX).y = z;
---------------------------------------
procedure foo(...)
void foo(...)
---------------------------------------
function foo(...) : datatype
datatype foo()
---------------------------------------

Νομίζω πως αυτά θα σε βοηθήσουν λιγάκι. Το πως συμπεριφέρονται οι δείκτες, τι κάνουν, πως το κάνουν, και τα αντίστοιχα για τις procedures και functions είναι ακριβώς ίδια. Αν τα ξέρεις για την pascal, τα ξέρεις και για τη C.
Εμφάνιση Μηνυμάτων:   
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [3 Μηνύματα] Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++


Σχετικά θέματα
 Θέματα   Απ/σεις   Αποστολέας   Τελευταίο μήνυμα 
ενας κωδικας σε C που βγαζει μη αναμενομενο αποτεσμα 1 teresa92 13 Αυγ 2016 21:26
teresa92 Εμφάνιση τελευταίου μηνύματος
Bitwise operators in C 3 Kappa4 15 Δεκ 2014 20:38
mariosal Εμφάνιση τελευταίου μηνύματος
 
Τώρα είναι 07 Δεκ 2016 20:15 | All times are UTC + 2


Email This Page to Someone! add to Favorites

     Powered by p h p B B © 2001,2005 p h p B B Group
Για άμεση επικοινωνία με τον διαχειριστή του freestuff.gr στο email: freestuff.gr(παπάκι)gmail.com


Copyright © 1999-2013 Freestuff.gr All Rights Reserved  
Version Aegean, designed by N. Tsaganos