Dwuwymiarowa dynamiczna tablica Editów

0

Witam. Mam problem z dwuwymiarową tablicą dynamiczną Editów. Tablica na formie tworzy się poprawnie. Kod:

        TEdit **TabEdit;

        int t = 150;
        int l = 80;
        int n = StrToInt(Edit1->Text);
        int m = StrToInt(Edit2->Text);
        TabEdit = new TEdit *[n];
        for(int i = 0; i < n; i++)
        {
                 for(int j = 0; j < m; j++)
                {
                        TabEdit[i] = new TEdit(this);
                        TabEdit[i]->Name = "T" + IntToStr(i) + IntToStr(j);
                        TabEdit[i]->Top = t;
                        TabEdit[i]->Left = l + j * 40;
                        TabEdit[i]->Width = 40;
                        TabEdit[i]->Text = "0";
                        TabEdit[i]->Parent = this;
                }
                t += 30;
                l = 80;
        }

Chcę w kolejnej funkcji wylosować wartości i umieścić w wygenerowanych Editach i tu wyskakuje mi błąd:

        int n = StrToInt(Edit1->Text);
        int m = StrToInt(Edit2->Text);
        for (int i = 0; i < n; i++)
                for (int j = 0; j < m; j++)
                TabEdit[i][j]->Text = IntToStr(rand()%100);

Pozdrawiam

0

czym jest TabEdit w tej nowej funkcji

jak wywolujesz ta nowa funkcje

jaki blad?

0

Tworzy mi się 2-wymiarowa tablica Editów na formie. Chcę by dane w niej zawarte tworzyły dwuwymiarową tablicę Text'ów z poszczególnych Editów (aby dostęp był przez 2 indeksy i oraz j). Wcześniej miałem 1-wymiarową i wszystko działało ale dostęp był przez jeden index i (choć na formie była wyświetlana w postaci 2-wymiarowej).

0
edan_ napisał(a):

Witam. Mam problem z dwuwymiarową tablicą dynamiczną Editów. Tablica na formie tworzy się poprawnie. Kod:

        TEdit **TabEdit;

       [...]

Masz jednowymiarową tablicę wskaźników

Chcę w kolejnej funkcji wylosować wartości i umieścić w wygenerowanych Editach i tu wyskakuje mi błąd:

        int n = StrToInt(Edit1->Text);
        int m = StrToInt(Edit2->Text);
        for (int i = 0; i < n; i++)
                for (int j = 0; j < m; j++)
                TabEdit[i][j]->Text = IntToStr(rand()%100);

Nic dziwnego - masz źle napisany kod.

0

Wyciek pamięci (i możliwe źródło błędu, którego nie podałeś):

for(int i = 0; i < n; i++)
{
    for(int j = 0; j < m; j++)
    {
        TabEdit[i] = new TEdit(this);

m razy wywołujesz TabEdit[i] = new TEdit(this);.
Co to jest m? Po co ta wewnętrzna pętla?

0

Czyli, jak rozumiem, mam wygenerować 2-wymiarową tablicę wskaźników? Jak to zrobić?

0

pokaz CALY kod

0
edan_ napisał(a):

Czyli, jak rozumiem, mam wygenerować 2-wymiarową tablicę wskaźników? Jak to zrobić?

Trochę wróżąc to pewnie coś w ten deseń:

for(int i = 0; i < n; i++)
{
    TabEdit[i] = new TEdit[m];
    for(int j = 0; j < m; j++)
    {
        //TabEdit[i] = new TEdit(this);     <-- wyciąć
        TabEdit[i][j]->Name = "T" + IntToStr(i) + IntToStr(j);
        TabEdit[i][j]->Top = t;
        ...
0
edan_ napisał(a):

Czyli, jak rozumiem, mam wygenerować 2-wymiarową tablicę wskaźników? Jak to zrobić?

Tak

Zrobić to można na kilka sposobów.
może to być:

TEdit ***TabEdit;

może być:

vector<vector<TEdit *> > TabEdit;

kwestia jak będziemy dalej chcieli postępować, jeśli tak jak w Twoim wypadku, to pierwszy sposób z dodatkowymi poprawkami

        TabEdit = new TEdit **[n];
        for(int i = 0; i < n; i++)
        {
                 
                TabEdit[i] = new TEdit *[m];
                for(int j = 0; j < m; j++)
                {
                        TabEdit[i][j] = new TEdit(this);
                        TabEdit[i][j]->Name = "T" + IntToStr(i) + IntToStr(j);
                        [..]
                }
                [..]
        }

Oczywiście potem ładnie zwolnic pamięć należy.

1
kaczus napisał(a):
edan_ napisał(a):

Czyli, jak rozumiem, mam wygenerować 2-wymiarową tablicę wskaźników? Jak to zrobić?

Tak

Zrobić to można na kilka sposobów.
może to być:

TEdit ***TabEdit;

Nie. Potrzebna jest dwuwymiarowa tablica elementów, nie wskaźników.

0

Dziękuję wam za pomoc. Kaczus, twój kod działa dokładnie tak, jak chciałem. Dzięki.

0

Możesz też tak zrobić na przykład:

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <iterator>
#include <sstream>

template<typename T, size_t Sz>
struct Array2D
{
public:
	Array2D(): _data(Sz * Sz) { ; }
	
	template<typename FillFunction>
	void Fill(FillFunction fillF)
	{
		for(size_t i = 0; i < Sz; ++i)
			for(size_t j = 0; j < Sz; ++j)
				fillF(Get(i, j), i, j);
	}
	
	T& Get(size_t i, size_t j)
	{
		return _data[i * Sz + j];
	}
	
	typename std::vector<T>::iterator begin() { return _data.begin(); }
	typename std::vector<T>::const_iterator begin() const { return _data.begin(); }
	typename std::vector<T>::iterator end() { return _data.end(); }
	typename std::vector<T>::const_iterator end() const { return _data.end(); }

private:
	std::vector<T> _data;
};

struct TEdit
{
	std::string Name;
	
	friend std::ostream& operator<<(std::ostream& out, const TEdit& tedit)
	{
		return out << tedit.Name;
	}
};

int main() {
	Array2D<TEdit, 3> tedits;
	tedits.Fill([](TEdit& edit, size_t i, size_t j) {
		std::stringstream ss;
		ss << "i: " << i << ", j: " << j;
		edit.Name = ss.str();
	});
	std::copy(tedits.begin(), tedits.end(), std::ostream_iterator<TEdit>(std::cout, "\n"));
	return 0;
}
0

Wcześniej miałem 1-wymiarową i wszystko działało ale dostęp był przez jeden index i (choć na formie była wyświetlana w postaci 2-wymiarowej).

Proponuję pozostawić tą jednowymiarową tak jak jest i dodać drugą tablicę o n elementach:

TEdit*** TabEdit2D = new TEdit**[n];

Teraz przypisujesz do niej co m-ty element tablicy jednowymiarowej:

for(int i = 0; i < n; ++i)
    TabEdit2D[i] = &TabEdit[i*m];

I masz tablicę dwuwymiarową.

Mały test (podaje w polu edycyjnym indeksy tego pola w tablicy dwuwymiarowej):

for(int i = 0; i < n; ++i)
     for(int j = 0; j < m; ++j)
      TabEdit2D[i][j]->Text = IntToStr(i) + IntToStr(j);

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