小编Mys*_*ial的帖子

指针传染媒介对另一个传染媒介的元素的而不是克隆传染媒介

我想有一个向量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)

c++ pointers stdvector

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

OpenMP:并行程序不是更快(或不是非常快)然后串行.我究竟做错了什么?

看看这段代码:

#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)

c performance gcc openmp

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

std :: vector不是异常安全的吗?

我听说过它提到了几次,std::vector在存储原始指针时并不是异常安全的,而且应该使用unique_ptrshared_ptr替代.

我的问题是,为什么std::vector不是异常安全的,这些类如何解决这个问题?

c++ vector

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

(int**)malloc(sizeof(int*))

我知道为了malloc指向数组的指针数组,语法应该是:

(int**)malloc(numberOfDesiredElements*sizeof(int*))
Run Code Online (Sandbox Code Playgroud)

不小心忘了把numberOfDesiredElements*size放在前面。它搞乱了我的程序抛出随机分段错误,即有时程序输出正确,有时它出现段错误。

有人可以解释当我没有指出我想要多少个插槽时发生了什么吗?

谢谢!

c malloc double-pointer

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

OpenMP嵌套循环并行

我使用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)

你怎么想,为什么我得到了结果?我应该改变什么?

非常感谢!

c parallel-processing loops openmp nested-loops

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

什么导致字符串输出中的笑脸?

这个程序基本上将中缀转换为后缀.问题在于,-/成为笑脸像这样:)

问题是,它显示不同的字符而不是预期的减号或分号.

// 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)

c++

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

乘以两个浮点数并不能得到确切的结果

我试图将两个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模拟器.

c floating-point

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

将多个参数传递给_beginThreadEx

是否可以将多个参数传递给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)

c++ windows parameters multithreading beginthreadex

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

rep_movsl的Clobber列表

我正在尝试使用内联汇编的示例:http://www.delorie.com/djgpp/doc/brennan/brennan_att_inline_djgpp.html 但是有些事让我感到困惑:

  • 关于clobber的行为
    Clobbering实质上告诉GCC不信任指定寄存器/存储器中的值.

    "好吧,当GCC能够确切地知道你之前和之后对寄存器做了什么时,这确实很有帮助......如果你告诉它将(x + 1)放入寄存器中,它甚至足够聪明. ,如果你没有破坏它,后来C代码引用(x + 1),并且它能够保持该寄存器空闲,它将重用计算.哇."

这一段是否意味着clobbering将禁用常见的子表达式消除?

  • 关于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.

c x86 assembly gcc inline-assembly

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

在C中的16个char数组中连接32位int块

我有以下数据类型的结果缓冲区:

 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

谢谢,帕特里克

c c++ arrays

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