Δεικτεσ- δυναμικοι πινακεσ

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
JinTonic
Δημοσιεύσεις: 9
Εγγραφή: 11 Ιουν 2010 15:18

Δεικτεσ- δυναμικοι πινακεσ

Δημοσίευση από JinTonic » 11 Ιουν 2010 15:33

προσπαθω να διμιουργησω πινακες δυναμικά και να κανω αναλογη δεσμευση μνημης.
αν καποιος μπορει να μου εξηγησει που εχω λαθος στον παρακατω κωδικα.

Κώδικας: Επιλογή όλων

#include <stdio.h>
#include <math.h>
#define ms 9 
int main&#40;int argc, char *argv&#91;&#93;&#41; &#123;
int i, j, k;
double *a, *b, *c;

a = &#40;&#40;double *&#41; malloc&#40;ms * sizeof&#40;double&#41;&#41;&#41;;
b = &#40;&#40;double *&#41; malloc&#40;ms * sizeof&#40;double&#41;&#41;&#41;;
c = &#40;&#40;double *&#41; malloc&#40;ms * sizeof&#40;double&#41;&#41;&#41;;

   /*dhmioyrgia pinaka A*/
   for &#40;i=0; i<ms; ++i&#41;
   &#123;
      for&#40;j=0; j<ms; ++j&#41;
      &#123;
         a&#91;i&#93;&#91;j&#93; = &#40;double&#41;rand&#40;&#41;/ ms;
         b&#91;i&#93;&#91;j&#93; = rand&#40;&#41; %10;
      &#125;
   &#125;

   for &#40;k=0;k<ms;k++&#41;&#123;
        i=rand&#40;&#41;%ms;
        j=rand&#40;&#41;%ms;
        a&#91;i&#93;&#91;j&#93;=k;
   &#125;
   printf&#40;"emfanish pinaka A\n"&#41;;
   for&#40;i=0; i<ms; i++&#41;
   &#123;
       j<ms; j++&#41;
         printf&#40;"%d\t", a&#91;i&#93;&#91;j&#93;&#41;;
      printf&#40;"\n"&#41;;
   &#125;

  /*dhmioyrgia pinaka B*/
  /* for &#40;i=0; i<ms; ++i&#41;
   &#123;
      for &#40;i=0; i<ms; j++&#41;
      &#123;
          b&#91;i&#93;&#91;j&#93;= rand&#40;&#41; %10;
      &#125;
   &#125;*/
   printf&#40;"emfanish pinaka B\n"&#41;;
   for&#40;i=0; i<ms; i++&#41;
   &#123;
      for&#40;j=0; j<ms; j++&#41;
      &#123;
         printf&#40;"%d\t", b&#91;i&#93;&#91;j&#93;&#41;;
      &#125;
      printf&#40;"\n"&#41;;
   &#125;

/*polaplasiasmos pinakon A*B  */
   for &#40;i = 0; i < ms; i++&#41; &#123;
      for &#40;j = 0; j < ms; j++&#41; &#123;
         c&#91;i&#93;&#91;j&#93; = 0.0;
         for &#40;k = 0; k < ms; k++&#41; &#123;
             c&#91;i&#93;&#91;j&#93; = c&#91;i&#93;&#91;j&#93; + a&#91;i&#93;&#91;k&#93; * b&#91;k&#93;&#91;j&#93;;
         &#125;
      &#125;
   &#125;

   printf&#40;"emfanish pinaka C\n"&#41;;
   for&#40;i=0; i<ms; ++i&#41;
   &#123;
      for&#40;j=0; j<ms; ++j&#41;
         printf&#40;"%3d", c&#91;i&#93;&#91;j&#93;&#41;;
      printf&#40;"\n"&#41;;
   &#125;
   &#125;
[/code]
Συνημμένα
simplemult.c
(1.34 KiB) Μεταφορτώθηκε 114 φορές

Erevis
Δημοσιεύσεις: 56
Εγγραφή: 12 Ιουν 2008 16:31
Τοποθεσία: Χαλάνδρι

Δεικτεσ- δυναμικοι πινακεσ

Δημοσίευση από Erevis » 11 Ιουν 2010 16:30

