Как исправить «Ошибка включения этой функции: адрес превышает допустимый диапазон» в C - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь создать программу, которая преобразует введенную пользователем букву или цифру в азбуку Морзе, которая затем мигает светодиодом, соответствующим выходу.Я получаю сообщение «Ошибка включения этой функции: адрес превышает допустимый диапазон» при просмотре отладки, и я не уверен, как это исправить.Что мне нужно сделать?

Я попытался найти проблему, и изменение значения массивов, похоже, не изменит ошибку.

#include <stdio.h>
#include <stdlib.h>
#include "msp432.h"
#include <math.h>
#include <string.h>


#define MAX 100
#define SIZE 255


void LED_();
void LED_setup();

int main(){

char string[MAX][SIZE];
char destination[MAX] [MAX] [8];
char *input[38]={

                 ".-",   //A
                 "-...", //B
                 "-.-.", //C
                 "-..",  //D
                 ".",    //E
                 "..-.", //F
                 "--.",  //G
                 "....", //H
                 "..",   //I
                 ".---", //J
                 "-.-",  //K
                 ".-..", //L
                 "--",   //M
                 "-.",   //N
                 "---",  //O
                 ".--.", //P
                 "--.-", //Q
                 ".-.",  //R
                 "...",  //S
                 "-",    //T
                 "..-",  //U
                 "...-", //V
                 ".--",  //W
                 "-..-", //X
                 "-.--", //Y
                 "--..", //Z
                 ".----", //1      //numbers begin here
                 "..---", //2
                 "...--", //3
                 "....-", //4
                 ".....", //5
                 "-....", //6
                 "--...", //7
                 "---..", //8
                 "----.", //9
                 "-----", //0
                 "/"     //space

};

char *output[38]= {
                   "A",
                   "B",
                   "C",
                   "D",
                   "E",
                   "F",
                   "G",
                   "H",
                   "I",
                   "J",
                   "K",
                   "L",
                   "M",
                   "N",
                   "O",
                   "P",
                   "Q",
                   "R",
                   "S",
                   "T",
                   "U",
                   "V",
                   "W",
                   "X",
                   "Y",
                   "Z",
                   "0",
                   "1",
                   "2",
                   "3",
                   "4",
                   "5",
                   "6",
                   "7",
                   "8",
                   "9",
                   "/"
};

char *code, *separator = " ";

int i;
int c;
int j;
int x;
int m[MAX];

printf("Enter the number of cases:");

scanf("%d", &x);
getchar();

for(i = 0; i < x; i++){

    printf("Case#%d: ", i+1);
    gets(string[i]);

}

for(i =0; i < x; i++){
    for(code = strtok(string[i], separator); code != NULL; code = strtok(NULL, separator)){  
        strcpy(destination[i][j++], code);                                                   
    }                                                                                        

    m[i] = j;  
}

for (i = 0; i < x; i++){

    printf("Case#%d: ", i+1);

    for(j = 0; j < m[i]; j++){
        for(c = 0; c < 37; c++){
            if(strcmp(destination[i][j], input[c]) == 0){  
                printf("%s", output[c]);                   
            }
        }

        printf("\n");
        LED_setup();
        LED_();

    }

}
return 0;
}

void LED_(char* mval){   

char* a;

for (a = mval; a != NULL; a++){
    if (*a == '.')
    {
        P4->OUT |= 0x01;    //LED On
        _delay_cycles(500); //Delay 0.5 second
        P4->OUT &= ~0x01;   //LED Off
    }
    else if (*a == '-')
    {
        P4->OUT |= 0x01;     //LED On
        _delay_cycles(1000); //Delay 1 second
        P4->OUT &= ~0x01;    //LED Off
    }
    else
    {
        _delay_cycles(750);  //delay of 3/4 second
    }
}

}

void LED_setup(){

P6->DIR |= 0x01;
P6->OUT &= ~0x01;

} 

1 Ответ

0 голосов
/ 15 февраля 2019

Я получаю сообщение «Ошибка включения этой функции: адрес превышает допустимый диапазон»…

Возможно, вы превысили лимит перевода.В частности, массив char destination[MAX] [MAX] [8] имеет (по крайней мере, если char является байтом) 80000 байтов, что больше минимума, необходимого для реализации, соответствующей стандарту C:

- 65535 байтовв объекте (только в размещенной среде)

Вам не нужен такой большой массив, поскольку вам не нужно сначала преобразовывать все входные строки, а только после этого выводить преобразованный destination на светодиод - вместо этого вы можете конвертировать и выводить по одной строке за раз.Попробуйте переставить вашу программу таким образом, используя char destination[SIZE][6] (максимальная длина кода 5).

Еще одна вещь, которую вы можете попробовать, - переместить большие массивы string и destination в глобальную область видимости - локальную.переменные могут быть более ограничены, чем глобальные переменные реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...