Problem z du?żą pętęlką

0

Witam
Mam problem z następującą pętelką

[code]
int ** nr_chrom;
nr_chrom = new int *[wielk_pop];

puts("\nTworzenie macierzy dla populacji.\n");
for(long i=0; i<wielk_pop; i++)
{
//Progress(progress_counter, i);
nr_chrom[i] = new int[dl_chrom];
//progress_counter++;
printf("%ld \r", i);
}[/code]

pętelka się nie kończy .. .przekręca sie przy wartości i = ok 32000, czyli górna granica inta. Ale przecież i jest zadeklarowane jako long. Nie wiem dlaczego.
Używam Borland c++ 3.11.

0

moze

unsigned long int

pomoze.

0

Wystarczy samo unsigned / unsigned int, ewentualnie unsigned short / unsigned short int. Przy okazji... Dla trybu 16-bit tablice mają rozmiary 16bit (max 64kB), stąd i indeksy mieszczą się w zakresie 2-bajtowego nieozanczonego inta.

Jeśli potrzebujesz tablice większą niz 64kB...

main(){
  typ** tablica;
  long ilosckomorek=... // twoje dane, wiecej niz 65536, stąd long;
  unsigned count=0

x

8000/sizeof(typ); // ile komorek miesci sie w 32kB
  unsigned j=ilosckomorek%count;   // ile komorek w ostatniej tablicy
  unsigned i=(ilosckomorek/count)+(j>0); // ile w sumie tablic tablic bedzie
  unsigned k=i;

  tablica=new(typ*)[i]; // przydzielamy pamiec tablicy tablic
  if(j)tablica[--i]=new typ[j]; // ostatnia, niepelna linijka
  while(i--)tablica[i]=new typ[count]; //  while(i)tablica[--i]=new typ[count]; // pelne linijki.

  long l; //- indeks komorki; 0..ilosckomorek-1
  typ zmienna;
  
  zmienna=tablica[l/count][l%count];
  tablica[l/count][l%count]=zmienna;

  while(k--)delete tablica[k]; // zapamietac, zaby wiedziec ile zwolnic
  delete tablica;
}

Rozmiar 0x8000 jest arbitralnie ustalony, jest obojetny, byleby był mniejszy od 0xffff

// pisałem w sumie, żeby sobie potrenowac. Nie wiem... W twoim przypadku jesli potrzebujesz tablice dlugich tablic, to deklaracja wygladalaby... tablica*** typ. :] hehe. Ale ** wystarczy, by zaalokować cale dostepne 640kB.

0

dzieki flabra za pomoc ale jednak z twoich pomysłów nie skorzystam.
nie żeby były złe ale jednak mniej roboty będę miał obcenym sposobem.
a wiadomo że życie należy sobie ułatwiać [cygaro]
zrobiłem inaczej. Ściągnąłem dev-c++ i tam nie ma problemów. To że używałem bc 3.11 to tylko przyzwyczajenie z uczleni, a złych przyzwyczajeń trzeba się pozbywać.
także powiem to jeszcze raz osobom które będą miały podobne problemy
pod dev-c++ wszystko jest ok.
dodatkowo nie występują błędy z przesuwaniem wskażnika pliku które pod bc 3.11 występowały po przesłaniu wskaźnika do funkcji. Po jej zakonczeniu wskaźnik czasami odmawiał przesuwania się.. nie wiem dlaczego ... teraz tylko dev c++ :-)

0

Dev C++ nie jest tesh taki wspaniały: np. możesz tworzyć tylko 32 bitowe aplikacje :p

0

no fakt ... ale moje problemy rozwiązał i chwała mu za to :-)
może ktoś zna jakieś szczególne problemy pojawiające się w dev'ie ?
bedzie wiadomo na co uważać

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