#1
  1. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Jun 2013
    Posts
    2
    Rep Power
    0

    "error: expected '=', ',', ...", what?


    So... I've got an interface which is simple and direct:

    Code:
    typedef lista Lista; 
    
    struct lista 
    { 
         struct lista *prox, *ant; 
         char* palavra; 
    }; 
    
    bool contem(char* p1, char* p2); 
    void comeContidas(Lista* l); 
    void iniciaLista(Lista* novo); 
    Lista* novaLista(); 
    int maiorQue(char* p1, char* p2); 
    void insertMilitar(Lista* l, char* novo); 
    Lista* osMaiores(); 
    void printAll(Lista* vetor); 
    char* subString(char* word, int start); 
    void loadSW(char* address); 
    void loadTW(char* address);
    and it generates the said error in every single line with code... can someone explain me why? I'm out of ideas here...
  2. #2
  3. Contributing User
    Devshed Supreme Being (6500+ posts)

    Join Date
    Jan 2003
    Location
    USA
    Posts
    7,174
    Rep Power
    2222
    Please provide us a short program that demonstrates the problem and that we could try to compile yourselves. We need to know the context.

    Also please tell us what language and what compiler you are using. It appears to be C.

    Also, shouldn't your typedef be typedef struct lista Lista; ?
    Last edited by dwise1_aol; June 27th, 2013 at 03:01 PM.
  4. #3
  5. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Jun 2013
    Posts
    21
    Rep Power
    0
    Lista is not the same as lista (note that it is case sensitive)

    try VOID and BOOL instead of void and bool. (it is not the same).

    the 'typedef' must be AFTER the 'struct' .
  6. #4
  7. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Jun 2013
    Posts
    2
    Rep Power
    0
    Sorry for the lack of details!

    Yes, indeed the language is C and I'm using Code Blocks with the GCC compiler.

    I'm using that code in the following way:

    Code:
    #include <stdio.h>
    #include <string.h>
    #include "support.h"
    
    int main(int argc. char* argv[])
    {
        int tamanho;
        char* texto;
    
        if(argv[1] != NULL && argv[2] != NULL)
        {
            if(argv[1][0] == '-' && argv[1][1] == 'f'
               && argv[2][0] == '-' && argv[2][1] == 'f')
            {
                loadSW(argv[1]);
                loadTW(argv[2]);
            }
            else return 0;
        }
        else return 0;
    
        if(argv[3] == NULL || strmcp(argv[3], "-s") != 0) printf("%d", strlen(osMaiores()->palavra));
        else printAll(osMaiores());
    
    
        return 0;
    }
    the interface has the following implementation:

    Code:
    #include "support.h"
    #include "search_word.h"
    #include "target_word.h"
    
    /*Verifica se a palavra p1 contém a palavra p2*/
    bool contem(char* p1, char* p2)
    {
        long i, j, tam1 = strlen(p1), tam2 = strlen(p2);
    
        if(p1 == nullptr || p2 == nullptr) return false;
    
        if(tam1 < tam2) return false;
    
        for(i = 0; i < tam1; i++)
        {
            if(p1[i] == p2[0])
            {
                for(j = 0; i < tam2 && p1[i + j] == p2[j] && i + j < tam1; j++);
    
                if(j == tam2) return 1;
            }
        }
    
        return false;
    }
    
    /*
        Remove as entradas da Lista que estão contidas em alguma outra.
        ex: temos as entradas ab e abba
    
            ab está contido em abba
            ab não é maximal.
            ab é removido
    */
    void comeContidas(Lista* l)
    {
        Lista* temp;
    
        if(l != NULL)
        {
            if(l->prox != NULL)
            {
                if(contem(l->palavra, l->prox->palavra))
                {
                    temp = l->prox;
                    l->prox = temp->prox;
    
                    if(temp->prox != NULL) temp->prox->ant = l;
    
                    free(temp);
    
                    comeContidas(l);
                }
                else comeContidas(l->prox);
            }
        }
    }
    
    /*Inicia um elemento do tipo lista*/
    void iniciaLista(Lista* novo)
    {
        novo->palavra = NULL;
        novo->prox = NULL;
        novo->ant = NULL;
    }
    
    /*Cria e inicia um elemento do tipo lista*/
    Lista* novaLista()
    {
        Lista* novo = malloc(sizeof(Lista));
        iniciaLista(novo);
    
        return novo;
    }
    
    /*Um "strcmp" mais adequado ao caso atual, só para ajudar na inserção mesmo*/
    int maiorQue(char* p1, char* p2)
    {
        int tam1 = strlen(p1), tam2 = strlen(p2);
    
        /*Ve se algum deles é nulo e o outro não*/
        if(p1 == '\0' && p2 == '\0') return 0;
        else if(p1 == '\0') return -1;
        else if(p2 == '\0') return 1;
    
        /*Compara tamanho*/
        else if(tam1 > tam2) return 1;
        else if(tam1 < tam2) return -1;
    
        /*Compara a primeira letra*/
        else if(p1[0] > p2[0]) return 1;
        else if(p1[0] < p2[0]) return -1;
    
        /*Se ela for igual, chama com as próximas posições do vetor*/
        else return maiorQue(p1 + sizeof(char), p2 + sizeof(char));
    }
    
    /*Método para fazer a inserção "padrão militar semi-reversa" na lista*/
    void insertMilitar(Lista* l, char* novo)
    {
        int cmp;
        Lista* temp;
    
        /*Inserção da lista recém criada.*/
        if(l->palavra == NULL) l->palavra = novo;
        else
        {
            /*Comparação inicial direciona a decisão*/
            cmp = maiorQue(l->palavra, novo);
            temp = novaLista();
            temp->palavra = novo;
    
    
            /*Se a palavra nova for maior que a iteração atual ou igual, insere antes*/
            if(cmp == 0 || cmp < 0)
            {
                temp->prox = l;
                temp->ant = l->ant;
    
                if(temp->ant != NULL) temp->ant->prox = temp;
            }
            else
            {
                /*Como a iteração atual é maior, se nulo insere depois imediatamente*/
                if(l->prox == NULL)
                {
                    l->prox = temp;
                    temp->ant = l;
                }
                /*Se houver outro elemento chama recursivamente*/
                else
                {
                    free(temp);
                    insertMilitar(l->prox, novo);
                }
            }
        }
    }
    
    /*Retorna um vetor das congruências entre os 2 vetores de texto*/
    Lista* osMaiores()
    {
        Lista* resultado = novaLista();
        int tam = SW_length() - 1;
    
        for(tam = tam; tam >= 0; tam--)
            insertMilitar(resultado, find(SW_select(tam)));
    
        comeContidas(resultado);
    }
    
    /*Imprime todos os textos armazenados na lista*/
    void printAll(Lista* vetor)
    {
        if(vetor != NULL)
        {
            printf("%s\n", vetor->palavra);
            printAll(vetor->prox);
        }
    }
    
    /*Apenas um método que retorna uma substring com base numa posição inicial start*/
    char* subString(char* word, int start)
    {
        int tam = strlen(word), i;
        char *resul;
    
        if(tam == 0) return "";
        if(start > tam) return "";
    
        resul = malloc(tam - start + 1);
    
        for(i = 0; i < tam - start; i++)
            resul[i] = word[start + i];
    
        resul[start] = '\0';
    
        return resul;
    }
    
    /*Tanto o loadSuffix1 como o loadSuffix2 só carregam os textos para os arrays de forma organizada*/
    void loadSW(char* address)
    {
        int tamanho;
        char* texto;
        FILE *ar;
    
        ar = fopen(subString(address, 2), "r");
    
        /*Carrega o tamanho do arquivo*/
        tamanho = ftell(ar);
        rewind(ar);
    
        /*Cria um vetor temporário para armazenar o texto do arquivo e o carrega com a informação*/
        texto = malloc(tamanho + 1);
        fread(texto, tamanho, 1, ar);
    
        /*Dado o tamanho dos arquivos, já fecha o arquivo  a fim de poder carregar os dados no suff_arr1 sem problema de falta de memória*/
        fclose(ar);
    
        /*Fim do texto*/
        texto[tamanho] = '\0';
    
        /*Texto é carregado no array1*/
        SW_array(texto);
        free(texto);
    }
    
    void loadTW(char* address)
    {
        int tamanho;
        char* texto;
        FILE *ar;
    
        ar = fopen(subString(address, 2), "r");
    
        /*Carrega o tamanho do arquivo*/
        tamanho = ftell(ar);
        rewind(ar);
    
        /*Cria um vetor temporário para armazenar o texto do arquivo e o carrega com a informação*/
        texto = malloc(tamanho + 1);
        fread(texto, tamanho, 1, ar);
    
        /*Dado o tamanho dos arquivos, já fecha o arquivo  a fim de poder carregar os dados no suff_arr1 sem problema de falta de memória*/
        fclose(ar);
    
        /*Fim do texto*/
        texto[tamanho] = '\0';
    
        /*Texto é carregado no array1*/
        TW_array(texto);
        free(texto);
    }
    but I don't see how the implementation could cause the compilation errors.

    (everything compiles well by itself and generates .o on linux, the only issue is in both main and support.h [the first code])
  8. #5
  9. Contributing User
    Devshed Supreme Being (6500+ posts)

    Join Date
    Jan 2003
    Location
    USA
    Posts
    7,174
    Rep Power
    2222
    "interface". There's no such thing in C, but rather in Java and C#. We don't know what you're talking about.

    Please provide us with a short program that that we can ourselves compile and that exhibits the problems (ie, the same error messages) as you describe.

    What part of that do you not understand?

    BTW, your main should not compile:
    int main(int argc. char* argv[])
    That period should be a comma.

    When you post code here, please post the actual code that you are working with. That is the only way that we are able to distinguish between errors you introduce by typing out a copy in your message and errors that are actually in your code that you are trying to compile.
  10. #6
  11. Contributing User

    Join Date
    Aug 2003
    Location
    UK
    Posts
    5,113
    Rep Power
    1803
    You should probably post the output of the compiler verbatim rather than "describing" or paraphrasing the error messages. These contain important diagnostic information that you have omitted or elided in your description.

    You have created a typedef as an alias for a type that is not yet defined (and in C is not a type in any case). You have come code that looks like it is intended for C++ compilation rather than C (but poor C++ nonetheless)?

    The following is more likely what you need:

    Code:
    #if !defined SUPPORT_INCLUDE
    #define SUPPORT_INCLUDE
    
    #include <stdbool.h>
    
    typedef struct lista 
    { 
         struct lista *prox, *ant; 
         char* palavra; 
    } Lista ; 
    
    bool contem(char* p1, char* p2); 
    void comeContidas(Lista* l); 
    void iniciaLista(Lista* novo); 
    Lista* novaLista(); 
    int maiorQue(char* p1, char* p2); 
    void insertMilitar(Lista* l, char* novo); 
    Lista* osMaiores(); 
    void printAll(Lista* vetor); 
    char* subString(char* word, int start); 
    void loadSW(char* address); 
    void loadTW(char* address);

    Originally Posted by flyguille
    try VOID and BOOL instead of void and bool. (it is not the same).
    void has been part of the C language since 1989 - no one used the VOID macro anymore!

    bool is available in C99 when <stdbool.h> is included, but this may also be compiled using C++ compilation.

    Either way VOID and BOOL could only be available is they were previously defined. I cannot see how this suggestion is of any help whatsoever.

IMN logo majestic logo threadwatch logo seochat tools logo