Shop OBEX P1 Docs P2 Docs Learn Events
Array kept showing the last element??? — Parallax Forums

Array kept showing the last element???

MacTuxLinMacTuxLin Posts: 821
edited 2011-03-08 08:06 in Propeller 1
Think I'm going @@ trying to find this in such a simple code.
CON
  '--- --- --- --- --- ---  
  'System
  '--- --- --- --- --- ---  
  _clkmode = xtal1 + pll16x
  _xinfreq = 5_000_000
  _ConClkFreq = ((_clkmode - xtal1) >> 6) * _xinfreq
  _Ms_001   = _ConClkFreq / 1_000
  _Us_001   = _ConClkFreq / 1_000_000
  
  '--- --- --- --- --- ---  
  'uSD
  '--- --- --- --- --- ---  
  _sd_DO = 16 
  _sd_CLK = 17 
  _sd_DI = 18 
  _sd_CS = 19 
  _sd_WP = -1 ' -1 ifnot installed.
  _sd_CD = -1 ' -1 ifnot installed.

  _sd_MaxFilesPerDir = 512   'Max number of filenames per dir

  '--- --- --- --- --- ---  
  'RTC
  '--- --- --- --- --- ---  
  _rtc_DAT = 29    ' -1 ifnot installed.
  _rtc_CLK = 28    ' -1 ifnot installed.

  '*** *** *** *** *** *** ***
  '*** Debugging ***
  '*** *** *** *** *** *** ***
  _dbgBaudRate = 250_000

OBJ
  uSD : "SD3.01_FATEngine.spin" 
  STR : "ASCII0_STREngine.spin"
  DBG : "ParallaxSerialTerminal.spin"

VAR
  long sdFiles[_sd_MaxFilesPerDir]   'Array for storing total number of files

PUB Main | buffer, i, k

  '*** *** *** *** *** ***
  '*** Debugging ***
  '*** *** *** *** *** ***
  DBG.Start(_dbgBaudRate)
   

  '--- --- --- --- --- --- --- --- ---
  '--- --- uSD Cog --- ---
  '--- --- --- --- --- --- --- --- --- 
  ifnot(uSD.FATEngineStart(_sd_DO, _sd_CLK, _sd_DI, _sd_CS, _sd_WP, _sd_CD, _rtc_DAT, _rtc_CLK, -1))      'SD 3.0
    reboot

  'Mounting the uSD card first
  uSD.mountPartition(0)    'v3.0

  
  '--- Read & store all files on uSD to array
  bytefill(@sdFiles, 0, _sd_MaxFilesPerDir)   

  dbg.Char(0)
  dbg.Str(String("Read from uSD"))
  dbg.Char(13)
  dbg.Str(String("============="))
  dbg.Char(13)
  i := 0

  uSD.listEntries("W")   'v3.0

  repeat while(buffer := uSD.listEntries("N"))   'v3.0
    sdFiles[i++] := buffer
    dbg.Str(buffer)
    dbg.Str(String(" - Cntr: "))
    dbg.Dec(i-1)
    dbg.Str(String(" "))
    dbg.Str(sdFiles[i-1])   '<--Output shows this stored correctly
    dbg.Char(13)

       
  '*** Debugging
  'Reading out to Terminal
  dbg.Char(13)
  dbg.Char(13)
  dbg.Str(String("Reading from Array"))
  dbg.Char(13)
  dbg.Str(String("=================="))
  dbg.Char(13)
  dbg.Str(String("Total files : "))
  dbg.Dec(i)
  dbg.Char(13)
  repeat k from 0 to i
    dbg.Str(sdFiles[k])   '<-- Keeps showing the last element???
    dbg.Char(13)


