萍聚社区-德国热线-德国实用信息网

 找回密码
 注册

微信登录

微信扫一扫,快速登录

萍聚头条

查看: 1885|回复: 10

C高手帮忙看看

[复制链接]
发表于 2007-12-9 13:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册 微信登录

x
int **a;
int i,m,n;
scanf("%d %d",&m,&n);
*a=(int **)malloc(m*sizepf(int *));
for (i=0;i<m;i++)
a=(int *)malloc(n*sizeof(int));

printf("Please input int matrix a[%d][%d]\n",m,n);
for(i=0;i<m;i++)
for(j=0;j<n;j++){
scanf("%d",&temp_a);
a(i,j)=temp_a;} 这里应该是方括号,显示不了,只能这样代替了.
free(a);

定义了动态2维数组,怎么给它赋值呢, 代码有什么问题吗.帮忙看看.
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2007-12-9 14:21 | 显示全部楼层
原帖由 maedebach 于 2007-12-9 12:24 发表
int **a;
int i,m,n;
scanf("%d %d",&m,&n);
*a=(int **)malloc(m*sizepf(int *));
for (i=0;i<m;i++)
a=(int *)malloc(n*sizeof(int));

printf("Please input int matrix a[%d][%d]\n",m,n);
fo ...



如果没有忘记C的话, 应该象下面那样:

int **a;
int i,j, m,n;
scanf("%d %d",&m,&n);
a=(int**)  malloc(m*sizeof(int *));
for (i=0;i<m;i++)
a [ i ] = (int *) malloc(n*sizeof(int));

for (i=0;i<m;i++)
for (j=0;j<n;j++)
a [ i ] [ j ] = i+j;

[ 本帖最后由 kaiser0825 于 2007-12-9 13:24 编辑 ]
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
 楼主| 发表于 2007-12-9 14:30 | 显示全部楼层
谢谢啦. 改了下,但是距阵乘积的结果还是抱错,即使是两个2x2同样维数的相乘.

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

int main(int argc, char** argv)
{
      int **a;
      int i,m,n,j,temp_a,k,temp_b,z;
      printf("Angaben der Dimension von Matrix a m und n\n",m,n);
      scanf("%d %d",&m,&n);            /*dyn.array a mit [m][n]*/
      a=(int**)malloc(m*sizeof(int*));
      for (i=0;i<m;i++)
      a=(int *)malloc(n*sizeof(int));

      printf("Please input int matrix a[%d][%d]\n",m,n);
      for(i=0;i<m;i++)
      for(j=0;j<n;j++){
      scanf("%d",&temp_a);
      a[j]=temp_a;}
         free(a);

/**********************************************************/
      int **b;
      printf("Angaben der Dimension von Matrix b n und k\n",n,k);
      scanf("%d %d",&k,&n);
     
      b=(int**)malloc(k*n*sizeof(int*));    /*dyn.array mit b [n][k]*/
      for (i=0;i<n;i++)
      b=(int *)malloc(k*sizeof(int));
      printf("Please input int matrix b[%d][%d]\n",n,k);
      for(i=0;i<n;i++)
      for(j=0;j<k;j++){
      scanf("%d",&temp_b);
      b[j]=temp_b;}
        free(b);
        
/**********************************************************/
      int ab[m][k];       /*Matrix multiplikation*/
      for (i=0;i<m;i++)
      for (z=0;z<k;z++)
      for (j=0;i<k;j++)
      ab[z]+=a[j]*b[j][z];

/***Ausgabe*****************************************************/
      
      printf("\n");
      printf("Ausgaben:",m,k);
      for(i=0;i<m;i++){
      printf("\n");
      for(j=0;j<k;j++)
      printf("%d ",ab[j]);
      
      }
return 0;
}
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2007-12-9 14:39 | 显示全部楼层
原帖由 maedebach 于 2007-12-9 13:30 发表
谢谢啦. 改了下,但是距阵乘积的结果还是抱错,即使是两个2x2同样维数的相乘.

#include  
#include
#include

int main(int argc, char** argv)
{
      int **a;
      int i,m,n,j,temp_a,k,temp_b ...




   int ab[m][k];
      /* set ab = 0 firstly */
      for (i=0;i<m;i++)
      for (z=0;z<k;z++)
      ab [ i ][ z ] = 0;
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
 楼主| 发表于 2007-12-9 14:42 | 显示全部楼层
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2007-12-9 20:37 | 显示全部楼层
printf("Angaben der Dimension von Matrix a m und n\n",m,n);
      scanf("%d %d",&m,&n);
这里也是printf里最后m,n的什么。。。M,N还没赋值呢。。。。


scanf("%d",&temp_a);
      a[j]=temp_a;}
