Witam.
Mam pewien problem. Pierwszy raz sie z czymś takim spotkałem i nie bardzo mam pomysł co sie dzieje.
Otóż pisze sobie programik (mniejsza z tym jaki). Mam tam troche struktur, klas, zmiennych itp. I teraz problem. Otóż w pewnym momencie po dodaniu dodatkowych zmiennych (tablic typu char) program nagle zaczyna sie sypać. Dodam, że jedyną zmianą którą robie jest dodanie tylko i wyłącznie dodatkowej zmiennej w strukturze. Nie jest ona nigdzie wykorzystywana (czytana, zapisywana czy coś). Po wykomentarzowaniu nowej zmiennej program śmiga... Czy to możliwe, że mam po prostu za dużo zamiennych, bajzel w pamięci czy coś w tym stylu?
Pokaż kod to może coś się da z tym zrobić.
a mi to wygląda na to, że coś kompilatorowi się pomieszało. Np BCB 6 był taki problem, że czasami po jakieś modyfikacji, jeden moduł nie był re-kompilowany mimo, że powinien.
Moja rada, zrób czystego builda.
Wymuś kompilację wszystkiego od początku (odpowiednia opcja lub wykasować pewne pliki kompilacji).
Inny powód błędu to, że masz gdzieś starą kopię nagłówka i jeden moduł używa nowej wersji a inny starej.
Ad 1: Moge kod pokazać, nie wiem tylko na ile on będzie czytelny, bo uzbierało sie już kilkaset linijek kodu
Ad 2:używam Deva. Build od zera nic nie daje...
Może póki co fragmenty, wg kluczowe:
Struktury:
struct tMat
{
int texID;
unsigned int R,G,B;
char szName[255];
char TexFile[255];
};
struct tObject
{
int numVert;
int numFaces;
char name[255];
tVector3 *vertex;
tVector2 *texCoord;
tVector3 *normals;
tFace *faces;
};
i jedyny moment, w którym wykorzystuje je:
case MATERIAL: //zawiera informacje o materiałach
model -> numMaterial++;
tMat mat;
readMaterialChunk(&mat, tmpChunk);
model -> vMaterials.push_back(mat);
break;
case OBJECT: //zawiera informacje o obiektach
model -> numObject++;
tObject obj;
readObjectChunk(&obj, tmpChunk);
model -> vObjects.push_back(obj);
break;
Dodam, że struktura tMat sprawia problemy, tObject działa wszystko. Po wykomentarzowaniu zmiennych znakowych wszystko działa poprawnie.
w funkcji readMaterialChunk nie korzystam jeszcze w żaden sposób z obiektu mat.
i teraz moment, w którym zdaje sie program wykrzaczać:
void C3dsl::readVertex(tObject *object, tChunk *chunk)
{
chunk -> bytesRead += fread(&(object -> numVert),1,2,filePTR);
std::cout<<" VERTEX: "<<object -> numVert<<std::endl;
object -> vertex = new tVector3[object -> numVert];
for(int i=0;i<object -> numVert;i++)
{
chunk -> bytesRead += fread(&object -> vertex->x,1,4,filePTR);
chunk -> bytesRead += fread(&object -> vertex->y,1,4,filePTR);
chunk -> bytesRead += fread(&object -> vertex->z,1,4,filePTR);
//std::cout<<object -> vertex ->x<<" "<<object -> vertex ->y<<" "<<object -> vertex ->z<<std::endl;
}
po zmianach program źle wczytuje liczbe numVert... Powinna być ona 50, natomiast program wczytuje ją jako 4063282.
w razie czego moge udostępnić całość kodu.
BTW, jakby ktoś pytał, to program ma wczytywać i przetwarzać dane z plików *.3ds
Źle czytasz przez fread :
chunk -> bytesRead += fread(&object -> vertex->x,1,4,filePTR);
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
#include <stdio.h>
size_t fread(void *ptr, ile_razy,rozmiar_danej_w_bajtach, FILE *stream);
MarekR22 napisał(a)
a mi to wygląda na to, że coś kompilatorowi się pomieszało. Np BCB 6 był taki problem, że czasami po jakieś modyfikacji, jeden moduł nie był re-kompilowany mimo, że powinien.
Moja rada, zrób czystego builda.
Wymuś kompilację wszystkiego od początku (odpowiednia opcja lub wykasować pewne pliki kompilacji).
Inny powód błędu to, że masz gdzieś starą kopię nagłówka i jeden moduł używa nowej wersji a inny starej.
FYI: VS2001-2005 tez tak mialy. na VS2008/2010 jeszcze szczesliwie nie trafilo mi sie.
//Na VS2008 przy większym projekcie raz mi się zdarzyło, że po updacie SVN'em linker krzyczał, że mu brakuje definicji których już nie było w kodzie. Dopiero pełny rebuild pomógł - adf88
Źle czytasz przez fread :
Chyba jednak dobrze, w każdym razie, po zmianach program sie wiesza i nie wczytuje nic
A , bo strzeliłem byka , powinno być :
chunk -> bytesRead += fread(&(object -> vertex->x),1,sizeof(object -> vertex->x/*lub typ */),filePTR);
chunk -> bytesRead += fread(&(object -> numVert),1,sizeof(int),filePTR);
masz przydzieloną pamięć dla ' tVector3 *vertex;' ?
pamięć jest przydzielona.
co do tego fread'a to "stara" wersja zdaje sie działać poprawnie. Po prostu wczytuje poprawnie to co ma wczytywać (sprawdzone).
Co do problemu ze wczytywaniem liczby numVert to znika on gdy wykomentarzujemy 2 zmienne typu char ze struktury tMat. I właśnie to jest dla mnie magiczne jaki jest tu w ogóle związek... (w kodzie nijak jedno nie jest powiązane z drugim).
W razie czego moge zamieścić całość kodu, tylko, że jest to kilkaset już lini, więc nie wiem czy ktokolwiek będzie miał ochote na choćby pobieżne przejrzenie
Bez potrzeby , myślę że wystarczy zamieścić fragmenty dotyczące :
1.)tworzenia tObject object do którego odwołujke się fun readVertex (jak jest tworzony).
2.)tworzenia tVertex dla object .
Og. dla 2 i 3 jak przydzielasz pamięć ?
3.)formatu pliku tzn. Jak to jest wszystko zapisane , ile bajtów zajmuje poszczególna
zmienna w pliku i gdzie się znajduje czyli opis formatu pliku .
Event daj gdzieś plik do pobrania .
4.) Podaj Definicję tVector3,tVector2,tFace ( dla pewności )
5.) Kod funkcji readMaterialChunk(&mat, tmpChunk);
Zachowanie w Dev jakie opisałeś występuje przy przypadkowym nadpisywaniu
danych i objawia się właśnie po dodaniu dowolnej zmiennej do struct lub innego bloku danych .