Ponteiro para ponteiro para ponteiro [RESOLVIDO]

1. Ponteiro para ponteiro para ponteiro [RESOLVIDO]

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 27/08/2015 - 15:05h

Alguém sabe alocar um ***p? Estou tentando faz horas e só consegui alocar quando o tamanho de cada vetor é igual. Mas preciso alocar um ***p com tamanhos diferentes. Segue abaixo o código que tentei fazer:

#include <cstdio>
#include <stdlib.h>
#include <time.h>
#include <iostream>

int main()
{
int ***p;
int i, j, k;
// só funciona se x, y e z tiverem mesmo valor
int x = 3, y = 2, z = 4;

p = new int**[z];
for (i = 0; i < y; i++)
{
p[i] = new int*[y];
for (j = 0; j < x; j++)
{
p[i][j] = new int[x];
}
}

srand(time(0));

for (i = 0; i < x; i++)
for (j = 0; j < y; j++)
for (k = 0; k < z; k++)
{
p[i][j][k] = rand() % 50;
}

for (i = 0; i < x; i++)
{
for (j = 0; j < y; j++)
{
for (k = 0; k < z; k++)
{
printf("%d, ",p[i][j][k]);
}
printf("\n");
}
printf("\n");
}

for (i = 0; i < y; i++)
{
for (j = 0; j < x; j++)
{
delete[] p[i][j];
}

delete[] p[i];
}

delete[] p;
return 0;
}


O problema está na linha com p[i][j][k] = rand() % 50, parece que estou colocando valores fora do vetor e por isso dá falha de segmentação.



  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 27/08/2015 - 16:26h

double ***p;  // p é ponteiro para ponteiro para ponteiro para double.

p=new double **[10]; // p agora “é” array de ponteiro para ponteiro para double.
for(int i=0; i<9; i++){
double i2=i*i;
p[i]=new double *[15]; // p[i] agora “é” array de ponteiros para double.
for(int j=0; j<15; j++){
double j2=j*j;
p[i][j]=new double[20]; // p[i][j] agora “é” array de doubles.
for(int k=0; k<20; k++){
double k2=k*k;
p[i][j][k]=sqrt(i2+j2+k2); // Cada elemento guarda a distância da origem.
}
}
}

// A matriz 3D final é análoga à da declaração “double p[10][15][20];”.

// Desalocação.
for(int i=0; i<10; i++){
for(int j=0; j<15; j++)
delete[] p[i][j];
delete[] p[i];
}
delete[] p;



Mas eis algo melhor ainda, já que você está usando C++.

// Alocação na própria declaração.
vector<vector<vector<double>>> mat3d(10, vector<vector<double>>(15, vector<double>(20)));

// O loop é só para preencher com os valores calculados.
for(int i=0; i<10; i++){
double i2=i*i;
for(int j=0; j<15; j++){
double j2=j*j;
for(int k=0; k<20; k++){
double k2=k*k;
mat3d[i][j][k]=sqrt(i2+j2+k2);
}
}
}

// Desalocação automática.


3. Re: Ponteiro para ponteiro para ponteiro [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 27/08/2015 - 18:34h

SamL escreveu:

Muito obrigado Paulo, agora funciona perfeitamente.
Esse com vector é muito estranho, vou usar o alocado com new porque sou obrigado a executar um metodo remove() para retirar a referência do contador de referência (estou falando de uma classe não de um int ***)..
Valeu.


A não ser que o objetivo seja didático, não reinvente a roda. “Contador de referência” soa para mim como um possível lugar para um std::shared_pointer, que já está pronto e você sabe que funciona.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts