ďťż

Ładny brzuch

Witam

Mój problem wiąże się z błędem kompilatora typu 'constant'. Krytyczny kod na początek:

void CTreeNode::Draw() // wyświetlenie wszystkich wierzchołków zapisanych do węzła głównego { /* W funkcji GenerateNodeMesh do jednej tablicy zostały zapisane dane pochodzące od węzła głównego i wszystkich potomnych - ta funkcja zostaje i tak wywołana tylko dla węzła głównego, więc możemy sobie pozwolić na renderowanie wszystkiego naraz */ // podłączenie tekstury t_ctmTexManager.BindTex2D(0); // rysowanie graniastosłupów for (int k = 0; k < tn_afVertices.Size(); k += 12) { glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex3f(tn_afVertices[k], tn_afVertices[k+1], tn_afVertices[k+2]); glTexCoord2f(1.0f, 0.0f); glVertex3f(tn_afVertices[k+3], tn_afVertices[k+4], tn_afVertices[k+5]); glTexCoord2f(1.0f, 1.0f); glVertex3f(tn_afVertices[k+6], tn_afVertices[k+7], tn_afVertices[k+8]); glTexCoord2f(0.0f, 1.0f); glVertex3f(tn_afVertices[k+9], tn_afVertices[k+10], tn_afVertices[k+11]); glEnd(); } } // void CTreeNode::Draw()

Po próbie kompilacji dostaję takie komunikaty:

1>c:\users\jakub\desktop\tree_new\tree_new\tree_new\ctree.cpp(446) : error C2059: syntax error : 'constant' 1>c:\users\jakub\desktop\tree_new\tree_new\tree_new\ctree.cpp(446) : error C2039: 'k' : is not a member of 'CArrayFloat' 1> c:\users\jakub\desktop\tree_new\tree_new\tree_new\carrayfloat.h(15) : see declaration of 'CArrayFloat' 1>c:\users\jakub\desktop\tree_new\tree_new\tree_new\ctree.cpp(446) : error C2143: syntax error : missing ';' before ')' 1>c:\users\jakub\desktop\tree_new\tree_new\tree_new\ctree.cpp(446) : error C2143: syntax error : missing ';' before ')' 1>c:\users\jakub\desktop\tree_new\tree_new\tree_new\ctree.cpp(447) : error C2143: syntax error : missing ';' before '{' 1>c:\users\jakub\desktop\tree_new\tree_new\tree_new\ctree.cpp(448) : error C2039: 'glBegin' : is not a member of 'CArrayFloat' 1> c:\users\jakub\desktop\tree_new\tree_new\tree_new\carrayfloat.h(15) : see declaration of 'CArrayFloat' 1>c:\users\jakub\desktop\tree_new\tree_new\tree_new\ctree.cpp(450) : error C2039: 'glTexCoord2f' : is not a member of 'CArrayFloat' 1> c:\users\jakub\desktop\tree_new\tree_new\tree_new\carrayfloat.h(15) : see declaration of 'CArrayFloat' //... (i tak dalej)

Szukałem już na forach podobnego przypadku, ale niestety nie znalazłem. Pierwsza linijka wyjścia kompilatora tyczy się deklaracji fora:

for (int k = 0; k < tn_afVertices.Size(); k += 12)

Mimo szczerych chęci, nie widzę tutaj niczego niestosownego. tn_afVertices to obiekt klasy CArrayFloat, która wcześniej działała bez zarzutu (a nic w niej nie zmieniałem) - jest to samorozszerzalna tablica, podobna w działaniu do std::vector, ale tylko dla typu float. Zatem wykluczam możliwość błędu w pliku definicji CArrayFloat. Size to metoda CArrayFloat, która zwraca ilość elementów w kontenerze, a tn_afVertices[i], to odwołanie do elementu o indeksie i - te fragmenty kodu działały już przy innej okazji, więc jest ok. Elementy tn_afVertices zostały wcześniej podane. Co do obiektu t_ctmTexManager - jest to napisany wcześniej manager tekstur, z którym także wszystko wcześniej działało.

