Jeevan83 Ответов: 2

ожидаемое выражение перед токеном ‘{’


Привет, я получил его ошибку после компиляции. Я не мог найти ошибку, в чем ошибка, пожалуйста?
ошибка:
ошибка: ожидаемое выражение перед токеном ‘{’
пункт[0]={"рис",10,40,30};

#include<stdio.h>
#include<stdlib.h>
#define ITEMLIMIT 7
#define NOOFITEM  3

struct item_info
{
      char itemname[15];
      int quantity;
      float retail;
      float wholesale;
      //int quatityonorder;
 }item[NOOFITEM];

int main()
{
       item[0]={"rice",10,40,30};
       // item[1]={"sugar",10,40,30};
       // item[2]={"soap",10,40,30};
      int choice = 0,i=0,quantity=0;
      char *itemname;
      printf("item name\t quantity\t retailsprice\t wholesaeprice\t");

     for(i=0;i<NOOFITEM;i++)
          {
          printf("%s\t %d\t %f\t %f\t",item[i].itemname,item[i].quantity,item[i].retail,item[i].wholesale);
           }

    printf("enter the item which u want\n");
        scanf("%[^\n]s",itemname);

     for(i=0;i<NOOFITEM;i++)
        {
            if(strcmp(item[i].itemname,itemname)==0);
      {
                   printf("%s is %d the item in our stock",itemname,i);
        }

        puts("*** checking for item availabiity ****");
        if(item[i].quantity<0)
     {

         puts("item is out of stock");
     }

         else if(item[i].quantity>0)
         {
             printf("quantity of %s avalable is %d",itemname,item[i].quantity);
         }

    printf("enter quatity you want");
    scanf("%d", &quantity);
     if("item[i].quantity>=ITEMLIMIT")
 
<pre lang="cs">printf("your should pay %f as wholesale price",item[i].wholesale*item[i].quantity);
    }

     else if(item[i].quantity< ITEMLIMIT)
    {
           printf("your should pay %f as retail price",item[i].retail*item[i].quantity);
            item[i].quantity=item[i].quantity-quantity;
    }

    printf("enter 2 to coninue");
    scanf("%d",&choice);

    if(choice==1)

<pre lang="cs">break;
    else if(choice==2)
        continue;
}
}

2 Ответов

Рейтинг:
14

Richard MacCutchan

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

struct item_info
{
      char itemname[15];
      int quantity;
      float retail;
      float wholesale;
      //int quatityonorder;
}item[NOOFITEM] =
{
    {"rice",10,40,30},
    {"sugar",10,40,30},
    {"soap",10,40,30}
};

Но если вы хотите назначить значения во время выполнения, то вам придется сделать это вручную, например:
strcpy(item[0].itemname, "rice");
item[0].quantity = 10;
item[0].retail = 40;
item[0].wholesale = 30;


Maciej Los

+5

Maciej Los

А как насчет указателя на структуру?

Richard MacCutchan

Что?

Maciej Los

Можно ли инициировать структуру с помощью указателя?
item_info *ii;

Richard MacCutchan

Извините, Да, конечно, вы можете либо использовать указатель, увеличивая его через цикл, либо использовать значение индекса. Это просто требует другого синтаксиса, таким образом:

struct item_info* pInfo = item;
strcpy(pInfo->itemname, "rice");
pInfo->quantity = 10;
// etc
pInfo++; // point to next entry

Maciej Los

виртуальный 5!

Jeevan83

Спасибо

Рейтинг:
1

KarstenK

если вы измените его таким образом, он должен компилироваться, но это не лучший способ

struct item_info
{
      char *itemname;
      int quantity;
...


У вас есть проблема, что itemname-это всего лишь указатель, и вам нужно выделить и освободить его. И как-нибудь справится.

Я бы написал "сеттер"

Set(struct *item_info, char*name, ...)
{
 strncpy( item_info->name, sizeof(item_info->name), name);//check length!!!

...
}


Jeevan83

Спасибо