Problemas para usar alocação dinamica em c++ em uma estrutura de dados
[humbra@x550l livro]$ g++ Exercicio18022.cpp Funcoes18022.cpp -o exp18022
Funcoes18022.cpp: In function ‘void Aloca(PONTO&, int)’:
Funcoes18022.cpp:23:20: error: no match for ‘operator=’ (operand types are ‘PONTO’ and ‘double*’)
p = new double[n];
^
In file included from Funcoes18022.cpp:4:
Funcoes18022.h:5:8: note: candidate: ‘constexpr PONTO& PONTO::operator=(const PONTO&)’
struct PONTO
^~~~~
Funcoes18022.h:5:8: note: no known conversion for argument 1 from ‘double*’ to ‘const PONTO&’
Funcoes18022.h:5:8: note: candidate: ‘constexpr PONTO& PONTO::operator=(PONTO&&)’
Funcoes18022.h:5:8: note: no known conversion for argument 1 from ‘double*’ to ‘PONTO&&’
Funcoes18022.cpp: In function ‘void Desaloca(PONTO&)’:
Funcoes18022.cpp:28:13: error: type ‘struct PONTO’ argument given to ‘delete’, expected pointer
delete []p;
O codigo do programa utilizado é
Arquivo .h
#ifndef PONTO_H
#define PONTO_H
const int MAX = 50;
struct PONTO
{
double x[MAX];
double y[MAX];
};
int quantidadepontos();
void Aloca(PONTO &p, int n);
void Desaloca(PONTO &p);
void ler(PONTO &p, int n);
void exibir(PONTO p, int n);
double distancia(PONTO p1, PONTO p2, int n);
#endif
int quantidadepontos()
{
int n;
// Ler dimensão do vetor
cout << "Tamanho = "; cin >> n;
while (n < 1 || n > MAX)
{
cout << "Valor invalido!\n";
cout << "Tamanho = "; cin >> n;
}
return n;
}
void Aloca(PONTO &p, int n)
{
p = new double[n];
//p.y = new double[n];
}
void Desaloca(PONTO &p)
{
delete []p;
//delete []p.y;
}
void ler(PONTO &p, int n)
{
cout << "Insira os valores do ponto x " << endl;
for(int i = 0; i < n; i++){
cout << "Insira o valor do p" << i+1 << " = ";
cin >> p.x[i];
}
cout << "Insira os valores do ponto y " << endl;
for(int j = 0; j < n; j ++){
cout << "Insira o valor do p" << j+1 << " = ";
cin >> p.y[j];
}
}
void exibir(PONTO p, int n)
{
cout << "Valores dos pontos px: " << endl;
for(int i = 0; i < n; i++){
cout << "p" << i+1 << " = " << p.x[i] << endl;
}
cout << "Valores dos pontos py: " << endl;
for(int j = 0; j < n; j++){
cout << "p" << j+1 << " = " << p.y[j] << endl;
}
}
double distancia(PONTO p1, PONTO p2, int n)
{
double d;
PONTO p;
ler(p,n);
exibir(p,n);
for(int i = 0; i < n; i++){ //transferência de vetores
p1.x[i] = p.x[i];
p2.y[i] = p.y[i];
}
double menor = sqrt(pow(p1.x[0], 2.0) + pow(p2.y[0], 2.0)); //Primeiro elemento
for(int i = 0; i < n; i++){ //Varia de 1 a n-1
if (sqrt(pow(p1.x[i], 2.0) + pow(p2.y[i], 2.0)) < menor)
menor = sqrt(pow(p1.x[i], 2.0) + pow(p2.y[i], 2.0)); // Determina menor
}
d = menor;
cout << "Valor da menor distância = " << setprecision (2) << fixed << d << " m " << endl;
return d;
}
arquivo main
#include <iostream>
#include "Funcoes18022.h"
using namespace std;
int main (int argc, char *argv[]){
cout << "Programa para calcular e exibir o ponto no plano cartesiano" << endl;
cout << "mais próximo da origem" << endl;
cout << endl;
PONTO p, p1, p2;
cout << "Insira a quantidade de pontos " << endl;
int n;
n = quantidadepontos();
Aloca(p,n); //Aloca memória para o vetor
cout << "Insira os pontos de x e y " << endl;
distancia(p1,p2,n);
Desaloca(p); //Libera memória alocada