小编Jab*_*cky的帖子

如何在android中以编程方式获取设备的IMEI/ESN?

为了唯一地识别每个设备,我想使用IMEI(或CDMA设备的ESN号码).如何以编程方式访问?

android imei

321
推荐指数
12
解决办法
46万
查看次数

为什么std :: set没有"包含"成员函数?

我正在大量使用,std::set<int>而且我经常需要检查这样的集合是否包含数字.

我觉得写作很自然:

if (myset.contains(number))
   ...
Run Code Online (Sandbox Code Playgroud)

但由于缺少一名contains成员,我需要编写繁琐的内容:

if (myset.find(number) != myset.end())
  ..
Run Code Online (Sandbox Code Playgroud)

或者不那么明显:

if (myset.count(element) > 0) 
  ..
Run Code Online (Sandbox Code Playgroud)

这个设计决定有理由吗?

c++ stl stdset

96
推荐指数
7
解决办法
1万
查看次数

你如何反编译swf文件

我是一个网站的维护者,据称"丢失"了源代码到flash swf文件.我该如何反编译这个来源?

我可以使用在线或离线的任何程序吗?

flash decompiling

91
推荐指数
4
解决办法
20万
查看次数

使用 std::vector 作为原始内存的视图

我正在使用一个外部库,它在某些时候给了我一个指向整数数组和大小的原始指针。

现在我想使用std::vector来访问和修改这些值,而不是使用原始指针访问它们。

这是一个解释这一点的人为示例:

size_t size = 0;
int * data = get_data_from_library(size);   // raw data from library {5,3,2,1,4}, size gets filled in

std::vector<int> v = ????;                  // pseudo vector to be used to access the raw data

std::sort(v.begin(), v.end());              // sort raw data in place

for (int i = 0; i < 5; i++)
{
  std::cout << data[i] << "\n";             // display sorted raw data 
}
Run Code Online (Sandbox Code Playgroud)

预期输出:

1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

原因是我需要<algorithm>在该数据上应用算法(排序、交换元素等)。

在另一方面改变这种载体的大小将永远不会改变,因此push_back, …

c++ vector stdvector c++11

86
推荐指数
8
解决办法
1万
查看次数

编译器没有检测到明显未初始化的变量

我尝试过的所有C编译器都不会在下面的代码片段中检测到未初始化的变量.但这种情况在这里显而易见.

不要打扰这个代码段的功能.这不是真正的代码,我把它剥离下来调查这个问题.

