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

Erwthsh sth C


Sta

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

Δημοσ.

Loipon, anarwtiemai an einai dynaton ston kwdika tou programmatos na oriso ena pinaka 2 diastasewn tou opoiou oi diastaseis na exartwntai apo input pou dinw otan trexw to programma.

Diladi as poume na einai orizetai genika enas pinakas N x N kai otan trexw to programma na dinw N=100 as poume.

Δημοσ.

Αυτό που ζητάς δεν γίνεται. Δεν μπορείς δηλαδή να δηλώσεις ένα πίνακα π.χ int record[][] μετα να του αλλάξεις διαστάσεις. Μπορείς όμως να κάνεις τα εξής:

1)Να δηλώσεις ένα pointer τον οποίον θα χρησιμοποιείς ώς τον πίνακα δηλ

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;"> int *k;

 

int dim1=10;

int dim2=10; //k[10][10]

 

//fill array with zero's

for (i=0; i<dim1; i++)

for (n=0; n<dim2; n++)

k[i*dim1+n]=0 [/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">2)Για καλύτερη διαχείρηση της μνήμης μπορείς να χρησιμοποιείσεις την malloc ώς εξής

 

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">

k=malloc(dim1*dim2);[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">η ακόμα καλύτερα και την calloc αν θές να δώσεις και αρχικές τιμές.

Δημοσ.

File bandito h prwth lysh pou edwses mhpws exei problhma? Ayto to lew giati o pointer k exei mia random diey8ynsh, opote na deixnei se asxeto xwro mnhmhs (allou programmatos pi8anws) kai etsi to programma na "xtyphsei". Just a thought.

 

<small>[ 25-08-2002, 15:32: Το μήνυμα επεξεργάστηκε από: Billman ]</small>

Δημοσ.

Εξαρτάται με τον τρόπο που το λειτουργικό δίνει τους pointers. Συνήθως ακόμα και οι random pointers, δείχνουν στο heap. ʼλλωστε το είπα, για καλύτερη διαχείρηση της μνήμης: malloc.

Μάλλον το έγραψα έτσι επηρεασμένος απο την πλατφόρμα που χρησιμοποιώ (όπου η malloc είναι απαγορευμένη)

Δημοσ.

το k[j] δεν θα περάσει απο τον compiler γιατί δεν μπορεί να γνωρίζει κάθε στιγμή τη τιμή έχει η κάθε διάσταση του πίνακα. Αν οι τιμές αυτές δεν είναι πάρα πολλές (π.χ ό πινακάς θα ειναι είτε 8χ8 είτε 16χ16) τότε μπορείς να κάνεις cast σε array ως εξής:

 

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">

if (dim1==8)

int l=(int (*)[16]) &k;

else

int l=(int (*)[8]) &k;[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">Τώρα το l[j] έχει νόημα.

Δημοσ.

Den ennoousa mallon akribws ayto.

As to 8esw pio genika.

An 8elw na orisw ena pinaka array[10][10] alla oxi me to : int array[10][10] alla me th dhlwsh arxika int **array kai meta me malloc gia katanomh mnhmhs, ginetai kati tetoio?

Δημοσ.

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">#include <stdio.h>

#include <conio.h>

#include <alloc.h>

 

 

void Input(int &m, int &n)

{

printf("Rows and columns input\n");

printf("Give the number of rows:");

scanf("%d",&m);

printf("\nGive the number of columns:");

scanf("%d",&n);

}

 

void FillArray(int m,int n,int *p)

{

int i,j;

printf("Fill array\n");

for (i=0;i<m;i++)

{

for (j=0;j<n;j++)

{

printf("\nz[%d][%d]=",i+1,j+1);

scanf("%d",&(p+i*n)[j]);

}

}

}

 

void PrintArray(int m, int n,int *p)

{

int i,j;

printf("Print array\n");

for (i=0;i<m;i++)

{

for (j=0;j<n;j++)

{

printf("z[%d][%d]=% d ",i,j,(p+i*n)[j]);

}

printf("\n");

}

getch();

}

 

 

void main()

{

clrscr();

int m,n;

Input(m,n);

printf("m=%d, n=%d\n",m,n);

int i;

int *p=new int [m*n];

int **z=new int * [m];

for (i=0;i<m;i++)

{

z=p+i*n;

}

FillArray(m,n,p);

PrintArray(m,n,p);

delete []p;

delete []z;

 

}

[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">Έχω φτιάξει ένα προγραμματάκι που νομίζω ότι μπορεί να σε βοηθήσει. Νομίζω ότι είναι σαφές τι κάνει το πιο πάνω προγραμματάκι. Αν κάποιος μπορεί να το τροποποιήσει ώστε να δουλεύει και με τρισδιάστατους πίνακες ας απαντήσει.

Δημοσ.

Kwdikas se C++:

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;"> int **array, x = 10, y = 10;

 

array = new int* [ x ];

 

for (int i = 0; i < y; ++i)

array[ i ] = new int[ y ];

 

for (int i = 0; i < x; ++i)

for (int j = 0; j < y; ++j)

array[ i ][ j ] = i * j; // just fill[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">Me to parapapanw kommati kwdika mporeis na

diaxeirizesai ton array san ena disdiastato pinaka. Me thn malloc pisteyw 8a 8elei kati analogo.

Δημοσ.

Το προγραμματάκι που έχω στο post μου πιο πάνω είναι για C++. Για σκέτη C πρέπει να χρησιμοποιηθεί η malloc ως εξής:

 

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">#include <stdio.h>

#include <conio.h>

#include <alloc.h>

 

 

void InputData(int m,int n)

{

int i,j,*p,**z;

p=(int) malloc(m*n*sizeof(int));

z=(int*) malloc(m*sizeof(int));

for (i=0;i<m;i++)

{

z=p+i*n;

}

clrscr();

for (i=0;i<m;i++)

{

for (j=0;j<n;j++)

{

printf("z[%d][%d]= ",i,j);

scanf("%d",&z[j]);

}

}

getch();

printf("\n\n");

for (i=0;i<m;i++)

{

for (j=0;j<n;j++)

{

printf("z[%d][%d]= %3d ",i,j,z[j]);

}

printf("\n");

}

getch();

free(p);

free(z);

}

 

void main()

{

int m,n;

m=2;

n=2;

InputData(m,n);

}[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">

Δημοσ.

Sas eyxaristw 8erma gia th boh8eia an kai ligo ka8usterhmena.Telika, katelhxa sthn exhs lush , h opoia katanemei mnhmh kai gia tous deiktes kai gia to xwro opou 8a deixnoun oi deiktes, diladi:

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">

 

int **array;

int i,k;

array=(int **)malloc(n*sizeof(int *));

for (i=0;i<10;i++)

array=(int *)malloc(n*sizeof(int));[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">

 

<small>[ 29-08-2002, 19:10: Το μήνυμα επεξεργάστηκε από: Sta ]</small>

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

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

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