簡體   English   中英

函數不返回正確的數組值

[英]Function doesn't return right array's values

我已經開始學習 C 中的函數了。

我有一項任務是將數字從英制轉換為公制,這些數字包含在 2d 數組中。

大批:

{1300, 0}  [0][0] [0][1]

{2198, 0}  [1][0] [1][1]

{4199, 1}  [2][0] [2][1]

{2103, 0}  [3][0] [3][1]

{3104, 1}  [4][0] [4][1]

{1093, 1}  [5][0] [5][1]

{3204, 0}  [6][0] [6][1] 

所以我用double返回SortedArray[DATA_ROWS] = find_function(MixedData);調用函數

find_function 邏輯:

0 是公制值的指標,1 是英制值的指標, i是行索引器, j是列索引器。

所以,當for周期找出列的值是0或1,省去[J-1](我們需要的實際值)為SortedArray

如果發現列值為 1 SortedArray[i] = MixedData[i][j-1]*CONSTANT;它也會轉換值SortedArray[i] = MixedData[i][j-1]*CONSTANT;

只是為了檢查,我做了printf來查看值是否正確並在需要時正確轉換。 我得到了這個輸出:

1300.00
2198.00
1301.69
2103.00
962.24
338.83
3204.00

所以,看起來是正確的,但在任務中我還有另一個任務 - 使用 2 個函數來解決這個任務。 我決定創建另一個函數,它將對SortedArray[DATA_ROWS]所有值sum ,然后計算avg SortedArray[DATA_ROWS] 然后將它們打印出來。 問題來了。

調用函數不返回total_AVG(SortedArray); 復制數組SortedArray[DATA_ROWS]

只是為了檢查制作了一個printf並得到了這個:

-1.#R
0.00
0.00
0.00
0.00
0.00
0.00

似乎我的SortedArray[DATA_ROWS]沒有復制到第二個函數total_AVG

指針將在下一個任務中出現,因此根據任務的時間線,我無法使用它們*(即使可以,我仍然不知道如何使用它們)*

你能告訴我,我做錯了什么。

注意:當我試圖更正我的代碼時,一些注釋和變量,而不僅僅是舊的。 而且我只需要了解為什么SortedArray[DATA_ROWS]沒有復制到第二個函數total_AVG 解決此問題后,將糾正所有進一步的邏輯。

謝謝! 對不起,英語不好!

代碼:

#include <stdio.h>
#define DATA_ROWS 7
#define DATA_COLS 2
#define CONSTANT 0.31
#define MAX 3


double find_function(int MixedData[DATA_ROWS][DATA_COLS]);
void total_AVG(double SortedArray[DATA_ROWS]);


int main(void)
{
    int i;
    double SortedArray[DATA_ROWS];


    int MixedData[DATA_ROWS][DATA_COLS] = {
        {1300, 0},//[0][0] [0][1]
        {2198, 0},//[1][0] [1][1]
        {4199, 1},//[2][0] [2][1]
        {2103, 0},//[3][0] [3][1]
        {3104, 1},//[4][0] [4][1]
        {1093, 1},//[5][0] [5][1]
        {3204, 0}};//[6][0] [6][1]

    SortedArray[DATA_ROWS] = find_function(MixedData);
    total_AVG(SortedArray);


    return 0;
}

double find_function(int MixedData[DATA_ROWS][DATA_COLS])
{
    // imperial numbers from source array "mixedData" are 4199,3104,1093;

    int i,j; // indexers
    double SortedArray[DATA_ROWS]; 




    // 7 rows, each row suppose to contain only metric values
    // That means, if second for cycle with j indexer finds 0, it will contain j-1 value for example 1300 in SortedArray
    // If it finds in second for cycle with j indexer 1, it will converte the value from imperial to metric for example 4199*0.31
        /*  {1300, 0}  [0][0] [0][1]
            {2198, 0}  [1][0] [1][1]
            {4199, 1}  [2][0] [2][1]
            {2103, 0}  [3][0] [3][1]
            {3104, 1}  [4][0] [4][1]
            {1093, 1}  [5][0] [5][1]
            {3204, 0}  [6][0] [6][1] */


    // Probably problem in "double SortedArray and int MixedData"
    for(i=0;i<DATA_ROWS;i++)
    {
        for(j=0;j<DATA_COLS;j++)
        {
            if(MixedData[i][j]==0)                                               
            {
                SortedArray[i] = MixedData[i][j-1];
            }
            else if(MixedData[i][j]==1)
            {
                SortedArray[i] = MixedData[i][j-1]*CONSTANT;

            }
        }
    }
    for(i=0;i<DATA_ROWS;i++)
    {
        //total += SortedArray[i];
        printf("%.2lf\n", SortedArray[i]);
    }

    return SortedArray[DATA_ROWS];
}

void total_AVG(double SortedArray[DATA_ROWS])
{
    double avg,total;
    int i;

    for(i=0;i<DATA_ROWS;i++)
    {
        printf("%.2lf\n", SortedArray[i]);
    }
    //avg = total/DATA_ROWS;
    //printf("Total by every worker: %.2lf\n",total);
    //printf("In average by every worker: %.2lf", avg);

    return;
}

