ata1983 Δημοσ. 30 Μαΐου 2005 Δημοσ. 30 Μαΐου 2005 Παιδιά χρειάζομαι μια ατομική βοήθεια για κάποιες απορίες που έχω. Πλησιάζει και η εξέταση. Μπορεί να μου εξηγήσει κάποιος πότε θα κάνω κλήση συνάρτησης με τιμή και πότε με αναφορά? Επίσης αν γίνεται απλά πότε θα χρησιμοποιώ τη malloc? Sorry κιολας αλλά έχω κοιτάξει πολλά ebooks και βιβλία αλλά δεν μπορώ να πω ότι τα έχω ξεκαθαρίσει
-_-SleepyFella Δημοσ. 30 Μαΐου 2005 Δημοσ. 30 Μαΐου 2005 Παιδιά χρειάζομαι μια ατομική βοήθεια για κάποιες απορίες που έχω. Πλησιάζει και η εξέταση. Μπορεί να μου εξηγήσει κάποιος πότε θα κάνω κλήση συνάρτησης με τιμή και πότε με αναφορά? Arxika, sou efxomai kalh epityxia stin exetasi sou . Sxetika omws me tin aporia sou omologw oti me berdepses. Ti ennoeis akrivws klhsh synarthsh me timi . Fantazomai me anafora ennoeis kati san to parakatw : > main(){ int a; myFunction(a); } void myFuction(int x){ //some code //... } Sxetika me tin malloc pantws ta pragmata einai ws exis : Apo To K&R: void *malloc(size_t size) H malloc epistrefei ena deikti sto xwro tis mnhmhs gia ena antikeimeno mege8ous size,h NULL an den borei na ikanopoih8ei to aithma Pio apla : H malloc einai synarthsh h opoia desmevei ena xwro sth mnhmh (mege8ous xwrou = size * bytes).Gia na katalaveis kalytera th xrhsimothta ths des to parakatw : >#include <stdio.h> #include <stdlib.h> main(){ void *ap; ap=malloc(sizeof(int)); } H malloc edw kanei (epistrefei deikth void *) ton ap na deixnei thn desmef8eisa mnhmh pou exei mege8os enos int (syni8ws 4 byte).Se periptwsh pou den borei na oloklhrw8ei to aithma o deikths ap pernei thn timi NULL Elpizw File mou na se voi8isa oso borousa . An kapou kanw la8os sta parapanw as me dior8wsei kapoios parakalw . :grin: :grin:
godlike Δημοσ. 30 Μαΐου 2005 Δημοσ. 30 Μαΐου 2005 Για να καταλάβεις τι είναι η αναφορά στις συναρτήσεις πάρε τι ακόλουθο παράδειγμα. >#include <stdio.h> void func(int x) { x += 10; } void func_(int &x) { x += 10; } int main(int argc, char** argv) { int c = 0; func(c); printf("c = %d\n", c); func_(c); printf("c = %d\n", c); return 0; } Στην func η κλήση γίνεται χωρίς αναφορά και ο c δεν αλλάζει τιμή παρ’ όλο που της πρόσθεσα 10. Στην func_ η κλήση γίνεται με αναφορά και παρατηρείται ότι η τιμή του c αλλάζει. Τρέξτο για να το δεις και μόνος σου.
-_-SleepyFella Δημοσ. 30 Μαΐου 2005 Δημοσ. 30 Μαΐου 2005 Kalo 8a itan na poyme oti exei simasia pou h synarthseis func kai func_ einai void . An eferan enan opoiodhpote allo typo 8a eprepe sto swma tous na yparxei anagkastika mia toulaxiston return . Etce oi parakatw kwdikes (1 , 2)feroun ta idia apotelesmata : 1) >int fuction(int x){ return x++;} 2) >void fuction_(int &x){ x++;} Barinousa shmasia exei h xrhsh tou telesth & pou dinei thn diefthynsh pou einai apo8hkevmeni mia metavlhth h ena block mnhmhs
Moderators Praetorian Δημοσ. 30 Μαΐου 2005 Moderators Δημοσ. 30 Μαΐου 2005 Kalo 8a itan ........ 2) >void fuction_(int &x){ x++;} Barinousa shmasia exei .... Eimai sxedon sigouros (95%) oti h c den yposthrizei anafores (&)... mono h c++. Etsi h deuterh synarthsh gia na tropopoiei th metablhth ths 8a prepei na htane : >void fuction_(int *x){ (*x)++;}
godlike Δημοσ. 31 Μαΐου 2005 Δημοσ. 31 Μαΐου 2005 Kalo 8a itan na poyme oti exei simasia pou h synarthseis func kai func_ einai void . An eferan enan opoiodhpote allo typo 8a eprepe sto swma tous na yparxei anagkastika mia toulaxiston return . Etce oi parakatw kwdikes (1 ' date=' 2)feroun ta idia apotelesmata : 1) >int fuction(int x){ return x++;} 2) >void fuction_(int &x){ x++;} Barinousa shmasia exei h xrhsh tou telesth & pou dinei thn diefthynsh pou einai apo8hkevmeni mia metavlhth h ena block mnhmhs[/quote'] Δεν καταλαβαίνω τι σχέση έχει αυτό που γράφεις με τις αναφορές. Αυτό που έγραψες έχει σχέση με returns και όχι με αναφορές.
GeorgeKatz Δημοσ. 31 Μαΐου 2005 Δημοσ. 31 Μαΐου 2005 Στην func η κλήση γίνεται χωρίς αναφορά και ο c δεν αλλάζει τιμή παρ’ όλο που της πρόσθεσα 10. Στην func_ η κλήση γίνεται με αναφορά και παρατηρείται ότι η τιμή του c αλλάζει. Τρέξτο για να το δεις και μόνος σου. Godlike, Ι am with you... πολύ καλό παράδειγμα! Studing cs? Eimai sxedon sigouros (95%) oti h c den yposthrizei anafores (&)... mono h c++. Eίμαι σίγουρος 100% ότι κάνεις λάθος. >ap=malloc(sizeof(int)); Καλό θα ήταν να γίνει και casting: >ap = (int *)malloc( sizeof( int ) ); και εγώ την χρησιμοποιώ κάπως έτσι: > if(!(ap = (int *)malloc( sizeof( int ) ))){ printf("Memory error!\n"); exit( EXIT_FAILURE ); } Ό,τι άλλο εδώ είμαι...
Inkjjl Δημοσ. 31 Μαΐου 2005 Δημοσ. 31 Μαΐου 2005 Gia na eimai eilikrinis POTE den xrisimopoio anafores sti C kai den eixa ksekatharisei pote sto myalo mou an simberilamvanontai stin ANSI C i oxi...Anyway... Gia na min paraponietai o gcc mou mallon einai ANSI oi anafores sti C...Opote...Exoume kai leme... I anafora einai ousiastika ena psevdonimo gia ti metavliti sou.I sinartisi sou perimenei enan int& omos enas int einai simvatos me enan int& (ara mporeis na doseis to c os orisma)...Tora esy pas kai pernas ti metavliti c stin func_ meso anaforas....Ti simainei afto?Oti otan pernietai i c DEN antigrafetai mesa sti sinartisi dimiourgontas mia topiki metavliti se ksexoristi thesi tis mnimis alla prospelavnei meso enos psevdonimou tin idia ti mnimi tis main!!!O,TI allages kaneis KRATIOUNTAI giati tropopoieis mnimi pou anikei sti main... Stin proti periptosi tis func...esy pernas enan int os orisma...Ti paei kai kanei loipon to palikari...Otan esy pernas to c os orisma,paei kai antigrafei i main to c se mia alli thesi mnimis kai pernaei os orisma to antigrafo...O,TI allages ginontai mesa sti sinartisi func tha xathoune afou to antigrafo tou c tha svistei apo ti mnimi molis oi entoles tis func teleiosoun!!! Eno stin periptosi tis func_ einai san na leei i main stin func_ ... "Koita na deis func_ pare mia diefthinsi mias metavlitis mou kai kane O,TI thes..." Einai san na stelneis ton Elvis Presley na tragoudisei kai na ksereis oti O,TI kai na pathei sti skini tha to pathei o idios... Sti defteri periptosi i main einai pio poniri...Stelnei enan sosia tou Elvis na tragoudisei kai aftos o sosias XANETAI afou teleiosei ti douleia tou mesa sti func!!!O kanonikos Elvis menei ANEPAFOS afou POTE de vgike apo to spiti tou (to xoro mnimis tis main). Prepei na se voithisa...Kalytera DEN mporo na to eksigiso!!!Se poio tmima eisai????Ego eimai se afto pou fainetai stin ipografi...Pes mou oti eimaste kai simfoitites... PS:Paratheto enan tropopoiimeno kodika pou kanei to idio mpas kai katalaveis kalytera...xrisimopoiei deiktes ki oxi anafores... simple.c.txt
digitalsoul Δημοσ. 31 Μαΐου 2005 Δημοσ. 31 Μαΐου 2005 sthn anafora h fanction epistrefei timh sthn value oxi
-_-SleepyFella Δημοσ. 31 Μαΐου 2005 Δημοσ. 31 Μαΐου 2005 Exoume kai leme :grin: : Eimai sxedon sigouros (95%) oti h c den yposthrizei anafores (&)... mono h c++.Etsi h deuterh synarthsh gia na tropopoiei th metablhth ths 8a prepei na htane : Ypostirizei,Paradeigma : >#include <stdio.h> main(){ int a; int *ap; a=≈ } > Κώδικας: ap=malloc(sizeof(int)); Καλό θα ήταν να γίνει και casting: Sthn ANSI C den xreiazetai se merikes periptwseis to casting . H malloc epistrefei deikth void*.Ara edw den xreiazetai to casting.
Sta Δημοσ. 31 Μαΐου 2005 Δημοσ. 31 Μαΐου 2005 H ANSI C υποστηρίζει βέβαια τον τελεστή & που μας δίνει τη διεύθυνση μίας μεταβλητής, αλλά δεν υποστηρίζει το πέρασμα μεταβλητών κατ' αναφορά με τον εξής τρόπο π.χ. : void func (int &x). Για αυτό το σκοπό χρησιμοποιούνται δείκτες. Για να κάνετε ANSI compilation με gcc, δώστε: gcc -ansi -pedantic -Wall. Έπειτα, casting στη malloc δεν πρέπει να γίνεται, είναι επικίνδυνο γιατί αποκρύπτει λάθη. Για περισσότερες πληροφορίες google it.
godlike Δημοσ. 31 Μαΐου 2005 Δημοσ. 31 Μαΐου 2005 Βασικά σην func περνάς την τιμή του int κατευθείαν και με την func_ περνάς την μνήμη (offeset) που βρίσκεται η τιμή του int. Περνώντας την μνήμη μπορώ να αλλάξω και την τιμή αφού βγω από την func_. Καλό θα ήταν να μιλάγαμε με assembly αλλά είναι δύσκολο και περίεργο.
Moderators Praetorian Δημοσ. 31 Μαΐου 2005 Moderators Δημοσ. 31 Μαΐου 2005 H ANSI C υποστηρίζει βέβαια τον τελεστή & που μας δίνει τη διεύθυνση μίας μεταβλητής, αλλά δεν υποστηρίζει το πέρασμα μεταβλητών κατ' αναφορά με τον εξής τρόπο π.χ. : void func (int &x). Ακριβώς. Αυτό είπα. Sorry που κόλλησα σε αυτό, αλλά η C τον τελεστή & μπροστά απο μεταβλητη τον χρησιμοποιεί μόνο για να δηλώσει διεύθυνση μνήμης...
pan_ic Δημοσ. 6 Ιουνίου 2005 Δημοσ. 6 Ιουνίου 2005 Einai polla pou mporei kapoios na sou pei gia to thema sou. Diavase to exhs vivlio:C για μηχανικους kai sth selida 642 kai745 tha sou fygoun oi apories gia thn malloc alla kai gia thn calloc,free.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.