BOOL NearEqual (int tauxprecis, int max, int value)
{
  int tauxtrouve;      // Not initialized at this point
  int totaldiff;       // Not initialized at this point

  for (int i = 0; i < max; i++)
  {
    if (2 < totaldiff)  // At this point totaldiff is not initialized
    {
      totaldiff = 2;
      tauxtrouve = value;  // Commenting this line out will produce warning
    }
  }

  return tauxtrouve == tauxprecis ;  // At this point tauxtrouve is potentially
                                     // not …
Run Code Online (Sandbox Code Playgroud)

c

59
推荐指数
3
解决办法
9039
查看次数

删除[]是否等于删除?

IP_ADAPTER_INFO *ptr=new IP_ADAPTER_INFO[100];
Run Code Online (Sandbox Code Playgroud)

如果我免费使用

delete ptr;
Run Code Online (Sandbox Code Playgroud)

它会导致内存泄漏,如果不是那么为什么?

这是VS2005生成的反汇编代码

; delete ptr;
0041351D  mov         eax,dword ptr [ptr] 
00413520  mov         dword ptr [ebp-0ECh],eax 
00413526  mov         ecx,dword ptr [ebp-0ECh] 
0041352C  push        ecx  
0041352D  call        operator delete (4111DBh) 
00413532  add         esp,4 

; delete []ptr;
00413535  mov         eax,dword ptr [ptr] 
00413538  mov         dword ptr [ebp-0E0h],eax 
0041353E  mov         ecx,dword ptr [ebp-0E0h] 
00413544  push        ecx  
00413545  call        operator delete[] (4111E5h) 
0041354A  add         esp,4 
Run Code Online (Sandbox Code Playgroud)

c++ memory-management pod

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

使用 std::array 声明 2D(甚至更高维度)数组的便捷方法

我即将将大量旧的 C++ 代码转换为更现代的 C++。

该代码中有许多原始的二维数组,例如:

Foo bar[XSIZE][YSIZE];
Run Code Online (Sandbox Code Playgroud)

我即将用以下内容替换这些声明

std::array<std::array<Foo, YSIZE>, XSIZE> bar;
Run Code Online (Sandbox Code Playgroud)

这是一种方便的方法,因为语句保持不变,并且代码的行为应该与原始数组相同,并且具有能够在调试版本中进行越界检查的额外好处。

但在我看来,这std::array<std::array<Foo, YSIZE>>有点麻烦而且不容易阅读,而且如果使用 3D 数组(虽然我没有),情况会更糟。

现在我正在使用这个宏来使声明更具可读性:

#define DECLARE_2D_ARRAY(type, x, y) std::array<std::array<type, y>, x>
...
DECLARE_2D_ARRAY(Foo, XSIZE, YSIZE) bar;
Run Code Online (Sandbox Code Playgroud)

但我觉得这是一个宏黑客,我想知道是否有一种更干净、更 C++ 的方法来做类似的事情。

c++ arrays multidimensional-array stdarray

42
推荐指数
3
解决办法
3115
查看次数

比较从字符串转换的浮点值与文字

这并不是着名的浮动点数学的重复,即使它看起来像乍一看.

我正在double从一个文本文件中读取一个文件fscanf(file, "%lf", &value);,并将其与==操作符进行比较,并与双文字进行比较.如果字符串是相同的文字,将使用对比==true在所有情况下?

文字文件内容:

7.7
Run Code Online (Sandbox Code Playgroud)

代码段:

double value;
fscanf(file, "%lf", &value);     // reading "7.7" from file into value

if (value == 7.7)
   printf("strictly equal\n");
Run Code Online (Sandbox Code Playgroud)

预期和实际产出是

strictly equal
Run Code Online (Sandbox Code Playgroud)

但是这假设编译器将双文字7.7转换为与fscanf函数完全相同的双精度,但编译器可能会也可能不会使用相同的库将字符串转换为double.

或者另外要求:从字符串到double的转换是否会导致唯一的二进制表示形式,或者可能存在轻微的实现依赖性差异?

现场演示

c c++ floating-point language-lawyer

24
推荐指数
2
解决办法
1200
查看次数

用常量值初始化std :: array

我需要std::array使用常量值初始化a的所有元素,就像可以使用来完成一样std::vector

#include <vector>
#include <array>

int main()
{
  std::vector<int> v(10, 7);    // OK
  std::array<int, 10> a(7);     // does not compile, pretty frustrating
}
Run Code Online (Sandbox Code Playgroud)

有没有办法优雅地做到这一点?

现在我正在使用这个:

std::array<int, 10> a;
for (auto & v : a)
  v = 7;
Run Code Online (Sandbox Code Playgroud)

但我想避免使用显式代码进行初始化。

c++ initialization stdarray

23
推荐指数
4
解决办法
1382
查看次数

从std :: vector中删除原始指针

我有以下模式:

  1. 我有一个std::vector包含对象的原始指针(我知道原始指针是"邪恶的",但它是需要维护的遗留软件).
  2. 现在对于向量中的每个元素,我需要做一个测试,如果测试是肯定的,用指针做一些事情,删除它,然后从向量中删除它:

伪代码:

for each pointer in vector
{
  if (SomeTest(pointer))
  {
     DoSomething(pointer)
     delete pointer
     remove pointer from vector
  }
}
Run Code Online (Sandbox Code Playgroud)

我无法想出一些干净利落的代码.

这个链接提供了不同的方法,但它们看起来或多或少都很麻烦.

我现在使用的繁琐解决方案:

for(auto &  p : v)
{
   if (SomeTest(p))
   {
       DoSomething(p);
       delete p;
       p = nullptr;
   }
}

v.erase(std::remove(v.begin(), v.end(), nullptr), v.end());
Run Code Online (Sandbox Code Playgroud)

c++ stdvector

20
推荐指数
3
解决办法
1726
查看次数