Erro críptico em c

Jeust

Power Member
Bem malta ando a fazer uma aplicação involvendo listas ligadas e ao compilar apareceu-me este erro críptico...

bonus.h:9: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘=’ token


o ficheiro bonus.h é este

Código:
#ifndef BONUS_H 
#define BONUS_H

#include "maindef.h"
#include <stdlib.h>

typedef struct node
{
    int id, resneed[Max_Res]={0}, min_tech=0, min_litr=0;
    struct node *next=NULL;

} BNode, *Ptr_BNode;

Ptr_BNode head = NULL;
Ptr_BNode last = NULL; 

void initNode(Ptr_BNode p, int id);
void addNode(Ptr_BNode p, Ptr_BNode last);

void correction(Ptr_BNode p, int t, int l); 

#endif
sendo o header file deste ficheiro - bonus.c

Código:
#include "bonus.h"

void initNode(Ptr_BNode p, int id);
void addNode(Ptr_BNode p, Ptr_BNode last);

void correction(Ptr_BNode p, int t, int l); 


void initNode(Ptr_BNode p, int id)
{
    p->id = id;
}

void  addNode(Ptr_BNode p, Ptr_BNode last)
{
    if(last != NULL)
    last->next=p;
}

void correction (Ptr_BNode p, int t, int l)
{
    p->min_tech = t;
    p->min_litr = l;
}
e o maindef.h está assim escrito

Código:
#ifndef MAIN_H 
#define MAIN_H

#include<stdio.h>

#define Max_Res 21

#endif
A que se deverá o erro???

abraços
 
Última edição:
Hmmm, provavelmente recebeste mais alguns erros antes desse

"bonus.h:9: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘=’ token"

Experimenta a copiar o output completo do compiler aqui no forum
 
1º - Não sei para que raio é que fizeste inicializações de variáveis dentro da struct.
2º - Não percebi isto:
Código:
Ptr_BNode head = NULL;
Ptr_BNode last = NULL;
e recuso-me a perceber...
3º - Isto está uma salgalhada de primeira!

Código:
typedef struct node
{
    int id;
    int resneed[Max_Res];
    int min_tech;
    int min_litr;
    struct node *next;

}BNode,*Ptr_BNode;
A struct assim fica bem melhor, mais perceptível, e nada de inicializações à patrão.

Código:
void initNode(Ptr_BNode p, int id)
{
    p->id = id;
}
Como chamaste initNode à função, pensei que querias inicializar um nodo inteiro, então:
Código:
void initNode(Ptr_BNode p, int id)
{
     int i;
     p->id = id;
     for (i=0;i<Max_Res;i++)
         p->resneed[i]=0;
     p->min_tech=0;
     p->min_litr=0;
     p->next=NULL;
}
Na função addNode, sinceramente não percebi o que tavas lá a fazer, mas presumi pelo nome, que fosse para adicionar um nodo à lista:

Código:
Ptr_BNode addNode(Ptr_BNode p, int id1, int resneed1[Max_Res], int min_tech1, int min_litr1)
{
    Ptr_BNode a;  
    if (p==NULL)
    {
                p = (Ptr_BNode)malloc(sizeof(BNode));
                p->id=id1;
                p->resneed[Max_Res]=resneed1[Max_Res];
                p->min_tech=min_tech1;
                p->min_litr=min_litr1;
                p->next=NULL;
    }
    else
    {
        a = (Ptr_BNode)malloc(sizeof(BNode));
        a->id=id1;
        a->resneed[Max_Res]=resneed1[Max_Res];
        a->min_tech=min_tech1;
        a->min_litr=min_litr1;
        a->next=NULL;
        p=a;
    }
    return p;
}
A correction acho que estava bem, só mudei o tipo de retorno:
Código:
Ptr_BNode correction (Ptr_BNode p, int t, int l)
{
    p->min_tech = t;
    p->min_litr = l;
    return p;
}
:)
 
Última edição:
o output é este... (retirado da shell do linux)

Código:
$make cnrc

cc     cnrc.c   -o cnrc
In file included from cnrc.h:4,
                 from cnrc.c:1:
bonus.h:9: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘=’ token
cnrc.c: In function ‘name_res’:
cnrc.c:21: warning: return discards qualifiers from pointer target type
make: *** [cnrc] Error 1
tendo o ficheiro cnrc.c este conteúdo

Código:
#include "cnrc.h"

int find_rc(char *resini);
char * name_res(int idres);
void reset_vec(int **vec, int start, int size);

int find_rc(char *resini)
{
    int i;

    for(i=0; i<Max_Res; i++)
    if (strcmp(resini, res[i])==0)
        return(i);
    
    
    return(-1);
}

char * name_res(int idres)
{
    return(res[idres]);
}

void reset_vec(int **vec, int start, int size)
{
    int i;

    for(i=start; i<size; i++)
    (*vec)[i]=0;

} 

