inicjalizacja tablicy na zmiennej wskaźnikowej w konstruktor

0

Czy ktoś spotkał się z problemem niepełnej <ort>inicjacji </ort>tablicy jednowymiarowej na wskaźniku np:
double *skladowe; w konstruktorze klasy do której ten wskaźnik należy np:
Twektor::Twektor(int ls){skladowe=new double[ls];for(int i=0;i<ls;i++)skladowe[i]=0;}
Objawia się to tym, że zerowy i ostatni element nie jest przydzielony tak jakby tablica zawierała się
między 1..ls-2. Gdy ort! przeprowadzę w innej funkcji już po powstaniu obiektu wszystko jest ok.

proszę o radę w czym może być problem bo rzutuje to na cały program ,który teraz może być nieprzewidywalny, czy jest to wada kompilatora czy też jakaś opcja włączona być powinna
Używam Buildera

Pozdrawiam Arturo

0

Powiedz jak ten twój Builder reaguje na to:

#include <iostream>
using namespace std;

class Twektor {
public:
	double *skladowe;
	Twektor(int ls);
};

Twektor::Twektor(int ls)
{
	skladowe=new double[ls];
	for(int i=0;i<ls;i++)
		skladowe[i]=i;
}

int main()
{
	Twektor wektor(10);
	for (int i=0;i<=9;i++)
		cout<<wektor.skladowe[i]<<endl;
}

Bo w Visualu 2008 to działa jak powinno.

0

błąd przy "using namespace std;" poza tym efekt ten sam jak poprzednio,gdy ort! przeniosę do jakiej kolwiek innej funkcji tablica pojawia się cała.

0

Log błędu, chyba że mamy wróżyć z fusów. Na pewno kompilujesz to jako C++?
Pokaż kawałek kodu albo cokolwiek, bo to co piszesz to są bajki jakieś, chyba ze programisci Borlanda popili jak robili Buildera ;]

0

Oto powycinane fragmenty, także działają tak jak mówiłem. Procedura Unu wstawiona jest sztucznie
po odblokowaniu jej wszystko działa.

//---------------------------------------------------------------------------
#ifndef snn3_m2H
#define snn3_m2H
#include <math.h>
#include <iostream>
//---------------------------------------------------------------------------
class TWektor
{
private:
public:
int ils;
double *sm;
TWektor(int il);
~TWektor();
void Unu();
};
//---------------------------------------------------------------------------
class TKomorka
{
private:
int ilwej;
double *w; // wektor wagi
double Fa(double &sigma);
public:
double Sigma();
double *x; // adres wektora wejscia;
double s; // suma;
double a; // po funkcji aktywacj Fa;
TKomorka(TWektor wektor);
~TKomorka();
};
//---------------------------------------------------------------------------
#endif

//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop

#include "snn3_m2.h"
//---------------------------------------------------------------------------
TWektor::TWektor(int il)
{ils=il;sm=new double[ils];for(int i=0;i<ils;i++)sm[i]=1;}
TWektor::~TWektor(){delete[]sm;}
void TWektor::Unu(){sm=new double[ils];for(int i=0;i<ils;i++)sm[i]=1;}

TKomorka::TKomorka(TWektor wektor)
{s=0;ilwej=wektor.ils;x=wektor.sm;w=new double[ilwej];for(int i=0;i<ilwej;i++)w[i]=0.5;}
TKomorka::~TKomorka(){delete[]x;delete[]w;}

double TKomorka::Fa(double &sigma){double wsp=1;double pomexp=exp(-wsp*sigma);return a=((1-pomexp)/(1+pomexp));}
double TKomorka::Sigma(){s=0;for(int i=0;i<ilwej;i++)s+=x[i];return s;}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// wektor1.Unu();
Label2->Caption=komorka1.Sigma();
}
//---------------------------------------------------------------------------

0

Przepraszam nie dopisałem definicji:

TWektor wektor1(10);
TKomorka komorka1(wektor1);

0

w oderwaniu od tematu :

{s=0;ilwej=wektor.ils;x=wektor.sm.......

TKomorka::~TKomorka(){delete[]x /*<-----*/;delete[]w;}

TWektor::~TWektor(){delete[]sm;/*<-----*/}

Zwalniasz przydzieloną pamięc 2x , błąd ... masz w d..e innych bo nie chce
Ci się porządnie formatować kodu ...
Dla własnej przyjemności to możesz wszystko napisać w jednej linijce . [diabel]
Jeśli klasy operują na pamięci przydzielanej dynamicznie to powinny mieć zdefiniowany
konstruktor kopiujący i operator przypisania....

0

Przepraszam za bałagan ale tak się porobiło po wycince i szukaniu przyczyny a co do usuwania zmiennej dwa razy w tym przypadku to racja bo całość wycięta jest z kontekstu a "x" nie jest tu tworzony i tak zostało delete[]x

0

Dzięki za podpowiedź rzeczywiście można to załatwić przy pomocy konstruktora kopiującego
a także po ort! odzielną procedurą poza konstruktorem.

Pozdrawiam Arturo

0
Arturo2000 napisał(a)

błąd przy "using namespace std;" poza tym efekt ten sam jak poprzednio

Jeżeli po poprawce iostream i namespace podany przeze mnie program się kaszani, to jest coś bardzo źle z kompilatorem.
Nadal nie podałeś dokładnie jaki błąd otrzymujesz.

0

przy
#include <iostream>
using namespace std;

pojawia się błąd

[C++Error]test5_mod.cpp(11): Namespace name expected.

bierze się to z tąd, że nie we wszystkich plikach nagłówkowych biblioteki mam zdefiniowany zakres std::
gdy wpiszę np tak:

#include <complex>
#include <iostream>
using namespace std;

tego błędu już nie będzie.

Pozdrawiam Arturo

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