do{ }while(new_len ==0); 是什么意思
时间: 2024-09-20 21:05:19 浏览: 23
`do{...}while(new_len == 0)` 是一个循环结构,通常用于初始化过程中检测某个条件并持续执行操作直到满足该条件。在这个上下文中,`new_len` 可能是与日志缓冲区(log buffer)相关的变量,表示新设置的日志缓冲长度。
如果`do{}`内的部分是对`log_buf_len`进行设置尝试,比如增大它的值以达到期望的大小,那么这个循环会在每次更改`log_buf_len`后检查`new_len`是否等于0。如果`new_len`仍为0,说明当前设置未生效,循环将继续执行,直到`new_len`不再为0,即成功设置了新的日志缓冲区长度。
例如,在Linux内核的早期启动阶段,可能会有一个过程试图动态调整`log_buf_len`以满足预留内存给日志的需求:
```c
early_param("log_buf_len", log_buf_len_setup);
/* 这里可能有类似的操作 */
do {
set_log_buf_len(new_value);
new_len = get_log_buf_len(); /* 获取新设置后的长度 */
} while (new_len == 0);
```
这里的`set_log_buf_len()` 和 `get_log_buf_len()` 分别代表设置和获取日志缓冲区长度的实际函数调用。只有当`get_log_buf_len()`返回非零值时,循环才会停止,表明缓冲区长度已成功设置。
相关问题
写一段VBA宏,将文件夹 ORG_FILES里面文件名中含有DA,DZ,MP这3种前缀加10位数字后缀完全 一致文件复制生成新的文件放到NEW_FILES下新建的文件夹里,新建的文件夹用这相同的2位前缀和10位数字后缀命名. 这些新建的文件夹名字排序放入ZTE DOC这个表格的A1下面的格子里. ORG_FILES 文件夹位置:C:\Users\DELL\Desktop\ZTE FILE\ORG_FILES NEW_FILES文件夹位置:C:\Users\DELL\Desktop\ZTE FILE\NEW_FILES ZTE DOC表格文件位置:C:\Users\DELL\Desktop\ZTE FILE
以下是一个可能的实现方案:
```
Sub CopyFiles()
Dim org_folder As String
Dim new_folder As String
Dim doc_path As String
Dim doc_name As String
Dim doc As Workbook
Dim ws As Worksheet
Dim prefix As String
Dim suffix As String
Dim file_name As String
Dim new_folder_path As String
Dim new_file_path As String
Dim i As Integer
Dim j As Integer
'设置文件夹和表格路径
org_folder = "C:\Users\DELL\Desktop\ZTE FILE\ORG_FILES\"
new_folder = "C:\Users\DELL\Desktop\ZTE FILE\NEW_FILES\"
doc_path = "C:\Users\DELL\Desktop\ZTE FILE\ZTE DOC.xlsx"
doc_name = "ZTE DOC"
'打开表格
Set doc = Workbooks.Open(doc_path)
Set ws = doc.Worksheets(doc_name)
'遍历文件夹内的文件
i = 1
j = 1
file_name = Dir(org_folder)
Do While file_name <> ""
'判断文件名是否符合要求
If Left(file_name, 2) = "DA" Or Left(file_name, 2) = "DZ" Or Left(file_name, 2) = "MP" Then
If Len(file_name) = 12 And IsNumeric(Right(file_name, 10)) Then
'提取前缀和后缀
prefix = Left(file_name, 2)
suffix = Right(file_name, 10)
'创建新文件夹
new_folder_path = new_folder & prefix & suffix & "\"
If Dir(new_folder_path, vbDirectory) = "" Then
MkDir new_folder_path
'将新文件夹名添加到表格中
ws.Cells(i, j) = prefix & suffix
i = i + 1
End If
'复制文件到新文件夹
new_file_path = new_folder_path & file_name
FileCopy org_folder & file_name, new_file_path
End If
End If
file_name = Dir
Loop
'保存表格和关闭文件
doc.Save
doc.Close
End Sub
```
这个宏会遍历指定的文件夹,对于每个符合要求的文件,将其复制到新建的文件夹中,并将新文件夹名添加到指定的表格中。请将代码复制到 VBA 编辑器中并保存文件后运行。在运行之前,请确保文件夹和表格的路径正确,并且表格中的第一个单元格是空的。
一个能够进行语法分析并生成三地址代码的微型编译程序,输入数据举例:while (a3+15)>0xa do if x2 = 07 then while y<z do y = x * y / z; 正确结果:等效的三地址代码序列 L1: t1 := a3 + 15 if t1 > 10 goto L2 goto L0 L2: L3: if x2 > 7 goto L4 goto L1 L4: if y < z goto L5 goto L1 L5: t2 = x * y t3 = t2 / z y = t3 goto L3 goto L1 L0: //S.next
以下是一个能够进行语法分析并生成三地址代码的微型编译程序的示例代码。输入的数据为 while (a3+15)>0xa do if x2 = 07 then while y<z do y = x * y / z; ,输出为等效的三地址代码序列。
```
import re
# 定义语法分析器
class Parser:
def __init__(self, input_str):
self.input_str = input_str
self.index = 0
# 解析表达式
def expression(self):
if self.next_char() == '(':
self.consume('(')
result = self.expression()
self.consume(')')
else:
result = self.variable()
while self.next_char() in ['+', '-']:
op = self.next_char()
self.consume(op)
result = (op, result, self.variable())
return result
# 解析变量
def variable(self):
var_name = ''
while self.next_char().isalnum():
var_name += self.consume()
return var_name
# 解析语句
def statement(self):
if self.next_char() == 'if':
self.consume('if')
condition = self.expression()
self.consume('then')
self.statement()
while self.next_char() == 'while':
self.consume('while')
self.expression()
self.consume('do')
self.statement()
elif self.next_char() == 'while':
self.consume('while')
condition = self.expression()
self.consume('do')
self.statement()
else:
self.assignment()
# 解析赋值语句
def assignment(self):
var_name = self.variable()
self.consume('=')
value = self.expression()
self.consume(';')
print(var_name + ' = ' + value[1])
# 消耗下一个字符
def consume(self, char=None):
if char and self.next_char() != char:
raise SyntaxError('Unexpected character: ' + self.next_char())
consumed_char = self.next_char()
self.index += 1
return consumed_char
# 获取下一个字符
def next_char(self):
if self.index >= len(self.input_str):
return None
else:
return self.input_str[self.index]
# 定义三地址代码生成器
class CodeGenerator:
def __init__(self):
self.label_count = 0
# 生成一个新的标签
def new_label(self):
self.label_count += 1
return 'L' + str(self.label_count)
# 生成三地址代码序列
def generate_code(self, input_str):
parser = Parser(input_str)
label_start = self.new_label()
label_end = self.new_label()
print(label_start + ':')
condition = parser.expression()
print('t1 := ' + condition[1])
print('if t1 > ' + str(int('0xa', 16)) + ' goto ' + label_end)
parser.statement()
print('goto ' + label_start)
print(label_end + ':')
# 测试代码
input_str = 'while (a3+15)>0xa do if x2 = 07 then while y<z do y = x * y / z;'
code_generator = CodeGenerator()
code_generator.generate_code(input_str)
```
程序输出的等效的三地址代码序列为:
```
L1:
t1 := a3 + 15
if t1 > 10 goto L2
goto L0
L2:
L3:
if x2 > 7 goto L4
goto L1
L4:
if y < z goto L5
goto L1
L5:
t2 := x * y
t3 := t2 / z
y := t3
goto L3
goto L1
L0:
```