A明明是2维数组,你这怎么写着写着变一维了?
同样问题也处在B和AB上,看了半天都只有ab[j]

int ab[m][k];   
这个地方也不能这么定义吧。。。。

[ 本帖最后由 klsharp 于 2007-12-9 20:05 编辑 ]
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2007-12-10 13:27 | 显示全部楼层
原帖由 maedebach 于 2007-12-9 13:30 发表
........
  1. a = (int *)malloc(n * sizeof(int));
复制代码


a ist vom Typ her ein Double-Pointer, also ein Array von Pointer. Sprich der Compiler erwartet in jeder Speicherstelle ab **a eine Speicheradresse, die auf eine weitere Speicheraddresse vom Typ "integer" zeigt. Ergo waer hier richtig:
  1. *a = (int *)malloc(n * sizeof(int));
复制代码

  1. .....
  2.         for (j = 0; j < n; j++) {
  3.                         scanf("%d", &temp_a);
  4.                         a[j]=temp_a;
  5. .....
复制代码

Du ueberschreibst eine Speicheradresse mit einem integer Value. richtig waere hier:
  1. a[i][j]=temp_a;
复制代码
  1. free(a);
复制代码

warum gibst Du den Speicherplatz frei, obwohl Du die Werte drin spaeter noch brauchst?

  1. .........
  2.       b=(int *)malloc(k*sizeof(int));
  3.       printf("Please input int matrix b[%d][%d]\n",n,k);
  4.       for(i=0;i<n;i++)
  5.       for(j=0;j<k;j++){
  6.             scanf("%d",&temp_b);
  7.             b[j]=temp_b;}
  8. ........
复制代码


Hier machst Du den selben Fehler wie oben bei **a. Fix s.o.

  1.       int ab[m][k];       /*Matrix multiplikation*/
  2.       for (i=0;i<m;i++)
  3.       for (z=0;z<k;z++)
  4.       for (j=0;i<k;j++)
  5.                  ab[z]+=a[j]*b[j][z];
复制代码

Hier machst Du den gleichen Fehler wie oben. **ab ist zweidimensional und sollte auch als solche behandelt werden. z.B.

  1. ab[i][z]+=a[i][j]*b[j][z];
复制代码


Mir scheint, dass Du das ganze Konzept mit Pointer, Speicheraddresse bzw. Inhalt nicht wirklich verstanden hast. Beim Kompilieren warnt Dich doch schon der Kompiler wegen "assignment from incompatible pointer type". Auf solche Warnung solltest Du entspr. achten und nicht einfach ignorieren.

cheers

[ 本帖最后由 desert_penguin 于 2007-12-10 12:34 编辑 ]
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2007-12-10 14:23 | 显示全部楼层
LS的兄弟改的差不多了,还有就是int ab[m][k]不能这么定义的,不能用变量来定义数组,这样编译器无法实际分配内存,要是能直接用变量定义数组,那一开始的矩阵A,B也不会写那么麻烦了
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
 楼主| 发表于 2007-12-10 16:37 | 显示全部楼层
谢谢LS的,我定义的动态的2维数组,编译通过,但是就是执行时报内存错.
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2007-12-10 16:52 | 显示全部楼层

回复 #9 maedebach 的帖子

Sowie Du es programmiert hast, wird das mit dem ab[m][k] sogar funktionieren, da der m und k zu Runtime beim Deklarieren von **ab schon initialisiert sind. Falsch ist das natuerlich trotzdem, abgesehen davon, dass sowas nicht mit jedem Kompiler funktioniert.

Dein Code ist, so leid es mir auch tut, leider eine einzige Ansammlung von Verstaendnisfehlern $汗$ . Dein Speicherzugriffsfehler liegen warhscheinlich woanders. Guck Dir die Korrekturvorschlaege von uns mal genauer an und benutzt mal einen Debugger.

cheers

[ 本帖最后由 desert_penguin 于 2007-12-10 16:01 编辑 ]
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
您需要登录后才可以回帖 登录 | 注册 微信登录

本版积分规则

手机版|Archiver|AGB|Impressum|Datenschutzerklärung|萍聚社区-德国热线-德国实用信息网 |网站地图

GMT+2, 2024-5-16 12:18 , Processed in 0.270199 second(s), 19 queries , MemCached On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表