2011-11-26 64 views
0

我道歉,如果我完全误会C++的时刻,所以我的问题可能是解决很简单。我试图通过值传递一个字符数组到一个函数中,创建一个相同大小的新数组,并用特定元素填充它,然后从该函数返回该数组。这是我到目前为止的代码:按值传递字符数组,并从函数返回一个新的字符数组?

char *breedMutation(char genome []){ 
    size_t genes = sizeof(genome); 
    char * mutation = new char[genes]; 
    for (size_t a = 0 ;a < genes; a++) { 
     mutation[a] = 'b'; 
    } 
    return mutation; 
} 

for循环是什么更新新的数组;现在,这只是虚拟代码,但希望函数的想法很清楚。当我在main调用这个函数,但是,我得到的initializer fails to determine size of ‘mutation’错误。这是我在主代码:

int main() 
{ 
    char target [] = "Das weisse leid"; //dummy message 
    char mutation [] = breedMutation(target); 
    return 0; 
} 

我需要更多地了解指针和字符数组,这我知道,但我想通过例子来学习为好。

编辑:此代码,我试图修改字符数组,是breedMutation的基础。

int *f(size_t s){ 
    int *ret=new int[s]; 
    for (size_t a=0;a<s;a++) 
     ret[a]=a; 
    return ret; 
} 
+3

你解决这个问题的方式非常简单,所以它不是一个真正的C++问题。在C++中,通常使用'std :: string'和/或专门设计的类而不是普通的'char'-数组。 – leftaroundabout

回答

3

你的错误是因为你不能声明mutationchar[],并为其分配由breedMutation正在返回的char*的价值。如果你想这样做,mutation应该声明为char*,然后deleted,一旦你完成它,以避免真正的应用程序中的内存泄漏。

您的breedMutation函数除了动态分配数组并返回它外,完全不像ff只需创建一个大小为s的数组,然后从0开始逐步填充数组中的每个索引。如果没有逻辑错误,则breedMutation只会填充数组'b'

这个错误是,sizeof(genome);将返回一个char*的大小,这通常是一台普通机器上的4或8个字节。因为阵列在传递给函数时被降级为指针,所以您需要传递f的大小。但是,在这段代码中,我不明白为什么你需要通过char genome[]

此外,在C++中,你最好使用一个容器中,如std::vector或相对于动态分配数组(在您使用new的人来创建它们),这样就不必担心释放甚至std::array他们或跟踪他们的大小。在这种情况下,std::string将是一个好主意,因为它看起来像是在尝试使用字符串。

如果你解释你到底想做什么,它可能会帮助我们告诉你如何解决你的问题。

+0

感谢您的帮助;正如我所说的那样,'for'循环现在只包含虚拟代码,它用'b'来填充所有内容。在实际应用中,它使用一种算法来潜在地突变每个等位基因。 'std :: string'看起来像我目前最好的赌注。 –

1

尝试用更换的主(第二行):

char* mutation = breedMutation(target); 

另外,不要忘记在结束时删除突变变量。

1

线:

size_t genes = sizeof(genome); 

将返回genome数组中元素的sizeof(char*)和数量不限。您将需要的元素个数传递给breedMutation()功能:

breedMutation(target, strlen(target)); 

或找到提供信息的功能的其他方式。

希望有所帮助。

编辑:假设它是您实际需要的genome中的元素的数量。

2

数组非常有限。
喜欢使用的std ::向量(或std ::字符串)

std::string breedMutation(std::string const& genome) 
{ 
    std::string mutation; 
    return mutation; 
} 
int main() 
{ 
    std::string target = "Das weisse leid"; //dummy message 
    std::string mutation = breedMutation(target); 
}