#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, как мне это сделать?