Tym większe jest moje zdziwienie - zwłaszcza, że kompilator wyraźnie rozpoznaje wszystkie następne polecenia (nawet glBegin) jako elementy klasy CArrayFloat, co jest lekkim absurdem. Szukałem już, czy w kodzie nie ma samotnie pozostawionego

tn_afVertices.

Ale nie znalazłem.

Czy ktoś ma jakiekolwiek pomysły, co się dzieje? W razie czego, jestem w stanie podać większy kod, choć wydaje mi się, że problem jest gdzieś we wnętrzu metody Draw, tylko ja tego nie mogę zauważyć. Zwłaszcza, że w innych projektach podobny kod działał.

Pozdrawiam i dziękuję



Jestem pewien, że błąd jest wcześniej. Wklej resztę kodu.

cos w stylu brakujacy srednik lub podobne...

Oto deklaracja struktury w pliku CTreeNode:

#include <list> // predefiniowane stałe do określenia sposobu generacji węzłów #define MAX_GENERATIONS 3 #define MIN_LENGTH 0.5f #define MAX_LENGTH 1.0f #define MIN_PITCH -5.0f #define MAX_PITCH 5.0f #define MIN_CHILD_PITCH_ADJUST 45.0f #define MAX_CHILD_PITCH_ADJUST 60.0f struct CTreeNode { float tn_fLength; // długość float tn_fYaw; // obrót wokół osi y float tn_fPitch; // obrót wokół osi x float tn_fR; // współrzędna r koloru float tn_fG; // współrzędna g koloru float tn_fB; // współrzędna b koloru std::list<CTreeNode*> tn_lChildren; // lista potomków węzła CTreeNode* tn_tnPtrToNext; // wskaźnik na nast. węzeł CArrayFloat tn_afVertices; // tablica z wierzchołkami CTreeNode(); // konstruktor ~CTreeNode(); // destruktor float LocalToWorldX (float); // przekształcenie współrzędnej x z macierzy lokalnej do globalnej float LocalToWorldY (float); // przekształcenie współrzędnej y z macierzy lokalnej do globalnej float LocalToWorldZ (float); // przekształcenie współrzędnej z z macierzy lokalnej do globalnej void GenerateNodeMesh (bool, float, float); // generacja graniastosłupa drzewa dla danego węzła void Draw(); // wyświetlenie wszystkich wierzchołków zapisanych do węzła głównego void DrawWireNode(); // wyświetlenie siatki węzła (odcinka łączącego punkty) };

A to metody umieszczone PRZED nieszczęśliwą metodą Draw():

