2010-06-13 28 views
5

Tôi chỉ tò mò muốn biết các chiến lược là gì? (Nếu các chiến lược tồn tại).Có thể bắt chước tuples python trong C không?

+0

Trong C++, bạn có thể sử dụng TR1 hoặc Thư viện tăng tốc. – anno

+0

Cảm ơn thông tin, nhưng trong trường hợp của tôi C++ không phải là một tùy chọn. –

+0

Python là một ngôn ngữ động chạy trên một máy ảo. C biên dịch xuống mã máy xương trần. Không có cách nào bạn sẽ nhận được ngữ nghĩa chính xác của một tuple Python trong C. Bạn đang tìm kiếm những đặc điểm nào của bộ torrent Python? Nhóm các số nguyên tố không đổi tùy ý? Nhiều bài tập? Truy cập theo chỉ số mảng? – rossipedia

Trả lời

5

Một mô hình điển hình trong C để thực hiện một đối tượng có thể chứa một trong một số loại cơ bản khác nhau là sử dụng một yếu tố struct chứa trong đó là một union của các loại cơ bản có thể có thể được lưu trữ và một phần tử là enum xác định loại nào trong số những loại này là union đang được sử dụng trong trường hợp này.

Sau đó, bạn có thể sử dụng một mảng các đối tượng như vậy, có thể được biểu diễn dưới dạng struct chứa một số mục và con trỏ đến bộ nhớ cho các mục đó.

ví dụ: một cái gì đó như thế này:

#include <stdio.h> 
#include <stdlib.h> 

typedef enum tuple_datatype_e { 
    TUPLE_DATATYPE_INT, 
    TUPLE_DATATYPE_FLOAT, 
    TUPLE_DATATYPE_STRING 
} tuple_datatype_t; 

typedef struct tuple_item_s { 
    tuple_datatype_t datatype; 
    union { 
     int int_val; 
     float float_val; 
     char *string_val; 
    } u; 
} tuple_item_t; 

typedef struct tuple_s { 
    unsigned int n_items; 
    tuple_item_t *items; 
} tuple_t; 

static void print_tuple(tuple_t *t) 
{ 
    unsigned int i; 

    printf("("); 
    for (i = 0; i < t->n_items; i++) { 
     if (i > 0) 
      printf(", "); 
     switch (t->items[i].datatype) { 
     case TUPLE_DATATYPE_INT: 
      printf("%d", t->items[i].u.int_val); 
      break; 
     case TUPLE_DATATYPE_FLOAT: 
      printf("%f", t->items[i].u.float_val); 
      break; 
     case TUPLE_DATATYPE_STRING: 
      printf("\"%s\"", t->items[i].u.string_val); 
      break; 
     } 
    } 
    printf(")\n"); 
} 

int main(void) 
{ 
    tuple_t foo; 

    foo.n_items = 3; 
    foo.items = malloc(sizeof(tuple_item_t) * foo.n_items); 
    foo.items[0].datatype = TUPLE_DATATYPE_INT; 
    foo.items[0].u.int_val = 123; 
    foo.items[1].datatype = TUPLE_DATATYPE_FLOAT; 
    foo.items[1].u.float_val = 4.56; 
    foo.items[2].datatype = TUPLE_DATATYPE_STRING; 
    foo.items[2].u.string_val = "789"; 
    print_tuple(&foo); 

    return 0; 
} 
+0

+1 nhưng a) Tôi sẽ viết các hàm trợ giúp để xử lý việc tạo và quản lý các bộ dữ liệu, b) bạn nên sử dụng 'size_t n_items' thay vì' unsigned int n_items' và c) typenames kết thúc bằng '_t' được dành riêng, vì vậy bạn nên sử dụng một quy ước khác. –

3

Gần nhất với tuples Python trong C có thể là cấu trúc hoặc mảng, tùy thuộc vào cách bạn sẽ sử dụng chúng.

Sử dụng cấu trúc nếu bạn muốn nhóm một số cố định các giá trị liên quan có thể là các loại khác nhau.

Sử dụng mảng nếu bạn muốn có một số giá trị cùng loại và khả năng lập chỉ mục vào mảng.

+0

Có thể xác định các cấu trúc với một số biến của các giá trị (các loại khác nhau) không? Có thể sử dụng MACRO? –

1

Mặc dù không chính xác giống nhau, một mảng const có ít nhất một số thuộc tính giống nhau. Nếu bạn yêu cầu thi đua chính xác hơn, ADT có thể thực hiện thủ thuật.

+0

ADT là gì. (cho những gì tôi biết ADT là viết tắt của Abstract Data Type). –

+0

Có kiểu dữ liệu trừu tượng :) – harald

Các vấn đề liên quan