Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C]-Struktury, operacje wejścia/wyjścia

Ostatnio zmodyfikowano 2014-12-09 08:22
Autor Wiadomość
Vixos
Temat założony przez niniejszego użytkownika
[C]-Struktury, operacje wejścia/wyjścia
» 2014-12-08 19:33:30
Mam takie zadanie do zrobienia i się chce zapytać czy dobrze to zrobiłem.

Proszę rozszerzyć program o następujące funkcje:

- zapis i odczyt całego magazynu w trybie binarnym

- funkcja zwalniająca pamięć przydzieloną na towary w magazynie. Funkcja jednocześnie usuwa wszystkie towary z magazynu.

To jest ten program
C/C++
#include <cstdio>
#include <cstring>

struct Towar {
    char nazwa[ 32 ];
    float cena;
    float cena_jednostkowa;
};

void ustaw( Towar * t, const char n[], float cena, float cj ) {
    strcpy( t->nazwa, n );
    t->cena = cena;
    t->cena_jednostkowa = cj;
}
struct Magazyn {
    int stan;
    Towar * towary[ 1000 ];
};

void init( Magazyn * m ) {
    m->stan = 0;
    for( int i = 0; i < 1000; ++i )
         m->towary[ i ] = 0;
   
}

Towar * utworz( const char n[], float cena, float cj ) {
    Towar * t = new Towar;
    ustaw( t, n, cena, cj );
    return t;
}

bool dodaj( Magazyn * m, const char n[], float cena, float cj ) {
    if( m->stan >= 1000 )
    {
        return false;
    }
    m->towary[ m->stan++ ] = utworz( n, cena, cj );
    return true;
}

void wypisz( Magazyn * m, FILE * fp ) {
    fprintf( fp, "%d\n", m->stan );
    for( int i = 0; i < m->stan; ++i )
         wypisz( m->towary[ i ], fp );
   
}

void wczytaj( Magazyn * m, FILE * fp ) {
    fscanf( fp, "%d", & m->stan );
    getc( fp );
    for( int i = 0; i < m->stan; i++ )
    {
        m->towary[ i ] = new Towar;
        wczytaj( m->towary[ i ], fp );
    }
}

A tutaj napisałem te funkcje
C/C++
void wypiszbinarnie( Magazyn * m, FILE * fp ) {
    fwrite( &( m->stan ), sizeof( int ), 1, fp );
    for( int i = 0; i < m->stan; ++i )
         fwrite( m->towary[ i ], sizeof( Towar ), 1, fp );
   
}

void wczytajbinarnie( Magazyn * m, FILE * fp ) {
    fread( &( m->stan ), sizeof( int ), 1, fp );
    for( int i = 0; i < m->stan, i++ )
         fread( m->towary[ i ], sizeof( Towar ), 1, fp );
   
}

bool usun( Magazyn * m, int numerTowaru ) {
   
    if( numerTowaru < 0 or numerTowaru >= m->stan ) return 0;
   
    if( numerTowaru < m->stan - 1 )
         m->towary[ numerTowaru ] = m->towary[ m->stan - 1 ];
   
    m->stan--;
    return 1;
}
P-122550
darko202
» 2014-12-09 08:22:21
wycofuję się z tego co zauważyłem wcześniej.

daje się wypełnić magazyn
C/C++
main {
    Magazyn m;
    init( & m );
    m.towary[ 0 ] = utworz( " xxx", 2.34, 2.1 );
    dodaj( & m, " xxx", 2.34, 2.1 );
    dodaj( & m, " xxx", 2.34, 2.1 );
    dodaj( & m, " xxx", 2.34, 2.1 );
   
    cout << m.towary[ 2 ]->cena << " " << m.towary[ 2 ]->cena_jednostkowa << " " << m.towary[ 2 ]->nazwa << " \n";

funkcje wypisz, wczytaj, wczytajbinarnie zawierają błędy
nie można konwertować 1 argumentu Towar na Magazyn
 
funkcja usun
1- wycieki pamięci - zadeklarowałeś wcześniej pamięć new Towar
2. zakładasz że możesz otrzymać stan < 0, co będzie jak znów zapełnisz magazyn
   1 towar pewnie zginie.

P-122572
« 1 »
  Strona 1 z 1