Go Down

Topic: How to obtain a File* (SD.h library)  (Read 235 times) previous topic - next topic

ryanb9

I'm trying to return a File* from a method like the one mocked below. How can I do this?

Code: [Select]
#include <SD.h>
#include <SPI.h>

File* createNewFile(char* filename)
{
SD.remove(filename);
File newFile = SD.open(filename, FILE_WRITE));
if(!newFile)
{
Serial.println("ER-FILE-02");
}
return &(newFile); // returns a File* that points to a valid File obj. Only problem is the obj
                                 // is undefined after the very next line
}


Do I malloc sizeof(file) then memcpy() the bytes from newFile to mallocedFilePtr?

gfvalvo

You shouldn't return a pointer to a local variable. It no longer exists after the function terminates. Have you tried static?
No technical questions via PM. They will be ignored. Post your questions in the forum so that all may learn.

ryanb9

You shouldn't return a pointer to a local variable. It no longer exists after the function terminates. Have you tried static?
It would work as static. I don't have a problem making the library work, but I would like to return a pointer to it.

gfvalvo

but I would like to return a pointer to it.
So what's wrong with?
Code: [Select]
return &newFile;
No technical questions via PM. They will be ignored. Post your questions in the forum so that all may learn.

ryanb9

Since its stack, I thought that when the method ends the object becomes undefined. For instance:

int* getBadPointer()
{
      int x = 10;
      return &x;
}

Using an address of a local variable that goes out of scope is undefined behavior from the time it goes out of scope forward (as far as I remember at least, although I could def be wrong).

gfvalvo

No technical questions via PM. They will be ignored. Post your questions in the forum so that all may learn.

ryanb9

The way I understand it, if I make "static File f;" it sets aside enough memory for a File object and "f" is how I get to the start of that memory. If I do "f = newFile" it copies newFile to the "f" location, so that when the function ends and newFile goes out of scope (and is now unsafe / undefined), it doesn't matter because I coppied it over to my safe memory.

That's at least how I understand it currently.

gfvalvo

That understanding is somewhat flawed. All you need to do is add static to your original code:
Code: [Select]
File* createNewFile(char* filename)
{
  SD.remove(filename);
  static File newFile;
 
  newFile = SD.open(filename, FILE_WRITE));
  if(!newFile)
  {
    Serial.println("ER-FILE-02");
  }
  return &newFile;
}


'static File newFile;' creates an object of the File class. Because it's static, the object remains valid even after the function exits -- and even after 'newFile' goes out of scope.

The 'SD.open()' method returns an object of the File class. 'newFile = SD.open' calls the (possibly default) 'operator=' method of the File class on newFile setting it equal to the object returned by 'SD.open()'.

Finally 'return &newFile;' returns a pointer to the File object as you wanted. Because the object is static, it (and the pointer to it) remain valid even after the function returns and newFile goes out of scope.
No technical questions via PM. They will be ignored. Post your questions in the forum so that all may learn.

ryanb9

That understanding is somewhat flawed. All you need to do is add static to your original code:
Code: [Select]
File* createNewFile(char* filename)
{
  SD.remove(filename);
  static File newFile;
 
  newFile = SD.open(filename, FILE_WRITE));
  if(!newFile)
  {
    Serial.println("ER-FILE-02");
  }
  return &newFile;
}


'static File newFile;' creates an object of the File class. Because it's static, the object remains valid even after the function exits -- and even after 'newFile' goes out of scope.

The 'SD.open()' method returns an object of the File class. 'newFile = SD.open' calls the (possibly default) 'operator=' method of the File class on newFile setting it equal to the object returned by 'SD.open()'.

Finally 'return &newFile;' returns a pointer to the File object as you wanted. Because the object is static, it (and the pointer to it) remain valid even after the function returns and newFile goes out of scope.

ohhh, I misunderstood you. okay great thanks a lot!

Go Up