小编Pau*_*rth的帖子

C#命令获取struct offset?

假设我有一个像这样的C#结构:

[StructLayout(LayoutKind.Explicit)]
struct IMAGE_DOS_HEADER {
    [FieldOffset(60)] public int e_lfanew;
}
Run Code Online (Sandbox Code Playgroud)

现在假设我从文件中读取数据,如下所示:

byte[] data = new byte[4096];
FileStream f = new FileInfo(filename).Open(FileMode.Open, FileAccess.Read);
int n = f.Read(data, 0, 4096);
Run Code Online (Sandbox Code Playgroud)

现在我想测试n以确保我已经读取了足够的字节来获取值e_lfanew.有没有什么办法可以获得值60(FieldOffset)而无需重新输入?我正在寻找这样的东西:

if (n >= offsetof(IMAGE_DOS_HEADER.e_lfanew) + sizeof(int)) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

有这样的命令吗?在我的实际代码中,我必须进行其中几个测试,并且通过在结构中添加先前字段或通过从FieldOffset属性中复制值来手动输入数字似乎很乏味且容易出错.有没有更好的办法?

c#

8
推荐指数
3
解决办法
8566
查看次数

运营商超载"无法摆脱借来的内容"

当使用具有运算符重载的类时,我从简单的辅助方法获得编译错误.这是一个独立的测试(从我的真实代码简化,但仍然证明了问题):

use std::ops::{Add, Sub, Neg, Mul, Div};

#[derive(Debug, Eq, PartialEq)]
pub struct Money {
    cents: i64,
}
impl Money {
    pub fn new(cents: i64) -> Money {
        Money { cents: cents }
    }
}
impl Add for Money {
    type Output = Money;
    fn add(self, other: Money) -> Money {
        Money { cents: self.cents + other.cents }
    }
}
impl Mul<Money> for f64 {
    type Output = Money;
    fn mul(self, rhs: Money) -> Money {
        Money { cents: (self * …
Run Code Online (Sandbox Code Playgroud)

rust

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

有没有办法匹配两个枚举变量,并将匹配的变量绑定到变量?

我有这个枚举:

enum ImageType {
    Png,
    Jpeg,
    Tiff,
}
Run Code Online (Sandbox Code Playgroud)

有没有办法匹配前两个中的一个,并将匹配的值绑定到变量?例如:

match get_image_type() {
    Some(h: ImageType::Png) | Some(h: ImageType::Jpeg) => {
        // Lots of shared code
        // that does something with `h`
    },
    Some(ImageType::Tiff) => { ... },
    None => { ... },
}
Run Code Online (Sandbox Code Playgroud)

该语法不起作用,但有没有呢?

rust

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

从C#应用程序添加一个引用到没有/ clr编译的DLL?

我正在使用Visual Studio 2008构建一个包含两个项目的解决方案:C#Console应用程序和C++ DLL.我希望应用程序使用P/Invoke从dll调用函数.因此,我正在尝试将dll添加为C#应用程序的参考.但是当我尝试添加引用命令时,Visual Studio将不允许我这样做,除非我在dll上设置/ clr属性(在Configuration Properties:General下).现在,我认为P/Invoke可以处理普通的win32 dll.实际上,如果我在没有/ clr的情况下构建我的dll并且只是手动将它复制到bin/Debug,那么应用运行正常.那么为什么/ clr需要添加dll作为参考?如果VS不允许我添加它,是否有一些(干净的)解决方法,以便我的应用程序找到DLL?

我看到有人在这里有类似的问题(虽然有第三方dll): 无法添加DLL参考VS 2008他得到的答案是构建一个包装器.但这并不是必需的,因为应用程序可以使用dll就好了; 它只是添加引用步骤不起作用.此外,包装器代码是否需要引用dll,引发与以前相同的问题?我真的很喜欢一个不涉及编写包装器的答案.

c# c++ pinvoke visual-studio-2008 visual-studio

6
推荐指数
2
解决办法
8199
查看次数

什么是vim的@@变量?

我知道通过键入@@我执行最后一个@命令.但任何人都可以解释@@下面代码中的内容(在vim帮助文件中找到)?:

function! CountSpaces(type, ...)
  let sel_save = &selection
  let reg_save = @@

  if a:0
    silent exe "normal! `<" . a:type . "`>y"
  elseif a:type == 'line'
    silent exe "normal! '[V']y"
  elseif a:type == 'block'
    silent exe "normal! `[\<C-V>`]y"
  else
    silent exe "normal! `[v`]y"
  endif

  echomsg strlen(substitute(@@, '[^ ]', '', 'g'))

  let &selection = sel_save
  let @@ = reg_save
endfunction
Run Code Online (Sandbox Code Playgroud)

它似乎是一个寄存器,但它不在列表中:help registers.从读取代码我猜它是yanking/deletion的默认寄存器?这记录在哪里?我的所有搜索只会产生@@执行最后一个@命令的习惯用法.

vim

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

回形针:以编程方式分配图像并设置其名称

使用Paperclip,我想从这样的URL中获取图像:

require 'open-uri'

user.photo = open(url)
Run Code Online (Sandbox Code Playgroud)

问题是我最后会找到像'open-uri20110915-4852-1o7k5uw'这样的文件名.有什么办法可以在user.photo上更改文件名吗?

作为一个额外的转折,Paperclip将我的文件存储在S3上,所以如果我可以在初始分配中设置我想要的文件名,那就更好了,所以图像上传到正确的S3密钥.像这样的东西:

user.photo = open(url), :filename => URI.parse(url).path
Run Code Online (Sandbox Code Playgroud)

ruby amazon-s3 paperclip

5
推荐指数
2
解决办法
2266
查看次数

在序列化哈希时,ActiveRecord将符号键转换为字符串

我有一个带有序列化Hash属性的Rails模型类,如下所示:

class Action
  serialize :metadata, Hash
  # . . .
end
Run Code Online (Sandbox Code Playgroud)

该列存储在text具有YAML编码的列中.问题是,当我将metadata值传递给create!方法时,散列键会从符号转换为字符串,但这种转换不会在其他时间发生.例如:

$ rails console
> a = Action.create!(:metadata => {:foo => "bar"})
> a.metadata
 => {"foo"=>"bar"}
> a.metadata[:fizz] = "buzz"
> a.metadata
 => {"foo"=>"bar", :fizz=>"buzz"}
Run Code Online (Sandbox Code Playgroud)

现在,当我保存模型时,数据库将具有此文本值:

---
foo: bar
:fizz: buzz
Run Code Online (Sandbox Code Playgroud)

有任何建议如何解决这个问题?

(这是使用Rails 3.0.16.)

activerecord yaml ruby-on-rails

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

Rspec:当模型无效时显示模型的错误

我通常在我的Rspec测试中写这样的东西:

user.new(...)
user.should be_valid
Run Code Online (Sandbox Code Playgroud)

问题是,当测试失败时,我无法看到用户对象上的错误.有没有一种很好的方法来重新编写这个测试,以便在Rspec输出中我会看到类似的东西user.errors.inspect?我试过了user.errors.should be_empty,但那仍然只是说"预期是真的,变得虚假".

ruby rspec ruby-on-rails

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

MySQL不报告索引唯一性?

我正在尝试使用MySQL命令show indexes from table_name找出哪些索引是唯一的.但它错误地报告所有索引都是非唯一的:

mysql> desc books;
+------------------+--------------+------+-----+---------+-------+
| Field            | Type         | Null | Key | Default | Extra |
+------------------+--------------+------+-----+---------+-------+
| id               | int(11)      | NO   | PRI | NULL    |       |
| name             | varchar(255) | YES  |     | NULL    |       |
| author_id        | int(11)      | YES  |     | NULL    |       |
| coauthor_id      | int(11)      | YES  |     | NULL    |       |
| publisher_id     | int(11)      | YES  |     | NULL    |       | …
Run Code Online (Sandbox Code Playgroud)

mysql

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

Perl:检查您的文件是作为模块加载还是直接运行

如何在Perl中编写测试以查看我的文件是直接运行还是从其他来源导入?我想这样做可以很容易地将所有内容捆绑在一个文件中,但仍然可以针对这些函数编写单元测试.我的想法是有这样的事情:

if (running_directly()) {
  main();
}

def main {
  this();
  that();
}

def this {
  # ...
}

def that {
  # ...
}
Run Code Online (Sandbox Code Playgroud)

然后在一个单独的perl脚本中,我可以加载原始文件并调用它作为单元测试.

我记得以前见过这个,但我不记得怎么做了.我想避免针对某个已知值测试$ 0,因为这意味着用户无法重命名脚本.

perl module

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