2012-03-23 34 views
6

Tôi có một số mảng nhân vật 450 phần (lưu trữ dữ liệu bitmap để hiển thị trên màn hình LCD.) Tôi muốn đặt chúng dưới một tệp tiêu đề và #define chúng, nhưng tôi vẫn gặp phải lỗi biên dịch. Tôi sẽ làm điều này như thế nào trong C?Xác định mảng trong C

#define numbers[450] {0, 1,etc...}

#define numbers {0, 1, etc...}

#define numbers[450] sau đó thiết lập các con số sau

và nhiều hơn nữa ...

+6

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? –

+1

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. –

Trả lời

9

Vâng ... bạn chắc chắn không cần phải sử dụng một định nghĩa. Chỉ cần thêm chúng vào tiêu đề như const, mảng tĩnh.

/* prevents multiple, redundant includes */ 
/* make sure to use a symbol that is fairly sure to be unique */ 
#ifndef TEST_H 
#define TEST_H 

/* your image data */ 
const char image[] = { 1, 2, 3, 4, ... }; 

#endif 

Ngoài ra, nếu bạn muốn giúp đỡ về một lỗi biên dịch thì bạn nên gửi mã của bạn.

+0

Có, nhưng khi tiêu đề được gọi nhiều lần (Nó là cần thiết trong nhiều phần của chương trình), tôi nhận được lỗi. – Reid

+2

Sau đó, bạn sử dụng [bảo vệ bao gồm] (http://en.wikipedia.org/wiki/Include_guard) và một lần nữa, hiển thị các ví dụ. Tôi không biết ý nghĩa của việc "gọi tiêu đề", nhưng tôi cho rằng bạn có nghĩa là bao gồm. Vì vậy, như tôi đã nói ... ví dụ. Chúng tôi không phải là người tâm linh. :) –

+0

Cảm ơn. Tôi sẽ thử '# ifndef' tôi đã không nghĩ về điều đó. – Reid

6

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 numbers2khô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 đề.

+0

là lý do không bao gồm nó trong một tập tin tiêu đề, vì lý do là nó là một hệ thống nhúng, rằng nó sẽ mất nhiều không gian đĩa? – Abdul

+0

@Abdul - Tôi hy vọng điều đó rõ ràng hơn. Nếu nó là một hệ thống nhúng, thì nó có thể không có đĩa. – gbulmer

+0

đâu là tệp nhị phân thực thi được lưu trữ trong các hệ thống nhúng không có đĩa? – Abdul

1

Tôi đã gặp sự cố tương tự. Trong trường hợp của tôi, tôi cần một mảng các hằng số để sử dụng như kích thước của các mảng tĩnh khác. Khi tôi cố gắng sử dụng

const int my_const_array[size] = {1, 2, 3, ... }; 

và sau đó tuyên bố:

int my_static_array[my_const_array[0]]; 

tôi nhận được một lỗi từ trình biên dịch của tôi:

array bound is not an integer constant 

Vì vậy, cuối cùng tôi đã như sau (Có thể có những cách thanh lịch hơn để làm điều đó):

#define element(n,d) ==(n) ? d : 
#define my_const_array(i) (i) element(0,1) (i) element(1,2) (i) element(2,5) 0 
Các vấn đề liên quan