2012-01-03 52 views
1

我爲此啓動了一個不同的線程,我試着用他們給我的幫助來解決它,但我無法運行該程序。任何人都可以告訴我程序中出了什麼問題,它應該如何?謝謝。C - 使用動態數組爲自己添加數組

程序應該向自身添加一個數組,並用總和替換原始數據,所以當打印初始數組時,它會打印總和。這是我迄今爲止所做的。

請注意,使用ADDER(a,a)作爲函數調用是必須的。我不能改變這一點。這兩個參數都要通過引用傳遞。

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

int size; //global variable 

void ADDER(int *a, int *b) { 
    int i; 
    for (i = 0; i < size; i++) { 
     b[i] += a[i]; 
    }  
} 

int main() { 
    int n, i; 
    printf("Enter the number of elements: "); 
    scanf("%d", &n); 
    int *a = (int *)malloc(n*sizeof(int)); 
    int *b; 
    for (i=0; i<n; i++) { 
     printf("Enter element number %d: ", i); 
     scanf("%d", &a[i]); 
    } 
    ADDER(a,a); 
    for (i=0; i<n; i++) { 
     printf("%d", a[i]); 
    } 
} 

錯誤:

1> ------構建開始:項目:adderTest,配置:調試的Win32 ------

1> adder.c

1> e:\ my documents \ visual studio 2010 \ projects \ addertest \ addertest \ adder.c(17):警告C4996:'scanf':此函數或變量可能不安全。考慮使用scanf_s代替。要禁用棄用,請使用_CRT_SECURE_NO_WARNINGS。詳細信息請參見在線幫助。

1> E:\ Program Files文件\微軟的Visual Studio 10.0 \ VC \包括\ stdio.h中(304):參見 'scanf函數'

1>電子商務聲明:\我的文檔\ Visual Studio 2010的\ projects \ addertest \ addertest \ adder.c(18):錯誤C2143:語法錯誤:缺少';'在'type'之前

1> e:\ my documents \ visual studio 2010 \ projects \ addertest \ addertest \ adder.c(19):error C2143:syntax error:missing';'之前的 'type'

1> E:\我的文檔\視覺工作室2010 \項目\ addertest \ addertest \ adder.c(22):錯誤C2065:A':未聲明的標識符

1> E: \我的文檔\視覺工作室2010 \項目\ addertest \ addertest \ adder.c(22):錯誤C2109:下標要求數組或指針類型

1> E:\我的文檔\視覺工作室2010 \項目\ addertest \ adde.c(24):error C2065:'a':未聲明的標識符 1> e:\ my documents \ visual studio 2010 \ projects \ addertest \ addertest \ adder.c(24):warning C4047:'function' :'int *'與'int'的間接級別不同

1> E:\我的文檔\ Visual Studio 2010的\項目\ addertest \ addertest \ adder.c(24):警告C4024: '法器':不同類型的正式和實際參數1

1>電子:\ my documents \ visual studio 2010 \ projects \ addertest \ addertest \ adder.c(24):error C2065:'a':未聲明的標識符

1> e:\ my documents \ visual studio 2010 \ projects \ addertest \ addertest \ adder.c(24):warning C4047:'function':'int *'與int的間接級別不同

1> e:\ my documents \ visual studio 2010 \ projects \ addertest \ addertest \ adder.c(24):警告C4024:'ADDER':正式和不同類型實際參數2

1> e:\ my documents \ visual studio 2010 \ projects \ addertest \ addertest \ adder。c(26):error C2065:'a':未聲明的標識符

1> e:\ my documents \ visual studio 2010 \ projects \ addertest \ addertest \ adder.c(26):error C2109:subscript requires array or指針類型

==========生成:0成功,1失敗,0上最新,0已跳過==========

+2

它做什麼而不是它應該做什麼? – 2012-01-03 19:02:06

+2

你不需要施放'malloc'的返回值@ – 2012-01-03 19:02:31

+0

@Scott它不運行,會產生很多錯誤。 – Amjad 2012-01-03 19:04:33

回答

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

/* global variable to store the size */ 
int g_size; 

void ADDER(int *a, int *b) 
{ 
    int i; 
    for (i=0 ; i<g_size ; i++) { 
     b[i] += a[i]; 
    } 

    return;  
} 

int main(void) 
{ 
    int n, i; 

    printf("Enter the number of elements: "); 
    scanf("%d", &n); 

    int *a = NULL; 
    if ((a = (int *)malloc(n * sizeof(int))) == NULL) { 
     printf("unable to allocate memory \n"); 
     return -1; 
    } 

    for (i=0; i<n; i++) { 
     printf("Enter element number %d: ", i); 
     scanf("%d", &a[i]); 
    } 

    g_size = n; 
    ADDER(a, a); 

    for (i=0; i<n; i++) { 
     printf("%d \n", a[i]); 
    } 

    free(a); 
    return 0; 
} 

我作了如下修改:用於malloc()

  • 做一次

    • 錯誤檢查,free()「編
    • 除去conio.h因爲它是存儲器
    • 格式化的輸出不需要
    • ,最後讓它工作! :)

    編輯:根據OP作者的請求更新代碼。

  • +0

    整潔。謝謝!但問題表明我不應該通過ADDER傳遞數組的大小。它可以完成沒有通過大小? – Amjad 2012-01-03 19:24:38

    +1

    @HelloWorld好的,我沒有在OP中看到,但是可以通過全局變量的技術來實現。但請確保,在調用「ADDR」之前,將大小即'n'分配給全局變量'size'。如果你需要修改的程序,我可以做另一個帖子..讓我知道! – 2012-01-03 19:28:24

    +0

    是的,我嘗試過使用全局變量,但沒有完全正確。你可以用修改的程序編輯你當前的帖子嗎? :) – Amjad 2012-01-03 19:29:51

    7

    你有一個size對象在文件範圍和塊範圍中(在main函數中)。

    要修復程序可以刪除size對象的定義在main功能或(優選溶液)除去所述一個文件範圍,並將其傳遞作爲一個新的參數傳送給ADDER功能。

    如果使用gcc進行編譯,則可以使用-Wshadow警告,該警告會在變量隱藏另一個變量時提醒您。

    +1

    (+1)斑點! – NPE 2012-01-03 19:03:59

    +1

    另外,int * b在main中沒有使用,所以你不應該使用全局變量,而應該將大小傳遞給你的加法器函數,或者考慮使用一個同時具有int []和size的結構體(如果你喜歡OO的話)。 – PlexQ 2012-01-03 19:06:34

    +0

    啊,是的,好吧,我把它改名爲n。但仍然有錯誤。 – Amjad 2012-01-03 19:06:41

    5

    我看到的最大的問題是,你有2個size變量

    • 全球size
    • main

    ADDER函數聲明的地方size使用的size全球版本,永遠不會分配給它,因此它的功能不正確。最簡單的解決方法是避免全局,並將大小傳遞給ADDER

    void ADDER(int *a, int *b, int size) { 
    ... 
    } 
    
    +0

    但我必須使用ADDER(a,a),這是必須的要求。我無法傳遞任何其他變量。 – Amjad 2012-01-03 19:08:15

    +1

    @HelloWorld在這種情況下,您需要更改'main'以使用全局'尺寸' – JaredPar 2012-01-03 20:16:59