Przekształcenie HouseHoldera - aplikacja przestała działąć

0

Witam. Zacząłem sobie pisać przekształcenie HousHoldera i doszedłem do pewnego momentu, gdzie jak kompiluje i uruchamiam to wyskakuje mi komunikat program przestał działać. Wiem że to jest jakiś kłopot ze zmienną "wynikvtv" jak ja za komentuje to program działa ok. Nie mam pojęcia gdzie może być błąd. Jeżeli ktoś ma gotową implementacje w c/c++,to z chęcią bym przyjął.

#include <iostream>
#include <math.h>

using namespace std;

double alfa(double tab[],int n)
{
 double s=0;
for(int i=0;i<n;i++)
     s+=pow(tab[i],2);


    return pow(s,0.5);
}
void macierzv(double a,double tab[],double tab10[],int n,double w[])
{


    for (int i=0;i<n;i++)
     {
         w[i]=tab[i]+a*tab10[i];
     }

}

void macierzvtv(double w[],double wynikvtv,int n)
{
       for (int i=0;i<n;i++)
     {
        wynikvtv=w[i]*w[i];
     }

}


int main()
{
int n;
double a;
double wynikvtv=0;
double w[n];
    cout<<"Podaj n:"<<endl;
    cin>>n;

    double tab[n],tab10[3]={1,0,0};

    for(int i=0;i<n;i++)
    {
        cout<<"Podaj A["<<i<<"]:"<<endl;
        cin>>tab[i];
    }

    cout<<"Podana macierz:"<<endl;
    cout<<endl;

    for(int i=0;n>i;i++)
    {

        cout<<tab[i]<<endl;
        cout<<endl;
    }
    cout<<endl;
    cout<<"Wspolczynnik alfa:"<<endl;
    cout<< alfa(tab,n)<<endl;
    a=alfa(tab,n);

    macierzv(a,tab,tab10,n,w);

     cout<<"Wektor V"<<endl;
    cout<<endl;

    for(int i=0;n>i;i++)
    {

        cout<<w[i]<<endl;
        cout<<endl;
    }





macierzvtv(w,wynikvtv,n);
cout<<"Wynik vtv"<<endl;
cout<<wynikvtv<<endl;

    return 0;
} 
0
  1. Prawdopodobne źródło problemu:
void macierzv(double a,double tab[],double tab10[],int n,double w[])
{
    for (int i=0;i<n;i++)
     {
         w[i]=tab[i]+a*tab10[i];
     }
}

jak n jest większe od 3, to tab10[i] Ci się wywali.

  1. To nie jest kod w standardzie C++ (nie ma tablic o zmiennej wielkości)
double w[n];
  1. używaj ++i

for(int i=0;n>i;i++)

n>i wygląda co najmniej dziwnie

        wynikvtv=w[i]*w[i];

Zdajesz sobie sprawę, że wynikvtv jest tylko kopią? Że wszelkie zmiany znikną po wyjściu z funkcji? Poza tym jaki jest sens przypisać wiele razy do tej samej zmiennej w pętli?

0
  1. miało być += zamiast =

Zrobiłem to ostatnią funkcje double wraz z returnem i działa ale mimo to, to co wczesniej napisałem też powinno działac.

0
PhanthomOfTheOpera napisał(a):

Zrobiłem to ostatnią funkcje double wraz z returnem i działa ale mimo to, to co wczesniej napisałem też powinno działac.

Nie, wersja z return ma prawo działać, ale Twoja wersja nie ma prawa działać, bo operuje na kopii.

1 użytkowników online, w tym zalogowanych: 0, gości: 1