CTreeNode::CTreeNode() // konstruktor { tn_tnPtrToNext = NULL; tn_afVertices.Clear(); } CTreeNode::~CTreeNode() // destruktor { // zwolnienie pamięci po elementach listy std::list<CTreeNode*>::iterator it; for (it = tn_lChildren.begin(); it != tn_lChildren.end(); ++it) { delete (*it); } if (tn_tnPtrToNext) { delete tn_tnPtrToNext; tn_tnPtrToNext = NULL; } } float CTreeNode::LocalToWorldX (float point) // przekształcenie współrzędnej x z macierzy lokalnej do globalnej { float matrix[16]; float coord_rs; glGetFloatv(GL_MODELVIEW_MATRIX, matrix); coord_rs = point + matrix[12] * matrix[0] + matrix[13] * matrix[1] + matrix[14] * matrix[2]; return coord_rs; } float CTreeNode::LocalToWorldY (float point) // przekształcenie współrzędnej y z macierzy lokalnej do globalnej { float matrix[16]; float coord_rs; glGetFloatv(GL_MODELVIEW_MATRIX, matrix); coord_rs = point + matrix[12] * matrix[4] + matrix[13] * matrix[5] + matrix[14] * matrix[6]; return coord_rs; } float CTreeNode::LocalToWorldZ (float point) // przekształcenie współrzędnej z z macierzy lokalnej do globalnej { float matrix[16]; float coord_rs; glGetFloatv(GL_MODELVIEW_MATRIX, matrix); coord_rs = point + matrix[12] * matrix[8] + matrix[13] * matrix[9] + matrix[14] * matrix[10]; return coord_rs; } void CTreeNode::GenerateNodeMesh (bool first, float trunksize, float branchsize) // generacja graniastosłupa drzewa dla danego węzła { /* Każdy węzeł jest otoczony niepełnym graniastosłupem (bez podstaw) na bazie sześciokąta foremnego Jeśli obliczamy węzeł główny - będzie to graniastosłup zwężony ku górze Przekszałcenia same determinują punkt (0, 0) aktualnego układu - trzeba je tylko przełożyć na współrzędne globalne świata Kolejne wartości x to -t/2, t/2, t i -t Kolejne wartości z to tg(60)*t/2, 0, -tg(60)*t/2 Gdzie t to grubość bryły węzła Kolejność oznaczania wierzchołków: E D /-----\ F | | C \-----/ A B */ // obrót węzła glRotatef(tn_fYaw, 0, 1, 0); glRotatef(tn_fPitch, 0, 0, 1); // przesunięcie do następnego węzła glTranslatef(0, tn_fLength, 0); // obliczenie wartości dzielenia tangensa 60 stopni przez 2 - ta wartość // będzie mnożona przez grubość dla współrzędnych z // obliczenie też połowy grubości float devz = SQRT3 * 0.5f; float half_t = trunksize * 0.5f; float half_b = branchsize * 0.5f; // przejście po kolejnych węzłach if (!tn_lChildren.empty()) { std::list<CTreeNode*>::iterator it; for (it = tn_lChildren.begin(); it != tn_lChildren.end(); ++it) { glPushMatrix(); // tworzenie graniastosłupa w zależności od rodzaju węzła if (first) // jeśli pierwszy (korzeń-pień), to zwężający się graniastosłup { /* pierwszy quad */ // punkt A (dół) tn_afVertices.Add(LocalToWorldX(-half_t)); tn_afVertices.Add(LocalToWorldY(-tn_fLength)); tn_afVertices.Add(LocalToWorldZ(devz * trunksize)); // punkt B (dół) tn_afVertices.Add(LocalToWorldX(half_t)); tn_afVertices.Add(LocalToWorldY(-tn_fLength)); tn_afVertices.Add(LocalToWorldZ(devz * trunksize)); // punkt B (góra) tn_afVertices.Add(LocalToWorldX(half_B)); tn_afVertices.Add(LocalToWorldY(0)); tn_afVertices.Add(LocalToWorldZ(devz * branchsize)); // punkt A (góra) tn_afVertices.Add(LocalToWorldX(-half_B)); tn_afVertices.Add(LocalToWorldY(0)); tn_afVertices.Add(LocalToWorldZ(devz * branchsize)); /* drugi quad */ // punkt B (dół) tn_afVertices.Add(LocalToWorldX(half_t)); tn_afVertices.Add(LocalToWorldY(-tn_fLength)); tn_afVertices.Add(LocalToWorldZ(devz * trunksize)); // punkt C (dół) tn_afVertices.Add(LocalToWorldX(trunksize)); tn_afVertices.Add(LocalToWorldY(-tn_fLength)); tn_afVertices.Add(LocalToWorldZ(0)); // punkt C (góra) tn_afVertices.Add(LocalToWorldX(branchsize)); tn_afVertices.Add(LocalToWorldY(0)); tn_afVertices.Add(LocalToWorldZ(0)); // punkt B (góra) tn_afVertices.Add(LocalToWorldX(half_B)); tn_afVertices.Add(LocalToWorldY(0)); tn_afVertices.Add(LocalToWorldZ(devz * branchsize)); /* trzeci quad */ // punkt C (dół) tn_afVertices.Add(LocalToWorldX(trunksize)); tn_afVertices.Add(LocalToWorldY(-tn_fLength)); tn_afVertices.Add(LocalToWorldZ(0)); // punkt D (dół) tn_afVertices.Add(LocalToWorldX(half_t)); tn_afVertices.Add(LocalToWorldY(-tn_fLength)); tn_afVertices.Add(LocalToWorldZ(-devz * trunksize)); // punkt D (góra) tn_afVertices.Add(LocalToWorldX(half_B)); tn_afVertices.Add(LocalToWorldY(0)); tn_afVertices.Add(LocalToWorldZ(-devz * branchsize)); // punkt C (góra) tn_afVertices.Add(LocalToWorldX(branchsize)); tn_afVertices.Add(LocalToWorldY(0)); tn_afVertices.Add(LocalToWorldZ(0)); /* czwarty quad */ // punkt D (dół) tn_afVertices.Add(LocalToWorldX(half_t)); tn_afVertices.Add(LocalToWorldY(-tn_fLength)); tn_afVertices.Add(LocalToWorldZ(-devz * trunksize)); // punkt E (dół) tn_afVertices.Add(LocalToWorldX(-half_t)); tn_afVertices.Add(LocalToWorldY(-tn_fLength)); tn_afVertices.Add(LocalToWorldZ(-devz * trunksize)); // punkt E (góra) tn_afVertices.Add(LocalToWorldX(-half_B)); tn_afVertices.Add(LocalToWorldY(0)); tn_afVertices.Add(LocalToWorldZ(-devz * branchsize)); // punkt D (góra) tn_afVertices.Add(LocalToWorldX(half_B)); tn_afVertices.Add(LocalToWorldY(0)); tn_afVertices.Add(LocalToWorldZ(-devz * branchsize)); /* piąty quad */ // punkt E (dół) tn_afVertices.Add(LocalToWorldX(-half_t)); tn_afVertices.Add(LocalToWorldY(-tn_fLength)); tn_afVertices.Add(LocalToWorldZ(-devz * trunksize)); // punkt F (dół) tn_afVertices.Add(LocalToWorldX(-trunksize)); tn_afVertices.Add(LocalToWorldY(-tn_fLength)); tn_afVertices.Add(LocalToWorldZ(0)); // punkt F (góra) tn_afVertices.Add(LocalToWorldX(-branchsize)); tn_afVertices.Add(LocalToWorldY(0)); tn_afVertices.Add(LocalToWorldZ(0)); // punkt E (góra) tn_afVertices.Add(LocalToWorldX(-half_B)); tn_afVertices.Add(LocalToWorldY(0)); tn_afVertices.Add(LocalToWorldZ(-devz * branchsize)); /* szósty quad */ // punkt F (dół) tn_afVertices.Add(LocalToWorldX(-trunksize)); tn_afVertices.Add(LocalToWorldY(-tn_fLength)); tn_afVertices.Add(LocalToWorldZ(0)); // punkt A (dół) tn_afVertices.Add(LocalToWorldX(-half_t)); tn_afVertices.Add(LocalToWorldY(-tn_fLength)); tn_afVertices.Add(LocalToWorldZ(devz * trunksize)); // punkt A (góra) tn_afVertices.Add(LocalToWorldX(-half_B)); tn_afVertices.Add(LocalToWorldY(0)); tn_afVertices.Add(LocalToWorldZ(devz * branchsize)); // punkt F (góra) tn_afVertices.Add(LocalToWorldX(-branchsize)); tn_afVertices.Add(LocalToWorldY(0)); tn_afVertices.Add(LocalToWorldZ(0)); } // if (first) else { /* pierwszy quad */ // punkt A (dół) tn_afVertices.Add(LocalToWorldX(-half_B)); tn_afVertices.Add(LocalToWorldY(-tn_fLength)); tn_afVertices.Add(LocalToWorldZ(devz * branchsize)); // punkt B (dół) tn_afVertices.Add(LocalToWorldX(half_B)); tn_afVertices.Add(LocalToWorldY(-tn_fLength)); tn_afVertices.Add(LocalToWorldZ(devz * branchsize)); // punkt B (góra) tn_afVertices.Add(LocalToWorldX(half_B)); tn_afVertices.Add(LocalToWorldY(0)); tn_afVertices.Add(LocalToWorldZ(devz * branchsize)); // punkt A (góra) tn_afVertices.Add(LocalToWorldX(-half_B)); tn_afVertices.Add(LocalToWorldY(0)); tn_afVertices.Add(LocalToWorldZ(devz * branchsize)); /* drugi quad */ // punkt B (dół) tn_afVertices.Add(LocalToWorldX(half_B)); tn_afVertices.Add(LocalToWorldY(-tn_fLength)); tn_afVertices.Add(LocalToWorldZ(devz * branchsize)); // punkt C (dół) tn_afVertices.Add(LocalToWorldX(branchsize)); tn_afVertices.Add(LocalToWorldY(-tn_fLength)); tn_afVertices.Add(LocalToWorldZ(0)); // punkt C (góra) tn_afVertices.Add(LocalToWorldX(branchsize)); tn_afVertices.Add(LocalToWorldY(0)); tn_afVertices.Add(LocalToWorldZ(0)); // punkt B (góra) tn_afVertices.Add(LocalToWorldX(half_B)); tn_afVertices.Add(LocalToWorldY(0)); tn_afVertices.Add(LocalToWorldZ(devz * branchsize)); /* trzeci quad */ // punkt C (dół) tn_afVertices.Add(LocalToWorldX(branchsize)); tn_afVertices.Add(LocalToWorldY(-tn_fLength)); tn_afVertices.Add(LocalToWorldZ(0)); // punkt D (dół) tn_afVertices.Add(LocalToWorldX(half_B)); tn_afVertices.Add(LocalToWorldY(-tn_fLength)); tn_afVertices.Add(LocalToWorldZ(-devz * branchsize)); // punkt D (góra) tn_afVertices.Add(LocalToWorldX(half_B)); tn_afVertices.Add(LocalToWorldY(0)); tn_afVertices.Add(LocalToWorldZ(-devz * branchsize)); // punkt C (góra) tn_afVertices.Add(LocalToWorldX(branchsize)); tn_afVertices.Add(LocalToWorldY(0)); tn_afVertices.Add(LocalToWorldZ(0)); /* czwarty quad */ // punkt D (dół) tn_afVertices.Add(LocalToWorldX(half_B)); tn_afVertices.Add(LocalToWorldY(-tn_fLength)); tn_afVertices.Add(LocalToWorldZ(-devz * branchsize)); // punkt E (dół) tn_afVertices.Add(LocalToWorldX(-half_B)); tn_afVertices.Add(LocalToWorldY(-tn_fLength)); tn_afVertices.Add(LocalToWorldZ(-devz * branchsize)); // punkt E (góra) tn_afVertices.Add(LocalToWorldX(-half_B)); tn_afVertices.Add(LocalToWorldY(0)); tn_afVertices.Add(LocalToWorldZ(-devz * branchsize)); // punkt D (góra) tn_afVertices.Add(LocalToWorldX(half_B)); tn_afVertices.Add(LocalToWorldY(0)); tn_afVertices.Add(LocalToWorldZ(-devz * branchsize)); /* piąty quad */ // punkt E (dół) tn_afVertices.Add(LocalToWorldX(-half_B)); tn_afVertices.Add(LocalToWorldY(-tn_fLength)); tn_afVertices.Add(LocalToWorldZ(-devz * branchsize)); // punkt F (dół) tn_afVertices.Add(LocalToWorldX(-branchsize)); tn_afVertices.Add(LocalToWorldY(-tn_fLength)); tn_afVertices.Add(LocalToWorldZ(0)); // punkt F (góra) tn_afVertices.Add(LocalToWorldX(-branchsize)); tn_afVertices.Add(LocalToWorldY(0)); tn_afVertices.Add(LocalToWorldZ(0)); // punkt E (góra) tn_afVertices.Add(LocalToWorldX(-half_B)); tn_afVertices.Add(LocalToWorldY(0)); tn_afVertices.Add(LocalToWorldZ(-devz * branchsize)); /* szósty quad */ // punkt F (dół) tn_afVertices.Add(LocalToWorldX(-branchsize)); tn_afVertices.Add(LocalToWorldY(-tn_fLength)); tn_afVertices.Add(LocalToWorldZ(0)); // punkt A (dół) tn_afVertices.Add(LocalToWorldX(-half_B)); tn_afVertices.Add(LocalToWorldY(-tn_fLength)); tn_afVertices.Add(LocalToWorldZ(devz * branchsize)); // punkt A (góra) tn_afVertices.Add(LocalToWorldX(-half_B)); tn_afVertices.Add(LocalToWorldY(0)); tn_afVertices.Add(LocalToWorldZ(devz * branchsize)); // punkt F (góra) tn_afVertices.Add(LocalToWorldX(-branchsize)); tn_afVertices.Add(LocalToWorldY(0)); tn_afVertices.Add(LocalToWorldZ(0)); } // else // generacja wierzchołków dla kolejnych potomków (*it)->GenerateNodeMesh(false, trunksize, branchsize); glPopMatrix(); } // for (it = tn_lChildren.begin(); it != tn_lChildren.end(); ++it) } // if (!tn_lChildren.empty()) // jeśli istnieje następny węzeł, to liczy także dla niego if (tn_tnPtrToNext) { tn_tnPtrToNext->GenerateNodeMesh(false, trunksize, branchsize); } } // void CTreeNode::GenerateNodeMesh (bool first, float trunksize, float branchsize)

