PROGMEM -- 2 Arrays? (SOLVED)

Is PROGMEM limited to keeping one array?
Looks I'm running into trouble with two.

No

I can't see anything wrong with the code that you have not posted

Just asking questions, talking theoreticals, first.

It's OK with these arrays PROGMEM'd at the top with all the other declarations etc., but tanks when the variable declarations are preceded with (prepended by?) extern.
It worked with one array extern'd, but not both.
I want to use that (extern) so that I can place both of these considerable arrays at the end of the sketch.

The IDE permits, but the execution bombs.
(It's not coughing up an error hairball.)

You can be theoretical, but there are a few different specific things with it.

Yes, you can create many arrays as PROGMEM. Can you show a test-sketch to show how you use the pointers and declare them extern ?

An Arduino Mega 2560 has more than 64kbyte Flash memory to be used as PROGMEM. Once over the boundery of 64kbyte, everything changes. Many things don't work and the pointer to that memory are not really pointers. See my test: Progmem_far.ino.

I think you can create your own segment names for PROGMEM.

Where is the end of the sketch ? At a higher address ? Why do you want the PROGMEM section to be at a higher address ? If you don't want considerable arrays to be in the middle of your sketch, that is no problem. They are in a different segment.

If you want the PROGMEM to be at a specific location, then there is a bootloader that can write to Flash during runtime and the sketch can use the functions of the bootloader: https://forum.arduino.cc/index.php?topic=332191.0

runaway_pancake:
Just asking questions, talking theoreticals, first.

It's OK with these arrays PROGMEM'd at the top with all the other declarations etc., but tanks when the variable declarations are preceded with (prepended by?) extern.
It worked with one array extern'd, but not both.
I want to use that (extern) so that I can place both of these considerable arrays at the end of the sketch.

The IDE permits, but the execution bombs.
(It's not coughing up an error hairball.)

Are you concerned with where the PROGMEM data is stored on the arduino, or where the array definition is in the sketch?

My code/s exceed 9000 characters (each).
Maybe my understanding of the purpose or proper use of 'extern' is flawed.
I thought that with it I can place the arrays at the end of the sketch (among other things?). My arrays are tedious, well one is (it's for setting bits for characters); so instead of drilling past them to get to the sketch proper I could plop them at the end - because I don't need to deal with them.

I'm using PROGMEM and pgm_read_byte properly.
If I do this --

extern const byte lettermatrix[91][6];
extern const byte matrixConfig[256];

and place those arrays at the end of the sketch, it craters.
(The display field twinkles, sort of neat effect but undesired.)
If I only do with the one or the other then it's fine.

I don't think its considered proper naming convention, but the easiest way to accomplish what you want is to put the array declarations in a file with the extension .h and stored in the same folder as the sketch file, then use #include "filename.h" to insert it into your sketch. Another method is to split the sketch into multiple .ino files, but be aware that the compiler processes the main .ino file first, then any additional .ino files in the same folder in alphabetical order.

@david_2018
I don't need to do that - it works with everything at the top, as it were, and no externs.

I'm just wondering why not with extern. If I have it wrong, maybe somebody can set me straight.
I'll upload the INOs if anyone wants to see them.

runaway_pancake:
My code/s exceed 9000 characters (each).

Make an MRE that demonstrates the issue.

Here’s my MRE (spam a-la king)

extern const byte oddarray [4];
extern const byte evenarray [4];
byte idx;
byte value;

void setup() 
{
  Serial.begin(9600);
}
void loop() 
{
  for(idx = 0 ; idx < 4; idx ++)
  {
    value = pgm_read_byte(&(oddarray[idx]));
    Serial.print(value);
    Serial.print(" - ");
    delay(500);
    value = pgm_read_byte(&(evenarray[idx]));
    Serial.print(value);
    if(idx < 3)
    {
      Serial.print(" - ");
    }
    delay(500);
  }
  Serial.println("");
  delay(2000);
}
const byte oddarray [4] PROGMEM = {1,3,5,7};
const byte evenarray [4] PROGMEM = {2,4,6,8};

Unfortunately . . . it does not result a problem.

HA !
Somehow, the size of the arrays matters
when using byte.
When I change to
uint8_t (instead) – it works.

extern const uint8_t lettermatrix[91][6];
extern const uint8_t matrixConfig[256];

. . .

const uint8_t lettermatrix[91][6] PROGMEM = 
                {
                 B00000000, // 0x20 SPACE
                 B00000000,
                 B00000000,
                 B00000000,
. . .
const uint8_t matrixConfig[256] PROGMEM = {0,8,16,24, . . .