【问题标题】:how to pass a char variable to FS_write() function -- EmFile?如何将 char 变量传递给 FS_write() 函数 -- EmFile?
【发布时间】:2014-09-10 22:28:29
【问题描述】:

我正在尝试使用 EmFile 库进行基于 C 的嵌入式编程。

这是 API 文档中 FS_write 的结构:

U32 FS_Write (FS_FILE * pFile,
              const void * pData,
              U32 NumBytes);

我想编写自己的函数以供以后使用,例如:

void SD_write_to_file(char buff)
{

    if(pFile)
    {

    if(0 != FS_Write(pFile, buff, strlen(buff))) 
    {

    }
    else
    {
        FontWrite_Position(100,148);//Text written to the position
        PutStringLCD("Failed to write data to file");
    }
    }
 }

问题是当我调用这个函数并传递我的 char 值时,它不能将它用于 FS_write。 例如:

    sprintf(tempwordshow, "%f", realSamples[realsamplescounter]);

    SD_write_to_file(tempwordshow);

realSample[ ] 是 float 而 tempwordshow 是 char。

注意,如果使用如下函数:

    if(0 != FS_Write(pFile, "0123456789", 10u))

它正在工作。

我认为问题出在将我的数据传递给这个函数的方式上。

有什么想法吗?

谢谢

【问题讨论】:

    标签: c char parameter-passing


    【解决方案1】:

    一般来说,确保将指针作为参数的函数确实是接收器指针。相反,如果您打算使用指针,则应确保函数的签名将指针作为参数。

    在这种特殊情况下,您的意图似乎是编写一个字符缓冲区(可以通过将指针传递给与缓冲区对应的内存位置的指针来将其传递给函数),这很可能不仅仅是一个char。相应地,SD_write_to_file的签名应改为:

      void SD_write_to_file(const char* buff)
    

    sprintf 的第一个参数应该是 char* 类型,而您提到 tempwordshow 的类型是 char,您可能会遇到类似的问题(另请注意,无论@ 987654330@ 指向)。如果您的问题不是一个简单的错字,那么您必须将tempwordshow 的声明转换为以下内容:

      char tempwordshow[40]; // a 40-char buffer should be large enough for %f
    

    最后一点,strlen 旨在处理以空值结尾的字符序列(或字符串)。因此,如果您打算将此函数严格用于以空字符结尾的字符串,那么这很好。否则,您可能会发现传递您希望写入的缓冲区的长度更合适(类似于SD_write_to_file(const char* buff, int bufferLength))。

    【讨论】:

    • 谢谢我的朋友。现在写入文件没问题。但它写的不是我的浮点数。类似于:prntscr.com/4lnklm 我这样更改了代码:prntscr.com/4lnkyc 仅供参考,我的浮点数从 -4.9999 到 4.9999。
    • 您确定所有数字确实都限制在该范围内(我更新了答案以包含足够的缓冲区空间来处理极端瞬态值)?此外,确保realSamples 足够大以容纳所有样本(即,写入realSamples 时不会溢出)。
    • 你好。问题出在 sprintf 函数上。我编写了自己的函数来将每个浮点数复制到 tempwordshow 数组。然后问题通过您的修改解决。朋友,谢谢。我在新帖子中发布了解决方案。所以每个人都可以在未来使用它:)
    【解决方案2】:

    SleuthEye 是对的。但在这些修改之后,我仍然无法在文件中写入正确的浮点数。一些废话写在文本文件中。

    所以我编写了自己的函数来将浮点数转换为字符串,问题就解决了。
    你需要做上面提到的 SleuthEye 的所有修改。另外,使用这个函数来改变类型:

    /** Number on countu**/
    
     int n_tu(int number, int count)
    {
     int result=1;
     while(count-- > 0)
     result *=number;  
    
     return result;
     }
    

    /将浮点数转换为字符串/

    void float_to_string(float f, char r[])
    {
    long long int length, length2, i, number, position, sign;
    float number2;
    
    sign=-1;   // -1 == positive number
    if (f <0)
        {
        sign='-';
        f *= -1;    
        }   
    
    
    number2=f;  
    number=f;
    length=0;  // size of decimal part
    length2=0; //  size of tenth
    
    
    /* calculate length2 tenth part*/
    while( (number2 - (float)number) != 0.0 && !((number2 - (float)number) < 0.0) )
        {
    
        number2= f * (n_tu(10.0,length2+1));
        number=number2; 
    
        length2++;
    
        }
    
     /* calculate length decimal part*/
    for(length=(f> 1) ? 0 : 1; f > 1; length++) 
      f /= 10;
    
    
     position=length;
     length=length+1+length2;
     number=number2;
     if(sign=='-')
         {
         length++;
         position++;
         }
    
     for(i=length; i >= 0 ; i--)
         {
        if(i== (length))
          r[i]='\0';
        else if(i==(position))
          r[i]='.';
        else if(sign=='-' && i==0)
          r[i]='-';
        else  
            {
              r[i]= (number % 10)+'0';
              number /=10;
            }
        }
    }
    

    再次感谢。希望它在未来对其他人有所帮助。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-22
      • 2022-01-23
      • 2020-12-20
      • 2011-06-21
      • 1970-01-01
      • 2020-07-28
      相关资源
      最近更新 更多