Pozdrawiam
Użytkownik SceNtriC edytował ten post 06 luty 2009, 23:19


Zrobiłem nowy projekt w VS, wkleiłem Twój kod, na początku pliku dodałem odpowiednie definicje i nagłówki tak, aby kompilator nie rzucał się, że brakuje jakiejś klasy czy metody. Kompiluje się bez błędów.

Tak jak mówił fernandez: błędy wskazują na brak średnika, nawiasu albo czegoś podobnego dużo wcześniej. Widocznie problem powoduje zawartość któregoś z plików .h, które dołączasz na początku .cpp zawierającego definicję struktury, którą przedstawiłeś. Przejrzyj dokładnie cały kod, testuj fragmenty (np. przetestuj tylko klasę CArrayFloat w osobnym projekcie itp.). Najlepszą metodą jest wrzucanie w komentarze poszczególnych fragmentów kodu tak długo, aż aplikacja będzie kompilowała się bez błędów. Jeśli dalej będziesz miał problemy, to napisz.
Użytkownik Kozack edytował ten post 07 luty 2009, 01:34

Zrobiłem nowy projekt w VS, wkleiłem Twój kod, na początku pliku dodałem odpowiednie definicje i nagłówki tak, aby kompilator nie rzucał się, że brakuje jakiejś klasy czy metody. Kompiluje się bez błędów.

