2016-04-08 4 views
0

を失敗しました:予期しない入力値。私が書くときlog10のは

printf("%f; ", massive[i]); 

:私のファイルが持っている

double** InputSystemOfLinearEquationsByFile(FILE* file) { 
    char* inputc = (char*)malloc(quiteenoughelements * sizeof(char)); 
    int thenumberofvaribles = 0; 
    int thenumberofequations = 0; 
    if (fscanf(file, "%s", inputc) == EOF) { 
     return NULL; 
    } 
    thenumberofvaribles = atoi(inputc); 
    if (thenumberofvaribles <= 0) { 
     return NULL; 
    } 
    if (fscanf(file, "%s", inputc) == EOF) { 
     return NULL; 
    } 
    thenumberofequations = atoi(inputc); 
    if (thenumberofequations <= 0) { 
     return NULL; 
    } 
double** answer = (double**)malloc(thenumberofequations*sizeof(double*)); 
for (int i = 0; i < thenumberofequations; i++) { 
    answer[i] = (double*)malloc((thenumberofvaribles + 1)*sizeof(double)); 
} 
for (int i = 0; i < thenumberofequations; i++) { 
    for (int j = 0; j < thenumberofvaribles; j++) { 
     if (fscanf(file, "%s", inputc) == EOF) { 
      return NULL; 
     } 
     answer[i][j] = atof(inputc); 
    } 
} 
for (int i = 0; i < thenumberofequations; i++) { 
    if (fscanf(file, "%s", inputc) == EOF) { 
     return NULL; 
    } 
    answer[i][thenumberofvaribles] = atof(inputc); 
} 
free(inputc); 
return answer; 
} 

    void SwapStrokes(double** matrix, const unsigned int stroke1index, const unsigned int stroke2index) { 
    double* temp = matrix[stroke1index]; 
    matrix[stroke1index] = matrix[stroke2index]; 
    matrix[stroke2index] = temp; 
    temp = NULL; 
} 

unsigned char ZeroCheck(double** matrix, const unsigned int currentstroke, const unsigned int currentcolumn, const unsigned int numberofequations) { 
    int numberofnotzerocolumn = currentstroke; 
    while ((fabs(matrix[numberofnotzerocolumn][currentcolumn]) < accuracy) || (matrix[numberofnotzerocolumn][currentcolumn] != matrix[numberofnotzerocolumn][currentcolumn])) { 
     numberofnotzerocolumn++; 
     if (numberofnotzerocolumn == numberofequations) { 
      return 1; 
     } 
    } 
    if (numberofnotzerocolumn != currentstroke) { 
     SwapStrokes(matrix, currentstroke, numberofnotzerocolumn); 
    } 
    return 0; 
} 

void JordanException(double** matrix, const unsigned int currentstroke, const unsigned int currentcolumn, const unsigned int numberofvars, const unsigned int numberofequations) { 
    int optionalcolumn = 0; 
    int optionalstroke = 0; 
    for (optionalstroke = 0; optionalstroke < currentstroke; optionalstroke++) { 
     for (optionalcolumn = 0; optionalcolumn < currentcolumn; optionalcolumn++) { 
      matrix[optionalstroke][optionalcolumn] -= matrix[optionalstroke][currentcolumn] * matrix[currentstroke][optionalcolumn]/matrix[currentstroke][currentcolumn]; 
     } 
     optionalcolumn++; 
     for (optionalcolumn; optionalcolumn <= numberofvars; optionalcolumn++) { 
      matrix[optionalstroke][optionalcolumn] -= matrix[optionalstroke][currentcolumn] * matrix[currentstroke][optionalcolumn]/matrix[currentstroke][currentcolumn]; 
     } 
    } 
    for (optionalstroke = currentstroke + 1; optionalstroke < numberofequations; optionalstroke++) { 
     for (optionalcolumn = 0; optionalcolumn < currentcolumn; optionalcolumn++) { 
      matrix[optionalstroke][optionalcolumn] -= matrix[optionalstroke][currentcolumn] * matrix[currentstroke][optionalcolumn]/matrix[currentstroke][currentcolumn]; 
     } 
     optionalcolumn++; 
     for (optionalcolumn; optionalcolumn <= numberofvars; optionalcolumn++) { 
      matrix[optionalstroke][optionalcolumn] -= matrix[optionalstroke][currentcolumn] * matrix[currentstroke][optionalcolumn]/matrix[currentstroke][currentcolumn]; 
     } 
    } 
    for (optionalcolumn = 0; optionalcolumn < currentcolumn; optionalcolumn++) { 
     matrix[currentstroke][optionalcolumn] /= matrix[currentstroke][currentcolumn]; 
    } 
    optionalcolumn++; 
    for (optionalcolumn; optionalcolumn <= numberofvars; optionalcolumn++) { 
     matrix[currentstroke][optionalcolumn] /= matrix[currentstroke][currentcolumn]; 
    } 
    for (optionalstroke = 0; optionalstroke < numberofequations; optionalstroke++) { 
     matrix[optionalstroke][currentcolumn] = 0.; 
    } 
    matrix[currentstroke][currentcolumn] = 1.; 
} 

double* JordanMethod(double** matrix, const unsigned int numberofvars, const unsigned int numberofequations) { 
    if (numberofvars > numberofequations) { 
     return NULL; 
    } 
    else { 
     unsigned int currentcolumn = 0; 
     unsigned int currentstroke = 0; 
     while ((currentcolumn < numberofvars) && (currentstroke < numberofequations)) { 
      if (ZeroCheck(matrix, currentstroke, currentcolumn, numberofequations) == 1) { 
       return NULL; 
      } 
      JordanException(matrix, currentstroke, currentcolumn, numberofvars, numberofequations); 
      currentstroke++; 
      currentcolumn++; 
     } 
     double* answer = (double*)malloc(numberofvars * sizeof(double)); 
     for (currentstroke = 0; currentstroke < numberofvars; currentstroke++) { 
      if ((fabs(matrix[currentstroke][numberofvars]) < accuracy) || (matrix[currentstroke][numberofvars] != matrix[currentstroke][numberofvars])){ 
       matrix[currentstroke][numberofvars] = 0.; 
      } 
      answer[currentstroke] = matrix[currentstroke][numberofvars]; 
     } 
     return answer; 
    } 
} 

    void WriteMassive(double* massive, unsigned int numberofelements, FILE* file) { 
    if ((massive != NULL) && (file != NULL)){ 
     for (unsigned int i = 0; i < numberofelements; i++) { 
      fprintf(file, "%f; ", massive[i]); 
     } 
     fprintf(file, "\n"); 
    } 
} 

int main(int argc, char **argv) 
{ 
    double* matrixa = NULL; 
    double** matrix = NULL; 
    FILE* file; 
    FILE* output; 
    file = fopen("File.txt", "r"); 
    matrix = InputSystemOfLinearEquationsByFile(file); 
    matrixa = JordanMethod(matrix, 4, 4); 
    WriteMassive(matrixa, 4, output); 
    fclose(file); 
    system("pause"); 
    return 0; 
} 

4 
4 
2 -1 5 7 
3 3,5 4 -5 
-7 -3 7,2 5,3 
4 3 2,1 -3,5 

をi = 0のとき、私は、このバグに直面:

> Debug Assertion Failed! Program: ...ConsoleApplication1.exe File: 
> minkernel\crts\ucrt\src\appcrt\convert\cfout.cpp Line: 126 Expression: 
> ("unexpected input value; log10 failed, 0) 

Wh私はする必要がありますか? P.デバッグしている間、私は大規模な[私]とビジュアルスタジオショーにそれが通常の値(6.29 ...のようなもの)を持っていることを示しました。

+0

その値は何ですか( '%a'またはデバッガを試してみてください)? – cremno

+1

「大規模な」宣言はどうですか? – sjsam

+0

"巨大な大規模な場所は二重です。" - 何ですか?配列を意味しましたか? –

答えて

0

私は2015年の代わりにVS 2013で自分のコードを試しました...それは働いた! Idkはどのように動作するのか、多分私のコンピュータの問題です。

+0

「他の場所でも動作するようです」という警告は、**未定義の動作**の症状です。このコードが比較的重要なもの(例えば、原子炉炉心温度安全システム、ガン治療センターのガンマレーザーコントローラ)に含まれることになっている場合は、再度確認することをお勧めします。 'valgrind'やそれに類するものを試してみてください。 – usr2564301

+0

...これは[this](https://xkcd.com/1316/)です(警告:xkcdリンク)。 – usr2564301

関連する問題