【问题标题】:Array slicing in CC中的数组切片
【发布时间】:2014-12-31 18:56:07
【问题描述】:

在 Python 中,如果我想将向量 x=(1,2) 分配给 y=(0,0,0,0) 的前两个元素,我会执行类似 y[:1] = x 的操作。在 C 中是否有一个等价物可以将double x[2]={1.,2.} 分配给可用double y[4] = {0.,0.,0.,0.} 的前两个元素?还是我必须循环?

【问题讨论】:

标签: c arrays


【解决方案1】:

试试这个

#include <string.h>
#include <stdio.h>

int main()
{
    double x[2] = {1., 2.};
    double y[4] = {0., 0., 0., 0.};

    memcpy(y, x, 2 * sizeof(*x));
              /* ^ 2 elements of size -> sizeof(double) */

    return 0;
}

我没有写sizeof(double),这没关系,我写了sizeof(*x),因为如果我更改x 的类型,我不需要修复memcpy,但我还必须更改类型y 在这种情况下。

【讨论】:

  • 谢谢,我如何控制 y 的哪两个索引被分配给这个?
  • @conjectures 可以使用y+1y[1]的地址开始写
【解决方案2】:

您可以编写一个函数来传递指针或数组、偏移量和长度。然后该函数使用 malloc() 为新指针分配空间并执行 memcpy() 操作或循环复制,尽管 memcpy() 可能更好。新指针返回给调用者。

【讨论】:

    【解决方案3】:

    是的,可以使用函数memcpy。但是你必须小心数据类型。您还可以将一种类型的数据复制到另一种类型。正如我所说,你需要小心。否则可能会产生垃圾值。

    第二个选项是循环问题。

    【讨论】:

    • 这个问题被标记为C,我认为它不支持类或运算符重载。
    【解决方案4】:

    试试这个。比你的 python 方法低级一点,但欢迎使用 C 语言,迟早一切都是要分流的原始内存块!

    宏 arraycopy 应用了一些大小检查。 函数 arraycopyunchecked 相当原始。

    函数是重叠安全的。在后台,他们使用memcopy(,,),这可能会更慢,但如果意外混叠导致数组重叠,也不会产生意外结果。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h> //includes mempcy. I know! I know!
    
    #define arraycopy(dest,doffset,source,soffset,count) arraycopy_((dest),(doffset),(source),(soffset),(count),sizeof(*(dest)),sizeof(*(source)))
    
    int  arraycopy_(void*const dest,const size_t doffset,const void*const source, const size_t soffset,const size_t count,const size_t size,const size_t sizecheck){ 
        if(size!=sizecheck){
            return 1;//Incompatible types.
        }
        memcopy(((char*)dest)+doffset*size,((const char*)source)+soffset*size,count*size);
        return 0;
    }
    
    int  arraycopyunchecked(void*const dest,const size_t doffset,const void*const source, const size_t soffset,const size_t count,const size_t size){ 
        memcopy(((char*)dest)+doffset*size,((const char*)source)+soffset*size,count*size);
        return 0;
    }
    
    
    int main(void) {
    
        int errors=0;
    
        double dest[]={0.0,0.0,0.0,0.0};
        double source[]={1.0,2.0};
    
        arraycopy(dest,0,source,0,2);
    
        if(dest[0]!=1.0){
            ++errors;
        }
    
        if(dest[1]!=2.0){
            ++errors;
        }   
    
        if(dest[2]!=0.0){
            ++errors;
        }   
    
        arraycopy(dest,1,source,0,2);
    
        if(dest[0]!=1.0){
            ++errors;
        }
    
        if(dest[1]!=1.0){
            ++errors;
        }   
    
        if(dest[2]!=2.0){
            ++errors;
        }   
    
    
        if(errors!=0){
            printf("Errors - %d\n",errors);
        }else{
            printf("SUCCESS");
        }
    
        double dest1[]={0.0,0.0,0.0,0.0,0.0};
        double source1[]={1.0,2.0,3.0};
    
        arraycopy(dest1,2,source1,1,2);
    
        if(dest[2]!=2.0){
            ++errors;
        }
    
        if(dest[3]!=3.0){
            ++errors;
        }
    
       return errors==0?EXIT_SUCCESS:EXIT_FAILURE;
    }
    

    【讨论】:

      猜你喜欢
      • 2010-09-29
      • 2012-11-10
      • 1970-01-01
      • 2013-12-27
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多