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

2D πινακας παραμετρος σε συναρτηρη


kotopoulos

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

Δημοσ.

εχω μια εργασια για ενα μαθημα

κ εχω φτιαξει ενα κωδικα για μια μαθηματικη μεθοδο

για να μην τα εχω ολα σε ενα αρχειο εχω το header που εχει μεσα μια συναρτηση που την καλω 3 φορες..

πρεπει να περασω σαν παραμετρους 3πινακες κ ενα ακεραιο.. ο ενας πινακας ειναι δυο διαστασεων κ οι αλλοι απο μια ο καθενας..

πως θα πρεπει να ορισω τη συναρτηση κ πως να την καλεσω μεσα στην μαιν?

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

Δημοσ.

εχω μια εργασια για ενα μαθημα

κ εχω φτιαξει ενα κωδικα για μια μαθηματικη μεθοδο

για να μην τα εχω ολα σε ενα αρχειο εχω το header που εχει μεσα μια συναρτηση που την καλω 3 φορες..

πρεπει να περασω σαν παραμετρους 3πινακες κ ενα ακεραιο.. ο ενας πινακας ειναι δυο διαστασεων κ οι αλλοι απο μια ο καθενας..

πως θα πρεπει να ορισω τη συναρτηση κ πως να την καλεσω μεσα στην μαιν?

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

 

  • Αν κατάλαβα καλά, έχεις ορίσει την function και θέλεις απλώς να την καλέσεις??
  • Έστω πίνακες Array1, Array2, Array3
  • ακέραιος IntNum
  • και όνομα function Func

 

Τότε:

>
int main( void )
{
   ....
   Func( &Array1, &Array2, &Array3, IntNum );
   ....
}

 

Άν φυσικά κατάλαβα καλά το ερώτημά σου ...

Δημοσ.

θελω κ τον ορισμο..

ο ενας πινακας ειναι δυο διαστασεων κ εκει καπου κολλαω..οχι στους μονοδιαστατους

>
#include <stdio.h>
#define N 5

int function (int **a, int *b, int *c, int n);

int main (void)
{
   int a[N][N];
   int b[N], c[N];
   
   function (&a, b ,c, N);
   system("pause");
   exit(0);
}

int function (int **a, int *b, int *c, int n)
{
   int i,j;
   
   for (i=0; i <n; i++)
   {
       for (j=0; j<n; j++)
           printf("a[%d][%d] ", i, j);
       printf("\n");
   }
   printf("\n\n\n");
   for (i=0; i <n; i++)
       printf("b[%d] ", i);
   printf("\n\n\n");

   for (i=0; i <n; i++)
       printf("c[%d] ", i);
   printf("\n\n\n");
   return (n);
}

Δημοσ.

>
#include <stdio.h>
#define N 5

int function (int **a, int *b, int *c, int n);

int main (void)
{
   int a[N][N];
   int b[N], c[N];
   
   function (&a, b ,c, N);
   system("pause");
   exit(0);
}

int function (int **a, int *b, int *c, int n)
{
   int i,j;
   
   for (i=0; i <n; i++)
   {
       for (j=0; j<n; j++)
           printf("a[%d][%d] ", i, j);
       printf("\n");
   }
   printf("\n\n\n");
   for (i=0; i <n; i++)
       printf("b[%d] ", i);
   printf("\n\n\n");

   for (i=0; i <n; i++)
       printf("c[%d] ", i);
   printf("\n\n\n");
   return (n);
}

 

Είσαι εντάξει??

 

>
#include <stdio.h>
#define N 5

int function (int a[N][N], int b[N], int c[N], int n);

int main (void)
{
   int a[N][N];
   int b[N], c[N];

   function (a, b ,c, N);
   system("pause");
   exit(0);
}

int function (int a[N][N], int b[N], int c[N], int n)
{
   int i,j;

   for (i=0; i <n; i++)
   {
       for (j=0; j<n; j++)
           printf("a[%d][%d] ", i, j);
       printf("\n");
   }
   printf("\n\n\n");
   for (i=0; i <n; i++)
       printf("b[%d] ", i);
   printf("\n\n\n");

   for (i=0; i <n; i++)
       printf("c[%d] ", i);
   printf("\n\n\n");
   return (n);
}

Δημοσ.

Συγνώμη αλλά δεν κατάλαβα, αν αναφέρεσαι σε μένα!

 

Σου παρέθεσα τον κώδικα διορθωμένο και τρέχει ... ρώτησα αν είναι αυτό που θες ...

Δημοσ.