Οι πίνακες a,b,c που δεσμεύεις είναι μονοδιάστατοι κι εσύ τους χειρίζεσαι ως δισδιάστατους.

JinTonic
Δημοσιεύσεις: 9
Εγγραφή: 11 Ιουν 2010 15:18

Δεικτεσ- δυναμικοι πινακεσ

Δημοσίευση από JinTonic » 11 Ιουν 2010 17:52

Πως πρέπει να τους ορισω για να είνει δισδιάστατοι?

Erevis
Δημοσιεύσεις: 56
Εγγραφή: 12 Ιουν 2008 16:31
Τοποθεσία: Χαλάνδρι

Δεικτεσ- δυναμικοι πινακεσ

Δημοσίευση από Erevis » 11 Ιουν 2010 19:56


JinTonic
Δημοσιεύσεις: 9
Εγγραφή: 11 Ιουν 2010 15:18

Δεικτεσ- δυναμικοι πινακεσ

Δημοσίευση από JinTonic » 12 Ιουν 2010 05:50

Σε ευχαριστώ για την ανταποκριση. εκανα τισ αναλογεσ αλλαγες και δουλεψε. Τώρα θελω να δομήσω τον κώδικα με functions και δεν ξερω πως να περασω τον πινακα στο function. η λογικη μου λεει οτι θα πρεπει να περασω την διευθυνση του πινακα. ετσι ώστε η function να επιστρεφει indirectly ολο τον πινακα. δηλαδη να αλλαξει τισ τιμεσ στην θεση μνημης του πινακα C.

Κώδικας: Επιλογή όλων

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define ms 10
int main&#40;int argc, char *argv&#91;&#93;&#41;
&#123;
int i, j, k;
int **a, **b, **c;
void multiplay_matrix&#40;int &#91;&#93;&#91;&#93;, int &#91;&#93;&#91;&#93;, int &#91;&#93;&#91;&#93;&#41;;
  a = malloc&#40;ms * sizeof&#40;*a&#41;&#41;;
  b = malloc&#40;ms * sizeof&#40;*b&#41;&#41;;
  c = malloc&#40;ms * sizeof&#40;*c&#41;&#41;;
  if&#40;a != NULL||b!= NULL ||c != NULL&#41;
 &#123;
    for&#40;i = 0; i < ms; i++&#41; /* Loop through each row pointer to allocate memory for columns*/
    &#123;
         /* Set p&#91;i&#93; pointer to a block of memory for 'column' number of integers */
         a&#91;i&#93; = malloc&#40;ms * sizeof **a&#41;; /*Here, sizeof&#40;**p&#41; is same as sizeof&#40;int&#41; */
         b&#91;i&#93; = malloc&#40;ms * sizeof **b&#41;;
         c&#91;i&#93; = malloc&#40;ms * sizeof **c&#41;;
         if&#40;a&#91;i&#93; == NULL ||b&#91;i&#93; == NULL ||c&#91;i&#93; == NULL&#41;
         &#123;
             printf&#40;"Memory allocation failed. Exiting...."&#41;; // return 1;
         &#125;
    &#125;
 &#125;
else
 &#123;
        printf&#40;"Memory allocation failed. Exiting...."&#41;; // return 1;
 &#125;
/*feed and display the matrix A */
   printf&#40;"emfanish tyxaioy pinaka A\n"&#41;;
   for&#40;i=0; i<ms; i++&#41;
   &#123;
      for&#40;j=0; j<ms; j++&#41;
      &#123;
         a&#91;i&#93;&#91;j&#93; = rand&#40;&#41; %10;
         printf&#40;"%d\t", a&#91;i&#93;&#91;j&#93;&#41;;
      &#125;
      printf&#40;"\n"&#41;;
   &#125;
/*feed and display the matrix B*/
   printf&#40;"emfanish tyxaioy pinaka B\n"&#41;;
   for&#40;i=0; i<ms; i++&#41;
   &#123;
      for&#40;j=0; j<ms; j++&#41;
      &#123;
         b&#91;i&#93;&#91;j&#93; = rand&#40;&#41; %10;
         printf&#40;"%d\t", b&#91;i&#93;&#91;j&#93;&#41;;
      &#125;
      printf&#40;"\n"&#41;;
   &#125;
/*polaplasiasmos pinakon A*B */
   printf&#40;"emfanish pinaka C\n"&#41;;
   multiplay_matrix&#40;a&#91;&#93;&#91;&#93;, b&#91;&#93;&#91;&#93;, c&#91;&#93;&#91;&#93;&#41;;
 return 0;
&#125;
void multiplay_matrix&#40;int a&#91;&#93;&#91;&#93;, int b&#91;&#93;&#91;&#93;, int c&#91;&#93;&#91;&#93;&#41;
&#123;
   int i, j, k;
   for &#40;i = 0; i < ms; i++&#41;
   &#123;
      for &#40;j = 0; j < ms; j++&#41;
      &#123;
          c&#91;i&#93;&#91;j&#93; = 0;
          for &#40;k = 0; k < ms; k++&#41;
          &#123;
              c&#91;i&#93;&#91;j&#93; = c&#91;i&#93;&#91;j&#93; + a&#91;i&#93;&#91;k&#93; * b&#91;k&#93;&#91;j&#93;;
          &#125;
          printf&#40;"%d\t", c&#91;i&#93;&#91;j&#93;&#41;;
      &#125;
      printf&#40;"\n"&#41;;
   &#125;
&#125;

JinTonic
Δημοσιεύσεις: 9
Εγγραφή: 11 Ιουν 2010 15:18

Δεικτεσ- δυναμικοι πινακεσ

Δημοσίευση από JinTonic » 12 Ιουν 2010 09:23

Τα κατάφερα!! Ευχαριστώ για την συμπαρασταση.
και μονο η αισθηση οτι υπαρχει καποιος που μπορει να με βοηθήσει ενω εχω απελπιστεί μου δινει κουράγιο. Ευχαριστώ.
Η απαντηση δεν ειναι σε κανενα forum απο όσα ειδα.
Πως τα δυναμικά 2D array παιρνιούντε σε function.

Declaration of array and function:

Κώδικας: Επιλογή όλων

int main&#40;int argc, char *argv&#91;&#93;&#41;
&#123;
  int **a;
  void random_matrix&#40;int**&#41;;
//allocate the memory
 a = malloc&#40;ms * sizeof&#40;*a&#41;&#41;;
 a&#91;i&#93; = malloc&#40;ms * sizeof **a&#41;;


Calling the function:

Κώδικας: Επιλογή όλων

   random_matrix&#40;a&#41;;

Function looks like:

Κώδικας: Επιλογή όλων

void random_matrix&#40;int **m&#41;
&#123;
   for&#40;i=0; i<ms; i++&#41;
   &#123;
      for&#40;j=0; j<ms; j++&#41;
      &#123;
            m&#91;i&#93;&#91;j&#93; = rand&#40;&#41; %10;
            printf&#40;"%d\t", m&#91;i&#93;&#91;j&#93;&#41;;
      &#125;
      printf&#40;"\n"&#41;;
  &#125;

Erevis
Δημοσιεύσεις: 56
Εγγραφή: 12 Ιουν 2008 16:31
Τοποθεσία: Χαλάνδρι

Δεικτεσ- δυναμικοι πινακεσ

Δημοσίευση από Erevis » 12 Ιουν 2010 10:06

Καλύτερα έτσι:

Κώδικας: Επιλογή όλων


void doStuff&#40;int **array, unsigned rows, unsigned columns&#41;
&#123;
   unsigned i,j

   for&#40;i = 0; i < rows; ++i&#41;
       for&#40;j = 0; j < columns; ++j&#41;
       &#123;
            //kwdikas
       &#125;
&#125;

ώστε να περνάς το μέγεθος του πίνακα παραμετρικά. Σε αυτή τη συνάρτηση μπορείς να περάσεις μόνο δυναμικό πίνακα, αν πας να περάσεις στατικό θα χτυπήσει ο compiler, γιατί πρέπει να βλέπει τουλάχιστον το πλήθος των γραμμών ή των στηλών στο πρωτότυπο της συνάρτησης.

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης