正如标题所解释的,我有一组变量,目标是将它们打印在一个文件中,每次迭代地更新它们,但由于某些原因我无法打印变量值,我对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
答案 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个字节的数据。通过不使用指针,你不会注意到速度的差异。