Tak jak mówił fernandez: błędy wskazują na brak średnika, nawiasu albo czegoś podobnego dużo wcześniej. Widocznie problem powoduje zawartość któregoś z plików .h, które dołączasz na początku .cpp zawierającego definicję struktury, którą przedstawiłeś. Przejrzyj dokładnie cały kod, testuj fragmenty (np. przetestuj tylko klasę CArrayFloat w osobnym projekcie itp.). Najlepszą metodą jest wrzucanie w komentarze poszczególnych fragmentów kodu tak długo, aż aplikacja będzie kompilowała się bez błędów. Jeśli dalej będziesz miał problemy, to napisz.


Rozumiem, będę musiał szukać głębiej.

Co do CArrayFloat, to była ona używana już do obsługi kolizji, renderowania trawy i innych rzeczy wymagających ogromnej ilości wierzchołków i działało bez zarzutu bez żadnej zmiany :) To po prostu "bazowa" część frameworka 3D do gier, który tworzę od jakiegoś czasu.

No nic, faktycznie może coś się pokićkało przy przenoszeniu/przypadkowym wciśnięciu klawisza. Dzięki za pomoc, będę dalej próbował ;)

Pozdrawiam

Cały czas się męczę. Próbowałem już:

- wykomentowywać inne metody klasy CTreeNode
- zamieniać strukturę CArrayFloat na najprostszą możliwą
- zamienić pętlę for na while
- tworzyć nowy projekt z zubożałym kodem
- clean i rebuilding istniejącego projektu

