thunderB Δημοσ. 27 Μαΐου 2003 Δημοσ. 27 Μαΐου 2003 Vasika exo mia aporia,pou gamo tin omorfia mou mesa, mou exei spasei ta nevra. p.x. code following. > #include <stdio.h> void show_array(int **arr) { int i,j; for(i=0;i<5;i++) for(j=0;j<5;j++) printf("%d", *(*(arr+i)+j) ); } main() { static int pin[5][5]; int i,j,l; l=1; for(i=0;i<5;i++) for(j=0;j<5;j++) pin[i][j]= l++; show_array(pin); } i sinartisi den tha mou dosei ta epithimita apotelesmata,dld aplos na efmanisi ta stixeia tou pinaka.O kodikas tis sinartisis an trexei mesa stin main tha litourgisei sosta...den mporo na katalavo omos giati i sinartisi den to kanei sosta.Opos katalavate i sinartisi show_array perni os orisma ena dikti se dikti-gia-akeraio,kati to opio ke ine o pin...Exw vrei methodo gia afto pou thelo na kano alla thelo na katalavo giati i methodos pou aneptiksa parapano den litourgei. PS: ton pin[5][5] ke ekso apo tis sinartiseis na ton diloso den liturgi,ase pou ton kano ke static stin main giati sketo int stin main() tha xanode oi times me tin klisi tis show_array.
thama Δημοσ. 27 Μαΐου 2003 Δημοσ. 27 Μαΐου 2003 Το πρόβλημα αυτό που αναφέρεις εξαρτάται και από τον compiler που χρησιμοποιείς (Microsoft ή Borland ?) Σε Borland που το δοκίμασα, το πρόβλημα λύνεται ώς εξης Tροποποιείς την δήλωση της συνάρτησης ώς εξής > void show_array(int arr[5][5]) ή εναλλακτικά τη δήλωση της μεταβλητής, όχι σαν πίνακα, αλλά σαν pointer. > int **pin; pin=(int **)malloc(5*sizeof(int *)); for(i=0;i<5;i++) pin[i]=(int *)malloc(5*sizeof(int)); Αυτό συμβαίνει γιατί όταν ορίζεις μια μεταβλητή ώς πίνακα int pin[23][34], αποθηκεύεται με διαφορετικό τρόπο στη μνήμη, και το pin δεν δείχνει το byte που θα περίμενες
Billman Δημοσ. 27 Μαΐου 2003 Δημοσ. 27 Μαΐου 2003 > #include <stdio.h> void show_array(int *arr) { int i,j; for(i=0;i<5;i++) { for(j=0;j<5;j++) printf ( "%d ", arr[ j + i * 5 ] ); printf ( "\n" ); } } int main() { int pin[5][5]; int i,j,l; l=1; for(i=0;i<5;i++) for(j=0;j<5;j++) pin[i][j]= l++; show_array((int *)pin); return 0; } Με το από πάνω κομμάτι κώδικα, μέσα στην συνάρτηση show_array, διαχειρίζεσαι τον πίνακα ως μονοδιάστατο. (για να βρεις το στοιχείο που θες => (x, y) = y + ari8mosSthlwn * x ) Αν θέλεις να διαχειριστείς τον πίνακα ως δυσδιάστατο, θα πρέπει να τον δημιουργήσεις δυναμικά στην main. Ελπίζω να βοήθησα.
thunderB Δημοσ. 27 Μαΐου 2003 Μέλος Δημοσ. 27 Μαΐου 2003 Exo diavasei info sxetika gia to pos na xrisimopiiso sinartiseis gia monodiastatous se polidiastatous.Mou exei karfothei i idea omos gia to tropo pou zitao.To exo dokimasei se MSVC++, turbo C,borland c builder alla tsifos.Oso gia afto pou les thama den nomizo oti exeis dikio, an valo se mia metavliti pointer tin address tou pin[0][0] ke tin afxano kathe fora kata mia monada tha mou dosei me tin adistixi sira ola ta stoixeia tou pinaka. billman ti tha petixo me to na dimiourgiso ton pinaka dynamika stin main?
Billman Δημοσ. 27 Μαΐου 2003 Δημοσ. 27 Μαΐου 2003 Αν κάνεις το δεύτερο πράγμα που έχει αναφέρει ο thama τότε μπορείς να έχεις την δήλωση της συνάρτησης ως void show_array ( int **arr ); και να περάσεις ως παράμετρο τον πίνακα χωρίς πρόβλημα.
thunderB Δημοσ. 27 Μαΐου 2003 Μέλος Δημοσ. 27 Μαΐου 2003 den piga spiti na dokimaso tin methodo toy thama alla me provlimatizei to eksis: opos proanefera to na trexo ton kodika tis show_array() stin main() ola kala, tote ti provlima iparxi re gamoti to mou** tis Evas?dld to olo thema ine sto pos na metaferoume ton pointer i oti telika o pinakas stin show_array() den exei tin idia domi me aftin pou exei stin main() ?
Billman Δημοσ. 28 Μαΐου 2003 Δημοσ. 28 Μαΐου 2003 Το πρόβλημα, προφανώς, εμφανίζεται στο τι τύπου δείκτη περνάς... Ο 2ος τρόπος του thama δουλεύει σίγουρα.
thunderB Δημοσ. 28 Μαΐου 2003 Μέλος Δημοσ. 28 Μαΐου 2003 Otan exoume ena pinaka, estw, pin[3][3], o pin einai deiktis ke dixnei to pin[0] to opio pin[0] einai pali deiktis ke dixnei to pin[0][0].To olo mou provlima ine pos na kano ena dikti san to pin ke na tou peraso tin timi tou pin.
thama Δημοσ. 28 Μαΐου 2003 Δημοσ. 28 Μαΐου 2003 Αυτό που λές δεν μπορεί να γίνει σε πίνακα με παραπάνω από μία διάσταση. Πρώτα από όλα αν δοκιμάσεις να το κάνεις σε C++ χωρίς casting, θα δεις ότι αρνείται να το κάνει, ενώ αντίθετα στη C αν δεν κάνεις αλλαγή τύπου δεν θα σου πεί τίποτα και θα κάνει την αλλαγή μόνη της κατα την ώρα που περνάς τα ορίσματα.. Αν τώρα κάνεις casting αλλάζουν κάπως τα πράγματα. Το έψαξα λίγο παραπάνω το θέμα και κοίτα τι γίνεται: Κάθε δήλωση της μορφής int pin[3][3][3]...[3] όταν περαστεί σαν όρισμα σε συνάρτηση , ΜΕΤΑΤΡΕΠΕΤΑΙ ΣΕ ΜΟΝΟΔΙΑΣΤΑΤΟ ΠΙΝΑΚΑ. Δοκίμασε στο πρόγραμμα που μας γράφεις να αντικαταστήσεις το διπλό loop με το παρακάτω. for(i=0;i<25;j++) printf("%d ", *(arr+i) ); Το δοκίμασα σε προιστορική TC και έπιασε. Ελπίζω να μπόρεσα να σε βοηθήσω.
thama Δημοσ. 28 Μαΐου 2003 Δημοσ. 28 Μαΐου 2003 και κάτι ακόμα κάπως άσχετο Ανάφερες για καθηγητή πανεπιστημίου. Σε ποιο τμήμα είσαι φοιτητής (και πόλη) αν επιτρέπεται?
thunderB Δημοσ. 29 Μαΐου 2003 Μέλος Δημοσ. 29 Μαΐου 2003 afto pou les gia ton monodiastato pinaka to ksero,den xero C++ pros to parwn ke den xero ti ine casting.Distixos omos ime kserokefalos ke prospathousa na katalavo giati otan afto: > int pin[3][3]; for(i=0;i<3;i++) for(j=0;j<3;j++) printf("%d", *(*(pin+i)+j) ); liturgei giati na min boro na kano mia metavliti idia me tin pin, wste na apofevgo ta alla tertipia. Anyway man,tnx for your time <img src="http://www.insomnia.gr/ubbthreads/images/graemlins/cool.gif" alt="" />. PS:opos ipe ke o professoras: "kalitera na prospatheis na grafeis portable code, ine kalitera gia olous" <img src="http://www.insomnia.gr/ubbthreads/images/graemlins/crazy.gif" alt="" /> Exo tin amidra ediposi oti diavazei afto to forum opote ke.. ------------------------------------------------------------ Exeis na proteina kana kalo vivlio gia C++ ? Mia lista apo ti exo diavasei & ti tha diavaso an afto voithaei katholou.Exo diavasei to C:Vima pros Vima apo tin omada Waite, tis prosexeis meres tha vgalo mia kopia ta ekseis: 1)C Interfaces and Implementations Techinques for creating reusable software tou David R. Hanson 2)Pointers on C, tou Reek. 3)Advanced C programming, toy john thomas berry apo tin waite team
klark2000 Δημοσ. 29 Μαΐου 2003 Δημοσ. 29 Μαΐου 2003 to exoun idi anaferei polloi alla to: "H glwssa programmatismou C" apo tous Kernigham kai Ritchie twn ekdosewn kleidarithmos einai poli kalo. Stin arxi tha sou fanei kapos diskolo kai akatalavistiko alla sti poreia tha deis pos einai korifaio. Ean exeis kapoia sxesi me programmatismo kai den eisai protaris tote to vivlio auto einai sigoura oti xreiazesai.
thunderB Δημοσ. 29 Μαΐου 2003 Μέλος Δημοσ. 29 Μαΐου 2003 An den kano lathos i C kata K&R diaferei se kapia simia apo to protipo ANSI to opio omos parexei kapies parapano diefkolinseis.
klark2000 Δημοσ. 1 Ιουνίου 2003 Δημοσ. 1 Ιουνίου 2003 ego toulaxiston exo to vivlio gia ANSI C. Nomizo xoris na eimai sigouros oti yparxei kai gia tin C genika. To protipo ANSI den parexei kati parapano aplos einai koinos apodexto apo olous tous compilers kai etsi den tha exeis provlima simvatotitas.
or1onas Δημοσ. 1 Ιουνίου 2003 Δημοσ. 1 Ιουνίου 2003 H deyterh version toy "C Programming" apo Ritchie - Kernighan einai symfwnh me ANSI. K thn exw brei sto kazaa se word ekdosh.... 1Mb Poly kalo ontws.... An to 8elei kaneis, na tou to steilw <img src="http://www.insomnia.gr/ubbthreads/images/graemlins/smile.gif" alt="" />
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.