int main()
{
    int i, strc[Start_Rec], *bon_test, res_test, nslots;
    char resini[Max_Pal], op;
    struct head th;
    Ptr_BNode no;

    printf("\nStarting resources\n\n");
   
    for(i=0; i<Start_Rec; i++)
    { 
    
    printf("Resource %d: ", i+1);
    scanf("%s", resini);

    resini[0]=toupper(resini[0]);

    strc[i]= find_rc(resini);

    if(strc[i]==-1)
    {
        printf("Error: resource not found in database. Exiting program\n\n");
        return(-1);
    }
    }


    printf("\n\nHow many trade slots?");
    scanf("%d", &nslots);
    
    printf("\n\nInitial Resources\n**%s\n**%s", name_res(strc[0]), name_res(strc[1]));

    printf("\n\nTrade Slots' Number: ");
    scanf("%d",&nslots);

    printf("\n\nContinue?(Y/N)");
    scanf(" %c", &op);

    op=toupper(op);

    if(op=='Y')
    {
    for(i=0; i<=Max_Bonus; i++)
    {
        no = malloc(sizeof(BNode));

        initNode(no, i);

        awitch(i)
        {
            case 4:
            correction(no, 5, 0); 
            break;

            case 7:
            correction(no, 10, 0);
            break;

            case 8:
            correction(no, 15, 0);
            break;

            case 9:
            correction(no, 0, 90);
            break;
        }

        if(head==NULL)
        head = no;
        
        addNode(no, last);
       
        last = no;
    }

    bon_test = malloc(Max_Bonus*sizeof(int));

    reset_vec(&bon_test, 0, Max_Bonus);

    res_test = malloc ((Rec_Res(nslots))*sizeof(int));

    res_test[0]=strc[0];
    res_test[1]=strc[1];

    reset_vec(&res_test, 2, Rec_Res(nslots));

    printf("\n\nBonus Vector\n");

    for(i=0; i<Max_Bonus; i++)
        printf("%d: %d\n", i+1, bon_test[i]);

    printf("\n\nResources Vector");

    for(i=0; i<Rec_Res(nslots); i++)
        printf("%d: %d\n", i+1, res_test[i]);

    }

    return(0);
}
e tendo como header file cnrc.h com este conteúdo

Código:
#include "maindef.h"
#include <string.h>
#include <ctype.h>
#include "bonus.h"
#include "tree.h"
 
#define Max_Pal 9 //tamanho da maxima palavra + 1 (para o caracter terminador) 

#define Max_Bonus 11 //numero de bonus 
#define Max_NBonus 19//numero de letras do maior nome dos Bonus +1
#define Max_BNeeds 9 //numero maximo de recursos necessarios para o Bonus

#define Start_Rec 2

#define Rec_Res(nslots) (2+(nslots*2))

/* 

Tabela de recursos por posição                   Tabela de bónus por posição

0 - Aluminum                                     0 - Affluent Population
1 - Cattle                                       1 - Asphalt 
2 - Coal                                         2 - Automobiles
3 - Fish                                         3 - Beer
4 - Furs                                         4 - Construction
5 - Gold                                         5 - Fast Food
6 - Gems                                         6 - Fine Jewelry
7 - Iron                                         7 - Microchips
8 - Lead                                         8 - Radiation Cleanup
9 - Lumber                                       9 - Scholars
10 - Marble                                      10 - Steel 
11 - Oil
12 - Pigs
13 - Rubber
14 - Silver
15 - Spices
16 - Sugar
17 - Uranium
18 - Water
19 - Whear
20 - Wine

*/

const char res[Max_Res][Max_Pal]={"Aluminum", "Cattle", "Coal", "Fish", "Furs", "Gold", "Gems", "Iron", "Lead", "Lumber", "Marble", "Oil", "Pigs", "Rubber", "Silver", "Spices", "Sugar", "Uranium", "Water", "Wheat", "Wine"};

const char bonus[Max_Bonus][Max_NBonus]={"Affluent Population", "Asphalt", "Automobiles", "Beer", "Construction", "Fast Food", "Fine Jewelry", "Microchips", "Radiation Cleanup", "Scholars", "Steel"};

const int needs[Max_Bonus][Max_BNeeds]={{5, 14, 6, 2, 3, 4, 20}, {9, 7, 10, 0, 11, 13},{9, 7, 10, 0, 11, 13, 2, 7}, {18, 19, 9, 0}, {9, 7, 10, 0}, {1, 16, 15, 12}, {5, 14, 6, 2}, {5, 8, 11},{9, 7, 10, 0, 5, 8, 11, 2, 7}, {9, 8}, {2, 7}};  

int find_rc(char *resini);
char * name_res(int idres);
void reset_vec(int **vec, int start, int size);

