Ir para conteúdo

Foto

malloc


  • Por favor, faça o login para responder
8 respostas neste tópico

#1
fireands

fireands

    Novato

  • Novato
  • Pip
  • 13 posts
Bom dia pessoal, gostaria que se possivel alguém me desse uma luz a respeito do uso da função malloc, eu explico desejo fazer um programa onde eu digito primeiro o numero de objetos diferentesc que desejo comprar, depois seguindo um menu eu digito o numero corespondente ao objeto e em seguida digito sua quantidade e no final ele deve imprir na tela a quantidade e o nome do objeto. O programa inicial era assim:



QUOTE (netcriptus @ 14/08/2011, 12:56 PM)
Você precisa ou de uma variável que guarde todas as opções, ou guardar cada escolha em uma variável diferente, daí no final é só imprimir o conteúdo dessas variáveis.

Se ainda tiver alguma dúvida, coloque aqui o seu código, que fica mais fácil opinar.

Boa Noite,


#include <stdio.h>
#include <stdlib.h>
int main (void)
{
int q, sing, ns, x;

printf("digite o numero de singularidades no sistema:\n");
scanf("%d", &q);

for(x=0;x<q;x++)
{
printf("digite o numero correspondente a singularidades no menu:\n");
scanf("%d", &sing);

printf("digite o numero de vezes em que essa singularidades aparece no sistema:\n");
scanf("%d", &ns);

printf("%d ", ns);
if(sing==1)
printf("Cotovelo 90 R. longo\n");
if(sing==2)
printf("Cotovelo 90 R. medio\n");
if(sing==3)
printf("Cotovelo 90 R. curto\n");
if(sing==4)
printf("Cotovelo 45\n");
if(sing==5)
printf("Curva 90 R. longo\n");
if(sing==6)
printf("Curva 90 R. curto\n");
if(sing==7)
printf("Curva 45");
if(sing==8)
printf("Te de passagem direta\n");
if(sing==9)
printf("Te de saida de lado\n");
if(sing==10)
printf("Te de saida bilateral\n");
if(sing==11)
printf("Registro de Gaveta\n");
if(sing==12)
printf("Registro de Globo\n");
if(sing==13)
printf("Registro de Angulo\n");
if(sing==14)
printf("Valvula de Pe e crivo\n");
}

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

Então me indicaramo o uso da função malloc(), não tenho muita pratica nesta materia por isso tentei utliza-la, mas não obtive eito o programa ficou assim:

#include <stdio.h>
#include <stdlib.h>
int main (void)
{

int *p;
int q, ns;

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







for (q=0;q<4;q++)
{
printf("digite o numero de vezes em que a singularidade aparece no sistema:\n");
scanf("%d", &p[ns]);

printf("digite o numero de singularidades no sistema:\n");
scanf("%d", &p[q]);

}






for (q=0;q<=5;q++)
{
printf ("%d", ns);
if(q==1)
printf("Cotovelo 90 R. longo\n");
if(q==2)
printf("Cotovelo 90 R. medio\n");
if(q==3)
printf("Cotovelo 90 R. curto\n");
if(q==4)
printf("Cotovelo 45\n");
if(q==5)
printf("Curva 90 R. longo\n");
if(q==6)
printf("Curva 90 R. curto\n");
if(q==7)
printf("Curva 45");
if(q==8)
printf("Te de passagem direta\n");
if(q==9)
printf("Te de saida de lado\n");
if(q==10)
printf("Te de saida bilateral\n");
if(q==11)
printf("Registro de Gaveta\n");
if(q==12)
printf("Registro de Globo\n");
if(q==13)
printf("Registro de Angulo\n");
if(q==14)
printf("Valvula de Pe e crivo\n");

}


free(p);

system ("pause");
return 0;
}
E os problemas foram:
Só consigo printar o nome dos objetos (sem a quantidade), não entendi o por que da variavel dentro do for tem de ser a mesma em que vou alocar memoria, pois devido a isso alem de não conseguir imprimir os resultados reais no menu (os nomes sempre fazem referencia aos 4 primeiros objetos), não consigo printar quantidade + nome do produto pois um for não funciona dentro do outro....enfim sou totalmente leigo nessa parte especifica da materia então se derem uma dica ficarei muito agradecido.

Att, fireands

#2
ofernandofilo

ofernandofilo

    Membro

  • Membro
  • PipPip
  • 100 posts
Jesus, há quantos anos não uso malloc??!

Se não me falha a memória, a função do malloc é alocar memória dinamicamente, o que não me parece ser o seu caso.

Não entendi até agora o que é pra você fazer, apesar de entender seu código.

Não sei o que são singularidades e cotovelos... nem o que precisa ser feito.

Copiei e colei seu código inicial... compilou e aparantemente funcionou como esperado - será?!

Caso se interesse pela minha ajuda, tente me explicar o que você precisa fazer.

abraços

#3
fireands

fireands

    Novato

  • Novato
  • Pip
  • 13 posts

Jesus, há quantos anos não uso malloc??!

Se não me falha a memória, a função do malloc é alocar memória dinamicamente, o que não me parece ser o seu caso.

Não entendi até agora o que é pra você fazer, apesar de entender seu código.

Não sei o que são singularidades e cotovelos... nem o que precisa ser feito.

Copiei e colei seu código inicial... compilou e aparantemente funcionou como esperado - será?!

Caso se interesse pela minha ajuda, tente me explicar o que você precisa fazer.

abraços

Boa Tarde Amigo.

Primeiro quero lhe agradecer pelas sua ajuda em alguns topicos que venho postado, minha explicaão foi meio confusa por isso vou tentar melhorar: o programa funciona da seguinte forma devo primeiramente digitar quantos objetos (usei singularidades pois o programa é para um calculo de hidraulica é dessa forma que os encanamentos são tratados nessa materia), esse valor vai representar a quantidade de memoria que devo alocar no programa e o nume de loops do for), ai segue um "for"(citado antes) que sempre me pedira o tipo de singularidade (seguindo um menu) e sua quantidade, depois desse trecho havera um pedaço do programa e apenas no final dele é que será "printado" suas escolhas e as respectivas quantidades.De ontem para hoje dei uma melhorada nele veja:

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

