Jump to content

[C] Ajuda: Criar um array dinâmico (Resolvido)


pedroerg

Recommended Posts

Olha vê se isto ajuda 😛

#include <stdio.h>
#include <math.h>
#include <conio.h>

typedef struct manha{
float x;
float y;
}manha;


void lista_pontos(int ponto, float p1x, float p1y, float p2x, float p2y)
{
float pmx, pmy, distancia, raio, angulo, calcx, calcy;
int i=0;
//float vecx[ponto], vecy[ponto];
manha *vec=NULL;
pmx = (p1x + p2x)/2;
pmy = (p1y+p2y)/2;

distancia = sqrt( pow(p2x-p1x,2) + pow(p2y-p1y,2));
raio = distancia / 2;
angulo = ((360/ponto)*3.1415927)/180;

if(ponto>0){
	vec = (manha *) malloc(sizeof(manha)*ponto);
}
for(i=0;i<ponto;i++)
{
	vec[i].x = cos(angulo*i) * raio + pmx;
	vec[i].y = sin(angulo*i) * raio + pmy;
	//printf("Ponto x%d : %f\t",i,calcx);
	//printf("Ponto y%d : %f\n",i,calcy);
}

for(i=0;i<ponto;i++)
{
	printf("Ponto x%d : %f\t",i,vec[i].x);
	printf("Ponto y%d : %f\n",i,vec[i].y);
}
    getchar();

}
void main()
{
int ponto;
float p1x, p1y, p2x, p2y;

printf("Introduza o numero de pontos para definir a circunferencia:");
scanf("%d",&ponto);
printf("Introduza as coordenadas do ponto 1:");
scanf("%f %f",&p1x,&p1y);
printf("Introduza as coordenadas do ponto 2:");
scanf("%f %f",&p2x,&p2y);
lista_pontos(ponto, p1x,p1y,p2x,p2y);
}
Link to comment
Share on other sites

Pretendes criar um vector dinâmico ou uma lista? O segundo é mais comum, e ambos cumprem o teu objectivo.

Seja como for, vou-te responder ao primeiro.

Existem 3 grandes funções que permites manusear memória em C: malloc, realloc e free.

Alocação de memória, Re-Alocação, e libertação.

       void *malloc(size_t size);
       void free(void *ptr);
       void *realloc(void *ptr, size_t size);

O malloc(x) aloca x bytes de memória. No exemplo do senito vês-lo a alocar memória, usando "sizeof(manha)*ponto", ou seja, está a disponibilizar para o seu programa um espaço contíguo da memória igual ao tamanho da estrutura por ele criada um x número de vezes (esse número de vezes é o "ponto"). Ora, ele pode faze-lo deste modo porque conhece à partida qual o tamanho que necessita para o vector. E se não conhecesse?

Aí, entra o realloc, que permite alterar o tamanho de um espaço de memória. (grande asneira que acabei de dizer, é impossível, como é óbvio, esticar a memória) Basicamente ele disponibiliza para o teu programa N bytes de memória após o ponto escolhido. Se essa memória estiver ocupada, ele move o teu vector (sim, costuma-se usar em vectores para o seu tamanho ser aumentado) para um local onde ele "caiba".

Acho que ficou pouco explicito, mas encontras bastante informação sobre estes dois comandos no google.

Link to comment
Share on other sites

Pretendes criar um vector dinâmico ou uma lista? O segundo é mais comum, e ambos cumprem o teu objectivo.

Seja como for, vou-te responder ao primeiro.

Existem 3 grandes funções que permites manusear memória em C: malloc, realloc e free.

Alocação de memória, Re-Alocação, e libertação.

       void *malloc(size_t size);
       void free(void *ptr);
       void *realloc(void *ptr, size_t size);

O malloc(x) aloca x bytes de memória. No exemplo do senito vês-lo a alocar memória, usando "sizeof(manha)*ponto", ou seja, está a disponibilizar para o seu programa um espaço contíguo da memória igual ao tamanho da estrutura por ele criada um x número de vezes (esse número de vezes é o "ponto"). Ora, ele pode faze-lo deste modo porque conhece à partida qual o tamanho que necessita para o vector. E se não conhecesse?

Aí, entra o realloc, que permite alterar o tamanho de um espaço de memória. (grande asneira que acabei de dizer, é impossível, como é óbvio, esticar a memória) Basicamente ele disponibiliza para o teu programa N bytes de memória após o ponto escolhido. Se essa memória estiver ocupada, ele move o teu vector (sim, costuma-se usar em vectores para o seu tamanho ser aumentado) para um local onde ele "caiba".

Acho que ficou pouco explicito, mas encontras bastante informação sobre estes dois comandos no google.

essa explicação tá 5*  😛

como tava a trabalhar só tive mm tempo de dar um exemplo, n deu pra explicar.

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.