Bubble Sort z pliku

0

Hej,

Chciałem napisać program na Bubble Sorta. Z pliku czytam dane, tzn. liczbę elementów w pierwszej linii, a w drugiej elementy do posortowania.
Zawartość pliku: (liczby są oddzielone spacją)
10
3.4 5.6 7.8 2.3 4 9.8 12.3 5.6 77 3
Chciałem użyć tablicy dynamicznej, by nie wpisywać na sztywno pojemności tablicy. Niestety to nie działa. Co robię źle?

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    int n;
    float liczba;
    float * T = new float[n];


    ifstream plik;
    ofstream wynik;
    plik.open("liczby.txt", ios::in);
    wynik.open("wynik.txt");

    if(plik.good())
    {
        plik >> n;
        for(int i = 0; i < n; i++)
        {
            plik >> T[i];
            cout << T[i] << "   ";
        }
    }

    else
    {
        return 1;
    }

    plik.close();
    wynik.close();

    delete [] T;


    return 0;
}

3

Ile konkretnie wynosi n w momencie tworzenia przez Ciebie tablicy?

2

Dokładnie, masz tam UB, ponieważ w n są śmieci, a Ty wykorzystujesz tą zmienną do alokacji tablicy.

0

Ja mam ostatnio wrażenie że początkujący bardzo często oczekują leniwej ewaluacji, albo próbują identyfikować wszystkie instrukcje w kodzie jako funkcje/wyrażenia do późniejszej ewaluacji.

2
Skynet12 napisał(a):

Niestety to nie działa. Co robię źle?

Zacznij od pełnego określenia:

  • co rozumiesz przez "nie działa"
  • dlaczego sądzisz że "nie działa"
  • w jakim systemie "nie działa"
  • z jakim kompilatorem "nie działa"

W drugiej kolejności zainicjuj "n" (przed alokacją).

0

Właśnie chodzi mi o to żeby to "n" program czytał z pliku. Tak normalnie wszystko działa. Nieistotny jest system lub kompilator...Nie rozumiem też ludzi, którzy wchodzą w temat i coś piszą, ale nie na temat tylko, by osobie zadającej pytania wygarnąć niewiedzę...

1

Właśnie chodzi mi o to żeby to "n" program czytał z pliku.

No ale nie ma problemu z tym, aby czytał z pliku.
Zadałem jednak pytanie, na które chcę, abyś odpowiedział ;-)

Nieistotny jest system lub kompilator

Skąd możesz to wiedzieć, skoro nie wiesz, co jest przyczyną błędu?

0

CodeBlocks wyrzuca std::bad_array_new_length

1
Skynet12 napisał(a):

CodeBlocks wyrzuca std::bad_array_new_length

Pierwszy wynik wyszukiwania i od razu podane możliwe przyczyny:
http://en.cppreference.com/w/cpp/memory/new/bad_array_new_length

(a CodeBlocks nie jest kompilatorem - to tak na przyszłość, pewnie używasz GCC)

0

Czyli wychodzi na to, że muszę statycznie dać rozmiar w tablicy?

1

CodeBlocks wyrzuca std::bad_array_new_length

To w żaden sposób nie odpowiada na zadane przeze mnie pytanie.

Czyli wychodzi na to, że muszę statycznie dać rozmiar w tablicy?

Nie.

0

Nie, chodzi o to że robisz

float * T = new float[n];

a nie masz zainicjalizowanego n !!!!

0

Po co te nerwy? Skąd mam wiedzieć ile liczb będzie w pliku do posortowania? Ja tutaj akurat wiem, że 10. Czy program sam nie może tej magicznej liczby odczytać i na podstawie tego utworzyć tablicy dynamicznej? Odnoszę wrażenie, że niektórzy nie wiedzą w ogóle o co mi chodzi i koniecznie chcą mi udowodnić mój błąd..

0

OK, wrzucę do tej nieszczęsnej "n" jakąś wartość. Program działa tyle, że nie o to mi chodziło... Teraz ta "10", którą mam w pliku jest mi niepotrzebna...

2

Statyczna tablica ma podaną wielkość w trakcie kompilacji, dynamiczna ma w trakcie, czyli jak masz T *array = new float[n]; to te n musi być zainicjalizowane. Najpierw wczytujesz wielkość tablicy a dopiero później ją tworzysz :)
Bardziej łopatologicznie się nie da wytłumaczyć :)

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