2012-06-24 3 views
0

Я прошу указать d->id, но если я попрошу более одного, все элементы списка получат последний.Каждый элемент структуры получает последнее значение, которое пользователь вводит в

Например, если for имеет 2 итераций и novo->prato[0] является "M1" (это предлагается пользователю) и novo->prato[1]"M3" это, обе позиции остаться "M3". Зачем?

Вот код:

typedef struct pedido pedido, *ppedido; 
typedef struct prato prato, *pprato; 

struct pedido{ 
    char id[5]; 
    int prioridade; 
    int mesa, n_pratos; 
    pprato prato[TAM]; 
    ppedido prox; 
}; 

struct prato{ 
    char id[5]; 
}; 

int verifica_prato(ppedido p,int j) 
{ 
    FILE *f; 
    struct item aux; 

    int i=0; 

    f = fopen("menu.bin", "rb"); 
    if(f == NULL){printf("O sistema nao consegue aceder a memoria");return;} 

    while((fread(&aux, sizeof(struct item), 1, f)) == 1){ 
     if((strcmp(p->prato[j]->id, aux.id)) == 0) 
      i++; 
    } 
    fclose(f); 

    if(i == 0){ 
    printf("Prato nao existe no menu.\n"); 
    return 1; 
     } 

    if(i > 1) 
    return 0; 
} 


for(i=0;i<novo->n_pratos;i++){ 
     do{ 
      printf("ID do prato %d: ", i+1); 
      scanf("%s", &d->id); 
      novo->prato[i] = d; 
      k = verifica_prato(novo,i); 

     }while(k != 0); 
    } 
+0

Что такое "d"? Вы должны попытаться обеспечить минимальный (то есть без всех бесполезных структурных полей и логики проверки), компилируемый пример вашей проблемы. – hugomg

+0

Это все. Я забыл поставить его на этот пост. Сожалею. pprato d; \t \t d = (struct prato *) malloc (sizeof (prato)); –

+0

Я не думаю, что так ... –

ответ

1

Вы присваиваете указатель на структуру d когда вы делаете novo->prato[i] = d, поэтому каждый раз, когда вы вносите изменения в d это будет отражено в novo->prato[i] поскольку все значения в Прато массив указывает на тот же адрес, то есть d.

Я не совсем уверен, что вы намерены делать, но один способ может быть в malloc d каждый раз в цикле, прежде чем запрашивать у пользователя ввод. Помните, что вам также необходимо заглянуть в «освобождение» памяти prato[i].

+0

это работает! Спасибо тебе, друг! : D –

Смежные вопросы