小编Vla*_*aya的帖子

如何"告诉"C编译器不应该优化代码?

有时我需要一些代码才能由CPU执行,就像我把它放在源代码中一样.但任何C编译器都有它的优化算法,所以我可以期待一些技巧.例如:

unsigned char  flag=0;

interrupt ADC_ISR(){
  ADC_result = ADCH;
  flag = 1;
}

void main(){
  while(!flag);
  echo ADC_result;
}
Run Code Online (Sandbox Code Playgroud)

有些编译器肯定会使while(!flag);循环不定式,因为它会假设flag等于false(!flag因此总是如此).

有时我可以使用volatile关键字.有时它可以提供帮助.但实际上在我的情况下(AVR GCC)volatile关键字强制编译器将变量定位到SRAM而不是寄存器(由于某些原因这是不好的).此外,互联网上的许多文章建议使用volatile关键字作为结果可能变得不稳定(取决于编译器,其优化设置,平台等).

所以我肯定更喜欢以某种方式指出源代码指令并告诉编译器这个代码应该完全按原样编译.像这样:volatile while(!flag);

有没有标准的C指令来做这个?

c gcc compiler-optimization

7
推荐指数
2
解决办法
435
查看次数

从 PHP 脚本运行 PHP 脚本的最佳实践是什么?

我会使用以下代码:

$SERVER_PATH = dirname(__FILE__);
shell_exec($PHP_LOCATION.' '.$SERVER_PATH."/script.php?k1=v1&k2=v2 > /dev/null 2>/dev/null &");
Run Code Online (Sandbox Code Playgroud)

在哪里:

  • $PHP_LOCATION应包含 PHP 的路径,

  • $SERVER_PATH- 是当前工作目录(幸运的是要运行的脚本位于同一目录中),

  • > /dev/null 2>/dev/null &添加以使此调用异步(取自Asynchronous shell exec in PHP Question)

这段代码有两个问题:

  1. 据我记得?k1=v1&k2=v2仅适用于网络调用,因此在这种特殊情况下参数不会传递给脚本。

  2. 我真的不知道如何初始化$PHP_LOCATION变量以使其灵活并在大多数主机上工作。

我对这两个问题进行了一些研究:

要解决1 ,建议使用-- 'parameters_string',但也建议修改脚本来解析参数字符串,这看起来有点笨拙。有更好的解决方案吗?

为了解决2,我找到了一个可以使用的解决方案PHP_BINARY,但这是一个 PHP 5.4+ 的情况(我使用的是 5.3)。但最初的问题是运行与原始脚本版本相同版本的 PHP。那么对我来说(因为我只使用 PHP 5.3)可能有解决方案吗?

编辑0

让我解释一下为什么我坚持这种奇怪的(对于 PHP)方法:

这些 PHP 脚本应该彼此分开:

  • 其中之一将分析数据并

  • 第二个将生成 PNG 图形作为最终结果。

这些脚本并不打算同时运行,这意味着第二个脚本可以按照自己的计划运行,只需要在其数据准备就绪时运行(由第一个脚本完成)。因此,不应将任何数据从第二个脚本(子脚本)传回第一个脚本(父脚本)。

编辑1

从大多数评论来看,主要讨论是分叉方向。不过,我想强调一下最初问题中提出的第 1点和第 2 点。我有一些理由按照我指出的方式解决任务,并且我试图指出所有这些原因。如果我的某些观点看起来很奇怪,请发表评论 - …

php linux shell-exec

5
推荐指数
1
解决办法
1007
查看次数

为什么PDO不允许多个具有相同名称的占位符?

我正在使用PHP和MySQL与PDO.有时我需要准备一个语句,其中一个变量(占位符)在此查询中使用了多次.

例:

SELECT * FROM messages WHERE from_id = :user OR to_id = :user
Run Code Online (Sandbox Code Playgroud)

但是,如果我将尝试准备此语句,我将出现错误,因此我需要以这样的方式执行此操作:

SELECT * FROM messages WHERE from_id = :user1 OR to_id = :user2
Run Code Online (Sandbox Code Playgroud)

要调用此语句,我需要有一个这样的数组:

array('user1'=>$user_id, 'user2'=>$user_id);
Run Code Online (Sandbox Code Playgroud)

它看起来对我来说太蠢了!为什么MySQL(PDO?)不允许我多次使用一个占位符并强迫我使用需要更多控制的额外变量?!

如果查询相对简单(如我上面发布的那样),这可以很容易地处理,但现在我用5(!!!)使用单个变量构建了一个查询.每次添加占位符时,我都需要在很多地方检查代码以使其正常.

是否有任何设置或调整可以绕过这个?

php mysql pdo placeholder

5
推荐指数
1
解决办法
1210
查看次数

计算没有分组的列值的组函数(count,min,max ...)

假设我有一张下表:

表用户(id,姓名,年龄,城市)

1 John    26 New York
2 Aaron   31 Dallas
3 Jenifer 35 Dallas
4 Connely 34 New York
Run Code Online (Sandbox Code Playgroud)

我希望有一个表格,所有用户的最小用户年龄都是他(她)的城市:

1 John    26 New York 26
2 Aaron   31 Dallas   31
3 Jenifer 35 Dallas   31
4 Connely 34 New York 26
Run Code Online (Sandbox Code Playgroud)

这个例子有点人为,但我没有弄清楚任何更好的简短例子.

如果我使用的请求如下:

SELECT*FROM users MIN(年龄)GROUP BY city

我可能会得到:

1 John    26 New York
2 Aaron   31 Dallas
Run Code Online (Sandbox Code Playgroud)

我不确定它会返回第1行和第2行,但这不是重点:我需要在结果中包含所有用户.

可能吗?

mysql sql group-by

3
推荐指数
1
解决办法
516
查看次数

为什么PHP的gzuncompress()函数会出错?

PHP有自己的功能来处理gzip档案.我写了以下代码:

error_reporting(E_ALL);
$f = file_get_contents('http://spiderbites.nytimes.com/sitemaps/www.nytimes.com/sitemap.xml.gz');
echo $f;
$f = gzuncompress($f);
echo "<hr>";
echo $f;
Run Code Online (Sandbox Code Playgroud)

第一个echo通常会输出带有正确标头的压缩文件(至少前两个字节是正确的).如果我用浏览器下载此文件,我可以轻松解压缩.

然而gzuncompress抛出 Warning: gzuncompress(): data error in /home/path/to/script.php on line 5

谁能指出我正确的方向来解决这个问题?

编辑:

phpinfo()输出的部分

在此输入图像描述

php gzip unzip

3
推荐指数
2
解决办法
1万
查看次数

我可以跳过带有`list` 赋值的数组元素吗?

假设我有一个函数返回以下数组:

function fruits(){
  $arr = array('apple','orange','banana','pear');
  return $arr;
}
Run Code Online (Sandbox Code Playgroud)

我想在不使用临时变量的情况下将第三个和第四个数组元素分配给变量:

list(NULL,NULL,$banana,$pear) = fruits();
Run Code Online (Sandbox Code Playgroud)

这段代码不起作用,但它会显示我想要使用list构造的方式的想法。

我想使用的原因list如下:

  1. 我使用 PHP 5.3,所以像这样的构造是fruits()[2]行不通的。

  2. 我可以在一行相当可读的代码中做更多的分配

  3. 我想跳过临时变量以减少代码大小并提高其可读性。

那么有没有可能使用list和跳过一些数组元素?

php arrays

3
推荐指数
1
解决办法
500
查看次数

为什么有些代码使用define()而不引用常量名称?

PHP的文档描述define()了将常量名称作为字符串的函数.所以它应该在引号中:

define('ANY_CONSTANT',1);
Run Code Online (Sandbox Code Playgroud)

但是我看到很多没有这样的引号的例子:

define(ANY_CONSTANT,1);
Run Code Online (Sandbox Code Playgroud)

我还在在线PHP测试器中测试了两种方法并且都正常工作.

任何人都可以解释一下:这两种方法有什么区别吗?这些更好吗?在哪种情况下?

php constants

1
推荐指数
1
解决办法
385
查看次数

PHP 的 PDO 准备语句:我可以多次使用一个占位符吗?

我想执行以下查询:

    SELECT
      *,
      (SELECT COUNT(*) FROM `tab2` WHERE `parent` = :id) AS `sum`
    FROM `tab1`
    WHERE `id` = :id

如您所见,:id占位符在查询中出现了两次。因此,如果我尝试使用以下语句执行此语句:

$q->execute(['id'=>$row_id]);
Run Code Online (Sandbox Code Playgroud)

我收到错误:

Fatal error:  Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number
Run Code Online (Sandbox Code Playgroud)

所以我必须重写准备好的查询并使用 :id1 和 :id2 占位符执行数组,这对我来说看起来有点愚蠢。

这是在准备好的语句的多个位置使用一个占位符的唯一方法吗?

php mysql pdo placeholder prepared-statement

1
推荐指数
1
解决办法
1537
查看次数