- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图从一组 M^2 连续整数中生成 M 个整数的组合,然后根据一些(当前不相关的)标准排除一些组合,并尝试将它们动态存储在内存中,以便我能够以便稍后访问它们。
这些组合是使用 GNU 科学库 (docs here) 中的“gsl_combination”结构生成的。正如您从下面的代码片段中看到的,组合生成正常(并且根据需要排除)。
然后我需要将每个组合结构对象附加到内存中以供以后检索。我正在尝试使用 glib 指针数组来执行此操作。
代码:gptrwierd.c
#include <glib.h>
#include <gsl/gsl_combination.h>
//Hardcoded the size of the rigol lattice
//MUST BE ODD !!!
#define M 3
//Returns GSL_SUCCESS if the combination contains a forbidden site, otherwise returns GSL_FAILURE
int
is_forbidden (const gsl_combination * test)
{
int i, forbidden = GSL_FAILURE; //Not forbidden by default
size_t k = test->k;
size_t *data = test->data;
int halfway = ((M * M - 1) / 2); //The halfway point in the 2D grid
...
... //Some code for updating 'forbidden'
...
return forbidden;
}
#undef __FUNCT__
#define __FUNCT__ "main"
int
main (int argc, char **argv)
{
long count, istride;
//Generate the basis states
gsl_combination *c = gsl_combination_calloc (M * M, M);
//An array that will contain selected basis vectors.
GPtrArray *basis = g_ptr_array_new ();
count = 0;
do
{
//c is the ith combination of M integers from M^2 integers
//Get all the non forbidden elements
if (is_forbidden (c) == GSL_FAILURE)
{ //If the site is NOT forbidden, append c to basis
g_ptr_array_add (basis, c); //Appends c to basis
{
printf ("count %ld {", count);
gsl_combination_fprintf (stdout,
g_ptr_array_index (basis, count), " %u");
printf (" }\n");
}
count++;
}
}
while (gsl_combination_next (c) == GSL_SUCCESS);
printf("\n\n");
//Now, access each basis element from GArray
for (istride = 0; istride < basis->len; istride++)
{
printf ("istride %ld {", istride);
gsl_combination_fprintf (stdout, g_ptr_array_index (basis, istride),
" %u");
printf (" }\n");
}
gsl_combination_free (c);
g_ptr_array_free (basis, TRUE);
return 0;
}
生成文件:
GSL_FLAGS = gsl-config --cflags
GLIB_LOC = pkg-config --cflags --libs glib-2.0
CFLAGS = -Wall -O3 `$(GSL_FLAGS)` `$(GLIB_LOC)`
GSL_LIBS = gsl-config --libs-without-cblas
GLIB_LIBS = pkg-config --libs glib-2.0
gptrwierd:
gcc $(CFLAGS) -c gptrwierd.c
gcc -o $@ gptrwierd.o -lgsl -lgslcblas -lm `$(GLIB_LIBS)`
allclean: clean
${RM} gptrwierd *.dat
编译和运行就这样完成了(M硬编码为3):
$make gptrwierd
gcc -Wall -O3 `gsl-config --cflags` `pkg-config --cflags --libs glib-2.0` -c gptrwierd.c
gcc -o gptrwierd gptrwierd.o -lgsl -lgslcblas -lm `pkg-config --libs glib-2.0`
$./gptrwierd > out.dat
输出文件的内容粘贴在下面:
count 0 { 1 2 3 }
count 1 { 1 2 4 }
count 2 { 1 2 6 }
count 3 { 1 2 7 }
count 4 { 1 2 8 }
count 5 { 1 3 4 }
count 6 { 1 3 6 }
count 7 { 1 3 7 }
count 8 { 1 3 8 }
count 9 { 1 4 6 }
count 10 { 1 4 7 }
count 11 { 1 4 8 }
count 12 { 1 6 7 }
count 13 { 1 6 8 }
...
...
count 28 { 3 6 7 }
count 29 { 3 6 8 }
count 30 { 3 7 8 }
count 31 { 4 6 7 }
count 32 { 4 6 8 }
count 33 { 4 7 8 }
count 34 { 6 7 8 }
istride 0 { 6 7 8 }
istride 1 { 6 7 8 }
istride 2 { 6 7 8 }
istride 3 { 6 7 8 }
istride 4 { 6 7 8 }
istride 5 { 6 7 8 }
istride 6 { 6 7 8 }
istride 7 { 6 7 8 }
istride 8 { 6 7 8 }
istride 9 { 6 7 8 }
istride 10 { 6 7 8 }
istride 11 { 6 7 8 }
istride 12 { 6 7 8 }
...
...
istride 30 { 6 7 8 }
istride 31 { 6 7 8 }
istride 32 { 6 7 8 }
istride 33 { 6 7 8 }
istride 34 { 6 7 8 }
如您所见,它在迭代组合的 do...while 循环中正确打印组合,但仅在后续循环中迭代 gptrarray 元素时打印按字典顺序排列的最终组合。
我做错了什么?
更新:一种可能的解决方法似乎是完全取消 glib 并手动将组合数据复制到动态分配的数组中:
gsl_combination *c = gsl_combination_calloc (M * M, M);
long **basis;
long dim = 0;
//Evaluate the dimensionality of the Hilbert space (# of allowed combinations)
do
{
//c is the ith combination of M integers from M^2 integers
//Get all the non forbidden elements
if (is_forbidden (c) == GSL_FAILURE)
{ //If the site is NOT forbidden, append dim
dim++;
}
}
while (gsl_combination_next (c) == GSL_SUCCESS);
//Now, generate the actual basis
//basis is an array of arrays that will contain the
//selected basis vectors. Each basis vector is an array of M integers
basis = (long **) malloc (dim * sizeof (long *));
for (count = 0; count < dim; count++)
basis[count] = (long *) malloc (M * sizeof (long));
//Reset the combination to the one that is lexicographically first
gsl_combination_init_first (c);
count = 0;
//Now, append all allowed combinations to the basis
do
{
//c is the ith combination of M integers from M^2 integers
//Get all the non forbidden elements
if (is_forbidden (c) == GSL_FAILURE)
{ //If the site is NOT forbidden, append data in c to basis
for (istride = 0; istride < M; istride++)
basis[count][istride] = c->data[istride];
count++;
}
}
while (gsl_combination_next (c) == GSL_SUCCESS);
//Now, access each basis element from GArray
//basis[i] is the ith combination. jth combination element is basis[i][j]
printf (
"Printing all allowed combinations of sites in basis\n"
"---------------------------------------------------\n");
for (istride = 0; istride < dim; istride++)
{
printf ("stride # %3ld:\t{", istride);
for (count = 0; count < M; count++)
printf (" %ld", basis[istride][count]);
printf (" }\n");
}
/*Do whatever*/
...
...
free(basis);
最佳答案
反例,有效!所以证明和GPtrArray
没有关系, 但 g_ptr_array_add (basis, c); //Appends c to basis
您总是将最新的值添加到 ptr 数组中(但始终指向相同的对象)。因此,您可以对其进行修改,以反射(reflect)下一个要添加的内容,并在同一步骤中更改最后添加的内容。
pkg-config --modversion glib-2.0
2.37.7
使用的演示代码:
#include <glib.h>
#include <glib/gprintf.h>
int main()
{
GPtrArray *a = g_ptr_array_new ();
gpointer data = a;
int i;
for (i=0; i<10; i++, data++)
{
g_ptr_array_add (a, data);
if (i>0)
g_printf ("[%i] last: %p \n", i, g_ptr_array_index (a, i-1));
g_printf ("[%i] current: %p \n", i, g_ptr_array_index (a, i));
}
g_printf ("---- cut ----\n");
for (i=0; i<10; i++, data++)
{
g_printf ("[%i] recheck: %p \n", i, g_ptr_array_index (a, i));
}
g_ptr_array_unref (a);
return 0;
}
输出:
[0] current: 0x1c1ae00
[1] last: 0x1c1ae00
[1] current: 0x1c1ae01
[2] last: 0x1c1ae01
[2] current: 0x1c1ae02
[3] last: 0x1c1ae02
[3] current: 0x1c1ae03
[4] last: 0x1c1ae03
[4] current: 0x1c1ae04
[5] last: 0x1c1ae04
[5] current: 0x1c1ae05
[6] last: 0x1c1ae05
[6] current: 0x1c1ae06
[7] last: 0x1c1ae06
[7] current: 0x1c1ae07
[8] last: 0x1c1ae07
[8] current: 0x1c1ae08
[9] last: 0x1c1ae08
[9] current: 0x1c1ae09
---- cut ----
[0] recheck: 0x1c1ae00
[1] recheck: 0x1c1ae01
[2] recheck: 0x1c1ae02
[3] recheck: 0x1c1ae03
[4] recheck: 0x1c1ae04
[5] recheck: 0x1c1ae05
[6] recheck: 0x1c1ae06
[7] recheck: 0x1c1ae07
[8] recheck: 0x1c1ae08
[9] recheck: 0x1c1ae09
关于c - 在 glib 中向 gprtarray 添加结构元素,但无法检索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18446662/
我创建了一个用户可以添加测试的字段。这一切运行顺利我只希望当用户点击(添加另一个测试)然后上一个(添加另一个测试)删除并且这个显示在新字段中。 所有运行良好的唯一问题是点击(添加另一个字段)之前添加另
String[] option = {"Adlawan", "Angeles", "Arreza", "Benenoso", "Bermas", "Brebant
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在努力将 jQuery 滚动功能添加到 nav-tab (Bootstrap 3)。我希望用户能够选择他们想要的选项卡,并在选项卡内容中有一个可以平滑滚动到 anchor 的链接。这是我的代码,可
我正在尝试在用户登录后再添加 2 个 ui 选项卡。首先,我尝试做一个之后。 $('#slideshow').tabs('remove', '4'); $("#slideshow ul li:last
我有一个包含选择元素的表单,我想通过选择添加和删除其中一些元素。这是html代码(这里也有jsfiddle http://jsfiddle.net/txhajy2w/):
正在写这个: view.backgroundColor = UIColor.white.withAlphaComponent(0.9) 等同于: view.backgroundColor = UICo
好的,如果其中有任何信息,我想将这些列添加到一起。所以说我有 账户 1 2 3 . 有 4 个帐户空间,但只有 3 个帐户。我如何创建 java 脚本来添加它。 最佳答案 Live Example H
我想知道是否有一种有效的预制算法来确定一组数字的和/差是否可以等于不同的数字。示例: 5、8、10、2,使用 + 或 - 等于 9。5 - 8 = -3 + 10 = 7 + 2 = 9 如果有一个预
我似乎有一个卡住的 git repo。它卡在所有基本的添加、提交命令上,git push 返回所有内容为最新的。 从其他帖子我已经完成了 git gc 和 git fsck/ 我认为基本的调试步骤是
我的 Oracle SQL 查询如下- Q1- select hca.account_number, hca.attribute3, SUM(rcl.extended_amou
我正在阅读 http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingG
我正在尝试添加一个“加载更多”按钮并限制下面的结果,这样投资组合页面中就不会同时加载 1000 个内容,如下所示:http://typesetdesign.com/portfolio/ 我对 PHP
我遇到这个问题,我添加了 8 个文本框,它工作正常,但是当我添加更多文本框(如 16 个文本框)时,它不会添加最后一个文本框。有人遇到过这个问题吗?提前致谢。 Live Link: JAVASCRIP
add/remove clone first row default not delete 添加/删除克隆第一行默认不删除&并获取正确的SrNo(例如:添加3行并在看到问题后删除SrNo.2)
我编码this ,但删除按钮不起作用。我在控制台中没有任何错误.. var counter = 0; var dataList = document.getElementById('materi
我有一个类似数组的对象: [1:数组[10]、2:数组[2]、3:数组[2]、4:数组[2]、5:数组[3]、6:数组[1]] 我正在尝试删除前两个元素,执行一些操作,然后将它们再次插入到同一位置。
使用的 Delphi 版本:2007 你好, 我有一个 Tecord 数组 TInfo = Record Name : String; Price : Integer; end; var Info
我使用了基本的 gridster 代码,然后我声明了通过按钮添加和删除小部件的函数它工作正常但是当我将调整大小功能添加到上面的代码中时,它都不起作用(我的意思是调整大小,添加和删除小部件) 我的js代
title 323 323 323 title 323 323 323 title 323 323 323 JS $(document).keydown(function(e){
我是一名优秀的程序员,十分优秀!