I have a simple program which reads in a list of positions and velocities, though it is not compiling. I simply want to ask the user for the name of the position and velocity file and then output the array back in 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;
}
I do apologize, this is my first program.
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;
you've got it wrong. Type char
has space for a single character only. You have to use a char *
to have a string there.
int readinput (char *posfile, char *velfile)
And in main
, make both posfile
and velfile
vectors:
char posfile,velfile;
And when reading their content, skip the &
:
scanf( "%s", velfile );
A string in C is an array of char
s. You should change the arguments to readinput
from char
to char *
or char[]
:
int readinput(char * posfile, char * velfile)
Hint: next time tell why it isn't compiling.
I'm not even sure where to start... you might want to invenst in a good C book.
In your main()
function:
char posfile,velfile;
printf( "What is the name of your positions file (x y z): " );
scanf( "%s", &posfile );
A char is a single character like 'a', if you want to do a string you need either a dynmically or statically allocated array of chars:
char posfile[100];
for example.
In your readinput()
function:
You're passing char
s (single characters) when you wanted to pass char *
(strings)
char posfile, char velfile
Your function returns an int
type, but you're trying to return float
types:
int readinput(char posfile, char velfile)
float pos[10000][3], vel[10000][3];
You can not return more than 1 values from a function in a return
statement:
return pos,vel;
You are trying to return local data from your function back to main:
float pos[10000][3], vel[10000][3];
...
return pos,vel;
That's going to give you UB, you need to make them global, or define them in your main and pass them.
Should't
int readinput (char posfile, char velfile)
be
int readinput (char *posfile, char *velfile)
since I'm guessing you want a string, not just a character?
another problem is posfile and velfile's type should not be char, how could you let one char to hold a file's name?
you should define them like this:
char posfile[256],velfile[256];
and change the reading code to:
scanf( "%s", posfile );
and
scanf( "%s", velfile);
Added: you are changing your code, so we have to follow you:
you should pass pos,vel as reference parameters to the function and remove the their definition inside readinput, and you don't need to return anything,
void readinput (char *posfile, char *velfile,float** pos, float** vel)
The reported problem is in that you are trying to:
pos = readinput(posfile,velfile);
and
return pos;
you cannot return array as float and you cannot assign float to array.
except other issues with pointers in scanfs, you should change the
float readinput (char *posfile, char *velfile)
{
float pos[10000][3], vel[10000][3];
...
to
void readinput (char *posfile, char *velfile, float pos[][3], float vel[][3])
{
...
and drop the local variables....
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.