我想有一个向量z,并能够访问它z[i]或*pz[i],其中*pz[i]指出z[i].所以有一组值,但有两种方法可以访问它.
这是我的代码:
std::vector<double> z;
std::vector<double*> pz;
for (int i = 0; i < 5; i++) {
z.push_back(7+0.01*i);
std::cout << i << " z = " << z << std::endl;
pz.push_back(&z.back());
std::cout << i << " pz = " << pz << std::endl;
std::cout << i << " *pz = " ;
for (int j = 0; j < pz.size(); j++) {
std::cout << " " << *pz[j];
}
std::cout << std::endl;
} …Run Code Online (Sandbox Code Playgroud) 看看这段代码:
#include <stdio.h>
#include <omp.h>
int main()
{
long i, j;
#pragma omp for
for(i=0;i<=100000;i++)
{
for(j=0;j<=100000;j++)
{
if((i ^ j) == 5687)
{
//printf("%ld ^ %ld\n", i, j);
break;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以,结果:
robotex@robotex-work:~/Projects$ gcc test.c -fopenmp -o test_openmp
robotex@robotex-work:~/Projects$ gcc test.c -o test_noopenmp
robotex@robotex-work:~/Projects$ time ./test_openmp
real 0m11.785s
user 0m11.613s
sys 0m0.008s
robotex@robotex-work:~/Projects$ time ./test_noopenmp
real 0m13.364s
user 0m13.253s
sys 0m0.008s
robotex@robotex-work:~/Projects$ time ./test_noopenmp
real 0m11.955s
user 0m11.853s
sys 0m0.004s
robotex@robotex-work:~/Projects$ time ./test_openmp
real 0m15.048s
user 0m14.949s …Run Code Online (Sandbox Code Playgroud) 我听说过它提到了几次,std::vector在存储原始指针时并不是异常安全的,而且应该使用unique_ptr或shared_ptr替代.
我的问题是,为什么std::vector不是异常安全的,这些类如何解决这个问题?
我知道为了malloc指向数组的指针数组,语法应该是:
(int**)malloc(numberOfDesiredElements*sizeof(int*))
Run Code Online (Sandbox Code Playgroud)
不小心忘了把numberOfDesiredElements*size放在前面。它搞乱了我的程序抛出随机分段错误,即有时程序输出正确,有时它出现段错误。
有人可以解释当我没有指出我想要多少个插槽时发生了什么吗?
谢谢!
我使用OpenMP,我遇到了错误结果的问题.
这是代码:
#pragma omp parallel shared(L,nthreads,chunk) private(tid,i,j){
tid = omp_get_thread_num();
if (tid == 0)
{
nthreads = omp_get_num_threads();
printf("Starting matrix multiple example with %d threads\n",nthreads);
printf("Initializing matrices...\n");
}
#pragma omp for schedule (static, chunk)
for( i=0; i<SIZE_A;i++){
for( j=0; j<SIZE_B;j++){
if(A[i]==B[j]){
if(i==0 || j==0)
L[i][j]=1;
else
L[i][j] = L[i-1][j-1] + 1;
}
// or reset the matching score to 0
else
L[i][j]=0;
}
}
}
Run Code Online (Sandbox Code Playgroud)
你怎么想,为什么我得到了结果?我应该改变什么?
非常感谢!
这个程序基本上将中缀转换为后缀.问题在于,-并/成为笑脸像这样:)
问题是,它显示不同的字符而不是预期的减号或分号.
// the program is used to convert a infix expression to a postfix expression
#include<iostream>
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<string>
using namespace std;
const int size =50;
char infix[size],postfix[size],stack[size];
int top=-1;
int precedence(char ch); // function to get the precedence of the operator
char pop(); //function to pop an element from the stack
char topelement(); // returns the top element of the stack
void push(char ch); // pushes an element into the stack
int …Run Code Online (Sandbox Code Playgroud) 我试图将两个floats 乘以如下:
float number1 = 321.12;
float number2 = 345.34;
float rexsult = number1 * number2;
Run Code Online (Sandbox Code Playgroud)
我想看到的结果是110895.582,但是当我运行代码时它只给了我110896.大部分时间我都有这个问题.任何计算器都会给出包含所有小数的精确结果.我怎样才能获得这个结果?
编辑:这是C代码.我正在使用XCode iOS模拟器.
是否可以将多个参数传递给beginthreadex?
我知道我可以创建一个类或结构,但如果我有不相关的数据片段,我不想将它们组合成一个类或结构呢?
Boost库似乎允许多个参数,但我如何为标准c ++ _beginThreadEx执行多个参数?
#include <iostream>
#include <process.h>
unsigned __stdcall myThread(void *data)
{
//C:\dev\default threads\_threads.cpp|6|error: invalid conversion from 'int*' to 'int' [-fpermissive]|
int *x = static_cast<int*>(data);
//int *x = (int*)data;
std::cout << "Hello World! " << x;
}
int main()
{
int x = 10;
_beginthreadex(NULL, 0, myThread, &x, 0, NULL);
while(true);
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用内联汇编的示例:http://www.delorie.com/djgpp/doc/brennan/brennan_att_inline_djgpp.html 但是有些事让我感到困惑:
"好吧,当GCC能够确切地知道你之前和之后对寄存器做了什么时,这确实很有帮助......如果你告诉它将(x + 1)放入寄存器中,它甚至足够聪明. ,如果你没有破坏它,后来C代码引用(x + 1),并且它能够保持该寄存器空闲,它将重用计算.哇."
关于clobber列表的教程中存在一些不一致:
对于输入/输出列表中指定的寄存器,不需要将它们放入clobber列表中,因为GCC知道; 但是在关于rep_movsl(或rep_stosl)的示例中:
asm("cld \n\t""rep \n\t""stosl":/*无输出寄存器*/:"c"(计数),"a"(fill_value),"D"(dest):" %ecx","%edi");
虽然"S,D,c"在输出操作数中,但它们再次被列为破坏.我在C中尝试了一个简单的片段:
#include<stdio.h>
int main()
{
int a[] = {2, 4, 6};
int b[3];
int n = 3;
int v = 12;
asm ("cld\n\t"
"rep\n\t"
"movsl"
:
: "S" (a), "D" (b), "c" (n)
: );
// : "%ecx", "%esi", "%edi" );
printf("%d\n", b[1]);
}
Run Code Online (Sandbox Code Playgroud)
如果我使用评论的clobber列表,GCC会抱怨:
ac:8:3:错误:在重新加载'asm'ac时,无法在类'CREG'中找到寄存器:8:3:错误:'asm'操作数有不可能的约束
如果我使用空的clobber列表,它将编译并输出为4.
我有以下数据类型的结果缓冲区:
char result[16];
Run Code Online (Sandbox Code Playgroud)
问题是,结果是以4个32位的块计算的,需要分配给128位结果char.
int res_tmp[0] = 0x6A09E667;
int res_tmp[1] = 0x6A09E612;
int res_tmp[2] = 0x6A09E432;
int res_tmp[3] = 0x6A09E123;
Run Code Online (Sandbox Code Playgroud)
理想情况下,应该有类似C中的连接运算符,例如,
result = res_tmp[0] || res_tmp[1] || res_tmp[2] || res_tmp[3];
Run Code Online (Sandbox Code Playgroud)
最后,结果需要通过套接字发送如下:
while((connection_fd = accept(socket_fd,
(struct sockaddr *) &address,
&address_length)) > -1)
{
n = write(connection_fd, result, strlen(result));
if (n < 0) printf("Error writing to socket\n");
close(connection_fd);
break;
}
Run Code Online (Sandbox Code Playgroud)
任何人都知道在128-bir结果中连接32位字最简单的语法char?
谢谢,帕特里克