Robótica Livre
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Ir para baixo
BielRibas
BielRibas
Mensagens : 266
Data de inscrição : 27/02/2019
Idade : 18
Escola : Col. Lindaura

Tentativa do exercício 4.16 Empty Tentativa do exercício 4.16

Ter maio 25, 2021 4:39 pm
/*
* CURSO DE ROBOTICA 2021
*
* Exercicio: 4.16
* Tema: Ponteiros e Volume de Dados
* Atividade: Comparar a performance de analise de vetor versus ponteiro
* Descrição: Usar um vetor do tamanho da memória e carregar com dados pela porta serial, medir o tempo da soma dos dados usando metodo de vetor e de ponteiro,
* Hardware: Inicializar a porta serial
* Comandos: Serial.begin(9600), Serial.println(); * ; & ;
* Dica1: Ponteiro é uma variável especial e guarda o endereço de uma posição de memória
* Dica2: Para declarar um ponteiro usa-se o operador *
* Dica3: * também é usado para acessar o conteudo do endereço
* Dica4: O operador & é usado para indicar o endereço de uma variável
* Dica5: A memória do Arduino nano tem 2048 bytes logo pode ser endereçada do 0x000 até 0x7FF
* Dica6: No Serial.print é possível formatar o dado usando (int) ou outro tipo. Ex. Serial.print((int)&p8bits);
* Dica7: Usar a função while() para leitura da porta serial até completar o vetor em todas as posições de memoria
* Dica8: Realizar a soma de todas as posições usando acesso diretamente aos elementos do vetor
* Dica9: Realizar a soma usando o ponteiro para acessar os elementos do vetor diretamente na memória
* Dica10: Cronometrar o tempo de execução das somas e comparar
*/

//DEFINICOES INICIAIS
#define TMAX 1000 //Definição do Tamanho Máximo em 1000

//DECLARAcAO DE VARIAVEIS GLOBAIS
byte vetor1 [TMAX]; //Declaração do vetor1
byte *p; //Declaração do ponteiro
bool carregado = 0; ///Declaração da variável tipo bool como "carregado" iniciado em 0
long cronometro; //Declaração da variável tipo long como "cronometro"
double soma = 0; ///Declaração da variável tipo double como "soma" iniciado em 0

//INICIALIZAÇÃO DO HARDWARE
void setup() {
Serial.begin(9600); //Velocidade do Monitor Serial
p = &vetor1[0]; //Ponteiro é igual ao vetor na posição 0

}

//FUNÇÕES COMPLEMENTARES


//PROGRAMA PRINCIPAL
void loop() {
//1° parte - coletar os 1500 caracteres da porta serial

while(Serial.available()){ //Análise de dados para leitura da porta serial
if (p < &vetor1 [TMAX] ) {
*p = Serial.read(); //Leitura de dados da Porta Serial, guardado o conteúdo lido no endereço "p"
p ++; //Incrementa a variável "p"
} else {
Serial.read (); //Leitura dos dados da serial
carregado =1; //Se carregado estiver igual a 1
}
Serial.print ((int) (p - &vetor1 [0])); //Mostra o valor do ponteiro menos o valor do &vetor1 [0], mostra o quanto falta
Serial.print (" "); //Imprime espaço no Monitor Serial
Serial.println(Serial.available ()); //Leitura da porta serial
}

//2° parte - fazer a soma usando método de vetor

if (carregado == 1){ //Se carregado estiver igual a 1
cronometro = micros (); //Inicia o cronômetro com a variável micros
for(int count = 0 ; count < TMAX ; count++) { //Contador
soma += vetor1 [count]; //soma das posições até 1500
}
Serial.print(micros () - cronometro); //O valor de micros menos o cronômetro,o tempo de execução
Serial.print("foi o tempo de execucao por vetor, e a soma = "); //Imprime no Monitor Serial a seguinte frase: "foi o tempo de execucao por vetor, e a soma = "
Serial.println(soma); //Imprime no Monitor Serial o valor da variável soma
delay(1000); //Tempo de pausa de 1000.

//3° parte - Soma usando ponteiro

soma = 0; //Reinicia o contador
cronometro = micros();
for( p = &vetor1 [0] ; p < vetor1 [TMAX] ; p++) { //Contador
soma += *p; //Soma é maior ou igual ao conteúdo do ponteiro
}
Serial.print(micros () - cronometro); //O valor de micros menos o cronômetro, o tempo de execução
Serial.print("foi o tempo de execucao por vetor, e a soma = "); //Imprime no Monitor Serial a seguinte frase: "foi o tempo de execucao por vetor, e a soma = "
Serial.println(soma); //Imprime no Monitor Serial o valor da variável soma
delay(10000); //Tempo de pausa de 10000.
p = &vetor1 [10]; //O ponteiro é igual ao vetor na décima posição
carregado = 0; //Reinicia a variável carregado
soma = 0; //Reinicia a variável soma
}

//Para reiniciar os contadores

p = &vetor1 [0]; //Ponteiro é igual ao vetor na posição 0
carregado = 0; //Reinicia a variável carregado
soma = 0; //Reinicia a variavel soma
delay(500); //Tempo de pausa de 500
}
BielRibas
BielRibas
Mensagens : 266
Data de inscrição : 27/02/2019
Idade : 18
Escola : Col. Lindaura

