Как я могу обобщить этот макрос, который я использую для указания длины вектора? - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть два кода: vector_add.c и vector_print.c.Оба требуют, чтобы я назначил длину вектора N как макрос, используя #define N (3), где 3 - длина.Я согласен с этим для vector_add.c, но я не хочу обобщать vector_print.c для работы с любой длиной вектора, а затем просто назначить длину вектора позже в другом коде.Я пытался использовать #undef N по-разному, но не смог заставить его работать.

У кого-нибудь есть какие-либо предложения о том, как я могу обобщить мою функцию vector_print для работы с любой длиной вектора, N ?Сейчас я просто использую #define N (3) для обоих файлов, что прекрасно работает для вектора длины 3. Но я не хочу явно назначать длину вектора в vector_print.c.Я хочу, чтобы он работал для любых N !

Это vector_add.c:

#include <vector_print.h>
#include <stdio.h>

// vector length (fixed)

#define N (3)

// ----------------------------------------------------------------------
// vector_add
//
// returns the linear sum of the two vectors and puts them in another
// x: first vector
// y: second vector
// z: solution vector

void
vector_add(double *x, double *y, double *z)
{
  for (int i = 0; i < N; i++) {
    z[i] += x[i] + y[i];
  }
}

// ----------------------------------------------------------------------
// main
//
// test the vector_add() function

int
main(int argc, char **argv)
{
  double x[N] = { 1., 2., 3. };
  double y[N] = { 2., 3., 4. };
  double z[N] = {0.,0.,0.};
  vector_add(x, y, z);

  printf("x is ");
  vector_print(x);
  printf("y is ");
  vector_print(y);
  printf("z is ");
  vector_print(z);

  return 0;
}

Это vector_print.c:

#include <stdio.h>

// vector length (fixed)

#define N (3)

// ----------------------------------------------------------------------
// vector_print
//
// prints the elements of an N-element array
// name: name of vector to print

void
vector_print(double *name)
{
  for (int i = 0; i < N; i++) {
    printf("%g ", name[i]);
  }
  printf("\n");
}

А если надо, то вот vector_print.h:

#ifndef VECTOR_PRINT_H
#define VECTOR_PRINT_H

void vector_print(double *name);

#endif

1 Ответ

0 голосов
/ 16 февраля 2019

Просто передайте решение в комментариях.

Что вы можете сделать, это передать длину следующим функциям:

void vector_print(double *name, int len);
void vector_add(double *x, double *y, double *z, int len);

Это позволит вам контролировать цикл следующим образом.:

  for (int i = 0; i < len; i++) { // Note: i < len now, not N
    printf("%g ", name[i]);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...