Доступ к массиву указателей внутри указателя - PullRequest
1 голос
/ 13 марта 2020

Я хочу создать метод с именем add_order , чтобы добавить новый заказ в массив существующих заказов. Первые 3 строки в основном работают нормально, до этого момента я понимаю указатели, но с методом add_order я борюсь с ним, он также не работает в printf. Как я могу получить доступ к массиву указателей внутри указателя?

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

typedef struct {
  int count;
  char type;
} *pizza;

typedef struct {
  int courier;
  int day;
  pizza p;
} *order;

typedef struct {
  order orders;
  int orderCount;
} *monthlyorders;

monthlyorders new_monthlyorders(order o) {
  monthlyorders m = malloc(sizeof(monthlyorders));
  m->orders = malloc(sizeof(order));
  m->orders = o;
  m->orderCount = 0;
  return m;
}

order new_order(int courier, int day, pizza p) {
  order o = malloc(sizeof(order));
  o->courier = courier;
  o->day = day;
  o->p = malloc(sizeof(pizza));
  o->p = p;
  return o;
}

pizza new_pizza(int count, char type) {
  pizza pizza = malloc(sizeof(pizza));
  pizza->count = count;
  pizza->type = type;
  return pizza;
}

monthlyorders add_order(monthlyorders m, order o) {
  m->orderCount = (m->orderCount)+1;
  (*(m->orders+1)) = malloc(sizeof(order));
  return m;
}

int main() {

  pizza p = new_pizza(2, 'A');
  order o = new_order(1, 1, p);
  monthlyorders m = new_monthlyorders(o);

  add_order(m, o);

  printf("%i\n", (*(m->orders+1)));

  return 0;
}

1 Ответ

1 голос
/ 13 марта 2020

Вы просто должны правильно использовать указатели. Скорее всего, вы забыли сделать «заказы» в качестве указателя. Дайте мне знать, если это решит вашу проблему:

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

typedef struct {
  int count;
  char type;
} *pizza;

typedef struct {
  int courier;
  int day;
  pizza p;
} *order;

typedef struct {
  order * orders; // order * orders -> create a pointer
  int orderCount;
} *monthlyorders;

order new_order(int courier, int day, pizza p) {
  order o = malloc(sizeof(order));
  o->courier = courier;
  o->day = day;
  o->p = malloc(sizeof(pizza));
  o->p = p;
  return o;
}

pizza new_pizza(int count, char type) {
  pizza pizza = malloc(sizeof(pizza));
  pizza->count = count;
  pizza->type = type;
  return pizza;
}

monthlyorders add_order(monthlyorders m, order o) {
  *(m->orders + m->orderCount) = o;
  m->orderCount++;
  return m;
}

monthlyorders new_monthlyorders(order o) {
  monthlyorders m = malloc(sizeof(monthlyorders));
  m->orders = malloc(1000); // You might need more cases (eg. 10000? )
  m->orderCount = 0;
  return add_order(m,o);
}

int main() {

  pizza p = new_pizza(2, 'A');
  order o = new_order(1, 1, p);
  monthlyorders m = new_monthlyorders(o);


  // Test cases
  order o2 = new_order(2, 1, p);
  add_order(m, o2);

  // You might want to print out data from your object rather than the object itself
  printf("%i\n", (*(m->orders))->courier);
  printf("%i\n", (*(m->orders))->day);
  printf("%i\n", (*(m->orders + 1))->courier);
  printf("%i\n", (*(m->orders + 1))->day);
  // Don't forget to free it
  free(m->orders);

  return 0;
}

РЕДАКТИРОВАТЬ: Подумайте о том, чтобы сделать то, что сказал Ян: замените

order o = malloc(sizeof(order)); 

на

order o = malloc(sizeof(*o)); 

и аналогично для другие звонки c

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