Jump to content
  • 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

Recommended Posts

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;
}

Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other sites
HappyHippyHippo

o que é suposto a função matrix_animation fazer ?

  • Vote 1

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

Share this post


Link to post
Share on other 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.

Edited by seuqram
  • Vote 1

Share this post


Link to post
Share on other 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)

Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other 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?

Edited by seuqram

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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;
}

  • Vote 2

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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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;

  • Vote 1

Share this post


Link to post
Share on other 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;
}

Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other 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;
}

Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other 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.

Edited by seuqram

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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!

Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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!

Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other 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.

Edited by seuqram

Share this post


Link to post
Share on other 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!

Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other 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.

Edited by seuqram

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.