-
Notifications
You must be signed in to change notification settings - Fork 0
/
2010-05.html
437 lines (339 loc) · 23.5 KB
/
2010-05.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
<!DOCTYPE html>
<html lang="en-us" dir="ltr" itemscope itemtype="http://schema.org/Article">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Blogue do Caloni</title>
<meta name="author" content="Caloni" />
<meta name="generator" content="txt2blog 0.0.1">
<meta property="og:title" content="Blogue do Caloni"/>
<meta property="og:type" content="website"/>
<meta property="og:url" content="http://www.caloni.com.br"/>
<meta property="og:image" content="/img/about-brand.png"/>
<meta property="og:description" content="Write for computers, people and food."/>
<link href="/index.xml" rel="feed" type="application/rss+xml" title="Blogue do Caloni"/>
<link rel="stylesheet" type="text/css" href="/css/custom.css"/>
<link rel="stylesheet" type="text/css" href="/css/jquery-ui.css"/>
<script src="/js/jquery-1.12.4.js"></script>
<script src="/js/jquery-ui.js"></script>
<script src="/js/copy_clipboard.js"></script>
<script>
var quick_search_posts = [
];
</script>
<script src="/js/quick_search.js"></script>
<script src="/js/list.js"></script>
<link rel="icon" href="/img/favicon.ico"/>
</head>
<body style="min-height:100vh;display:flex;flex-direction:column">
<nav class="navbar has-shadow is-white"
role="navigation" aria-label="main navigation">
<div class="container">
<div class="navbar-brand">
<a class="navbar-item" href="months.html">
<div class="is-4"><b>caloni::2010-05</b></div>
</a>
</div>
</div>
</nav>
<div class="container">
<div class="column">
<div style="min-height:56vh">
<div style="padding-bottom: 1em;"></div>
<ul style="list-style: none;">
<li><small><a href="2010-05.html#mademoiselle_chambom">Mademoiselle Chambon</a></small></li>
<li><small><a href="2010-05.html#2_dias_em_paris">2 Dias em Paris</a></small></li>
<li><small><a href="2010-05.html#analogicamente_perfeito">Analogicamente perfeito</a></small></li>
<li><small><a href="2010-05.html#furia_de_titas">Fúria de Titãs</a></small></li>
<li><small><a href="2010-05.html#quincas_berro_dagua">Quincas Berro d'Água</a></small></li>
<li><small><a href="2010-05.html#modificadores_e_qualificadores_de_tipo">Modificadores e qualificadores de tipo</a></small></li>
<li><small><a href="2010-05.html#o_escritor_fantasma">O Escritor Fantasma</a></small></li>
<li><small><a href="2010-05.html#enum">Enum</a></small></li>
</ul>
<span id="mademoiselle_chambom" title="Mademoiselle Chambon"/></span>
<section id="section_mademoiselle_chambom">
<p class="title"><a href="2010-05.html#mademoiselle_chambom">#</a> <a class="external" href="https://www.imdb.com/title/tt1285246">Mademoiselle Chambon</a></p>
<span class="title-heading">Caloni, 2010-05-14 <a href="movies.html">movies</a><a href="2010-05.html"> <sup>[up]</sup></a> <a href="javascript:;" onclick="copy_clipboard('section#section_mademoiselle_chambom')"><sup>[copy]</sup></a></span>
<p>Mademoiselle Chambon é daqueles filmes um tanto naturalistas, em que você precisa prestar atenção, mas não muita, para perceber a relação sutil entre os personagens, e os acontecimentos poderiam ter sido narrados de eventos da vida real e não soariam fantásticos. A bem da verdade, o núcleo narrativo do filme de Stéphane Brizé com certeza já deve ter acontecido na realidade uma série de vezes. A virtude do filme é conseguir representar isso sem escandalizar em demasiado, se focando nos personagens.</p>
<p>Dito isto, é preciso ressaltar que a sexualidade do filme está bem escondida, mas é isso o que a mantém permanentemente presente, no ar. É como se quanto mais se escondesse o óbvio, mais ele insistisse em povoar nossas mentes, imaginando situações que circundam as conversas aparentemente despretensiosas e inocentes da professora de piano e do pai de um de seus alunos. Porém, ao entrar em cena elementos desses personagens -- como a falta de instrução do pai -- e detalhes sutis -- como um toque insistente em um CD -- fazem com que o desenrolar da história desencadeie não apenas no óbvio, mas um óbvio potencializado exatamente pelo que vimos durante todo o filme.</p>
</section><hr/>
<span id="2_dias_em_paris" title="2 Dias em Paris"/></span>
<section id="section_2_dias_em_paris">
<p class="title"><a href="2010-05.html#2_dias_em_paris">#</a> <a class="external" href="https://www.imdb.com/title/tt0841044">2 Dias em Paris</a></p>
<span class="title-heading">Caloni, 2010-05-16 <a href="movies.html">movies</a><a href="2010-05.html"> <sup>[up]</sup></a> <a href="javascript:;" onclick="copy_clipboard('section#section_2_dias_em_paris')"><sup>[copy]</sup></a></span>
<p>Estreia de Julie Delpy (atriz de <a href="2011-12.html#antes_do_amanhecer">Antes do Amanhecer</a>) na direção de longas-metragens, o filme já diz a que vem através do seu título. Ambientada na cidade-luz, essa comédia de costumes, obviamente, é mais focada em seus personagens. Jack (Adam Goldberg), um hipocondríaco cheio de manias que vai descobrindo a namorada de dois anos em dois dias em Paris e o reencontro dela com seus ex-amantes. Marion (Delpy), a narradora em off (supostamente onisciente) da história, fica mais à vontade em torno da família e de seus amigos. Traz uma narrativa e fotografia leves, com movimentos próximos, embora sem enquadramentos muitas vezes adequados (note como nas conversas com seus amigos seu namorado nunca é focado, mas fica ao fundo, com sua expressão de incredulidade). Por fim, muitas das situações criadas não servem tanto aos seus propósitos quanto se pensaria (o fato de talvez a mãe ter sido muito "liberal" com respeito a sexo adolescente e o pai ter sua exposição toda baseada em sexo não é tão absurdo assim em uma cidade como Paris).</p>
<p>Apenas quem nunca tenha visto qualquer filme francês achará diversos fatos como realmente atípicos. Discussões políticas ou sobre temas polêmicos (como racismo) parecem ter a única função de dar um ar de intelectualidade em toda aquela gente pelo simples estereótipo. Ora, pelo fato de estarmos em Paris, não há muita estranheza sobre os costumes dos próprios habitantes, e a coisa mais engraçada é perceber a estranheza dele frente a isso (e o fato dele ser hipocondríaco talvez tenha sido para arrancar mais risadas, mas não há muito disso no resto do filme).</p>
</section><hr/>
<span id="analogicamente_perfeito" title="Analogicamente perfeito"/></span>
<section id="section_analogicamente_perfeito">
<p class="title"><a href="2010-05.html#analogicamente_perfeito">#</a> Analogicamente perfeito</p>
<span class="title-heading">Caloni, 2010-05-19 <a href="coding.html">coding</a><a href="2010-05.html"> <sup>[up]</sup></a> <a href="javascript:;" onclick="copy_clipboard('section#section_analogicamente_perfeito')"><sup>[copy]</sup></a></span>
<p>É possível explicar tudo no mundo da informática através de analogias? Pela minha singela experiência de professor informal, eu acredito que sim. Durante esses dois anos, explanei diversos assuntos e, em todos eles, difíceis ou não, consegui um certo grau de sucesso graças ao uso de metáforas e parábolas.</p>
<p>De memória (ou buscando no meu blogue) consigo lembrar alguns tópicos e a forma como os expliquei. Em alguns até fiz um artigo sobre o assunto:</p>
<ul><li>Ponteiros 16 bits: rua e número de uma casa.</li>
<li>Typedefs: apelidos para nomes de pessoas.</li>
<li>Depuração: a ciência médica de House.</li>
<li>Passagem de argumentos por valor e por referência: e-mails com anexo e com linques.</li>
<li>Ponteiros: armário de gavetas.</li>
<li>Programadores: programadores de verdade não usam Java (brincadeira).</li>
<li>Agendamento de threads: guichê de CPUs.</li>
<li>Seções críticas: fila de threads dentro de uma sala.</li>
<li>Funções com retorno booleano: o dedo polegar dos romanos.</li>
<li>Pilha: uma pilha, só que de pratos e não bytes.</li>
<li>Binário: bichos-preguiça contando com seus únicos dois dedos.</li>
<li>Tipos: uma forma de bolo que só faz bolos com um único formato.</li>
<li>Definições x declarações de variáveis: hardware e software; OK, podemos chamar esse de meta-analogia =)</li>
<li>Depuração 2: séries de investigação forense como CSI.</li>
</ul>
<p>Acredito ser essa a melhor forma de desmistificar esse pequeno mundinho que parece incompreensível aos outros mortais. Até porque tudo que é criado no mundo dos computadores são abstrações do mundo real, que por sua vez são abstrações da mente humana.</p>
<p>É por isso que sempre digo que ciência da computação é uma arte-ciência da área de humanas.</p>
</section><hr/>
<span id="furia_de_titas" title="Fúria de Titãs"/></span>
<section id="section_furia_de_titas">
<p class="title"><a href="2010-05.html#furia_de_titas">#</a> <a class="external" href="https://www.imdb.com/title/tt0800320">Fúria de Titãs</a></p>
<span class="title-heading">Caloni, 2010-05-21 <a href="movies.html">movies</a><a href="2010-05.html"> <sup>[up]</sup></a> <a href="javascript:;" onclick="copy_clipboard('section#section_furia_de_titas')"><sup>[copy]</sup></a></span>
<p>Fúria de Titãs busca ser uma superprodução sobre deuses e humanos, mas falha miseravelmente em sua abordagem 3D, especialmente em suas transições, onde um bebê no barco parece distorcido ou a aparência de Hades quando este aparece entre os humanos.</p>
<p>Com uma introdução um tanto rápida do protagonista, talvez deixando pouco espaço para criação da empatia ou até da criação desse personagem, logo parte-se para as lutas, mas que quase nunca emplacam, tendo como muleta a sua forçada trilha sonora que não conta muito com criatividade. Mesmo nas sequências onde o remake deveria se sair melhor que o original datado, como a luta com o escorpião gigante, temos uma descompasso entre as cenas próximas de suas garras (rápido) e as cenas em que os personagens sobem em cima dele (lento), mesmo que esse ritmo se encaixe com a trilha sonora (que tem um raro bom momento). Outra falha notável é o fato do cenário ser 3D, mas o escorpião parecer em muitas ocasiões "fora" do quadro, como um efeito de projeção no fundo do cenário. Lembrou um Duna 3D (se esta tivesse sido feita com o uso da tecnologia). E, por fim, não há tensão, mesmo se tratando de uma luta mortal com um escorpião gigante, o que é um problema mais grave ainda, pois é disso que a aventura depende para engrenar. Como prêmio de consolação, o efeito visual das bruxas, do barqueiro e da Medusa são muito bem conduzidos, assim como as cenas de ação relacionadas com esses personagens.</p>
<p>Já a história possui alguns buracos ou detalhes que não fazem muito sentido, como os "homens-escorpião" ajudarem os humanos a combater os deuses mesmo que estes odeiem os humanos. Há uma parábola e simbolismo entre Perseus e Jesus: filho de deus supremo (Deus x Zeus), e pescador, tem que se sacrificar para salvar os humanos. A fala final de Zeus demonstra também isso, pois ele diz que não gostaria de sacrificar um filho pela humanidade. Temos também a figura dual entre deus e demônio representado por Zeus e Hades, pois os outros deuses no filme são menos coadjuvantes e mais enfeites de cenário. Por outro lado o filme encarna seres humanos tolos, levados pelo destino que é conduzido pelos deuses.</p>
<p>Por fim, a mania hollywoodiana de sempre mostrar tudo ao espectador, até a simples simbologia de morte de sua seguidora, enfraquece todo o mistério em torno de Olimpo. Curioso é que mesmo tendo tanto apelo visual por causa dos efeitos, carece de diálogos para explicar coisas óbvias, como quando um dos bichos voadores pega a bolsa com a cabeça da Medusa. Um trabalho ainda em desenvolvimento lançado aos gritos de 3D. Não funciona.</p>
</section><hr/>
<span id="quincas_berro_dagua" title="Quincas Berro d'Água"/></span>
<section id="section_quincas_berro_dagua">
<p class="title"><a href="2010-05.html#quincas_berro_dagua">#</a> <a class="external" href="https://www.imdb.com/title/tt1068962">Quincas Berro d'Água</a></p>
<span class="title-heading">Caloni, 2010-05-21 <a href="movies.html">movies</a><a href="2010-05.html"> <sup>[up]</sup></a> <a href="javascript:;" onclick="copy_clipboard('section#section_quincas_berro_dagua')"><sup>[copy]</sup></a></span>
<p>É uma comédia até que eficiente nos momentos em que o morto "participa" da "bebemoração" de seu grupo de amigos, mas carece de algum elemento que junte isso à sobriedade da família do defunto. Mesmo assim, essa espécie de Dom Casmurro versão alcoolizada tem o seu charme pela criação daquela atmosfera de filme de época, vida boêmia e a falta do famigerado e mais que atual politicamente correto.</p>
</section><hr/>
<span id="modificadores_e_qualificadores_de_tipo" title="Modificadores e qualificadores de tipo"/></span>
<section id="section_modificadores_e_qualificadores_de_tipo">
<p class="title"><a href="2010-05.html#modificadores_e_qualificadores_de_tipo">#</a> Modificadores e qualificadores de tipo</p>
<span class="title-heading">Caloni, 2010-05-28 <a href="coding.html">coding</a><a href="2010-05.html"> <sup>[up]</sup></a> <a href="javascript:;" onclick="copy_clipboard('section#section_modificadores_e_qualificadores_de_tipo')"><sup>[copy]</sup></a></span>
<p>"@caloni poderia pensar em fazer um artigo sobre os modificadores de tipo em c? os mais complexo, acho eu: volatile, enum, union, extern, etc"</p>
<p>Uma coisa de cada vez: existem **modificadores** (ou qualificadores) de tipo e **especificadores** de tipo. _Volatile_ e _extern_ se encaixam na primeira categoria, _enum_ e _union_ na segunda. Veremos um pouco desses dois lados da linguagem em doses paliativas.</p>
<h4>Padrão C (ISO/IEC 9899:1990)</h4>
<pre>
6.5.2.2 enum-specifier
enum
6.5.3 type-qualifier
const
volatile
6.5.2.1 struct-or-union
struct
union
6.5.1 storage-class-specifier
typedef
extern
static
auto
register
</pre>
<h4>Padrão C++ (ISO/IEC 14882:1998)</h4>
<pre>
type-specifier
enum-specifier
enum-specifier
enum
cv-qualifier
const
volatile
class-key
class
struct
union
storage-class-specifier
auto
register
static
extern
mutable
decl-specifier
storage-class-specifier
typedef
</pre>
<h4>Modificadores de tipo</h4>
<p>Um modificador de tipo é opcional na definição de um tipo e deve estar sempre relacionado com a declaração de alguma variável. Ele determina, em termos gerais, qual será a função dessa variável. Ela pode ser modificada? Onde ela se encontra no programa? Como ela será modificada?</p>
<p>Como exemplo rápido, temos abaixo uma variável que é atualizada pelo clock do processador e uma variável que não pode ser alterada após sua primeira atribuição:</p>
<pre>
volatile int* clockSecs = <algum-endereço-do-sistema>;
const float pi = 3.14;
</pre>
<p>Fica meio óbvio que a primeira variável possui seu valor volátil, ou seja, muda conforme o tempo passa, e não depende do próprio código (pode mudar sem sua permissão). A segunda variável também tem um uso explícito, uma vez que o valor de pi nunca será alterado (não nesse Universo).</p>
<h4>Especificadores de tipo</h4>
<p>Os especificadores de tipo possuem cada um sua peculiaridade. Os mais peculiares, que veremos nos próximos artigos, serão as enumerações e as construções bizarras de structs e unions.</p>
<pre>
enum Contador { um = 1, dois, tres, };
union Atoms { struct { int part1; int part2; } parts; int64 total; };
</pre>
<p>Aqui não é um compêndio teórico sobre a linguagem. Vamos falar particularmente da programação Windows, mas esteja livre para dar seus pitacos com respeito a outros sistemas operacionais e suas implementações igualmente exdrúxulas =)</p>
</section><hr/>
<span id="o_escritor_fantasma" title="O Escritor Fantasma"/></span>
<section id="section_o_escritor_fantasma">
<p class="title"><a href="2010-05.html#o_escritor_fantasma">#</a> <a class="external" href="https://www.imdb.com/title/tt1139328">O Escritor Fantasma</a></p>
<span class="title-heading">Caloni, 2010-05-28 <a href="movies.html">movies</a><a href="2010-05.html"> <sup>[up]</sup></a> <a href="javascript:;" onclick="copy_clipboard('section#section_o_escritor_fantasma')"><sup>[copy]</sup></a></span>
<p>O Escritor Fantasma é o tipo de thriller que, diferente da enxurrada de pistas e falsas-pistas que funcionam muito bem em Os Homens que não Amavam as Mulheres, ele nos leva a desvendar o mistério da trama recriando-o gradualmente em uma série de passos sutis, mas consistentes, que revelam em seu momento final um mosaico diferente na mente de cada espectador.</p>
<p>Seguindo essa cartilha fascinante, a trilha sonora do começo usa sons que lembra buzina de carro (e estamos justamente na parte em que os carros tentam sair da balsa), um simples esquilo revela uma informação vital em um único quadro, a ausência de um automóvel é o que dá tom a uma perseguição e por fim, claro, a brilhante sequência do bilhete indo de encontro à primeira-dama que demonstra o uso da técnica visual para relatar uma história em seu total controle: sutil, rápido, eficiente.</p>
</section><hr/>
<span id="enum" title="Enum"/></span>
<section id="section_enum">
<p class="title"><a href="2010-05.html#enum">#</a> Enum</p>
<span class="title-heading">Caloni, 2010-05-31 <a href="coding.html">coding</a><a href="2010-05.html"> <sup>[up]</sup></a> <a href="javascript:;" onclick="copy_clipboard('section#section_enum')"><sup>[copy]</sup></a></span>
<p>Padrão C (ISO/IEC 9899:1990)</p>
<pre>
6.5.2.2 enum-specifier
enum
Padrão C++ (ISO/IEC 14882:1998)
type-specifier
enum-specifier
enum-specifier
enum
</pre>
<p>Uma enumeração faz duas coisas: define um novo tipo, parecido com um inteiro, e cria uma **lista de constantes com nomes significativos**. A definição técnica do tipo de um enum é mais complicada, mas basicamente ele é um novo int.</p>
<p>Como funciona: definimos uma lista com cada elemento tendo um valor inteiro, geralmente único. Todos os nomes usados na lista passam a fazer parte do espaço de nomes atual e funcionam como constantes com o seu valor definido no início.</p>
<pre>
enum FileType // criamos o novo tipo inteiro FileType
{
Binary = 1, // Binary é uma constante com valor igual a 1
Text = 2, // Text é uma constante com seu sizeof igual a sizeof(FileType)
Mixed = 3 // Todas as constantes da enumeração são do mesmo tipo
};
</pre>
<p>Obs.: Os elementos que não possuem valor definido são definidos automaticamente como o valor do elemento anterior acrescidos de um. Se for o primeiro elemento, seu valor padrão é zero.</p>
<pre>
enum Numbers
{
zero, // igual a zero
one, // igual a um
two, // igual a dois
three // igual a tres
};
enum Hexa
{
JulioCesar = 1,
Lucio = 3,
Juan, // Juan = 3 + 1 = 4
Gilberto Silva = 6,
Felipe Melo // 6 + 1 = 7
};
</pre>
<p>_Detalhe bizarro_: você sabia que, apesar da vírgula ser usada para separar valores de enumeração, ela pode também terminar uma listagem? Por algum motivo exdrúxulo (se alguém quiser explicar), um valor de enumeração foi definido de tal forma que sempre poderá existir uma vírgula terminando ele:</p>
<pre>
enum VirgulaSafada {
um = 1,
dois,
tres, // o que essa vírgula no final tá fazendo aqui?
};
</pre>
<h4>Uso prático</h4>
<p>Geralmente usamos enumerações para definir valores únicos (tag) em um argumento de função, ou, mais moderno, como substituto daqueles antigos defines em C para mapas de bits. Nesse último caso não usamos o tipo da enumeração, pois ele pode conter apenas um valor único definido, e não um conjunto deles:</p>
<pre>
enum ModoDeServir
{
assado,
cozido,
frito,
cru
};
void Cook(Prato p, ModoDeServir ms);
main()
{
Cook(frango, cozido);
}
enum FileOpenMode
{
fomRead = 0x0001,
fomWrite = 0x0002,
fomOver = 0x0004,
fomDel = 0x0008,
};
void OpenFile(DWORD fileOpenMode);
main()
{
OpenFile(fomRead | fomWrite);
}
</pre>
<p>Note que usamos uma enumeração nesse último caso para termos um nome significativo para uma flag, além desse nome fazer de fato parte dos nomes do programa, e não um define que, para o compilador, não existe.</p>
<h4>Boas práticas</h4>
<p>Como os tipos da enumeração passam a pertencer ao namespace atual, eles podem se misturar facilmente com todos os nomes daquele namespace. Dessa forma, é útil e bem organizado definir um prefixo para os nomes, que pode ser formado pelas iniciais do nome da enumeração, como no exemplo acima (fom = **F**ile**O**pen**M**ode).</p>
<img src="img/enum_wNCAYCX.png"/>
<p>O surgimento do enum veio como evolução de uma prática já consagrada pelo uso na linguagem C, que eram as listas de valores constantes criados através de defines com algum prefixo em comum (FILE_SHARE_*, SW_SHOW_*, etc). Portanto, sempre que se encontrar em uma situação para criar esse tipo de lista, a enumeração é o caminho atualmente ideal.</p>
<pre>
// A listagem abaixo pode virar um enum...
#define FOM_READ 0x0001
#define FOM_WRITE 0x0002
#define FOM_OVER 0x0004
#define FOM_DEL 0x0008
// ... como este aqui!
enum FileOpenMode
{
FOM_READ = 0x0001,
FOM_WRITE = 0x0002,
FOM_OVER = 0x0004,
FOM_DEL = 0x0008,
};
// esse pedaço de código abaixo...
int main()
{
OpenFile(path, FOM_WRITE);
}
// ... vira isso após ser pré-processado...
int main()
{
OpenFile(path, 0x0002);
}
// ... mas isso se fossem usados enums...
int main()
{
OpenFile(path, FOM_WRITE); // FOM_WRITE faz parte da linguagem
}
</pre>
<h4>Atualização: e qual a diferença?</h4>
<p>Perguntado <a href="http://www.caloni.com.br/blog/enum#comment-17806">por um leitor</a> sobre qual a diferença prática do último exemplo, onde temos praticamente o mesmo resultado entre usar defines e enumerações, imaginei que a mesma dúvida pode ter surgido para várias pessoas, porque é uma boa dúvida. Dá a entender que o autor deste artigo está se atentando a preciosismos da linguagem (e está mesmo!), mas à vezes as aparências enganam.</p>
<p>Para ilustrar melhor fiz um mais elaborado. Aqui, estamos lendo pedaços de dados que tiveram que ser alinhados com alguma "gordura".</p>
<pre>
// alinhamento obrigatório pelo leiaute dos dados
#define CHUNKSZ_BASE 0x5000
#define CHUNKSZ_TINY 0x1000 + CHUNKSZ_BASE
#define CHUNKSZ_SMALL 0x2000 + CHUNKSZ_BASE
#define CHUNKSZ_MEDIUM 0x4000 + CHUNKSZ_BASE
#define CHUNKSZ_HUGE 0x8000 + CHUNKSZ_BASE
// alinhamento obrigatório pelo leiaute dos dados
static const int chunkSizeBase = 0x5000;
enum ChunkSize
{
chunkszTiny = 0x1000 + chunkSizeBase,
chunkszSmall = 0x2000 + chunkSizeBase,
chunkszMedium = 0x4000 + chunkSizeBase,
chunkszHuge = 0x8000 + chunkSizeBase,
};
// Fonte original
int main()
{
// lendo quadro pedaços de dados (tamanho médio)
ReadChunkFromFile(file, CHUNKSZ_MEDIUM * 4);
// lendo quadro pedaços de dados (tamanho médio)
ReadChunkFromFile(file, chunkszMedium * 4);
}
// Pós-processado
int main()
{
// lendo sei lá o que (perde alinhamento)
ReadChunkFromFile(file, 0x4000 + CHUNKSZ_BASE * 4);
// lendo quadro pedaços de dados (tamanho médio)
ReadChunkFromFile(file, chunkszMedium * 4);
}
</pre>
<p>_Aviso para os programadores mais calejados, eu omiti propositalmente os parênteses obrigatórios para qualquer define que tenha cálculos matemáticos, para ilustrar que muitas vezes o que vemos **antes** não é o que aparece **depois.**_</p>
</section><hr/>
<span style="float: left;">
<a href="2010-04.html">[2010-04]</a>
<a href="2010-06.html">[2010-06]</a>
</span>
</div>
</div>
</section>
<footer class="footer">
<div class="container">
</div>
</footer>
</body>
</html>