paulo1205
(usa Ubuntu)
Enviado em 06/02/2022 - 23:57h
Bruuh escreveu:
Sempre que você inicia um array, todos os valores são iguais a zero, de forma que a única coisa q tu tem que fazer é pegar o tamanho do array e usar como argumento em um loop for que checa x vezes se o valor do vetor é ou não zero.
Cuidado, porque C não é Java.
Em C, declarar um
array só é suficiente para garantir que seus elementos serão todos preenchidos com zero se for um
array alocado estaticamente (e.g. em escopo de arquivo ou em escopo de bloco mas com o modificador
static ).
Arrays declarados com alocação automática (escopo de bloco sem o modificador
static ) e que não possuam uma lista de valores de inicialização para seus elementos têm valores iniciais indeterminados para tais elementos. Também
arrays alocados dinamicamente com
malloc (),
realloc () e
alloca () têm valores iniciais indefinidos para seus elementos. Por outro lado, se houver uma lista de inicialização acompanhando a declaração, os elementos com valores explicitamente discriminados terão esses valores, e os demais elementos terão valor zero, independentemente do tipo de alocação ser estática ou automática.
// Escopo de arquivo: alocação estática.
int arr1[10]; // Todos os 10 elementos têm valor zero.
int arr2[10]={1, 2, 3}; // Equivalente a {1, 2, 3, 0, 0, 0, 0, 0, 0, 0};
void func(void){
// Escopo local.
static char arr3[10]; // Alocação estática: todos os dez elementos têm valor zero.
char arr4[10]; // Alocação automática simples: valores iniciais desconhecidos.
char arr5[10]="Teste"; // Alocação automática com lista de inicialização: equivalente a {'T', 'e', 's', 't', 'e', 0, 0, 0, 0, 0};
int *arr6=malloc(10*sizeof *arr6); // Alocação dinâmica em memória livre: valores iniciais desconhecidos.
int *arr7=calloc(10, sizeof *arr7); // Alocação dinâmica em memória livre com calloc(): valores iniciais zerados.
int *arr8=alloca(10*sizeof *arr8); // Alocação dinâmica em memória automática (não precisa de desalocação manual, pois é recolhido ao final da função): valores iniciais desconhecidos.
/* ... */
// Devolve valores alocados dinamicamente à memória livre.
free(arr7);
free(arr6);
}
Em java ficaria assim:
int list[] = new list[10];
list[0] = 1;
int count = 0;
for(int i = 0; i < list.length; i++){
if(list[ i] != 0){
count++;
}
}
System.out.println(count + " registros foram usados no vetor");
Claro que, se você declarar algum valor como zero, não funcionaria. Mas se fosse uma List, e não um Array, você poderia simplesmente usar o método nomeDaLista.size(), já que cada valor da list tem que ser declarado manualmente, sendo impossível declarar valores vazios.
Pois é: não creio que, num caso geral, possa-se assumir que se um valor é zero então não está em uso.
Usando apenas os tipos nativos do C, a única forma de saber quantos elementos de um
array estão em uso é ter uma variável companheira do
array que fica guardando a quantidade de elementos em uso, e é responsabilidade do programador atualizar o valor dessa variável a cada inclusão ou exclusão de elementos no
array .
... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)