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

string + malloc = problem?

Ostatnio zmodyfikowano 2012-11-07 23:20
Autor Wiadomość
cytrynka
Temat założony przez niniejszego użytkownika
string + malloc = problem?
» 2012-11-07 21:45:05
Napisałam taki kod (poniżej). Jest to początkowy etap tworzenia sklepu obuwniczego. W zadaniu które mam wszystko ma być zrobione tak jak w moim kodzie, a co najważniejsze tablica dynamiczna ma być utworzona przez "malloc", nie przez "new"(takie polecenie od nauczyciela). I tu pojawia mi się problem. Typ string, że tak powiem "gryzie" się z mallociem. Przy zamianie tablicy na "new" wszystko gra, jedynie przy mallocu niby się kompiluje, a przy uruchomieniu się sypie. Zamiast string użyłam też char, ale kompilator zwraca błędy. Co mogę zrobić, aby to dobrze działało? Proszę o jakieś wsparcie.

C/C++
#include <iostream>
#include <string>

using namespace std;

struct Buty {
    string typ;
    string kolor;
    int rozmiar;
    int cena;
   
};

Buty ** tworz( int n ) {
    Buty ** spis =( Buty ** ) malloc( n * sizeof( Buty * ) );
    for( int i = 0; i < n; i++ )
         spis[ i ] =( Buty * ) malloc( sizeof( Buty ) );
   
    return spis;
   
}

void edycja( Buty * buty, string typ, string kolor, int rozmiar, int cena ) {
   
    buty->typ = typ;
    buty->kolor = kolor;
    buty->rozmiar = rozmiar;
    buty->cena = cena;
}

void wypisz( Buty ** spis, int n ) {
    for( int i = 0; i < n; i++ )
         cout << spis[ i ]->typ << ": " << spis[ i ]->kolor << " [" << spis[ i ]->rozmiar << "] " << spis[ i ]->cena << "zl" << endl;
   
}

void usun( Buty ** spis, int n ) {
   
    for( int i = 0; i < n; i++ )
         free( spis[ i ] );
   
    free( spis );
}


void main() {
    Buty buty;
   
    Buty ** spis = tworz( 2 );
   
    edycja( spis[ 0 ], "kozaki", "czerwone", 32, 200 );
    edycja( spis[ 1 ], "sandaly", "czarne", 32, 200 );
    wypisz( spis, 2 );
    usun( spis, 2 );
   
}
P-68782
Mrovqa
» 2012-11-07 21:46:55
Ujmij kod w tagi [cpp][/cpp]
C/C++
Buty ** spis = new Buty *[ n ];
for( int i = 0; i < n; i++ )
{
    spis = new Buty; // sic!
}
return spis;
}
P-68783
akwes
» 2012-11-07 21:49:40
C/C++
#include <iostream>
#include <string>

Widzę nagłówki typowo C++ a próbujesz używać funkcji rodem z C :) Operator new robi to lepiej.
P-68785
DejaVu
» 2012-11-07 21:52:12
malloc = alokacja pamięci
new = alokacja pamięci + wywołanie konstruktora
string = obiekt
obiekt = konieczność wywołania konstruktora
malloc + string = konieczność ręcznego wywołania konstruktora
P-68787
cytrynka
Temat założony przez niniejszego użytkownika
.
» 2012-11-07 22:37:46
Ręczne wywołanie konstruktora?
Możesz powiedzieć dokładniej jak to ma wyglądać? Nie słyszałam jeszcze o czymś takim, pierwszy raz spotykam się z takim problemem.
P-68799
DejaVu
» 2012-11-07 23:20:08
@up: to alokuj obiekty za pomocą operatora
new
 i problemu nie będzie.
P-68806
« 1 »
  Strona 1 z 1