int main (void)
{

int *p;
int n, q, r;




printf ("quantas singularidades?\n");
scanf ("%d", &n);

p=malloc( n * sizeof (int));
for (r=0;r<n;r++)
{
printf ("quantas unidades?\n");
scanf ("%d", &p[r]);
}


for (r=0;r<n;r++)
printf (" %d\n", p[r]);

for (q=0;q<n;q++)

{
printf ("qual o numero da singularidade no menu?");
scanf ("%d", &p[q]);
}

for (q=0;q<n;q++)
{

if(p[q]==1)
printf(" Cotovelo 90 R. longo\n");
if(p[q]==2)
printf(" Cotovelo 90 R. medio\n");
if(p[q]==3)
printf(" Cotovelo 90 R. curto\n");
if(p[q]==4)
printf(" Cotovelo 45\n");
if(p[q]==5)
printf(" Curva 90 R. longo\n");
if(p[q]==6)
printf(" Curva 90 R. curto\n");
if(p[q]==7)
printf(" Curva 45\n");
if(p[q]==8)
printf(" Te de passagem direta\n");
if(p[q]==9)
printf(" Te de saida de lado\n");
if(p[q]==10)
printf(" Te de saida bilateral\n");
if(p[q]==11)
printf(" Registro de Gaveta\n");
if(p[q]==12)
printf(" Registro de Globo\n");
if(p[q]==13)
printf(" Registro de Angulo\n");
if(p[q]==14)
printf(" Valvula de Pe e crivo\n");

}

free (p);

system ("pause");
return 0;
}

O problema é que gostaria que fosse printado a quantidade e o tipo em cada linha
mas da forma que este programa funciona primeiro será printado as quantidades para depois ser printado o tipo, além do mais a pergunta conforme disse antes da quantidade e do tipo estaram no mesmo for o que tambem não congigo fazer nesse programa, enfim não consigo alocar a memoria do tipo de singularidade e da quantidade dentro do mesmo for...o programa retorna isso:

2
4

cotovelo de R. Longo
Curva 45

enquanto o que eu queria seria:
2 cotovelo de R. Longo
4 Curva 45

Você teria alguma ideia de como posso fazer isso?Desde ja lhe agradeço.

Att, Fireands

#4
ofernandofilo

ofernandofilo

    Membro

  • Membro
  • PipPip
  • 100 posts
É um exercício de faculdade? Você tem o enunciado?

Acho que consigo fazê-lo, quando ficar perfeitamente claro a entrada e a saída desejada :D

(estou estudando o código...)

abraços

#5
fireands

fireands

    Novato

  • Novato
  • Pip
  • 13 posts

É um exercício de faculdade? Você tem o enunciado?

Acho que consigo fazê-lo, quando ficar perfeitamente claro a entrada e a saída desejada :D

(estou estudando o código...)

abraços

Boa Tarde,

Bom amigo não é um trabalho d eescola, se trata de um programa de calculo que estou desenvolvendo para "perdas na rede hidraulica", as perdas a que se refere o titulo são as singularidades (curvas, cotovelos, etc), na verdade o menu desse programa que postei faz parte de um programa maior que atribui a cada valor no menu um valor em metros de perda que é mutiplicado pela quantidade e somado ao final, isso tudo eu consegui fazer apenas gostaria de melhorar o relatorio final e descrever as opções escolhidas durante o programa tentei fazer isso de maneira convencional printando o valor da variavel quantidade e em seguida a variavel singularidade mas não deu certo pois como o printe estava no final do programa ele retornava apenas o ultimo valor alocado então pesquisei sobre alocação dinamica e me falaram a respeito da função malloc.
Tenho um video curto do funcionamento do programa por inteiro que enviei ao seu e-mail de um a olhada...sou muito leigo em programação por isso existem algumas falhas de formatação, mas acredito que de pra entender o conceito.Mais uma vez agradeço.

Att, fireands

#6
ofernandofilo

ofernandofilo

    Membro

  • Membro
  • PipPip
  • 100 posts
Código sem Malloc

/***
 * Programa feito por
 *   Fernando Di Ramos Carneiro Seixo de Britto, ofernandofilo
 * Baseado no código e desafio de
 *   Luiz de Fatima da Silva Junior, Fireands
 *
 * Descrição:
 *   Leia a quantidade de singularidades (objetos num circuito hidráulico)
 *     Tal valor indica o final da entrada da descrição das singularidades
 *
 *   Leia a descrição das singuladirades
 *
 *   Apresente:
 *      a quantidade total de singularidades
 *      a descrição e a quantidade de cada singularidade
 *
 *
 ***/

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

#define NUM_DE_MENU 14
#define MENU01 "Cotovelo 90 R. Longo"
#define MENU02 "Cotovelo 90 R. Medio"
#define MENU03 "Cotovelo 90 R. Curto"
#define MENU04 "Cotovelo 45"
#define MENU05 "Curva 90 R. Longo"
#define MENU06 "Curva 90 R. Curto"
#define MENU07 "Curva 45"
#define MENU08 "Te de Passagem Direta"
#define MENU09 "Te de Saida de Lado"
#define MENU10 "Te de Saida Bilateral"
#define MENU11 "Registro de Gaveta"
#define MENU12 "Registro de Globo"
#define MENU13 "Registro de Angulo"
#define MENU14 "Valvula de Pe e Crivo"

char* M01 = MENU01;
char* M02 = MENU02;
char* M03 = MENU03;
char* M04 = MENU04;
char* M05 = MENU05;
char* M06 = MENU06;
char* M07 = MENU07;
char* M08 = MENU08;
char* M09 = MENU09;
char* M10 = MENU10;
char* M11 = MENU11;
char* M12 = MENU12;
char* M13 = MENU13;
char* M14 = MENU14;
char** menu[(NUM_DE_MENU+1)];
int finalDoVetor = (NUM_DE_MENU + 1);
int qtdDeSingularidades[(NUM_DE_MENU+1)];

void escreva(char S[]){
  printf("%s",S);
} // fim escreva