Σου παρέθεσα τον κώδικα διορθωμένο και τρέχει ... ρώτησα αν είναι αυτό που θες ...

 

Σε ευχαριστώ πάντως, αλλά τοv έχω ήδη δοκίμασει, τουλάχιστον στο DevC++.

Δημοσ.

Σε ευχαριστώ πάντως, αλλά τοv έχω ήδη δοκίμασει, τουλάχιστον στο DevC++.

 

Εννοείς το κομμάτι που σου παρέθεσα δεν τρέχει?

 

Γιατί στο CodeGear C++ Builder 2010 που το τρέχω, τρέχει μια χαρά!

Δημοσ.

ωραια ολα αυτα απλα το Ν το οριζω στο προγραμμα μεσα κ δεν ξερω ποσο μεγεθος θα εχουν οι πινακες(το Ν δεν το εχω define)

οταν το τρεχω φτανει μεχρι το κομματι που δινω τις τιμες

κ μολις παει να καλεσει την συναρτηση πεταει αυτο:

 

>/cygdrive/C/Program Files/NetBeans 6.9/ide/bin/nativeexecution/dorun.sh: line 33
:  4140 Segmentation fault      (core dumped) sh "${SHFILE}"

 

>#include <stdio.h>
#include <stdlib.h>
#include "Gauss.h"

void Gauss(double **aa, int n, double *bb, double *tmp);

int main(int argc, char** argv) {
   int i, j,N;
   double **a;
   double **help;
   double *help1;
   double *b;
   double *x;
   double *y;
   double *z;
   printf("Δωσε Το Μεγεθος Του Πινακα\n");
   scanf("%d", &N);
   a = (double **) malloc(N * sizeof (double *));
   help = (double **) malloc(N * sizeof (double *));
   if (NULL == a) {
       free(a);
       printf("Memory allocation failed while allocating for a[].\n");
       exit(-1);
   }
   for (i = 0; i < N + 1; i++) {
       a[i] = (double *) malloc(N * sizeof (double));
       help[i] = (double *) malloc(N * sizeof (double));
       if (NULL == a[i]) {
           free(a[i]);
           printf("Memory allocation failed while allocating for a[i][].\n");
           exit(-1);
       }
   }
   b = (double *) malloc(N * sizeof (double *));
   x = (double *) malloc(N * sizeof (double *));
   y = (double *) malloc(N * sizeof (double *));
   z = (double *) malloc(N * sizeof (double *));
   help1 = (double *) malloc(N * sizeof (double *));
   for (i = 0; i < N; i++) {

       printf("\nΔωσε τιμες για τη γραμμη Α[%d] \n", i + 1);
       for (j = 0; j < N; j++) {
           scanf("%lf", &a[i][j]);
           help[i][j] = a[i][j];
       }
       printf("\nΔωσε τιμες για το Β[%d] \n", i + 1);
       scanf("%lf", &b[i]);
       help1[i] = b[i];
   }
   Gauss(&a[N], N, b, x);
   for (i = 0; i < N; i++) {
       for (j = 0; j < N; j++) {
           a[i][j] = help[i][j];
       }
       b[i] = help1[i];
   }
   Gauss(&a[N], N, b, y);
   for (i = 0; i < N; i++) {
       for (j = 0; j < N; j++) {
           a[i][j] = help[i][j];
       }
       b[i] = help1[i];
   }
   Gauss(&a[N], N, b, z);
   for (i = 0; i < N; i++) {
       for (j = 0; j < N; j++) {
           a[i][j] = x[i];
           a[i][j] = y[i];
           a[i][j] = z[i];
       }
   }
   for (i = 0; i < N; i++) {
       for (j = 0; j < N; j++) {
           printf("%lf\n", &a[i][j]);
       }
   }
   return (EXIT_SUCCESS);
}

 

>#include <stdio.h>
#include <math.h>
#include <stdlib.h>

