Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

ANSI C - Widoczność tablicy

jowyma 18 Jan 2015 20:00 945 13
  • #1
    jowyma
    Level 23  
    Proszę o poradę jak najprościej zachować widoczność elementów tablicy, której pamięć przydzielam pomiędzy nawiasami klamrowymi. Wiem, że zmienna stworzona w nawiasach klamrowych nie jest widziana poza nimi, ale nie wiem jak w najprostszy sposób tego uniknąć - przed nawiasami klamrowymi nie znam wymiarów tablicy, dopiero tam jest to ustalane. Kolejka struktura? Funkcja poza main z przekazaniem wskaźnika do tablicy? Oczywiście, nie wolno korzystać ze zmiennych globalnych.

    Bardzo proszę o nieudzielanie mi uwag typu "poczytaj" bo ja czytam, a pytam kiedy nie rozumiem albo nie wiem. W tym przypadku wiem, że można to zrobić przez kolejną strukturę, ale się wtedy jeszcze bardziej komplikuje kod. Zastanawiam się czy tego nie można uniknąć. Jak to zrobić najprościej?


    Code: cpp
    Log in, to see the code


    Tutaj jest dołożona dodatkowa struktura, która zawiera tablicę (bez podania jej wymiarów). Ku mojemu rozczarowaniu to także nie rozwiązało problemu.



    Code: cpp
    Log in, to see the code
  • #2
    wondurbm
    Level 16  
    Nie rozumiem z czym masz problem. Gdzie w Twoim kodzie jest problematyczny fragment?
  • #3
    jowyma
    Level 23  
    Definiuję tablicę jako wskaźnik na wskaźniki, bo będzie dwuwymiarowa.
    Potem w zagnieżdżonej pętli przydzielam na poszczególne elementy tablicy pamięć i wpisuję wartości. Wychodzę z pętli.
    Chcę się móc odwołać do elementów tej tablicy w dalszej części main, a one nie są pamiętane.

    Tak przydzielam pamięć na tablicę:

    Code: cpp
    Log in, to see the code
  • #4
    ania13L
    Level 12  
    Nie powiem ze przeanalizowalam caly kod bo jeszcze tego nie zrobilam ale zauwazylam ze masz zmienna i oraz j a uzywasz tylko i (tzn odwolujesz sie do elementow o numerze i a o j nigdy). Po co to j? moze w tym problem?
  • #5
    wondurbm
    Level 16  
    Masz na myśli pierwszą pętlę do..while?
    Tam jest wszystko w porządku.

    Czy chodzi Ci o tę drugą pętlę while, gdzie wypełniasz tablicę wskazywaną przez zmienną tablica?
  • #6
    ania13L
    Level 12  
    Widze juz (jak spojrzalam na framgent z ustawianiem danych) ze uzywasz tam j. Ale za to problem moze byc w tym ze w wewnetrznym while przydzielasz pamiec array->tablica[i]=malloc((liczbaelementow-i-1)*sizeof(info)); pozniej to wypelniasz i w nastepnym obiegu petli znowu przydzielasz nowa pamiec. To chyba poiwnno byc przez while? Albo w ogole cos tu namieszales :)
  • #7
    jowyma
    Level 23  
    Nie wiem dlaczego przy tworzeniu dynamicznej tablicy w main nie mogę się potem odwoływać do jej elementów. Próbuję to rozwiązać tworząc osobną strukturę na tę tablicę, ale dalej nie mogę się odwoływać do elementów tablicy. Nie rozumiem dlaczego, bo takie tworzenie struktury na tablicę działało mi wcześniej.
    A'propos ostatnia pętla która ma odczytywać zawartość tablicy została przeze mnie przed chwilą poprawiona. Ale dalej nie mogę odwoływać się do elementów tablicy.

    Z Waszych odpowiedzi wnioskuję, że tablica jednak powinna być widoczna, zarówno w wersji programu 1 jak i 2 i że jest jakiś błąd, który powoduje, że nie jest widoczna, a nie z zasady, że po zamknięciu pętli tablica jest zapominana. Będę zatem szukać tego błędu (dziękuję, to jest bardzo duża pomoc już).
  • Helpful post
    #8
    szelus
    Level 34  
    Masz tendencję do pisania kodu w sposób uniemożliwiający jego łatwą analizę:
    - nigdy nie grupuj kilku instrukcji w jednej linii kodu - to formalnie dopuszczalne, ale kompletnie nieczytelne
    - korzystaj ze spacji do odseparowania wizualnie operatorów w wyrażeniach (z wyjątkiem ->, [] i * jako operatora wyłuskania)

    Teraz wracając do Twojego problemu:
    1. Zmienne globalne są dostępne zawsze, ale nie zawsze widoczne, bo mogą być zasłonięte przez zmienną lokalną o takiej samej nazwie, lub nie będą widoczne w innym pliku źródłowym bez dodatkowej deklaracji.

    2. Zmienne automatyczne (lokalne bez deklaracji static) są dostępne wewnątrz bloku, w którym zostały zadeklarowane. Też mogą być przesłonięte przez zmienne zadeklarowne wewnątrz głębiej położonych bloków kodu. Nie da się ich udostępnić na zewnątrz bloku, bo po wyjściu programu z tego bloku przestają istnieć.

    3. Zmienne dynamiczne, zaalokowane przez malloc(), istnieją do momentu zwolnienia ich przez free(). Warunkiem dostępności jest dostępność do wskaźnika na taką zmienną (wartości zwróconej przez malloc()).
  • #9
    jowyma
    Level 23  
    Chodziło mi chyba właśnie o to, co Szelus napisał. DZIĘKUJĘ!!!.
    Błąd był w miejscu gdzie była przydzielana pamięć na poszczególne wiersze tablicy. Wszystko już pięknie działa!!!

    wersja A:

    Code: cpp
    Log in, to see the code


    I wersja B (z dodatkową strukturą na tablicę).

    Code: cpp
    Log in, to see the code
  • Helpful post
    #10
    ania13L
    Level 12  
    Chyba znalazlam w czym problem - a przynajmniej u mnie zaczelo dzialac.

    Pracowalam na pierwszej wersji kodu wiec wkleje to na czym pracowalam. Sprawdz u siebie czy jest ok.

    Code: c
    Log in, to see the code


    - Przenioslam przydzielanie pamieci dla tablica[i] przed wewnetrzego malloca
    - Zmienialam w petli wypisujacej zakres dla j - chyba to stanowilo problem. Bo przydzielales pamiec dla (liczbaelementow-i-1) i tyle masz tej pamieci a nie dla i - 1 (a te dwie wartosci nie sa rowne)
  • Helpful post
    #11
    szelus
    Level 34  
    Głównym problemem było jednak alokowanie pamięci w wewnętrznej pętli, ponieważ alokowany jest cały wiersz. Następny obieg zamazywał poprzednią alokację i wyniki poprzednich porównań.
  • #12
    jowyma
    Level 23  
    Ania, jesteś wielka!
    Pamięć jest przydzielana poprawnie chyba bo to tablica trójkątna, ale problem był właśnie z miejscem gdzie jest malloc, miał być w zewnętrznej pętli, a nie w wewnętrznej.
  • #13
    ania13L
    Level 12  
    Ale samo przeniesienie malloca nie rozwiazalo problemu :) Pisalam o tym juz sporo postow wyzej (nikt nie zauwazyl? :( ) ale i tak wypisywal nadal krzaki z pamieci. Dopiero obie poprawki dzialaja (nie probowalam nawet wprowadzic tylko drugiej).
  • #14
    jowyma
    Level 23  
    Przepięknie dziękuję, temat zamykam.