Todos sabemos que uma string em C,
é um vetor de caracteres, ou de bytes
como muitos preferem dizer.
O estudante de C deve entender que o C
não verifica limites de variáveis
ou de matrizes em tempo de execução
cabe a nós, reservar um byte a mais no
fim da string, para o terminador null.
Quando precisamos retornar uma string
de uma função em C, O modo mais correto
é alocar memória para a variável que
receberá a string na própria função,
e ainda não devemos esquecer de fazer
a liberação com free no final.
Neste exemplo estamos retornando algumas
frases uma por vez ao usuário do programa,
e apesar dos poucos caracteres retornados,
que não chega a 40 bytes decidimos
por sugestão do VS alocar memória para
a variável que retornará o ponteiro
para a função chamada.
O assunto sobre alocação de memória em C
é muito amplo, e um tanto complexo e enfadonho,
e geralmente polêmicos, porque teríamos que
compreender perfeitamente o que são ( stack e heap ),
e como utilizá-los e isto deixaria o post muito longo.
Em algumas outras linguagens por onde passei,
umas (três ou quatro) e que possuo conhecimentos
básicos, ou intermediários, nós conhecemos o
tipo string de uma classe string,
com seus métodos e membros prontos que ajuda muito
os programadores, mas mesmo assim ainda acho que
o C é uma ótima linguagem de programação para início.
Neste nosso caso se o retorno indicado pela função
não tivesse sido feito, certamente
teríamos alguns erros desagradáveis,
mas na verdade isto nem chega a acontecer
porque nem a IDE, e nem muito menos
o compilador permitiria esta ação.
Devemos assumir que aprender
programação nos dias de hoje,
com os avanços das ferramentas que
monitora cada palavra digitada por
nós no editor de texto corrigindo
síntaxe, oferecendo sugestões,
fazendo lembretes de ponto e vírgulas,
esquecidos, tipos de retorno errado,
ou retorno feito em funções void,
ficou muito mais fácil.
Mas nem sempre foi assim, o bloco de notas
e uma linha de comando era tudo o que
muitos tiveram no começo, e foram
com isto que formaram o que temos hoje.
Para este programa simples poderíamos
criá-lo no console do windows,
mas como tive tempo suficiente resolvi
criá-lo para rodar numa interface gráfica
do MFC, caixa de diálogo para ser mais claro.
Hoje com o pouco de conhecimento que adiquerimos
poderíamos fazê-lo rodar numa interface gráfica
do Wind 32, C#, C++ com o Qt, C++ com o C++ Builder,
C++ com .Net (CLI), mas preferi fazê-lo em MFC.
Se precisarem de alguma ajuda e se estiver
nos meus alcances com certeza ajudarei.
Assistam o vídeo por favor.
//=========================================================================
void CCalculandoIMCDlg::Informe ( ) {
CDC* pDC = GetDC ( );
CFont font;
VERIFY ( font.CreateFont (
18, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_NORMAL, // nWeight
TRUE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
_T ( "Times New Roman" ) ) );
pDC->SelectObject ( font );
CPen PenBlack ( PS_SOLID, 3, RGB ( 0, 0, 0 ) );
//CBrush BrushAqua ( RGB ( 255, 0, 255 ) );
pDC->SelectObject ( PenBlack );
//pDC->SelectObject ( BrushAqua );
pDC->RoundRect ( CRect ( 197, 275, 355, 235 ), CPoint ( 8, 8 ) );
pDC->SetTextColor ( RGB ( 255, 0, 0 ) );
pDC->TextOut ( 205, 240, L"Por: " );
pDC->SetTextColor ( RGB ( 0, 0, 0 ) );
pDC->TextOut ( 235, 240, L"Samuel Lima " );
pDC->SetTextColor ( RGB ( 0, 0, 255 ) );
pDC->TextOut ( 205, 255, L"sa_sp10@hotmail.com" );
}
//=========================================================================
//Criando uma moldura em MFC
void CCalculandoIMCDlg::OnDraw ( CDC* pDC ) {
CPen PenBlue ( PS_SOLID, 10, RGB ( 0, 0, 255 ) );
pDC->SelectObject ( PenBlue );
pDC->RoundRect ( CRect ( 5, 5, 545, 290 ), CPoint ( 10, 10 ) );
}
//=========================================================================