附录:函数定义

本附录包含所有提供的实用函数和您需要实现的所有函数的函数定义(参数、返回值、错误代码)。

工具:内存分配

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: 打印整数.
参数 a0 int 要打印的整数。
返回值
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)