C++ C++;通过二维数组的内联部件循环
所以我有一个家庭作业,我必须通过它进行一个2d数组循环,做一些计算,然后将它输出到一个不同的数组中。但是我几乎被卡住了,我不知道如何从第一个数组循环并将元素分配给第二个数组。在下面的代码中,我无法更改输入参数(因为这是一个家庭作业)。函数必须接受指向两个数组的指针。我想我已经处理了通过第一个数组的循环(我不是完全肯定的,它可能是错误的),主要问题是分配给第二个数组。当循环时,我没有对元素进行任何计算,因为第一件重要的事情实际上是使循环和第二个数组的赋值工作 功能:C++ C++;通过二维数组的内联部件循环,c++,arrays,assembly,C++,Arrays,Assembly,所以我有一个家庭作业,我必须通过它进行一个2d数组循环,做一些计算,然后将它输出到一个不同的数组中。但是我几乎被卡住了,我不知道如何从第一个数组循环并将元素分配给第二个数组。在下面的代码中,我无法更改输入参数(因为这是一个家庭作业)。函数必须接受指向两个数组的指针。我想我已经处理了通过第一个数组的循环(我不是完全肯定的,它可能是错误的),主要问题是分配给第二个数组。当循环时,我没有对元素进行任何计算,因为第一件重要的事情实际上是使循环和第二个数组的赋值工作 功能: //To reach each
//To reach each element of the 2D array, i am using this formula:
// base + itemsize*rowsize*rowoffset + itemsize*itemoffset
// i got it from this video ( time 2:06 to see it ) : https://www.youtube.com/watch?v=IBor-6kiavI
// For each grade level variant implement own function, e.g.:
void solution_for_grade_7(const int * arr, size_t arr_rows, size_t arr_cols, int * result)
{
//Calculate the sum of positive values for each row.
__asm
{
// Your Inline Assembler instructions for grade X level go here
// :::
mov esi, arr
mov ebx, result
mov ecx, [arr_rows] ; loop at rows
outer: push ecx ; loop stuff
mov ecx, [arr_cols] ; loop at each element of row ( aka. eadch column of row )
inner: push ecx ; loop stuff
mov ebx, [esi] ; i think the error is here
add ebx, 4
add esi, 4
pop ecx ; loop stuff
loop inner
pop ecx ; loop stuff
loop outer ; loop stuff
}
}
呼叫代码:
const size_t ROWS = 2;
const size_t COLS = 3;
int main()
{
// Change the array definitions and/or values to demonstrate your variant:
int data1[ROWS][COLS] = { { 0, -1, 2 }, { 3, 4, -5 } };
//int result1[ROWS]; // Note: for some variants the result array size depends on the COLS!
int result1[ROWS*COLS];
// Change the parameters according to your assignment function, e.g.:
solution_for_grade_7((const int *)data1, ROWS, COLS, result1);
// Print the result values to the console:
for (size_t i = 0U; i < ROWS; i++)
printf("%d ", result1[i]);
printf("\n");
// Add another input array definitions and/or values to demonstrate your variant:
// :::
// Examples of passing invalid arguments (must not fail for grade 10):
// solution_for_grade_X((const int *)data1, ROWS, 0, 0);
// solution_for_grade_X(0, 0, COLS, result1);
// :::
return 0;
}
const size\u t ROWS=2;
常数大小=3;
int main()
{
//更改数组定义和/或值以演示您的变体:
int data1[ROWS][COLS]={{0,-1,2},{3,4,-5};
//int result1[ROWS];//注意:对于某些变体,结果数组大小取决于COL!
int result1[ROWS*COLS];
//根据您的分配功能更改参数,例如:
7级((常量int*)数据1、行、列、结果1的解决方案;
//将结果值打印到控制台:
对于(大小i=0U;i
您几乎不应该编写内联ASM。让编译器从可读C++代码中生成它,这是一项任务要求,我只能在函数内部改变内联汇编。我可以在Main中调用这个函数。另外,根据需求,我不能改变。所以,你必须通过汇编中的2D数组和遗留C++代码中的赋值来写循环。asm中是否有“为什么”?确切/完整的作业是什么?如果我必须这样做,我会在C++中编写代码,并检查调试器/编译器在汇编中的行为,然后复制出来,因为C++只是将代码翻译成ASM。我喜欢这些东西,我会给你一个正确的答案:)布鲁。除了内联汇编和主函数外,我不能更改任何内容。如果是我的话,我甚至不会在C++下拉程序集中这样做。完整的任务是把所有负数加到const int *ARR的行上,把结果放在int *RESULTE中。让编译器从可读C++代码中生成它,这是一项任务要求,我只能在函数内部改变内联汇编。我可以在Main中调用这个函数。另外,根据需求,我不能改变。所以,你必须通过汇编中的2D数组和遗留C++代码中的赋值来写循环。asm中是否有“为什么”?确切/完整的作业是什么?如果我必须这样做,我会在C++中编写代码,并检查调试器/编译器在汇编中的行为,然后复制出来,因为C++只是将代码翻译成ASM。我喜欢这些东西,我会给你一个正确的答案:)布鲁。除了内联汇编和主函数外,我不能更改任何内容。如果是我的话,我甚至不会在C++下拉程序集中这样做。