我正在创建一个矩阵,它将与另一个矩阵相乘。 矩阵将从参数(* argv [])中获取值。
直到现在我创造了这样的东西:
for(int i=0; i<2; i++) {
for(int j=0; j<2; j++) {
sec[i][j]=argv[gv];
gv++;
}
}
for(int i=0; i<2; i++) {
for(int j=0; j<2; j++) {
int a = (int)fir[i][j];
int b = (int)sec[i][j];
int r = a*b;
res[i][j]=(char)(r); //the problem is here
}
cout<<endl;
}
问题是当我想显示矩阵时我的代码崩溃了。问题可能在标记的地方。
任何想法如何解决这个简单的问题? :)
提前致谢!
答案 0 :(得分:3)
由于您没有显示任何声明,我无法确定,但如果崩溃发生在指定位置,则很可能您没有为res
预留足够的空间。你确定你这样声明了吗?
char res[2][2];
我不确定你在第一个循环中想要做什么,但是如果标识符argv
引用传递给main
的参数,如:
int main (int argc, char *argv[])
argv
将是一个指针数组,而不是这些字符串中包含的第一个字符值的数组。因此,您将为您的sec
数组填充操作系统选择的或多或少的随机值以及它所遵循的ABI,以存储在该位置传递给您的函数的参数。
基本上你的设置如下:
+---------> "my_program"
argv -> +--------------+ / @ anywhere in memory
| argv [0] ------+
+--------------+ +----> "paramter argc-2"
| argv [1] ---------+ / @ another location in memory
+--------------+ \
| ... | / +-----> "paramter 1"
+--------------+ / @ some other location again
| argv[argc-1] |----+
+--------------+
虽然您正在执行计算的@
个位置。
使用
之类的结构std :: cout&lt;&lt;的argv [1]
将产生与:
相同的输出std :: cout&lt;&lt; 12
如果您使用12
作为第一个参数调用您的程序,它们似乎或多或少相同,那么肯定不是!因为只是重载的<<
使它们看起来几乎相同。
然而,当在类型为int的对象上运行时,<<
在调用char*
类型的对象时会切换很多不同的代码。
您可能需要查看以下代码段以查看操作上的差异:
#include <iostream>
#include <stdio.h>
int main (int argc, char *argv[]) {
int k;
for (k=0; k<argc; ++k)
std::cout << k << ": " << argv[k] << "\n";
for (k=0; k<argc; ++k)
printf ("%d: %d\n", k, (int) argv[k]);
return 0;
}
使用./my_program 12 27 42
运行生成的代码将生成如下输出:
0: ./my_program
1: 12
2: 27
3: 42
0: -1079747848
1: -1079747840
2: -1079747837
3: -1079747834
相当不同,这是因为当面对char*
<<
类型的值时,“知道”它必须执行与面对类型{{{{ 1}}。
通过“告诉”第二个循环中的实现执行正确的操作:
int
您将从第二个循环中获得相同的输出。
第一个输出的奇怪数字只是解释了用于表示传递给main的参数指针的位模式,作为整数的那些(位模式)。
使用“无符号”进行类型转换并使用“%x”代替“%d”会使这更加明显,如下所示:
for (k=0; k<argc; ++k)
printf ("%d: %s\n", k, argv[k]);
正如你所看到的那样,我通过夸大记忆位置的随机性来“欺骗”我的照片。
如果计算在这个例子中你会找到的索引,操作系统只是一个接一个地放置参数(包括终止0: bf92bae9
1: bf92baf6
2: bf92baf9
3: bf92bafc
字符)。
答案 1 :(得分:0)
正如塞尔达利斯所说,如果你只是想输出int
,那就没有必要转换它们了;只需将它们发送到cout
即可。
将int
转换为char
可能无法完成您想要的操作。 C中的char
无论如何都是数值,它们按ASCII值转换。如果您决定将其转换为字符串,则可以使用itoa
:
itoa(r, res[i][j], 10);
这也假设res
是char*
的二维数组,我不知道,因为你没有提供声明。如果是,则需要在执行此操作之前动态分配它们。