Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Anna007

C Alocação Dinâmica em C

Recommended Posts

Solicito ajuda para transformar esse código:

 

Crie um vetor dinâmico de tamanho informado pelo usuário.
Solicite os valores do vetor ao usuário.
Em seguida, imprima o conteúdo do vetor.

int main()
{
    int num;
    printf("Digite a quantidade de números:\n");
    scanf("%d",&num);
    int *p;
    int i;
    int vetor[num];
    int aux=0;


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

    printf("Digite os valores:\n");
    for(i=0; i<num; i++)
    {
    scanf("%d",&vetor[i]);
        p[i]=aux;
        aux++;
    }
    printf("Posição\t\tValor\n");
    for(i=0; i<num; i++)
    {

        printf("%d \t\t %d\n",p[i],vetor[i]);
    }


    return 0;
}

Agora:

Converta o código do exercício anterior de forma a termos:
procedimento para preencher o vetor, solicitando os valores ao usuário.

procedimento para imprimir o vetor.

função para efetuar a alocação dinâmica do vetor, retornando o endereço alocado para o mesmo.

void preenche(int vetor[],int tam){

printf("Qual é o tamanho do vetor?\n");
scanf("%d",&tam);

printf("Insira os valores do vetor:\n");
for(int i=0;i<tam;i++){
    scanf("%d",&vetor[i]);
}

}
void imprime(int vetor[],int tam){
    int i=0;
for(int i=0;i<tam;i++){
        printf("%d\n",&vetor[i]);
}}
int aloca(int vetor[],int tam){
int *p;
int aux=0;
p=(int*)malloc(tam*sizeof(int));
for(int i=0;i<tam;i++){
        p[i]=aux;
        aux++;
}
return &p;}
main(){
int *resp;
int tam=0;
int vetor[tam];
preenche(vetor,tam);
imprime(vetor,tam);
*resp=aloca(vetor,tam);


for(int i=0;i<tam;i++){
        printf("memória: %d",&resp[i]);
}
return 0;}

 

Editado por Simon Viegas
Altarar tipo de tag para C Languages (referente as cores)
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
6 horas atrás, Anna007 disse:

int vetor[num];

Essa parte está errada. Todo array estático deve ser declarado com um variável constante. Como você recebe num através do scanf, dá erro.

 

Eu não vou fazer o código pra você. Você tem que pensar.

 

Mas vou deixar umas dicas aí, alocação dinâmica é basicamente receber valores pelo malloc e remover pelo free.

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, Miguel Nischor disse:
8 horas atrás, Anna007 disse:

int vetor[num];

Essa parte está errada. Todo array estático deve ser declarado com um variável constante. Como você recebe num através do scanf, dá erro.

@Miguel Nischor Depende que compilador usar. No padrão C99 isso é perfeitamente legal:
 

float read_and_process(int n)
{
    float vals[n];

    for (int i = 0; i < n; i++)
        vals[i] = read_val();
    return process(n, vals);
}

Isso se chama Variable-length array(arrays de tamanho variável). De uma olhada aqui:
https://en.wikipedia.org/wiki/Variable-length_array

Editado por vangodp

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @Anna007 !

int aloca(int vetor[],int tam) {
    int *p;
    int aux=0;
    p=(int *)malloc(tam*sizeof(int));
    for(int i=0; i<tam; i++) {
        p[i]=aux;
        aux++;
        }
    return &p;
    }

Começando pelo protótipo quero dizer que o parâmetro vetor[] é inútil para função, se considerarmos o corpo da mesma.

Pelo enunciado do problema rotina é retorna o ponteiro para vetor alocado, no caso vejo erro mais um vez no cabeçario da função, pois o tipo a retorna é int*. Corrija digitando int * aloca(int tam). Consequentemente return p; apagando & eitza.

 

Observação quando lidemos com ponteiros e de bom gosto usar a escrita de equivalente tratamento de ponteiros, ou seja, mesmo sendo equivalente *(p+x) e p[x] use sempre com operador de ponteiros, o segundo formato, quando se tratar de ponteiros.

 

Daí a função alternativa fica assim:

int* aloca(int tam) {
    int* p;
    int aux= 0;
    p= (int*)malloc(tam * sizeof(int));
    
    for(int i= 0;i < tam; i++){
        *(p + i)= aux++;
        }
    return p;
    }

;)Good Code! 

Editado por Mauro Britivaldo
Exemplo de código fonte

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×