Localhost Posted December 31, 2009 at 08:37 PM Report Share #303498 Posted December 31, 2009 at 08:37 PM Olá pessoal, alguém me podia explicar como é que eu aloco dinamicamente um vector e um vector multidimensional? Eu sei que quando alocámos algo dinamicamente a função por exemplo malloc devolve-nos um ponteiro do tipo void * para o primeiro byte da nossa alocação, no entanto não percebo várias coisas, porquê o cast? Já vi várias coisas diferentes sobre alocação de vectores e matrizes mas não sei qual é a mais correcta. here since 2009 Link to comment Share on other sites More sharing options...
mogers Posted December 31, 2009 at 08:56 PM Report Share #303505 Posted December 31, 2009 at 08:56 PM void * malloc ( size_t size );Allocate memory block Allocates a block of size bytes of memory, returning a pointer to the beginning of the block. The content of the newly allocated block of memory is not initialized, remaining with indeterminate values. O malloc só reserva um espaço de memória de size bytes, independentemente do tipo de dados que pretendes utilizar nessa memória, daí o void*. Visto que não consegues fazer nada com um void*, tens de fazer o cast para o tipo de dados em causa. Ex: #include <stdio.h> #include <stdlib.h> int main() { int v[10]; /* variável inteira */ int * i = (int *) malloc( sizeof(int) ); *i = 1; i = v+5; /* vector com N doubles */ int N = 10; double * d = (double *) malloc( sizeof(double) * N ); d[5] = 5.12; printf("%.5f\n", d[5]); /* vector bidimensional, basicamente é vector de vectores */ char ** matriz; int L = 5, C = 3 , j; matriz = (char **) malloc( sizeof(char *) * L ); // vector de char* for (j = 0 ; j < L ; j++) matriz[j] = (char *) malloc( sizeof(char) * C); matriz[2][1] = '*'; return 0; } "What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação. Link to comment Share on other sites More sharing options...
Localhost Posted December 31, 2009 at 09:02 PM Author Report Share #303508 Posted December 31, 2009 at 09:02 PM Ah, já entendi! Obrigado. Só para confirmar o que tu fizeste: é o seguinte, na parte da matriz, alocaste espaço para 5 linhas e depois naquele loop cada vez que ele entrava numa linha tu alocavas a coluna correcto? Edit°: Não percebi porque é que no loop for quando foste a alocar as colunas utilizaste um indice :s Edit¹: Já percebi, porque tens de pôr em cada linha xD here since 2009 Link to comment Share on other sites More sharing options...
mogers Posted December 31, 2009 at 09:26 PM Report Share #303514 Posted December 31, 2009 at 09:26 PM Aloca-se espaço para 5 linhas e depois para cada linha aloca-se o espaço para C colunas (o espaço não é alocado coluna a coluna). Penso que o que disse já responde ao teu edit. "What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação. Link to comment Share on other sites More sharing options...
Localhost Posted December 31, 2009 at 09:33 PM Author Report Share #303516 Posted December 31, 2009 at 09:33 PM Então é o seguinte: Ele aloca espaço para 5 linhas, depois cada vez que ele entra no laço aloca espaço para 3 colunas formando assim, de uma maneira estúpida, 3 quadrados por linha? LOL Ou seja, é uma alocação por passos? Ele primeiro forma 5 vectores e depois forma uma matriz colocando 3 colunas? E não se podia fazer tipo alocar logo 15 colunas? here since 2009 Link to comment Share on other sites More sharing options...
mogers Posted December 31, 2009 at 09:35 PM Report Share #303517 Posted December 31, 2009 at 09:35 PM Porque é que dizes "de maneira estúpida" ? "What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação. Link to comment Share on other sites More sharing options...
Localhost Posted December 31, 2009 at 09:37 PM Author Report Share #303518 Posted December 31, 2009 at 09:37 PM Estava a dizer de uma maneira estupida em relação ao meu exemplo, formar 3 quadrados xD here since 2009 Link to comment Share on other sites More sharing options...
mogers Posted December 31, 2009 at 09:52 PM Report Share #303519 Posted December 31, 2009 at 09:52 PM Eu dei um exemplo de uma matriz LxC, mas podia não ser. Ex: int **m = (int**) malloc(sizeof(int*) * 3); m[0] = (int*) malloc(sizeof(int) * 1); m[1] = (int*) malloc(sizeof(int) * 3); m[2] = (int*) malloc(sizeof(int) * 2); Ou seja, é uma alocação por passos? Ele primeiro forma 5 vectores e depois forma uma matriz colocando 3 colunas? E não se podia fazer tipo alocar logo 15 colunas? Podias. Mas em primeiro lugar, nota que em C, a memória de uma matriz é alocada linha a linha. Ou seja, char matriz[10][5]; matriz[1][2] = 89 é equivalente a colocar 89 na à posição 1*5+2 da memória alocada à matriz. Senão me engano, o uso teria de ser algo como: int L = 5 , C = 3; #define getIndex(i,j) i*C+j ... int * m = (int*) malloc(sizeof(int) * 15); m[ getIndex(1,2) ] = 89; Eu vejo que já tens bastantes conhecimentos, mas parecem-me estar pouco sólidos. Caso não tenhas aulas de programação, eu aconselhava-te a arranjar um livro ou uma boa referência online e ir dando uma vista de olhos de modo a consolidar os conhecimentos. Já agora que andas no secundário, dá uma vista de olhos neste tópico. Podias participar nas olimpiadas de informatica 🙂 "What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação. Link to comment Share on other sites More sharing options...
Localhost Posted December 31, 2009 at 10:00 PM Author Report Share #303521 Posted December 31, 2009 at 10:00 PM Ahm, entendi tudo, muito obrigado. O que eu queria mesmo eram muitos exercícios para poder trabalhar os conceitos! Quanto às olimpiadas já me tinham falado aqui no forúm, acho que foi o Taris ou Tharis 😁 here since 2009 Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now