C - параметр функции float ** не пропускающий значения - PullRequest
0 голосов
/ 12 октября 2018

Я передаю матрицу как плавающий ** указатель на функцию, и единственное, что делает эта функция, это печатает элементы, которые находятся в матрице, на которую указывает указатель.Однако все элементы равны 0 в операторе печати.Я подозреваю, что правильно инициализировал указатель xadjm.

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

void which(float **adj_mat, int n) {
  for (int tt=0; tt<n; tt++) {
    for (int cc=0; cc<n; cc++) {
      if (cc==(n-1)) {
        printf("%f-\n", *(adj_mat+tt*n+cc));
      } else {
        printf("%f-", *(adj_mat+tt*n+cc));
      }
    }
  }
}


int main() {
  int n=5;
  float adjm[5][5] = {{0.0, 1.0, 1.0, 0.0, 0.0}, {1.0, 0.0, 0.0, 1.0, 0.0}, {1.0, 0.0, 0.0, 1.0, 0.0}, {0.0, 1.0, 1.0, 0.0, 1.0}, {0.0, 0.0, 0.0, 1.0, 0.0}};
  float **xadjm = (float**) adjm;
  which(xadjm, n);

  return(0);
}

Вывод выполненного кода:

0.000000-0.000000-0.000000-0.000000-0.000000-
0.000000-0.000000-0.000000-0.000000-0.000000-
0.000000-0.000000-0.000000-0.000000-0.000000-
0.000000-0.000000-0.000000-0.000000-0.000000-
0.000000-0.000000-0.000000-0.000000-0.000000-

1 Ответ

0 голосов
/ 12 октября 2018

Вы выполняете неверное приведение.

Вы пытаетесь преобразовать float[5][5] в float **.В то время как массивы затухают до указателя на его первый элемент, это only применяется к самому внешнему измерению массива. не применяется к внутренним измерениям.

Однако вы можете указать размеры массива в списке параметров на which:

void which(int n, float adj_mat[n][n]) {

Тогда вы можете назвать это так:

which(n, adjm);

Вы также печатаете неправильно:

  if (cc==(n-1)) {
    printf("%f-\n", *(adj_mat+tt*n+cc));
  } else {
    printf("%f-", *(adj_mat+tt*n+cc));
  }

Выражение *(adj_mat+tt*n+cc) дает вам float *, а не float,Вместо этого сделайте следующее:

  if (cc==(n-1)) {
    printf("%f-\n", adj_mat[tt][cc]);
  } else {
    printf("%f-", adj_mat[tt][cc]);
  }
...