Jump to content

[Resolvido] Ajuda Projecto C -- dimensionamento de array


Recommended Posts

Posted

Boas, tenho de fazer um jogo de um veiculo que se vai movimentar num tabuleiro

.– Uma linha inicial, com dois inteiros que representam as dimens ̃es do tabuleiro;

– Uma segunda linha que indica a posição inicial do veiculo;

– Uma terceira linha com um inteiro que indica o numero de obstaculos existentes;

– Para cada obstaculo, uma linha com a posiçao desse obstaculo;

a minha dúvida é que eu define uma variavel DIM 100 como vao puder ver no codigo. E ao inserir as dimensoes do tabuleiro queria que esses valores ficassem na variavel DIM. Até porque os 4 topicos que inseri em cima terao de ser num sistema de menus.

#include <stdio.h>
#include <stdlib.h> 
#define DIM 100
#define ESPACO ' '

void dimensoes_tab (char tabuleiro [DIM][DIM])
{

int x, y;

	printf("Introduza o numero de linhas: \n");
	scanf("%d", &x);

	printf("Introduza o numero de colunas: \n");
	scanf("%d", &y);

}


void pos_inicial (char Tabuleiro [DIM][DIM])
{

   int linha; 
   int coluna;


printf("Qual a casa inicial? \n");
scanf("%d%d", &linha, &coluna);

if (linha <= DIM && coluna <= DIM)
        
      Tabuleiro [linha][coluna] = 'C';
else
          printf("CASA não existe\n");

}


void casas_bloqueadas (char Tabuleiro [DIM][DIM])
{

   int x,y,linha,coluna;

printf("Quantas casas bloqueadas: \n"); scanf("%d", &y);

for(x = 1; x <= y; x++)
{

	printf("Qual casa?\n"); scanf("%d%d",&linha, &coluna);

	Tabuleiro[linha][coluna] = 'x';

}


}


void inic_tabuleiro (char Tabuleiro [DIM][DIM])
{
   int linha , coluna;

for (linha = 0; linha < DIM; linha++)
        {
	for (coluna = 0; coluna < DIM; coluna++)
	     Tabuleiro [linha][coluna] = ESPACO;
        }
}  


void mostra_tabuleiro (char Tabuleiro [DIM][DIM])
{
        int linha, coluna;


        for (linha = 0; linha < DIM; linha++)
{
            
            putchar ('|');
      	
	for (coluna = 0; coluna < DIM; coluna++)
                
		printf ("%c %c", Tabuleiro [linha][coluna], coluna == DIM ? ' ': '|');                        
                                if (linha != DIM+1)
				printf ("\n----------------");                                        
                                        putchar ('\n');
                                   
        }

}

Edit: GeSHi adicionado (pmg)

Posted

Não é possível alterar o valor dum #define depois do código compilado.

O que precisas de fazer é transformar o código para esse DIM passar a ser uma variável normal.

Depois de obteres um valor para a dimensão do tabuleiro, usas esse valor para criar o tabuleiro com malloc e passas o valor para todas as funções que usam o tabuleiro.

No fim do programa, não te esqueças de libertar a memória usada para o tabuleiro com free().

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted
typedef struct Tab 
{
int linha;
int coluna;
} Tabuleiro;



Tabuleiro* initStruct()
{
Tabuleiro *p = (Tabuleiro*) malloc(sizeof(Tabuleiro));
ptr -> linha = 0;
ptr -> coluna = 0;
return p;
}

Era assim disto que estavas a falar? Agora não sei é como posso utilizar a variavel estas variaveis nas funçoes :s. Se me puderes explicar agradecia.

Edit: GeSHi adicionado (pmg)

Posted

Podes fazer assim :

typedef struct Tab 
{
  int linhas;
  int colunas;
  char * casas;
} Tabuleiro;

Tabuleiro* CriaTabuleiro(int linhas_iniciais, int colunas_iniciais)
{
  Tabuleiro *p = malloc(sizeof(Tabuleiro));
  p->linhas = linhas_iniciais;
  p->colunas = colunas_iniciais;
  p->casas = malloc(sizeof(char) * linhas_iniciais * colunas_iniciais);
  return p;
}

void DestroiTabuleiro(Tabuleiro * tab)
{
  free(tab->casas);
  free(tab);
}

int LinhasTabuleiro(Tabuleiro * tab)
{
  return tab->linhas;
}

int ColunasTabuleiro(Tabuleiro * tab)
{
  return tab->colunas;
}

char LePosicaoNoTabuleiro(Tabuleiro * tab, int linha, int coluna)
{
  return *(tab->casas + linha * tab->colunas + coluna);
}

void GravaPosicaoNoTabuleiro(Tabuleiro * tab, int linha, int coluna, char valor)
{
  *(tab->casas + linha * tab->colunas + coluna) = valor;
}
Posted
#include <stdio.h>
#include <stdlib.h> 
#define ESPACO ' '


typedef struct sTabuleiro 
{
int xlinha;
int ycoluna;
char *casas;
} Tabuleiro;



Tabuleiro* CriarTabuleiro(int linha_inic, int coluna_inic)
{
Tabuleiro *ptr = malloc(sizeof(Tabuleiro));
ptr -> xlinha = linha_inic;
ptr -> ycoluna = coluna_inic;
ptr -> casas = malloc(sizeof(char) * linha_inic * coluna_inic);
return ptr;
}


void DestroiTabuleiro(Tabuleiro * sTabuleiro)
{
  free(sTabuleiro ->casas);
  free(sTabuleiro);
}



int LinhasTabuleiro(Tabuleiro * sTabuleiro)
{
  return sTabuleiro -> xlinha;
}



int ColunasTabuleiro(Tabuleiro * sTabuleiro)
{
  return sTabuleiro -> ycoluna;
}


char LePosicaoNoTabuleiro(Tabuleiro * sTabuleiro, int linha, int coluna)
{
  return *(sTabuleiro -> casas + linha * sTabuleiro -> ycoluna + coluna);
}


void GravaPosicaoNoTabuleiro(Tabuleiro * sTabuleiro, int linha, int coluna, char valor)
{
  *(sTabuleiro -> casas + linha * sTabuleiro -> ycoluna + coluna) = valor;
}


void dimensoes (Tabuleiro *sTabuleiro)
{


	printf("Introduza o numero de linhas: \n");
	scanf("%d", *sTabuleiro->xlinha);

	printf("Introduza o numero de colunas: \n");
	scanf("%d", *sTabuleiro->ycoluna);

}



void pos_inicial (Tabuleiro *sTabuleiro)
{

   int x, y;


printf("Qual a casa inicial? \n");
scanf("%d%d", &x, &y);

if (((x >= 0) && (x <= *sTabuleiro->xlinha )) && ((y >= 0) && (y <= *sTabuleiro->ycoluna)))
        
      *sTabuleiro = 'C';
else
          printf("CASA não existe\n");

}

mudei o nome das variaveis mas fiz como me disses-te. Agora a minha dúvida é como por exemplo na função dimensoes se estou a fazer bem ao utilizar ( *sTabuleiro->xlinha) dentro do scanf. Pois da-me um erro e não sei como o resolver tanto nas funçoes que aqui postei como no resto das funções. O erro que me da é (invalid type argument of unary ‘*’ (have ‘int’))

Edit: GeSHi adicionado (pmg)

Le o tutorial para saberes adicionar o GeSHi sem ser preciso a intervencao dum moderador.

Posted

PreScriptum: Le o tutorial de GeSHi para saberes adiciona-lo sem ser preciso a intervencao dum moderador.

Nao estas a fazer bem.

Ha dois operadores importantes quando se lida com enderecos: o * e o &.

O * faz o contrario do & e vice-versa.

No teu codigo, sTabuleiro é um ponteiro, sTabuleiro->xlinha é um int. Para teres o endereco do int, usa o operador &

sTabuleiro->xlinha // um int
&sTabuleiro->xlinha // endereco dum int

Para comparacao, usando o * no sTabuleiro obtens um objecto de tipo struct sTabuleiro.

sTabuleiro // endereco dum struct sTabuleiro
*sTabuleiro // objecto de tipo struct sTabuleiro

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

  • 2 weeks later...
Posted

Se me pudessem explicar como posso fazer para colocar o caracter no tabuleiro. a minha duvida como esta mencionada no codigo (sTabuleiro = '#'😉. Isso está mal deixei ficar assim para ver se conseguem perceber melhor a minha questão. Deve ser mesmo um pequeno pormenor. Sou do mesmo grupo da pessoa que tem postado por isso a estrutura é a mesma 🙂 . Agradecia se me pudessem ajudar porque em outras funçoes estou a aempancar no mesmo problema.

void casas_bloqueadas (Tabuleiro *sTabuleiro)
{
  int x, y, linha, coluna;
printf("Quantas casas bloqueadas: \n"); scanf("%d", &x);
 for (y = 1; y <= x; y++)
 {
  printf("Qual casa?\n"); scanf("%d%d",&linha, &coluna);
   if (((linha >= 0) && (linha <= sTabuleiro->xlinha )) && ((coluna >= 0) && (coluna <= sTabuleiro->ycoluna)))
		   sTabuleiro = '#'; // duvida está aqui...
   else
	  printf("CASA NAO EXISTE!!!\n");
 }
}
Posted

Primeiro, todos os índices em C são baseados no 0, ou seja, o primeiro é sempre o 0. Portanto o último será a <dimensão do objecto> - 1.

No teu código os testes de validação estão a deixar passar índices inválidos (linha <= sTabuleiro->xlinha). Corrige isso.

Quanto à dúvida deves usar a função 'GravaPosicaoNoTabuleiro', que me parece óbvia.

Posted

Para movimentar o carro para direita preciso de utilizar a posição casa inicial e somar 1 unidade ao valor da coluna, e depois gravar coma função:

GravaPosicaoNoTabuleiro(sTabuleiro,linha, coluna +1 ,'C'); 

A minha dúvida é como utilizar os valores da posição inicial posso utilizar mesmo a função posicao_inicial ou tenho de fazer uma struct para os guardar e depois os utilizar?

Posted

Boas , ao compilar esta-me a dar erro e já o tentei corrigir e não consegui se for possivel me dar umas dicas ou me dizerem o que estou a fazer mal agradecia.

void actualizar_posicao (char *comando, Tabuleiro *sTabuleiro, Carro c)
{

if ( strcmp(comando,"VD") == 0)  c = roda_direita(c); // (Neta linha e nas seguintes duas da-me o seguinte aviso:  assignment makes pointer from integer without a cast)

if ( strcmp(comando,"VE") == 0)  c = roda_esquerda(c);
if ( strcmp(comando,"AV") == 0)  c = avanca_posicao(c);
else
 printf("COMANDO ERRADO\n");

}

depois na minha função menu ao chamar esta função da-me dois avisos e um erro como podem ver a seguir:

case '4': sTabuleiro = actualizar_posicao (sTabuleiro ,carro);
  break;

(aviso: aviso: passing argument 1 of ‘actualizar_posicao’ from incompatible pointer type

aviso: passing argument 2 of ‘actualizar_posicao’ from incompatible pointer type

erro:too few arguments to function ‘actualizar_posicao’ )

Se me pudessem ajudar agradecia.

Posted
//                       1111111111111, 222222222222222222222, 3333333
void actualizar_posicao (char *comando, Tabuleiro *sTabuleiro, Carro c)

...

//           actualizar_posicao (2222222222 ,33333);
sTabuleiro = actualizar_posicao (sTabuleiro ,carro);

Onde esta o primeiro parametro?

Alem disso, o retorno da funcao actualizar_posicao e de tipo void. Nao podes atribuir void a uma variavel.

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

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
×
×
  • Create New...

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.