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

Problem z wartością typu char w strukturze i funkcją dodawania elementu do stosu.

0 głosów
880 wizyt
pytanie zadane 11 czerwca 2018 w C i C++ przez KotDrewniany Początkujący (250 p.)

Witam. Mam problem z listą jednokierunkową i wartością typu char w strukturze. Myślę że problematyczna jest funkcja poloz. Bez wartosci typu char wszystko dziala jak nalezy.

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

typedef struct pacjent
{
    int id;
    char nazwisko[10];
    struct pacjent *next;

}pacjent;

pacjent *poloz(int nowe_id, char nowe_nazwisko, pacjent *szczyt)
{
    pacjent *nowy_szczyt = (pacjent*)malloc(sizeof(pacjent*));
    nowy_szczyt->id = nowe_id;
    //nowy_szczyt->nazwisko = nowe_nazwisko;
    strcpy(nowy_szczyt->nazwisko,nowe_nazwisko);
    nowy_szczyt->next = szczyt;
    return nowy_szczyt;
}

void wypisz(pacjent *szczyt)
{
    if (szczyt==NULL) { printf("Stos jest pusty!\n"); }
    else
    {
        while (szczyt!=NULL)
        {
            printf("%d %s\n",szczyt->id,szczyt->nazwisko);
            szczyt = szczyt->next;
        }
    }
}

int main()
{
    pacjent *szczyt = NULL;

    char nazwisko1[10] = "Kowalski";
    char nazwisko2[10] = "Bandura";
    char nazwisko3[10] = "Domagala";

    szczyt = poloz(1,nazwisko1,szczyt);
    szczyt = poloz(2,nazwisko2,szczyt);
    szczyt = poloz(3,nazwisko3,szczyt);

    wypisz(szczyt);

    return 0;
}

||=== Build file: "no target" in "no project" (compiler: unknown) ===|
C:\Users\halo\Desktop\Programowanie C\Zad2_stos.c||In function 'poloz':|
C:\Users\halo\Desktop\Programowanie C\Zad2_stos.c|19|warning: passing argument 2 of 'strcpy' makes pointer from integer without a cast [-Wint-conversion]|
C:\Program Files (x86)\CodeBlocks\MinGW\include\string.h|45|note: expected 'const char *' but argument is of type 'char'|
C:\Users\halo\Desktop\Programowanie C\Zad2_stos.c||In function 'main':|
C:\Users\halo\Desktop\Programowanie C\Zad2_stos.c|45|warning: passing argument 2 of 'poloz' makes integer from pointer without a cast [-Wint-conversion]|
C:\Users\halo\Desktop\Programowanie C\Zad2_stos.c|14|note: expected 'char' but argument is of type 'char *'|
C:\Users\halo\Desktop\Programowanie C\Zad2_stos.c|46|warning: passing argument 2 of 'poloz' makes integer from pointer without a cast [-Wint-conversion]|
C:\Users\halo\Desktop\Programowanie C\Zad2_stos.c|14|note: expected 'char' but argument is of type 'char *'|
C:\Users\halo\Desktop\Programowanie C\Zad2_stos.c|47|warning: passing argument 2 of 'poloz' makes integer from pointer without a cast [-Wint-conversion]|
C:\Users\halo\Desktop\Programowanie C\Zad2_stos.c|14|note: expected 'char' but argument is of type 'char *'|
||=== Build finished: 0 error(s), 4 warning(s) (0 minute(s), 0 second(s)) ===|

1 odpowiedź

+2 głosów
odpowiedź 11 czerwca 2018 przez criss Mędrzec (172,570 p.)
wybrane 11 czerwca 2018 przez Arkadiusz Waluk
 
Najlepsza
nowe_nazwisko to char, a pacjent::nazwisko to char[10] - tablica.

Jak działa strcpy: w pierwszym argumencie bierze adres docelowej pamięci, a w drugim - źródłowej. Teraz począwszy od adresu źródłowego szuka zera zapisanego na jednym bajcie. Gdy znajdzie, wtedy znana jest odległość (rozmiar pamięci do pzrekopiowania) między początkiem i końcem. strcpy(dst, src) da taki sam efekt jak memcpy(dst, src, strlen(src)+1). +1 bo razem z "terminating zero".

tl;dr: strcpy chce wskaźnik, nie char.
komentarz 11 czerwca 2018 przez KotDrewniany Początkujący (250 p.)

@monika90,  dlaczego źle?

 

 

komentarz 11 czerwca 2018 przez monika90 Pasjonat (22,940 p.)
Alokujesz za mało pamięci, sizeof(pacjent*) to jest rozmiar wskaźnika, a powinien być rozmiar całego pacjenta.
komentarz 11 czerwca 2018 przez KotDrewniany Początkujący (250 p.)
Aha rozumiem, ale w takim razie jak to zrobić poprawnie?
komentarz 11 czerwca 2018 przez monika90 Pasjonat (22,940 p.)

pacjent *nowy_szczyt = (pacjent*)malloc(sizeof(pacjent));

komentarz 11 czerwca 2018 przez KotDrewniany Początkujący (250 p.)
Dziękuję bardzo, zadziałało! :D

Podobne pytania

0 głosów
1 odpowiedź 686 wizyt
pytanie zadane 19 czerwca 2018 w C i C++ przez Sic Dyskutant (8,510 p.)
0 głosów
1 odpowiedź 281 wizyt
0 głosów
1 odpowiedź 365 wizyt

93,427 zapytań

142,421 odpowiedzi

322,649 komentarzy

62,787 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...