C++ dynamiczny rozmiar tablic

0

Mam pytanie odnośnie podstaw (zapewne). Mam program, który operuje na macierzach (NxN). Do testowania używałem

 #define N jakaśLiczba

ale program ma być obsługiwany z klawiatury, stąd moje pytanie: w jaki sposób ustawić N dopiero po wpisaniu z klawiatury w funkcjach przed main()?
Z góry dzięki za pomoc.

0

Nie da sie.

0

#define (podobnie, jak #include i parę innych) to dyrektywa preprocesora, która wykonywana jest w trakcie kompilacji (ściślej chwilę przed) i nie da się ich zmienić już w trakcie działania programu.

2

Oczywiście że się da - o ile zrezygnujesz z polskich liter.

#include <iostream>
using namespace std;

int jakasLiczba;

#define N jakasLiczba

int main() {
	while (cin >> N) {
		cout << "N wynosi: " << N << endl;
	}
	return 0;
}

https://ideone.com/bYLD3g

;-)

0

Jak zrobię coś takiego to:
Error: array bound is not an integer constant before ']' token
jakiś fragment kodu;

void wypisz_macierz(double A[N][N])
{
    for(i=0;i<N;++i)
    {
        for(j=0;j<N;++j)
        {
            cout<<setw(10)<<A[i][j]<<"\t";
        }
        cout<<"\n";
    }
}

1

Trzy tematy do ogarnięcia:

  • tablice dynamiczne w C++
  • dwuwymiarowe tablice dynamiczne w C++
  • std::vector

Wersja Pro:

0

Przykład konstruktora:

int row;
int col;

int** mat;

matrix(int m, int n) : row(m), col(n), mat(nullptr)
{
	mat = new int*[row];

	for (int i = 0; i < row; ++i)
		mat[i] = new int[col];
}
0

Poczytaj odpowiedź z zielonym ptaszkiem o różnicy pomiędzy statyczno-dynamiczną allokacją a w pełni dynamiczną tablicą dwuwymiarową:

https://stackoverflow.com/questions/16001803/pointer-to-pointer-dynamic-two-dimensional-array

0

ok poczytam, a zamieniłby ktoś tą moją funkcję aby działała, później analogicznie bym mógł dla całego programu

0

Stary wkleiłem Ci rozwiązanie domyśl się :D

0

podpowiedź, row i col weź z cin.

To co wkleiłem jest fragmentem struktury, możesz też zrobić to bez konstruktora.

0

Za nic nie mogę się domyśleć. Mógłbyś poprawić moją funkcję to może zaczaję o co chodzi.
W sensie jak przerobić to N, żebym je podawał w main() a funkcje przed main() działały

0

#include <stdio.h>
#include <iostream>
#include <memory>
#include <cassert>

using namespace std;

class matrix
{
public:
int row;
int col;

int** mat;

matrix(int m, int n) : row(m), col(n), mat(nullptr)
{
	mat = new int*[row];

	for (int i = 0; i < row; ++i)
		mat[i] = new int[col];

	FillMat();
}

int& operator()(const int m, const int n)
{
	assert(m >= 0 && m < row);
	assert(n >= 0 && n < col);

	return mat[m][n];
}

int getRow()
{
	return row;
}

int getCol()
{
	return col;
}

void showMat()
{
	for (int i = 0; i < row; ++i)
	{
		for (int j = 0; j < col; ++j)
		{
			cout << mat[i][j] << "\t";
		}

		cout << endl;
	}
}

void FillMat()
{
	int count = 1;

	for (int i = 0; i < row; ++i)
	{
		for (int j = 0; j < col; ++j)
		{
			mat[i][j] = count++;
		}
	}
}


~matrix()
{
	if (mat)
	{
		for (int i = 0; i < row; ++i)
			delete[] mat[i];

		delete mat;

	}
}

};

void rotateCounterClockwise(matrix& source)
{
int m = source.getRow();
int n = source.getCol();

matrix result(n, m);

for(int i = 0; i < m; ++i)
{
	for (int j = 0; j < n; ++j)
	{
		result((n - j - 1), i) = source(i, j);
	}
}

result.showMat();

}

int main()
{
matrix mat(5, 6);

mat.showMat();

cout << endl << endl << endl;

rotateCounterClockwise(mat);

}

0

To jest klasa, możesz przerobić metody na funkcje i dodać wczytywanie do maina.

Parsowanie argumentów z konsoli(argumenty funkcji main):

https://msdn.microsoft.com/en-us/library/17w5ykft.aspx

0

Możesz zrobić tak albo z cin czyli bez argumentów.

Prosisz żebyśmy rozwiązali zadanie za Ciebie a za takie coś już się płaci, zapraszam do działu z ogłoszeniami.

0

Pod żadnym pozorem nie baw się w ręczne new/delete. ( https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/ )

Jeśli wymiary wierszy mają być różne: vector<vector<T>>. Jeśli takie same - vector<array<T, N>> jeśli N jest znane w czasie kompilacji, w przeciwnym wypadku użyj 1-wymiarowego wektora i widoku 2d: https://dsp.krzaq.cc/post/98/prosty-widok-na-macierz-2d-w-cpp/

0

Ok dzięki za pomoc z grubsza ogarnąłem o co chodzi ale wcześniej na N ustalonym przy kompilacji funkcja swap działała bez problemu, a teraz wygląda tak:

void permutuj(double **A)
{
    for(i=1;i<N;i++)
        if(A[i][i] != 0)
        continue;
        else if(A[i-1][i-1] == 0 && A[i][i] != 0)
        {
            for(j=0;j<N;j++)
            swap(A[i-1][j], A[i][j]);
        }
        else if(A[i-1][i-1] == 0 && A[i][i] == 0 && A[i+1][i+1] == 0)
        {
            for(j=0;j<N;j++)
            swap(A[i-1][j], A[i][j]);
        }
        else if(A[i-1][i-1] != 0 && A[i][i] == 0 && A[i+1][i+1] != 0)
        {
            for(j=0;j<N;j++)
            swap(A[i][j], A[i][j]);
        }
}

i nie robi nic. Gdzie mam błąd?

0
Mattii4211 napisał(a):

Nie umiesz debugować?

I gdzie zmienna N się znajduje?

0

N mam podaną w main jako cin>>N;

Mój błąd wszytko działa :)

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