double ptr[100][2];
Para tanto, esta declaração é substituída pela alocação de memória:
double **ptr = (double **) malloc(100*sizeof(double*));
Para cada ocorrência de *(ptr+j), sendo j de 0 a 99, alocar memória:
*(ptr+j)=(double *) malloc(2*sizeof(double));
O acesso aos elementos do array bi-dimensional ou da memória alocada dinamicamente pode ser feita da mesma forma:
*(*(ptr+j)+k))
ou
ptr[j][k],
variando j de 0 a 99, k de 0 a 1.
Aproveitando este projeto, também são apresentadas as funcionalidades de acesso ao relógio do sistema e formatação de data e hora.
Para a geração de dados, foi usada a função de randomização com parâmetros de faixa de valores, casas decimais e escala desejada.
Na impressão de dados numéricos, foi usada a configuração do ambiente de execução por meio da função 'setlocale()', tornando as saídas com ponto decimal em vírgulas.
#include <stdio.h> // printf(), fflush(), getchar(), stdin #include <stdlib.h> // malloc(), free(), srand(), rand(), RAND_MAX #include <time.h> // time_t, struct tm, time(), localtime() #include <locale.h> // setlocale() int main(){ // dias da semana char dia[][14] = { "Domingo", "Segunda-Feira", "Terça-Feira", "Quarta-Feira", "Quinta-Feira", "Sexta-Feira", "Sábado" }; // data/hora em milésimos de segundos desde zero hora de 1900 // ( time_t é um 'long long int' ) time_t agora; // struct para relogio/calendario struct tm *calendario; // controle de loops int j, k; // declarar e alocar memória para 100 ponteiros de 'double' double **ptr = (double **) malloc(100*sizeof(double*)); // para cada 1 dos 100 ponteiros de 'double' alocar memória para 2 'double' for (j=0; j<100;j++){ *(ptr+j)=(double *) malloc(2*sizeof(double)); } // inicializar a sequencia de randomização (semente) usando a hora corrente do sistema srand( (unsigned) time( NULL ) ); // obter a hora corrente do sistema time( &agora ); // converter a hora do sistema em estrutura 'hh:mm:ss, dd/mm/yy, weekDay, yearDay' calendario = localtime( &agora ); // usar configurações regionais do sistema setlocale( LC_ALL, "" ); // imprimir data e hora correntes printf( "%s - %02d/%02d/%04d - %02d:%02d:%02d - %dº dia do ano", dia[calendario->tm_wday], // dia da semana (0=domingo, ..., 6=sábado) calendario->tm_mday, // dia do mês calendario->tm_mon+1, // mês (0=janeiro, ..., 11=dezembro) calendario->tm_year+1900, // anos decorridos de 1900 calendario->tm_hour, // horas do dia (00~23) calendario->tm_min, // minutos da hora (00~59) calendario->tm_sec, // segundos do minuto (00~59) calendario->tm_yday+1 ); // dia do ano (0~365) // inicialização dos dados no array bi-dimensional for (j=0; j<100;j++){ for (k=0; k<2; k++){ *(*(ptr+j)+k) = // gerar valores numéricos aleatórios // de 0.0 a 10.0 em intervalos de 0.125 (int)(((double)rand() // 0 a RAND_MAX / (RAND_MAX+1)) // RAND_MAX * ((10.125 - 0.0) * 8.0)// faixa desejada * Ajuste de escala e casas decimais + 0.0) // Deslocamento da faixa / 8.0; // Ajuste de escala e casas decimais } } // impressão dos dados do array bi-dimensional for (j=0; j<100;j++){ printf("\n"); for (k=0; k<2; k++){ printf( "%8.4lf\t", //*(*(ptr+j)+k) ptr[j][k] ); } } // liberar a memória de 2 'double' para cada um dos 100 ponteiros for (j=0; j<100;j++){ free(*(ptr+j)); *(ptr+j) = NULL; } // liberar a memória dos 100 ponteiros para 'double' free(ptr); ptr=NULL; // aguardar que teclem ENTER para encerrar o programa fflush(stdin); getchar(); // return-code de encerramento do programa return 0; }