A ideia por trás deste programa é simular combinações de forma rápida e eficaz... :)

tens alguma ideia acerca do erro?
 
Última edição:
Fiz umas modificações no cnrc.c. E também substitui as constantes pelo seu valor, para não ter de andar sempre a ver.
Código:
#include "cnrc.h"

int find_rc(char *resini);
char * name_res(int idres);
void reset_vec(int **vec, int start, int size);

int find_rc(char *resini)
{
    int i;
    for(i=0; i<21; i++)
    if (strcmp(resini, res[i])==0)
        return(i);
    return(-1);
}
[color=blue]// Esta name_res está a dar erro mas não consigo perceber
/*char * name_res(int idres)
{
    return(res[idres]);
}*/[/color]

void reset_vec(int **vec, int start, int size)
{
    int i;
    for(i=start; i<size; i++)
    (*vec)[i]=0;
} 

int main()
{
    int i, strc[2], *bon_test, res_test, nslots; 
    char resini[9], op;
    [color=blue]//struct head th;     Não sei como está definida esta struct[/color]
    Ptr_BNode no;

    printf("\nStarting resources\n\n");
    for(i=0; i<Start_Rec; i++)
    { 
      printf("Resource %d: ", i+1);
      scanf("%s", resini[i]);
      resini[0]=toupper(resini[0]);
      strc[i]= find_rc(resini);
      if(strc[i]==-1)
      {
         printf("Error: resource not found in database. Exiting program\n\n");
         return(-1);
         }
      }
    printf("\n\nHow many trade slots?");
    scanf("%d", &nslots);
    printf("\n\nInitial Resources\n**%s\n**%s", strc[0], (strc[1]));
    printf("\n\nTrade Slots' Number: ");
    scanf("%d",&nslots);
    printf("\n\nContinue?(Y/N)");
    scanf(" %c", &op);
    op=toupper(op);
    if(op=='Y')
    {
    for(i=0; i<=11; i++)
    {
        no = (Ptr_BNode)malloc(sizeof(BNode));
        initNode(no, i);
        switch(i)
        {
            case 4: correction(no, 5, 0); 
                    break;
            case 7: correction(no, 10, 0);
                    break;
            case 8: correction(no, 15, 0);
                    break;
            case 9: correction(no, 0, 90);
                    break;
        }
        [color=blue]// Não sei como adptaste as funções que eu tinha ajudado antes
        /*if(head==NULL)
        head = no;
        addNode(no, last);
        last = no;*/[/color]
    }
    bon_test = malloc(11*sizeof(int));
    reset_vec(&bon_test, 0, 11);
    [color=red]/*Aqui trocas-te todo. Primeiro declaraste res_test como int,
    e depois estás a utilizá-lo como se fosse um array!! Afinal em 
    que ficamos?!?!*/[/color]
    res_test = malloc ((2+(nslots*2))*sizeof(int)); 
    res_test[0]=strc[0];
    res_test[1]=strc[1];
    reset_vec(&res_test, 2, Rec_Res(nslots));
    printf("\n\nBonus Vector\n");
    for(i=0; i<11; i++)
        printf("%d: %d\n", i+1, bon_test[i]);
    printf("\n\nResources Vector");
    for(i=0; i<(2+(nslots*2)); i++)
        printf("%d: %d\n", i+1, res_test[i]);
    }
    return(0);
}
Penso que o problema principal está na função name_res.
Vê os comentários que inseri no código.
 
Última edição:
Será melhor seguires os conselhos do Baderous e retirares as inicializações dentro da estrutura..Qt ao warning é por ter declarado o array como const char e tar a devolver um array de chars, penso eu...
 
Eu acho k o baderous exagerou um pouco...ele pediu-t pa lhe corrigires akilo...não pa fazeres tudo de novo...Cada um tem a sua maneira de programar...Se bem que esta é um pouco confusa...Mas se funca...

Tens que dar o res cm argumento também penso eu...Mas se não tens...
Depois de pensar até percebi o que querias fazer...Mas sinceramente não sei se é possível...E o compilador parece que também não gosta muito...

/* Nao tenho aki compilador...mas tenta isto :*/
char * name_res(int idres)
{
return(&res[idres][0]);
}


/* Assim funca de certeza*/

void name_res(int idres,char* res,char* array_destino) /*das o array onde keres que a String va parar como argumento*/
{
int i=0;
while(res[idres]!='\0')
array_destino=res[idres] ;
array_destino[i+1]='\0';
}

Quanto ao outro erro..Eu parece-me que ele não está a detectar o Max_Res...Nem percebo porque criast mais um ficheiro só para aquilo...e os defines e os includes todos separados...Mas nunca vi ng a fazer assim inicializações dentro de structs..era boa ideia tirares isso e fazeres uma função que inicialize à parte...Penso eu...
 
Back
Topo