logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ANSI C - Używanie malloc do stworzenia ściśle określonej tablicy 2 wymiarowej

jowyma 01 Sty 2015 00:23 1161 1
REKLAMA
  • #1 14277253
    jowyma
    Poziom 23  
    Posty: 1496
    Pomógł: 62
    Ocena: 168
    Proszę o pomoc bo zaczyna mi znowu para lecieć uszami. Nie wolno mi używać VLA. Mam stworzyć macierz trójkątną za pomocą malloc w której każdy element styka się z każdym, najprościej to wyjaśnić dla korelacji.

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Tworzę strukturę z macierzą wskaźników:

    struct struktura{
    float ** tablica;
    int liczba
    }struktura;

    I teraz poza main, w funkcji chcę alokować pamięć do takiej tablicy. A właściwie do tablic. W zilustrowanym przykładzie będzie ich pięć, ale liczbę określa użytkownik.

    Oto moje problemy z tym związane:
    1. jak alokować pamięć do takiej tablicy, jak na razie robię to tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Szczerze mówiąc, nie wiem czy to robię dobrze.
    2. mój największy problem jest taki - alokuję pamięć ale chcę mieć bardzo specyficzne odwołania do elementów tworzonych tablic:
    tablica[1] ma mieć nast element i w tej kolejności mają być: tablica[1][5], tablica[1][4], tablica[1][3], tablica[1][2] i tablica[1][0]
    tablica[2] ma mieć następujące elementy: tablica[2][5], tablica[2][4], tablica[2][3], tablica[2][0]
    tablica[3] ma mieć: tablica[3][5], tablica[3][4], tablica[3][0]
    tablica[4] ma mieć tablica[4][5] i tablica[4][0]
    tablica[5] ma mieć tablica[5][0]

    Adresy tych elementów odpowiadają elementom, których korelacje mają być zawarte w danym miejscu w tablicy. Element z drugim indeksem 0 zawiera odchylenie standardowe danego elementu.

    Może to jest niejasne co piszę.
    Więc jeszcze raz, może prościej.
    - Jak przydzielać pamięć funkcją malloc jak chcę mieć w strukturze tablicę wskaźników do tablic gdzie każda ma długość o jeden mniejszą od poprzedniej.
    - Jak przebiega domyślne numerowanie tablic stworzonych funkcją malloc. Czy zawsze ta numeracja idzie o zera?
  • REKLAMA
  • Pomocny post
    #2 14278114
    Krzysztof Gustaw
    Poziom 23  
    Posty: 392
    Pomógł: 76
    Ocena: 32
    Witam!

    Myślę, że warto tutaj skorzystać z wskaźników do tablic i utworzyć tablicę tychże wskaźników np:

    TYP *(*t)[]

    i odwoływać się do tak zdefiniowanej poprzez:
    (*t)[wiersz][kolumna]

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Oczywiście nie uwzględniłem testów na to, czy przydzielenie pamięci się udało (aby nie zaciemniać programu), niemniej jednak należy to czynić.
    Odpowiadając na pytanie, w języku C i C++ domyślne numerowanie WSZYSTKICH tablic zaczyna się od zera, to znaczy zarówno tych zdefiniowanych jak i przydzielonych funkcjami z rodziny malloc jak też operatorem new.
    Co do tego "udziwnionego" sposobu indeksowania kolumn, proponuję stworzyć dodatkową tablicę indeksów i indeksować pośrednio poprzez nią.
    P.S.
    1) Myślę, że lepiej użyć funkcji calloc która, w przeciwieństwie do malloc, wypełnia zerami przydzieloną pamięć.
    2) Nie zapomnij funkcją free zwolnić zaalokowaną pamięć kiedy już nie będzie potrzebna.

    Uwaga! poprawiono kod funkcji przydzielającej pamięć usuwając zbędny, nieużywany pierwszy parametr w wywołaniu funkcji jak też gwiazdkę po (TYP) w malloc w pętli for. No cóż, jak sie człowiek śpieszy, to się diabeł cieszy :)
REKLAMA