我正在使用一个API来编写#define所有包含文件.我正在使用Visual C++ 2010 Express进行开发,到目前为止它一直很好用.
我在项目中添加了一个新的cpp文件,而不小心添加了一个"Windows窗体".VC警告我,我的项目目前没有使用CLR,我真的想要吗?我点击否,并按预期添加了文件.然而,在那之后,我的项目不再编译.
代码看起来基本上是这样的:
api_header.h:
#define DEFINED_HEADER_NAME "path/to/header/file.h"
Run Code Online (Sandbox Code Playgroud)
stdhpf.h:
#include DEFINED_HEADER_NAME
Run Code Online (Sandbox Code Playgroud)
正如我所说,长时间工作正常.现在我明白了:
错误C2006 ::
'#include'预期文件名,发现'identifier'
致命错误C1083:无法打开包含文件''::没有这样的文件或目录
是什么造成的?我发现一些职位,说是因为具有开启预编译头,但我检查Project properties > Configuration properties > C/C++ / Precompiled headers,它的关闭(我提到的设置路径,因为我是新来的VS,有可能做到这一点不止一种方法... ).
有任何想法吗?
c++ compiler-errors visual-studio visual-c++ visual-c++-2010-express
我做了SELECT它使用CASE到nvarchar的值转换成合适的类型,像这样:
SELECT CASE
WHEN @propType = 'money' THEN convert(money, datavalue)
[...]
ELSE datavalue
END
FROM [...]
Run Code Online (Sandbox Code Playgroud)
然而,它似乎convert总是执行,即使@propType是不等于金钱.可运行的例子:
declare @proptype nvarchar(50)= 'nvarchar'
declare @val nvarchar(10) = 'test'
select
case @proptype
when 'money' then convert(money, @val)
else @val
end
Run Code Online (Sandbox Code Playgroud)
为什么会这样,我怎么能绕过它呢?MSDN文档说明了这一点:
CASE语句按顺序评估其条件,并在满足条件的第一个条件下停止.在某些情况下,在CASE语句接收表达式的结果作为其输入之前,将计算表达式.评估这些表达式的错误是可能的.首先评估出现在CASE语句的WHEN参数中的聚合表达式,然后提供给CASE语句.例如,以下查询在生成MAX聚合的值时会产生除零错误.这在评估CASE表达式之前发生.
我不确定这是否相关,但对于非本地人来说语言有点沉重,所以也许是这样?
我觉得我在这里遇到了几个不好的解决方案,需要一些关于如何最大限度地减少未来痛苦的建议.我们正在使用Massive ORM,它的构造函数中包含以下行:
var _providerName = "System.Data.SqlClient";
if (ConfigurationManager.ConnectionStrings[connectionStringName].ProviderName != null)
_providerName = ConfigurationManager.ConnectionStrings[connectionStringName].ProviderName;
_factory = DbProviderFactories.GetFactory(_providerName);
ConnectionString = ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
Run Code Online (Sandbox Code Playgroud)
对我来说,重要的部分是它从中读取连接字符串ConfigurationManager.我们正在尝试集中配置,在这样做时,我们希望将连接字符串保留在我们的web/app.configs之外(我们有大约150个已部署的主机,因此开销变得很大).但是,由于配置文件读取在这里是硬编码的,因此这个ConnectionStrings集合是只读的(有解决方法,但它们都非常脏).
一种可能的方法是将这些行提取到虚方法中,然后使用继承更改它.当我们想要更新Massive时,这并不是那么好,并且从构造函数调用虚方法也可能很糟糕.
我还有其他什么选择?这里的主要优先事项是最小化更新时的影响.
在我们公开WCF服务的外部边界中,我们将所有内部异常转换为FaultException.这是一个手动过程,通常每个实现都有一些独特的缺陷.对于每种暴露的方法,它都经过复制/粘贴和无意识修改(或忘记).为了减少错误,我想创建一个可以捕获任何未处理异常的方面.
我们将内部异常映射到故障异常.如何向方面发送映射功能?
如果我向这个方面添加一个属性,如下所示:
[Serializable]
public sealed class FaultExceptionConverter : OnExceptionAspect {
public Func<Exception, FaultException> FaultConverter { get; set }
}
Run Code Online (Sandbox Code Playgroud)
我不能(正如属性限制所预期的那样)初始化它[FaultExceptionConverter(FaultConverter = MyConversionMethod)](在哪里MyConversionMethod可以分配给某些方法Func<Exception, FaultException>).是否有任何模式可以将此类参数传递给方面?许多类型可以传递到方面.这是个常见的问题吗?
如果碰巧有更好的方法来实现这一目标,我将不胜感激.
我已经实现了一个用户控件,可以让我快速构建几个类似的界面屏幕。基本上它定义了两个依赖属性MainContent,UserInteractions然后显示在可视化模板(a 中的 xaml ResourceDictionary)中,如下所示:
+-------------+
| L | |
| o | Main |
| g | Content |
| o | |
+---+---------+
| Interaction |
+-------------+
Run Code Online (Sandbox Code Playgroud)
屏幕的 Xaml 如下所示:
<controls:ScreenControl>
<controls:ScreenControl.MainContent>
<TextBlock>Some content goes here</TextBlock>
</controls:ScreenControl.MainContent>
<controls:ScreenControl.UserInteractions>
<Button>Do something</Button>
</controls:ScreenControl.UserInteractions>
</controls:InstallerScreenControl>
Run Code Online (Sandbox Code Playgroud)
当我运行应用程序时,这很好用。但是,在设计器中,什么都看不到。不是视图中明确定义的内容,也不是模板中的内容。我需要添加什么才能启用设计支持?我尝试将模板移动到Themes/Generic.xaml某些地方的建议,但这没有区别。这个 SO 问题似乎相关,但没有得到有用的答案。
编辑:
我的ScreenControl样子:
public class ScreenControl : UserControl
{
public object MainContent
{
get { return GetValue(MainContentProperty); }
set { SetValue(MainContentProperty, value); }
} …Run Code Online (Sandbox Code Playgroud) 我正在编写一个程序,该程序打开一个命名管道进行读取,然后处理写入该管道的任何行:
err = syscall.Mkfifo("/tmp/myfifo", 0666)
if err != nil {
panic(err)
}
pipe, err := os.OpenFile("/tmp/myfifo", os.O_RDONLY, os.ModeNamedPipe)
if err != nil {
panic(err)
}
reader := bufio.NewReader(pipe)
scanner := bufio.NewScanner(reader)
for scanner.Scan() {
line := scanner.Text()
process(line)
}
Run Code Online (Sandbox Code Playgroud)
只要写入过程不重新启动或由于其他原因发送 EOF,此操作就可以正常工作。当这种情况发生时,循环终止(正如 的规范所预期的那样Scanner)。
但是,我想保持管道打开以接受进一步的写入。当然,我可以重新初始化扫描仪,但我相信这会产生竞争条件,即当新进程开始写入管道时扫描仪可能尚未准备好。
还有其他选择吗?我需要直接使用类型吗File?
(对于标题道歉,我无法想出一个短于140个字符的好文章......)
我正在为boost :: graph库编写一个图算法.在我的算法中,我需要保留关于节点的变量,权重和计数器.就文档和查看其他人的代码而言,执行此操作的典型方法是将这些属性直接附加到图形并使用属性映射访问它们.
但是,在库函数中,我不希望将特定的读/写映射与图形捆绑在一起,因此我创建了自己的外部属性映射.但这些需要一个std::map(或等效的),所以我最终创建了a std::map和a boost::associative_property_map<std::map>.关于这一点的好处是我有一个统一的方法来获取我的算法的属性和用户的属性(boost::get),但在不利方面,我似乎有两个冗余的地图.除了提到的均匀性之外,这样做有什么意义吗?我可以以某种方式让属性映射维护它自己的内部映射(我意识到内存中没有增益等,但是会有一个更少的成员变量来跟踪每个属性)?
对于一个简单的问题,这是一个很长的介绍,但是否则会出现"你为什么要在C++中处理void指针?"这个类型的问题!你这个可怕的人!我宁愿(a)无效.:)
我正在使用一个C库,我可以从中检索一个它将操作的多边形列表.我使用的函数给了我一个指针数组(PolygonType**),我从中创建了一个std::vector<MyPolyType>自己的多边形类MyPolyType.这又用于创建boost::graph由向量中的索引给出的with节点标识符.
在执行的稍后时间,我想计算两个多边形之间的路径.这些多边形以两种形式提供给我PolygonType*,但我想在我的图中找到相应的节点.如果我知道他们在上一个矢量形式中的索引,我可以找到这些.
现在,问题是:PolygonType结构有一个void*"内部标识符",似乎我不知道它的类型.但我确实知道指针以固定步长(120字节)增加.我知道指针的值,它将是第一个对象的偏移量.我可以使用它来计算我的索引(p-p0)/120,在哪里p是我想要找到的多边形的地址,并且p0是第一个多边形的偏移量?我必须将地址投射到ints,这是便携式吗?(该应用程序可用于Windows和Linux)
我已经实现了D*-Lite算法(这里是一个描述,当边缘成本随时间变化时,它是一个用于进行寻路的算法),但是我在进行边缘成本更新方面遇到了问题.它主要起作用,但有时会卡在一个循环中,在两个顶点之间来回传递.我正在尝试创建一个展示此行为的测试用例,目前在大型应用程序中使用时会出现这种情况,这使得调试变得困难.
我会尽快得到一个测试用例,但也许有人可以发现我从错误到C++的错误.(下面有一个测试用例)本文介绍了一个优化版本,图4,这是我实现的版本.伪代码粘贴在下面.
我的实施来源可以在这里找到.
如果它有帮助,我在我的代码中使用这些类型:
struct VertexProperties { double x, y; };
typedef boost::adjacency_list<boost::vecS,
boost::vecS,
boost::undirectedS,
VertexProperties,
boost::property<boost::edge_weight_t, double> > Graph;
typedef boost::graph_traits<Graph>::vertex_descriptor Vertex;
typedef DStarEuclidianHeuristic<Graph, Vertex> Heuristic;
typedef DStarPathfinder<Graph, Heuristic> DStarPathfinder;
Run Code Online (Sandbox Code Playgroud)
如果需要更多关于使用的信息,请问,粘贴太多了.
D*-Lite的伪代码:
procedure CalculateKey(s)
{01”} return [min(g(s), rhs(s)) + h(s_start, s) + km;min(g(s), rhs(s))];
procedure Initialize()
{02”} U = ?;
{03”} km = 0;
{04”} for all s ? S rhs(s) = g(s) = ?;
{05”} rhs(s_goal) = 0;
{06”} U.Insert(s_goal, …Run Code Online (Sandbox Code Playgroud) 在创建StructureMap容器时,我通常会这样做:
var container = new Container(registry => {
registry.AddRegistry<MyRegistry>();
});
Run Code Online (Sandbox Code Playgroud)
哪里
public class MyRegistry : Registry {
public MyRegistry() {
Scan(x => {
x.Assembly("My.Assembly.Name");
x.RegisterConcreteTypesAgainstTheFirstInterface();
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这导致registry.AddRegistrybootstrapper文件中有很多行,然后将其复制到许多项目中.我希望能够调用一个方法来获取一个构造容器并为其添加一个注册表,因此我可以模块化库.
我想出了这个:
public static void Setup(ref Container container) {
container.PluginGraph.ImportRegistry(typeof(MyRegistry));
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为注册表被正确地添加到容器中(通过调用container.WhatDoIHave()之前和之后看到),但似乎实际的映射没有完成 - 即接口IFoo没有注册到Foo定义的具体类My.Assembly.Name.
是什么在做差异ImportRegistry和AddRegistry?我的Setup方法可以修复吗?
我有一些问题,我认为,差异,我不完全理解.我有一个带有两个类型参数的通用接口,如下所示:
public interface IInvoker<TParameter, TResult> {
TResult Invoke(TParameter parameter);
}
Run Code Online (Sandbox Code Playgroud)
现在,在我的情况,我想我们TA和TB抽象类,是这样的:
public abstract class AbstractParameter {
public int A { get; set; }
}
public abstract class AbstractResult {
public string X { get; set; }
}
public class Parameter1 : AbstractParameter {
public int B { get; set; }
}
public class Result1 : AbstractResult {
public string Y { get; set; }
}
// ... Many more types
Run Code Online (Sandbox Code Playgroud)
然后我想处理一组不同的实现IInvoker<,>,所以我想我可以做这样的事情
public class InvokerOne …Run Code Online (Sandbox Code Playgroud) 请考虑以下代码:
int main()
{
char* s = (char*) malloc(sizeof(char)*10);
s="hello";
free(s);
}
Run Code Online (Sandbox Code Playgroud)
执行此程序时,我收到一个错误:
** glibc detected *** free(): invalid pointer: 0x0000000000400b2c
我对这个错误的研究表明它可能是由于没有分配足够的内存空间引起的malloc().但程序已经调用malloc(),产生足够的空间10 char秒.
c# ×5
c++ ×4
.net ×1
algorithm ×1
boost-graph ×1
c ×1
covariance ×1
d-star ×1
formatting ×1
go ×1
massive ×1
named-pipes ×1
pointers ×1
postsharp ×1
sql ×1
sql-server ×1
structuremap ×1
visual-c++ ×1
wpf ×1
xaml ×1