void inicializaMenu(){
  menu[1] = M01;
  menu[2] = M02;
  menu[3] = M03;
  menu[4] = M04;
  menu[5] = M05;
  menu[6] = M06;
  menu[7] = M07;
  menu[8] = M08;
  menu[9] = M09;
  menu[10] = M10;
  menu[11] = M11;
  menu[12] = M12;
  menu[13] = M13;
  menu[14] = M14;

  int i;
  for(i = 1; i < finalDoVetor; i++){
    qtdDeSingularidades[i] = 0;
  } //
}

void informeMenu(){
  int i;
  for(i = 1; i < finalDoVetor; i++){
    printf("MENU %d - %s\n",i,menu[i]);
  }
  escreva("\n");
}

void titulo(){
  escreva("\n Programa hidrografico de Fireands\n\n");
}

void limpatela(){
  // Muita atenção neste procedimento
  // Ele pode não funcionar em alguns sistemas
  system("cls");
}

void saida(){
  int i;
  escreva("Singularidade - Quantidade\n");
  for(i = 1; i < finalDoVetor; i++){
    if(qtdDeSingularidades[i] > 0){
      printf("%s - %d\n",menu[i],qtdDeSingularidades[i]);
    }
  }
  escreva("\n");
}
int main(){
  inicializaMenu();
  int numDeSingularidades;

  titulo();
  escreva("Informe o numero de singularidades do sistema: ");
  scanf("%d",&numDeSingularidades);
  limpatela();

  int i;
  int singularidade;
  for(i = 0; i < numDeSingularidades; i++){
    titulo();

    printf("[  ... Execucao n.%d/%d  ... ]\n",(i+1),numDeSingularidades);
    informeMenu();

    escreva("Escolha uma singularidade do menu acima: ");
    scanf("%d",&singularidade);

    printf("Informe a quantidade de vezes que %d aparece no sistema : ",singularidade);
    scanf("%d", &qtdDeSingularidades[singularidade]);

    limpatela();
  } // fim for

  titulo();
  saida();
  escreva("Tecle enter pra sair..."); getch();
  return(0);
} // fim main

Se for o que eu entedi, tá funcionando.

E o vídeo que você me passou é TENSO! :D

Aquele programa é bem grande, mas é exatamente do modo como estava fazendo esse aqui.

abraços

Editado por ofernandofilo, 28 agosto 2011 - 17:42.


#7
fireands

fireands

    Novato

  • Novato
  • Pip
  • 13 posts
Boa Noite amigo,

Muitissimo obrigado pela ajuda vou fazer apenas algumas modificações, mas a ideia era essa mesma. Observei que seu programa utilizou um "linguagem" mais avançada de "c" que eu estou acostumado, achei interessante você é formado? E com relação ao meu programa, apesar de hidraulica poder não ser seu forte acha que ficou bom?

Att. Luiz

#8
ofernandofilo

ofernandofilo

    Membro

  • Membro
  • PipPip
  • 100 posts
Sou calouro em Redes de Computadores na Estácio de Sá de Goiás, e fiz 2 anos de Ciências da Computação na UFG, e abandonei. Mas tem mais de 4 anos que não programo em C.

Eu programo mais em Java, por isso, o código parece mais de quem programa Java que de quem programa em C, :blink:

Apanhei bastante no tratamento das Strings :s e talvez tenha como otimizar esse código neste sentido...

Já seu programa me pareceu interessante sim, aquele vídeo que me mandou é meio impressionante também, ehehe.

Programação é exatamente isso: a união do conhecimento numa linguagem de programação + conhecimento numa área de saber que exige um processamento, no seu caso hidráulica.

abraços

#9
fireands

fireands

    Novato

  • Novato
  • Pip
  • 13 posts
Bom dia,

Obrigado por sua opnião positiva amigo, eu estou me formando em mecatrônica, pelo cefet-mg e tenho dentre as matérias estrutura de dados e hidraulica como estava precisando estudar as duas resolvi unir isso tudo nesse programa, opniões como a sua me incentivam a continuar pois o processo de criação é arduo e poucos são aqueles que querem ajudar...o que mais ouço de meus colegas é que isso é perda de tempo ou que tenho o mesmo sobrando a ponto de gasta-lo com isso.Mais uma vez obrigado, abraços e manterei contato.

Att, Luiz




0 usuário(s) está(ão) lendo este tópico

0 membros, 0 visitantes, 0 membros anônimos