Ponteiros e alocação dinamica [RESOLVIDO]

1. Ponteiros e alocação dinamica [RESOLVIDO]

Alex
9Alex

(usa Ubuntu)

Enviado em 12/11/2016 - 01:56h

Boa noite, comecei a programar em c faz pouco tem e estou com a seguinte duvida, tenho que criar uma função que envolve alocação dinâmica e estruturas e não sei como fazer. É sobre a criação de um conjunto de números inteiros. Obrigado a todos que puderem ajudar.


typedef struct{
int *numeros; // Vetor com elementos, pode ser ordenado ou nao.
int elementos; // Quantidade de elementos distintos
int capacidade; // Tamanho do vetor 'numeros' para gerenciar alocacao de memoria
} conjunto;

/* Funcao: novo
*
* Cria um novo conjunto vazio (sem elementos) com um vetor numeros de determinada capacidade.
* O conjunto deve ser alocado dinamicamente assim como o vetor elementos do mesmo.
*
* Parametros:
* capacidade: tamanho do vetor numeros que deve ser alocado
*
* Retorno:
* O endereço do novo conjunto alocado.
* A funcao deve ainda setar os campos elementos e capacidade corretamente.
*/
conjunto *novo(int capacidade){
}




  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 14/11/2016 - 15:09h

9Alex escreveu:

Eu fiz da seguinte maneira, funcionou, mas ainda to com um problema, não ta respeitando a capacidade, a capacidade por exemplo era 10, mas aceita bem mais elementos que isso.

conjunto *novo(int capacidade){

conjunto *conjNovo;

conjNovo = malloc(sizeof(conjunto));

conjNovo->numeros = malloc(capacidade*sizeof(int));
conjNovo->capacidade = capacidade;
conjNovo->elementos = 0;

return conjNovo;
}


Permita-me dar algumas sugestões.

Para a capacidade e a quantidade em uso, eu sugiro usar o tipo de dados size_t em lugar de int. Assim, a sua estrutura ficaria com a seguinte cara:

struct conjunto {
int *numeros;
size_t capacidade, elementos;
};


Na alocação, transfira o máximo de esforço possível para o compilador, e diminua o número de lugares em que você amarra o nome da variável ou campo da estrutura a um determinado tipo de dados.

conjunto *novo_conjunto(size_t capacidade){
conjunto *novo_conj;

// O tipo já foi amarrado na declaração, então faça o compilador fazer a associação.
novo_conj=malloc(sizeof *novo_conj);
if(novo_conj!=NULL){
// Mesma coisa aqui, só que ainda mais relevante. Fazendo desta forma, se você decidir que
// os elementos do vetor dinâmico serão double, em vez de int, só precisará fazer a mudança
// na declaração de tipo, e não precisará mudar também aqui.
novo_conj->numeros=malloc(capacidade * sizeof *novo_conj->numeros);
if(novo_conj->numeros!=NULL){
novo_conj->capacidade=capacidade;
novo_conj->elementos=0;
}
else{
free(novo_conj);
novo_conj=NULL;
}
}

return novo_conj;
}


Quanto a poder colocar números mesmo depois da capacidade máxima alocada, isso cabe a você garantir. Provavelmente você deve fornecer acesso a elementos do seu conjunto através de funções, não de manipulação direta dos campos da representação interna. Tais funções devem garantir a operação dentro dos limites.

3. Re: Ponteiros e alocação dinamica [RESOLVIDO]

???
gokernel

(usa Linux Mint)

Enviado em 12/11/2016 - 09:55h


Olá !

Cara, o pessoal por aqui no geral ajuda se você também ajudar ... poste o código que já fez.

Para postar códigos use as tags( sem espaços):
[ code]

// ... seu código aqui dentro ...

[ / code]

E for grande o código usar um site tipo ( www.codepad.org ) e enviar o link.

Sem código ... sem ajuda ;)

T.



4. Re: Ponteiros e alocação dinamica [RESOLVIDO]

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 12/11/2016 - 12:06h

Procure a função malloc e free

Poder usar comando man malloc, no terminal, para obter informações.
--
Uilian Ries
Linux Counter: 521986


5. Re: Ponteiros e alocação dinamica

Alex
9Alex

(usa Ubuntu)

Enviado em 12/11/2016 - 12:30h

Então, eu nem comecei direito a fazer, porque nem sei por onde começar na verdade, estou com muitas dúvidas nesse assunto

A parte da alocação dinâmica fiz assim, mas a parte de setar os campos elementos e capacidade realmente não sei



conjunto *novo(int capacidade){

conjunto *p;

p = malloc(capacidade * sizeof(int));


return p;
}




gokernel escreveu:


Olá !

Cara, o pessoal por aqui no geral ajuda se você também ajudar ... poste o código que já fez.

Para postar códigos use as tags( sem espaços):
[ code]

// ... seu código aqui dentro ...

[ / code]

E for grande o código usar um site tipo ( www.codepad.org ) e enviar o link.

Sem código ... sem ajuda ;)

T.





6. Re: Ponteiros e alocação dinamica [RESOLVIDO]

???
gokernel

(usa Linux Mint)

Enviado em 12/11/2016 - 17:01h


Caramba !, sem código ???

GOOGLE:
01 : linked list
02: realloc

T.


7. Re: Ponteiros e alocação dinamica [RESOLVIDO]

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 12/11/2016 - 18:13h

Você precisa de mais de uma alocação. Uma para o objeto do conjunto, e uma para cada elemento. Veja que essa quantidade de elementos alocados, é multiplicado pelo parâmetro recebido. Também não esqueça de atribuir o membro capacidade, com o mesmo valor do parâmetro.


--
Uilian Ries
Linux Counter: 521986


8. Re: Ponteiros e alocação dinamica

Alex
9Alex

(usa Ubuntu)

Enviado em 14/11/2016 - 14:40h

Eu fiz da seguinte maneira, funcionou, mas ainda to com um problema, não ta respeitando a capacidade, a capacidade por exemplo era 10, mas aceita bem mais elementos que isso.



conjunto *novo(int capacidade){

conjunto *conjNovo;

conjNovo = malloc(sizeof(conjunto));

conjNovo->numeros = malloc(capacidade*sizeof(int));
conjNovo->capacidade = capacidade;
conjNovo->elementos = 0;

return conjNovo;
}



e valeu pela dica




uilianries escreveu:

Você precisa de mais de uma alocação. Uma para o objeto do conjunto, e uma para cada elemento. Veja que essa quantidade de elementos alocados, é multiplicado pelo parâmetro recebido. Também não esqueça de atribuir o membro capacidade, com o mesmo valor do parâmetro.


--
Uilian Ries
Linux Counter: 521986









Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts