C++

2016-04-05 7 views
0

'da Nx3 değerlerini saklayan bir 2D işaretçi oluşturmak istiyorum. Kodu aşağıya yazdım ve eğer bir if-else durumu kullanarak bazı değerleri saklamak için kullanmak istiyorum. Değerleri saklamak için iki adet 2 boyutlu işaretçi oluşturdum, * p ve * q. Şimdi kod tamam görünüyor, ancak p ve q işaretçilerinde saklanan değerleri basamıyorum. Lütfen bana yardım edebilir misiniz? Ne "C++

#include <math.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <iostream> 

int main() 
{ 
    int i, j, N; 
    double xtmp, ytmp, ztmp, delx, dely, delz, fpair, cutsq; 
    double rsq, r2inv, r6inv, forcelj; 
    double firstval[2][3], secondval[2][3]; 
    double (*p)[2][3] = 0; 
    double (*q)[2][3] = 0; 
    int f[2][3]; 
    p =& firstval; 
    q =& secondval; 

    double x[2][3] = 
    { 
     {0.1,0.8,0.12}, 
     {0.5,0.9,0.13} 
    }; 

    N = 2; 
    cutsq = 1.0; 

    for (i = 0; i < N; i++) { 
     for (j = 0; j < N; j++) { 
      xtmp = x[i][0]; 
      ytmp = x[i][1]; 
      ztmp = x[i][2]; 

      delx = xtmp - x[j][0]; 
      dely = ytmp - x[j][1]; 
      delz = ztmp - x[j][2]; 
      rsq = delx * delx + dely * dely + delz * delz; 
      if (rsq < cutsq) 
      { 
       r2inv = 1.0/rsq; 
       r6inv = r2inv * r2inv * r2inv; 
       forcelj = r6inv * 1; 
       fpair = forcelj * r2inv; 

       f[i][0] += delx * fpair; 
       f[i][1] += dely * fpair; 
       f[i][2] += delz * fpair; 
       f[j][0] -= delx * fpair; 
       f[j][1] -= dely * fpair; 
       f[j][2] -= delz * fpair; 

       if (i != j) 
       { 
        (*p)[i][0] += delx * fpair; 
        (*p)[i][1] += dely * fpair; 
        (*p)[i][2] += delz * fpair; 
        (*p)[j][0] -= delx * fpair; 
        (*p)[j][1] -= dely * fpair; 
        (*p)[j][2] -= delz * fpair; 
       } 
       else 
       { 
        (*q)[i][0] += delx * fpair; 
        (*q)[i][1] += dely * fpair; 
        (*q)[i][2] += delz * fpair; 
        (*q)[j][0] -= delx * fpair; 
        (*q)[j][1] -= dely * fpair; 
        (*q)[j][2] -= delz * fpair; 
       } 

       std::cout << firstval << "\n"; 
      } 
     } 
    }   
} 
+0

Lütfen sorunuzu göndermeden önce kodunuzu düzgün bir şekilde biçimlendirin. – Chiel

+0

Ayrıca, şu anda hangi çıkışı alıyorsunuz? –

+0

Çoğaltılamadı: https://ideone.com/ElFZxo –

cevap

1

Ben akıllı bir yol olduğunu hiç şüphem yok? Ama ...
o
a) Bir şablon yazabilirim 'yanlış yapıyorum' nasıl bir çifte [N akışı bilir bir çift [M akış nasıl] ve
b) birinci bir temel bilen bir şablon()] [N]

template <typename T, std::size_t N> 
std::ostream& operator<< (std::ostream &o, const T(&a)[N]) { 
    o << '[' << a[0]; // iirc zero-sized arrays are not allowed ....better look it up though. 
    for (std::size_t i = 1; i < N; ++i) { 
     o << ',' << a[i]; 
    } 
    o << ']'; 
    return o; 
} 

template <typename T, std::size_t M, std::size_t N> 
std::ostream& operator<< (std::ostream &o, const T(&a)[M][N]) { 
    o << '{' << a[0]; 
    for (std::size_t i = 1; i < M; ++i) { 
     o << ',' << a[i]; 
    } 
    o << '}'; 
    return o; 
} 

ve sonra yapabilirstd::cout << firstval << std::endl;


düzenleme: Ve tabii ki daha genel bir çözüm

template <typename T> void print_array(const T & a, std::size_t level=0); 
template <typename T> 
void print_array_impl(const T & a, std::size_t level, std::true_type) 
{ 
    std::cout << std::endl; 
    for (auto & x : a) print_array(x, level+1); 
    fill_n(std::ostream_iterator<char>(std::cout), level, ' '); 
} 

template <typename T> 
void print_array_impl(const T & a, std::size_t level, std::false_type) 
{ 
    for (auto & x : a) std::cout << x << ','; 
} 

template <typename T> 
void print_array(const T & a, std::size_t level) 
{ 
    fill_n(std::ostream_iterator<char>(std::cout), level, ' '); 
    std::cout << '['; 
    print_array_impl(a, level, std::is_array<typename std::remove_extent<T>::type>()); 
    std::cout << ']' << std::endl; 

}

.oo (benim C++ tazelemek gerek yoktur; hala zarif görünmüyor ....)