Problem ze wskaźniakami do tablicy. Nieobsługiwany wyjątek.

0

Mam problem ze wskażnikami odnoszącymi się do elementów tablicy. Mianowicie gdy zrobię *(wskdane+i) wyrzuca mi nieobsługiwany wątek. Nie mam pojęcia jak to rozwiązać.

#include <iostream>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

struct konto {
    string dane;
    long long saldo;
};

int main()
{
    struct konto konta[10] = {
       { "Jan Kowalski 28 mbank 123456",300000},
       { "Marcin Kwiatkowski 46 pko 123465", 21000 },
       { "Marcin Winkiel 20 mbank 654321", 24 },
       {"Damian Fart 19 alior 123654", 230},
       {"Pablo Essscobar 21 mbank 654123", 5600},
       {"Edward Brown 20 pko 214365", 3400000},
       {"Piotr Boczek 56 milenium 124356", 13000},
       {"Harry Potter 21 mbank 615243", 12500} };
    struct konto wskkonto;
    string *wskdane = &konta->dane;
    long long* wsksaldo = &konta->saldo;
    char w;
    for (int i = 8; i < 10; i++)
    {   cout <<"Czy chcesz dodac konto? Jezeli tak wpisz t, jesli nie, wpisz n" << endl;
        char odp;
        cin >> odp;
        if (odp == 't') {
            cout << "Podaj swoje dane: ";
            cin >> konta[i].dane;
            cout << "Podaj saldo: ";
            cin >> konta[i].saldo;}
        else {
            for (i; i < 10; i++) {
                konta[i].dane = "puste";
                konta[i].saldo = 0;}
            break;}}
    do {
    cout << "Wybierz co chcesz zrobic." << endl;
    cout << "1. Wyswietl konta" << endl;
    cout << "2. Wyswietl podane konto" << endl;
    cout << "3. Dodaj salda" << endl;
    cout << "4. Znajdz najwieksze saldo" << endl;
    cout << "5. Znajdz najmniejsze saldo" << endl;
    int t;
    long long suma = 0;
    long long najwieksze = 0;
    cin >> t;
    switch (t) {
    case 1:
        for (int i = 0; i < 10; i++){
            cout << *(wskdane+i) << endl;
            cout << *(wsksaldo+i) << endl;
        }
        break;
1

@ikol_20:

Zrobiłeś w zasadzie wszystko, aby ten kod wygladał jak rzygowiny.

Kto ci wskazał ścieżkę arytmetyki na wskaźnikach ?
Jak już bierzesz się za C++, to wyrzuć w cholerę relikty C.

1
ikol_20 napisał(a):

Mam problem ze wskażnikami odnoszącymi się do elementów tablicy. Mianowicie gdy zrobię *(wskdane+i) wyrzuca mi nieobsługiwany wątek. Nie mam pojęcia jak to rozwiązać.
#include <iostream>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

struct konto {
    string dane;
    long long saldo;
};

int main()
{
    struct konto konta[10] = {
       { "Jan Kowalski 28 mbank 123456",300000},
       { "Marcin Kwiatkowski 46 pko 123465", 21000 },
       { "Marcin Winkiel 20 mbank 654321", 24 },
       {"Damian Fart 19 alior 123654", 230},
       {"Pablo Essscobar 21 mbank 654123", 5600},
       {"Edward Brown 20 pko 214365", 3400000},
       {"Piotr Boczek 56 milenium 124356", 13000},
       {"Harry Potter 21 mbank 615243", 12500} };
    struct konto wskkonto;
    string *wskdane = &konta->dane;
    long long* wsksaldo = &konta->saldo;
    char w;
    for (int i = 8; i < 10; i++)
    {   cout <<"Czy chcesz dodac konto? Jezeli tak wpisz t, jesli nie, wpisz n" << endl;
        char odp;
        cin >> odp;
        if (odp == 't') {
            cout << "Podaj swoje dane: ";
            cin >> konta[i].dane;
            cout << "Podaj saldo: ";
            cin >> konta[i].saldo;}
        else {
            for (i; i < 10; i++) {
                konta[i].dane = "puste";
                konta[i].saldo = 0;}
            break;}}
    do {
    cout << "Wybierz co chcesz zrobic." << endl;
    cout << "1. Wyswietl konta" << endl;
    cout << "2. Wyswietl podane konto" << endl;
    cout << "3. Dodaj salda" << endl;
    cout << "4. Znajdz najwieksze saldo" << endl;
    cout << "5. Znajdz najmniejsze saldo" << endl;
    int t;
    long long suma = 0;
    long long najwieksze = 0;
    cin >> t;
    switch (t) {
    case 1:
        for (int i = 0; i < 10; i++){
            cout << *(wskdane+i) << endl;
            cout << *(wsksaldo+i) << endl;
        }
        break;

*(wskdane+i) jest tym samym co wskdane[i] oraz i[wskdane]
jednak wskdane nie wskazuje na tablicę lecz na pojedynczy element.
Użyj jedno z:

  1. konta[i].dane oraz konta[i].saldo
  2. i[konta].dane oraz i[konta].saldo
  3. (i+konta)->dane oraz (i+konta)->saldo
  4. (konta+i)->dane oraz (konta+i)->saldo
  5. (*(konta+i)).dane oraz (*(konta+i)).saldo
  6. (*(i+konta)).dane oraz (*(i+konta)).saldo

Zawsze możesz zmienić pętle na foreach
lub użyć wskaźnika:

for (konto *k=konta;k<konta+10;++k) cout<<k->dane<<endl<<k->saldo<<endl;

http://forum.4programmers.net/1101404
http://forum.4programmers.net/1208091
http://forum.4programmers.net/1086431

0
ikol_20 napisał(a):
struct konto wskkonto;
string *wskdane = &konta->dane;
long long* wsksaldo = &konta->saldo;

co to ma być i jakim cudem miałaby działać na tym arytmetyka wskaźników skoro nie masz tablicy strinngów czy longów ale tablicę struktur ?

3
ikol_20 napisał(a):

Mam problem ze wskażnikami odnoszącymi się do elementów tablicy. Mianowicie gdy zrobię *(wskdane+i) wyrzuca mi nieobsługiwany wątek. Nie mam pojęcia jak to rozwiązać.

Pomijając już styl kodu, poczytałbym na twoim miejscu jak działa arytmetyka wskaźników, i na koniec uznał, że jest to głupie rozwiązanie jej używać, jeśli się nie wie, co się robi.

ikol_20 napisał(a):
for (int i = 0; i < 10; i++){
  cout << *(wskdane+i) << endl;
  cout << *(wsksaldo+i) << endl;
}

Struktura ma 40 bajtów (przynajmniej gcc/clang tak mówi), a ty skaczesz do przodu 32 bajty w tej pętli (rozmiar obiektu std::string) i próbujesz odczytać te bajty jako std::string, tyle że tam zaczyna się long long/int64_t (Twoje saldo), i program się wysypuje (co w sumie jest lepszym rezultatem, niż jakby przypadkiem odczytał to bez problemu).

https://godbolt.org/z/n4sohWd4h

Zrobiłbym tak jak Pan @_13th_Dragon powiedział, a jeszcze lepiej jakby dodatkowo przejść na std::vector, bo widzę też tu wstawianie kont.

1 użytkowników online, w tym zalogowanych: 0, gości: 1