Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

Can anybody tell me why could the shown warning appear and "It" is not a natural number without zeros after the decimal point?

Asked by Pavlin on 2 Feb 2013

"Warning: Out of range or non-integer values truncated during conversion to character." ---------------------------------------------

Parts of the Code defining and showing "it":



Text=([' it ']);

fprintf(fid,'% s\n',Text);


for incr=1:incr_max

    while Flag_G_IC==0 && it<itmax && Flag_last_el_x==0
        results(1) = it
        fprintf([fid,'%3.0f \n',results]);
type Project_3_VCCT
In the end I do not see the results (after "type"), but I by removing the semicolon I saw the it is:

This should be the source of warning / error, but I do not understand why is "It" not just 1,2,3,4... at the first place.

Thank you in advance!


Pavlin Todorov

P.S. I meet the kind of error at other places, too. The division 4/2 is sometimes 2 and other times 2.0000.




No products are associated with this question.

2 Answers

Answer by Image Analyst on 2 Feb 2013
Accepted answer

If you want to ensure "it" is an integer, make it an integer:

it = int32(it + 1);

then results should also be an integer, but you need to print it as an integer, using %d instead of %f:

fprintf(fid, '%d\n', results);

The brackets are unnecessary so I removed them.


Pavlin on 2 Feb 2013

The code is simulating a 2D finite element analysis of a crack propagation along a glued interface of two beams. I improved the code by adding a dynamic mesh refinement in the x-direction, that is a refined mesh moves with the crack tip when the crack propagates and it is plotted successively. The problem appeared after I had built the mesh refinement. Without the refinement, everything works and I get the results printed out. "it" (+ the rest of the results) haven't been changed at all in the code. However, now the warning msg appears and they are suppressed.

As mentioned initially, the warning msg is: "Warning: Out of range or non-integer values truncated during conversion to character."

Then it points out the raw that writes the results in the file for every iteration:

"fprintf(fid,'% 3u % 10.3f % 10.3f % 4u% 10.3f % 4u% 10.5f % 10.3f % 10.3f % 10.3f % 10.3f\n',results); "

Pavlin on 3 Feb 2013

Does anybody not know? If I make "it" an integer, that's fine, but I still get the same warning and the error that nothing is written / displayed in the end, when the loops are over and I type the written file's name.

Image Analyst on 3 Feb 2013

We don't know the exact line of code that generates the error "Warning: Out of range or non-integer values truncated during conversion to character." Since you converted "it" to integers, we don't know if it's referring to a different non-integer variable, or if "it" is out of range. What does the help on that warning say?

Image Analyst
Answer by Jan Simon on 3 Feb 2013
Edited by Jan Simon on 3 Feb 2013

You wrote:

I meet the kind of error at other places, too. The division 4/2 is sometimes 2 and other times 2.0000.

No, dividing 4 by 2 gives exactly 2 in every case. Results like "2.0000" come from calculations like 4.00000000000002/2, which you use the display format "short":

format short
format long g

Here you do not observe an error or bug, but just the correct calculations with numbers, which are represented with a limited precision.

Please show us the line, which causes the warning.


Pavlin on 4 Feb 2013

What astonishes me is that I get this 1.0000, 2.0000 and so on for the following (by skipping everything that does not concern "it"):

Text=([' It   Applied Load          a   f_dof         F1   u_dof'...
      '       u           G_I              K_I     LOAD_displ']);
  fprintf(fid,'% s\n',Text);
  Text=(['  #              N         mm       #          N       #'...
      '      mm           J/m        MPa*m^0.5             mm']);
  fprintf(fid,'% s\n',Text);
for incr=1:incr_max
      while Flag_G_IC==0 && it<itmax && Flag_last_el_x==0
      results(1,1) = it;
      results(1,2) = load_total;
      results(1,3) = a*1000;
      results(1,4) = f_dof;
      results(1,5) = F1;
      results(1,6) = u_dof;
      results(1,7) = u*1000;
      results(1,8) = G_I;
      results(1,9) = K_I*1e6;
      results(1,10) = U(Initial_Crack_Tip_x*(elements_y+1)*2+2,1)*1000;
      results(1,11) = el_L(Crack_Tip_x)*1000;
      fprintf([fid,'%3.0f %14.3f %10.3f %7.0f %10.3f %7.0f %10.6f '...
          '%12.3f %15.3f %14.6f \n',results]);

The warning is for the fprintf line and afterwards, no results are really written while the while loop runs. I see the numbers for it by taking away the semicolon of "results(1,1) = it". More interesting for me is that in the first few iterations "it" appears as an integer and then it has the decimal point. If necessary, I can provide the whole code, but only if anybody is interested in why these situations happen. I'd rather use the xlswrite function, which I've tried and it worked, so I can avoid the problem. Another interesting (for me, as I am not that an expert) is that the results are being written and shown in the end, if I type:

    fprintf(fid, '%g \n' ,results);

However, that does not arrange them in a nice and usable way.

Thank you for your time! If anybody is interested, just e- mail me and I will provide the code and the supporting functions to run it.

Regards, Pavlin Todorov

Jan Simon on 5 Feb 2013

The square brackets in this line should cause problems:

fprintf([fid,'%3.0f %14.3f %10.3f %7.0f %10.3f %7.0f %10.6f '...
        '%12.3f %15.3f %14.6f \n',results])

You do not want to create a joined vector of these variable and deliver one vector to fprintf(). So simply omit these brackets as Image Analyst has suggested already.

When I understand your problem correctly, and I do not have the impression that I do, check if your "it" is integer by inserting this at several locations:

if it ~= floor(it), keyboard, end
Jan Simon

Contact us