Vì bạn đang hiển thị trên màn hình LCD, tôi cho rằng đây là hệ thống được nhúng.
Không đặt dữ liệu vào tiêu đề.
Đặt dữ liệu vào tệp C hoặc C++ thông thường. Biên dịch này. Nó chỉ có thể chứa dữ liệu, đó là okay, và làm cho nó dễ dàng để cập nhật.
Sau đó, sử dụng tệp tiêu đề để cấp quyền truy cập vào dữ liệu.
Ví dụ, trong một tập tin images.c:
#include "images.h"
const byte numbers1[MAX_NUMBERS1] = { ... };
byte numbers2[MAX_NUMBERS2]; // will be initialsied to 0
Càng images.h là:
#ifndef _IMAGES_H_
#define _IMAGES_H_
typedef unsigned char byte;
#define MAX_NUMBERS1 (450)
// different constants in case you change something
#define MAX_NUMBERS2 (450)
// even better if you can do const static int MAX_NUMBERS1=450;
// but depends on the compiler
extern const byte numbers1[MAX_NUMBERS1] = { ... };
extern byte numbers2[MAX_NUMBERS2]; // will be initialised to 0
#endif
Sau đó, tất cả các file .c khác trong chương trình có thể truy cập chúng.
Đó là (hầu hết) luôn là ý tưởng tồi khi đặt định nghĩa của biến vào tệp tiêu đề.
Tuyên bố của biến, ví dụ: extern byte numbers2[MAX_NUMBERS2];
đang nói với trình biên dịch C rằng có biến mảng được gọi là numbers2
ở một nơi khác trong chương trình được liên kết cuối cùng. Nếu mối liên kết không nhận được định nghĩa đó (từ một nơi khác) thì nó sẽ gây ra lỗi vì không có khoảng trống cho biến được phân bổ.
Định nghĩa của biến (thông báo không có bên ngoài), ví dụ: byte numbers2[MAX_NUMBERS2];
có hiệu quả nói với trình biên dịch C rằng có một biến mảng được gọi là numbers2
và nó sẽ phân bổ không gian ở đây, trong mã đối tượng kết quả từ tệp nguồn này và điều này sẽ được sử dụng để giữ giá trị của biến trong , chương trình được liên kết.
Không gian cho numbers2
là không cấp bởi trình biên dịch C khi nó thấy một tuyên bố (trước bởi extern
), nó được phân bổ khi nó thấy định nghĩa thực tế (không extern
).Vì vậy, nếu bạn đặt định nghĩa thực tế của bất kỳ biến nào trong một tệp tiêu đề và đưa nó vào nhiều tệp mã nguồn (.c), trình biên dịch C sẽ phân bổ không gian cho biến nhiều hơn một lần. Sau đó, trình liên kết sẽ đưa ra một lỗi (thường là nhiều định nghĩa cùng tên).
Có một vấn đề phức tạp hơn. Nếu, khi lần đầu tiên phát triển chương trình, tệp tiêu đề chỉ được bao gồm là một tệp nguồn, sau đó chương trình sẽ biên dịch và liên kết chính xác. Sau đó, vào một ngày sau đó, nếu tệp nguồn thứ hai bao gồm tiêu đề (có thể ai đó vừa tách tệp mã nguồn ban đầu thành hai tệp), trình liên kết sẽ phát sinh lỗi 'nhiều định nghĩa'. Điều này có thể rất khó hiểu vì chương trình được sử dụng để biên dịch và liên kết, và dường như không có gì thay đổi.
Tóm tắt
Chưa bao giờ phân bổ không gian cho một biến bằng cách đặt một định nghĩa trong một tập tin tiêu đề. Chỉ đặt các khai báo biến trong các tệp tiêu đề.
Tại sao bạn không p ost mã mà bạn có cho đến nay và những lỗi biên dịch bạn đang nhận được? –
Bạn không thể '# define' một cái gì đó như thế. Hãy suy nghĩ về nó; mỗi khi bạn sử dụng nó, bạn sẽ khai báo một mảng mới. Tất nhiên điều đó sẽ dẫn đến nhiều định nghĩa lại. Macro là cách thay thế văn bản đơn giản. Thay thế bản thân văn bản và xem nó có hợp lý không. –