數組在 C 中不可賦值。 C11 標准 - 6.3.2.1 其他操作數 - 左值、數組和函數指示符 (p3) ..."an expression that has type *"array of type"* is converted to an expression with type *"pointer to type"* that points to the initial element of the array object and is not an lvalue." 數組不是左值;

為了填充數組,您必須遍歷元素並將值分配給各個元素,或者將內存塊復制到包含使用memcpy等元素的值的數組中。

此外,使用double SortedArray[DATA_ROWS]; 您不能從函數返回本地聲明的數組 當函數返回時,函數堆棧(包含您的數組)被銷毀(釋放以供重用)。 您必須將SortedArray作為參數傳遞給find_function並在那里填充從main()傳遞的數組的值,或者您必須為這些值分配存儲空間並返回一個指向已分配內存塊的指針,該內存塊將您的值保存到main() . 這是你的兩個選擇。


重新排列你的代碼

查看您的代碼以及您嘗試執行的操作,您似乎需要:

  • 聲明double total = 0; main()
  • 您需要更改 find 函數的聲明,以便將SortedArray作為參數,例如

    double find_function(int (*MixedData)[DATA_COLS], double *SortedArray)

  • 您需要申報另一個double total; (或您選擇的任何其他名稱)在find_function()並且該total是您想要從find_function()返回的值,以分配給main()聲明的total ,從而提供其值,例如

    total = find_function (MixedData, SortedArray);
  • 您需要更改total_AVG()的聲明,以便將SortedArray傳遞給find_function()並在那里填充到total_AVG()函數作為參數,以及從find_function()返回的total ,例如

    void total_AVG (double *SortedArray, double total);

這樣,取消對計算的注釋並刪除代碼中未使用的變量,您可以執行以下操作:

#include <stdio.h>

#define DATA_ROWS 7
#define DATA_COLS 2
#define CONSTANT 0.31
#define MAX 3

double find_function (int (*MixedData)[DATA_COLS], double *SortedArray);
void total_AVG (double *SortedArray, double total);

int main(void)
{
    double total = 0;
    double SortedArray[DATA_ROWS] = {0};    /* good idea to initialize arrays zero */


    int MixedData[DATA_ROWS][DATA_COLS] = { {1300, 0},      //[0][0] [0][1]
                                            {2198, 0},      //[1][0] [1][1]
                                            {4199, 1},      //[2][0] [2][1]
                                            {2103, 0},      //[3][0] [3][1]
                                            {3104, 1},      //[4][0] [4][1]
                                            {1093, 1},      //[5][0] [5][1]
                                            {3204, 0} };    //[6][0] [6][1]

    total = find_function (MixedData, SortedArray);
    total_AVG (SortedArray, total);
}

double find_function(int (*MixedData)[DATA_COLS], double *SortedArray)
{
    // imperial numbers from source array "mixedData" are 4199,3104,1093;

    int i,j;    // indexers
    double total = 0;

    // Probably problem in "double SortedArray and int MixedData"
    for (i=0;i<DATA_ROWS;i++)
        for (j=0;j<DATA_COLS;j++)
            if (MixedData[i][j]==0)
                SortedArray[i] = MixedData[i][j-1];
            else if (MixedData[i][j]==1)
                SortedArray[i] = MixedData[i][j-1]*CONSTANT;

    for (i=0;i<DATA_ROWS;i++) {
        total += SortedArray[i];
        printf("%.2lf\n", SortedArray[i]);
    }

    return total;
}

void total_AVG (double *SortedArray, double total)
{
    double avg;
    int i;

    for (i=0;i<DATA_ROWS;i++)
        printf("%.2lf\n", SortedArray[i]);

    avg = total/DATA_ROWS;

    printf("Total by every worker: %.2lf\n",total);
    printf("In average by every worker: %.2lf\n", avg);
}

示例使用/輸出

運行編譯的程序會產生以下結果:

$ ./bin/sorteddata
1300.00
2198.00
1301.69
2103.00
962.24
338.83
3204.00
1300.00
2198.00
1301.69
2103.00
962.24
338.83
3204.00
Total by every worker: 11407.76
In average by every worker: 1629.68

注意:我還沒有驗證這個輸出的正確性——我留給你,但快速瀏覽一下——根據你的代碼所做的,它看起來很合理)

如果您對所做的更改有任何疑問,請告訴我。

你不能像這樣使用數組

return SortedArray[DATA_ROWS];
SortedArray[DATA_ROWS] = find_function(MixedData);

您可以將其作為參數傳遞給函數。 像下面。

find_function(MixedData, SortedArray);

void find_function(int MixedData[DATA_ROWS][DATA_COLS], double SortedArray[DATA_ROWS])
{
// Dont define, use itt from parameter
// double SortedArray[DATA_ROWS];

// ...

// Dont need to return.
// return SortedArray[DATA_ROWS];
}

您定義的函數是:

double find_function(int MixedData[DATA_ROWS][DATA_COLS]) { }

當您嘗試返回數組時,它的返回類型是double ,不能以喜歡的方式返回也不能分配化驗。

return SortedArray[DATA_ROWS]; 

在這里,您嘗試訪問等於 length 的元素,這是錯誤的。 您可以做的是,將數組作為函數參數(或作為指針)傳遞並返回 void。 IE:

void find_function(int MixedData[DATA_ROWS][DATA_COLS], double* SortedArray) { /*...*/ }

或者您可以使用動態內存分配..以防您想從函數返回基地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM