ajuda! alocaçao de memoria matriz dinamica

1. ajuda! alocaçao de memoria matriz dinamica

jonas
maliciouns

(usa Outra)

Enviado em 02/03/2013 - 15:28h

Desenvolva, em linguagem C, um programa que faz a transposição de uma matriz A, com M
linhas e N colunas. O programa deve permitir ao usuário informar o número de linhas e de colunas
que a matriz A deve ter.
O programa fará a leitura do conteúdo da matriz através da entrada padrão do computador (teclado).
O tipo de dados da matriz é de números inteiros.
A matriz AT (matriz transposta deve ser gerada a partir da matriz A. A matriz AT deve ser exibida ao
final da execução do programa na saída padrão do computador (monitor).
Ex de uma matriz M = 2 e N= 3 transposta em AT(3,2)


Dica: declare a matriz A como:
int matriz_A[m][n];
Onde m e n são dois inteiros previamente declarados e cujos valores são informados pelo usuário do
programa.



Como faço isso ? to apanhando pra resolver e nao to conseguindo! alguem consegue fazer ?


  


2. Re: ajuda! alocaçao de memoria matriz dinamica

Marcelo Corrêa
exercitobr

(usa Debian)

Enviado em 02/03/2013 - 15:34h

Sim, mas acho difícil alguém fazer para você. Estude e pratique muito e depois resolva.


3. Re: ajuda! alocaçao de memoria matriz dinamica

wellington
wellingtonsr

(usa Slackware)

Enviado em 02/03/2013 - 18:53h

exercitobr escreveu:

Sim, mas acho difícil alguém fazer para você. Estude e pratique muito e depois resolva.



Poste o que você já fez.




4. Re: ajuda! alocaçao de memoria matriz dinamica

???
gokernel

(usa Linux Mint)

Enviado em 02/03/2013 - 19:41h


Caro colega, vejo que vc é novo( Cadastrado desde: 02/03/2013 ) por aqui ... e as coisas funcionam +ou- assim:

01 - Primeiro vc posta algo do seu códido para ser ajudado ...

02 - E então faz-se a pergunta referente a sua dúvida ...


E o pior eh que por aqui já estamos de "saco" cheio deste tipo de pedidos de alunos iniciantes na faculdade que pensam vamos fazer o trabalho para eles ...

Para falar a verdade esse comportamento eh muito prejudicial para um aluno ... ele nunca vai aprender se pegar tudo pronto ...


Todos nós temos muito prazer em AJUDAR ... mas é preciso que vc faça a sua parte ...

Abraço !!!




5. Re: ajuda! alocaçao de memoria matriz dinamica

jonas
maliciouns

(usa Outra)

Enviado em 03/03/2013 - 10:53h

o professor ainda nao explicou esse assunto.. ele passou isso de questao desafio e valendo alguns pontinhos..
então nao sei nem pra que lado vai.. andei vendo pelo google e o q to tentando fazer é mais ou menos assim mas acho que to longe ainda! pq ainda to especificando valores pra matriz e nao é pra fazer isso...
desde ja agradeço!

int main(){
int **p, i, j;
p = calloc(i, sizeof(int *));
for(i=0; i<i; i++){
p[i] = calloc(i, sizeof(int));
}
printf("Digite os valores da matriz\n");
for(i = 0; i<5; i++)
for(j=0; j<3; j++)
scanf("%d", &p[i][j]);
printf("Matriz lida\n");
for(i = 0; i<5; i++){
for(j=0; j<3; j++){
printf("%d, ", p[i][j]);
}
printf("\n");
}
for(i=0; i<5; i++){
free(p[i]);
}
free(p);
}



6. Re: ajuda! alocaçao de memoria matriz dinamica

jonas
maliciouns

(usa Outra)

Enviado em 03/03/2013 - 11:03h

eu sei fazer essa matriz assim.. mas nao é do jeito q ta pedindo.. e nao usa nada de alocaçao dinamica q é o que tem q usar... tentei fazer gambiarra tipo definindo duas matrizes grandes (100x100) dae na hora de manipular o usuaria escreve numeros menores né... tipo 3x4.. mas tambem nao deu mto certo =/

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


int main()
{
int matrizA[3][4];
int matrizB[4][3];
int i, j;

for (i=0; i<3; i++)
{
for (j=0; j<4; j++)
{
printf ("Insira o elemento [%d][%d] da Matriz A\n", i, j);
scanf ("%d", &matrizA[i][j]);
}
}

for (i=0; i<3; i++)
{
for (j=0; j<4; j++)
{
printf("%d\t", matrizA[i][j]);

}
printf("\n");

}
system("pause");

for (i=0; i<4; i++)
{

for (j=0; j<3; j++)
{
matrizB[i][j]=matrizA[j][i];
}

}

for (i=0; i<4; i++)
{
for (j=0; j<3; j++)
{
printf("%d\t", matrizB[i][j]);

}
printf("\n");
}


system("pause");
return (0);
}


7. Re: ajuda! alocaçao de memoria matriz dinamica

Marcio Guilherme
mcirqueira

(usa Slackware)

Enviado em 03/03/2013 - 12:58h

Affz, C e C++ nen manjo, se fosse java bem q eu ajudava, ate pq em java é mais fácil e a Java Virtual Machine já faz a alocação e limpeza da memoria de forma automática.


8. Re: ajuda! alocaçao de memoria matriz dinamica

???
gokernel

(usa Linux Mint)

Enviado em 03/03/2013 - 20:02h


Esse exemplo já vai te ajudar bastante usando realloc:

Estude ele e faça o seu trabalho baseado nele ...

http://codepad.org/9rLahJNA

O resto eh com vc.



9. Re: ajuda! alocaçao de memoria matriz dinamica

Paulo
paulo1205

(usa Ubuntu)

Enviado em 05/03/2013 - 17:04h

gokernel escreveu:


Esse exemplo já vai te ajudar bastante usando realloc:

Estude ele e faça o seu trabalho baseado nele ...

http://codepad.org/9rLahJNA

O resto eh com vc.


Exemplo buguento, por sinal. Se a linha

pessoa = (Tdata**) realloc (pessoa, (pessoa_len+1) * sizeof (Tdata*)); 


falhar, perde-se a referência original que havia em pessoa, criando-se, no mínimo, um vazamento de memória (se bem que nem isso deve acontecer, porque o código que vem depois sai usando o ponteiro, sem sequer reconhecer a possibilidade de a relaocação falhar).

A forma certa de usar realloc é ter um segundo ponteiro, e testar o valor retornado, mais ou menos como mostrado abaixo.

/* buffer é o ponteiro para o dado principal, e aux um mero auxiliar */

char *buffer, *aux;
size_t buff_size, new_size;

buffer=malloc(buff_size=1024); /* tamanho inicial do buffer é 1024 bytes */
if(buffer==NULL){
fprintf(stderr, "Alocacao inicial falhou: %s.\n", strerror(errno));
exit(1);
}

/* bla, bla, bla */

/* Precisa alterar o tamanho do buffer */
new_size=2*buff_size;
aux=realloc(buffer, new_size);
if(aux==NULL){
fprintf(
stderr, "Realocacao falhou (%s): continua usando buffer original de %zd bytes",
strerror(errno), buff_size;
}
else {
buffer=aux;
buff_size=new_size;
/* Faz a operação necessária no buffer estendido */
}

/* bla, bla, bla */

/* Libera o buffer. Vai funcionar mesmo que que endereço tenha sido alterado
por chamadas a realloc(), sem vazamento de memória (a não ser que o usuário
feito outra bobagem com o ponteiro durante o "bla, bla, bla"). */

free(buffer);


Não olhei o resto do código do seu exemplo.


10. Re: ajuda! alocaçao de memoria matriz dinamica

???
gokernel

(usa Linux Mint)

Enviado em 05/03/2013 - 18:50h


Ok "paulo", o que postei foi uma forma "resumida" de exemplo ... e parece que o rapaz que iniciou o tópico gostou que não deu "nem as caras" para agradecer ;).




11. Re: ajuda! alocaçao de memoria matriz dinamica

???
gokernel

(usa Linux Mint)

Enviado em 05/03/2013 - 20:45h

@paulo: "Exemplo buguento, por sinal."

Ja que começou, seja direto e mostre o suposto BUG .

@paulo: "Não olhei o resto do código do seu exemplo"

Como assim, o meu codigo é pequeno ???

AFF, ta querendo "comprar" briga e fugir ao mesmo tempo ? ;).



