在C(不是C++/C#)中,如何检查变量是否属于某种类型?
例如,像这样:
double doubleVar;
if( typeof(doubleVar) == double ) {
printf("doubleVar is of type double!");
}
Run Code Online (Sandbox Code Playgroud)
或者更一般:我如何比较两种类型,以便compare(double1,double2)
评估为true,compare(int,double)
并将评估为false.我还想比较不同构图的结构.
基本上,我有一个函数,它对"struct a"和"struct b"类型的变量进行操作.我想用"struct a"变量做一件事,用"struct b"变量做另一件事.由于C不支持重载并且void
指针丢失其类型信息,我需要检查类型.顺便说一句,typeof
如果你不能比较类型,那么拥有一个算子会有什么意义呢?
对于我来说,sizeof方法似乎是一个实用的解决方案.谢谢你的帮助.我仍然觉得它有点奇怪,因为类型在编译时是已知的,但是如果我想象机器中的进程我可以看到,为什么信息不是按类型存储,而是按字节大小存储.除了地址之外,大小是唯一真正相关的东西.
我有两个字符串.为了示例,它们设置如下:
string1="test toast"
string2="test test"
Run Code Online (Sandbox Code Playgroud)
我想要的是从字符串的开头找到重叠.对于重叠,我的意思是上面例子中的字符串"test t".
# So I look for the command
command "$string1" "$string2"
# that outputs:
"test t"
Run Code Online (Sandbox Code Playgroud)
如果字符串是,string1="atest toast"; string2="test test"
它们将没有重叠,因为检查从开头开始,而"a"在开头string1
.
如何创建一个从内容变量命名的函数?我想编写一个模板脚本,用于定义以脚本自己的文件名命名的函数.像这样的东西(当然不起作用):
#!/bin/bash
bname="$(basename $0)" # filename of the script itself
someprefix_${bname}() { # function's name created from $bname variable
echo test
}
Run Code Online (Sandbox Code Playgroud)
因此,如果脚本的文件名是foo.sh
,那么它应该定义一个名为someprefix_foo
echo test 的函数.
以下是AppIndicator的最小示例:
#!/usr/bin/python
import gobject
import gtk
import appindicator
if __name__ == "__main__":
ind = appindicator.Indicator("example-simple-client", "gtk-execute", appindicator.CATEGORY_APPLICATION_STATUS)
ind.set_status (appindicator.STATUS_ACTIVE)
menu = gtk.Menu()
menu_items = gtk.MenuItem('Quit')
menu.append(menu_items)
menu_items.connect("activate", gtk.main_quit)
menu_items.show()
ind.set_menu(menu)
gtk.main()
Run Code Online (Sandbox Code Playgroud)
不幸的是,关于此的文档非常不完整.我正在寻找的是一种检查AppIndicator菜单是否由用户打开的方法(例如,点击了指示器图标).那么当菜单打开时会发出一个信号吗?
我的一个朋友在gnuplot中发现了一些关于简单多项式拟合的奇怪行为Can sombody可以解释一下吗?
这是文件:
#!/usr/bin/gnuplot -p
f(x) = B*(x**4) + A
fit f(x) "data.txt" using ($1+273.14):2 via A, B
plot "data.txt" using ($1+273.14):2 notitle,\
f(x) notitle
Run Code Online (Sandbox Code Playgroud)
数据是:
# content of data.txt
350 3.856
330 3.242
290 2.391
250 1.713
210 1.181
170 0.763
130 0.437
Run Code Online (Sandbox Code Playgroud)
得到的图是绿线.蓝线显示使用基本相同形式的另一个功能更好的拟合.对于绿线A,用常数值代替(A = 0.2123,约为B*300 ^ 4)
所以绿线显然不是最合适的,因为f(x) = B*(x**4) - 0.2123
产量更好,结果也是B*x 4 + A的形式.在绿色拟合中,参数**A被gnuplot忽略,并且通过拟合算法保持不变.为A和B设置不同的初始值似乎没有多大帮助 - A的值永远不会因其初始值而改变.我的朋友和我正在使用Ubuntu附带的标准Gnuplot版本:gnuplot 4.4 patchlevel 3.
使用pythons logging
模块,有没有办法将多个事件收集到一个日志条目中?一个理想的解决方案是扩展python的logging
模块或自定义格式化程序/过滤器,因此收集相同类型的日志记录事件在后台发生,并且不需要在代码体中添加任何内容(例如,在每次调用日志记录函数时).
这是一个生成大量相同或非常相似的日志记录事件的示例:
import logging
for i in range(99999):
try:
asdf[i] # not defined!
except NameError:
logging.exception('foo') # generates large number of logging events
else: pass
# ... more code with more logging ...
for i in range(88888): logging.info('more of the same %d' % i)
# ... and so on ...
Run Code Online (Sandbox Code Playgroud)
所以我们有相同的例外99999次并记录它.如果日志只是说:
ERROR:root:foo (occured 99999 times)
Traceback (most recent call last):
File "./exceptionlogging.py", line 10, …
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种专门的算法来找到具有实系数的四次方程的正实解(也称为4阶的二次方程或多项式方程).他们有以下形式:
a 4 x 4 + a 3 x 3 + a 2 x 2 + a 1 x + a 0 = 0
一个1,一个2,......是实数.
它应该在微控制器上运行,这需要进行大量的计算.因此,性能是一个问题.这就是为什么我正在寻找一种专门用于正解的算法.如果可能的话,我希望它能够计算出确切的解决方案.
我知道有一种通用的方法来计算四次方程的解,但它涉及计算方面.
有人能指出我正确的方向吗?
从答案来看:有些人似乎误解了我(虽然我很清楚).我知道解决四次方程的标准方法.他们不是为我做的 - 他们既不适合记忆,也不适合他们.我需要的是一种高精度的高效算法,只能找到具有实系数的四次方程的真实解(如果有帮助).我不确定是否有这样的算法,但我想你们可能都知道.PS:downvotes不是来自我.
我理解python中函数的装饰器(我可能错了)的方法是,它们应该添加副作用并修改函数的返回值.现在装饰器被添加到要装饰的函数的函数定义之上或通过赋值.这是一个小例子:
def print_args_decor(function):
def wrapper(*args, **kwargs):
print 'Arguments:', args, kwargs # Added side-effect
return function(*args, **kwargs)*5 # Modified return value
return wrapper
@print_args_decor
def do_stuff(strg, n=10):
"""Repeats strg a few times."""
return strg * n
new_decorated_func = print_args_decor(do_stuff) # Decoration by assignment
print do_stuff('a', 2) # Output: aaaaaaaaaa
Run Code Online (Sandbox Code Playgroud)
现在,如何将装饰器附加到其他地方定义的函数,理想情况下保留原始函数的名称和文档字符串(如同functools.wraps
)?例如,我sqrt()
从Python的数学模块导入函数,并想要装饰它,我该怎么做呢?
from functools import wraps
from math import sqrt
def print_args_decor(function):
@wraps(function)
def wrapper(*args, **kwargs):
print 'Arguments:', args, kwargs # Added side-effect
return function(*args, …
Run Code Online (Sandbox Code Playgroud) 以下是"可执行"共享库的最小示例(假定文件名:)mini.c
:
// Interpreter path is different on some systems
//+definitely different for 32-Bit machines
const char my_interp[] __attribute__((section(".interp")))
= "/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2";
#include <stdio.h>
#include <stdlib.h>
int entry() {
printf("WooFoo!\n");
exit (0);
}
Run Code Online (Sandbox Code Playgroud)
如果用例如:编译它gcc -fPIC -o mini.so -shared -Wl,-e,entry mini.c
."运行"结果.so
将如下所示:
confus@confusion:~$ ./mini.so
WooFoo!
Run Code Online (Sandbox Code Playgroud)
我现在的问题是:
如何更改上述程序以将命令行参数传递给.so
-file 的调用?更改后的示例shell会话可能如下所示:
confus@confusion:~$ ./mini.so 2 bar
1: WooFoo! bar!
2: WooFoo! bar!
confus@confusion:~$ ./mini.so 3 bla
1: WooFoo! bla!
2: WooFoo! bla!
3: WooFoo! bla!
5: WooFoo! Bar!
Run Code Online (Sandbox Code Playgroud)
在编译时检测 …
我有这个丑陋的,非蟒蛇式的野兽:
def crop(dat, clp=True):
'''Crops zero-edges of an array and (optionally) clips it to [0,1].
Example:
>>> crop( np.array(
... [[0,0,0,0,0,0],
... [0,0,0,0,0,0],
... [0,1,0,2,9,0],
... [0,0,0,0,0,0],
... [0,7,4,1,0,0],
... [0,0,0,0,0,0]]
... ))
array([[1, 0, 1, 1],
[0, 0, 0, 0],
[1, 1, 1, 0]])
'''
if clp: np.clip( dat, 0, 1, out=dat )
while np.all( dat[0,:]==0 ):
dat = dat[1:,:]
while np.all( dat[:,0]==0 ):
dat = dat[:,1:]
while np.all( dat[-1,:]==0 ):
dat = dat[:-1,:]
while np.all( dat[:,-1]==0 ):
dat …
Run Code Online (Sandbox Code Playgroud)