2016-01-19 2 views
1

Когда я запускаю мой код в режиме отладки, я могу видеть, что правильные значения из:Struct не возвращает правильное значение

createBooking("SOME NAME", 1, 2, 3, 4, 5, 6, 7); 

отправляется в моей структуры. Но когда я пытаюсь вызвать что-то в своей структуре, я не вижу значения. printf просто печатает 0, а не 2, как следует. Это что-то из моего printf в main(), что мне не хватает? Или что это может быть? Мой учитель смотрел на код, и он тоже не может найти проблему.

main.c:

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

int main() { 
    struct Booking booking; 
    createBooking("SOME NAME", 1, 2, 3, 4, 5, 6, 7); 
    printf("%d", booking.pNumber); 

    getchar(); 
    return 0; 
} 

functions.c:

#include "functions.h" 

struct Booking createBooking(char *aName, int aPNumber, int aStartWeek, int aStopWeek, 
          int aCabNr, int aCabType, int aLiftcard, double aTotCost) 
{ 
    struct Booking booking = *(struct Booking*)malloc(sizeof(struct Booking)); 

    strncpy(booking.name, aName, strlen(aName) + 1); 
    booking.pNumber = aPNumber; 
    booking.startWeek = aStartWeek; 
    booking.stopWeek = aStopWeek; 
    booking.cabNr = aCabType; 
    booking.cabType = aCabType; 
    booking.liftCard = aLiftcard; 
    booking.totCost = aTotCost; 

    return booking; 
} 

functions.h:

#ifndef functions_h 
#define functions_h 

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

typedef struct Booking { 
    char name[30]; 
    int pNumber; 
    int startWeek; 
    int stopWeek; 
    int cabNr; 
    int cabType; 
    int liftCard; 
    double totCost; 
} booking; 

struct Booking createBooking(char *aName, int aPNumber, int aStartWeek, int aStopWeek, 
          int aCabNr, int aCabType, int aLiftcard, double aTotCost); 
int bookBooking(struct Booking b); 

#endif 
+0

Итак, каков результат вашего printf? –

+0

Отредактировано под вопросом! printf печатает 0, а не 2, как следует. – pottsork

+1

Это не делает то, что я думаю, что вы думаете: 'struct Booking booking = * (struct Booking *) malloc (sizeof (struct Booking));' и не похоже, что вам нужно сделать что-то сложное чтобы делать то, что вы хотите. –

ответ

0

Так вы объявляете STRUCT так:

struct Booking booking; 

Это объявление структуры с неопределенными значениями - в большинстве компиляторов NULL/0 Чем вы называете createBooking, который выделяет и возвращает новую структуру. И игнорировать возвращаемое значение:

createBooking("SOME NAME", 1, 2, 3, 4, 5, 6, 7); 

Чем вы PRINTF незанятой-структуры:

printf("%d", booking.pNumber); 

И, конечно, она возвращает 0 или что-то неожиданное. Что вам нужно сделать, это:

struct Booking booking = createBooking("SOME NAME", 1, 2, 3, 4, 5, 6, 7); 
printf("%d", booking.pNumber); 

И, как справедливо заметил в комментарии по ММ, вам не нужно делать динамическое распределение внутри функции, все, что вам нужно сделать, это:

struct Booking createBooking(char *aName, int aPNumber, int aStartWeek, int aStopWeek, int aCabNr, int aCabType, int aLiftcard, double aTotCost) 
{ 
    struct Booking booking; 

    strncpy(booking.name, aName, strlen(aName) + 1); 
    booking.pNumber = aPNumber; 
    booking.startWeek = aStartWeek; 
    booking.stopWeek = aStopWeek; 
    booking.cabNr = aCabType; 
    booking.cabType = aCabType; 
    booking.liftCard = aLiftcard; 
    booking.totCost = aTotCost; 

    return booking; 
} 
+1

также, внутри функции, 'struct Бронирование брони = * (struct Booking *) malloc (sizeof (struct Booking));' должен действительно читать 'struct Booking booking;' –

0

Ваша функция createBooking должна выделить бронирование из кучи и вернуть указатель на нее. Вы также можете использовать функцию initBooking, которая берет указатель на бронирование и значения для его инициализации.

Вот пример обоих способов:

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

struct Booking *initBooking(struct Booking *bp, 
          char *aName, int aPNumber, int aStartWeek, int aStopWeek, 
          int aCabNr, int aCabType, int aLiftcard, double aTotCost) 
{ 
    if (bp) { 
     size_t len = strlen(aName); 
     if (len >= sizeof(bp->name)) 
      len = sizeof(bp->name) - 1; 
     memcpy(bp->name, aName, len); 
     bp->name[len] = '\0'; 
     bp->pNumber = aPNumber; 
     bp->startWeek = aStartWeek; 
     bp->stopWeek = aStopWeek; 
     bp->cabNr = aCabType; 
     bp->cabType = aCabType; 
     bp->liftCard = aLiftcard; 
     bp->totCost = aTotCost; 
    } 
    return bp; 
} 

struct Booking *createBooking(char *aName, int aPNumber, int aStartWeek, int aStopWeek, 
           int aCabNr, int aCabType, int aLiftcard, double aTotCost) 
{ 
    return initBooking(malloc(sizeof(struct Booking), 
         aName, aPNumber, aStartWeek, aStopWeek, 
         aCabNr, aCabType, aLiftcard, aTotCost); 
} 

int main() { 
    struct Booking booking; 

    initBooking(&booking, "SOME NAME", 1, 2, 3, 4, 5, 6, 7); 
    printf("%d", booking.pNumber); 

    struct Booking *bp; 

    bp = createBooking(&booking, "SOME NAME", 1, 2, 3, 4, 5, 6, 7); 
    printf("%d", bp->pNumber); 

    getchar(); 
    return 0; 
} 
0

Превратите предупреждения компилятора на/и это даст вам большую помощь. У вас есть ряд ошибок:

  1. , выделяющий указатель и ссылающийся на него без косвенности в создании книги.
  2. запись в буфер фиксированной длины [30] без проверки размера ввода.
  3. Настройка полей при бронировании с использованием. вместо -> указатель.
  4. возврат заявки (указатель), когда вы объявляете возвращаемое значение как тип значения (вся структура).
  5. игнорирование возвращаемого значения createBooking.

Все эти данные могут быть обнаружены компилятором, если у вас есть предупреждения.

Смежные вопросы