12. Re: ajuda! alocaçao de memoria matriz dinamica

Paulo
paulo1205

(usa Ubuntu)

Enviado em 06/03/2013 - 12:22h

gokernel escreveu:

@paulo: "Exemplo buguento, por sinal."

Ja que começou, seja direto e mostre o suposto BUG .


Eu mostrei, sim: citei literalmente a linha com problema, disse qual é o problema e mostrei uma forma correta de fazer a realocação, que conta com a possibilidade de a chamada a realloc() falhar, sem, contudo, perder os dados anteriores.

Se você precisa de uma fonte externa para confirmar o que eu disse, veja, por exemplo, <http://www.freebsd.org/cgi/man.cgi?query=realloc&apropos=0&sektion=0&manpath=NetBSD+6.0&arch=default&format=html>. Trata-se da documentação on-line sobre as funções de alocação de memória (malloc(), calloc(), realloc() e free()), dando dicas valiosas sobre boas práticas para uso seguro dessas funções.

@paulo: "Não olhei o resto do código do seu exemplo"

Como assim, o meu codigo é pequeno ???

AFF, ta querendo "comprar" briga e fugir ao mesmo tempo ? ;).


Não tem briga alguma. Muito menos fuga.

Como você se propôs a ensinar o autor do tópico a fazer alocação dinâmica, o importante era criticar o inegável bug na forma como foi usada a função realloc(), que era justamente o assunto de que você estava tratando. Outros aspectos possivelmente problemáticos do programa não me interessavam porque estavam fora do assunto central, e talvez também não fossem objeto de dúvidas aparentes do autor original do tópico.

