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

[c++] dynamiczna tablica struktur, Jak przekazać do funkcji żeby zabezpieczyć ją modyfikatorem const?

Ostatnio zmodyfikowano 2015-05-22 16:33
Autor Wiadomość
carlosmay
Temat założony przez niniejszego użytkownika
[c++] dynamiczna tablica struktur, Jak przekazać do funkcji żeby zabezpieczyć ją modyfikatorem const?
» 2015-05-21 23:26:26
C/C++
struct rzdw {
    string imie;
    double kwota;
};

Wywołuję funkcję, która wczytuje z pliku dane do tablicy struktur

C/C++
rzdw * w_sponsor = new rzdw[ don ]; // don wczytane z pliku = 4

i z tej samej funkcji wywołuję następną funkcję

C/C++
wypiszSponsorow( don, w_sponsor ); // przekazuje do funkcji wypisujacej dane ze struktury

a to jest nagłówek funkcji. Chcę ją zabezpieczyć modyfikatorem const przed przypadkowym nadpisaniem

C/C++
void wypiszSponsorow( int sdon, rzdw sw_sponsor[] ) {.......}

 Chcę ją zabezpieczyć modyfikatorem const przed przypadkowym nadpisaniem,
ale kompilator się burzy,

C/C++
void wypiszSponsorow( int sdon, const rzdw sw_sponsor[] ) {.......}


Błąd 1 error LNK2019: unresolved external symbol "void __cdecl wypiszSponsorow(int,struct rzdw * const)"
(?wypiszSponsorow@@YAXHQAUrzdw@@@Z) referenced in function "bool __cdecl wczytajPlik(class std::basic_string<char,struct std::char_traits<char>,
class std::allocator<char> >)" (?wczytajPlik@@YA_NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
C:\Users\....

Nie wiem jak to ugryźć. Czy jest to do zrobienia tym sposobem?
P-132587
pekfos
» 2015-05-22 08:38:52
C/C++
const rzdw * sw_sponsor
P-132593
carlosmay
Temat założony przez niniejszego użytkownika
» 2015-05-22 16:05:51
// prog wczytuje rozmiar tablicy z pliku, oraz na przemian nazwisko i kwotę zapisuje do struktury
// później wypisuje zawartość struktury
C/C++
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

struct rzdw {
    string imie;
    double kwota;
};

void wypiszSponsorow( int sdon, rzdw sw_sponsor[] );
bool wczytajPlik( string sNazwaPliku );

int main()
{
   
    if( !wczytajPlik( "C:\\Users\\...\\Documents\\Visual Studio 2013\\donatorzy.txt" ) ) // jesli nie wczytano pliku
         cout << "Nie udalo sie wczytac pliku o podanej nazwie." << endl;
   
    system( "pause" );
}

bool wczytajPlik( string sNazwaPliku )
{
    ifstream plik; // wczytywanie pliku i sprawdzenie czy prawidlowo otwarty
    plik.open( sNazwaPliku );
    if( !plik.is_open() )
         return false;
   
    int don;
    plik.clear();
    plik.sync();
    plik >> don; // pobranie liczby donatorow
    plik.get();
    rzdw * w_sponsor = new rzdw[ don ]; // wskaznik do tablicy struktur
   
    int i = 0;
    while( plik.good() ) // poki plik jest w stanie poprawnym
    {
        getline( plik, w_sponsor[ i ].imie );
        plik >> w_sponsor[ i ].kwota;
        plik.get(); // po wczytaniu liczby i przed wczytywaniem tekstu, trzeba pobrac znak nowego wiersza, plik.get()
       
        ++i; // aktulizacja i
    }
   
    wypiszSponsorow( don, w_sponsor );
    delete[] w_sponsor; // zwonnienie pamieci
    return true;
}

void wypiszSponsorow( int sdon, rzdw sw_sponsor[] )
{
    cout << "Nasi wspaniali sponsorzy:" << endl;
    for( int i = 0; i < sdon; ++i )
    {
        if( sw_sponsor[ i ].kwota >= 10000 )
        {
            cout << "Sponsor #" << i + 1 << endl;
            cout << "\t" << sw_sponsor[ i ].imie << endl;
            cout << "\t" << sw_sponsor[ i ].kwota << endl;
        }
    }
    cout << endl;
    cout << "Nasi sponsorzy:" << endl;
    for( int i = 0; i < sdon; ++i )
    {
        if( sw_sponsor[ i ].kwota < 10000 )
        {
            cout << "Sponsor #" << i + 1 << endl;
            cout << "\t" << sw_sponsor[ i ].imie << endl;
            cout << "\t" << sw_sponsor[ i ].kwota << endl;
        }
    }
}

Wrzuciłem cały kod.
Kombinowałem, żeby funkcja odbierała tą tablice jako wskaźnik, ale jest to samo.
Ciągle we wskaźnikach, są niuanse które rozkminiam, z różnym skutkiem.
Wydaje mi się, że
C/C++
const rzdw * sw_sponsor
 jest już wskaźnikiem do wskaźnika, więc chyba nie da się w ten sposób. Sam już nie wiem.
P-132617
Monika90
» 2015-05-22 16:20:26
Dopisz const:
C/C++
void wypiszSponsorow( int sdon, const rzdw sw_sponsor[] );
ale w obydwu miejscach, i w deklaracji i w definicji.


A to
C/C++
void f( const T ptr[] );

i to
C/C++
void f( const T * ptr );
ma dokładnie takie samo znaczenie.
P-132618
carlosmay
Temat założony przez niniejszego użytkownika
» 2015-05-22 16:33:05
Zupełnie zapomniałem tam też zmienić, no i kombinowanie wyprowadziło w pole.
Jednak dobrze myślałem, tyle że każdy szczegół musi się zgadzać.
Serdeczne dzięki.
P-132620
« 1 »
  Strona 1 z 1