Avatar billede snailwalker Nybegynder
15. maj 2005 - 17:35 Der er 13 kommentarer og
1 løsning

Structs og pointere

Jeg har lavet et lille program som kan udregne valutaer. Selve valutaerne er defineret i en struct som indeholder et valutanavn og en omregningskurs.

Jeg vil gerne have oprettet et dynamisk array med valutaer hvor brugerne så kan tilføje nye. Jeg har skrevet følgende kode:

#include <iostream>
#include "currency.h"
using std::cout;
using std::cin;
using std::endl;

int main() {
   
    cout << "Welcome to currency converter 0.1" << endl << endl;
   
    int number_of_new = 0;
    char nyt_valutanavn[10];
    double ny_conversion;
    do {
        cout << "How many currencies do you want to add?";
        cin >> number_of_new;
    }while (number_of_new < 0);
    number_of_new +=3;
    Currency* pCurrencies = new Currency[number_of_new];

                           
    for(int i = 0; i < number_of_new ; i++) {
        cout << "Write the name of value nr "<< (i+1) <<" (max 10 chars.):";
        cin >> nyt_valutanavn[10];
        pCurrencies[i]->valutanavn = nyt_valutanavn;
    }
   
    for(int i = 0; i < number_of_new ; i++) {
        cout << "Write the currency conversion to US$ for value no. "<< (i+1) <<" (max 10 chars.):";
        cin >> ny_conversion;
        pCurrencies[i]->conversion = 10;
    }

Men når jeg når til linjen: pCurrencies[i]->valutanavn = nyt_valutanavn;, brokker compileren sig og siger base operand not of pointer type.

Hvad er der galt og har I et løsningsforslag?
Avatar billede arne_v Ekspert
15. maj 2005 - 17:51 #1
pCurrencies[i].valutanavn = nyt_valutanavn;
Avatar billede arne_v Ekspert
15. maj 2005 - 17:57 #2
pCurrencies er en pointer, men det er pCurrencies[i] ikke
Avatar billede snailwalker Nybegynder
15. maj 2005 - 18:06 #3
Tak det hjalp, men nu brokker compileren sig og siger ISO c++ forbids assignment of arrays når den når til de her to linjer:        

cin >> nyt_valutanavn[10];
pCurrencies[i].valutanavn = nyt_valutanavn;

Min struct er defineret som en char valutanavn[10] og en double conversion.
Avatar billede arne_v Ekspert
15. maj 2005 - 18:08 #4
cin >> nyt_valutanavn;
strcpy(pCurrencies[i].valutanavn, nyt_valutanavn);
Avatar billede snailwalker Nybegynder
15. maj 2005 - 18:10 #5
Du er godt nok hurtig på tasterne :-)

Tusind tak for hjælpen, skriv lige et svar så du kan få point :)
Avatar billede arne_v Ekspert
15. maj 2005 - 18:12 #6
svar
Avatar billede arne_v Ekspert
15. maj 2005 - 18:13 #7
du kan måske overveje at bruge STL string fremfor char array (så kan du bl.a.
assigne direkte)
Avatar billede snailwalker Nybegynder
15. maj 2005 - 18:18 #8
Hvad er STL string? Hmm når jeg eksekverer programmet og skriver et navn på møntfoden går det helt i spunk :S
Avatar billede arne_v Ekspert
15. maj 2005 - 18:21 #9
Hvordan ser koden ud nu ?  Og hvilken fejl får du ?
Avatar billede arne_v Ekspert
15. maj 2005 - 18:22 #10
STL string:

string s = "ABC";
cout << s << endl;
getline(cin,s);
cout << s << endl;

etc.
Avatar billede snailwalker Nybegynder
15. maj 2005 - 18:28 #11
#include <iostream>
#include "currency.h"
using std::cout;
using std::endl;
using std::cin;

int convert (double& conversion_to, double& conversion_from) {
    double amount = 0;
    cout << "Write the amount you want to convert ";
    cin >> amount;
    if(amount <= 0)
        return 0;
    cout << "The amount of money is " << amount*(1.0/conversion_to)*conversion_from << endl << endl;
    return 1;
   
}

int& show(int& number_of_currencies, Currency currencies[], int convert) {
    if(convert == 0) {
        cout << "Select currency to convert from: " << endl;
        for( int i = 0; i < number_of_currencies ; i++) {
            cout << i << ": " << currencies[i].valutanavn << endl;
        }
       
        do{
            cout << "Write the currency you want to convert from ";
            cin >> convert;
           
        }while (convert < 0 ||convert >= number_of_currencies);
        return convert;
    }
    else {
        int not_availeble = convert;
        cout << "Select currency to convert to: " << endl << endl;
        for( int i = 0; i < number_of_currencies ; i++) {
            if(convert == i)
                continue;
            cout << i << ": " << currencies[i].valutanavn << endl;
        }
       
        do{
            cout << "Write the currency you want to convert to ";
            cin >> convert;
        }while (convert < 0 ||convert >= number_of_currencies || convert == not_availeble);
        return convert;
    }
}

Nårh sådan en string :-)

Hmm når jeg skriver et navn på den første møntfod ser det ud som om den bare skriver en masse bogstaver på skærmen.
Avatar billede snailwalker Nybegynder
15. maj 2005 - 18:35 #12
Jeg har opdateret koden:

#include <iostream>
#include <string>
#include "currency.h"
using std::cout;
using std::cin;
using std::endl;
using std::string;

int main() {
   
    cout << "Welcome to currency converter 0.1" << endl << endl;
   
    int number_of_new = 0;
    string nyt_valutanavn;
    double ny_conversion;
    do {
        cout << "How many currencies do you want to add?";
        cin >> number_of_new;
    }while (number_of_new < 0);
    Currency* pCurrencies = new Currency[number_of_new];

                           
    for(int i = 0; i < number_of_new ; i++) {
        cout << "Write the name of currency number " << (i+1) << " :";
        getline(cin, nyt_valutanavn);
        cout << endl;
        pCurrencies[i].valutanavn = nyt_valutanavn;
       
        cout << "Write the currency conversion to US$ for value no. "<< (i+1) <<" :";
        cin >> ny_conversion;
        pCurrencies[i].conversion = ny_conversion;
    }
   

       
    int number_of_currencies = sizeof pCurrencies/ sizeof pCurrencies[0];
   
    int convert_from, convert_to;
    int exit_status = 1;
    while(exit_status != 0) {
       
        convert_from = show(number_of_currencies, pCurrencies, 0);
        convert_to = show(number_of_currencies, pCurrencies, convert_from);
        exit_status = convert(pCurrencies[convert_to].conversion, pCurrencies[convert_from].conversion);
       
       
       
    }
    delete[] pCurrencies;
    return 0;
}

Men problemet er at den nu bare springer navneindtastningen over når jeg skal indtaste en ny møntfod :-S
Avatar billede arne_v Ekspert
15. maj 2005 - 18:39 #13
prøv og erstat

getline(cin, nyt_valutanavn);

med

cin >> nyt_valutanavn;
Avatar billede snailwalker Nybegynder
15. maj 2005 - 19:17 #14
Tusind tak for hjælpen igen Arne, det funger nu :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester