Logo Hardware.com.br
Aquiles_MMX
Aquiles_MMX Membro Junior Registrado
88 Mensagens 1 Curtida

struct em C "storage size of"

#1 Por Aquiles_MMX 27/10/2009 - 16:54
Olá pessoal!

Estou iniciando um determinado programa que simula um gerenciador de impressão na tela do monitor pelo prompt de comando do windows.

Segue a parte do código que se refere ao erro:

MAIN:
[code=rich]
#include
#include
#include
#include "impressoras.h"

int main(){

char *str;
char divisor[] = "\n********************************************************************************";
Fila *f;
int i = 0;
Imp imp1;
(O erro está nesta linha)

printf("%s ************************ Gerenciador de Impressao ************************%s",
divisor, divisor);

inicializaImpressora(&imp1);
imprimeImpressora(imp1, 1);


system("PAUSE");
return 0;
}

[/code]

IMPRESSORAS.C
[code=rich]
#include
#include
#include

//Tipo estruturado de uma impressora
typedef struct impressora{
char str[400];
int estado; //Aqui é configurado o estado da impressora. 0 para desabilitada 1 para habilitada
}Imp;
[/code]

... continua mas não se refere ao erro que está dando...


Até onde sei este erro se refere a declaração da estrutura Imp (struct impresoras), mas a horas não consigo corrigir.
O erro é: "storage size of 'imp1' isn't known"
zerocow
zerocow Veterano Registrado
1.7K Mensagens 17 Curtidas
#2 Por zerocow
28/10/2009 - 05:04
Esse tipo de erro também aconteçe quando você tenta usar uma estrutura de não existe...
Essa estrutura esta declarada no header da impressora?

Se não, remova ele do source e adicione ao header...


Nota:
No source só devem contar estrutaras ligadas diretamente ou source, onde só são usadas no source...
Se a estrutura ou definição, ira ser usada em outra aréa do programa, ela deve ser declarada na header.
Apenas Quem Reinventou a Roda, Sabe o porque dela ser Redonda - DevilF
Aquiles_MMX
Aquiles_MMX Membro Junior Registrado
88 Mensagens 1 Curtida
#3 Por Aquiles_MMX
28/10/2009 - 08:35
zerocow disse:
Esse tipo de erro também aconteçe quando você tenta usar uma estrutura de não existe...
Essa estrutura esta declarada no header da impressora?

Se não, remova ele do source e adicione ao header...


Nota:
No source só devem contar estrutaras ligadas diretamente ou source, onde só são usadas no source...
Se a estrutura ou definição, ira ser usada em outra aréa do programa, ela deve ser declarada na header.


Sim, esta estrutura está declarada no arquivo impressoras.h que está incluso no source (aonde utilizo somente a main), mas todas as funções que operam uma estrutura do tipo impressoras estão definidas no header também, bastando o source, somente criar uma impressora e tratá-la através das funções no header.
Por um mundo melhor!




tpcvasco
tpcvasco General de Pijama Registrado
2.9K Mensagens 330 Curtidas
#5 Por tpcvasco
28/10/2009 - 17:30
Há um tempo não mexo com C, tb me confundo com essas coisas de header, mas vc não deveria declarar a estrutura Imp no .h ao invés do .c?
E tb não deveria ter um #include "impressoras.h" no impressoras.c?
"Milhouse: - Médicos e bombeiros são heróis.
Bart Simpson: - Olha, as casas continuam pegando fogo e as pessoas continuam doentes. Os verdadeiros heróis são os Schwarzenegger's, os Stallone's, e, em menores proporções, os Vandame's..."
Etinin
Etinin Veterano Registrado
1.3K Mensagens 34 Curtidas
#6 Por Etinin
28/10/2009 - 18:01
O que o zerocow disse está correto.

Essa parte do impressoras.c deve estar contida no impressoras.h (sem os includes, que são desnecessários). Se não tiver mais nada no impressora.c, passe a declaração da struct para o impressoras.h e livre-se dele.

O problema aqui é que o compilador não tem a declaração completa da struct na hora que vai compilar o arquivo main. Isso acontece ou porque o impressoras.c (que não deveria conter a declaração) não está sendo compilado junto com o main ou porque está sendo compilado depois.
Core 2 Quad Q6600 | Asus P5Q Deluxe | 2GB RAM | XFX 9800GTX+ | Unicomp SpaceSaver
Gentoo Linux / Windows 7

MacBook Pro 13" (2010) - Core 2 Duo 2.4 GHz | 4GB RAM | GeForce 320M
Darwin/x86 (Mac OS X 10.7)

iPhone 4 - Apple A4 (Cortex-A8 1GHz) | 512MB RAM | 16GB SSD
Darwin/ARM (iOS 5)
Etinin
Etinin Veterano Registrado
1.3K Mensagens 34 Curtidas
#8 Por Etinin
28/10/2009 - 20:07
jose_silva_neto disse:
Boa noite,

Dúvidas: nos arquivos de cabeçalho(a interface), não se inclui apenas os protótipos de funções ou outras definições básicas ? (estruturas e inclusões de outros .h por exemplo) O .c associado não é a implementação ? (que pode mudar)


Fiquem com Deus


A utilização considerada correta é essa mesmo, exceto pelos cabeçalhos que, em geral, são incluídos no arquivo C, com a exceção óbvia dos casos onde realmente haja necessidade, como dependência em uma estrutura declarada em outro cabeçalho. Não importa muito (já que cabeçalhos devidamente elaborados só podem ser incluidos uma vez, através do uso de #ifndef ou de #pragma once) mas é uma boa prática incluir os cabeçalhos apenas no arquivo onde forem utilizados, até porque fica mais fácil de visualizar caso o código seja alterado e a inclusão do cabeçalho não seja mais necessária.
Core 2 Quad Q6600 | Asus P5Q Deluxe | 2GB RAM | XFX 9800GTX+ | Unicomp SpaceSaver
Gentoo Linux / Windows 7

MacBook Pro 13" (2010) - Core 2 Duo 2.4 GHz | 4GB RAM | GeForce 320M
Darwin/x86 (Mac OS X 10.7)

iPhone 4 - Apple A4 (Cortex-A8 1GHz) | 512MB RAM | 16GB SSD
Darwin/ARM (iOS 5)
Aquiles_MMX
Aquiles_MMX Membro Junior Registrado
88 Mensagens 1 Curtida
#9 Por Aquiles_MMX
28/10/2009 - 20:35
Segue abaixo o código completo:

MAIN:

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

int main(){

char *str;
char divisor[] = "\n********************************************************************************";
Fila *f;
int i = 0;
Imp imp1;

printf("%s ************************ Gerenciador de Impressao ************************%s",
divisor, divisor);

inicializaImpressora(&imp1);
imprimeImpressora(imp1, 1);


system("PAUSE&quot;
return 0;
}


Impressoras.h

//Tipo estruturado de uma impressora
typedef struct impressora Imp;

//Tipo estruturado de um arquivo contido na fila
typedef struct arquivos Arq;

//Tipo estruturado da fila de arquivos
typedef struct fila Fila;

//Função que inicializa a fila de impressão
Fila* iniciarFila();

//Função que insere um arquivo na fila de impressão
void filaInsereArquivo(Fila* f, FILE *a);

//Função que verifica se a fila de impressão está vazia
int filaVazia(Fila* f);

//Função que retira um arquivo da fila de impressão
FILE* filaRetiraArquivo(Fila* f);

//Função que inicializa uma impressora
void inicializaImpressora(Imp *imp1);

//Função que concatena um caractere do arquivo na string da impressora
void concatenaImpressora(Imp* imp1, FILE *fo);

//Função que imprime o estado e a string de uma impressora
void imprimeImpressora(Imp *imp1, int i);


Impressoras.c

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

//Tipo estruturado de uma impressora
typedef struct impressora{
char str[400];
int estado; //Aqui é configurado o estado da impressora. 0 para desabilitada 1 para habilitada
}Imp;

//Tipo estruturado de um arquivo contido na fila
typedef struct arquivos{
FILE *arq;
struct fila* prox;
}Arq;

//Tipo estruturado da fila de arquivos
typedef struct fila{
Arq *ini;
Arq *fim;
}Fila;

//Função que inicializa a fila de impressão
Fila* iniciarFila(){

Fila *f = (Fila*)malloc(sizeof(Fila));
f->ini = f->fim = NULL;
return f;
}

//Função que insere um arquivo na fila de impressão
void filaInsereArquivo(Fila* f, FILE *a){

Arq *fo = (Arq*)malloc(sizeof(Arq)); //Aloca nó para novo arquivo da fila
fo->arq = a; //Armazena o arquivo no novo nó
fo->prox = NULL; //Passa o novo nó para última posição da fila
if(f->fim != NULL) //Verifica se a Fila não estava vazia
f->fim = fo;
else
f->ini = fo;
f->fim = fo; //Fila aponta para novo elemento
}

//Função que verifica se a fila de impressão está vazia
int filaVazia(Fila* f){

return (f->ini==NULL);

}

//Função que retira um arquivo da fila de impressão
FILE* filaRetiraArquivo(Fila* f){

Fila *t;
FILE *fo;

if(filaVazia(f)){
printf("\nFila Vazia!&quot;
system("PAUSE&quot;
exit(1);
}

t->ini = f->ini;
fo = t->ini->arq;
f->ini = t->ini;

if(f->ini == NULL)
f->fim = NULL;
free(t);

return fo;
}

//Função que inicializa uma impressora
void inicializaImpressora(Imp *imp1){

int i;

printf("Teste&quot;
imp1->estado = 0;
printf("Teste&quot;
for(i = 0; i < 400 ; i++){
imp1->str[i] = ' ';
printf("Teste&quot;
}

}

//Função que concatena um caractere do arquivo na string da impressora
void concatenaImpressora(Imp* imp1, FILE *fo){

}

//Função que imprime o estado e a string de uma impressora
void imprimeImpressora(Imp *imp1, int i){

char divisor[] = "\n--------------------------------------------------------------------------";

if(imp1->estado == 0)
printf("\nImpressora %d = Desabilitada&quot;
else
printf("\nImpressora %d = Habilitada&quot;

printf("%s%s%s\n", divisor, divisor, imp1->str);

}
Por um mundo melhor!




Etinin
Etinin Veterano Registrado
1.3K Mensagens 34 Curtidas
#10 Por Etinin
28/10/2009 - 21:12
Como já falei antes, tire a declaração completa das structs do impressoras.c e passe pro impressoras.h. O impressoras.c deve conter uma diretiva #include "impressoras.h".
Core 2 Quad Q6600 | Asus P5Q Deluxe | 2GB RAM | XFX 9800GTX+ | Unicomp SpaceSaver
Gentoo Linux / Windows 7

MacBook Pro 13" (2010) - Core 2 Duo 2.4 GHz | 4GB RAM | GeForce 320M
Darwin/x86 (Mac OS X 10.7)

iPhone 4 - Apple A4 (Cortex-A8 1GHz) | 512MB RAM | 16GB SSD
Darwin/ARM (iOS 5)
Aquiles_MMX
Aquiles_MMX Membro Junior Registrado
88 Mensagens 1 Curtida
#11 Por Aquiles_MMX
29/10/2009 - 23:05
Etinin disse:
Como já falei antes, tire a declaração completa das structs do impressoras.c e passe pro impressoras.h. O impressoras.c deve conter uma diretiva #include "impressoras.h".


Deu certo rapaz. Você acredita que já trabalhei com struct na faculdade há uns 6 meses atrás e eu tinha praticamente certeza de que se fazia desta forma que fiz, vi inclusive em um livro de estrutura de dados que tenho aqui, dessa forma que eu fiz.

Bem, se você souber o motivo, ou a explicação de por que uma struct tem que ser declarada no header em vez de no source eu fico contente em saber.

Obrigado!
Por um mundo melhor!




Etinin
Etinin Veterano Registrado
1.3K Mensagens 34 Curtidas
#12 Por Etinin
29/10/2009 - 23:10
A questão é que o compilador não tem como saber o tamanho de uma struct sem saber seus conteúdos. Quando você declara uma int mas não define, não importa, porque o tamanho do tipo int é sempre o mesmo, mas o tamanho de uma struct depende da quantidade e dos tipos de variáveis contidos.
Core 2 Quad Q6600 | Asus P5Q Deluxe | 2GB RAM | XFX 9800GTX+ | Unicomp SpaceSaver
Gentoo Linux / Windows 7

MacBook Pro 13" (2010) - Core 2 Duo 2.4 GHz | 4GB RAM | GeForce 320M
Darwin/x86 (Mac OS X 10.7)

iPhone 4 - Apple A4 (Cortex-A8 1GHz) | 512MB RAM | 16GB SSD
Darwin/ARM (iOS 5)
Aquiles_MMX
Aquiles_MMX Membro Junior Registrado
88 Mensagens 1 Curtida
#13 Por Aquiles_MMX
29/10/2009 - 23:22
Etinin disse:
A questão é que o compilador não tem como saber o tamanho de uma struct sem saber seus conteúdos. Quando você declara uma int mas não define, não importa, porque o tamanho do tipo int é sempre o mesmo, mas o tamanho de uma struct depende da quantidade e dos tipos de variáveis contidos.


Ha! Então se eu declaro essa struct em um sorce independente da main, ela não será reconhecida, mas se eu declaro pelo menos no header que é incluso pela main ela terá seus valores reconhecidos quando inicializado o programa.

Muito Obrigado Etinin!
Por um mundo melhor!




© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal