auto reset during the loop()

Hello,

I am new to programming an Arduino (Mega 2560).
I am on a project that manipulates a file.txt on SD card.
After the execution of a function that searches a number in the file my arduino reset. I don't see why.
Have you any idea what can cause this reset?

thank

Ooh, that's a good one.

Have any code we can look at?
Does any file manipulation cause that to happen?

gigiZ:
After the execution of a function that searches a number in the file my arduino reset.

Just taking a shot in the dark here, since there's no code to look at, but I'd guess you're reading a large amount of data into SRAM, running out of SRAM, and overwriting the stack. This is a very common cause of Arduino resets.

gigiZ:
Have you any idea what can cause this reset?

No, sorry.

Read this before posting a programming question

Here is the function that creates me this problem:

int rechercheUtilisateur(char numUtilisateur[TAILLE_NUM_UTI]){
int i, ligne = 1;
//declaration des tableaux locaux
char numString[TAILLE_NUM_UTI];

//place le pointeur au debut du fichier
myFile.seek(0);
//retrieve the ID number of the line
for(i=0; i<TAILLE_NUM_UTI-1; i++) numString*=myFile.read(); *
_ numString*='\0';*_

* while(strcmp(numUtilisateur, numString)){*
* if(!sautDeLigne()){ //move to the next line*
* myFile.seek(0);*
* return 0;*
* }*

* ligne++;*
* //retrieve the ID number of the line*
* for(i=0; i<TAILLE_NUM_UTI-1; i++){
_ numString=myFile.read();
}
numString='\0';
}
//place le pointeur au debut de la ligne*

* myFile.seek(myFile.position()-TAILLE_NUM_UTI);*
* return ligne;
}
[/font]
It looks in a text file by a user's ID number.
sample text file:
10000001 Marson Julien 7654 31678 11/05/2012 enseignant physique 03/04/2012 Fabre oui non
10000002 Zygmaniak Ghislain 55 21234 10/05/2012 etudiant physique 02/04/2012 Fabre oui non
63802020 Verron Maxime 234 22222 12/05/2012 etudiant mathématique 04/04/2012 Fabre non oui
63802021 Dumont Tony 34 22 12/04/2012 etudiant mathématique 04/04/2012 Fabre oui non
> jraskell:
> > gigiZ:
> > After the execution of a function that searches a number in the file my arduino reset.
>
>
>
> Just taking a shot in the dark here, since there's no code to look at, but I'd guess you're reading a large amount of data into SRAM, running out of SRAM, and overwriting the stack. This is a very common cause of Arduino resets.*

I think I do not use any memory:
Binary sketch size: 17932 bytes (of a 258048 byte maximum)
Thanks_

I think I do not use any memory:

Yes you do, every variable and print string takes up memory.
Why did you not use the code tags like it said in the link Nick pointed you to?

Please edit your post, select the code, and put it between [code] ... [/code] tags.

You can do that by hitting the # button above the posting area.

What does TAILLE_NUM_UTI look like? The declaration?

char numString[TAILLE_NUM_UTI];
  numString=myFile.read(); 
  numString='\0';

numString being an array of chars, the above two are, let's say, inappropriate attempts at assignment.

numString being an array of chars, the above two are, let's say, inappropriate attempts at assignment.

Perhaps you noticed the switch to italics midway through the (poorly posted) code? The assignment is valid, and would be properly apparent if the code was posted properly.

PaulS:

numString being an array of chars, the above two are, let's say, inappropriate attempts at assignment.

Perhaps you noticed the switch to italics midway through the (poorly posted) code? The assignment is valid, and would be properly apparent if the code was posted properly.

You are foiling my attempted demonstration of one of the less obvious reasons why code tags are important. No worries, the point should be made anyways.

You are foiling my attempted demonstration of one of the less obvious reasons why code tags are important.

Oops. Sorry about that.

I think that subtlety is lost on people that can't even post code properly, though. A clue-by-four would be a better tool.

PaulS:
A clue-by-four would be a better tool.

Haha. That's a new one to me, wasn't really sure what you meant, though what initially came to mind when I read it was 'four letter words'. After a quick google, I find I'm not all that far off the mark. I do like the two-by-four analogy more though.

Here is the function (with the right tags) that creates me this problem:

int rechercheUtilisateur(char numUtilisateur[TAILLE_NUM_UTI]){
    int i, ligne = 1;
    //declaration des tableaux locaux   
    char numString[TAILLE_NUM_UTI];

    //place le pointeur au debut du fichier
    myFile.seek(0);
    //retrieve the ID number of the line
    for(i=0; i<TAILLE_NUM_UTI-1; i++) numString=myFile.read(); 
    numString='\0';

 
    while(strcmp(numUtilisateur, numString)){
        if(!sautDeLigne()){    //move to the next line
          myFile.seek(0);
          return 0;
        }
     
        ligne++;
        //retrieve the ID number of the line
        for(i=0; i<TAILLE_NUM_UTI-1; i++){
          numString=myFile.read();
        }
        numString='\0';
    }
    //place le pointeur au debut de la ligne
    myFile.seek(myFile.position()-TAILLE_NUM_UTI);
    return ligne;
}

It looks in a text file by a user's ID number.

Thanks

int rechercheUtilisateur(char numUtilisateur[TAILLE_NUM_UTI]){

You STILL have not told us how TAILLE_NUM_UTI is defined or what its value is. Now, where did I put that clue-by-four?

Take a closer look at this section of your code:

    char numString[TAILLE_NUM_UTI];

    //place le pointeur au debut du fichier
    myFile.seek(0);
    //retrieve the ID number of the line
    for(i=0; i<TAILLE_NUM_UTI-1; i++) numString=myFile.read(); 
    numString='\0';

Specifically:

   char numString[TAILLE_NUM_UTI];
   for(i=0; i<TAILLE_NUM_UTI-1; i++) numString=myFile.read(); 
  numString='\0';

Last I checked, read() doesn't return a pointer, it returns a single byte. That shouldn't even compile...

I am giving the code because there are errors:

int rechercheUtilisateur(char numUtilisateur[TAILLE_NUM_UTI]){
    int i, ligne = 1;
    //declaration des tableaux locaux    
    char numString[TAILLE_NUM_UTI];

    //place le pointeur au debut du fichier
    myFile.seek(0);
    //recupére le numéro d'identifiant de la ligne
    for(i=0; i<TAILLE_NUM_UTI-1; i++) numString[i]=myFile.read();  
    numString[i]='\0'; 

    
    while(strcmp(numUtilisateur, numString)){
        if(!sautDeLigne()){
          myFile.seek(0);
          return 0; 
        }
      
        ligne++;
        //met dans 'numString' le numéro d'identifiant de la ligne
        for(i=0; i<TAILLE_NUM_UTI-1; i++){
          numString[i]=myFile.read(); 
        }
        numString[i]='\0';
    }
    //place le pointeur au debut de la ligne
    myFile.seek(myFile.position()-TAILLE_NUM_UTI);
    return ligne;
}

TAILLE_NUM_UTI is defined in the beginning of the code:

 #define TAILLE_NUM_UTI 8+1

Do you want the entire program?

Yes, please give us the whole program and also tell us what's in the file you're reading in.

BTW:

#define TAILLE_NUM_UTI 8+1

is dangererous:

int x = TAILLE_NUM*4; // x = 12 !!!

better say
#define TAILLE_NUM_UTI (8+1)

    while(strcmp(numUtilisateur, numString)){

strcmp() returns 0 if the strings match, or -1 or +1 if they don't match, depending on whether string 1 comes before or after string 2. It does NOT return a boolean, so this code should not be written as though it does. Explicitly state what you are expecting.

    for(i=0; i<TAILLE_NUM_UTI-1; i++) numString[i]=myFile.read();

Suppose you read past the end of the file. Then what happens?

Some Serial.print()s in this code will tell you where you are going wrong. Why are there none?

PaulS:
Some Serial.print()s in this code will tell you where you are going wrong. Why are there none?

I've watched with Serial.println () but that the reset occurs at different times if I change the code.

PaulS:

    for(i=0; i<TAILLE_NUM_UTI-1; i++) numString[i]=myFile.read();

Suppose you read past the end of the file. Then what happens?

I normally can not to be at the end of the file, I read the first 8 characters of a great line.