3
Good afternoon,
I needed help fixing some mistakes at the terminal.
Summary:
I have done some functions to get some information (values) about active clients (where a client is active if he is an issuer or beneficiary of an unprocessed cheque). It is a system of checks and customers
I’m using structures and trees and pointers, but I have errors in the terminal. or else the functions are poorly done.
I have a main file, Item. c e h, and QUEUE. c e h if necessary I can put more parts of the code. I will put only what I think is needed.
The info function prints (summarized) information about all active system clients: ref nche vche nchb vchb
ref = reference
n= number
ch= cheque
e= issued
b=beneficent
Mistakes
miguel@maa10Linux:~/iaed/proj2/codigo/versaofinal$ gcc -Wall -ansi -pedantic -o proj2 proj2.c Item.c QUEUE.c
proj2.c: In function ‘veclientesativostree’:
proj2.c:308:4: error: incompatible type for argument 1 of ‘mostrainfocliente’
mostrainfocliente(c);
^
proj2.c:300:6: note: expected ‘Cliente’ but argument is of type ‘struct Cliente *’
void mostrainfocliente(Cliente c){
^
Files
Item. c
[...]
typedef struct {
int valor;
long int refe;
long int refb;
long int refc;
} Item;
[... ]
QUEUE. c
[...]
void QUEUEput(Item item) {
if (head == NULL) {
head = tail = NEW(item, head);
}
else {
tail->next = NEW(item, tail->next);
tail = tail->next;
}
}
Item QUEUEget() {
Item item = head->item;
queuelink t = head->next;
free(head);
head = t;
return item;
}
Item QUEUEfind(long refc, int (*cmp)(Item,long))
{
queuelink t;
Item item;
item.refc = -1;
for(t = head; t != NULL; t = t->next)
if(cmp(t->item, refc) == 0)
return t->item;
return item;
}
Item QUEUEdelete(long refc, int (*cmp)(Item,long))
{
queuelink t, prev;
Item item;
item.refc = -1;
for(t = head, prev = NULL; t != NULL;
prev = t, t = t->next) {
if(cmp(t->item, refc) == 0) {
if(t == head)
head = t->next;
else
prev->next = t->next;
if (t == tail) tail = prev;
item = t->item; /* fazer funcao */
free(t);
return item;
}
}
return item;
}
Main. c
[...]
typedef struct cliente {
long ref, nche, vche, nchb, vchb;
} Cliente;
typedef struct node {
Cliente *item;
struct node *l;
struct node *r;
} *Link;
[...]
extern queuelink head, tail;
Link root;
int main()
{
char* comando;
comando = (char*)malloc(sizeof(char*)*MAXcomando);
QUEUEinit();
do { scanf("%s", comando);
if(strcmp(comando, "cheque") == 0){
comando_cheque();
}
else if (strcmp(comando, "processa") == 0){
comando_processa();
}
else if (strcmp(comando, "processaR") == 0){
comando_processaR();
}
else if (strcmp(comando, "infocheque") == 0){
comando_infocheque();
}
else if (strcmp(comando, "infocliente") == 0){
comando_infocliente();
}
else if (strcmp(comando, "info") == 0){
comando_info();
}
}while (strcmp(comando, "sair") != 0);
sair();
return 0;
}
/* -----------------------------------FUNCOES------------------------------------*/
/* --------------- Clientes-arvore ------------------ */
Link insere(Link t, long ref, long valor)
{
if (t == NULL) {
t = (Link) malloc(sizeof(struct node));
t->item = (Cliente*)malloc(sizeof(Cliente));
t->item->ref = ref;
t->item->nche = t->item->vche = t->item->nchb = t->item->vchb = 0;
t->l = t->r = NULL;
} else if (t->item->ref > ref) { t->l = insere(t->l, ref, valor);
return t; }
else if (t->item->ref < ref) { t->r = insere(t->r, ref, valor);
return t; }
if (valor > 0) {
t->item->nche++;
t->item->vche += valor;
} else {
t->item->nchb++;
t->item->vchb -= valor;
}
return t;
}
Cliente *TREEget(Link t, long ref){
if (t == NULL)
return NULL;
else if (t->item->ref > ref)
return TREEget(t->l, ref);
else if (t->item->ref < ref)
return TREEget(t->r, ref);
return t->item;
}
void TREEprint(Link t){
if (t == NULL)
return;
TREEprint(t->l);
if (t->item->nche != 0 || t->item->nchb != 0)
printf("*%ld %ld %ld %ld %ld\n", t->item->ref, t->item->nche, t->item->vche, t->item->nchb, t->item->vchb);
TREEprint(t->r);
}
void TREEinit(){
root = NULL;
}
void print(Link t)
{
if (t == NULL)
return;
print(t->l);
printf("%ld", t->item->ref);
print(t->r);
}
/* -------------------------------------Comandos--------------------------------------------*/
/* comando Cheque */
Item cheques;
void imprimeCheque(Item cheques) {
printf("Valor:%d Emissor:%ld Cheque nº:%ld Recetor:%ld\n", cheques.valor, cheques.refe, cheques.refc, cheques.refb);
}
void comando_cheque(){
Item newcheque;
scanf(" %d %ld %ld %ld", &newcheque.valor, &newcheque.refe, &newcheque.refb, &newcheque.refc);
QUEUEput(newcheque);
imprimeCheque(newcheque);
/* actualiza clientes */
root = insere(root, newcheque.refe, newcheque.valor);
root = insere(root, newcheque.refb, -newcheque.valor);
}
/* processa */
void comando_processa() {
Item item;
Cliente *c;
if (head == NULL)
printf("Nothing to process\n");
else {
item = QUEUEget();
/* actualizar clientes quando se tira da pool o cheque ha mais tempo emitido */
c = TREEget(root, item.refe);
c->nche--;
c->vche -= item.valor;
c = TREEget(root, item.refb);
c->nchb--;
c->vchb -= item.valor;
}
}
/* processaR */
int compare(Item it, long ref) {
return it.refc - ref; }
void comando_processaR() {
long int ref;
Item item;
Cliente *c;
scanf("%ld", &ref);
item = QUEUEdelete(ref, compare);
/* actualizar info */
c = TREEget(root, item.refe);
c->nche--;
c->vche -= item.valor;
c = TREEget(root, item.refb);
c->nchb--;
c->vchb -= item.valor;
}
/* infocheque */
void comando_infocheque(){
long int ref;
Item item;
scanf("%ld", &ref);
item = QUEUEfind(ref, compare);
if (item.refc == -1)
printf("Cheque %ld does not exist\n", ref);
else
printf("Cheque-info: %ld %d %ld --> %ld\n", item.refc, item.valor, item.refe, item.refb);
}
/* infocliente */
void comando_infocliente(){
Cliente *c;
long int ref;
scanf("%ld", &ref);
c = TREEget(root, ref);
if (c == NULL || (c->nche == 0 && c->nchb == 0))
printf("Cliente %ld does not exist\n", ref);
else
printf("Cliente-info: %ld %ld %ld %ld %ld\n", c->ref, c->nche, c->vche, c->nchb, c->vchb);
}
/* info */
int max(int a, int b)
{
return (a > b)? a : b;
}
int clienteativo(Cliente *c){
return ( (c->nche != 0) || (c->nchb != 0) );
}
int clienteativototal(Link t){
if (t == NULL){
return 0; }
else {
if (clienteativo(t->item)){
return clienteativototal(t->r)+ clienteativototal(t->l) + 1;}
else {
return clienteativototal(t-> r) + clienteativototal(t-> l);}
}
}
void comando_info(){
if (clienteativototal(root) == 0)
printf("No active clients\n");
else
veclientesativostree(root);
}
void mostrainfocliente(Cliente c){
printf("* %ld %ld %ld %ld %ld\n", c.ref, c.nche, c.vche, c.nchb, c.vchb);
}
void veclientesativostree (Link t){
Cliente *c;
if (t!=NULL)
veclientesativostree(t-> l);
if (clienteativo(c)){
mostrainfocliente(c);
}
veclientesativostree(t-> r);
}
Don’t put the definitions of
structin the main. c. Put them in file . h and include that file in main. c and in all others . c that need these structs. Apparently the main. c hastypedef struct cliente { ... } Cliente;and other files that need it (the project2.c) do not know where to find the definition.– pmg
I think it’s not that because I was able to compile and run the program even with the files in main, I did not put in the posts but my main and the other files have the correct includes. I think I have already solved the problem but there have been others, but soon I put my solution
– Miguel
I agree with @pmg, but I also think this is not the problem. Apparently, the signature of the command differs from the parameters passed. Please highlight lines 300 and 308 of the file
main.c. Its code is very extensive, and these lines (as well as the signature of the commandmostrainfocliente) are the regions related to the problem.– Vinícius Gobbo A. de Oliveira
I suggest you lose this habit of using names like refe, ch, t etc. If you need a caption to know what is what, you can improve.
– Pablo Almeida