附录:函数定义
本附录包含所有提供的实用函数和您需要实现的所有函数的函数定义(参数、返回值、错误代码)。
工具:内存分配
malloc
malloc: 分配堆内存. |
| 参数 |
a0 |
int |
要分配的内存大小(以字节为单位)。 |
| 返回值 |
a0 |
void * |
指向已分配内存的指针。如果分配失败,此值为0。 |
free
free: 释放堆内存. |
| 参数 |
a0 |
void * |
指向要释放的已分配内存的指针。 |
| 返回值 |
无 |
工具:文件操作
fopen
fopen: 打开文件进行读或写. |
| 参数 |
a0 |
char * |
指向文件名字符串的指针。 |
a1 |
int |
权限位。0为只读,1为只写。 |
| 返回值 |
a0 |
int |
文件描述符。此整数可用于其他文件操作函数来引用打开的文件。如果打开文件失败,此值为-1。 |
fread
fread:从文件读取字节到内存缓冲区。后续读取将从文件的后面部分读取。 |
| 参数 |
a0 |
int |
要读取的文件的文件描述符,之前由fopen返回。 |
a1 |
int* |
指向存储读取字节的缓冲区的指针。 |
a2 |
int |
要从文件中读取的字节数。 |
| 返回值 |
a0 |
int |
实际从文件中读取的字节数。如果此值与a2中提供的参数不同,则要么到达文件末尾,要么出现错误。 |
fwrite
fwrite:将内存缓冲区中的字节写入文件。后续写入追加到现有文件的末尾。 |
| 参数 |
a0 |
int |
要写入的文件的文件描述符,之前由fopen返回。 |
a1 |
void * |
指向包含要写入文件内容的缓冲区的指针。 |
a2 |
int |
要写入文件的元素数量。 |
a3 |
int |
每个元素的大小。总共写入a2 × a3字节。 |
| 返回值 |
a0 |
int |
实际写入文件的项数。如果此值与指定的项数(a2)不同,则要么到达文件末尾,要么出现错误。 |
fclose
fclose:关闭文件,保存我们对文件所做的所有写入。 |
| 参数 |
a0 |
int |
要关闭的文件的文件描述符,之前由fopen返回。 |
| 返回值 |
a0 |
int |
成功时为0,否则为-1。 |
工具:打印
print_int
print_int: 打印整数. |
| 参数 |
a0 |
int |
要打印的整数。 |
| 返回值 |
无 |
print_char
print_char: 打印字符. |
| 参数 |
a0 |
char |
要打印的字符。您可以提供ASCII码或直接将字符放入寄存器,如li t0 '\n'。 |
| 返回值 |
无 |
Part A(第一部分)
relu
relu: Task 2. |
| 参数 |
a0 |
int * |
指向整数数组开头的指针。 |
a1 |
int |
数组中整数的数量。您可以假设此参数与整数数组的实际长度匹配。 |
| 返回值 |
无 |
argmax
argmax: Task 3. |
| 参数 |
a0 |
int * |
指向整数数组开头的指针。 |
a1 |
int |
数组中整数的数量。您可以假设此参数与整数数组的实际长度匹配。 |
| 返回值 |
a0 |
int |
最大元素的索引。如果最大元素出现多次,返回最小的索引。 |
dot
dot: Task 4. |
| 参数 |
a0 |
int * |
指向第一个数组开头的指针。 |
a1 |
int * |
指向第二个数组开头的指针。 |
a2 |
int |
计算中要使用的元素数量。 |
a3 |
int |
第一个数组的步长。 |
a4 |
int |
第二个数组的步长。 |
| 返回值 |
a0 |
int |
两个数组的点积,使用给定的元素数量和步长。 |
测试函数
| Loss functions: Task 5. |
| 参数 |
a0 |
int * |
指向第一个输入数组开头的指针。 |
a1 |
int * |
指向第二个输入数组开头的指针。 |
a2 |
int |
数组中整数的数量。 |
a3 |
int * |
指向输出数组开头的指针,结果将存储在此处。 |
| 返回值 |
a0 |
int |
输出数组中元素的总和。(零一损失没有返回值。) |
initialize_zero: Task 5. |
| 参数 |
a0 |
int |
要创建的数组大小。 |
| 返回值 |
a0 |
int * |
指向新分配的零数组的指针。 |
Part B(第二部分)
matmul
matmul: Task 6. |
| 参数 |
a0 |
int * |
指向第一个矩阵A开头的指针(以行主序存储为整数数组)。 |
a1 |
int |
第一个矩阵A的行数(高度)。 |
a2 |
int |
第一个矩阵A的列数(宽度)。 |
a3 |
int * |
指向第二个矩阵B开头的指针(以行主序存储为整数数组)。 |
a4 |
int |
第二个矩阵B的行数(高度)。 |
a5 |
int |
第二个矩阵B的列数(宽度)。 |
a6 |
int * |
指向用于存储结果C的整数数组开头的指针。您可以假设此内存已分配(但未初始化)且有足够空间存储C。 |
| 返回值 |
无 |
read_matrix
read_matrix: Task 7. |
| 参数 |
a0 |
char * |
指向文件名字符串的指针。 |
a1 |
int * |
指向将包含行数的整数的指针。您可以假设这指向已分配的内存。 |
a2 |
int * |
指向将包含列数的整数的指针。您可以假设这指向已分配的内存。 |
| 返回值 |
a0 |
int * |
指向内存中矩阵的指针。 |
write_matrix
write_matrix: Task 8. |
| 参数 |
a0 |
char * |
指向文件名字符串的指针。 |
a1 |
int * |
指向内存中矩阵的指针(存储为整数数组)。 |
a2 |
int |
矩阵的行数。 |
a3 |
int |
矩阵的列数。 |
| 返回值 |
无 |
classify
classify: Task 9. |
| 参数 |
a0 |
int |
argc(提供的参数数量) |
a1 |
char ** |
argv,指向参数字符串数组(char *)的指针 |
a1[1] = *(a1 + 4) |
char * |
指向第一个矩阵文件m0的文件路径字符串的指针。 |
a1[2] = *(a1 + 8) |
char * |
指向第二个矩阵文件m1的文件路径字符串的指针。 |
a1[3] = *(a1 + 12) |
char * |
指向输入矩阵文件input的文件路径字符串的指针。 |
a1[4] = *(a1 + 16) |
char * |
指向输出文件的文件路径字符串的指针。 |
a2 |
int |
如果设为0,则打印分类结果。否则,不打印任何内容。 |
| 返回值 |
a0 |
int |
分类结果(见上文)。 |
错误代码
Part A(第一部分)
| 返回代码 |
异常 |
函数 |
| 26 |
malloc返回错误。 |
initialize_zero (5) |
| 36 |
数组长度小于1。 |
relu (2), argmax (3), dot (4), loss functions (5), initialize_zero (5) |
| 37 |
任一数组的步长小于1。 |
dot (4) |
Part B(第二部分)
| 返回代码 |
异常 |
函数 |
| 26 |
malloc返回错误。 |
read_matrix (7), classify (9) |
| 27 |
fopen返回错误。 |
read_matrix (7), write_matrix (8) |
| 28 |
fclose返回错误。 |
read_matrix (7), write_matrix (8) |
| 29 |
fread未读取正确的字节数。 |
read_matrix (7) |
| 30 |
fwrite未写入正确的字节数。 |
write_matrix (8) |
| 31 |
命令行参数数量不正确。 |
classify (9) |
| 38 |
任一矩阵的高度或宽度小于1。 |
matmul (6) |
| 38 |
第一个矩阵A的列数(宽度)不等于第二个矩阵B的行数(高度)。 |
matmul (6) |