Помощь - Поиск - Пользователи - Календарь
Полная версия: error C2664 исправьте пожалуйста
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Другие языки
daimos
Програма решения уравнений методом Гауса, но есть одна ошибка:
#include "stdafx.h"
float systgaus(float,float,float);

int _tmain(int argc, _TCHAR* argv[])
{
	 float A[]={5,0.1,0.2,0.1,4,-0.1,0.1,-0.2,3};
	 float B[]={10,20,-4.5},X[3];
	 systgaus(A,B,X);
	 printf("\n x1=%f,x2=%f,x3=%f", X[0],X[1],X[2]);
	 return 0;
}

float systgaus (float A0[],float B0[],float X[])
{
int i,j,k;
float A[3][3],B[3],S,D,C;
for(i=0;i<3;i++)
{
	 B[i]=B0[i]; A[0][i]=A0[i]; A[1][i]=A0[i+3]; A[2][i]=A0[i+6];
}
for(i=0;i<3;i++)
{
	 D=A[i][i];B[i]=B[i]/D;
	 for(j=i;j<3;j++) A[i][j]=A[i][j]/D;
	 for(k=(i+1);k<3;k++)
	 {
		  C=A[k][i]; B[k]=B[k]-B[i]*C;
		  for(j=i;j<3;j++) A[k][j]=A[k][j]-A[i][j]*C;
	 }
}
 X[2]=B[2];
	 for(k=1;k>0;k--)
	 {
		  S=0; for(j=2;j>k;j--) S=S+X[j]*A[k][j]; X[k]=B[k]-S;
	 }
}
volvo
Цитата
но есть одна ошибка
Еще бы... Ты в прототипе функции указываешь, что все 3 параметра имеют тип float, и тут же пытаешься передать все три указателя на float. Поменяй прототип:
float systgaus(float*,float*,float*);


Кстати, можно узнать, чему у тебя после того, как процедура отработает, будет равно значение X[0]? Оно внутри systgaus никак не заполняется, а в основной программе никак не инициализируется. Мусор получишь...

И почему ты в основной программе никак не ограничиваешь массивы, а внутри подпрограммы уже жестко прописываешь, что размеры равны 3? Или вводи какую-нибудь константу для размера матрицы, и работай с ней, или уж передавай этот самый размер в подпрограмму и там работай именно с ним, а не с тройкой...
daimos
Спасибо большое. После всех исправлений все получилось. А про масивы нечего не понял(если можно объесните что именно).
#include "stdafx.h"
float systgaus(float* , float* , float* );

int _tmain(int argc, _TCHAR* argv[])
{
	 float A[]={1.6,-0.2,0.4,-0.2,1.8,-0.1,0.3,-0.1,2};
	 float B[]={10,20,-4.5},X[3];
	 systgaus(A,B,X);
	 printf("\n x1=%f, x2=%f, x3=%f", X[0],X[1],X[2]);
	 return 0;
}

float systgaus (float A0[],float B0[],float X[])
{
int i,j,k;
float A[3][3],B[3],S,D,C;
for(i=0;i<3;i++)
{
	 B[i]=B0[i]; A[0][i]=A0[i]; A[1][i]=A0[i+3]; A[2][i]=A0[i+6];
}
for(i=0;i<3;i++)
{
	 D=A[i][i];B[i]=B[i]/D;
	 for(j=i;j<3;j++) A[i][j]=A[i][j]/D;
	 for(k=(i+1);k<3;k++)
	 {
		  C=A[k][i]; B[k]=B[k]-B[i]*C;
		  for(j=i;j<3;j++) A[k][j]=A[k][j]-A[i][j]*C;
	 }
}
 X[2]=B[2];
	 for(k=1;k>=0;k--)
	 {
		 S=0; for(j=2;j>k;j--)
		 S=S+X[j]*A[k][j]; X[k]=B[k]-S;
	 }
	 return 1;
}


М
Просьба использовать правильные тэги!
code=cpp
Lapp

volvo
Цитата
А про масивы нечего не понял(если можно объесните что именно).
Я о чем-то вроде этого:
#include "stdafx.h"
float systgaus(float* , float* , float* );

#define N 4

int _tmain(int argc, _TCHAR* argv[])
{
      int i;
     float A[N*N] = {8, 5, -3, 4, 2, 2, -1, 1, 3, 3, -2, 2, 4, 3, -1, 2};
     float B[N] = {-8, 6, -2, -4}, X[4];

     systgaus(A,B,X);
     printf("\n");
     for(i = 0; i < N; i++)
     {
         printf(" x%d=%f%c", i, X[i], (i == N-1)?' ':',');
     }
     return 0;
}

float systgaus (float A0[],float B0[],float X[])
{
    int i,j,k;
    float A[N][N],B[N],S,D,C;
    for(i=0;i<N;i++)
    {
        B[i]=B0[i];
        for(j = 0; j<N; j++)
        {
            A[j][i]=A0[i+N*j];
        }
    }
    for(i=0;i<N;i++)
    {
        D=A[i][i];B[i]=B[i]/D;
        for(j=i;j<N;j++) A[i][j]=A[i][j]/D;
        for(k=(i+1);k<N;k++)
        {
            C=A[k][i]; B[k]=B[k]-B[i]*C;
            for(j=i;j<N;j++) A[k][j]=A[k][j]-A[i][j]*C;
        }
    }
    X[N-1]=B[N-1];
    for(k=N-2;k>=0;k--)
    {
        S=0;
        for(j=N-1;j>k;j--) S=S+X[j]*A[k][j];
        X[k]=B[k]-S;
    }
    return 1;
}
Обрати внимание, теперь программа будет работать как для 3-х уравнений, так и для 4-х, и т.д. Достаточно только изменить N, и впечатать нужные данные...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.