none
Run-Time Check Failure #2 - Stack around the variable 'C' was corrupted.

    Question

  • Buenos días, tengo el siguiente código que resuelve un sistema de dos ecuaciones y dos incognitas (ax + by = 7 y cx + dy = -1):

    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    #include <math.h>

    #define UBound(n) sizeof(n) / sizeof(n[0]);

    bool Gauss(double (&A)[2][3], double (&C)[2])
    {
    //Solución de Ecuaciones Lineales 
    //'Argumentos:
    //'A(): Arreglo bidimensional que contiene la matriz
    //'C(): Arreglo unidimensional que entregará la solución.
    //'-------------------------------------------------------------------------
    double Tem, Sum;
    int i, L, j, k, N, m;

    try //****  hace los siguiente si no hay error (Es como el On Error GoTo de VB)
    {
    N = UBound(C);
    m = N + 1;
    for (L = 1; L <= N-1; L++){
    j = L;
    for(k = L + 1; k <= N; k++)//Estos dos pedazos intercambian el orden de las filas para que las de mayores números estén arriba
    {
    if(abs(A[j][L]) >= abs(A[k][L])){}
    else{j = k;}

    if (j != L)
    {
    for(i = 1; i <= m; i++)
    {
    Tem = A[L][i];
    A[L][i] = A[j][i];
    A[j][i] = Tem;
    }
    }
    for(j = L + 1; j <= N; j++)//Este pedazo hace que se formen ceros debajo de la diagonal
    {
    Tem = A[j][L]/A[L][L];
    for(i = 1; i <= m; i++)
    {
    A[j][i] = A[j][i] - Tem*A[L][i];
    }
    }
    }
    C[N] = A[N][m]/A[N][N]; //Este último pedazo va cogiendo fila por fila desde la más de abajo y va despejando el valor asociado con la diagonal (recordar que es el método de Gauss y no el de Gauss-Jordan)
    for (i = 1; i <= N-1; i++)
    {
    j = N - i;
    Sum = 0;
    for (L = 1; L <= i; L++)
    {
    k = j + L;
    Sum = Sum + A[j][k]*C[k];
    }
    C[j] = (A[j][m] - Sum)/A[j][j];
    }

    return true;
    }

    catch(...) //Si se provoca algun error pasará esto (Como el final de On Error GoTo de VB)
    {
    cout<<"No tiene solución el sistema de ecuaciones"<<endl;
    return false;
    }
    }




    int _tmain()
    {
    double B[2][3], C[2];

    cout<<"ax + by = 7 y cx + dy = -1: "<<endl;
    cout<<"Dame a: "<<endl;
    cin>>B[1][1];
    cout<<"Dame b: "<<endl;
    cin>>B[1][2];
    cout<<"Dame c: "<<endl;
    cin>>B[2][1];
    cout<<"Dame d: "<<endl;
    cin>>B[2][2];
    B[1][3]= 7;
    B[2][3]= -1;


    if (Gauss(B,C))
    {
    cout<<"x es: "<<C[1]<<endl;
    cout<<"y es: "<<C[2]<<endl;
    }
    else
    {
    cout<<"Pailas"<<endl; 
    }
    cin.get();
    cin.get();
    return 0;
    }

    El programa funciona bien, pero al final de todo sale el error:

    Run-Time Check Failure #2 - Stack around the variable 'C' was corrupted.

    ¿Podrían por favor ayudarme?


    Gabbo

    Friday, September 07, 2012 12:26 PM

Answers

  • No he leido detenidamente todo el código, pero parece que no dominas como van los indices de las matrices en C++

    En una matriz A[2][3], el primer indice va de 0 a 1, y el segundo de 0 a 2. En todos tus calculos parece que utilizas valores de 1 a 2 y de 1 a 3 esto hace que escribas fuera de las matrices corrompiendo la memoria asignada a la siguiente variable, en tu caso la matriz C.

    Analogamente pasa lo mismo con la matriz C[2].

    Por consiguiente cambia todos los bucles, implicitos y explicitos de la forma for (v=1; v<=Tope; v++) por for (v=0; v<Tope; v++)

    Por curiosidad... ¿Por qué haces esto?
    if(abs(A[j][L]) >= abs(A[k][L])){}
    else{j = k;}

    en vez de esto, que es más claro
    if(abs(A[j][L]) < abs(A[k][L]))
     {j = k;}

    • Marked as answer by GGGF Monday, September 10, 2012 11:50 AM
    Sunday, September 09, 2012 5:12 PM

All replies

  • No he leido detenidamente todo el código, pero parece que no dominas como van los indices de las matrices en C++

    En una matriz A[2][3], el primer indice va de 0 a 1, y el segundo de 0 a 2. En todos tus calculos parece que utilizas valores de 1 a 2 y de 1 a 3 esto hace que escribas fuera de las matrices corrompiendo la memoria asignada a la siguiente variable, en tu caso la matriz C.

    Analogamente pasa lo mismo con la matriz C[2].

    Por consiguiente cambia todos los bucles, implicitos y explicitos de la forma for (v=1; v<=Tope; v++) por for (v=0; v<Tope; v++)

    Por curiosidad... ¿Por qué haces esto?
    if(abs(A[j][L]) >= abs(A[k][L])){}
    else{j = k;}

    en vez de esto, que es más claro
    if(abs(A[j][L]) < abs(A[k][L]))
     {j = k;}

    • Marked as answer by GGGF Monday, September 10, 2012 11:50 AM
    Sunday, September 09, 2012 5:12 PM
  • Muchísimas gracias, ha sido de mucha ayuda.

    Si, realmente no tuve en cuenta que las matrices empiezan en cero. Con respecto al if, tienes razón es mejor así, es que no soy muy experto y no sabía que así también se podría escribir.

    Saludos.


    Gabbo

    Monday, September 10, 2012 11:53 AM