Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

PsySc0rpi0n

Matriz bidimensional - optimização de código

Mensagens Recomendadas

PsySc0rpi0n

Boas...

De vez em quando, para passar o tempo (não é que eu tenha muito, mas...) tento fazer qualquer coisa em C só para tentar não esquecer.

Desta vez tentei criar uma matriz bidimensional, e colocar um valor a percorrer toda a matriz, partindo de um ponto dado pelo user.

Ou seja, algo assim:

Se a matriz for 5 x 5 e o ponto de partida for por exemplo: x = 2 e y = 3 a matriz deve começar por ser assim:

0 1 2 3 4

[0][0][0][0][0]0

[0][0][0][0][0]1

[0][0][0][0][0]2

[0][0][8][0][0]3

[0][0][0][0][0]4

O código que tenho, sei que não está flawless e queria ver as possíveis optimizações.

Sei que a validação de input está longe de ser ideal e acho que em algumas circunstâncias, a própria escrita de valores na matriz dá erros de memória quando a função free(matrix); é executada!

O que podia melhorar? O que está errado??

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

# define CLEAR_INPUT while (getchar() != '\n' ) /*void*/

int* create_matrix(int h, int w){
   int* tmp_mtx = NULL;

   if ((tmp_mtx = calloc (sizeof(int), h * w)) == NULL){
       printf ("Memory Error!\n");
       exit (-1);
   }

   return tmp_mtx;
}

void rotate_value (int* mtrx, int h, int w, int** x, int** y){
   (**x)++;//incrementa a posição
   if ( (**x == w) && (**y == (h - 1)) ){//se a posição x já estiver fora dos limites e estiver na última linha possível
       mtrx[**y + (**x - 1) * w] = 0;//voltar atrás uma posição na coord x e apagar o que lá está
       **x = 0, **y = 0;//colocar ambas as coords na posição inicial da matriz
   } else if (**x == w) {//se apenas a coord x estiver fora dos limites 
       mtrx[**y + (**x - 1) * w] = 0;//andar uma posição para trás na coord x, e apagar o valor que lá estiver
       (**y)++, **x = 0;//incrementar uma linha, ou seja, incrementar a coord y e colocar a coord x no início da linha
   } else if (**y == h) {//se a coord y estiver fora dos limites
       mtrx[(**y - 1) + (**x) * w] = 0;//andar uma linha para cima e apagar o valor que lá estiver
   } else {//se não for detectado nenhum dos limites anteriores
       mtrx[**y + (**x - 1) * w] = 0;//andar uma posição para trás na coord x, e apagar o valor que lá estiver
   }
   mtrx[**y + (**x) * w] = 8;//escrever o valor 8 na posição actual
}

void print_matrix (int* mtrx, const int h, const int w){
   for (int i = 0; i < h; i++){
       for (int j = 0; j < w; j++) 
           printf("[%d] ", mtrx [i + j * w]);
       putchar ('\n');
   }
   putchar ('\n');
}

void matrix_animation (int* mtrx, int h, int w, int* x, int* y){
   for (int i = 0; i < h; i++){
       for (int j = 0; j < w; j++){
           printf ("x = %d\t y = %d\n", *x, *y);
           rotate_value (mtrx, h, w, &x, &y);
           print_matrix (mtrx, h, w);
           getchar ();
           printf ("\x1b[3;J\x1b[H\x1b[2J");
       }
   }
}

int main (int argc, char** argv){
   int* matrix = NULL;
   int x, y, h, w;
   int check = 0;

   /*----------------------------------------------*/
   printf ("\x1b[3;J\x1b[H\x1b[2J");
   printf ("Matrix Width:\n");
   do {
       check = scanf("%d", &w);
       printf ("w = %d\tcheck = %d\n", w, check);
       if (check != 1)
           printf ("Value not read! Try again:\n");
   } while (check != 1);

   /*----------------------------------------------*/
   printf ("Matrix Height:\n");
   do {
       check = scanf("%d", &h);
       printf ("h = %d\tcheck = %d\n", w, check);
       if (check != 1)
           printf ("Value not read! Try again:\n");
   } while (check != 1);

   /*----------------------------------------------*/
   printf ("Enter starting point: <col><space><line>:\n");
   while (check != 2 || x > w || y > h){
       check = fscanf(stdin, "%d %d", &x, &y);
       printf ("x = %d\ty = %d\tcheck = %d\n", x, y, check);
       if (check != 2)
           printf ("2 values required for columns and lines! Try again:\n");
       if (x > w || y > h)
           printf ("Starting point coordinates are out of bounds! Try again:\n");
   }
   matrix = create_matrix (h, w);
   CLEAR_INPUT;
   matrix[y + x * w] = 8;
   print_matrix (matrix, h, w);
   getchar ();
   printf ("\x1b[3;J\x1b[H\x1b[2J");
   matrix_animation (matrix, h, w, &x, &y);

   free (matrix);

   return 0;
}

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
seuqram

(x > w || y > h)

, Se tiveres por exemplo o tamanho da matriz 5 por 5, essa condição deixa que o x e o y sejam 5,5 o que está fora de range da memoria alocada.

void rotate_value (int* mtrx, int h, int w, int** x, int** y)

Nesta função, eu não percebo porque é que passas o x e o y por pointer de pointer.

Editado por seuqram
  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

@ HappyHiipyHippo, pois, já percebi que essa função podia ser escusada e usar um loop na função main com o código dela.

E quanto ao resto do código, o que podia melhorar?

(x > w || y > h)

, Se tiveres por exemplo o tamanho da matriz 5 por 5, essa condição deixa que o x e o y sejam 5,5 o que está fora de range da memoria alocada.

Vou verificar essa situação!

void rotate_value (int* mtrx, int h, int w, int** x, int** y)

Nesta função, eu não percebo porque é que passas o x e o y por pointer de pointer.

Para poder alterar o valor dessas vari«aveis, caso contrário, assim que terminasse a função, o valor não era alterado na função main!

Já corrigi:

Ficou assim essa linha:

while (check != 2 || x >= w || y >= h)

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
seuqram
Para poder alterar o valor dessas vari«aveis, caso contrário, assim que terminasse a função, o valor não era alterado na função main!

Então passa por pointer e não por pointer de pointer

rotate_value (mtrx, h, w, x, y);

void rotate_value (int* mtrx, int h, int w, int* x, int* y)

Deste que estejas a apontar para o bloco de dados que o x e o y representam, consegues mudar os dados . Não precisas de ter um pointer a apontar para o pointer.

Na função matrix animation há um loop que não faz sentido.

E o que é queres fazer na função rotate_value?

Editado por seuqram

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Então passa por pointer e não por pointer de pointer

rotate_value (mtrx, h, w, x, y);

void rotate_value (int* mtrx, int h, int w, int* x, int* y)

Deste que estejas a apontar para o bloco de dados que o x e o y representam, consegues mudar os dados . Não precisas de ter um pointer a apontar para o pointer.

Claro, tens razão! Estava com ideia que de cada vez que uma função "nesta" outra, passando valores por referência, o endereço passado à primeira tinha que se passar à segunda, usando um ponteiro para ponteiro!

void rotate_value (int* mtrx, int h, int w, int* x, int* y){ 
   (*x)++;
   if ( (*x == w) && (*y == (h - 1)) ){
       mtrx[*y + (*x - 1) * w] = 0;
       *x = 0, *y = 0;
   } else if (*x == w) {
       mtrx[*y + (*x - 1) * w] = 0;
       (*y)++, *x = 0;
   } else if (*y == h) { 
       mtrx[(*y - 1) + (*x) * w] = 0;
   } else {
       mtrx[*y + (*x - 1) * w] = 0;
   }   
   mtrx[*y + (*x) * w] = 8;
}

E quanto à validação de dados? Eu acho que aquilo não estará muito bem!


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
seuqram

Achas que esta condição vai ser alguma vez chamada?

if (**y == h)

Diz-me porque é que achas que não está bem.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define CLEAR_SCREEN printf ("\x1b[3;J\x1b[H\x1b[2J")
#define CLEAR_INPUT while (getchar() != '\n' ) /*void*/
#define MATRIX_CELL(m, x, y) ((m).array[(y) + (x) * (m).width])

typedef struct
{
   int * array;
   unsigned int width;
   unsigned int height;

   struct
   {
       unsigned int x;
       unsigned int y;
   } person;
} Matrix;

Matrix create_matrix(unsigned int w, unsigned int h) {
   Matrix matrix;

   if (h == 0 || w == 0) {
       printf ("Invalid matrix size : %dx%d\n", w, h);
       exit (-1);
   }

   if ((matrix.array = calloc (sizeof(int), w * h)) == NULL){
       printf ("Memory Error!\n");
       exit (-1);
   }
   matrix.width = w;
   matrix.height = h;
   matrix.person.x = 0;
   matrix.person.y = 0;

   return matrix;
}

void clear_matrix(Matrix matrix) {
   free(matrix.array);
}

Matrix set_person_in_matrix(Matrix matrix, unsigned int x, unsigned int y) {
   matrix.person.x = x;
   matrix.person.y = y;

   MATRIX_CELL(matrix, x, y) = '8';

   return matrix;
}

Matrix move_person_in_matrix(Matrix matrix) {
   MATRIX_CELL(matrix, matrix.person.x, matrix.person.y) = 0;

   matrix.person.x = (matrix.person.x + 1) % matrix.width;
   matrix.person.y = matrix.person.x == 0 ? ((matrix.person.y + 1) % matrix.height) : matrix.person.y;

   MATRIX_CELL(matrix, matrix.person.x, matrix.person.y) = '8';

   return matrix;
}

void print_matrix (Matrix matrix) {
   for (unsigned int y = 0; y < matrix.height; y++) {
       for (unsigned int x = 0; x < matrix.width; x++)
           printf("[%c] ", MATRIX_CELL(matrix, x, y) ? MATRIX_CELL(matrix, x, y) : ' ');
       putchar ('\n');
   }
   putchar ('\n');
}

int main (int argc, char** argv){
   Matrix matrix;
   int x, y, h, w;
   int check = 0;

   /*----------------------------------------------*/
   CLEAR_SCREEN;
   printf ("Matrix Width:\n");
   do {
       check = scanf("%d", &w);
       CLEAR_INPUT;

       printf ("w = %d\tcheck = %d\n", w, check);
       if (check != 1)
           printf ("Value not read! Try again:\n");
   } while (check != 1);

   /*----------------------------------------------*/
   CLEAR_SCREEN;
   printf ("Matrix Height:\n");
   do {
       check = scanf("%d", &h);
       CLEAR_INPUT;

       printf ("h = %d\tcheck = %d\n", w, check);
       if (check != 1)
           printf ("Value not read! Try again:\n");
   } while (check != 1);

   /*----------------------------------------------*/
   CLEAR_SCREEN;
   printf ("Enter starting point: <col><space><line>:\n");
   do
   {
       check = scanf("%d %d", &x, &y);
       CLEAR_INPUT;

       printf ("x = %d\ty = %d\tcheck = %d\n", x, y, check);
       if (check != 2)
           printf ("2 values required for columns and lines! Try again:\n");
       if (x >= w || y >= h)
           printf ("Starting point coordinates are out of bounds! Try again:\n");
   } while (check != 2 || x >= w || y >= h);

   matrix = set_person_in_matrix(create_matrix (w, h), x, y);

   for (unsigned int i = 0; i < w * h; i++)
   {
       CLEAR_SCREEN;
       print_matrix (matrix);
       getchar ();

       matrix = move_person_in_matrix(matrix);
   }

   clear_matrix(matrix);

   return 0;
}

  • Voto 2

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Achas que esta condição vai ser alguma vez chamada?

if (**y == h)

Diz-me porque é que achas que não está bem.

Provavelmente não. Eu fiz algumas tentativas para acertar nesta função e a última que fiz, esta que apresentei, acabei por tentar abranger todas as possibilidades de haver valores fora dos limites da matriz. Mas neste caso, como o incremento é feito na horizontal, da esquerda para a direita, o y nunca vai sair dos limites porque sai primeiro o x.


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
seuqram

E em vez de estares sempre a fazer isto depois das condições:

mtrx[*y + (*x - 1) * w] = 0; 
mtrx[*(y - 1) + *x  * w] = 0;
//....

podes meter no principio da função apenas um

mtrx[*y + *x * w] = 0;

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

E em vez de estares sempre a fazer isto depois das condições:

mtrx[*y + (*x - 1) * w] = 0; 
mtrx[*(y - 1) + *x  * w] = 0;
//....

podes meter no principio da função apenas um

mtrx[*y + *x * w] = 0;

Bem visto! Fiz isso para a escrita do 8, mas não me lembrei de o fazer para a escrita do 0.

Quanto ao user input validation, acho que se tentares breckar o código usando várias tentativas erradas de introduzir os dados, acho que várias dão problemas!

A minha função está agora assim:

void rotate_value (int* mtrx, int h, int w, int* x, int* y){    
   mtrx[*y + (*x) * w] = 0;
   (*x)++;

   if ( (*x == w) && (*y == (h - 1)) ){
       *x = 0, *y = 0;
   } else { 
       if (*x == w)
           (*y)++, *x = 0;
   }   

   mtrx[*y + (*x) * w] = 8;
}

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Yeah... Naice!

Só não sei se a minha user input validation está correcta ou não! Já alterei o fscanf para apenas scanf, não fazia sentido!

Então o meu código está assim:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define CLEAR_INPUT while (getchar() != '\n' ) /*void*/
#define CLEAR_SCREEN printf ("\x1b[3;J\x1b[H\x1b[2J")

int* create_matrix(int h, int w){
   int* tmp_mtx = NULL;

   if ((tmp_mtx = calloc (sizeof(int), h * w)) == NULL){
       printf ("Memory Error!\n");
       exit (-1);
   }  

   return tmp_mtx;
}

void rotate_value (int* mtrx, int h, int w, int* x, int* y){    
   mtrx[*y + (*x) * w] = 0;
   (*x)++;

   if ( (*x == w) && (*y == (h - 1)) ){
       *x = 0, *y = 0;
   } else {
       if (*x == w)
           (*y)++, *x = 0;
   }

   mtrx[*y + (*x) * w] = 8;
}

void print_matrix (int* mtrx, const int h, const int w){
   for (int i = 0; i < h; i++){
       for (int j = 0; j < w; j++)
           printf("[%d] ", mtrx [i + j * w]);
       putchar ('\n');
   }
   putchar ('\n');
}

void matrix_animation (int* mtrx, int h, int w, int* x, int* y){
   for (int i = 0; i < h; i++){
       for (int j = 0; j < w; j++){
           print_matrix (mtrx, h, w);
           rotate_value (mtrx, h, w, x, y);
           getchar ();
           printf ("\x1b[3;J\x1b[H\x1b[2J");
       }
   }
}

int main (int argc, char** argv){
   int* matrix = NULL;
   int x, y, h, w;
   int check = 0;

   CLEAR_SCREEN;
   printf ("Matrix Width:\n");
   do {
       check = scanf("%d", &w);
       CLEAR_INPUT;
       if (check != 1)
           printf ("Value not read! Try again:\n");
   } while (check != 1);

   printf ("Matrix Height:\n");
   do {
       check = scanf("%d", &h);
       CLEAR_INPUT;
       if (check != 1)
           printf ("Value not read! Try again:\n");
   } while (check != 1);

   printf ("Enter starting point: <col><space><line>:\n");
   while (check != 2 || x >= w || y >= h){
       check = scanf("%d %d", &x, &y);
       CLEAR_INPUT;
       if (check != 2)
           printf ("2 values required for columns and lines! Try again:\n");
       if (x >= w || y >= h)
           printf ("Starting point coordinates are out of bounds! Try again:\n");
   }

   matrix = create_matrix (h, w);
   CLEAR_INPUT;

   /*matrix[y + x * w] = 8;
   print_matrix (matrix, h, w);
   getchar ();
   */
   CLEAR_SCREEN;
   matrix_animation (matrix, h, w, &x, &y);

   free (matrix);

   return 0;
}

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
seuqram

Mete clear input dentro do loop dos scanfs como o Happy fez. Assim, se deres um input inválido, como por exemplo uma string, o que o scanf iria ignorar, já não ficas preso no loop. (O scanf só limpa o input se o aceitar)

Tens de verificar se o w,h,x e y são maiores que 0, ou apenas no caso do x e y também iguais a 0.

Editado por seuqram

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Certo...

Código corrigido!

Ainda assim há mais uma coisa menos elegante.

Não função main fui obrigado a colocar lá o primeiro loop da "animação" da matriz porque se não o pusesse lá, o primeiro '8' não era apresentado nas coordenadas do ponto de partida estipulado pelo user, mas sim na posição seguinte!


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Então e se meteres o rotate depois do print...

Referes-te ao rotate dentro da função matrix_animation??


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Assim

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define CLEAR_INPUT while (getchar() != '\n' ) /*void*/
#define CLEAR_SCREEN printf ("\x1b[3;J\x1b[H\x1b[2J")

int* create_matrix(int h, int w){
   int* tmp_mtx = NULL;

   if ((tmp_mtx = calloc (sizeof(int), h * w)) == NULL){
       printf ("Memory Error!\n");
       exit (-1);
   }  

   return tmp_mtx;
}

void rotate_value (int* mtrx, int h, int w, int* x, int* y){    
   mtrx[*y + (*x) * w] = 0;
   (*x)++;

   if ( (*x == w) && (*y == (h - 1)) ){
       *x = 0, *y = 0;
   } else {
       if (*x == w)
           (*y)++, *x = 0;
   }

   mtrx[*y + (*x) * w] = 8;
}

void print_matrix (int* mtrx, const int h, const int w){
   for (int i = 0; i < h; i++){
       for (int j = 0; j < w; j++)
           printf("[%d] ", mtrx [i + j * w]);
       putchar ('\n');
   }
   putchar ('\n');
}

void matrix_animation (int* mtrx, int h, int w, int* x, int* y){
   for (int i = 0; i < h; i++){
       for (int j = 0; j < w; j++){
           print_matrix (mtrx, h, w);
           rotate_value (mtrx, h, w, x, y);
           getchar ();
           printf ("\x1b[3;J\x1b[H\x1b[2J");
       }
   }
}

int main (int argc, char** argv){
   int* matrix = NULL;
   int x, y, h, w;
   int check = 0;

   CLEAR_SCREEN;
   printf ("Matrix Width:\n");
   do {
       check = scanf("%d", &w);
       CLEAR_INPUT;
       if (check != 1)
           printf ("Value not read! Try again:\n");
   } while (check != 1);

   printf ("Matrix Height:\n");
   do {
       check = scanf("%d", &h);
       CLEAR_INPUT;
       if (check != 1)
           printf ("Value not read! Try again:\n");
   } while (check != 1);

   printf ("Enter starting point: <col><space><line>:\n");
   while (check != 2 || x >= w || y >= h){
       check = scanf("%d %d", &x, &y);
       CLEAR_INPUT;
       if (check != 2)
           printf ("2 values required for columns and lines! Try again:\n");
       if (x >= w || y >= h)
           printf ("Starting point coordinates are out of bounds! Try again:\n");
   }

   matrix = create_matrix (h, w);
   CLEAR_INPUT;

   matrix[y + x * w] = 8;
   /*
   print_matrix (matrix, h, w);
   getchar ();
   */
   CLEAR_SCREEN;
   matrix_animation (matrix, h, w, &x, &y);

   free (matrix);

   return 0;
}

Até funciona mas por alguma razão, após inserir as coordenadas do ponto de partida, e carregar no enter 1x, o programa fica à espera de algo mais. Tenho que carregar no enter mais uma vez e depois então o programa funciona bem. Portanto, algures fica um '\n' ou outra coisa qualquer no stdin! Só não sei onde!

PS: Aliás, eu já tinha o code assim, acho eu!

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
seuqram

_kbhit() é uma função que verifica se há input.

Substitui o define por isto #define CLEAR_INPUT while (_kbhit())getchar();

Assim já não te pede mais nada.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

_kbhit() é uma função que verifica se há input.

Substitui o define por isto #define CLEAR_INPUT while (_kbhit())getchar();

Assim já não te pede mais nada.

Não te enganaste aí algures nos parêntesis? Ou é mesmo assim?

Tenho que fazer algum include??? É que está-me a dar erros!

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
seuqram

Não te enganaste aí algures nos parêntesis? Ou é mesmo assim?

Tenho que fazer algum include??? É que está-me a dar erros!

Tens de incluir a biblioteca conio.h

Mas eu agora reparei que tu tens um CLEAR_INPUT num sitio que não devia estar... (depois de criares a matrix) e é por isso que te está a pedir um input

Eu pensava que isso acontecia por estares a fazer double input num só scanf,... enganei-me.

Editado por seuqram

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Tens de incluir a biblioteca conio.h

Mas eu agora reparei que tu tens um CLEAR_INPUT num sitio que não devia estar... (depois de criares a matrix) e é por isso que te está a pedir um input

Eu pensava que isso acontecia por estares a fazer double input num só scanf,... enganei-me.

Mas porque é que um CLEAR_INPUT a mais pede mais um keypress?

PS: Eu estou em Linux, acho que o conio.h, não está disponível para Linux!

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
seuqram

Mas porque é que um CLEAR_INPUT a mais pede mais um keypress?

#define CLEAR_INPUT while (getchar() != '\n' )

O que é que o getchar faz?...

O CLEAR_INPUT é para se meter apenas um vez depois de um scanf, pois presumo que quando dás input, o "Enter" ainda fica marcado no input e por isso quando chamas o getchar ele retorna-te '\n' e sais do loop.

Mas quando metes um segundo CLEAR_INPUT, depois do input "enter" ter sido limpado pelo primeiro getchar", é obvio que te vai pedir outra vez que digites qualquer coisa e metas enter.

Editado por seuqram

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

#define CLEAR_INPUT while (getchar() != '\n' )

O que é que o getchar faz?...

O CLEAR_INPUT é para se meter apenas um vez depois de um scanf, pois presumo que quando dás input, o "Enter" ainda fica marcado no input e por isso quando chamas o getchar ele retorna-te '\n' e sais do loop.

Mas quando metes um segundo CLEAR_INPUT, depois do input "enter" ter sido limpado pelo primeiro getchar", é obvio que te vai pedir outra vez que digites qualquer coisa e metas enter.

Se calhar sou eu que tinha entendido mal essa macro... Eu entendia que ela apenas removia os '\n' do stdin!


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.