__Aluno alunos[lab->capacidade];
não existe o struct 'lab', e sim o struct:
typedef struct Labaratorio{
char sala[5];
int capacidade;
}__Laboratorio;
acho que é isso.
O que ele quis dizer foi, da maneira mais simples, aproximadamente
isto:
(...)
typedef struct Turma{
struct Labaratorio *lab;
__Aluno *alunos;
}__Turma;
void criar_turma( __Turma *turma, __Laboratorio *lab )
{
turma->lab = lab;
turma->alunos = (__Aluno*)malloc( sizeof(__Aluno) *
lab->capacidade );
}
void liberar_turma( __Turma *turma )
{
free( turma->alunos );
turma->alunos = NULL;
}
int main(int argc, char *argv[])
{
__Laboratorio lab;
__Turma turma;
lab.capacidade = 10;
criar_turma( &turma, &lab );
system( "PAUSE > null " );
liberar_turma( &turma );
return 0;
}
[snip]
> __Aluno alunos[lab->capacidade];
O uso de identificadores com dois underscores é undefined behavior.
Assim como o uso de um underscore seguido de letra maiuscula.
Se você quiser impedir name clashes, use namespaces em C++ ou em C use
um prefixo que faça sentido pro seu módulo/projeto/companhia, etc.
[snip]
--
Felipe Magno de Almeida
O ideal de C++ é usar o paradigma que mais se encaixa no problema corrente.
E em C++ *geralmente* não é OO. Mas sim programação genérica.
O maior exemplo é a própria STL.
[snip]
> typedef struct Turma{
> struct Labaratorio *lab;
> __Aluno *alunos;
> }__Turma;
>
> void criar_turma( __Turma *turma, __Laboratorio *lab )
> {
> turma->lab = lab;
> turma->alunos = (__Aluno*)malloc( sizeof(__Aluno) *
> lab->capacidade );
> }
>
> void liberar_turma( __Turma *turma )
> {
> free( turma->alunos );
> turma->alunos = NULL;
> }
[snip]
esta forma seria o que encontraria em uma empresa, ou seja, eh uma
forma profissinal de resolver este problema?
ou esta eh uma forma de resolver o problema?
grato.
Não estou confundindo. Não tenho certeza sobre C, mas em C++ a
utilização destes identificadores resulta em undefined behavior.
Quanto estiver em casa vou procurar no meu padrão.
Isto depende do padrão adotado pela empresa. A solução que sugeri é
uma das formas mais simples de fazer o que você quer utilizando a
linguagem C padrão ANSI.
Mas quando você for fazer algo mais profissional (numa empresa ou em
um projeto acadêmico), provavelmente você utilizará C++ com classes
e STL, ou, se ANSI C for um requisito, você deverá utilizar
estruturas de dados com alocação dinâmica.
O exemplo que você deu é um típico problema de processamento de
dados, então é provável que você precise armazenar, restaurar e
processar os dados em um arquivo. Então uma versão mais completa
seria utilizando apenas alocação dinâmica, sem estruturas sendo
alocadas na pilha:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char matricula[10];
char nome[60];
int idade;
float peso;
} Aluno;
typedef struct {
char nome[60];
char disciplinas[50];
} Professor;
typedef struct {
char sala[5];
int capacidade;
} Laboratorio;
typedef struct {
Laboratorio *lab;
Aluno *alunos;
} Turma;
void criar_turma( Turma **turma, Laboratorio *lab )
{
*turma = (Turma*)malloc( sizeof(Turma) );
(*turma)->lab = lab;
(*turma)->alunos = (Aluno*)malloc( sizeof(Aluno) * lab->capacidade
);
}
void liberar_turma( Turma **turma )
{
free( (*turma)->alunos );
free( *turma );
*turma = NULL;
}
void criar_lab( Laboratorio **lab )
{
/* Deixo como um exercício para o leitor */
}
void liberar_lab( Laboratorio **lab )
{
/* Deixo como um exercício para o leitor */
}
void criar_aluno( Aluno **aluno )
{
/* Deixo como um exercício para o leitor */
}
void liberar_aluno( Aluno **aluno )
{
/* Deixo como um exercício para o leitor */
}
void criar_professor( Professor **prof )
{
/* Deixo como um exercício para o leitor */
}
void liberar_professor( Professor **prof )
{
/* Deixo como um exercício para o leitor */
}
int main(int argc, char *argv[])
{
Laboratorio *lab;
Turma *turma;
criar_lab( &lab );
lab.capacidade = 10;
criar_turma( &turma, &lab );
system( "PAUSE > NUL" );
liberar_turma( &turma );
liberar_lab( &turma );
return 0;
}
aqui deveria ser:
criar_turma( &turma, lab );
>
> system( "PAUSE > NUL" );
>
> liberar_turma( &turma );
> liberar_lab( &turma );
e aqui:
liberar_lab( &lab );
>
> return 0;
> }
>
>