2011-11-21 61 views
7

Tôi đang gặp rắc rối đi qua một loạt các cấu trúc để một hàm trong C.Đi qua một mảng của cấu trúc trong C

tôi đã tạo ra các cấu trúc như thế này trong chính:

int main() 
{ 
    struct Items 
    { 
     char code[10]; 
     char description[30]; 
     int stock; 
    }; 

    struct Items MyItems[10]; 
} 

tôi sau đó truy cập vào nó thích: MyItems[0].stock = 10;, vv

tôi muốn vượt qua nó để một chức năng như vậy:

ReadFile(MyItems); 

Hàm sẽ đọc mảng và có thể chỉnh sửa nó. Sau đó, tôi sẽ có thể truy cập cùng một mảng từ các chức năng khác.

Tôi đã thử nhiều lần khai báo nhưng không có tờ khai nào hoạt động. ví dụ:

void ReadFile(struct Items[10]) 

Tôi đã xem xét các câu hỏi khác, nhưng tất cả chúng đều được thực hiện khác nhau, với typedef và dấu hoa thị. Giáo viên của tôi chưa dạy chúng tôi con trỏ, vì vậy tôi muốn làm điều đó với những gì tôi biết.

Bất kỳ ý tưởng nào? : S

EDIT: Câu trả lời của Salvatore được làm việc sau khi tôi cố định nguyên mẫu của tôi để:

void ReadFile(struct Items[10]); 
+0

Đó là "mã thực". Tôi đang sử dụng nó với Visual studio 2010 và nó hoạt động. : S – lelouch

+1

"Visual Studio" và "nó hoạt động" sẽ không được sử dụng trong một câu trong cuộc trò chuyện lịch sự. Bạn phải nói rõ ràng nếu bạn đang nói về các nền tảng không chuẩn cụ thể; nếu không thì mọi người sẽ cho rằng bạn đang nói về ngôn ngữ ** chuẩn **. –

+1

Ok tôi đã sửa nó. Hy vọng rằng đó là đủ thực tế>. < – lelouch

Trả lời

7
struct Items 
{ 
    char code[10]; 
    char description[30]; 
    int stock; 
}; 

void ReadFile(struct Items items[10]) 
{ 
    ... 
} 

void xxx() 
{ 
    struct Items MyItems[10]; 
    ReadFile(MyItems); 
} 

này trong trình biên dịch của tôi hoạt động tốt. Bạn đang sử dụng trình biên dịch nào? Bạn gặp lỗi gì?

Hãy nhớ khai báo cấu trúc của bạn trước các chức năng của bạn hoặc nó sẽ không bao giờ hoạt động.

+0

Cảm ơn, đã làm việc, sau khi tôi đã sửa mẫu thử nghiệm của mình để làm trống ReadFile (struct Items [10]); – lelouch

0

Tại sao không bạn sử dụng vượt qua con trỏ đến mảng đến các phương pháp mà cần nó?

Nếu bạn muốn cùng một mảng cấu trúc thì bạn nên sử dụng con trỏ tới mảng và không chuyển thành mảng vì sẽ tạo bản sao.

void ReadFile (struct Items * items);

và nơi bạn gọi nó là

struct Items myItems[10]; 
ReadFile(myItems); 

Cần phải cẩn thận với con trỏ ...

+0

Bạn có thể chỉ cho tôi một số mã để làm việc sau không? – lelouch

+0

myItems sẽ cung cấp cho con trỏ đến phần tử thứ 0 của mảng. –

+0

Không có bản sao nào liên quan ở đây, mảng không bao giờ được sao chép. –

0

Bạn khá nhiều phải sử dụng con trỏ cho việc này. Bạn hoạt động sẽ trông như thế này:

void ReadFile(Items * myItems, int numberOfItems) { 
} 
0

Bạn cần phải sử dụng con trỏ đến mảng, sau đó nó dễ dàng để truy cập vào các thành viên của nó

trống ReadFile (Items * bài);

sẽ hoạt động.

0

