Jump to content

[Resolvido] Erro C2040


Hitmanpt
 Share

Go to solution Solved by HappyHippyHippo,

Recommended Posts

Boas pessoal, estou a fazer um projeto para a cadeira de Eng. Informática mas estou a deparar-me com um erro que não consigo resolver e queria evitar o contacto com o professor pois também conta na nota :\

Então aqui seguem as partes mais importantes do código

A estrutura:

typedef struct OPINION {
int id;
char receptor[80];
char sender[80];
int day;
int month;
int year;
int note;
struct OPINION *nseg;
} opinion;

A função para ler do ficheiro para a estrutura

void readFile(opinion *L) {
FILE* opinionFile;
opinionFile = fopen("sampleFile.txt", "r");
if(opinionFile != NULL) {
	while(1) {
		char line[150];
		char *sender, *receiver;
		opinion opinionTMP;
		if(fgets(line, 150, opinionFile) == NULL)
			break;
		sender = strtok(line, ",");
	   memcpy(opinionTMP.sender, sender, strlen(sender) + 1);
	   opinionTMP.day = (int) strtok(NULL, ",");
	   opinionTMP.month = (int) strtok(NULL, ",");
	   opinionTMP.year = (int) strtok(NULL, ",");
	   receiver = strtok(NULL, ",");
	   memcpy(opinionTMP.receptor, receiver, strlen(receiver) + 1);
	   opinionTMP.note = (int) strtok(NULL, ",");
	   L = insertLast(L, opinionTMP);  //Linha 36
	}
}
}

A função "insertLast"

opinion* insertLast(opinion *L, opinion *nv) { //linha 62
opinion *current = L;
if (L == NULL)
	return nv;
while (current->nseg != NULL) {
	current = current->nseg;
}
current->nseg = nv;
return L;
}

E como não podia deixar de ser, a função main que não tem nada de especial

int main() {
opinion *opinionsList;
readFile(opinionsList);
return 0;
}

Quando compilo (estou no windows a usar o compilador do Visual Studio mas a partir da linha de comandos) aparece-me este erro:

proj.c(36) : warning C4047: '=' : 'opinion *' differs in levels of indirection from 'int'

proj.c(62) : error C2040: 'insertLast' : 'opinion *(opinion *,opinion *)' differs in levels of indirection from 'int ()'

As linhas em que estão os erros estão marcadas no post com "//linha XX"

Já andei à procura no StackOverflow, Google e afins mas só encontro a resolução para este erro em comparações e não estou a fazer nenhuma comparação... Alguma ideia?

NOTA: Sei que os métodos podem não ser os melhores, mas será melhorado à medida que vou avançando no semestre, para já queria apenas resolver este erro

Agradecimentos Prévios

Pedro Cavaleiro

Link to comment
Share on other sites

HappyHippyHippo

Já andei à procura no StackOverflow, Google e afins mas só encontro a resolução para este erro em comparações e não estou a fazer nenhuma comparação... Alguma ideia?

para a próxima aprendes a perguntar logo aqui 😛

o erro está aqui:


// ...
opinion opinionTMP; // que tipo de dados é a variável opinionTMP ?
// ...
L = insertLast(L, opinionTMP); // que tipo de dados estás a fornecer como segundo argumento da chamada da função ?
// ...
opinion* insertLast(opinion *L, opinion *nv) { // que tipo de dados a função espera como segundo argumento ?
// ...
[/Code]
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

para a próxima aprendes a perguntar logo aqui 😛

Tenho a conta bolqueada :\

o erro está aqui:

// ...
opinion opinionTMP;							 // que tipo de dados é a variável opinionTMP ?
// ...
L = insertLast(L, opinionTMP);				  // que tipo de dados estás a fornecer como segundo argumento da chamada da função ?
// ...
opinion* insertLast(opinion *L, opinion *nv) {  // que tipo de dados a função espera como segundo argumento ?
// ...
[/Code]


Ok, já revi o programa e fiz as seguintes alterações
[code]
opinion opinionTMP;
//passou a
opinion* opinionTMP;

Logo o segundo parametro é passado corretamente e é o que a função espera.

Mas o erro preciste

Link to comment
Share on other sites

Se quiseres ver o ficheiro completo está neste link (o servidor é meu)

http://pcdev.pt/files/proj.c

Eu vou continuar a ver se consigo resolver o problema

A parte que eu acho extremamente estranha é o errro dar nesta linha

opinion* insertLast(opinion* L, opinion* nv) {
Edited by Windows Dragon
Link to comment
Share on other sites

HappyHippyHippo

este é o meu output da compilação desse ficheiro :

src/main.c: In function 'readFile':
src/main.c:32:43: error: cast from pointer to integer of different size [-Werror
=pointer-to-int-cast]
                        opinionTMP->day = (int) strtok(NULL, ",");
                                          ^
src/main.c:33:45: error: cast from pointer to integer of different size [-Werror
=pointer-to-int-cast]
                        opinionTMP->month = (int) strtok(NULL, ",");
                                            ^
src/main.c:34:44: error: cast from pointer to integer of different size [-Werror
=pointer-to-int-cast]
                        opinionTMP->year = (int) strtok(NULL, ",");
                                           ^
src/main.c:37:44: error: cast from pointer to integer of different size [-Werror
=pointer-to-int-cast]
                        opinionTMP->note = (int) strtok(NULL, ",");
                                           ^
src/main.c:38:25: error: implicit declaration of function 'insertLast' [-Werror=
implicit-function-declaration]
                        L = (opinion *) insertLast(L, opinionTMP);
                        ^
src/main.c:38:29: error: cast to pointer from integer of different size [-Werror
=int-to-pointer-cast]
                        L = (opinion *) insertLast(L, opinionTMP);
                            ^
src/main.c: At top level:
src/main.c:65:10: error: conflicting types for 'insertLast'
opinion* insertLast(opinion* L, opinion* nv) {
         ^
src/main.c:38:41: note: previous implicit declaration of 'insertLast' was here
                        L = (opinion *) insertLast(L, opinionTMP);
                                        ^
src/main.c: In function 'readFile':
src/main.c:42:1: error: control reaches end of non-void function [-Werror=return
-type]
}
^
cc1.exe: all warnings being treated as errors

o que me leva a pensar que se não apresentaste a informação correcta dos erros que te são apresentados, existe uma grande probabilidade de que algum tipo de ajuda proveniente da minha pessoa irá cair em "saco roto"

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

1. Eu apresentei os erros que me apareciam: http://pcdev.pt/files/Untitled.png

2. Na base do que me apresentas-te vou ver se consigo resolver o problema

3. Estás a compilar no Linux ou no Windows? Se for no Windows qual é o compilador que usas? Ou se estiveres no linux conheces algum compilador bom para windows, eu só quero mesmo o compilador.

Link to comment
Share on other sites

HappyHippyHippo

tanto posso compilar em windows como em linux, o problema é o mesmo:

- chamada de uma função ainda não declarada

ou alteras a ordem de declaração das funções para que nenhuma chamada apareça no código antes da sua declaração

ou fazes a alusão das funções antes das chamadas

-----

isto é o que uso para compilar C no windows : MinGW+MSYS

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Já me tinha esquecido que o C é sensivel à ordem das funções.

Também instalei o MinGW+MSYS

Nenhum dos dois compiladores me mostra erros (VS C Compiler e MSYS) no entanto o meu programa deixa de funcionar

http://pcdev.pt/files/proj.c

O novo ficheiro já se encontra no servidor. Eu não consigo encontrar o erro (passei o main para o inicio das do ficheiro [dps das declarações das funções])

Consegui no entanto fazer pinpoint onde poderá andar o erro

sender = strtok(line, ",");
memcpy(opinionTMP->sender, sender, strlen(sender) + 1);
opinionTMP->day = (int) strtok(NULL, ",");
opinionTMP->month = (int) strtok(NULL, ",");
opinionTMP->year = (int) strtok(NULL, ",");
receiver = strtok(NULL, ",");
memcpy(opinionTMP->receiver, receiver, strlen(receiver) + 1);
opinionTMP->note = (int) strtok(NULL, ",");

//Obter a lista atualizada com o novo elemento
L = (opinion *) insertLast(L, opinionTMP);
Edited by Windows Dragon
Link to comment
Share on other sites

HappyHippyHippo

não amostra erros ?

src/main.c: In function 'readFile':
src/main.c:57:31: error: cast from pointer to integer of different size [-Werror
=pointer-to-int-cast]
            opinionTMP->day = (int) strtok(NULL, ",");
                              ^
src/main.c:58:33: error: cast from pointer to integer of different size [-Werror
=pointer-to-int-cast]
            opinionTMP->month = (int) strtok(NULL, ",");
                                ^
src/main.c:59:32: error: cast from pointer to integer of different size [-Werror
=pointer-to-int-cast]
            opinionTMP->year = (int) strtok(NULL, ",");
                               ^
src/main.c:62:32: error: cast from pointer to integer of different size [-Werror
=pointer-to-int-cast]
            opinionTMP->note = (int) strtok(NULL, ",");
                               ^
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Curiosamente a mim não me apareceu, mas no entertanto eu consegui fazer pindown à localização dos erros (antes do teu post) e consegui resolver este problema, mas agora apareceu-me outro.

A função atualmente está assim

opinion* readFile(opinion *L) {

//Abertura do ficheiro para leitura
   FILE* opinionFile;
char line[150];
   opinionFile = fopen("sampleFile.txt", "r");

//Verificar se não ocorreu nenhum erro ao abrir o ficheiro
   if(opinionFile != NULL) {

 //Percorrer todas as linhas do ficheiro
    while(fgets(line, 150, opinionFile)) {  
  //Declarações Locais		   
  char *sender, *receiver;
  opinion opinionTMP;  

  //Partir cada Linha e colocar na estrutura  
  sender = strtok(line, ",");
  memcpy(opinionTMP.sender, sender, strlen(sender) + 1);
  opinionTMP.day = (int) strtok(NULL, ",");
  opinionTMP.month = (int) strtok(NULL, ",");
  opinionTMP.year = (int) strtok(NULL, ",");
  receiver = strtok(NULL, ",");
  memcpy(opinionTMP.receiver, receiver, strlen(receiver) + 1);
  opinionTMP.note = (int) strtok(NULL, ",");
  printf("%s\n", opinionTMP.receiver);
  //Obter a lista atualizada com o novo elemento
  //L = (opinion *) insertLast(L, &opinionTMP);
    }
 return L;
   }
else {
 return L;
}
fclose(opinionFile);
}

com a linha

//L = (opinion *) insertLast(L, &opinionTMP);

Comentada quase tudo funciona bem, se eu tirar o comment dessa linha fica stuck, ou seja não lê a última linha, não deixa de funcionar apenas fica preso na leitura da última linha.

Outro problema é ao obter o valor em int do dia (por exemplo), eu modifiquei a linha

opinionTMP.day = (int) strtok(NULL, ",");
//para
opinionTMP.day = (int) *strtok(NULL, ",");

Teoricamente deveria obter o valor correto? Mas obtenho valores inteiros que não têm nada haver.

Link to comment
Share on other sites

  • Solution
HappyHippyHippo

strtok retorna o ponteiro para a string encontrada

uma string, uma série de bytes com um valor numérico com representação em ASCII.

ps : um dia chato :

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#define BUFFER_SIZE 256
#define NAME_SIZE   96
#define FILEPATH    "sampleFile.txt"

typedef struct List {
   int id;

   char sender[NAME_SIZE];
   char receiver[NAME_SIZE];

   struct {
       int day;
       int month;
       int year;
   } date;
   int note;

   // Linked-list
   struct List *next;
   struct List *prev;
} List;


List* listReadFile(char* file);
List* listPushFront(List* list, List data);
List* listPushBack(List* list, List data);
void  listPrint(List* list);

int main() {
   List* list = listReadFile(FILEPATH);
   listPrint(list);

   return 0;
}

List* listReadFile(char* file) {
   FILE* fd = NULL;

   if ((fd = fopen(file, "r")) == NULL)
       return NULL;

   List* list = NULL;
   List readed;
   char line[bUFFER_SIZE];

   while (fgets(line, BUFFER_SIZE, fd)) {
       sscanf(line, "%[^,],%d,%d,%d,%[^,],%d",
              readed.sender,
              &readed.date.day,
              &readed.date.month,
              &readed.date.year,
              readed.receiver,
              &readed.note);

       list = listPushBack(list, readed);
   }

   fclose(fd);

   return list;
}

List* listPushFront(List* list, List data) {
   List* node = NULL;
   if ((node = malloc(sizeof(List))) == NULL)
       return NULL;

   *node = data;
   node->next = list;
   node->prev = NULL;

   list->prev = node;

   return node;
}

List* listPushBack(List* list, List data) {
   List* node = NULL;
   if ((node = malloc(sizeof(List))) == NULL)
       return NULL;

   List* it = list;
   while (it && it->next != NULL)
       it = it->next;

   *node = data;
   node->next = NULL;
   node->prev = it;

   if (!it)
       return node;

   it->next = node;
   return list;
}

void listPrint(List* list) {
   while (list != NULL) {
       printf("sender : %s (%d/%d/%d) -> receiver : %s (note : %d)",
              list->sender,
              list->date.day,
              list->date.month,
              list->date.year,
              list->receiver,
              list->note);

       list = list->next;
   }
}

edit : código corrigido

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Já andei de volta a este código e existe uma parte que não funciona, agora não me perguntes porquê, porque do que eu sei e precebi sem este pedaço de código o programa não vai funcionar o problema está na função listPushBack

//Problema
while (it->next != NULL)
	it = it->next;

Com esta linha o programa deixa de funcionar, não sei porquê.

Nota: Adicionei um if caso a lista esteja vazia, pois pensava que fosse disso.

O programa tem 3 prints

-> Caso a lista esteja vazia dá esta mensagem "No Nodes found. Generate list with this node \n Data: ..."

-> Caso a lista já tenha nodos aparece esta mensagem "Nodes found. Adding node to list\n Data:.."

-> Se tudo correr bem aparece esta mensagem (dps da lista ser criada) "\nData on List with id: %d:\n..."

Com o while não comentado tenho este output

No Nodes found. Generating list with this node

Data:

sender : 2v7t5k72Fb@clix.pt (12/6/2016) -> receiver : Sck0Z@yahoo.com (note : 3)

Com o while comentado tenho o seguinte output

No Nodes found. Generating list with this node

Data:

sender : 2v7t5k72Fb@clix.pt (12/6/2016) -> receiver : Sck0Z@yahoo.com (note : 3)

Nodes found. Adding node to list

Data:

sender : zrjtN@yahoo.com (28/10/2014) -> receiver : wgLn@sapo.pt (note : 2)

Nodes found. Adding node to list

Data:

sender : J0hmdQsUHu@clix.pt (10/3/2014) -> receiver : OZNYJEX@gmail.com (note : 1)

Nodes found. Adding node to list

Data:

sender : z2Ghnk@gmail.com (14/2/2016) -> receiver : iBnor@yahoo.com (note : 0)

Data on List with id: 0:

sender : 2v7t5k72Fb@clix.pt (12/6/2016) -> receiver : Sck0Z@yahoo.com (note : 3)

Data on List with id: 3:

sender : z2Ghnk@gmail.com (14/2/2016) -> receiver : iBnor@yahoo.com (note : 0)

Como seria de esperar o programa quando tem o while comentado cria o primeiro nodo e depois substitui os seguintes e só fica o último.

Com o código que tinhas nem chegava a adicionar o primeiro...

Código atual...

List* it = list;

if(list != NULL) {
 List* node = NULL;
 if ((node = malloc(sizeof(List))) == NULL)
  return NULL;

 /* while (it->next != NULL) {
  it = it->next;
 } */

 *node = data;
 node->next = NULL;
 node->prev = it;

 it->next = node;

} else {
 List* node = NULL;
 if ((node = malloc(sizeof(List))) == NULL)
  return NULL;

 *node = data;

 it = node;
}

return it;

Estou quase a arrancar os cabelos... Não tem lógica aquele while não funcionar

Edited by Windows Dragon
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.