2009-06-24 37 views
9

Đây là mã mà tôi muốn cố gắng viết:C: Sử dụng chức năng memset

#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 
#include <string.h> 
#include <malloc.h> 

int main(int argc, char *argv[]) 
{ 
    float arry[3] = {0}; 

    memset(arry, (int) 10.0, 3*sizeof(float)); 

    return 0; 
} 

Vấn đề của tôi là tôi muốn để xem nếu nó có thể sử dụng memset để làm cho mọi xâm nhập của một mảng được một số khác 0. Tuy nhiên, Sau khi bước qua dòng đó, nội dung mảng thay đổi thành một số rất nhỏ (0). Tôi tự hỏi tôi đang làm gì sai trong trường hợp này bằng cách sử dụng hàm memset(). Tôi hy vọng đây không phải là một bài đăng trùng lặp, vì không có câu hỏi nào liên quan đến đề xuất khi tôi nhập câu hỏi này.

Trả lời

9

Đúc một đôi thành int chỉ tạo số nhị phân 00001010 (10 trong nhị phân) và đó là giá trị được ghi nhớ. Vì nó là một char, mỗi float của bạn thực sự nhận được mẫu bit 00001010 00001010 00001010 00001010.

+0

tức là chỉ cần sử dụng nó để đặt lại các mục nhập của một mảng thành số không, thực tế là nói? – stanigator

+0

Điều đó hoặc nếu bạn đang thiết lập một mảng char có một số giá trị khác có liên quan. –

+0

Hoặc bất kỳ giá trị byte đơn nào. Phổ biến nhất có lẽ là 0, nhưng 0xFF cũng có khả năng được sử dụng rất nhiều. –

7

Bộ nhớ không có một byte đơn và ghi nó vào mảng. Một phao là một loại đa byte.

CHỈNH SỬA: Có, tôi biết memset mất một int. Nhưng nó chỉ sử dụng một unsigned char (một byte đơn) để điền vào.

15

Memset lấy một int, nhưng gán nó vào một unsigned char, và sau đó điền mỗi byte float (sizeof (float) là có lẽ 4) với mẫu bit đó. Nếu đây là C++, thích fill thay vì:

#include <algorithm> 
using namespace std; 

//... 

fill (arry,arry+3,10.0); 
+0

Đề xuất tuyệt vời. Tôi sẽ xem xét sử dụng nó. – stanigator

+1

Và nếu bạn đang ở trong C not C++, sau đó tìm hiểu về các biến thể memset nền tảng cụ thể mà viết các mẫu lớn hơn một char duy nhất. Có memset_pattern4 ví dụ nếu bạn có nó. Hoặc hướng dẫn SIMD. –

2

Trên thực tế thử của bạn là một chút sai lệch, memset hoạt động trên byte .. thực sự sử dụng một phao cho giá trị memset không thực hiện bất kỳ ý nghĩa!

Định dạng phao chỉ có 23 + 1 bit cho mantissa và 8 bit cho số mũ .. khi bạn viết giá trị byte thô (sử dụng memset) bên trong phao bạn không biết bạn đang lấy gì vì bạn đang đặt giá trị sẽ được diễn giải theo một cách khác!

Trong đoạn mã của bạn, bạn cũng chuyển nó sang (int), biến phễu 4 byte chứa 10,0f trong số nguyên 4 byte chứa giá trị 10 .. nhưng như đã nói trước đó nếu bạn nhớ một float với 10 (= 0x0a) bạn sẽ nhận được 0x0A0A0A0A mà không phải là 10.0f ở định dạng float, nó có thể là bất cứ giá trị nào (cũng có cái gì đó rất gần 0, như trong trường hợp của bạn).

Trên thực tế memset rất hữu ích khi bạn muốn khởi tạo một mảng các ký tự (kể từ khi bạn có được một cách hiệu quả giá trị cho mỗi char, vì họ là dài 1 byte) hoặc khi bạn muốn thiết lập tất cả mọi thứ để 0 (NULL) mà làm việc đối với mọi loại dữ liệu cơ bản ..

3

Tại sao không chỉ là vòng lặp for đơn giản?

+3

Nhu cầu về tốc độ là một câu trả lời. – EvilTeach

+0

Toàn bộ câu hỏi của tôi thực sự. – stanigator

+0

Tất cả các memset sẽ làm là đặt bộ nhớ một byte vào lúc đó. Một vòng lặp for sẽ nén qua kích thước byte (arry) byte (float) byte tại một thời điểm. Và không có phí của một cuộc gọi hàm! –