我没有针对这个问题的任何特定代码,因为手头的主题基本上适用于所有 C 程序。我主要对调用内置自由函数和准备其调用的策略和原则感兴趣,例如将所有变量存储在一个对象中或尽可能多地使用静态变量。例如,Gigachat建议我使用后立即释放资源,但在我看来,这不是唯一可能的解决方案,对吗?
Чёрный Монах's questions
我使用服务器后面的 HttpListener 来实现 HTTPS,并没有引起任何抱怨。我想切换到 php-fpm,但我不知道它会有什么效果。有谁知道这个问题,告诉我 Linux 上最新版本的 php-fpm 有多可靠,相同算法在相同数据集上的性能是否可以比较?
控制台中的命令file -i *.txt
显示文件名、MIME 和编码的列表。如何编写终端表达式来过滤输出行不包含子字符串的文件text/plain; charset=utf-8
?您只需在当前文件夹中触摸它即可。
#include <stdio.h>
#include <iso646.h>
#include <stdlib.h>
#define FAIL exit(EXIT_FAILURE);
void check_params(const int params_count, char ** params) // const char ** const params - error
{
if (not ((params_count == 2) and (params != NULL) and (params[1] != NULL)))
{
puts("Input params check failed. Program terminated.");
FAIL
}
}
int main(int params_count, char * params[])
{
check_params(params_count, params);
}
如何在被调用函数中正确创建指向常量数据的常量指针,这可能吗?函数中必须不能更改参数中的任何数据。
更新 @Harry 提出的解决方案抛出一个错误:
$ gcc test.c -Wall -Wextra --pedantic --std=c23
test.c: In function ‘main’:
test.c:19:32: error: passing argument 2 of ‘check_params’ from incompatible pointer type [-Wincompatible-pointer-types]
19 | check_params(params_count, params);
| ^~~~~~
| |
| char **
test.c:7:70: note: expected ‘const char * const* const’ but argument is of type ‘char **’
7 | void check_params(const int params_count, const char * const * const params)
SO上也有这样的问题,但争议一直拖在那里。有没有一种快速方法可以找到给定素数之后的下一个素数来扩展哈希表?
示例(根据@MBo的推荐更新代码)
size_t get_next_prime_number(size_t current_prime_number)
{
size_t saved = current_prime_number;
bool is_prime = true;
if (current_prime_number >= MIN_PRIME_NUMBER)
for(current_prime_number = current_prime_number + 2; current_prime_number < SIZE_MAX; current_prime_number += 2)
{
// previous: for(size_t j = 2; j < current_prime_number; ++j)
for(size_t j = 3; j*j <= current_prime_number; j +=2)
if (current_prime_number % j == 0)
{
is_prime = false;
break;
}
else
is_prime = true;
if (is_prime)
break;
}
return (current_prime_number == saved) ? 0 : current_prime_number;
}
更新
我尝试使用分成简单的建议,但没有成功Floating point exception
。
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MIN_PRIME_NUMBER 2 // > 1
#define DIVIDER_LIMIT 65535 // sqrt(4294967295)
#define INDEX_DIFFERENCE 10 // > 1
void resize_array_up(size_t * stored_primes, const size_t prime_position)
{
if (prime_position % INDEX_DIFFERENCE == INDEX_DIFFERENCE - 1)
if (!realloc(stored_primes, (prime_position + INDEX_DIFFERENCE + 1) * sizeof(size_t)))
exit(EXIT_FAILURE);
stored_primes = memset(stored_primes, 0, sizeof(size_t));
}
size_t get_next_prime_number(const size_t current_prime_number, const size_t prime_position, size_t * stored_primes)
{
resize_array_up(stored_primes, prime_position);
size_t saved_current = current_prime_number,
prime_number = 1;
if ((current_prime_number >= MIN_PRIME_NUMBER) && (prime_position < SIZE_MAX) && (current_prime_number < SIZE_MAX))
{
for(size_t divider = sqrt(current_prime_number), number = divider * divider, temporary_number = current_prime_number + 2;
(divider < DIVIDER_LIMIT) && (number <= temporary_number); divider += 2, number = divider * divider, temporary_number += 2)
for(size_t counter = 0; counter <= prime_position; ++counter)
{
if ((number % stored_primes[counter]) == 0)
break;
else
prime_number = number;
}
}
return (prime_number == saved_current) ? 0 : prime_number;
}
int main(void)
{
size_t * primes = calloc(INDEX_DIFFERENCE, sizeof(size_t));
if (primes)
{
size_t prime_position = 0,
prime_number = MIN_PRIME_NUMBER;
primes[prime_position] = prime_number;
do
{
prime_number = get_next_prime_number(prime_number, prime_position++, primes);
printf("%zu\n\n", prime_number);
}
while (prime_number != 0);
if (prime_number == 0)
free(primes);
}
else
exit(EXIT_FAILURE);
return EXIT_SUCCESS;
}
第297页有一个函数原型是这样的:
void bubble( int work[], const int size, int (*compare) ( int a, int b) );
第 300 页说函数bubble
可以有这样的原型:
int (*) (int, int )
怎么一件事变成了另一件事,是不是有错别字?
我выражение
从互联网上获取任何用于在字符串中搜索匹配项的内容,并执行以下操作:/(^(выражение))|(выражение)|((выражение)$)|(^(выражение)$)/
,但如果它位于字符串末尾,则它不会捕获字符串中的地址,并且一切都在服务器端表达式模拟器中运行。如何写出正确的表达方式?我看到有些人$
使用\z
严格的行尾来代替,但我仍然不明白如何在这个插件中正确捕获开头或结尾。
请解释我是否正确理解这个概念。
关于术语对齐的标准摘录:
要求特定类型的对象位于存储边界上,其地址是字节地址的特定倍数。
翻译:
要求特定类型的对象位于存储边界,其地址是字节地址的特定倍数。
我对此的理解是,内存中任何变量的值必须通过实现分布在整数个字节上,这意味着位字段小于一个字节的结构将占用一个或多个字节,对吗?