печать массива структур - PullRequest
2 голосов
/ 07 марта 2012
void print(part *item, int part_count) {
    int i=0;

    for (i=0; i<part_count; i++) {
       printf("Item number: %d\n", i + 1);
       printf("Item name: %s\n", item[i].name);
       printf("Item price: $%f\n", item[i].price);
       printf("Item quantity: %d\n", item[i].quantity);
    }
}

Я хочу напечатать массив структур, созданных с помощью другой функции. Я посмотрел, но еще не нашел другого способа напечатать их или что я делаю неправильно в заявлениях печати. Моя программа компилируется, но вылетает при запуске.

хорошо, хорошо, что проблема не в этих утверждениях. Это меня расстраивало. вот функция добавления.

void add(part *item, int *part_count)
 {
      if (!item)
      {
         item = malloc(sizeof(part));
      }

      item = realloc(item, sizeof(part) * *part_count + 1);

      item[*part_count].name = malloc(sizeof(char)*64); // max of 64 characters

      printf("Please enter item name: ");
      scanf("%65s", item[*part_count].name);

      printf("Please enter item price: ");
      scanf("%f", &item[*part_count].price);

      printf("Please enter item quantity: ");
      scanf("%d", &item[*part_count].quantity);

      *part_count = *part_count+ 1;
 }

Ответы [ 5 ]

1 голос
/ 28 марта 2012
void add(part **item, int *part_count)
{
  char temp[100];

  if (!(*item)){
   //printf("first alloc\n");
       *item = malloc(sizeof(part)*3);
  }
  else if (*part_count>= 3){
  //printf("realloc\n");
      *item = realloc(*item, sizeof(part) * (*part_count + 1));
  }

  item[0][*part_count].name = malloc(sizeof(char)*100); // max of 100 characters

  printf("Please enter item name: \n");
  fgets(temp, 100, stdin);     
  strcpy(item[0][*part_count].name, temp);      


  printf("Please enter item price: \n");
  fgets(temp, 100, stdin);
  sscanf(temp, "%f", &item[0][*part_count].price);      


  printf("Please enter item quantity: \n");
  fgets(temp, 100, stdin);
  sscanf(temp, "%d", &item[0][*part_count].quantity);   


  *part_count = *part_count+ 1;
}

Это закончилось этим. Не уверен, что использование **struct было необходимо, но это был единственный метод, с которым я мог работать.

1 голос
/ 07 марта 2012

item, будучи аргументом add, является локальным для этой функции.Поэтому, когда вы изменяете его, это не влияет на переменную, которую вы передали ему.Чтобы вернуть измененный указатель item, вам нужно передать указатель на него (указатель на указатель):

void add(part **item, int *part_count)

Затем используйте *item (или (*item)) везде, где выв настоящее время используется item в пределах add

0 голосов
/ 07 марта 2012

Петля выглядит правильно построенной.Это говорит о том, что проблема заключается либо в том, как строятся данные, либо в проблемах с аргументами, которые отправляются этой функции.

0 голосов
/ 07 марта 2012

Вы должны написать свою функцию как

void print (part item [], int item_count) {... ...}

И в вызове вашей функции: print (item,е)

0 голосов
/ 07 марта 2012

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

  • Вы нарушаете API какой-либо функции, передавая ей неправильно набранные аргументы или неверное количество аргументов
  • Вы пытаетесь разыменовать или назначить через указатель на несуществующую память.

Я настоятельно рекомендую вам попробовать следующее:

  • Сначала скомпилируйте вашу программу (предполагая, что это gcc) с -Wall -Werror, обратите внимание на все сообщения об ошибках, которые вы получаете, и исправьте их все.
  • Во-вторых, попробуйте проверить трассировку стека дампов ядра, которые вы получаете с помощью gdb - это точно скажет вам, где произошла ошибка вашей программы, по крайней мере, если вы скомпилируете с -g
  • В-третьих, попробуйте запустить систему, подобную Valgrind, которая предназначена для поиска и диагностики ошибок памяти.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...