The storing portion output correctly but when I read the array again, it kept showing the last element??
Read from uSD
=============
PUTTY.EXE    - Cntr: 0 PUTTY.EXE
CHIMES.WAV   - Cntr: 1 CHIMES.WAV
DESKTOP.INI  - Cntr: 2 DESKTOP.INI
CHORD.WAV    - Cntr: 3 CHORD.WAV
DING.WAV     - Cntr: 4 DING.WAV
IR_BEGIN.WAV - Cntr: 5 IR_BEGIN.WAV
IR_END.WAV   - Cntr: 6 IR_END.WAV
IR_INTER.WAV - Cntr: 7 IR_INTER.WAV
NOTIFY.WAV   - Cntr: 8 NOTIFY.WAV
RECYCLE.WAV  - Cntr: 9 RECYCLE.WAV
RINGOUT.WAV  - Cntr: 10 RINGOUT.WAV
TADA.WAV     - Cntr: 11 TADA.WAV
B00000.AU    - Cntr: 12 B00000.AU
B00001.AU    - Cntr: 13 B00001.AU
B00002.AU    - Cntr: 14 B00002.AU
B00003.AU    - Cntr: 15 B00003.AU
B00004.AU    - Cntr: 16 B00004.AU
B00005.AU    - Cntr: 17 B00005.AU
B00006.AU    - Cntr: 18 B00006.AU
B00007.AU    - Cntr: 19 B00007.AU
B00008.AU    - Cntr: 20 B00008.AU
B00009.AU    - Cntr: 21 B00009.AU
B00036.AU    - Cntr: 22 B00036.AU
B00037.AU    - Cntr: 23 B00037.AU
B00038.AU    - Cntr: 24 B00038.AU
B00039.AU    - Cntr: 25 B00039.AU
B00040.AU    - Cntr: 26 B00040.AU
B00041.AU    - Cntr: 27 B00041.AU
B00042.AU    - Cntr: 28 B00042.AU
B00043.AU    - Cntr: 29 B00043.AU
B00044.AU    - Cntr: 30 B00044.AU
B00045.AU    - Cntr: 31 B00045.AU
B00046.AU    - Cntr: 32 B00046.AU
B00047.AU    - Cntr: 33 B00047.AU
B00048.AU    - Cntr: 34 B00048.AU
B00049.AU    - Cntr: 35 B00049.AU
B00050.AU    - Cntr: 36 B00050.AU
B00051.AU    - Cntr: 37 B00051.AU
B00052.AU    - Cntr: 38 B00052.AU
B00053.AU    - Cntr: 39 B00053.AU
B00054.AU    - Cntr: 40 B00054.AU
B00055.AU    - Cntr: 41 B00055.AU
B00056.AU    - Cntr: 42 B00056.AU
B00057.AU    - Cntr: 43 B00057.AU
B00058.AU    - Cntr: 44 B00058.AU
B00059.AU    - Cntr: 45 B00059.AU
B00060.AU    - Cntr: 46 B00060.AU
B00061.AU    - Cntr: 47 B00061.AU
B00062.AU    - Cntr: 48 B00062.AU
B00063.AU    - Cntr: 49 B00063.AU
B00064.AU    - Cntr: 50 B00064.AU
B00065.AU    - Cntr: 51 B00065.AU
B00066.AU    - Cntr: 52 B00066.AU
B00067.AU    - Cntr: 53 B00067.AU
B00068.AU    - Cntr: 54 B00068.AU
B00069.AU    - Cntr: 55 B00069.AU
B00070.AU    - Cntr: 56 B00070.AU
B00071.AU    - Cntr: 57 B00071.AU
B00072.AU    - Cntr: 58 B00072.AU
B00073.AU    - Cntr: 59 B00073.AU
B00074.AU    - Cntr: 60 B00074.AU
B00075.AU    - Cntr: 61 B00075.AU
B00076.AU    - Cntr: 62 B00076.AU
B00077.AU    - Cntr: 63 B00077.AU
B00078.AU    - Cntr: 64 B00078.AU
B00079.AU    - Cntr: 65 B00079.AU
B00080.AU    - Cntr: 66 B00080.AU
B00081.AU    - Cntr: 67 B00081.AU
B00082.AU    - Cntr: 68 B00082.AU
B00083.AU    - Cntr: 69 B00083.AU
B00084.AU    - Cntr: 70 B00084.AU
B00085.AU    - Cntr: 71 B00085.AU
B00086.AU    - Cntr: 72 B00086.AU
B00087.AU    - Cntr: 73 B00087.AU
B00088.AU    - Cntr: 74 B00088.AU
B00089.AU    - Cntr: 75 B00089.AU
B00090.AU    - Cntr: 76 B00090.AU
B00091.AU    - Cntr: 77 B00091.AU
B00092.AU    - Cntr: 78 B00092.AU
B00093.AU    - Cntr: 79 B00093.AU
B00094.AU    - Cntr: 80 B00094.AU
B00095.AU    - Cntr: 81 B00095.AU
B00096.AU    - Cntr: 82 B00096.AU
B00097.AU    - Cntr: 83 B00097.AU
B00098.AU    - Cntr: 84 B00098.AU
B00099.AU    - Cntr: 85 B00099.AU
B00100.AU    - Cntr: 86 B00100.AU
B00101.AU    - Cntr: 87 B00101.AU
B00102.AU    - Cntr: 88 B00102.AU
B00103.AU    - Cntr: 89 B00103.AU
B00104.AU    - Cntr: 90 B00104.AU
B00105.AU    - Cntr: 91 B00105.AU
B00106.AU    - Cntr: 92 B00106.AU
B00107.AU    - Cntr: 93 B00107.AU
B00108.AU    - Cntr: 94 B00108.AU
B00109.AU    - Cntr: 95 B00109.AU
B00110.AU    - Cntr: 96 B00110.AU
B00111.AU    - Cntr: 97 B00111.AU
B00112.AU    - Cntr: 98 B00112.AU
B00113.AU    - Cntr: 99 B00113.AU
B00114.AU    - Cntr: 100 B00114.AU
B00115.AU    - Cntr: 101 B00115.AU
B00116.AU    - Cntr: 102 B00116.AU
B00117.AU    - Cntr: 103 B00117.AU
B00118.AU    - Cntr: 104 B00118.AU
B00119.AU    - Cntr: 105 B00119.AU
B00120.AU    - Cntr: 106 B00120.AU
B00121.AU    - Cntr: 107 B00121.AU
B00122.AU    - Cntr: 108 B00122.AU
B00123.AU    - Cntr: 109 B00123.AU
B00124.AU    - Cntr: 110 B00124.AU
B00125.AU    - Cntr: 111 B00125.AU
B00126.AU    - Cntr: 112 B00126.AU
B00127.AU    - Cntr: 113 B00127.AU
B00128.AU    - Cntr: 114 B00128.AU
B00129.AU    - Cntr: 115 B00129.AU
B00130.AU    - Cntr: 116 B00130.AU
B00131.AU    - Cntr: 117 B00131.AU
B00132.AU    - Cntr: 118 B00132.AU
B00133.AU    - Cntr: 119 B00133.AU
B00134.AU    - Cntr: 120 B00134.AU
B00135.AU    - Cntr: 121 B00135.AU
B00136.AU    - Cntr: 122 B00136.AU
B00137.AU    - Cntr: 123 B00137.AU
B00138.AU    - Cntr: 124 B00138.AU
B00139.AU    - Cntr: 125 B00139.AU
B00140.AU    - Cntr: 126 B00140.AU
B00141.AU    - Cntr: 127 B00141.AU
B00142.AU    - Cntr: 128 B00142.AU
B00143.AU    - Cntr: 129 B00143.AU
B00144.AU    - Cntr: 130 B00144.AU
B00145.AU    - Cntr: 131 B00145.AU
B00146.AU    - Cntr: 132 B00146.AU
B00147.AU    - Cntr: 133 B00147.AU
B00148.AU    - Cntr: 134 B00148.AU
B00149.AU    - Cntr: 135 B00149.AU
B00150.AU    - Cntr: 136 B00150.AU
B00151.AU    - Cntr: 137 B00151.AU
B00152.AU    - Cntr: 138 B00152.AU
B00153.AU    - Cntr: 139 B00153.AU
B00154.AU    - Cntr: 140 B00154.AU
B00155.AU    - Cntr: 141 B00155.AU
B00156.AU    - Cntr: 142 B00156.AU
B00157.AU    - Cntr: 143 B00157.AU
B00158.AU    - Cntr: 144 B00158.AU
B00159.AU    - Cntr: 145 B00159.AU
B00160.AU    - Cntr: 146 B00160.AU
B00161.AU    - Cntr: 147 B00161.AU
B00162.AU    - Cntr: 148 B00162.AU
B00163.AU    - Cntr: 149 B00163.AU
B00164.AU    - Cntr: 150 B00164.AU
B00165.AU    - Cntr: 151 B00165.AU
B00166.AU    - Cntr: 152 B00166.AU
B00167.AU    - Cntr: 153 B00167.AU
B00168.AU    - Cntr: 154 B00168.AU
B00169.AU    - Cntr: 155 B00169.AU
B00170.AU    - Cntr: 156 B00170.AU
B00171.AU    - Cntr: 157 B00171.AU
B00172.AU    - Cntr: 158 B00172.AU
B00173.AU    - Cntr: 159 B00173.AU
B00174.AU    - Cntr: 160 B00174.AU
B00175.AU    - Cntr: 161 B00175.AU
B00176.AU    - Cntr: 162 B00176.AU
B00177.AU    - Cntr: 163 B00177.AU
B00178.AU    - Cntr: 164 B00178.AU
B00179.AU    - Cntr: 165 B00179.AU
B00180.AU    - Cntr: 166 B00180.AU
B00181.AU    - Cntr: 167 B00181.AU
B00182.AU    - Cntr: 168 B00182.AU
B00183.AU    - Cntr: 169 B00183.AU
B00184.AU    - Cntr: 170 B00184.AU
B00185.AU    - Cntr: 171 B00185.AU
B00186.AU    - Cntr: 172 B00186.AU
B00187.AU    - Cntr: 173 B00187.AU
B00188.AU    - Cntr: 174 B00188.AU
B00189.AU    - Cntr: 175 B00189.AU
B00190.AU    - Cntr: 176 B00190.AU
B00191.AU    - Cntr: 177 B00191.AU
B00192.AU    - Cntr: 178 B00192.AU
B00193.AU    - Cntr: 179 B00193.AU
B00194.AU    - Cntr: 180 B00194.AU
B00195.AU    - Cntr: 181 B00195.AU
B00196.AU    - Cntr: 182 B00196.AU
B00197.AU    - Cntr: 183 B00197.AU
B00198.AU    - Cntr: 184 B00198.AU
B00199.AU    - Cntr: 185 B00199.AU
B00200.AU    - Cntr: 186 B00200.AU
B00201.AU    - Cntr: 187 B00201.AU
B00202.AU    - Cntr: 188 B00202.AU
B00203.AU    - Cntr: 189 B00203.AU
B00204.AU    - Cntr: 190 B00204.AU
B00205.AU    - Cntr: 191 B00205.AU
B00206.AU    - Cntr: 192 B00206.AU
B00207.AU    - Cntr: 193 B00207.AU
B00208.AU    - Cntr: 194 B00208.AU
B00209.AU    - Cntr: 195 B00209.AU
B00210.AU    - Cntr: 196 B00210.AU
B00211.AU    - Cntr: 197 B00211.AU
B00212.AU    - Cntr: 198 B00212.AU
B00213.AU    - Cntr: 199 B00213.AU
B00214.AU    - Cntr: 200 B00214.AU
B00215.AU    - Cntr: 201 B00215.AU
B00216.AU    - Cntr: 202 B00216.AU
B00217.AU    - Cntr: 203 B00217.AU


Reading from Array
==================
Total files : 204
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU
B00217.AU

Appreciate anyone to help me rid this boo-boo. Thanks a lot!!!

Comments

  • Mike GMike G Posts: 2,702
    edited 2011-03-08 05:06
      repeat while(buffer := uSD.listEntries("N"))   'v3.0
        sdFiles[i++] := buffer
    

    You're saving the string pointer but not the string. I'm guessing that uSD.listEntries("N") writes to the same buffer space each time it runs. That's what I would do else how would you know when to clear the buffer?

    What happens if you output the pointer value and not a string?
    repeat k from 0 to i
        dbg.dec(sdFiles[k])   '<-- Keeps showing the last element???
        dbg.Char(13)
    

    I think you need something like this
    PUB PushDir(startAddress, numberOfBytes) | e
    
      ' Pointer to the end of the string
      e := directoryStackPtr[directoryStackDepth] + numberOfBytes
      
      bytemove(directoryStackPtr[directoryStackDepth], startAddress, numberOfBytes)
      bytefill(e, STR_TERM, 1)
      directoryStackPtr[++directoryStackDepth]  :=  e+1
    
  • MacTuxLinMacTuxLin Posts: 821
    edited 2011-03-08 07:25
    Thank you for taking a look at this, Mike. Appreciates it. ... (sigh) I hate strings...

    Yes, I learnt about the string pointer thingy in my last boo-boo but what I don't get it is:
        dbg.Str(sdFiles[i-1])   '<--Output shows this stored correctly
    
    This shows correctly so can I safely say that sdFiles[] contains the correct string pointers?

    If so, then the below should show the same data, right?
        dbg.Str(sdFiles[k])   '<-- Keeps showing the last element???
    

    But it shows only the last element...? I'll try your method when I'm back office tomorrow. I'll also might want to change the ParallaxSerialTerminal to FullDuplexSerialExt ....

    Thanks a lot!!
  • jazzedjazzed Posts: 11,803
    edited 2011-03-08 07:52
    The problem is that "buffer" always contains the same value which is always a pointer to the address of unformattedNameBuffer in the sd object. The first loop works because the buffer is always overwritten before printing. At the end of the first loop all of your "sdFiles" array entries will have stored the same number which all point to the last entry.

    One way to solve the problem is using a memory manager to allocate a byte array for each entry. The other way is to define N byte arrays of 13 bytes, and hope that N will be big enough to hold all your entries. In either case, you will need to copy the content of buffer to each one of the byte array entries.

    All things considered, it's probably easier to just use the sd object to get the file name as needed.
  • MacTuxLinMacTuxLin Posts: 821
    edited 2011-03-08 08:06
    :blank: ... goodness gracious me ....:tongue: Now I understand fully :innocent:

    Thanks Jazzed, again! I'll probably re-design my program to just work directly with SD obj. :tongue:
Sign In or Register to comment.