Como contar quantidade de posições em vetor dinâmico [RESOLVIDO]

1. Como contar quantidade de posições em vetor dinâmico [RESOLVIDO]

Mistery
Cmistry

(usa Ubuntu)

Enviado em 08/01/2020 - 17:26h

Quando vou imprimir os elementos do vetor, ele imprimi até a quantidade do valor da primeira entrada.
Ex.: Se informado:

10 7 8 6 8 9 3 6 1 2 3

A quantidade de elementos acima é 11, só que imprimi apenas até a quantidade do primeiro número da entrada "10". E observa-se também, que esse primeiro número não é impresso novamente.

7 8 6 8 9 3 6 1 2 3

Sintaxe que tenho desde então...

#include <stdio.h>
#include <stdlib.h>
int main(){

int *v;
int i, n;
scanf ("%d", &n);
v = malloc (n * sizeof (int));
//Escrevendo no vetor
for (i = 0; i < n; ++i)
scanf ("%d", &v[i]);
//Imprimindo elementos do vetor
for( i = 0 ; i < n; i++ ){
printf("%d ", v[i]);
}
free(v);
printf("\n");
}

N sei como que faz pra destacar o código aqui no fórum, se tmb poder me ajudar. Grato.
https://ideone.com/UMiG7o


  


2. Re: Como contar quantidade de posições em vetor dinâmico [RESOLVIDO]

Adriano Siqueira
adrisiq

(usa KDE Neon)

Enviado em 08/01/2020 - 18:46h

Que estranho, no meu executou corretamente. Só adicionei algumas perfumarias:
#include <stdio.h>
#include <stdlib.h>

int main() {
int *vetor;
int quantidade;

printf("Quantidade de elementos: ");
scanf(" %i", &quantidade);

vetor = malloc(quantidade * sizeof(int));

//Escrevendo no vetor
for (int i = 0; i < quantidade; ++i) {
printf("Valor [%i de %i]: ", (i + 1), quantidade);
scanf(" %i", &vetor[i]);
}

//Imprimindo elementos do vetor
printf("--------------------------------------------- \n");
printf("Saída: \n");
for (int i = 0; i < quantidade; i++) {
printf("%i \t", vetor[i]);
}
printf("\n--------------------------------------------- \n");

free(vetor);
}

Saída:
Quantidade de elementos: 3
Valor [1 de 3]: 1
Valor [2 de 3]: 2
Valor [3 de 3]: 3
---------------------------------------------
Saída:
1 2 3
---------------------------------------------



3. Re: Como contar quantidade de posições em vetor dinâmico [RESOLVIDO]

Adriano Siqueira
adrisiq

(usa KDE Neon)

Enviado em 08/01/2020 - 18:49h

PS: Para formatar código aqui é só clicar no botão '</>' em cima do editor.


4. Sim, está funcionando perfeitamente. Só não soube como exatamente fazer essa pergunta.

Mistery
Cmistry

(usa Ubuntu)

Enviado em 08/01/2020 - 19:04h

adrisiq escreveu:

Que estranho, no meu executou corretamente. Só adicionei algumas perfumarias:
#include <stdio.h>
#include <stdlib.h>

int main() {
int *vetor;
int quantidade;
/*
*
*/
free(vetor);
}

Saída:
Quantidade de elementos: 3
Valor [1 de 3]: 1
Valor [2 de 3]: 2
Valor [3 de 3]: 3
---------------------------------------------
Saída:
1 2 3
---------------------------------------------


Será que há uma maneira dele me informar a quantidade ao invés de eu informa pra ele, Aparti da quantidade de amostras informado?


5. Re: Como contar quantidade de posições em vetor dinâmico [RESOLVIDO]

Adriano Siqueira
adrisiq

(usa KDE Neon)

Enviado em 09/01/2020 - 12:40h

Você até consegue, mas não vale a pena por alguns motivos:
1- O procedimento só funciona com vetores, não com ponteiros.
2- Para criar um vetor é necessário informar o tamanho (então por que não armazenar esse tamanho em uma variável?).
3- O procedimento não funciona fora da função onde o vetor foi criado (explicação no código).
#include <stdio.h>
#include <stdlib.h>

/**
* Usando vetor convencional, funciona perfeitamente.
*/
void teste1() {
int vetor[5];
int quantidade = sizeof(vetor) / sizeof(vetor[0]);

printf("Quantidade: %i \n", quantidade);
}

/**
* Não dá para determinar a quantidade de elementos a partir de um ponteiro.
*/
void teste2() {
int *vetor = malloc(5 * sizeof(int));
int quantidade = sizeof(vetor) / sizeof(vetor[0]);

printf("Quantidade: %i \n", quantidade);
}

/**
* Por mais que você esteja esperando um vetor, o que será fornecido é um ponteiro
* para a primeira posição desse vetor. E como vimos, não dá para calcular a partir
* de um ponteiro.
*/
void teste3_1(int vetor[]) {
int quantidade = sizeof(vetor) / sizeof(vetor[0]);

printf("Quantidade: %i \n", quantidade);
}

/**
* Mesmo resultado do teste3_1.
*/
void teste3_2(int *vetor) {
int quantidade = sizeof(vetor) / sizeof(vetor[0]);

printf("Quantidade: %i \n", quantidade);
}

/**
* Quando se precisa passar um vetor para uma função, é necessário que essa função
* receba o tamanho do vetor também, pois não é possível calcular a quantidade
* de elementos.
*/
void teste4(int vetor[], int quantidade) {
printf("Quantidade: %i \n", quantidade);
}

int main() {
teste1(); // Funciona
teste2(); // Não funciona

int vetor[5];
teste3_1(vetor); // Não funciona
teste3_2(vetor); // Não funciona

int quantidade = sizeof(vetor)/ sizeof(vetor[0]);
teste4(vetor, quantidade); // Funciona

return EXIT_SUCCESS;
}

Como vemos no teste 3, não importa se você quer receber um vetor ou um ponteiro, o que será fornecido é um ponteiro. Logo o teste3_1 e teste3_2 são exatamente a mesma coisa.


6. Re: Como contar quantidade de posições em vetor dinâmico [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 10/01/2020 - 06:07h

Eu acho particularmente interessante a pergunta que está no título. Porque, se a alocação é dinâmica, você já sabe a quantidade de elementos no momento da alocação (ou realocação). Sendo assim, você não tem de contar coisa alguma depois, porque já a conhece de antemão.

Adicionalmente, com o programa original, você não deve se surpreender com o fato de que a entrada “10 7 8 6 8 9 3 6 1 2 3”, composta por onze números inteiros, separados uns dos outros com espaços, produza uma saída com dez elementos. O primeiro número é consumido pela chamada a scnaf() que determina a quantidade de elementos (no caso, justamente dez elementos) e os números seguintes são consumidos pelo laço de repetição que popula cada um dos dez elementos do array dinamicamente alocado.



... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


7. Obgd pela atenção.

Mistery
Cmistry

(usa Ubuntu)

Enviado em 11/01/2020 - 21:32h


adrisiq escreveu:

Você até consegue, mas não vale a pena por alguns motivos:
1- O procedimento só funciona com vetores, não com ponteiros.
2- Para criar um vetor é necessário informar o tamanho (então por que não armazenar esse tamanho em uma variável?).
3- O procedimento não funciona fora da função onde o vetor foi criado (explicação no código).
#include <stdio.h>
#include <stdlib.h>
/*
*
*/
int main() {
teste1(); // Funciona
teste2(); // Não funciona

int vetor[5];
teste3_1(vetor); // Não funciona
teste3_2(vetor); // Não funciona

int quantidade = sizeof(vetor)/ sizeof(vetor[0]);
teste4(vetor, quantidade); // Funciona

return EXIT_SUCCESS;
}

Como vemos no teste 3, não importa se você quer receber um vetor ou um ponteiro, o que será fornecido é um ponteiro. Logo o teste3_1 e teste3_2 são exatamente a mesma coisa.





8. Obgd pela atenção, consegui em C++

Mistery
Cmistry

(usa Ubuntu)

Enviado em 11/01/2020 - 21:34h

Consegui o que queria em c++, vou continuar o projeto aqui...

https://www.vivaolinux.com.br/topico/C-C++/C-for-referencias-e-sintaxe






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts