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] Tablica dwuwymiarowa "stringów"

ShEvU_elektro 30 May 2010 23:35 11140 10
  • #1
    ShEvU_elektro
    Level 25  
    Mam problem. Muszę zrobić tablicę dwuwymiarową stringów, nie char-ów.
    Jako że w ANSI C nie ma string, robi się coś takiego:
    Code:
    char *litery=malloc(sizeof(char))


    Moje pytanie brzmi, jak zrobić tablicę dwuwymiarową ale właśnie tych stringów?
    Tablicę dwuwymiarową tworzy się tak:
    Code:
    char tablica [30][7]; 


    Do pojedynczej komórki chcę zapisać np. "ala". Niestety wpisuje tylko "a"
  • Helpful post
    #2
    przemek.tomala
    Level 22  
    Można na przykład zrobić tablicę trójwymiarową gdzie jeden wymiar poświęcony jest na string. Na początku deklarując tablicę zakładasz maksymalny rozmiar stringa.
  • #3
    ShEvU_elektro
    Level 25  
    Czy mógłby kolega podać przykład?
    Próbowałem trzeci wymiar jakieś 1000 prób temu. Może ja coś źle zrobiłem?
  • Helpful post
    #4
    przemek.tomala
    Level 22  
    Code:
    char tab[12][12][12];
    

    strcpy(tab[3][10], "ala ma kota");
  • Helpful post
    #5
    Ballbreaker
    Level 12  
    Z przykazań C:


    1. Nazwa tablicy jest adresem do jej pierwszego elementu
    2. Tablica znaków, to tablica znaków, a string to wskaźnik do pierwszego znaku w ciągu znaków zakończonego znakiem '\0'

    dlatego proponuję tablicę wskaników do znaku, gdzie każdy z tych wskaźników inicjalizujemy wartością NULL, a string przypisujemy dynamicznie z kopca

    Code:

    char *tablica[34][22]

    int main()
    {
      tablica[22][21] = strdup("sting do duplikacji");
    }


    Done!
  • #6
    ShEvU_elektro
    Level 25  
    Dziękuje panowie. Powiadomię o efektach jak skończę kod :)
  • #7
    ShEvU_elektro
    Level 25  
    Wszystko hula :) Dziękuję za pomoc :)
  • #8
    Ballbreaker
    Level 12  
    Nie zapomnij zwolnić pamięci przed usuwaniem tablicy bo będziesz miał wyciek.

    dla każdego elementu:

    Code:
    for (i=0; i<XMAX; i++)
    
     for (j=0; j<YMAX; j++)
       free(tablica[i][j]);



    Bo będziesz miał wyciek pamięci i stringi zostaną tam na wieczność. Dopóki system nie posprząta po Twoim procesie.
  • #9
    ShEvU_elektro
    Level 25  
    Mam taki problem że nie mogę przekazać tablicy do funkcji. W mojej funkcji nie mogę operować na tablicy? Gdzie robię błąd? Kompiluje sie ale wywala konsole

    Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    void wczytaj_plik(char*** tab){
         

                                                 printf("%s",tab[1][1]);
                                                 getch();                           
                                       }
                                                                 

    int main(int argc, char *argv[])
    {



    char *tablica [30][16];
    tablica[1][1] = strdup("string do duplikacji");
    printf("%s",tablica[1][1]); //TUTAJ DZIALA



    wczytaj_plik(tablica);


      printf("\n");
      printf("\n");
      printf("\n");
      system("PAUSE");   
      return 0;
    }




  • Helpful post
    #10
    Eagle
    Level 24  
    Quote:

    Mam taki problem że nie mogę przekazać tablicy do funkcji. W mojej funkcji nie mogę operować na tablicy? Gdzie robię błąd? Kompiluje sie ale wywala konsole


    Mi nie udało się skompilować w takiej formie jak podałeś. A po niewielkich poprawkach ruszyło, poczytaj proszę o tablicach i wskaźnikach.

    Code:

    void wczytaj_plik(char* tab[][16])
    {
       printf("%s",tab[0][0]);
       getch();                           
    }
                                                                 

    int main(int argc, char *argv[])
    {
       char* tablica [30][16];
       tablica [0][0] =   strdup("sting do duplikacji");
       printf("%s",tablica[0][0]); //TUTAJ DZIALA

       wczytaj_plik(tablica);

       free(tablica[0][0]);

       printf("\n");
       printf("\n");
       printf("\n");
       system("PAUSE");   
       return 0;
    }
  • #11
    Ballbreaker
    Level 12  
    Robisz błąd w definicji wskaźnika. Deklarujesz:

    Code:
    char* tablica [30][16];


    Zamawiasz sobie obszar w pamięci, o wielkości 30*16 * (rozmiar wskaźnika do znaku) w którym przechowujesz wskaźniki do znaków. Gdybyś alokował go dynamicznie byłoby:

    char * tablica = (char *)malloc( 30*16 * sizeof(char *) );

    więc całkiem błędnie uważasz, że masz wskaźnik, do wskaźnika, do wskaźnika do znaku.

    To nadal są wskaźniki do znaku, na które przeznaczasz ciągły blok pamięci o wielkości 30*16 wskaźników do znaku.

    Dużo wygodniej będzie Ci operować funkcją:
    Code:
    void wczytaj_plik(char* tab, int xmax, int ymax)
    
    {
     // wczytaj plik do tab
    }


    Powodzenia i poczytaj o wskaźnikach.

    Dodano po 5 [minuty]:

    Postaraj się usunąć ze swojego programu 'magiczne cyferki', jak tab[30][16] bo za miesiac nie bedziesz rozumiał co oznaczało 16 i dlaczego jest właśnie tyle. Wczystym C definiujesz sobie makro na górze:

    Code:

    #define MAIN_STORAGE_TABLE_X_MAX 16
    #define MAIN_STORAGE_TABLE_Y_MAX 30



    im dokładniejszy i bardziej niepowtarzalny opis tym lepiej. Za magiczne cyfry wyrzucą Cię z każdej firmy ;-)