在C中的循环中为变量和fprintf赋值

时间:2015-04-19 23:12:23

标签: c printf

正如标题所解释的,我有一组变量,目标是将它们打印在一个文件中,每次迭代地更新它们,但由于某些原因我无法打印变量值,我对C相对较新指针有点复杂处理,我的猜测是关于内存分配的问题。

由于它的长度,我提供了一个更短但相当于我的代码的版本:

#include <stdlib.h>
#include <math.h>
#include <stdio.h>

int main()
{
    int n = 2;
    FILE *in;
    char filename1[30] = "positions.txt";
    double *x_tp, *y_tp, *z_tp;
    double *x_tf, *y_tf, *z_tf;
    *x_tp = 1.0;
    *y_tp = 0.0;
    *z_tp = 0.0;
    in = fopen(filename1, "w");
    fprintf(in,"%lf \t %lf \t %lf\n",x_tp,y_tp,z_tp);
    fclose(in);
    in = fopen(filename1, "w");
    for (i = 1; i <= n; i++)
    {
        *x_tf = x_tp + "somefunctionx";
        *y_tf = y_tp + "somefunctiony";
        *z_tf = z_tp + "somefunctionz";
        fprintf(in,"%lu \t %lu \t %lu\n",x_tf,y_tf,z_tf);
        x_tp =  x_tf;
        y_tp =  y_tf;
        z_tp =  z_tf;
    }
    fclose(in);
}

*澄清n值意味着远高于2我只想让它为2以便程序快速运行所以我可以测试它。

**如果相关的某些功能与runge-kutta步骤有关,整个事情就是4身体问题的一部分。

我最终得到的实际上是一个.txt文件但不是我想要的所有值都填充了“nan”s

2 个答案:

答案 0 :(得分:1)

所有变量

double *x_tp, *y_tp, *z_tp;
double *x_tf, *y_tf, *z_tf;

是指向双打的指针 如果你想,意味着他们正在寻找双打的地址。 在代码中,您没有声明指针指向的双精度数。

这是一个指针

的例子
#include <stdlib.h>
#include <math.h>
#include <stdio.h>

int main()
{
 int n = 2;
 FILE *in;
 char filename1[30] = "positions.txt";
 double x_tp, y_tp, z_tp;

 /*Initialize Pointers */
 double *x_tf = &x_tp, *y_tf = &y_tp, *z_tf = &z_tp;

 /* Assigns the doubles to the pointer variables & initializes variables. */
  x_tp = 1.0;
  y_tp = 0.0;
  z_tp = 0.0;

 in = fopen(filename1, "w"); /* Opens and prints variables to file */
 fprintf(in, "%lf \t %lf \t %lf\n", x_tp, y_tp, z_tp);
 fclose(in);
 in = fopen(filename1, "a"); /*Appends the new numbers to the file -- "w" will rewrite the file entirely. */
 for (int i = 1; i <= n; i++)
 {
     x_tp = 2.0; /*Example of updating the values at x_tp -- etc. Pointers will have new values. */
     y_tp = 22.0;
     z_tp = 1.0;
     /* Assigns doubles to pointers then prints the value at that pointer */
        fprintf(in, "%lf \t %lf \t %lf\n", *x_tf, *y_tf, *z_tf); /* Prints Values at each pointer -- tells the compiler to go to that pointer and print the value. */

 }
 fclose(in);

}

你的指针需要指向一些双倍。 如果在声明语句中初始化,还可以使用地址初始化指针。

你的循环读/写中的“w”会覆盖整个文本文件; “a”追加并添加到文本文件中。

记忆不是那么多;你只需要给你的指针地址。 如果你想在你的代码中打印“somefunctionx”。 您只需分配新值即可:

 x_tp = 2.0; /*Updates pointer */
 fprintf(in, "somefunctionx : ", *x_tf);

对于每个后续变量,您也可以只是“\ n”。

答案 1 :(得分:0)

首先,您根本不需要将变量声明为指针。

double x_tf, ...; 

会更充足。然后你可以写:

x_tf = 1.0;

以及后来:

printf("%f", x_tf); 

并且在任何地方都没有指针问题。

如果您现在有一个具有OUT或INOUT语义参数的函数,例如

void RungeKuttaStep( double *pxs, double *pys ); // whatever

在语义上意味着他们不仅需要该值,而且还打算将新值写入这些变量,您可以使用

调用它们
double xs = 1.0;
double ys = 1.0;
RungeKuttaStep( &xs, &ys );
printf( "now xs = %f and ys = %f\n", xs, ys );

您可能尝试实现的是交替使用变量。 每次通话后,您希望将上一步的结果用作下一次通话的新输入 要做到这一点,你可以写:

double a1,b1,c1; // lazily renamed your variables, mean me
double a2,b2,c2;

// probably in a loop
a1 = 1.0; b1 = 1.0; c1 = 1.0;
a2 = a1 + RungeKutta1(a1,b1,c1);
b2 = b1 + RungeKutta2(a1,b1,c1);
c2 = c1  + RungeKutta3(a1,b1,c1);
a1 = a2; b1 = b2; c1 = c2;
// probably end of loop

double有8个字节的大小和一个指针,具体取决于你的操作系统和构建有4或8个字节的数据。通过不使用指针,你不会注意到速度的差异。