FORTRAN代码与C++代码的不同结果 我没有解释这两个代码1在C++中的不同之处,而在FORTRAN中的第二个代码…我没有弄明白区别的意义

FORTRAN代码与C++代码的不同结果 我没有解释这两个代码1在C++中的不同之处,而在FORTRAN中的第二个代码…我没有弄明白区别的意义,c++,fortran,C++,Fortran,C++: 我解决了我犯了一个严重的错误!使用ja_u作为索引。。我忘了给你打电话了 因此,工作功能是: # include <iosfwd> # include <vector> # include <cmath> # include <iomanip> # include <iostream> std::vector<double> dot( int size, std::vector<double> x,

C++:

我解决了我犯了一个严重的错误!使用ja_u作为索引。。我忘了给你打电话了

因此,工作功能是:

# include <iosfwd>
# include <vector>
# include <cmath>
# include <iomanip>
# include <iostream>

std::vector<double> dot( int size, std::vector<double> x, 
                         std::vector<double> aa, std::vector<int> ja)
{     

      std::vector<double> y(x.size());

      for(auto i = 0; i < size ; i++ )
            y.at(i) = aa.at(i) * x.at(i);

      for(auto i=0 ; i < size ; i++ )
      {

         auto k = ja.at(i)-1;

         do
         {
            y.at(i) += aa.at(k) * x.at(ja.at(k)-1) ;
            k++;
         }
         while(k < ja.at(i+1)-1) ;

      }
      return y;
}

两个代码的差异是在JAYindex中使用的,作为其他向量的索引,而没有考虑到在FORTRAN代码中JAY1给我们第一个值JAAI在C++中的第二个!@弗拉基米尔F现在清楚了吗

>我看到的C++代码有几个问题。

首先,dot函数不返回任何内容。它需要返回y;最后的陈述

另一个是在该函数的最内层循环中计算y.ati。它应该是y.ati=y.ati+aa。。。或y.ati+=aa。。。但不是两者都有

第三个问题是,在输出循环中,使用了错误的数组x而不是y


可能还有其他问题。在调试器中运行程序并比较它们的执行情况有助于发现它们。

哪一个不同?您必须描述差异,即使我们运行代码,也可能会看到与您看到的不同的东西。请向我们展示您的结果并发表评论。读取和。初始化数组中的数字是单精度的,而不是双精度的。大量重复。但实际上,您必须向我们展示您所谈论的差异。其中一个可能重复:请参见,这并没有解决问题,但如果您希望避免访问超出边界的数组,请在函数开始时检查它们的大小。然后用索引操作替换所有对ati的调用。当你使用简单的for循环时,检查每个数组的访问限制浪费了大量的时间。你说我知道C++在0和1的FORTRAN上启动索引,但是我想我已经考虑过了。你做得不对。ja是一个将索引存储到另一个数组中的数组,您还没有考虑到与之相关的off。谢谢,我已经解决了从所有ja_i和jak中减去1作为索引的问题!!
MODULE MSR
 IMPLICIT NONE

CONTAINS
     subroutine amuxms (n, x, y, a,ja)
      real*8  x(*), y(*), a(*)
      integer n, ja(*)
      integer i, k
      do 10 i=1, n
        y(i) = a(i)*x(i)
 10     continue
      do 100 i = 1,n

         do 99 k=ja(i), ja(i+1)-1
            y(i) = y(i) + a(k) *x(ja(k))
 99      continue
 100  continue

      return

      end

END MODULE

PROGRAM MSRtest
USE MSR
IMPLICIT NONE
INTEGER :: i
REAL(KIND(0.D0)), DIMENSION(4) :: y, x= (/0.,1.3,4.2,0.8/)

REAL(KIND(0.D0)), DIMENSION(9) :: AA = (/ 1.01, 4.07, 6.08, 9.9, 0., 2.34, 3.12, 1.06, 2.2/) 
INTEGER , DIMENSION(9)         :: JA = (/6, 7, 7, 8, 10, 3, 1, 1, 3/)
CALL amuxms(4,x,y,aa,ja)

WRITE(6,FMT='(4F8.3)') (y(I), I=1,4)    

END PROGRAM
# include <iosfwd>
# include <vector>
# include <cmath>
# include <iomanip>
# include <iostream>

std::vector<double> dot( int size, std::vector<double> x, 
                         std::vector<double> aa, std::vector<int> ja)
{     

      std::vector<double> y(x.size());

      for(auto i = 0; i < size ; i++ )
            y.at(i) = aa.at(i) * x.at(i);

      for(auto i=0 ; i < size ; i++ )
      {

         auto k = ja.at(i)-1;

         do
         {
            y.at(i) += aa.at(k) * x.at(ja.at(k)-1) ;
            k++;
         }
         while(k < ja.at(i+1)-1) ;

      }
      return y;
}