void Gauss(double **aa, int n, double *bb, double *tmp) {
   int i, j, k, r, thesi, swap = 0, z, zz;
   double sum, ao, max, temp;
   double *x;

   for (i = 0; i < n; i++) {
       for (z = 0; z < n; z++) {
           printf("%5.2lf ", aa[zz][z]);
       }
       printf("%5.2lf%5.2lf\n", bb[zz], x[zz]);
   }

   // Απαλοιφη Gauss
   for (i = 0; i < n - 1; i++) {
       max = fabs(aa[i][i]);
       thesi = i;
       for (j = i + 1; j < n; j++) {
           if (max < fabs(aa[j][i])) {
               max = fabs(aa[j][i]);
               thesi = j;
           }
       }
       if (thesi > i) {
           swap += 1;
           for (j = i; j < n; j++) {
               temp = aa[thesi][j];
               aa[thesi][j] = aa[i][j];
               aa[i][j] = temp;
           }
           temp = bb[thesi];
           bb[thesi] = bb[i];
           bb[i] = temp;
       }

       for (j = i + 1; j < n; j++) {
           ao = aa[j][i] / aa[i][i];
           for (k = 0; k < n; k++) {
               aa[j][k] = aa[j][k] - ao * aa[i][k];
           }
           bb[j] = bb[j] - ao * bb[i];
       }
   }


   //Πισω Αντικατασταση
   printf("\n\t\tΠισω Αντικατασταση\n\n");
   x[n - 1] = bb[n - 1] / aa[n - 1][n - 1];
   for (i = n - 1; i>-1; i--) {
       x[i] = (bb[i]-(aa[i][n] * x[n])) / aa[i][i];
       sum = 0;
       for (j = i + 1; j < n; j++) {
           sum = sum + aa[i][j] * x[j];
       }
       x[i] = (bb[i] - sum) / aa[i][i];
   }

}

Δημοσ.

Εννοείς το κομμάτι που σου παρέθεσα δεν τρέχει?

 

Γιατί στο CodeGear C++ Builder 2010 που το τρέχω, τρέχει μια χαρά!

 

Όλα είναι ΟΚ, απλά έφτιαξα ένα χαζό πρόγραμμα για να δείξω στο παλικάρι πως το χρησιμοποιώ εγώ.

Δημοσ.

ο κωδικας απο το header εχει ενα λαθος αλλα δεν εχει να κανει με το προβλημα...

απλα ξεχασα να σβησω τον πινακα χ κ στην θεση τ να βαλω τον tmp..

αλλα κ παλι δεν τρεχει..

Δημοσ.

ο κωδικας απο το header εχει ενα λαθος αλλα δεν εχει να κανει με το προβλημα...

απλα ξεχασα να σβησω τον πινακα χ κ στην θεση τ να βαλω τον tmp..

αλλα κ παλι δεν τρεχει..

 

ο κώδικας σου σκάει σε αυτό το σημείο της συνάρτησης Gauss:

>
   for (i = 0; i < n; i++) {
       for (z = 0; z < n; z++) {
           printf("%5.2lf ", aa[zz][z]);
       }
       printf("%5.2lf%5.2lf\n", bb[zz], x[zz]);
   }

 

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

Επίσης χρησιμοποιείς τον πίνακα x, χωρίς να έχεις δεσμεύσει καθόλου μνήμη απο πριν.

Δημοσ.

το ζζ καπου μου εχει ξεφυγει αλλα δεν ειναι προβλημα γιατι το συγκεκριμενω απλα μια εκτυπωση τον τιμων κανει(+ οτι το εχω σβησει απο τον κωδικα μ τωρα)

οπως κ τον πινακα χ γιατι στη θεση του χρησιμοποιω των tmp..

τωρα ετσις οπως το εχω δουλευει εκτος του οτι οι τιμες των πινακαων χ,Υ,ζ δεν περνιουνται στον πινακα στο τελος ..

για να γινω πιο ξεκαθαρος!καλω την συναρτηση τρεις φορες με την μονη διαφορα τον τελευταιο πινακα(χ,Υ,ζ) που ειναι κενοι

κ στην συναρτηση αυτοι οι πινακες περνουν τιμες στο τελος της τελευταιας κλησεις περναω τις τιμες των τριων αυτων πινακων στον α

κ τον εμφανιζω..αλλα απο οτι βλεπω εχει παρει μηδενικες τιμες οπως δηλαδη ειχαν οι πινακες απο τον ορισμο τους(το κανω στην αρχη του κωδικα)

Δημοσ.

εκανα επεξεργασια το τελευταιο μ ποστ για να μην το βαζω παλι κ γεμιζει τσαμπα...

το βρηκα επιτελους κ ολα δουλευουν ρολοι :)

το προβλημα που δεν εμφανιζε σωστα τις τιμες ηταν ενα "&" στην πριντφ που δεν επρεπε να ηταν εκει :)

ευχαριστω οσους βοηθησαν.. :)

ο κωδικας ειναι για να βρισκει τον αντιστροφο ενος πινακα με χρηση της απαλοιφης Gauss

