Tablica ze zmienną w strukturze

Tablica ze zmienną w strukturze
BA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
0

Czy można się w strukturze stworzyć tablicę z ilością elementów, która będzie określona parametrem tej struktury?

Kopiuj
struct sygnal
{
	int rozdz;
	int rozmiarsygnalu;
	float sygnal[rozdz];
};
twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
2

A jaki byłby rozmiar tej tablicy? Inaczej mówiąc, jaka jest wartość rozdz?

BA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
0

Tę wartość chciałbym aby wpisywało się przez konsolę

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
6

Nie podałeś języka, więc odpowiedzi nie da się jednoznacznie udzielić.

W C jest coś takiego jak flexible array member:

Kopiuj
struct foo
{
    int rozdz;
    int rozmiarsygnalu;
    float sygnal[];
};

W C++ się nie da. Ale za to masz std::vector.

carlosmay
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Pabianice
0

Można jeszcze obejść problem tak:

Kopiuj
template<std::size_t N>
struct foo {
	int signal_size;
	float signal[N];
};
MO
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tam gdzie jest (centy)metro...
1

No to jeszcze do kompletu masz taką konstrukcję ale czy będzie adekwatna to pytanie o szerszym kontekście:

Kopiuj
#include <memory>

struct sygnal
{
    int rozdz;
    int rozmiarsygnalu;
    std::unique_ptr<float[]> sygnal;
};

int main() {
    struct sygnal s;
    s.sygnal = std::make_unique<float[]>(10);
}
WY
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 134
0

Możesz stworzyć sobie funkcję, która będzie alokować potrzebną pamięć:

Kopiuj
#include <malloc.h> // lub <stdlib.h>
struct sygnal
{
    int rozdz;
    int rozmiarsygnalu;
    float *sygnal;
};

void Set(struct sygnal& s, int x) {
       s.rozmiarsygnalu = x;
       s.sygnal = (float*) malloc (x*sizeof(float)); 
       // itd...
}

void Delete(struct sygnal& s) {
       free(s.sygnal);
}

int main ()
{
  sygnal s;
  int rozmiarsygnalu;

  printf("Podaj rozmiar sygnalu: ");
  scanf("%d", &rozmiarsygnalu;

  Set(s, rozmiarsygnalu);
  
  // ...

  Delete(s);
  return 0;
}

Jeśli piszesz w C++ to możesz skorzystać z new i delete, chociaż lepiej skorzystać zstd::vector tak jak wspomniał @kq dzięki temu nie będziesz się musiał przejmować np. zwalnianiem pamięci.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.