luismsantana Posted August 25, 2012 at 06:40 PM Report Share #473483 Posted August 25, 2012 at 06:40 PM oi a minha dúvida é como faço para copiar o conteudo de um array para um array que está num nó (novo nó que vai ser inserido numa lista ligada) ? algo do género? for(i=0;i<d.n_linhas*d.n_colunas;i++) novo->tab[i]=mat->valores[i]; Link to comment Share on other sites More sharing options...
Flinger Posted August 25, 2012 at 10:05 PM Report Share #473501 Posted August 25, 2012 at 10:05 PM isso, ou com o memcopy: http://linux.die.net/man/3/memcpy Link to comment Share on other sites More sharing options...
luismsantana Posted August 26, 2012 at 03:54 PM Author Report Share #473546 Posted August 26, 2012 at 03:54 PM sim, resulta ... mas o programa está a crashar na avaliação do aux->prox!=NULL ... nao consigo perceber pq ... dêm aí uma olhadela, por favor ... #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct jgd jog, *jogad; typedef struct jogadores { char nome1[10]; char nome2[10]; } jogador; struct jgd { int *tab; jogad prox; }; typedef struct { int n_jogadas; int *valores; int n_linhas; int n_colunas; } Matrix; jogad coloca_pedra(jogad p, Matrix d, Matrix * mat) { int i, linha, coluna, celula; jogad novo = (jogad) malloc(sizeof(jog)), aux; novo->tab = (jogad) malloc(sizeof(Matrix) * mat->n_colunas * mat->n_linhas); if (novo == NULL) { printf("nao foi possivel!n"); return p; } else { do { printf("onde pretende colocar a pedra?n"); printf("ATENCAO: a pedra é representada pelo numero 9!n"); printf("linha: "); scanf("%d", &linha); printf("coluna: "); scanf("%d", &coluna); celula = linha * d.n_colunas + coluna; if (mat->valores[celula] == 0) { mat->valores[celula] = 9; printf("nn"); printf("adicionou!n"); break; } else printf("tem de escolher outra posicao!n"); } while (1); printf("chega aqui 1n"); memcpy(novo->tab, mat->valores, sizeof(Matrix)); novo->prox = NULL; printf("mete o novo->prox a NULL, checkn"); aux = p; printf("aux=pn"); while (aux->prox == NULL) { printf("...n"); aux = aux->prox; printf("aux=aux->proxn"); } aux->prox = novo; } return p; } int verifica_pedras(Matrix * r) { int i, cont = 0, maximo; for (i = 0; i < r->n_linhas * r->n_colunas; i++) { if (r->valores[i] == 9) cont++; } if (cont > (r->n_linhas * r->n_colunas) * 0.10) return 0; else return 1; } jogad mover_peca() { } jogad jogar(jogad p, Matrix dim, jogador jog, Matrix * matrix) { int j, i, op, jogd, pedra; jogad aux; for (jogd = 0; jogd < 2; jogd++) { if (jogd == 1) printf("Vez do Jogador %snn", jog.nome1); else printf("Vez do Jogador %snn", jog.nome2); do { for (i = 0, j = 0; i < dim.n_linhas * dim.n_colunas; i++, j++) { if (j == dim.n_colunas) { printf("nn"); j = 0; } printf("%dt", matrix->valores[i]); } printf("o que pretende fazer?n"); printf("1- colocar pedran"); printf("2- mover pecan"); printf("3- inserir linha ou colunan"); printf("4- voltar atrasn"); printf("nopcao:"); scanf("%d", &op); switch (op) { case 1: pedra = verifica_pedras(matrix); if (pedra == 1) p = coloca_pedra(p, dim, matrix); else { printf("Nao pode colocar mais pedras!n"); break; } case 2: mover_peca(); break; case 3: break; case 4: return 0; } } while (1); } return p; } Matrix *matrixCriar(int n_linhas, int n_colunas) { Matrix *m = NULL; /* validar argumentos */ if (n_linhas < 1 || n_colunas < 1) return NULL; /* alocar memória para a matrix * (Nota : este cast foi porque testei no compilador de c++) */ if ((m = (Matrix *) malloc(sizeof(Matrix))) == NULL) return NULL; /* alocar memória para guardar as células da matrix * (Nota : este cast foi porque testei no compilador de c++) */ if ((m->valores = (int *) calloc(n_linhas * n_colunas, sizeof(int))) == NULL) { free(m); return NULL; } /* inicializar os dados da matrix */ m->n_linhas = n_linhas; m->n_colunas = n_colunas; return m; } jogad primeiro_no(jogad p, Matrix * m) { int i; jogad novo = (jogad) malloc(sizeof(jog)); novo->tab = malloc(sizeof(Matrix) * m->n_colunas * m->n_linhas); memcpy(novo->tab, m->valores, sizeof(Matrix)); printf("primeiro nó da listan"); if (p == NULL) p = novo; for (i = 0; i < m->n_colunas * m->n_linhas; i++) printf("%d ", m->valores[i]); printf("n"); return p; } void inicializa_valores(Matrix * matriz) { int i, j; for (i = 0; i < matriz->n_colunas * matriz->n_linhas; i++) matriz->valores[i] = 0; matriz->valores[10] = 1; matriz->valores[2] = 1; matriz->valores[6] = 1; matriz->valores[3] = 2; matriz->valores[7] = 2; matriz->valores[11] = 2; } jogador nome_jogadores() { jogador jogado; printf("nome do jogador 1:"); scanf("%s", &jogado.nome1); printf("nome do jogador 2:"); scanf("%s", &jogado.nome2); return jogado; } Matrix numero_celulas(jogador t) { int l1, l2, c1, c2, i, j, linha, j1, j2; Matrix dim; do { printf("jogador %snintroduza o numero de linhas que pretende:", t.nome1); scanf("%d", &dim.n_linhas); do { printf("jogador %snintroduza o numero de linhas que pretende:", t.nome2); scanf("%d", &l2); } while (l2 != dim.n_linhas); printf("jogador %snintroduza o numero de colunas que pretende:", t.nome1); scanf("%d", &dim.n_colunas); do { printf("jogador %snintroduza o numero de colunas que pretende:", t.nome2); scanf("%d", &c2); } while (c2 != dim.n_colunas); } while (dim.n_colunas * dim.n_linhas < 12 || dim.n_colunas * dim.n_linhas > 25); printf("jogador 1nintroduz o numero de jogadas que pretendes:"); scanf("%d", &j1); do { printf("jogador 2nintroduz o numero de jogadas que pretendes:"); scanf("%d", &j2); } while (j2 != j1); dim.n_jogadas = j2; return dim; } int main() { int opcao, jo = 0; jogad play = NULL; jogador jogado; Matrix dimensao, *m = NULL; do { puts("1-novo jogo"); puts("2-retomar jogo anterior"); puts("3-sair"); scanf("%d", &opcao); switch (opcao) { case 1: jogado = nome_jogadores(); dimensao = numero_celulas(jogado); if ((m = matrixCriar(dimensao.n_linhas, dimensao.n_colunas)) == NULL) { printf("Erro ao criar a matrixn"); return -1; } inicializa_valores(m); play = primeiro_no(play, m); play = jogar(play, dimensao, jogado, m); break; case 2:; break; case 3: return; } } while (1); } o programa crasha na função jogad coloca_pedra(jogad p, Matrix d, Matrix *mat), e as funções, de onde vem o ponteiro, são a main, função primeiro_no e função jogar ... postei o programa todo caso tenham curiosidade em ver ... ainda falta muito para o acabar, muito mesmo .. abração ps-> o programa está bem indentado, aqui fica assim :\ Link to comment Share on other sites More sharing options...
luismsantana Posted August 26, 2012 at 10:43 PM Author Report Share #473610 Posted August 26, 2012 at 10:43 PM Rui Carlos, boa noite! o que editaste no meu post? Link to comment Share on other sites More sharing options...
pwseo Posted August 26, 2012 at 11:18 PM Report Share #473614 Posted August 26, 2012 at 11:18 PM (edited) Rui Carlos, boa noite! o que editaste no meu post? Adicionou syntax highlight e indentou correctamente o código 🙂 E só uma questão... o teu código diz aux->prox == NULL (tem == em vez de !=). Era isso que pretendias fazer? Edited August 26, 2012 at 11:31 PM by pwseo Link to comment Share on other sites More sharing options...
Flinger Posted August 27, 2012 at 10:33 AM Report Share #473631 Posted August 27, 2012 at 10:33 AM Não me parece... Se calhar de a lista só ter um elemento, crasha na 2.ª iteração do ciclo, porque aux=aux->prox coloca o aux a NULL, e a próxima vez que testas a condição, aux->prox estoura. Deveria ser != na condição do while. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now