Tentativa do exercício 4.16 Empty Re: Tentativa do exercício 4.16

Ter maio 25, 2021 4:40 pm
Professor, não consegui acessar os resultados, dava enter mas ia de um em um...
Paulo Augusto Batista
Paulo Augusto Batista
Admin
Mensagens : 5039
Data de inscrição : 11/02/2019
Idade : 52
Escola : Colegio Lindaura
https://roboticalivre.forumeiros.com

Tentativa do exercício 4.16 Empty Re: Tentativa do exercício 4.16

Dom maio 30, 2021 7:00 pm
Estava analisando o programa e o problema está no último bloco do programa, aquele reinicia os contadores, ele deve ficar dentro do bloco da 2a. parte do programa.
Se ficar ali fora ele vai rodar toda vez que o programa entrar em espera dos dados e reinicia os contadores, que deve ser reiniciado somente no final das somas.

Vou dar nota 5.0 até arrumar o código.
BielRibas
BielRibas
Mensagens : 266
Data de inscrição : 27/02/2019
Idade : 18
Escola : Col. Lindaura

Tentativa do exercício 4.16 Empty Re: Tentativa do exercício 4.16

Ter Jun 01, 2021 1:52 pm
/*
* CURSO DE ROBOTICA 2021
*
* Exercicio: 4.16
* Tema: Ponteiros e Volume de Dados
* Atividade: Comparar a performance de analise de vetor versus ponteiro
* Descrição: Usar um vetor do tamanho da memória e carregar com dados pela porta serial, medir o tempo da soma dos dados usando metodo de vetor e de ponteiro,
* Hardware: Inicializar a porta serial
* Comandos: Serial.begin(9600), Serial.println(); * ; & ;
* Dica1: Ponteiro é uma variável especial e guarda o endereço de uma posição de memória
* Dica2: Para declarar um ponteiro usa-se o operador *
* Dica3: * também é usado para acessar o conteudo do endereço
* Dica4: O operador & é usado para indicar o endereço de uma variável
* Dica5: A memória do Arduino nano tem 2048 bytes logo pode ser endereçada do 0x000 até 0x7FF
* Dica6: No Serial.print é possível formatar o dado usando (int) ou outro tipo. Ex. Serial.print((int)&p8bits);
* Dica7: Usar a função while() para leitura da porta serial até completar o vetor em todas as posições de memoria
* Dica8: Realizar a soma de todas as posições usando acesso diretamente aos elementos do vetor
* Dica9: Realizar a soma usando o ponteiro para acessar os elementos do vetor diretamente na memória
* Dica10: Cronometrar o tempo de execução das somas e comparar
*/

//DEFINICOES INICIAIS
#define TMAX 1000 //Definição do Tamanho Máximo em 1000

//DECLARAcAO DE VARIAVEIS GLOBAIS
byte vetor1 [TMAX]; //Declaração do vetor1
byte *p; //Declaração do ponteiro
int count = 0; ////Declaração da variável tipo int como "count" iniciado em 0
bool carregado = 0; ///Declaração da variável tipo bool como "carregado" iniciado em 0
double cronometro; //Declaração da variável tipo double como "cronometro"
long soma = 0; ///Declaração da variável tipo long como "soma" iniciado em 0

//INICIALIZAÇÃO DO HARDWARE
void setup() {
Serial.begin(9600); //Velocidade do Monitor Serial
p = &vetor1[0]; //Ponteiro é igual ao vetor na posição 0

}

//FUNÇÕES COMPLEMENTARES


//PROGRAMA PRINCIPAL
void loop() {
//1° parte - coletar os 1500 caracteres da porta serial

while(Serial.available()){ //Análise de dados para leitura da porta serial
if (p < &vetor1 [TMAX] ) {
*p = Serial.read(); //Leitura de dados da Porta Serial, guardado o conteúdo lido no endereço "p"
p ++; //Incrementa a variável "p"
} else {
Serial.read (); //Leitura dos dados da serial
carregado = 1; //Se carregado estiver igual a 1
}
Serial.print ((int) (p - &vetor1 [0])); //Mostra o valor do ponteiro menos o valor do &vetor1 [0], mostra o quanto falta
Serial.print (" "); //Imprime espaço no Monitor Serial
Serial.println(Serial.available ()); //Leitura da porta serial
}

//2° parte - fazer a soma usando método de vetor

if (carregado == 1){ //Se carregado estiver igual a 1
cronometro = micros (); //Inicia o cronômetro com a variável micros
for(int count = 0 ; count < TMAX ; count++) { //Contador
soma += vetor1 [count]; //soma das posições até 1500
}
Serial.print(micros () - cronometro); //O valor de micros menos o cronômetro,o tempo de execução
Serial.print("foi o tempo de execucao por vetor, e a soma = "); //Imprime no Monitor Serial a seguinte frase: "foi o tempo de execucao por vetor, e a soma = "
Serial.println(soma); //Imprime no Monitor Serial o valor da variável soma
delay(1000); //Tempo de pausa de 1000.

//3° parte - Soma usando ponteiro

soma = 0; //Reinicia o contador
cronometro = micros();
for( p = &vetor1 [0] ; p < vetor1 [TMAX] ; p++) { //Contador
soma += *p; //Soma é maior ou igual ao conteúdo do ponteiro
}
Serial.print(micros () - cronometro); //O valor de micros menos o cronômetro, o tempo de execução
Serial.print("foi o tempo de execucao por vetor, e a soma = "); //Imprime no Monitor Serial a seguinte frase: "foi o tempo de execucao por vetor, e a soma = "
Serial.println(soma); //Imprime no Monitor Serial o valor da variável soma
delay(10000); //Tempo de pausa de 10000.
p = &vetor1 [10]; //O ponteiro é igual ao vetor na décima posição
carregado = 0; //Reinicia a variável carregado
soma = 0; //Reinicia a variável soma
}
}




// agora fiz assim, mas o resultado da soma sempre dá = 0.00
Paulo Augusto Batista
Paulo Augusto Batista
Admin
Mensagens : 5039
Data de inscrição : 11/02/2019
Idade : 52
Escola : Colegio Lindaura
https://roboticalivre.forumeiros.com

Tentativa do exercício 4.16 Empty Re: Tentativa do exercício 4.16

Ter Jun 08, 2021 12:27 am
Oi Gabriel, Tenho várias tratativas nesse exercício, uma delas e que fiz o teste e o resultado foi
700.00foi o tempo de execucao por vetor, e a soma = 91549 //veja que o tempo de execução por vetor foi 700ms, o esperado para essa operação
4.00foi o tempo de execucao por vetor, e a soma = 0 //já o tempo de execução por vetor foi rápido demais.
Olhando o código veja essa linha: for( p = &vetor1 [0] ; p < vetor1 [TMAX] ; p++) { //Contador
Nela deveria ser carregado o endereço do inicio do vetor e contar até o endereço do fim do vetor.
Para ter o endereço do inicio do vetor deve ser referenciado assim &vetor1[0] e o endereço do fim do vetor deveria ser assim &vetor1[TMAX]

Sobre o uso dos ponteiros conseguiu entender melhor depois desse exercício.?

Vou dar nota 7.0 até corrigir o programa. Mas gostaria também que os comentários sobre o ponteiro demonstrassem melhor entendimento.
Conteúdo patrocinado

Tentativa do exercício 4.16 Empty Re: Tentativa do exercício 4.16

Ir para o topo
Permissões neste sub-fórum
Não podes responder a tópicos