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

Aporia: C kai deiktes se pinakes gia sinartiseis.


thunderB

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

Δημοσ.

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.

Δημοσ.

Το πρόβλημα αυτό που αναφέρεις εξαρτάται και από τον 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 που θα περίμενες

Δημοσ.

>
#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.

 

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

Δημοσ.

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?

Δημοσ.

Αν κάνεις το δεύτερο πράγμα που έχει αναφέρει ο thama τότε μπορείς να έχεις την δήλωση της συνάρτησης ως void show_array ( int **arr );

και να περάσεις ως παράμετρο τον πίνακα χωρίς πρόβλημα.

Δημοσ.

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() ?

Δημοσ.

Το πρόβλημα, προφανώς, εμφανίζεται στο τι τύπου δείκτη περνάς... Ο 2ος τρόπος του thama δουλεύει σίγουρα.

Δημοσ.

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.

Δημοσ.

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

Πρώτα από όλα αν δοκιμάσεις να το κάνεις σε C++ χωρίς casting, θα δεις ότι αρνείται να το κάνει, ενώ αντίθετα στη C αν δεν κάνεις αλλαγή τύπου δεν θα σου πεί τίποτα και θα κάνει την αλλαγή μόνη της κατα την ώρα που περνάς τα ορίσματα..

Αν τώρα κάνεις casting αλλάζουν κάπως τα πράγματα.

Το έψαξα λίγο παραπάνω το θέμα και κοίτα τι γίνεται:

Κάθε δήλωση της μορφής int pin[3][3][3]...[3]

όταν περαστεί σαν όρισμα σε συνάρτηση ,

ΜΕΤΑΤΡΕΠΕΤΑΙ ΣΕ ΜΟΝΟΔΙΑΣΤΑΤΟ ΠΙΝΑΚΑ.

Δοκίμασε στο πρόγραμμα που μας γράφεις

να αντικαταστήσεις το διπλό loop με το παρακάτω.

 

for(i=0;i<25;j++)

printf("%d ", *(arr+i) );

 

Το δοκίμασα σε προιστορική TC και έπιασε.

 

Ελπίζω να μπόρεσα να σε βοηθήσω.

 

Δημοσ.

και κάτι ακόμα κάπως άσχετο

Ανάφερες για καθηγητή πανεπιστημίου.

Σε ποιο τμήμα είσαι φοιτητής (και πόλη) αν επιτρέπεται?

Δημοσ.

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

Δημοσ.

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.

 

Δημοσ.

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.

Δημοσ.

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="" />

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...