για οποιον τον θελει μπορει να τον παρει κ να τον χρησιμοποιηση αλλα ας πει κ ενα ευχαριστω για τον κοπο μ :P

 

>#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 3
void Gauss(double aa[N][N], int n, double tmp[N], int stp);

int main(int argc, char** argv) {
   int i, j, step = 0;
   double a[N][N], help[N][N],b[N], x[N], y[N], z[N];
   /*double **a;
   double **help;        
   double *x;
   double *y;
   double *z;
   printf("Δωσε Το Μεγεθος Του Πινακα\n");
   scanf("%d", &N);
  a = (double **) malloc(N * sizeof (double *));
   help = (double **) malloc(N * sizeof (double *));
   if (NULL == a) {
       free(a);
       printf("Memory allocation failed while allocating for a[].\n");
       exit(-1);
   }
   for (i = 0; i < N + 1; i++) {
       a[i] = (double *) malloc(N * sizeof (double));
       help[i] = (double *) malloc(N * sizeof (double));
       if (NULL == a[i]) {
           free(a[i]);
           printf("Memory allocation failed while allocating for a[i][].\n");
           exit(-1);
       }
   }
   x = (double *) malloc(N * sizeof (double *));
   y = (double *) malloc(N * sizeof (double *));
   z = (double *) malloc(N * sizeof (double *));
   help1 = (double *) malloc(N * sizeof (double *));
    */
   for (i = 0; i < N; i++) {
       printf("\nΔωσε τιμες για τη γραμμη Α[%d] \n", i + 1);
       for (j = 0; j < N; j++) {
           scanf("%lf", &a[i][j]);
           help[i][j] = a[i][j];
       }
       x[i] = 0;
       y[i] = 0;
       z[i] = 0;
   }
   Gauss(a, N, x, step);
   for (i = 0; i < N; i++) {
       for (j = 0; j < N; j++) {
           a[i][j] = help[i][j];
       }        
   }
   step++;
   Gauss(a, N, y, step);
   for (i = 0; i < N; i++) {
       for (j = 0; j < N; j++) {
           a[i][j] = help[i][j];
       }
   }
   step++;
   Gauss(a, N, z, step);
   for (i = 0; i < N; i++) {        
           a[i][0] = x[i];
           a[i][1] = y[i];
           a[i][2] = z[i];
   }
   for (i = 0; i < N; i++) {
       //printf("%lf\n",x[i]);
      for (j = 0; j < N; j++) {
           printf("%lf\t", a[i][j]);
       }
      printf("\n");
   }
   return (EXIT_SUCCESS);
}

void Gauss(double aa[N][N], int n, double tmp[N], int stp) {
   int i, j, k, r, thesi, swap = 0, z, num = 0;
   double sum, ao, max, temp;
   double bb[N];
   while (num < N) {
       if (stp == num) {
           bb[num] = 1;
       } else {
           bb[num] = 0;
       }
       num++;
   }
   /*for (i = 0; i < n; i++) {
       for (z = 0; z < n; z++) {
           printf("%5.2lf ", aa[i][z]);
       }
       printf("%5.2lf%5.2lf\n", bb[i], tmp[i]);
   }
    */

   // Απαλοιφη Gauss
   for (i = 0; i < n - 1; i++) {
       max = fabs(aa[i][i]);
       thesi = i;
       for (j = i + 1; j < n; j++) {
           if (max < fabs(aa[j][i])) {
               max = fabs(aa[j][i]);
               thesi = j;
           }
       }
       if (thesi > i) {
           swap += 1;
           for (j = i; j < n; j++) {
               temp = aa[thesi][j];
               aa[thesi][j] = aa[i][j];
               aa[i][j] = temp;
           }
           temp = bb[thesi];
           bb[thesi] = bb[i];
           bb[i] = temp;
       }

       for (j = i + 1; j < n; j++) {
           ao = aa[j][i] / aa[i][i];
           for (k = 0; k < n; k++) {
               aa[j][k] = aa[j][k] - ao * aa[i][k];
           }
           bb[j] = bb[j] - ao * bb[i];
       }
   }


   //Πισω Αντικατασταση    
   tmp[n - 1] = bb[n - 1] / aa[n - 1][n - 1];
   for (i = n - 1; i>-1; i--) {
       tmp[i] = (bb[i]-(aa[i][n] * tmp[n])) / aa[i][i];
       sum = 0;
       for (j = i + 1; j < n; j++) {
           sum = sum + aa[i][j] * tmp[j];
       }
       tmp[i] = (bb[i] - sum) / aa[i][i];
   }    
}

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

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

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