Функция умножения матрицы не будет компилироваться внутри основного

#c

#c

Вопрос:

Это простое умножение матрицы, код не будет компилироваться. Я также хочу вывести функцию наружу. Я знаю, что у меня должны быть глобальные переменные и объявление функции, но код даже не будет компилироваться внутри main.

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

#define N 10

float *A[N], *B[N], *C[N];



int main(){

  int count = 0, i,j, k;


  for (i = 0; i < N; i  )
    A[i] = (float*)malloc(N * sizeof(float));
  for (i = 0; i < N; i  )
    B[i] = (float*)malloc(N * sizeof(float));
  for (i = 0; i < N; i  )
    C[i] = (float*)malloc(N * sizeof(float));


   for (i = 0; i <  N; i  )
     for (j = 0; j < N; j  ){
        A[i][j] =   count;
        B[i][j] = count;
        }

    void multiply(float* A, float* B, int n) {
       for(int i=0; i<n; i  )
         for(int j=0; j<n; j  )
           for(int k=0; k<n; k  )
             C[i][j]  = A[i][k] * B[k][j];
    }

          for (i = 0; i <  N; i  )
            for (j = 0; j < N; j  )
              printf("%ft", C[i][j] );

}
 

Комментарии:

1. вы не можете определить метод внутри другого метода, удалить строку с void multiplay и конечную закрывающую скобку

2. multiply является вложенной функцией. Хотя это возможно , это продвинутый метод [и редко используется в c коде]. Кроме того, вы определяете функцию, но на самом деле не вызываете ее. Итак, он ничего не делает. Переместите определение multiply в область действия файла [выше main ] — вы будете рады, что сделали это. И добавьте к нему вызов в main

3. C не указывает функцию, определенную внутри другой.

4. @pavel.lazar Функция может быть объявлена внутри другой. Именно определение функции внутри другой является проблемой.

5. Махан Ага Захеди: «Я знаю, что у меня должны быть глобальные переменные» -> Глобальные переменные здесь не требуются.

Ответ №1:

Ваше определение функции умножения внутри main делает ее вложенной функцией, которая не разрешена в C. Вы можете вызвать столько функций внутри функции, но не можете определить новую функцию внутри уже существующей. Кроме того, вы также не вызвали функцию умножения.

Ответ №2:

A , B и C определены вверху как глобальные, как массив указателей на float

внутри вашей функции умножения вы локально переопределили их как указатель на значение с плавающей точкой..

вот почему умножение не выполняется внутри multiply. вы притворяетесь, что A и B — это массивы указателей, которые нужно снова перемещать .. и они были локально определены как указатели на float .

Делает ли это то, что вы ожидали?

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

#define N 10

float *A[N], *B[N], *C[N];

void multiply( float *a[], float *b[], float *c[], int n ) 
{
    for(int i=0; i<n; i  )
        for(int j=0; j<n; j  )
           for(int k=0; k<n; k  )
                c[i][j]  = (a[i][k]) * b[k][j];
}


int main(){

  int count = 0, i,j, k;


  for (i = 0; i < N; i  )
    A[i] = (float*)malloc(N * sizeof(float));
  for (i = 0; i < N; i  )
    B[i] = (float*)malloc(N * sizeof(float));
  for (i = 0; i < N; i  )
    C[i] = (float*)malloc(N * sizeof(float));


   for (i = 0; i <  N; i  )
     for (j = 0; j < N; j  )
     {
        A[i][j] =   count;
        B[i][j] = count;
     }
     
    multiply(A,B, C, N);


    for (i = 0; i <  N; i  )
        for (j = 0; j < N; j  )
            printf("%ft", C[i][j] );

}
 

если да, пожалуйста, объясните мне, как это работает

Комментарии:

1. то, что я пытался сделать, это создать 2D-массив путем создания массива указателей. Не могли бы вы, пожалуйста, провести меня через это, я собираюсь заняться линейной алгеброй, поэтому мне действительно нужно освоить эту обработку нескольких массивов на C.

2. Да, именно так! и если я хочу вернуть матрицу вместо функции void, как мне это сделать?