fopen更改c中数组元素的值

时间:2016-02-25 10:44:20

标签: c

我是C语言编码和学习文件I / O操作的新手。我尝试的一段代码是:

void output(long *result){
    FILE *fp1 ;
    printf("**The result is=%ld\n",result[1]);
    fp1 = fopen ("output1.txt", "w+");
    printf("***The result is=%ld\n",result[1]);

    if ( fp1 == NULL )
    {
        puts ( "Cannot open output file" ) ;
        exit(0) ;
    }
    fprintf( fp1,"%ld",result[1]) ;
    fclose (fp1);
}

函数参数正在转移到函数。但是printf之前和之后的fopen语句的输出是不同的。我明白了:

**The result is=1714
***The result is=140734960430456

无法理解这种行为。请帮忙。通过之前的讨论,无法获得帮助。

1 个答案:

答案 0 :(得分:0)

错误不在于function buildCommunicationLineChart(data, placeholder, callback, type) { var margin = { top: 20, right: 30, bottom: 40, left: 50 }, width = 960 - margin.left - margin.right, height = 500 - margin.top - margin.bottom, tooltipTextColour = "white"; var color = ["#FF9797", "#86BCFF", "#33FDC0", "#EFA9FE", "#7BCAE1", "#8C8CFF", "#80B584", "#C88E8E", "#DD597D", "#D8F0F8", "#DD597D", "#D6C485", "#990099", "#5B5BFF", "#1FCB4A", "#000000", "#00BFFF", "#BE81F7", "#BDBDBD", "#F79F81"]; if (type == "month") { var x = d3.scale.linear() .domain([1, 31]) .range([0, width]); var tip = d3.tip() .attr('class', 'd3-tip') .offset([-10, 0]) .html(function (d) { return "<strong>Value:</strong> <span style='color:" + tooltipTextColour + "'>" + d.Value + "</span><br /><strong>Day of Month:</strong><span style='color:white'>" + d.xValue + "</span>"; }); } else if (type == "year") { var x = d3.scale.linear() .domain([1, 12]) .range([0, width]); var tip = d3.tip() .attr('class', 'd3-tip') .offset([-10, 0]) .html(function (d) { return "<strong>Value:</strong> <span style='color:" + tooltipTextColour + "'>" + d.Value + "</span><br /><strong>Month of Year:</strong><span style='color:white'>" + d.xValue + "</span>"; }); } var y = d3.scale.linear() .domain([0, 60]) .range([height, 0]); var xAxis = d3.svg.axis() .scale(x) .tickSize(-height) .tickPadding(10) .tickSubdivide(true) .orient("bottom"); var yAxis = d3.svg.axis() .scale(y) .tickPadding(10) .tickSize(-width) .tickSubdivide(true) .orient("left"); var line = d3.svg.line() .x(function (d) { var xTest = x(d.xValue); return x(d.xValue); }) .y(function (d) { var yTest = y(d.Value); return y(d.Value); }); var svg = placeholder.append("svg") .attr("width", width + margin.left + margin.right + 50) .attr("height", height + margin.top + margin.bottom) .attr("class", "chart") .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); svg.append("g") .attr("class", "x axis") .attr("transform", "translate(0," + height + ")") .call(xAxis); if (type == "year") { svg.append("g") .attr("class", "x axis") .append("text") .attr("class", "axis-label") .attr("transform", "none") .attr("y", (-margin.left) + 530) .attr("x", -height + 860) .text('Month'); } else if (type == "month") { svg.append("g") .attr("class", "x axis") .append("text") .attr("class", "axis-label") .attr("transform", "none") .attr("y", (-margin.left) + 525) .attr("x", -height + 860) .text('Day'); } var methods = d3.entries(data); y.domain([ d3.min(methods, function (c) { return d3.min(c.value.DataPoints, function (v) { return v.Value; }); }) -1, d3.max(methods, function (c) { return d3.max(c.value.DataPoints, function (v) { return v.Value; }); }) +1 ]); svg.call(tip); svg.append("g") .attr("class", "y axis") .call(yAxis); svg.append("g") .attr("class", "y axis") .append("text") .attr("class", "axis-label") .attr("transform", "rotate(-90)") .attr("y", (-margin.left) + 15) .attr("x", -height / 2) .text('Communications'); var method = svg.selectAll('.method') .data(methods) .enter().append('g') .attr('class', 'method') .style('fill',function(d,i){ return color[i]; }) .style('stroke', function (d, i) { return color[i]; }); var m = method.append('path') .attr('class', function (d, i) { return 'line line-' + i; }) .attr('d', function (d) { return line(d.value.DataPoints); }); method.selectAll('circle') .data(function (d) { return d.value.DataPoints; }) .enter().append("circle") .attr('class', function (d, i) { return 'circle circle-' + i; }) .attr("cx", function (dd) { return x(dd.xValue); }) .attr("cy", function (dd) { return y(dd.Value); }) .attr("r", 3.5) .on('mouseover', tip.show) .on('mouseout', tip.hide); method.append('text') .datum(function (d) { return { commType: d.value.Type, value: d.value.DataPoints[d.value.DataPoints.length - 1] }; }) .attr("transform", function (d) { return "translate(" + x(d.value.xValue) + "," + y(d.value.Value) + ")"; }) .attr('x', 5) .attr('class',function(d,i){return 'text text-'+i;}) .attr('dy', '.15em') .style('stroke','none') .text(function (d) { return d.commType; }); if (callback) { callback(); } } 函数,而在于从哪里得到[{ "Type": "Email", "DataPoints": [{ "xValue": 1, "Value": 17 }, { "xValue": 2, "Value": 59 }] }, { "Type": "Phone", "DataPoints": [{ "xValue": 1, "Value": 1 }] }] 数组。你可能有这样的功能:

output

返回本地数组的位置。你不应该这样做,因为当从函数返回执行时,result的所有自动变量都将失效。

有几种方法可以解决这个问题:

缓冲区作为参数

处理此问题的常用方法是从调用函数传递缓冲区,然后让函数填充它:

    int *range(int n)
    {
        int array[n];
        int i;

        for (i = 0; i < n; i++) array[i] = i;

        return array;
    }

然后,您可以使用以下内容创建范围:

range

这是通常的做法。它的优点是调用代码必须关心数组的分配。这里使用了一个自动数组,在函数返回后将被清理。

分配内存

另一种方法是在堆上分配内存并返回该数组的句柄:

    void range(int *array, int n)
    {
        int i;

        for (i = 0; i < n; i++) array[i] = i;
    }

然后您可以通过以下方式终止范围:

    int R[10];

    range(R, 10);

    // use R

由于内存是动态分配的,因此必须在 int *range(int n) { int *array = malloc(n * sizeof(*array)); // TODO: Check for NULL int i; for (i = 0; i < n; i++) array[i] = i; return array; } 之后释放。如果您事先不知道数组的大小,或者数组是否非常大,那么这种方法是合适的,在堆栈上分配可能会导致问题。

静态缓冲区

另一种不常见的方法是使用 int *R = range(1000); // use R free(R); 数组。在某些情况下,此方法可能很有用,但适用性有限,因为所有调用都使用相同的静态缓冲区。