Page 1 of 1
Code problem in MOD54415-Structure in C
Posted: Wed Nov 05, 2014 2:48 pm
by nicobari
Hi,
So I was trying to pass a struct to a function and change its value. Below is my struct definition
Code: Select all
struct FileRoutines{
int drv;
F_FILE* fp;
};
And my main looks like
Code: Select all
...
FileRoutines OpenOnboardSD;
OpenFileRoutine(&OpenOnboardSD);////////////////////////Output 1/////////////////////////
iprintf("Main Code drv value=%d\n",OpenOnboardSD.drv);////////////////////////Output 2////////////////////////
...
And my function looks like
Code: Select all
void OpenFileRoutine(struct FileRoutines* OpenOnboardSD) {
f_enterFS();
char File_name[6];
OpenOnboardSD->drv = OpenOnBoardFlash();
int *card_status = initOnBoardSD(OpenOnboardSD->drv);
sprintf(File_name, "LOG%d.txt", card_status[1] + 1);
OpenOnboardSD->fp = f_open(File_name, "w+");
iprintf("Local drv value=%d\n", OpenOnboardSD->drv);////////////Output 1/////////////////
}
The problem is my Output 1 is 16 and Output 2 is 0 , when I think they should be same. What am I doing wrong? Thanks in advance.
Regards,
TM
Re: Code problem in MOD54415-Structure in C
Posted: Wed Nov 05, 2014 3:18 pm
by rnixon
I don't have the answer to the value question, but I think you have much bigger problems to deal with first. From your function name OpenFileRoutine() it seems like you are calling f_enterFS() each time you open a file? That function is only used to keep track of the working directory for a task. Take a look at the effs-fat manual and the examples to get that set up right in your code. I would copy some of the text here but for some reason I can't copy from the pdf. Only execute that function once per task, and if you ever release a task you have to call f_releasefs() to free the resources first.
One other minor issue, you should use siprintf() instead of sprintf(). If you have even one call to printf or sprintf all the floating point stuff will be linked in. Since you use iprintf I'm assuming you were trying to avoid that.
As for the structure issue I would write a simpler function to set the value and experiment a bit. Its hard to see what is going on with the other function calls you have.
Re: Code problem in MOD54415-Structure in C
Posted: Wed Nov 05, 2014 3:33 pm
by nicobari
Thanks for replying. I am calling the OpenFileRoutine() function just once at the start of the main code. Sorry for not explaining the code properly but I use f_enterFS() just once in the main task (when I call the OpenFileRoutine() ) and not repeatedly as I just open one file to write data to when Netburner powers up. Also thanks for the good suggestion regarding siprintf(), appreciate it.
Regards,
TM
Re: Code problem in MOD54415-Structure in C
Posted: Wed Nov 05, 2014 3:40 pm
by dciliske
I'd second the notion of removing the f_enterFS call from the function from a code reuse standpoint. Basically, you don't want to have to rewrite this function for using it in a different project, or when design requirements change and you do need to call it again. Also, every function should do one thing, and one thing only; if you have to use the word 'and' to describe the function, it probably does to much.
Re: Code problem in MOD54415-Structure in C
Posted: Wed Nov 05, 2014 3:57 pm
by nicobari
Thanks, and I have removed f_enterFS(); from the function and I guess I am making things complicated so I am working on changing that but I did found out the solution. It seems like in my old code I was passing the address of the struct variable but in the function I was just changing the value of the local variable drv and fp. So I changed the code to the following
Code: Select all
void OpenFileRoutine(struct FileRoutines* OpenOnboardSD) {
char File_name[20]={0};
(*OpenOnboardSD).drv =OpenOnBoardFlash();
int *card_status = initOnBoardSD((*OpenOnboardSD).drv);
(*OpenOnboardSD).number_of_files=card_status[1] + 1;
siprintf(File_name, "LOG%d.txt", (*OpenOnboardSD).number_of_files);
(*OpenOnboardSD).fp = f_open(File_name, "w+");
}
and now it works, but I still agree I need to clear things up. Thanks for the help, appreciate it. You learn new thing everyday.
Regards,
TM
Re: Code problem in MOD54415-Structure in C
Posted: Wed Nov 05, 2014 4:08 pm
by rnixon
This new code should be identical to the old code using the ->. This is strange. I would figure out what is going on with the -> method since that is the way everyone is used to doing things.
As a test how about going back to the original code and changing
OpenOnboardSD->drv = OpenOnBoardFlash();
to
OpenOnboardSD->drv = 1
Or some other constant.
Re: Code problem in MOD54415-Structure in C
Posted: Thu Nov 06, 2014 1:45 pm
by nicobari
Yeah I tried that and it was still not same.
Re: Code problem in MOD54415-Structure in C
Posted: Tue Nov 11, 2014 9:38 pm
by greengene
Is this one of those PClint tests?
The first problem I see is the memory leak from File_name[] that was fixed
in the second code set. Trashing the stack usually isn't a good thing. I'd try
that small change in the first code and see if that clears up the problem.
Whether there is another with card_status is dependent on the function
initOnBoardSD() but I couldn't find source for that.
As usually is the case, fix the things you know that are wrong and be amazed
at what other problems just seem to go away.