» »

[C#] IndexOutOfRange Exception

[C#] IndexOutOfRange Exception

ql000 ::

Živ vsem skupaj!

Pripel sem kodo, ki ima dve for zanki. Zunanja šteje število slik, notranja pa nalaga vsebino manjšega vektorja (velikosti 640*3) v večji vektor (velikosti 640*3*število slik). Po moji matematiki zadeva drži vodo. Pravtako sem ta del kode stestiral v čisto standalone programčku, in zadeva tam tudi deluje. V main programu pa kljub vsemu konstantno dobivam IndexOutOfRange Exception. Česar ne vidim?!


            Single[] CameraTempCoordXYZVector = new Single[640 * 3];
            Single[] CameraCoordintesXYZ = new Single[640 * 3 * FrameNo];

            Int32 k = 0;

            #endregion

            for (i = 0; i < FrameNo; i++ ) // FrameNo = 60
            {
                virtPict = Array2Array.Array2ArrayCopy(FrameBuffer, i*FrameSize, FrameSize);
                InputImageByteField = virtPict;     // Vsebino VirtPict prekopiram v novo bytno polje

                #region Zakomentirana koda za obdelavo slik
                //virtBitmap = Bmp2Byte.BytesToBmp(virtPict, virtBitmapSize); // Bytna polja zapakiramo nazaj v bitmap
                //virtBitmap.RotateFlip(RotateFlipType.Rotate180FlipX);       // novonastal bitmap še zarotiram za 180°

                //virtBitmap.Save(@"c:\programi\mybitmap" + i + ".png");      // Shranimo posamezen bitmap na disk
                #endregion

                #region Obdelava koordinat
                // Funkcija s katero dobim profil in intenziteto črt (barvo profila)
                TrackLine_Simple(InputImageByteField, ImageAfter1Filter, ImageAfter2Filter, 640, 480*3, DetectedLine, IntensityOnLine);

                Transformation3D(DetectedLine, 640, 1, ProfilVKamero, XCaCoord, YCaCoord, ZCaCoord);
                CameraTempCoordXYZVector = Array2Array.XYZCoordinatesVector(640 * 3, XCaCoord, YCaCoord, ZCaCoord);

                k = 0;

                // DEL KODE, KI ME ZEZA
                for (j = i * CameraTempCoordXYZVector.Length; j < i * CameraTempCoordXYZVector.Length + CameraTempCoordXYZVector.Length; j++ )
                {
                    CameraCoordintesXYZ[j] = CameraTempCoordXYZVector[k]; // TU PRIDE DO LAPSUSA!!!!!!
                    k = k + 1;

                    switch (k)
                    {
                        case 1920: // 640*3 = 1920
                            k = 0;
                        break;
                    }
                }

            }   // End for
  • odklenilo: snow ()

salesky ::

Ja zakaj maš v notranji zanki "i*CameraTempCoordXYZVector.Length" in potem prišteješ še en CameraTempCoordXYZVector.Length. Tukaj pride napaka, ker prekoračiš velikost CameraTempCoordXYZ.

Ni tako?

for (j = i * CameraTempCoordXYZVector.Length; j < i * CameraTempCoordXYZVector.Length + CameraTempCoordXYZVector.Length; j++ )

Zgodovina sprememb…

  • spremenil: salesky ()

ql000 ::

Iterator v notranji for zanki mora potovati po večjem vektorju. Npr. pri i=0, zgleda for zanka tako:

for (j = 0; j < 1920; j++)
{
  koda....
}


pri i = 1:
for (j = 1920; j < 1920 + 1920; j++)
{
  koda....
}


Po vektorju CameraTempCoordXYZVector pa itak šari iterator k, ki ga na začetku postavim na 0, povečujem znotraj notranje for zanke, in ko je dovolj velik, da ne prekorači velikosti CameraTempCoordXYZVector se resetira zopet na 0.

ql000 ::

Fak, če jaz štekam! Zadeva je začela delovati ampak šele potem, ko naredim to:

 CameraCoordintesXYZ = Array2Array.XYZCoordinatesVector(640 * 3, XCaCoord, YCaCoord, ZCaCoord); 
, kar nima veze, ker tega vektorja sploh ne uprabljam za to! Če ne naredim tega, do tega vektorja sploh ne morem dostopat. Tudi taka banalija kot je
 CameraCoordintesXYZ[0] = 0; 
ne deluje in mi prevajalnik vrže IndexOutOfRange Exception. Mislim jebena magija!

Zgodovina sprememb…

  • spremenil: ql000 ()

frudi ::

Single[] CameraCoordintesXYZ = new Single[640 * 3 * FrameNo];


A je tukaj spremenljivka FrameNo slučajno 0? V tem primeru boš nastavil velikost arraya na 0, kar je sicer dovoljeno, ampak rahlo nepraktično :). Posledično pri vsakem nastavljanju vrednosti elementom arraya dobiš IndexOutOfRange exception. Tudi pri CameraCoordintesXYZ[0] = 0.

edit: sicer pa - debugger is your friend. Nastavi breakpoint na vrstico:
CameraCoordintesXYZ[j] = CameraTempCoordXYZVector[k];

in preveri v Watch oknu, v kakšnem stanju sta arraya CameraCoordintesXYZ in CameraTempCoordXYZVector (predvsem njuna dolžina v primerjavi z indeksi j in k.
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)

Zgodovina sprememb…

  • spremenilo: frudi ()

ql000 ::

Spremenljivka FrameNo je 60, no v vsakem primeru ni nič, ker pol najpomembnejši del programa ne bi delal :D! Oba vektorja zasedeta deklarirni vrednosti, sam hec je v tem, da v debuggerju za CameraCoordintesXYZ, ko pride program v for zanko piše "Cannot obtain value of local or argument". Na netu sem že nekaj gledal, samo priznam, da ne preveč zagnano. Moram še par fint preizkusit, sam meni ta situacija res ni jasna.

off topic: a mogoče obstaja kaka varijanta, da za kak iterator, ki ga gledam v debuggerju nastavim recimo poljubno vrednost? Recimo imam iterator, ki gre od 0 do 1000, pa da mi ni treba 1000 krat pritiskat F5.

frudi ::

Lahko postaviš conditional breakpoint. Pač nastaviš pogoj i == 1000. Nastaviš pa to preko Breakpoint okna...

Kakšno je pa stanje spremenljivk CameraCoordintesXYZ in CameraTempCoordXYZVector pred for zanko? Oziroma, na kateri točki med njuno inicializacijo in for zanko se zjebeta? Postavi breakpoint na
Single[] CameraTempCoordXYZVector = new Single[640 * 3];
daj CameraCoordintesXYZ in CameraTempCoordXYZVector v Watch okno in korak po korak spremljaj, kaj se dogaja z arrayema.

Aha, še to - ali se slučajno lahko ta metoda izvaja sočasno večkrat ali imaš samo 1 thread?
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)

darkolord ::

Samo nekaj mimogrede glede debugginga. Če želiš karkoli zalaufat/pogledat/spremenit med debuggingom, pritisneš Ctrl + Alt + I, tako da se odpre Immediate Window in tja notri kucaš

Zgodovina sprememb…

  • spremenilo: darkolord ()

ql000 ::

Evo ravno, ko sem pisal nov post, kjer sm izlival svoj žolč, me je prešinlo, da bi deklaracije teh dveh vektorjev in iteratorja k počil na vrh programa. In glej ga zlomka, zadeva proradila. Ampak meni še zmerom ni jasno kaj zavraga ga je motlo?! Na istem mestu sem imel deklariranih mali miljon drugih spremenljivk. Mislim, jaz bom rodil, preden mi bo vse špilalo :(!

off topic: hvala za debug finte. Bi morala bit kaka sticky tema glede debugiranja. :\


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

tekstura [c++ opengl]

Oddelek: Programiranje
9858 (643) matej94
»

python problem

Oddelek: Programiranje
131386 (1126) Isotropic
»

C# in slika iz kamere

Oddelek: Programiranje
61268 (1152) ql000
»

[C#] Sesutje aplikacije

Oddelek: Programiranje
111534 (1369) Jean-Paul
»

Kako bi naredil en ultra simple programček?

Oddelek: Programiranje
492243 (1524) AtaStrumf

Več podobnih tem