Pages: [1]   Go Down
Author Topic: ajuda com ponteiro  (Read 1520 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Boa noite, estou tendo uma dificuldade em conseguir salvar valores em um ponteiro estou inicializando ele sem nenhum valor, e quando tento colocar um valor nele para mostrar no lcd nao aparece nada. Gostaria de saber se alguem ae pode me ajudar, vou colocar o codigo aqui em baixo

* New Text Document (4).txt (2.25 KB - downloaded 23 times.)
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3289
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

O código não é assim tanto. Faz copy paste e coloca-o dentro das tags code.

Não percebi para que servem tantos apontadores e variáveis quando não passas os apontadores para dentro das funções, nem fazes return. :S
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Por enquanto só estou usando o vetor valor[5] e o ponteiro aponta valor, na verdade tentando usar hehe. Quero salvar um caracter digitado no primeiro elemento do vetor, depois o segundo e assim por diante, e imprimi-los, mais imprimendo sempre que um caracter for pressionado.
Code:
/*
Keypad sketch
prints the key pressed on a keypad to the serial port
*/
#include <LiquidCrystal.h>

#include<stdlib.h>

LiquidCrystal lcd(12,11,7,6,5,4);
const int numRows = 4; // number of rows in the keypad
const int numCols = 3; // number of columns
const int debounceTime = 100; // number of milliseconds for switch to be stable
const int debounceDelay = 50;
char key;
char valor[5];
char valor_anterior[4];
char *ponteiro_valor = &valor[0];
// keymap defines the character returned when the corresponding key is pressed
const char keymap[numRows][numCols] = {
{ '1', '2', '3' } ,
{ '4', '5', '6' } ,
{ '7', '8', '9' } ,
{ '.', '0', ',' }
};
// this array determines the pins used for rows and columns
const int rowPins[numRows] = { 70, 71, 72, 73 }; // Rows 0 through 3
const int colPins[numCols] = { 80, 45, 46 }; // Columns 0 through 2
void setup()
{
    lcd.begin (16,2);
   
for (int row = 0; row < numRows; row++)
{
pinMode(rowPins[row],INPUT); // Set row pins as input
digitalWrite(rowPins[row],LOW); // turn on Pull-ups
}
for (int column = 0; column < numCols; column++)
{
pinMode(colPins[column],OUTPUT); // Set column pins as outputs for writing
digitalWrite(colPins[column],HIGH); // Make all columns inactive
}
}
void loop()
{
 key = getKey();
if( key !=0) { // if the character is not 0 then it's a valid key press
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Got key ");
lcd.setCursor(0,1);
lcd.print(valor);
delay(100);

}
}
// returns with the key pressed, or 0 if no key is pressed
char getKey()
{
char key = 0;
delay(100);// 0 indicates no key pressed
for(int column = 0; column < numCols; column++)
{
digitalWrite(colPins[column],LOW);// Activate the current column.
for(int row = 0; row < numRows; row++) // Scan all rows for a key press.
{
if(digitalRead(rowPins[row]) == LOW) // Is a key pressed?
{
    //boolean debounce(int pin);
delay(debounceTime); // debounce
while(digitalRead(rowPins[row]) == LOW); // wait for key to be released
key = keymap[row][column];
//delay(60);// Remember which key was pressed.
}
}
digitalWrite(colPins[column],HIGH); // De-activate the current column.
}
   ponteiro_valor =& key;
  *ponteiro_valor ++;
return key; // returns the key pressed or 0 if none
}
 
Logged

central nervous system
Offline Offline
Full Member
***
Karma: 0
Posts: 135
Causing havoc inside your brain since 1980
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Estás a fazer

Code:
       ponteiro_valor &= key;

que é equivalente a

Code:
       ponteiro_valor = ponteiro_valor & key;

mas vê que ponteiro_valor aponta para o início de um vector; digamos que o vector comece na posição de memória 37:

Code:
        +---+---+---+---+---+
valor   | 0 | 0 | 0 | 0 | 0 |
        +---+---+---+---+---+
          ^
          |
         37  38  39  40  41

Se carregarmos a tecla '0' = 0x30 = 48, ponteiro_valor ganhará o valor 37 & 48 = 32, ou seja, vai acabar apontando para fora dos limites do vector.

O que tens que fazer é o seguinte:

Code:
       *ponteiro_valor++ = key;

Assim, vais preencher o vector com o caractere '0' e assim por diante.
« Last Edit: May 08, 2012, 07:11:53 am by neuron_upheaval » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Infelizmente não funcionou, quando eu coloco essa linha de código, não aparece nada no display, só aparece a primeira linha, a segunda só aparece quando eu coloco
Code:
*ponteiro_valor = key;
.
Mesmo tentando incrementar o ponteiro
Code:
*ponteiro_valor++;
em outra linha para mostrar valores como por exemplo 4, depois 45, depois 458 , ainda não esta funcionando.
Alguem sabe como posso fazer para mostrar cada tecla presionada, aloca-la no vetor e mostrar sem que a primeira seja apagada??? Vlw
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3289
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Acho que deves rever um pouco a lógica dos ponteiros...

No entanto, experimenta isto:

Code:
/*
Keypad sketch
prints the key pressed on a keypad to the serial port
*/
#include <LiquidCrystal.h>

#include<stdlib.h>

LiquidCrystal lcd(12,11,7,6,5,4);
const int numRows = 4; // number of rows in the keypad
const int numCols = 3; // number of columns
const int debounceTime = 100; // number of milliseconds for switch to be stable
const int debounceDelay = 50;
char key;
char valor[5];//isto é na realidade um ponteiro...
//char valor_anterior[4];
//char *ponteiro_valor = &valor[0]; //isto está errado...
char valor_index = 0;


// keymap defines the character returned when the corresponding key is pressed
const char keymap[numRows][numCols] = {
{ '1', '2', '3' } ,
{ '4', '5', '6' } ,
{ '7', '8', '9' } ,
{ '.', '0', ',' }
};
// this array determines the pins used for rows and columns
const int rowPins[numRows] = { 70, 71, 72, 73 }; // Rows 0 through 3
const int colPins[numCols] = { 80, 45, 46 }; // Columns 0 through 2
void setup()
{
    lcd.begin (16,2);
    valor[4] = '\0';//terminar a string.
   
for (int row = 0; row < numRows; row++)
{
pinMode(rowPins[row],INPUT); // Set row pins as input
digitalWrite(rowPins[row],LOW); // turn on Pull-ups
}
for (int column = 0; column < numCols; column++)
{
pinMode(colPins[column],OUTPUT); // Set column pins as outputs for writing
digitalWrite(colPins[column],HIGH); // Make all columns inactive
}
}
void loop()
{
 key = getKey();
if( key != 0) { // if the character is not 0 then it's a valid key press
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Got key ");
lcd.setCursor(0,1);
//lcd.print(valor); //isto também está errado... em lado nenhum escreves na variável valor.
//podes fazer...
lcd.print(key); //OU

valor[valor_index++] = key;
if (valor_index >= 3) { //indice 4 é o terminador de string, logo apenas vais imprimir 4 digitos.
   lcd.print(valor);
}

//Nota que tens de apagar uma destas opcões para isto correr como deve ser. 



delay(100);

}
}
// returns with the key pressed, or 0 if no key is pressed
char getKey()
{
char key = 0;
delay(100);// 0 indicates no key pressed
for(int column = 0; column < numCols; column++)
{
digitalWrite(colPins[column],LOW);// Activate the current column.
for(int row = 0; row < numRows; row++) // Scan all rows for a key press.
{
if(digitalRead(rowPins[row]) == LOW) // Is a key pressed?
{
    //boolean debounce(int pin);
delay(debounceTime); // debounce
while(digitalRead(rowPins[row]) == LOW); // wait for key to be released
key = keymap[row][column];
//delay(60);// Remember which key was pressed.
}
}
digitalWrite(colPins[column],HIGH); // De-activate the current column.
}
//   ponteiro_valor =& key;//ISTO ESTÁ ERRADO. É uma má prática de programacão.
//  *ponteiro_valor ++; //idem aspas aspas
return key; // returns the key pressed or 0 if none
}

Vê se isto resulta. Não garanto que resulte, porque estou a assumir que a biblioteca do LCD funciona como a Serial e que o keymap retorna ASCII. Mas pelo menos o problema do apontador fica resolvido.
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

O apontador esta funcionando, e incrementando, mais com alguns pequenos bugs.
Ele esta colocando o valor recebido pelo teclado no inicio e no fim, por exemplo, quando a tecla 2 é pressionada aparece 2, em seguida quando outra tecla é pressionada, por exemplo, 5, aparece 5 na mesma posição em que o caracter 2 apareceu, e quando outra tecla é precionada, por exemplo 7, o display imprime 7257.
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3289
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Não percebi o problema. :S
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quando uma tecla é pressionada ele mostra no display, quando uma segunda tecla é pressionada ele mostra na mesma posição da primeira, já quando uma terceira tecla é pressionada ele mostra na seguinte ordem: terceira, primeira, segunda, terceira. Quando uma quarta tecla é pressionada, é mostrado : quarta, primeira, segunda, terceira, quarta.
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3289
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Suspeito que tenhas lido o que deixei escrito no código... em todo o caso...

Code:

//podes fazer...
lcd.print(key); //OU

valor[valor_index++] = key;
if (valor_index >= 3) { //indice 4 é o terminador de string, logo apenas vais imprimir 4 digitos.
   lcd.print(valor);
}

//Nota que tens de apagar uma destas opcões para isto correr como deve ser. 


Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Pages: [1]   Go Up
Jump to: