Wpis z mikrobloga

#programowanie #jezykc

tworzę tablicę, potem ją uzupełniam w pętli while. ustawiam wartość dla indeks=0, robię print tablica[indeks] i wszystko ładnie, potem inkrementuję indeks, dodaję nową wartość do tablica[indeks], robię print tablica[0] i wartość jest już zmieniona.
rozuimem, że to są jakies problemy z alokacją pamięci, że jakoś źle przechowuję adresy ale przestawiałem tworzenie tablicy, wstawiałem gwiazdki, usuwałem i albo wywala program albo dzieje się to co opisałem.
może mi ktoś pomóc?
w skrócie jest plik z liniami które wyglądają tak MAN|Homo sapiens i on sobie to dzieli i przypisuje do dwóch tablic
https://pastebin.com/wcMpU0mL
  • 14
@daczka92: ale gdzie ty to przechowujesz? Zrobiles tablice 20 pointerow i zapisujesz do niej adresy z jednego bufora ktory czytasz z wejscia. Nie alokujesz nowych obszarow tylko zapamietujesz pointery do losowych miejsc w jednym buforze. Dlatego masz sieczke.
@daczka92: niestety obsluga wskaznikow jest inna, nie przypisujesz do tablica[indeks] innej wartosci, przypisujesz adres pamieci, ktory jest zalezny od tego co zostalo wczytane.... Ale to caly czas ta sama tablica!
@daczka92: bo musialbys miec tak na prawde tablice 2 wymiarowa tam i kopiowac dane....Inaczej masz jedno wiadro do ktorego wlewasz jakies plyny i wylewasz, a chcialbys miec dostep do plynow ktore wlales jakis czas temu.. A przeciez tegonie zachowales...
@daczka92 może ogarnij jakiś tutorial że wskaźników, a później z tablic. Jak zrozumiesz wskaźniki to zerknij jeszcze raz na kod i będziesz wiedział co zrobiłeś źle.
Drugim sposobem jest losowe wstawianie znaków & oraz * przed nazwa tablicy, ale wtedy musiałbyś jeszcze wstawić gdzieś polecenie malloc.

Dlatego ja polecam pierwsze rozwiązanie.
@Kaczus2B: jakoś nie mogę sobie tego wyobrazić, tzn rozumiem co piszesz ale nie wiem jak to przełożyć na działanie kodu. chce tylko wziąć rozdzielony string i dodać go do tablicy.
@BoKoR: czytam i rozumiem błąd ale nie rozumiem rozwiązania.
@daczka92
A czy musisz zrobić to w c?
Bo jak nie, to polecam Pythona ;)

Stworzyłeś tablice 20 wskaźników o nazwie allquestions.

Przeleć sobie pentelką po tej tablicy i dla każdego elementu daj all
questions[i] = malloc(200);

Później przy zapisie danych odczytanumych z pliku użyj funkcji stncpy (poczytaj w dokumentacji co ona robi).

Jak znajdziesz podpowoedż innego Mirka to może skorzystaj z niego, bo ja w c to mało programuje.
@daczka92: strtok zwraca wskaźniki wskazujące na przekazany bufor. strtok(line, ...) niemal zawsze zwróci line. Tak więc po pętli masz w tablicy all_answers wyłącznie identyczne wskaźniki do początku line, a w all_questions masz wskaźniki w środek line.
Najprostsze rozwiązanie to skopiować te łańcuchy:

all_questions[index] = strdup(question);
all_answers[index] = strdup(answer);
@daczka92: wskaznik jest tylko adresem pamieci, nie przechowuje tekstu, tylko adres. W 2/4/8 bajtach (zalezne od tego gdzie kompilujesz) nie zapamietasz tekstu przeciez. Dodatkowo w C tekstu nie kopiuje sie przez operator = ale funkcja strcpy.
@daczka92: zrob tak że jak masz question[index] = malloc(100); pozniej to co obecnie przypisujesz kopiuj do tego co zallokowales. czyli mniej wiecej bedzie tak: pisze z dyni
question[index] = malloc(100);
strncpy(question[index], buffer, 100);
@daczka92 wskaźniki answeri question też do poprawy.
To jest tylko wskaźnik na o jakieś miejsce w pamięci. Masz to niezainicjalizowane, więc wskazuje niewiadomo_gdzie.
@BoKoR: na tym polega cały myk ze ja w pythonie normalnie programuje, jestem samoukiem i jak każdy samouk popełniłem ten błąd, że nie uczyłem się "dlaczego tak się dzieje". a przez to, że dopiero to C zaczynam i mam nadzieję, że niedługo będę mógł sobie odpuścić to malloc w ogóle brzmi abstrakcyjnie i się tego boję :P.
@vytah: o to działa tak jak powinno. dzięki!
@pokazbobra: to nawet czaję