在gatomic.c
glib 中,有几个函数声明如下所示:
gboolean
(g_atomic_int_compare_and_exchange_full) (gint *atomic,
gint oldval,
gint newval,
gint *preval)
{
return g_atomic_int_compare_and_exchange_full (atomic, oldval, newval, preval);
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下这段代码到底是做什么的吗?我对这里的几件事感到困惑:
函数名称g_atomic_int_compare_and_exchange_full
位于括号内。这有什么意义呢?
该函数的主体显然只包含对函数本身的调用,因此这将永远运行并导致堆栈溢出(双关语)。
我根本无法理解这个函数声明。这里究竟发生了什么?
请看下面的代码。它尝试将数组作为 achar**
传递给函数:
#include <stdio.h>
#include <stdlib.h>
static void printchar(char **x)
{
printf("Test: %c\n", (*x)[0]);
}
int main(int argc, char *argv[])
{
char test[256];
char *test2 = malloc(256);
test[0] = 'B';
test2[0] = 'A';
printchar(&test2); // works
printchar((char **) &test); // crashes because *x in printchar() has an invalid pointer
free(test2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
事实上,我只能通过显式转换&test2
为char**
已经暗示这段代码是错误的来编译它。
不过,我想知道它到底有什么问题。我可以传递一个指向动态分配数组的指针的指针,但我不能传递指向堆栈上数组指针的指针。当然,我可以通过首先将数组分配给临时变量来轻松解决该问题,如下所示:
char test[256];
char *tmp = test;
test[0] = 'B';
printchar(&tmp);
Run Code Online (Sandbox Code Playgroud)
不过,有人可以向我解释为什么不能直接投射char[256]
到char**
吗?
我不使用Android Studio,但我使用命令行构建所有内容build.gradle
.我生成一个像这样的Lint报告:
./gradlew lint
Run Code Online (Sandbox Code Playgroud)
这正确地生成了一个Lint报告,但它也说明了这一点:
Note: MyActivity.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Run Code Online (Sandbox Code Playgroud)
这让我想知道我怎么能这样做?我尝试过以下方法:
./gradlew lint -Xlint:deprecation
Run Code Online (Sandbox Code Playgroud)
但它不起作用.它说:
Problem configuring task :app:lint from command line.
Unknown command-line option '-X'.
Run Code Online (Sandbox Code Playgroud)
那我怎么-Xlint:deprecation
能通过gradle 传递到Lint?
我经常需要定位比我当前运行的版本更旧的Mac OS X版本.由于我更喜欢使用bash shell和Makefile,我不使用Xcode.Apple 明确支持定位较旧的OS X版本,但我一直对通常用于定位旧平台的两个配置步骤的冗余感到困惑:
gcc开始使用--macosx-version-min
:
gcc --mmacosx-version-min=10.6 ....
Run Code Online (Sandbox Code Playgroud)该MACOSX_DEPLOYMENT_TARGET
环境变量设置为所需的平台,如
export MACOSX_DEPLOYMENT_TARGET=10.6
Run Code Online (Sandbox Code Playgroud)当试图通过搜索找出两者之间的实际差异时,你会得到不同的答案.有些人说他们完全一样,所以只需要使用其中一个.但是,也有声音表明有必要同时执行这两项操作:启动gcc --macosx-version-min
并设置环境变量.
这两件事完全一样吗?是否只需要使用其中一个而不是两个?某处有官方文件吗?Apple提到MACOSX_DEPLOYMENT_TARGET
但根本没有提及--macosx-version-min
,尽管它似乎更常见.
我正在使用Gradle和CMake从命令行编译Android NDK项目.以前,我使用Ant,ndk-build
但我正在尝试将项目完全迁移到Gradle和CMake.
在我,build.gradle
我有以下几行来调用CMake:
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我怎样才能强制CMake在它出现之前将所有编译器调用打印到控制台?具体来说,我想看看CMake如何运行编译器和链接器.
我已经尝试了以下,但都无济于事:
1)在我,CMakeLists.txt
我已经把以下行:
set(CMAKE_VERBOSE_MAKEFILE on)
Run Code Online (Sandbox Code Playgroud)
没有任何影响.
2)我已经开始构建这样的:
./gradlew build --info
Run Code Online (Sandbox Code Playgroud)
Gradle打印了一些东西,但没有编译器调用.
3)并且像这样:
./gradlew build --debug
Run Code Online (Sandbox Code Playgroud)
Gradle打印了很多东西,但是没有编译器调用.
所以这三次尝试都没有做到我想要的东西让我想知道我怎么能看到CMake如何在我的个人源文件上运行?
我想在打开窗口之前计算窗口的完整大小.我正在使用AdjustWindowRectEx()来实现这一目标.对于客户端大小为640x480的窗口,我的代码看起来像这样:
wrect.left = 0;
wrect.top = 0;
wrect.right = 640;
wrect.bottom = 480;
AdjustWindowRectEx(&wrect, WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX, FALSE, 0);
Run Code Online (Sandbox Code Playgroud)
这将返回以下值:
left: -3
top: -22
right: 643
bottom: 483
Run Code Online (Sandbox Code Playgroud)
但是,当使用CreateWindowEx()打开窗口并传递时
wrect.right - wrect.left
wrect.bottom - wrect.top
Run Code Online (Sandbox Code Playgroud)
作为窗口大小,窗口的大小物理大小实际上是656x515像素.仍然,GetWindowRect()返回646x505,即与AdjustWindowRectEx()返回的尺寸相同,但正如我所说,当我拍摄桌面的屏幕截图并使用绘图程序测量窗口的大小时,其物理尺寸实际为656x515像素.有人对此有解释吗?
客户端大小没问题,它是640x480,但看起来边框大小计算错误,因为边框使用的像素数多于AdjustWindowRectEx()和GetWindowRect()计算的像素数.
我在Windows 7上.
编辑:
这是因为问题的标题是误导性的吗?如MSDN autodocs中所述,AdjustWindowRectEx()不支持WS_OVERLAPPED.那么有没有其他方法来计算WS_OVERLAPPED窗口的尺寸?使用WS_OVERLAPPEDWINDOW不是解决方案,因为它设置了我不想要的WS_THICKFRAME和WS_MAXIMIZEBOX.
现在有一些测试代码显示了问题.您可以看到客户端大小正常,但窗口的物理大小大于GetWindowRect()返回的大小.
#include <stdio.h>
#include <windows.h>
#define CLASSNAME "Test"
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wcx;
RECT wrect; …
Run Code Online (Sandbox Code Playgroud) 几天前我在Google Play上发布了一款应用.当我登录Google Play开发者控制台时,我可以看到有关我的应用的用户评论.但是,当我在Google Play上访问我的应用网站时,这些评论不可见.
有谁知道我如何才能在Google Play上的应用网站上看到这些评论?
我的应用程序应该能够将32位图像(RGB + alpha通道)复制到剪贴板并从剪贴板粘贴这些图像.为此我打算使用,CF_DIBV5
因为BITMAPV5HEADER
结构有一个字段bV5AlphaMask
.
问题是,对于图像数据应该如何存储在剪贴板中似乎没有达成共识.在进行一些测试时,我发现应用程序之间存在一些差异,使得它几乎无法提出通用解决方案.
以下是我的观察:
当我将Alpha 2010通道图像从Word 2010或XnView复制到剪贴板时,它将被存储而不会预乘像素数据.
但是,当我使用Firefox或Chrome复制图像时,像素数据似乎被alpha通道预乘.
Firefox设置bV5AlphaMask
为0xff000000,而大多数其他应用程序根本不设置它,但保留0.这很奇怪,因为这些应用程序将DIB放到剪贴板上,实际上包含最高8位的alpha通道但仍然设置bV5AlphaMask
为0.必须假设如果位深度为32,即使bV5AlphaMask
为0 ,也存在alpha通道.
简而言之,我的基本问题是:是否有关于如何将Alpha通道数据存储在剪贴板上的官方信息?我特别想知道数据是否必须预乘.正如您在上面所看到的,Word 2010和XnView不会预先相互映射,而Firefox和Chrome则可以.但是,知道颜色通道是否应该预乘是至关重要的.
非常感谢您对此有所了解!
更新2 粘贴到Paint.NET现在工作正常.它是由我的代码中的一个错误引起的,如果alpha通道为0,则没有将颜色通道设置为0,即在这种情况下前导相应没有正确完成,这似乎混淆了Paint.NET.
仍未解决的问题是Internet Explorer 10.当将带有alpha通道的PNG复制到剪贴板时,IE 10只是将24位CF_DIBV5放在剪贴板上,但Paint.NET可以将此位图粘贴到alpha通道,因此必须有另一种格式IE 10暴露给剪贴板.也许它暴露了PNG使用CFSTR_FILECONTENTS和CFSTR_FILEDESCRIPTOR.
更新 我现在已经按照下面arx描述的方式实现了它,它运行得很好.然而,仍然有两件事令我困惑:
1)将我的应用程序中的alpha通道图像粘贴到Paint.NET中不会保留alpha通道.Paint.NET中的图像看起来不透明.但是,从Firefox和Chrome粘贴到Paint.NET完美地运行,alpha通道被保留了!我已经抛弃了完整的DIBV5并且它与我的应用程序完全相同,但它仍适用于FF和Chrome,但不适用于我的应用程序,因此必须有其他内容!Firefox和Chrome必须做一些我的应用不做的事情!?
2)对于Internet Explorer 10也是如此.将IE 10中的Alpha通道图像粘贴到我的应用程序根本不起作用...我得到的深度为24的DIB,即没有alpha通道所有.然而,当从IE 10粘贴到Paint.NET时,alpha通道就在那里!所以这里必须有更多东西......
有人可以向我解释为什么table.unpack()
只有在函数调用中使用了第一个表元素之后才返回第一个表元素table.unpack()
?
这是一些演示代码:
local a = {1,2,3,4,5}
print("Test", table.unpack(a)) -- prints "Test 1 2 3 4 5"
print(table.unpack(a), "Test") -- prints "1 Test"
Run Code Online (Sandbox Code Playgroud)
我不明白为什么第二行只是打印1 Test
.我希望它能打印出来1 2 3 4 5 Test
.有人可以解释这种行为吗?我也对如何打印第二次打印感兴趣1 2 3 4 5 Test
.
看一下以下代码,取自旧版本的 ffmpeg:
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
struct foo
{
int16_t (*ac_val_base)[16];
int16_t (*ac_val[3])[16];
};
int main(int argc, char *argv[])
{
struct foo bar;
int16_t *ac_val, *ac_val1;
bar.ac_val_base = malloc(4639 * 16 * sizeof(int16_t));
bar.ac_val[0] = bar.ac_val_base + 66;
ac_val = bar.ac_val[0][0] + 3780 * 16;
ac_val1 = ac_val;
printf("Result: %d\n", (int) (((char *) ac_val1) - ((char *) bar.ac_val[0][0])));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当使用 gcc 或 Visual C 等已建立的编译器对其进行编译时,结果是 120960。这对我来说很有意义,因为我要添加3780 * 16
到int16_t
数组指针,因此我希望生成的指针比源指针高 120960 字节。
然而,当使用 vbcc …