0

我有一个简单的程序,它读入位置和速度列表,尽管它没有编译。我只是想向用户询问位置和速度文件的名称,然后在 main() 中输出数组。

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

#define loop(idx,last) for (idx = 0; idx < last ; idx++)

float readinput (char *posfile, char *velfile);


int main (void)
{
char posfile[100],velfile[100];
float pos[10000][3], vel[10000][3];
printf( "What is the name of your positions file (x y z): " );
scanf( "%s", &posfile );
printf( "What is the name of your velocity file (vx vy vz): " );
scanf( "%s", &velfile );
pos = readinput(posfile,velfile);
return 0;
}

float readinput (char *posfile, char *velfile)
{
float pos[10000][3], vel[10000][3];
float x,y,z;
float vx,vy,vz;
int i;
char line[256];

FILE *files;

files = fopen(posfile, "r");
loop(i,10000){
                  fscanf(files, "\n%f %f %f\t", &x, &y, &z);
                  pos[i][0] = x;
                  pos[i][1] = y;
                  pos[i][2] = z;
                  printf("\n%f %f %f\t",x,y,z);
              }
fclose(files);

files = fopen(velfile, "r");
loop(i,10000){
                 fscanf(files, "\n%f %f %f\t", &vx, &vy, &vz);
                 vel[i][0] = vx;
                 vel[i][1] = vy;
                 vel[i][2] = vz;
                 printf("\n%f %f %f\t",vx,vy,vz);
             }
fclose(files);
return pos;    
}

我很抱歉,这是我的第一个程序。

  main.c: In function 'main':
main.c:18:5: error: incompatible types when assigning to type 'float[10000][3]' from type 'float'
 pos = readinput(posfile,velfile);
     ^
main.c: In function 'readinput':
main.c:51:1: error: incompatible types when returning type 'float (*)[3]' but 'float' was expected
 return pos;
4

6 回答 6

1

你错了。类型char只有单个字符的空间。您必须使用 achar *才能有一个字符串。

int readinput (char *posfile, char *velfile)

在 中main,同时生成posfilevelfile向量:

char posfile,velfile;

在阅读他们的内容时,请跳过&

scanf( "%s", velfile );
于 2013-05-08T17:37:52.293 回答
0

另一个问题是 posfile 和 velfile 的类型不应该是 char,你怎么能让一个 char 保存文件名?

你应该像这样定义它们:

char posfile[256],velfile[256];

并将阅读代码更改为:

scanf( "%s", posfile );

scanf( "%s", velfile);

补充:您正在更改代码,因此我们必须关注您:

您应该将 pos,vel 作为参考参数传递给函数并删除它们在 readinput 中的定义,并且您不需要返回任何内容,

void readinput (char *posfile, char *velfile,float** pos, float** vel)
于 2013-05-08T17:42:48.950 回答
0

报告的问题在于您正在尝试:

 pos = readinput(posfile,velfile);

 return pos;

您不能将数组作为浮点数返回,也不能将浮点数分配给数组。

除了 scanfs 中指针的其他问题,您应该更改

float readinput (char *posfile, char *velfile)
{
float pos[10000][3], vel[10000][3];
...

void readinput (char *posfile, char *velfile, float pos[][3], float vel[][3])
{    
...

并删除局部变量....

于 2013-05-08T18:11:36.307 回答
0

C 中的字符串是 s 的数组char。您应该将参数更改为readinputfrom或:charchar *char[]

int readinput(char * posfile, char * velfile)

提示:下次告诉它为什么不编译。

于 2013-05-08T17:38:31.133 回答
0

我什至不知道从哪里开始......你可能想发明一本好的 C 书。

在您的main()功能中:

char posfile,velfile;
printf( "What is the name of your positions file (x y z): " );
scanf( "%s", &posfile );

char 是像 'a' 这样的单个字符,如果你想做一个字符串,你需要一个动态或静态分配的字符数组:

char posfile[100]; 

例如。

在您的readinput()功能中:


char当您想传递char *(字符串)时,您正在传递s(单个字符)

char posfile, char velfile

您的函数返回一个int类型,但您正在尝试返回float类型:

int readinput(char posfile, char velfile)
float pos[10000][3], vel[10000][3];

return您不能从语句中的函数返回超过 1 个值:

return pos,vel;    

您正在尝试将本地数据从您的函数返回到 main:

float pos[10000][3], vel[10000][3];
...
return pos,vel;    

这将为您提供 UB,您需要将它们设为全局,或者在您的 main 中定义它们并传递它们。

于 2013-05-08T17:38:50.430 回答
0

不应该

int readinput (char posfile, char velfile)

int readinput (char *posfile, char *velfile)

因为我猜你想要一个字符串,而不仅仅是一个字符?

于 2013-05-08T17:39:00.810 回答