Mas há ainda outro motivo, muito mais prosaico, para não ter examinado antes o restante do seu código: eu tinha hora marcada para consulta de fisioterapia. E, mesmo depois da tal consulta, também não pude responder ontem à noite, pois o temporal que caiu aqui no Rio de Janeiro me deixou algumas horas ilhado no consultório da fisioterapeuta, e eu cheguei em casa muito tarde, e muito cansado.

Meu objetivo neste fórum não é ser um "chato". Não ganho nada em ficar corrigindo alguém, e não sou fanático por ficar enchendo meu próprio ego. Como disse antes, apontar o erro do seu exemplo foi no sentido de desviar o orientado de uma prática errônea, e quiçá ajudar você mesmo a adotar uma prática melhor nos programas que você vier a fazer.

Mas, já que você mesmo pediu, há, sim, outros problemas naquele seu programa, com os quais eu não tinha me preocupado anteriormente, a saber:

* Outra ocorrência do mesmo problema já apontado: Assim como realloc(), strdup(), que chama malloc() internamente, também pode falhar por falta de memória, devolvendo um ponteiro nulo. Só que você não considera essa possibilidade, e adiciona esse elemento incondicionalmente no array apontado por pessoa.

* Falta de generalidade: A própria função strdup() não faz parte do padrão da linguagem C, sendo obrigatória somente no mundo UNIX/POSIX. Outras pessoas podem usar, no Windows ou outra plataforma não-POSIX, compiladores C aderentes ao padrão da linguagem e da biblioteca padrão, nos quais, no entanto, a função strdup() pode não estar disponível.

* Níveis demais e desnecessários de indireção: Por que fazer pessoa ser um ponteiro para ponteiro para Tdata, se o uso que você faz dela é somente como ponteiro para um array que cresce dinamicamente, que poderia ser totalemnte tratado apenas com um nível de ponteiro (i.e. o tipo de pessoa poderia conformavelmente ser Tdata*, em vez de Tdata**)?

* Tipo inapropriado de argumento de função: O tipo do primeiro argumento da função novo_cadastro() poderia confortavelmente ser const char*, pois você não altera, dentro da função, os dados apontados pelo argumento. Essa pequena e aparentemente boba mudança permitiria que o seu pequeno programa pudesse ser compilado também como um programa em C++, já que este obriga a compatibilidade de tipos ao usar uma constante literal string (como "Joao", por exemplo) como argumento de função. (Note que, mesmo em C, o tipo inferido internamente de uma constante literal string é const char*, mas a linguagem tolera atribuir essas constantes a ponteiros não contantes por uma questão de compatibilidade com código muito antigo, da época em que a linguagem não possuía a palavra-chave const (ou seja há 24 anos atrás). A meu ver, essa foi uma escolha errada do comitê de padronização do C.)

* Nomes inadequados: O nome da variável pessoa não me parece adequdo, já que não designa uma pessoa, mas um array de várias pessoas. De carona, segue o nome de pessoa_len, que, além de não estar ligado a uma pessoa, também não designa um comprimento (length, de onde suponho vir o "len"), mas uma quantidade de elementos. Ainda: Tdata é um nome muito genérico e pouco descrito do dado referenciado, aceitável apenas num programa muito simples (como é o caso), mas jamais num de maior porte.



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts