C массив отображает мусорные данные (проблемы с памятью?) - PullRequest
0 голосов
/ 08 апреля 2009

Я делаю драйвер для матрицы светодиодов 8x8, который я вожу с параллельного порта компьютера. Это были часы, вдохновленные дизайном, который я видел на Tokyoflash.

Часть драйвера представляет собой массив из 3 * 5 числовых «спрайтов», которые рисуются в матрице. Координата матрицы присваивается координате спрайта и так далее, пока на ней не будет нарисован весь спрайт. Этот процесс повторяется для другой цифры со смещением. Я подтвердил, что правильно нарисовал спрайты и что матрица пуста, когда она записывается. Однако, когда я рисую число на матрице, я получаю ошибочные 1 с в Numpad6 для левой цифры, Numpad1 для правой ( Пример с левой цифрой, не нарисованной. )

У меня есть недельный опыт работы в Си, и это сбивает меня с толку.

Вот драйвер полностью, если вы хотите скомпилировать его самостоятельно. Это далеко не закончено.

//8x8 LED MATRIX DRIVER VER 0.1 APR062009
//CLOCK 
// 
//  01234567
// 0    BXXXXXXH  B: Binary Mode Indicator 
// 1    DXXXXXXM  D: Decimal Mode Indicator
// 2    NNNNNNNN  H: Hour Centric Display
// 3    LLLNNRRR  M: Minute Centric Display
// 4    LNLNNRNR  X: Secondary Information 
// 5    LLLNNRRR  L: Left Digit
// 6    LNLNNRNR  R: Right digit
// 7    LLLNNRRR  N: Not Used

#include <stdio.h>
#include <unistd.h>
//#include <math.h>
#include <time.h>
#include </usr/include/sys/io.h>

#define BASEPORT 0x378

int main()
{
//Increasing array parameters to seems to reduce glitching [best 10 5 3]
int Dig[10][5][3] = {0};    //ALPHANUMERIC ARRAY [NUMBER (0..9)][Y(0..4)][X(0..2)]
int Mat[7][7] = {0};        //[ROW][COL], Top L corner = [0][0]
int Aux1[7] = {0};      //Topmost Row
int Aux2[7] = {0};          //Second to Topmost Row
int Clk;    //Clock
int Wait;   //Delay; meant to eventually replace clock in its current state
int C1;     //Counters
int C2;
int C3;
int L;      //Left Digit
int R;      //Right Digit
//break string left undefined atm

//ioperm (BASEPORT, 3, 1);
//outb(0, BASEPORT);
printf("Now running.\n");

//Set Variables

//3D DIGIT ARRAY [Num][Row][Col] (INITIALIZED BY INSTRUCTIONS)
    //Dig array is meant to be read only once initialized
    //3D arrays are unintuitive to declare so the numbers are 
    //"drawn" instead. 

//Horizontals
    //Some entries in the loop may have the variable in the middle
    //coordinate instead of the 3rd and/or with a +2. This is to 
    //incorporate the incomplete columns some numbers have (eg "2") and 
    //saves coding additional loops. 

for(C1=0; C1<=2; C1++){
Dig[0][0][C1]=1; Dig[0][4][C1]=1;
Dig[2][0][C1]=1; Dig[2][2][C1]=1; Dig[2][4][C1]=1; Dig[2][C1][2]=1; Dig[2][C1+2][0]=1;
Dig[3][0][C1]=1; Dig[3][2][C1]=1; Dig[3][4][C1]=1;
Dig[4][2][C1]=1; Dig[4][C1][0]=1; 
Dig[5][0][C1]=1; Dig[5][2][C1]=1; Dig[5][4][C1]=1; Dig[5][C1][0]=1; Dig[5][C1+2][2]=1;
Dig[6][0][C1]=1; Dig[6][2][C1]=1; Dig[6][4][C1]=1; Dig[6][C1+2][2]=1;
Dig[7][0][C1]=1;
Dig[8][0][C1]=1; Dig[8][2][C1]=1; Dig[8][4][C1]=1;
Dig[9][0][C1]=1; Dig[9][2][C1]=1; Dig[9][4][C1]=1; Dig[9][C1][0]=1;
}

//Verticals 

for(C1=0; C1<=4; C1++){
Dig[0][C1][0]=1; Dig[0][C1][2]=1;
Dig[1][C1][2]=1;
Dig[3][C1][2]=1;
Dig[4][C1][2]=1;
Dig[6][C1][0]=1;
Dig[7][C1][2]=1;
Dig[8][C1][0]=1; Dig[8][C1][2]=1;
Dig[9][C1][2]=1;
    }

Clk=10000;

L=2; //Think about incorporating overflow protection for L,R
R=4;

//Print Left Digit to Matrix @ (3, 0)

for(C1=0; C1<=4; C1++){             //For some reason produces column of 1s at numpad 6
    for(C2=0; C2<=2; C2++){     
    Mat[C1+3][C2]=Dig[L][C1][C2]; 
    printf("%d", Dig[L][C1][C2]);       //Debug
    }
printf(" %d %d %d\n", L, C1, C2); //Debug
}

//Print Right Digit to Matrix @ (3, 5)

for(C1=0; C1<=4; C1++){             //For some reason produces column of 1s at numpad 1
    for(C2=0; C2<=2; C2++){
    Mat[C1+3][C2+5]=Dig[R][C1][C2];
    }
}

//X Test Pattern

//for(C1=0; C1<=7; C1++){
//  Mat[C1][C1]=5;      
//  Mat[7-C1][C1]=5;
//}

usleep(Clk);

    //while(1){

//Breakfree [NOT FUNCTIONAL]

//Break_String=getch(); (Getch is not ANSI, need ncurses)

//if(Break_String != -1){
//  if(Break_String = 27){
//  break;
//  }
//}     

//Terminal Display 

//for(C3=0; C3<=9; C3++){           //Debug Digit array [Successful, numbers draw correctly]
//  for(C2=0; C2<=4; C2++){
//      for(C1=0; C1<=2; C1++){
//          printf("%d", Dig[C3][C2][C1]);
//      }
//  printf("\n");
//  }
//printf("\n");
//usleep(1000000); //Debug
//}

usleep(3000000); //Debug

for(C1=0; C1<=7; C1++){             //Prints to terminal every second, when looping 
    for(C2=0; C2<=7; C2++){
    printf("%d", Mat[C1][C2]);
    }
printf("\n");
}

printf("\n"); 

//Hardware Display

for(C1=0; C1<=29; C1++){                //30 Hz
    for(C3=0; C3<=7; C3++){             //COLUMN
        //printf("%d %d \n", C3, C1);       //Loop Debug
        usleep(1000);
        //CLOCK GROUND TO GO HERE, OUT STATUS
        //for(C2=0; C2<=7; C2++){       //PX
            //outb(Mat[C3][C2], BASEPORT);
        //}
    }
usleep(4*Clk);
}

//} 

//ioperm(BASEPORT, 3, 0);
exit(0);
}

Кроме того, я должен был сделать так, чтобы мой массив Sprite ограничивал каждый размер больше, чем он должен был быть, чтобы он работал. Я полагаю, что все это некая память, но я далеко не настолько опытен в Си, чтобы знать, что делать.

Буду очень признателен за любую помощь.

Ответы [ 3 ]

8 голосов
/ 08 апреля 2009

Мне нужно просмотреть это больше, но одна проблема заключается в том, что вы управляете матрицей 8x8 LED, но используете матрицу 7x7 для хранения данных. Объявите вашу матрицу как:

int Mat[8][8];
4 голосов
/ 08 апреля 2009

Брайан, я думаю, что вам просто не хватает фундаментального понимания того, как индексы массивов работают в C.

Когда вы объявляете

int array[N]

Вы получаете доступ к элементам в диапазоне

array[0] ... array[N-1]

, что дает вам всего N элементов.

Например:

int array[4]

дает вам

array[0]
array[1]
array[2]
array[3]

всего 4 элемента.

При зацикливании этого массива почти всегда используется это соглашение:

for(i = 0; i < 4; i++)

Я думаю, что эта проблема вызывает множество проблем в вашем коде, и если вы вернетесь к своим массивам после понимания этого, вы сможете исправить проблемы.

2 голосов
/ 08 апреля 2009

Брайан, я не вижу проблемы на первый взгляд, но то, что вы описываете, звучит так, будто у вас проблема с индексацией массива. (Эмпирическое правило: всякий раз, когда вы думаете, что с компьютером что-то не так, что вызывает ваши ошибки, вы ошибаетесь.)

Два случая, когда новые программисты на С сталкиваются с проблемой, это путается с индексами на основе 0 - массив размером 7 имеет индексы с 0,6 - и не понимая, что массивы просто размещаются поверх капля памяти, поэтому массив [10] [5] [2] - это всего лишь один фрагмент памяти на 100 ячеек. Если вы допустили ошибку при индексировании, вы можете поместить вещи в случайные места.

Я бы просмотрел код и проверил, что находится где-то меньшими шагами; что происходит после одной инициализации, такого рода вещи.

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