斯坦福编程范式CS107_18
# 斯坦福编程范式 CS107_18
# 上节课提到的冰淇淋商店模拟问题
我们有一个收银员;十个顾客,会随机买 1 到 4 个冰淇淋;制作冰淇淋的店员,10 到 40 个,每个店员一次只做一个甜筒; 只有一个经理,店员需要将冰淇淋交给经理检查,并且一次只有一个店员进去检查。所以一共有四种线程,一共大概可能 52 个线程。 我们需要一些方式使他们之间能够相互通讯。
显然的店员进办公室需要一把锁,因为一次只能有一个店员进办公室。经理一直都在办公室中等待,直到检查的冰淇淋数量达到一天的要求,所以经理是一个循环。当顾客拿到他们订的冰淇淋后,他们就排队去收银员那里,并且这个队列应该是 FIFO...
more...
斯坦福编程范式CS107_17
# 斯坦福编程范式 CS107_17
# 接着上节课的哲学家问题进餐问题
Semaphore forks[] = {1,1,1,1,1};
void philosopher(int id){
for(int i...
more...
斯坦福编程范式CS107_16
# 斯坦福编程范式 CS107_16
# 接着上节课的多线程卖票例子
void SellTickets(int agent,int *numTicketsp,Semaphore lock){ while(true){ SemaphoreWait(lock); if(* numTicketsp == 0) break; (*numTicketsp)--; SemaphoreSignal(lock); printf(" "); } SemaphoreSignal(lock);}有人会问,如果现在只剩 1...
more...
斯坦福编程范式CS107_14
# 斯坦福编程范式 CS107_14
# 上节课的例子可能没有讲清
void foo(){ int array[4]; int i; for(i=0;i<=4;i++) array[i] -= 4;}执行上述内容,无意间会影响到 saved PC,saved PC 的值刚好减去 4,减去 4 后便会指向 CALL 。当这个 foo 函数返回后,便会再次进入循环。
# 再看一个例子
int main(){ DeclareAndInitArray(); PrintArray();}void...
more...
斯坦福编程范式CS107_13
# 斯坦福编程范式 CS107_13
# 使用 GCC 解释器的例子
main.c 文件
#include <stdlib.h>#include <>#assert <assert.h>int main(){ void *mem = malloc(400); assert(mem != NULL); peintf("Yay! \n"); free(mem); return 0;}上述 main 函数在 gcc 编译器后,生成 main.o...
more...
斯坦福编程范式CS107_12
# 斯坦福编程范式 CS107_12
# 编译过程的三个阶段(接着上节课)
# 预处理阶段
#define 对全局变量进行简单的替换。
#define 对于宏定义的处理
#define MAX(a,b) ((a)>(b))?(a):(b)#define 这种简单的替换在汇编语言中一般就两三行,但如果采用函数的形式,则会需要更多汇编语言,因为函数中的申请变量、返回等操作占用了大量的开销。
这串代码在预处理阶段不会报错。在后续的编译中会报错。
MAX(40.2,"HELLO")assert 的宏定义。是的,assert 在 C...
more...
未命名
# 图像上脆弱性数字水印
# 任务
# 脆弱性数字水印
脆弱性数字水印(Fragile Watermark)是一种数字水印技术,通常用于保护数字图像的完整性。与一般数字水印不同,脆弱性数字水印对图像的修改非常敏感,一旦图像被篡改,水印就会受到破坏,从而使得篡改更容易被检测到。
脆弱性数字水印主要用于验证图像的完整性和真实性。它可以被嵌入到数字图像中,通常通过修改图像的像素或频域信息。当图像被篡改时,水印就会受到破坏,导致可视或计算上的变化。这种类型的数字水印对于需要确保图像未被篡改的场景非常有用,比如法庭上的数字图像证据、数字艺术品的保护等。
分为空间域和频域的信息隐藏。
# 调研
# 5....
more...
斯坦福编程范式CS107_11
# 斯坦福编程范式 CS107_11
# C++ 的汇编
# 构造一个 foo 函数
void foo(){
int x;
int y;
x = 11;
y = 17;
swap(&x,&y);
}
汇编代码
SP = SP - 8;
M[SP + 4] = 11;
M[SP] = 17;
R1 = SP; //&y
R2 = SP + 4; //&x
SP = SP - 8; //为参数申请空间 参数的地址是从右向左看是高地址到低地址
M[SP] = R2;
M[SP + 4] =...
more...
斯坦福编程范式CS107_7
# 斯坦福编程范式 CS107_7
# 使用栈来操纵字符串
接着上节课的栈的结构体
typedef struct{ void *elems; int elemSize; // 泛型中并不知道类型占用字节的大小,所以需要指定 int loglength; int alloclength; }stack;void StackNew(stack *s,int elemSize);void StackDispose(stack *s);void StackPush(stack *s,void *elemAddr);void StackPop(stack...
more...