Как установить все 0 в массив, объявленный через структуру (C)? - PullRequest
0 голосов
/ 29 ноября 2018

, когда я практиковался в программировании на C, я обнаружил проблему с массивами со структурами.В частности, я собираюсь сделать программу для работы с различными полиномами;поэтому я объявил структуру «Pol», которая содержит переменную «порядок» и массив «коэффициенты».Затем я собираюсь сделать операции с полиномами (например, сумма между двумя из них).Проблема заключается в том, как объявить массив «коэффициентов» в структуре, потому что, когда я хочу сложить два полинома, я хочу установить все элементы массива в 0 (чтобы решить проблему с суммой двух полиномов с разным порядком).).Я знаю, как установить 0 в массив, объявленный в основной функции (установка одного значения в 0, а затем все остальные автоматически устанавливаются в 0).Но как я могу сделать то же самое со структурой?

Заранее благодарю всех, кто собирается мне помочь.

Я публикую код (не законченный) ниже:

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

#define N_MAX 100

typedef struct
{
  float coefficients[N_MAX];
  int order;
} Pol;

void println(int n);
void readPol(Pol* pol);

int main(int argc, char const *argv[])
{
  Pol p1, p2, pS;

  readPol(&p1);
  return 0;
}

void readPol(Pol* pol)
{
  printf("Polynomial order: ");
  scanf("%d", &pol->order);
  println(1);

  for(int i = pol->order; i >= 0; i--)
    {
      printf("Coefficient of x^[%d]: ", i);
      scanf("%f", &pol->coefficients[i]);
    }
}

void println(int n)
{
  for(; n > 0; n--)
    printf("\n");
}

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

Вы можете инициализировать каждый байт переменной с помощью memset.

memset(&p1, 0, sizeof(Pol))
0 голосов
/ 29 ноября 2018

... хотите установить для всех элементов массива значение 0

Для инициализации (присваивания во время объявления), различные варианты.

Pol pol1 = { .order = 0, .coefficients = { 0 } };    // Declare members in desired order
Pol pol2 = { .coefficients = { 0 }, .order = 0 };
Pol pol3 = { .order = 0, .coefficients = { 0.0f } }; // A float constant for clarity
Pol pol4 = { { 0.0f }, 0 };                          // Order matches declaration 
Pol pol5 = { 0 };                                    // All set to 0

Обратите внимание, что при частичной явной инициализации остальные члены / элементы массива получают значение 0.(0 для целочисленных типов, 0,0 для FP, типов, некоторые нулевой указатель для типов указателей.)

В C нет частичной инициализации, все или ничего.


Чтобы назначить , прямое решение - использовать цикл.

pol->order = 0;
for(i = 0; i < N_MAX; i++) {
  pol->coefficients[i] = 0.0f;
}

Но почему?Все, что нужно для кода:

pol->order = 0;
pol->coefficients[0] = 0.0f;

Смысл наличия члена .order состоит в том, чтобы масштабировать работу до используемого размера массива, как это сделано в readPol(Pol* pol) и println(int n).Не тратить время на назначение неиспользуемых элементов массива.

0 голосов
/ 29 ноября 2018

Синтаксис для инициализации структуры аналогичен тому, как инициализируется массив.Вы указываете инициализаторы в порядке, помещая скобки вокруг любых вложенных инициализаторов:

Pol p1 = { { 0 }, 0 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...