Vâng, khi bạn vượt qua một cấu trúc như bạn đã làm, nó thực sự tạo ra một bản sao cục bộ của nó trong hàm. Vì vậy, nó sẽ không ảnh hưởng đến cấu trúc ban đầu của bạn, bất kể bạn sửa đổi nó như thế nào trong ReadFile.

Tôi không chắc chắn về một cách tiếp cận khác và điều này có thể không trả lời câu hỏi của bạn, nhưng tôi khuyên bạn nên thử con trỏ. Bạn chắc chắn sẽ sử dụng chúng khá nhiều trong C/C++.Và họ có thể được thực sự hữu dụng khi bạn làm chủ họ

+0

Không đúng, bạn có thể thử điều đó, C đi mảng luôn bằng con trỏ, bạn có thể sửa đổi nó trong ReadFile, sao chép không được tham gia ở đây. –

+0

@SalvatorePreviti Bạn hoàn toàn đúng! Đối với một số lý do lẻ tôi hiểu rằng ông muốn sử dụng cấu trúc trong phương pháp của mình, không phải mảng. -_- – Kaisar

1

Các chức năng sẽ không biết rằng loại struct Items tồn tại nếu bạn chỉ khai báo cục bộ trong phạm vi nội dung chức năng main. Vì vậy, bạn nên xác định bên ngoài struct:

struct Item { /* ... */ }; 

void ReadFile(struct Items[]); /* or "struct Item *", same difference */ 

int main(void) 
{ 
    struct Item my_items[10]; 
    ReadFile(my_items); 
} 

Đây là nguy hiểm dĩ nhiên kể từ ReadFile không có ý tưởng lớn như thế nào mảng là (mảng là luôn thông qua phân rã-to-con trỏ). Vì vậy, bạn thường sẽ thêm thông tin này:

void ReadFile(struct Items * arr, size_t len); 

ReadFile(my_items, 10); 
+0

Mã của bạn đã sửa các lỗi được gạch dưới, nhưng nó vẫn chưa được tạo - tôi nhận được mã này: http: // pastebin.com/HxPTcPmL – lelouch

+0

A) các lỗi không có gì để làm với phần này của mã, B) bây giờ chúng ta đang bối rối về ngôn ngữ một lần nữa - đột nhiên đó là C + + ?? –

+0

lol, xin lỗi tôi đã nhận được mã sai, hãy thử lại. Đó là từ việc thử mã của bạn – lelouch

0

Thay vì tuyên bố của mình, kê khai theo cách đó:

typedef struct { 
     char code[10]; 
     char description[30]; 
     int stock; 
}Items; 

và chức năng như thế:

void ReadFile(Items *items); 

Với typedef bạn định nghĩa một kiểu mới, do đó bạn không cần phải sử dụng từ "struct" mỗi lần.

3

Xác định struct Items ngoài chính. Khi truyền một mảng tới một hàm trong C, bạn cũng nên truyền theo chiều dài của mảng, vì không có cách nào của hàm biết có bao nhiêu phần tử trong mảng đó (trừ khi nó được đảm bảo là một giá trị cố định).

Như Salvatore đã đề cập, bạn cũng phải khai báo (không nhất thiết phải xác định) bất kỳ cấu trúc, chức năng, v.v. trước khi bạn có thể sử dụng chúng. Bạn thường có các cấu trúc và các nguyên mẫu chức năng của bạn trong một tệp tiêu đề trong một dự án lớn hơn.

dưới đây là một thay đổi hoạt động của ví dụ của bạn:

#include <stdio.h> 

struct Items 
{ 
    char code[10]; 
    char description[30]; 
    int stock; 
}; 

void ReadFile(struct Items items[], size_t len) 
{ 
    /* Do the reading... eg. */ 
    items[0].stock = 10; 
} 

int main(void) 
{ 
    struct Items MyItems[10]; 

    ReadFile(MyItems, sizeof(MyItems)/sizeof(*MyItems)); 

    return 0; 
} 
Các vấn đề liên quan