Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python到C的循环转换_Python_C - Fatal编程技术网

Python到C的循环转换

Python到C的循环转换,python,c,Python,C,我有以下python代码: r = range(1,10) r_squared = [] for item in r: print item r_squared.append(item*item) 如何将此代码转换为C?C中是否有类似于可变数组的东西,或者我将如何做python附加的等价物?C中的数组在默认情况下是可变的,因为您可以编写一个[I]=3,就像python列表一样 但是,它们是固定长度的,与Python列表不同 对于你的问题,这实际上应该是好的。你知道你想要的最终

我有以下python代码:

r = range(1,10)
r_squared = []

for item in r:
    print item
    r_squared.append(item*item)

如何将此代码转换为C?C中是否有类似于可变数组的东西,或者我将如何做python附加的等价物?

C中的数组在默认情况下是可变的,因为您可以编写一个[I]=3,就像python列表一样

但是,它们是固定长度的,与Python列表不同

对于你的问题,这实际上应该是好的。你知道你想要的最终尺寸;只需创建一个大小相同的数组,并分配给成员

但当然也有一些问题需要解决

为可追加数组编写一个简单的库,就像Python列表一样,对于C语言来说是一个非常好的学习项目。如果您需要的话,您还可以找到大量现成的实现,但在标准库中找不到

关键是不要使用堆栈数组,而是使用在堆上分配的内存。跟踪指向该内存的指针、容量和使用的大小。当使用的大小达到容量时,将其乘以某个数字,然后使用不同的数字来了解它们如何影响性能。这就是它的全部。如果你看一看,这基本上和它做的是一样的

这里有一个例子。您需要添加一些错误处理,malloc和realloc可以返回NULL,当然API的其余部分可以返回append,特别是delete函数,它将在分配的内存上调用free,但这应该足以向您展示以下想法:

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

typedef struct {
  int *i;
  size_t len;
  size_t capacity;
} IntArray;

IntArray int_array_make() {
  IntArray a = {
    .i = malloc(10 * sizeof(int)),
    .len = 0,
    .capacity = 10
  };
  return a;
}

void int_array_append(IntArray *a, int value) {
  if (a->len+1 == a->capacity) {
    size_t new_capacity = (int)(a->capacity * 1.6);
    a->i = realloc(a->i, new_capacity * sizeof(int));
    a->capacity = new_capacity;
  }
  a->i[a->len++] = value;
}

int main(int argc, char *argv[]) {
  IntArray a = int_array_make();
  for (int i = 0; i != 50; i++)
    int_array_append(&a, i);
  for (int i = 0; i != a.len; ++i)
    printf("%d ", a.i[i]);
  printf("\n");
}

c中的简单数组。c中的数组是同质的


c无法像python中那样动态增加数组的大小。这里的数组是固定长度的

如果您知道要使用的数组的大小,您可以使用这种声明,如下所示

int arr[10];

或者,如果您想在运行时动态添加memery,请使用malloc调用和结构链表

使用链表,有两个可用的库。如果您阅读代码,您将提前知道数组的长度,并且您知道当它是任何其他长度时,都不会尝试读取它,那么,有没有理由尝试复制Python列表的特性?那么,在C.1中选择向量,是C还是C++?vector在许多方式上与列表类似。2您是否需要使阵列可扩展,或者在创建阵列时知道阵列的大小?OP需要其阵列可扩展。@simonzack您怎么知道的?这根本不是OP的问题。Python就是这样管理列表添加的,但这并不意味着它是OP要求的一部分。@AdamSmith这就是我想象中他所说的可变数组。@simonzack mutable只是意味着它可以更改。除非他给我们的代码表明列表的大小必须增长,或者满足编译时未知的特定大小,否则很难说他所说的可变数组是什么意思,但我理解你的意思。很明显,OP需要一个根据需要增长的数组。为什么要从数组切换到链表,这样就可以追加?它们不容易构建,而且你放弃了一个有经验的Python程序员可能期望的优势,例如,恒定时间随机访问索引,对于Python的那些不太可能寻找的非常类似的语法,例如,在列表中间的恒定时间插入或删除。在其他事情中,你可以realloc。我不是建议他从数组切换到链接列表。我只是让他知道他在C中有哪些选项。我给出了数组[10]的例子,因为他似乎事先就知道了数组的大小。我给出了链表示例,让他知道在C中有一种方法可以动态增加数组的大小。
/ vector-usage.c

#include <stdio.h>
#include "vector.h"

int main() {
  // declare and initialize a new vector
  Vector vector;
  vector_init(&vector);

  // fill it up with 150 arbitrary values
  // this should expand capacity up to 200
  int i;
  for (i = 200; i > -50; i--) {
    vector_append(&vector, i);
  }

  // set a value at an arbitrary index
  // this will expand and zero-fill the vector to fit
  vector_set(&vector, 4452, 21312984);

  // print out an arbitrary value in the vector
  printf("Heres the value at 27: %d\n", vector_get(&vector, 27));

  // we're all done playing with our vector, 
  // so free its underlying data array
  vector_free(&vector);
}
int arr[10];