Eu gostaria de fazer três matrizes do mesmo comprimento. De acordo com a documentação , as matrizes devem ser definidas como int myArray[10];
onde 10 pode ser substituído por um comprimento conhecido (outro número inteiro) ou preenchido com uma matriz {2, 3, 5, 6, 7}
.
No entanto, quando tentou declarar um valor int arrSize = 10;
e, em seguida, uma série com base nesse tamanho int myArray[arrSize];
, eu recebo o seguinte: error: array bound is not an integer constant
.
Existe uma maneira de determinar de forma variável os tamanhos de matriz ou eu apenas preciso codificá-los? (Foi-me ensinado que codificar é ruim e é algo a evitar a todo custo.)
programming
variables
code-optimization
user3.1415927
fonte
fonte
Respostas:
Sua pergunta tem 2 partes, na verdade.
1 / Como posso declarar o tamanho constante de uma matriz fora da matriz?
Você pode usar uma macro
ou use uma constante
se você inicializou a matriz e precisa saber seu tamanho, pode fazer:
o segundo
sizeof
está no tipo de cada elemento da sua matriz, aquiint
.2 / Como posso ter uma matriz cujo tamanho seja dinâmico (isto é, desconhecido até o tempo de execução)?
Para isso, você precisará de alocação dinâmica, que funciona no Arduino, mas geralmente não é aconselhável, pois isso pode fazer com que o "heap" fique fragmentado.
Você pode fazer (maneira C):
Ou (maneira C ++):
Para obter mais informações sobre problemas com a fragmentação de heap, você pode consultar esta pergunta .
fonte
ARRAY_SIZE = sizeof myArray / sizeof myArray[0];
, dessa forma, você pode alterar o tipo de myArray sem introduzir bugs. Pela mesma razãomyArray = realloc(myArray, size * sizeof *myArray);
,. Aliás, lançar o valor de retorno demalloc()
ourealloc()
também é inútil. 2) A verificaçãomyArray != 0
na versão C é inútil, comorealloc(NULL, sz)
é equivalente amalloc(sz)
.O tamanho da matriz deve ser conhecido em tempo de compilação. Caso contrário, você deve alocar memória dinamicamente usando:
onde x (um número inteiro) pode ser definido no código do aplicativo (você pode carregá-lo da eeprom se desejar que seja uma configuração persistente, mas configurável).
No entanto, se você quiser apenas declarar algumas matrizes do mesmo tamanho, basta declarar o número uma constante como esta:
Eu acho que não codificar as coisas só faz sentido se você razoavelmente espera que o usuário queira alterar a configuração em algum momento. Não sei se é esse o caso.
fonte
Se você souber o comprimento máximo da matriz, basta inicializar a matriz com esse comprimento e use um número inteiro para informar ao programa quanto dessa matriz usar. Se for a diferença entre 7,10 bytes, você não estará desperdiçando tanta alocação de memória.
fonte
Eu sei que estou um pouco atrasado aqui, mas em teoria matrizes regulares não podem ser criadas usando uma variável para definir a quantidade de elementos que a matriz terá como em:
Isso exibirá um erro, pois ao declarar a matriz, o programa espera que o valor entre colchetes seja constante. No entanto, existe uma maneira de criar uma matriz com uma variável que define a quantidade de valores que essas matrizes terão por meio da alocação de memória dinâmica para conjuntos de valores (esse método foi testado apenas com matrizes monodimensionais, não tentei multidimensional ainda), e é mais ou menos assim:
Depois disso, basta atribuir um valor para cada elemento criado na instância myArray (que já é uma matriz agora), como faria para uma matriz normal criada como myArray [arrSize].
fonte