0

我正在创建一个矩阵,该矩阵将乘以另一个矩阵。矩阵将从参数 (*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;
}

问题是当我想显示矩阵时我的代码崩溃了。问题可能在标记的地方。

任何想法如何解决这个简单的问题?:)

提前致谢!

4

2 回答 2

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 << argv[1]

将产生与以下相同的输出:

标准::cout << 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* <<“知道”类型的值时,它必须执行与面对类型值时不同的操作int

通过在第二个循环中“告诉”实现要执行的正确操作:

  for (k=0; k<argc; ++k)
    printf ("%d: %s\n", k, argv[k]);

您将从第二个循环中获得相同的输出。

第一个输出的那些奇怪数字只是将用于表示传递给 main 的参数的指针的位模式解释为整数的那些(位模式)。

改为(无符号)并使用“%x”而不是“%d”会使这一点更加明显,给出如下输出:

0: bf92bae9
1: bf92baf6
2: bf92baf9
3: bf92bafc

正如你所看到的,我通过夸大内存位置的随机性在我的照片中“欺骗”了一点。

如果您计算索引,您会在此示例中发现操作系统只是\0一个接一个地放置参数(包括终止字符)。

于 2013-04-09T00:45:25.147 回答
0

正如 Serdalis 所说,如果您只是想输出ints,则无需转换它们;只需将它们发送到cout.

无论如何,将 a转换int为 achar可能不会做你想做的事。charC 中的 s 无论如何都是数值,它们通过 ASCII 值进行转换。如果您决定将它们变成字符串,您可以使用itoa

itoa(r, res[i][j], 10);

这也假设reschar*s 的二维数组,我不知道,因为您没有提供声明。如果是,则需要在执行此操作之前动态分配它们。

于 2013-04-09T00:53:00.243 回答