1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Erro críptico em c

Discussão em 'Programação' iniciada por Jeust, 10 de Julho de 2007. (Respostas: 6; Visualizações: 704)

  1. Jeust

    Jeust Colaborador
    Staff 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: 10 de Julho de 2007
  2. b1t dA3m0n

    b1t dA3m0n Power Member

    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
     
  3. Baderous

    Baderous Banido

    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: 10 de Julho de 2007
  4. Jeust

    Jeust Colaborador
    Staff Member

    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: 10 de Julho de 2007
  5. Baderous

    Baderous Banido

    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: 10 de Julho de 2007
  6. Cesaria

    Cesaria Power Member

    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...
     
  7. good_in_bed

    good_in_bed Power Member

    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...
     

Partilhar esta Página