All #define are simply a replacement text made by pre-compiler.
So with point 1 the declaration is:
int frase[1][1] = { {31, 36, 68, 36, 31} }
point 2 it's not the same. You have 2 array/variables and second point the first (I think in wrong way).
I think not compile and also point 1 it's strange.
However, I think the answer to your question is that initializations need to be constants known at compile time.
Since the #define in point 1 is just textual substitution it will work.
The other in point 2 is a standard variable. (You haven't provided enough context to tell if it is static or automatic.) The initialization happens at run time, so the variable is considered empty at compile time, so you can't use it to initialize another variable.
All #define are simply a replacement text made by pre-compiler.
So with point 1 the declaration is:
int frase[1][1] = { {31, 36, 68, 36, 31} }
point 2 it's not the same. You have 2 array/variables and second point the first (I think in wrong way).
I think not compile and also point 1 it's strange.
hahaha thank you're advice.. little by little im understand when we use define and not. define is value constant. right ?
Really the compiler is intelligent and not create a variable const but do a substitution like #define (tested in another thread in italian with other programmers and seeing the assembly code generated using #define vs. const)
Now you declare a const as byte. So you define for the constant also the type. Not possible for @define
Some command/function are not a really function but a macro, a #define with parameters.
For example min() function it's a macro (see on Arduino.h) that use the inline if => (test) ? true : false