Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

ZiomeX

[C] Dynamiczna struktura

Rekomendowane odpowiedzi

typedef struct sNazwa {
  int x;
} struktura;

void wstaw(struct sNazwa *ptr, int n) {
   if(ptr == NULL) {
        ptr = (struct sNazwa*)malloc(sizeof(struct sNazwa));
   }
   ptr->x = n;
}

int main() {
  int n = 5;
  struktura *pointer = NULL;
  wstaw(pointer, n);
}

 

Bardzo uproszczony kod. W skrócie w funkcji wstaw przypisuje temu wskaźnikowi jakąś pamięć tak jak ma działać, ale po powrocie z funkcji zachowuje się tak jakby to był całkiem inny wskaźnik i ten z maina ma dalej NULLa. Już męczyłem się z tym na tyle sposobów, tu gwiazdka, tam gwiazdka, tu referencja (choć ponoć nie ma, & ma jakieś zadanie w tej kwestii tu, bo po wywołaniu wstaw(&pointer, n) w funkcji widać jakby pointer nie był już nawet NULLem mimo, że wcześniej nie był nigdzie zmieniany przecież...) itd. itd. Oczywiście potrzebuję to dynamicznie mieć. :|

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

funckja wstaw powinna przyjmować referencje na wskaźnik (lub od biedy wskaźnik na wskaźnik). Jak dajesz do funkcji wskaźnik to możesz zmieniać obiekt na który wskazuje. Ale jeżeli chesz zmienić adres wskaźnika (a chcsz bo na początku wskaźnik nie wskazuje na nic a po zakończeniu ma wskazywać na obszar pamięci przydzielone przez malloc) to musisz wejść "poziom wyżej".

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

funckja wstaw powinna przyjmować referencje na wskaźnik (lub od biedy wskaźnik na wskaźnik). Jak dajesz do funkcji wskaźnik to możesz zmieniać obiekt na który wskazuje. Ale jeżeli chesz zmienić adres wskaźnika (a chcsz bo na początku wskaźnik nie wskazuje na nic a po zakończeniu ma wskazywać na obszar pamięci przydzielone przez malloc) to musisz wejść "poziom wyżej".

 

typedef struct sNazwa {
  int x;
} struktura;

void wstaw(struct sNazwa **ptr, int n) {
   if(ptr == NULL) {
        ptr = (struct sNazwa*)malloc(sizeof(struct sNazwa));
   }
   ptr->x = n;
}

int main() {
  int n = 5;
  struktura *pointer = NULL;
  wstaw(pointer, n);
}

Jeśli dam do funkcji wstaw referencję to się nie kompiluje, bo nie może przyjmować typu *&nazwa lub &*nazwa. To co wyżej jest też nie działa... Możesz na szybko skrobnąć jakąś wersję tego? Dobijają mnie te wskaźniki...

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

typedef struct structMENU {
...
} MENU;


void 
initMenu(MENU** pmenu)
{
if (! ((*pmenu) = (MENU*) malloc (sizeof(MENU))))
{
  printf("An error has occured, program terminating.\n");
  exit(1);
}
}


int main(int argc, char *argv[])
{
MENU* pMenu =NULL;
initMenu(&pMenu);

return 0;
}

Panie kochany, musi działać.

 

 

EDIT: (coś mnie naszło, że się przemogłem i poświęciłem te 20 sekund)

A KYSZ! :D

 

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



typedef struct sNazwa {
  int x;
} struktura;

void wstaw(struktura **ptr, int n) {
   if(*ptr == NULL) {
        *ptr = (struct sNazwa*)malloc(sizeof(struct sNazwa));
   }
   (*ptr)->x = n;
}

void print(struktura *ptr) {
   printf("\nX is =%i",ptr->x);
}


int main(int argc, char *argv[]) {
  int n = 5;
  struktura *pointer = NULL;
  wstaw(&pointer, n);
  print(pointer);

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

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeśli dam do funkcji wstaw referencję to się nie kompiluje, bo nie może przyjmować typu *&nazwa lub &*nazwa.

Bo w C++ nie ma typu *&nazwa. Prawidłowa nazwa typu referencji na wskaźnik do struktury to struktura*&

 

To co wyżej jest też nie działa...

Bo w wersji z dwoma wskaźnikamimusisz też zmienić wywołanie i wprost przekazywać wskaźnik na wskaźnik, z resztą już ci Hellhound47 napisał przykład.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Bo w C++ nie ma typu *&nazwa. Prawidłowa nazwa typu referencji na wskaźnik do struktury to struktura*&

 

 

Bo w wersji z dwoma wskaźnikamimusisz też zmienić wywołanie i wprost przekazywać wskaźnik na wskaźnik, z resztą już ci Hellhound47 napisał przykład.

 

Dzięki, musiałem w którymś miejscu zapomnieć o gwiazdce czy coś takiego, bo albo mi wyrzucał w środku, albo nie chciał skompilować. Tak czy siak teraz działa (to co jest) tak jak chciałem, więc wielkie dzięki ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...