Wszystkie te testy generowały ten sam (bądź podobny) błąd kompilacji.

Wykryłem też, że jeżeli w pętli for zamienię tn_afVertices.Size() (funkcja zwracają wielkość kontenera) na jakąkolwiek stałą - kompilacja przepuści kod. Jeśli tylko usunę odwołanie do metody Size, wszystko się kompiluje. Ta metoda jest jednak niezbędna, bo od niej zależy, ile wierzchołków jest w bazie, czyli ile quadów wyrenderuję :P

Aż zajrzałem do definicji metody Size, czy gdzieś się czasem nie dodał jakiś znak. Wygląda to tak:

(w CArrayFloat.h, w deklaracji klasy CArrayFloat)

void SortMinMax(); // sortowanie tablicy od elementu najmniejszego do największego unsigned Size(); // wielkość tablicy float* Get(); // zwraca wskaźnik na wszystkie elementy tablicy

(w CArrayFloat.cpp, w definicji klasy CArrayFloat)

void CArrayFloat::SortMinMax() // sortowanie tablicy od elementu najmniejszego do największego { // początkowa wartość indeksu krytycznego oraz zmienna trzymająca pętlę unsigned index = a_uQuantity - 1; bool end = false; // przeszukiwanie tablicy od początku w poszukiwaniu indesu krytycznego (gdzie należy wstawić ostatni element) for (unsigned i = 0; i < a_uQuantity && !end; ++i) { if (a_fArray[i] > a_fArray[a_uQuantity-1]) // jeśli znaleziony został taki element { index = i; // zapisanie indeksu end = true; // zatrzymanie pętli } } // zapisanie wartości ostatniego elementu float temp = a_fArray[a_uQuantity-1]; // przesunięcie wszystkich elementów w prawo for (unsigned i = a_uQuantity - 2; i >= index; --i) { a_fArray[i+1] = a_fArray[i]; } // ustawienie ostatniego elementu w odpowiednie miejsce a_fArray[index] = temp; } // void CArrayFloat::SortMinMax() unsigned CArrayFloat::Size() // wielkość tablicy { // zwraca wielkość tablicy return a_uQuantity; } float* CArrayFloat::Get() // zwraca wskaźnik na wszystkie elementy tablicy { return a_fArray; }

Naprawdę zastanawia mnie jedno - dlaczego ten błąd pojawia się teraz, podczas gdy przy wcześniejszych kilkunastu programach korzystałem z tej konstrukcji pętli bez żadnego problemu? Metoda Size() była używana chyba na wszystkie możliwe sposoby - i jako jedyna chyba z klasy nigdy mnie nie zawiodła :P Jakby ktoś był zainteresowany (chciałby pogrzebać w tej klasie), to umieściłem ją niegdyś tutaj.

Pozdrawiam

U mnie w MS i GCC Twoja pętla for przechodzi, ale niestety sama klasa CArrayFloat zawiera błędy, ponieważ próba dodania elementu wywala cały program ;)

Załóżmy, że masz 0 elementów. Funkcja "Add": tworzysz tablicę o rozmiarze 0, pętla się nie wykona, usuwasz tablicę, tworzysz tablicę o rozmiarze 1, kopiujesz elementy z tablicy o rozmiarze 0, do tablicy o rozmiarze 1. Powinno być "for (unsigned i = 0; i < a_uQuantity - 1; ++i)".

Funkcj SortMinMax: pętla "for (unsigned i = a_uQuantity - 2; i >= index; --i)"; skoro a_uQuantity = 1, to a_uQuantity - 2 = -1, ale zmienna jest typu unsigned, czyli liczby nieujemne ;)
Użytkownik Kozack edytował ten post 08 luty 2009, 19:51
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •