• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

konwersja z C++ na C, zastapienie &

VPS Starter Arubacloud
0 głosów
760 wizyt
pytanie zadane 16 listopada 2015 w C i C++ przez dariusz Obywatel (1,800 p.)
Witam mam mały problem. Wiem, że w C nie można odwołać się do argumentu funkcji w ten sposób:
void usunliste(str* &list){

//Ciało funkcji

}

Wywołanie z maina:
usunliste(lista);

lista to poprostu wskaźnik na strukture. Nie wiem jak to zapisać w C, a konkretnie jak pozbyć się "&" z nagłówka funckji w taki sposób żeby zachowała swoje właściwości; Pozdrawiam.

1 odpowiedź

+1 głos
odpowiedź 16 listopada 2015 przez draghan VIP (106,230 p.)
wybrane 18 listopada 2015 przez dariusz
 
Najlepsza

A w C++ to przechodzi...? O.o

Odwołujesz się tam do referencji na wskaźnik (czy wskaźnika do referencji), po co i dlaczego - nie mam pojęcia.

Ale solucja Twojego problemu jest prosta.

void usunliste(str* list){

//Ciało funkcji
/* Zamień kaźde ewentualne wywołanie w postaci 
    list.składowa
    na postać wskaźnikową:
    list -> składowa
    Pamiętaj, że struktura "list" nie może zawierać metod!
*/

}

 

komentarz 16 listopada 2015 przez draghan VIP (106,230 p.)

Zapomniałem. A w wywołaniu musisz podać do funkcji adres instancji struktury:
usunliste(&lista);

komentarz 17 listopada 2015 przez dariusz Obywatel (1,800 p.)

Próbowałem rozwiązać to w ten sposób. Dostaje błąd:
'void dodajV2(str *,int)': cannot convert argument 1 from 'str **' to 'str *'

Dodaje &, bo wtedy działam na oryginale. Na poniższym przykładzie w funkcji dodajV1() dodaje się poprawnie i mogę to później wyświetlić. W funkcji dodajV2() wartość nie jest zapisywana do wskaźnika, który wysyłam. Kompiluje w visual studio 2015.

 

#include "stdafx.h"
#include <malloc.h>
#include <stdlib.h>

typedef struct str{
	int k;
}str;

void dodajV1(str* &poczatek, int n) {
	poczatek = (str*)malloc(sizeof(str));
	poczatek->k = 9;
}

void dodajV2(str* poczatek, int n) {
	poczatek = (str*)malloc(sizeof(str));
	poczatek->k = 7;
}

void wyswietl(str* poczatek){
		printf("%d\n", poczatek->k);
}

int main(){
	str* listaV1 = NULL;
	dodajV1(listaV1, 1);
	wyswietl(listaV1);

	str* listaV2 = NULL;
	dodajV2(&listaV2, 1);
	wyswietl(listaV2);

	getchar();	getchar();
	return 0;
}

 

komentarz 17 listopada 2015 przez draghan VIP (106,230 p.)

Spójrz, jak powinny wyglądać przykłady alokowania pamięci do struktur wydzielone do funkcji:

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

typedef struct
{
    int a, b, c;
} Foo;

Foo* list_alloc() // pierwszy sposób alokacji - funkcja zwraca wskaźnik na zaalokowaną strukturę
{
    Foo *ptr_f = (Foo*)malloc(sizeof(Foo));

    if(ptr_f == NULL) return NULL;

    // alokacja z domyślną inicjalizacją
    ptr_f -> a = 0;
    ptr_f -> b = 0;
    ptr_f -> c = 0;

    return ptr_f;
}

/*  drugi sposób alokacji - podajesz jej wskaźnik do wskaźnika (adres wskaźnika) na strukturę,
    a funkcja alokuje pamięć i zmienia przekazany jej jako arguemnt wskaźnik.
    F-cja zwraca rezultat alokacji (w C nie ma flag typu bool, należy posłużyć się wartością typu int).
*/
int list_alloc2(Foo ** ptr_f)
{
    /*  Zwróć uwagę na dereferencje ptr_f!!!
        ptr_f jest wskaźnikiem do wskaźnika,
        więc chcesz modyfikować to, na co on wskazuje,
        a nie jego adres.
    */

    (*ptr_f) = (Foo*)malloc(sizeof(Foo));

    if((*ptr_f) == NULL) return 0;

    // alokacja z domyślną inicjalizacją
    (*ptr_f) -> a = 0;
    (*ptr_f) -> b = 0;
    (*ptr_f) -> c = 0;
    return 1;
}


int main()
{
    // i przykłady użycia:
    // pierwszy sposób:
    Foo *ptr1 = list_alloc();
    if(ptr1 != NULL)
    {
        printf("%d ", ptr1->a);
        free(ptr1);
    }

    // drugi sposób:
    Foo *ptr2 = NULL;
    if(list_alloc2(&ptr2))
    {
        printf("%d", ptr2->a);
        free(ptr2);
    }
    return 0;
}

Spróbuj na tej podstawie poprawić swój program, wybierając dowolny ze sposobów. Oczywiście prostszy jest sposób pierwszy, ale jeśli koniecznie chcesz, możesz wskaźnik na strukturę przekazywać jako argument. ;)

Jeśli masz jeszcze jakieś pytania/wątpliwości, to pisz śmiało.

komentarz 18 listopada 2015 przez dariusz Obywatel (1,800 p.)
Dziękuje bardzo za tak jasne wyjaśnienie tematu :) Teraz rozumiem czemu wcześniej dostawałem taki error. Przerobiłem program, powinno zostać w palcach. Pozdrawiam
komentarz 18 listopada 2015 przez draghan VIP (106,230 p.)
Cieszę się, że mogłem pomóc, pozdrawiam i życzę owocnej dalszej nauki! :)

Podobne pytania

0 głosów
0 odpowiedzi 325 wizyt
pytanie zadane 8 lipca 2018 w C i C++ przez niezalogowany
0 głosów
2 odpowiedzi 262 wizyt
pytanie zadane 11 stycznia 2021 w C i C++ przez Icar Nowicjusz (150 p.)
+1 głos
2 odpowiedzi 557 wizyt
pytanie zadane 7 października 2016 w C i C++ przez Łukasz ER Początkujący (420 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...